Commit add06061ab7c49f59751ad17f5b31491152daf7e
1 parent
c8808fe68b
Exists in
master
Fix segfaults
Showing 2 changed files with 28 additions and 25 deletions Side-by-side Diff
ast_decl.cc
View file @
add0606
... | ... | @@ -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); |
ast_expr.cc
View file @
add0606
... | ... | @@ -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 | } |