Commit add06061ab7c49f59751ad17f5b31491152daf7e

Authored by Jeffrey Johnson
1 parent c8808fe68b
Exists in master

Fix segfaults

Showing 2 changed files with 28 additions and 25 deletions Side-by-side Diff

... ... @@ -70,6 +70,7 @@
70 70 llvm::Value* VarDecl::Emit() {
71 71 llvm::Value* val = new llvm::AllocaInst(convertType(type), id->GetName(), irgen.GetBasicBlock());
72 72 if(assignTo) val = new llvm::StoreInst(val, assignTo->Emit(), NULL, irgen.GetBasicBlock());
  73 + addToScope(id->GetName(), this, val);
73 74 return val;
74 75 }
75 76  
... ... @@ -79,7 +80,6 @@
79 80 pushScope();
80 81 vector<llvm::Type*> types;
81 82 for(int i = 0; i < formals->NumElements(); i++) {
82   - formals->Nth(i)->Emit();
83 83 types.push_back(convertType(formals->Nth(i)->GetType()));
84 84 }
85 85 llvm::FunctionType* ft = llvm::FunctionType::get(convertType(returnType), types, false);
... ... @@ -87,6 +87,9 @@
87 87 llvm::Function* func = llvm::Function::Create(ft, llvm::Function::ExternalLinkage, id->GetName(), irgen.GetOrCreateModule("program"));
88 88 llvm::BasicBlock * block = llvm::BasicBlock::Create(*context, "funcBlock", func);
89 89 irgen.SetBasicBlock(block);
  90 + for(int i = 0; i < formals->NumElements(); i++) {
  91 + formals->Nth(i)->Emit();
  92 + }
90 93 llvm::Value* ret = body->Emit();
91 94 llvm::ReturnInst::Create(*context, ret, block);
92 95 irgen.SetBasicBlock(oldBlock);
... ... @@ -165,8 +165,8 @@
165 165 }
166 166  
167 167 llvm::Value* CompoundExpr::Emit() {
168   - llvm::Value* l = l ? left->Emit() : NULL;
169   - llvm::Value* r = r ? right->Emit() : NULL;
  168 + llvm::Value* l = left->Emit();
  169 + llvm::Value* r = right->Emit();
170 170 llvm::BasicBlock* b = irgen.GetBasicBlock();
171 171 //austins additional value
172 172 llvm::Value *val;
173 173  
174 174  
175 175  
176 176  
177 177  
178 178  
179 179  
180 180  
181 181  
182 182  
183 183  
184 184  
185 185  
186 186  
187 187  
188 188  
189 189  
190 190  
191 191  
192 192  
193 193  
... ... @@ -180,53 +180,53 @@
180 180 }
181 181 if(l->getType()->isFPOrFPVectorTy()) {
182 182 if(op->getToken() == "+")
183   - return llvm::BinaryOperator::Create(llvm::Instruction::FAdd, l, r, NULL, b);
  183 + return llvm::BinaryOperator::Create(llvm::Instruction::FAdd, l, r, "", b);
184 184 if(op->getToken() == "-")
185   - return llvm::BinaryOperator::Create(llvm::Instruction::FSub, l, r, NULL, b);
  185 + return llvm::BinaryOperator::Create(llvm::Instruction::FSub, l, r, "", b);
186 186 if(op->getToken() == "*")
187   - return llvm::BinaryOperator::Create(llvm::Instruction::FMul, l, r, NULL, b);
  187 + return llvm::BinaryOperator::Create(llvm::Instruction::FMul, l, r, "", b);
188 188 if(op->getToken() == "/")
189   - return llvm::BinaryOperator::Create(llvm::Instruction::FDiv, l, r, NULL, b);
  189 + return llvm::BinaryOperator::Create(llvm::Instruction::FDiv, l, r, "", b);
190 190 if(op->getToken() == "==")
191   - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_EQ, l, r, NULL, b);
  191 + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_EQ, l, r, "", b);
192 192 if(op->getToken() == "!=")
193   - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_NE, l, r, NULL, b);
  193 + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_NE, l, r, "", b);
194 194 if(op->getToken() == "<=")
195   - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SLE, l, r, NULL, b);
  195 + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SLE, l, r, "", b);
196 196 if(op->getToken() == ">=")
197   - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SGE, l, r, NULL, b);
  197 + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SGE, l, r, "", b);
198 198 if(op->getToken() == "<")
199   - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SLT, l, r, NULL, b);
  199 + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SLT, l, r, "", b);
200 200 if(op->getToken() == ">")
201   - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SGT, l, r, NULL, b);
  201 + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SGT, l, r, "", b);
202 202 }
203 203 if(l->getType()->isIntOrIntVectorTy()) {
204 204 if(op->getToken() == "+")
205   - return llvm::BinaryOperator::Create(llvm::Instruction::Add, l, r, NULL, b);
  205 + return llvm::BinaryOperator::Create(llvm::Instruction::Add, l, r, "", b);
206 206 if(op->getToken() == "-")
207   - return llvm::BinaryOperator::Create(llvm::Instruction::Sub, l, r, NULL, b);
  207 + return llvm::BinaryOperator::Create(llvm::Instruction::Sub, l, r, "", b);
208 208 if(op->getToken() == "*")
209   - return llvm::BinaryOperator::Create(llvm::Instruction::Mul, l, r, NULL, b);
  209 + return llvm::BinaryOperator::Create(llvm::Instruction::Mul, l, r, "", b);
210 210 if(op->getToken() == "/")
211   - return llvm::BinaryOperator::Create(llvm::Instruction::SDiv, l, r, NULL, b);
  211 + return llvm::BinaryOperator::Create(llvm::Instruction::SDiv, l, r, "", b);
212 212 if(op->getToken() == "==")
213   - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OEQ, l, r, NULL, b);
  213 + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OEQ, l, r, "", b);
214 214 if(op->getToken() == "!=")
215   - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_ONE, l, r, NULL, b);
  215 + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_ONE, l, r, "", b);
216 216 if(op->getToken() == "<=")
217   - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OLE, l, r, NULL, b);
  217 + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OLE, l, r, "", b);
218 218 if(op->getToken() == ">=")
219   - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OGE, l, r, NULL, b);
  219 + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OGE, l, r, "", b);
220 220 if(op->getToken() == "<")
221   - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OLT, l, r, NULL, b);
  221 + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OLT, l, r, "", b);
222 222 if(op->getToken() == ">")
223   - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OGT, l, r, NULL, b);
  223 + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OGT, l, r, "", b);
224 224 }
225 225 if(op->getToken() == "&&") {
226   - return llvm::BinaryOperator::Create(llvm::Instruction::And, l, r, NULL, b);
  226 + return llvm::BinaryOperator::Create(llvm::Instruction::And, l, r, "", b);
227 227 }
228 228 if(op->getToken() == "||") {
229   - return llvm::BinaryOperator::Create(llvm::Instruction::Or, l, r, NULL, b);
  229 + return llvm::BinaryOperator::Create(llvm::Instruction::Or, l, r, "", b);
230 230 }
231 231 return NULL;
232 232 }