Commit 5d9d0bcccc933b0df7085169997768ea94a64aeb
1 parent
2d15c0427d
Exists in
master
Bug fixes
Showing 2 changed files with 28 additions and 18 deletions Side-by-side Diff
ast_decl.cc
View file @
5d9d0bc
... | ... | @@ -68,8 +68,14 @@ |
68 | 68 | } |
69 | 69 | |
70 | 70 | llvm::Value* VarDecl::Emit() { |
71 | - llvm::Value* val = new llvm::AllocaInst(convertType(type), id->GetName(), irgen.GetBasicBlock()); | |
72 | - if(assignTo) val = new llvm::StoreInst(val, assignTo->Emit(), NULL, irgen.GetBasicBlock()); | |
71 | + llvm::BasicBlock* b = irgen.GetBasicBlock(); | |
72 | + llvm::Value* val; | |
73 | + if(b) val = new llvm::AllocaInst(convertType(type), id->GetName(), b); | |
74 | + else { | |
75 | + llvm::Constant* e = assignTo ? (llvm::Constant*)assignTo->Emit() : llvm::Constant::getNullValue(convertType(type)); | |
76 | + val = new llvm::GlobalVariable(*irgen.GetOrCreateModule("program"), convertType(type), false, llvm::GlobalValue::ExternalLinkage, e, ""); | |
77 | + } | |
78 | + if(assignTo) val = new llvm::StoreInst(val, assignTo->Emit(), "", b); | |
73 | 79 | addToScope(id->GetName(), this, val); |
74 | 80 | return val; |
75 | 81 | } |
... | ... | @@ -90,8 +96,12 @@ |
90 | 96 | for(int i = 0; i < formals->NumElements(); i++) { |
91 | 97 | formals->Nth(i)->Emit(); |
92 | 98 | } |
93 | - llvm::Value* ret = body->Emit(); | |
94 | - llvm::ReturnInst::Create(*context, ret, block); | |
99 | + body->Emit(); | |
100 | + if(!block->getTerminator()) { | |
101 | + llvm::Value* retVar = new llvm::AllocaInst(convertType(returnType), "", block); | |
102 | + llvm::Value* ret = new llvm::LoadInst(retVar, "", block); | |
103 | + llvm::ReturnInst::Create(*context, ret, block); | |
104 | + } | |
95 | 105 | irgen.SetBasicBlock(oldBlock); |
96 | 106 | return func; |
97 | 107 | } |
ast_expr.cc
View file @
5d9d0bc
... | ... | @@ -133,11 +133,11 @@ |
133 | 133 | } |
134 | 134 | |
135 | 135 | llvm::Value* VarExpr::Emit() { |
136 | - return new llvm::LoadInst(findSymbol(id->GetName()).second, NULL, irgen.GetBasicBlock()); | |
136 | + return new llvm::LoadInst(findSymbol(id->GetName()).second, "", irgen.GetBasicBlock()); | |
137 | 137 | } |
138 | 138 | |
139 | 139 | llvm::Value* AssignExpr::Emit() { |
140 | - return new llvm::StoreInst(left->Emit(), right->Emit(), NULL, irgen.GetBasicBlock()); | |
140 | + return new llvm::StoreInst(left->Emit(), right->Emit(), "", irgen.GetBasicBlock()); | |
141 | 141 | } |
142 | 142 | |
143 | 143 | string Operator::getToken() const { |
144 | 144 | |
145 | 145 | |
146 | 146 | |
147 | 147 | |
148 | 148 | |
... | ... | @@ -188,17 +188,17 @@ |
188 | 188 | if(op->getToken() == "/") |
189 | 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, "", b); | |
191 | + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OEQ, l, r, "", b); | |
192 | 192 | if(op->getToken() == "!=") |
193 | - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_NE, l, r, "", b); | |
193 | + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_ONE, l, r, "", b); | |
194 | 194 | if(op->getToken() == "<=") |
195 | - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SLE, l, r, "", b); | |
195 | + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OLE, l, r, "", b); | |
196 | 196 | if(op->getToken() == ">=") |
197 | - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SGE, l, r, "", b); | |
197 | + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OGE, l, r, "", b); | |
198 | 198 | if(op->getToken() == "<") |
199 | - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SLT, l, r, "", b); | |
199 | + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OLT, l, r, "", b); | |
200 | 200 | if(op->getToken() == ">") |
201 | - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SGT, l, r, "", b); | |
201 | + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OGT, l, r, "", b); | |
202 | 202 | } |
203 | 203 | if(l->getType()->isIntOrIntVectorTy()) { |
204 | 204 | if(op->getToken() == "+") |
205 | 205 | |
206 | 206 | |
207 | 207 | |
208 | 208 | |
209 | 209 | |
... | ... | @@ -210,17 +210,17 @@ |
210 | 210 | if(op->getToken() == "/") |
211 | 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, "", b); | |
213 | + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_EQ, l, r, "", b); | |
214 | 214 | if(op->getToken() == "!=") |
215 | - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_ONE, l, r, "", b); | |
215 | + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_NE, l, r, "", b); | |
216 | 216 | if(op->getToken() == "<=") |
217 | - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OLE, l, r, "", b); | |
217 | + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SLE, l, r, "", b); | |
218 | 218 | if(op->getToken() == ">=") |
219 | - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OGE, l, r, "", b); | |
219 | + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SGE, l, r, "", b); | |
220 | 220 | if(op->getToken() == "<") |
221 | - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OLT, l, r, "", b); | |
221 | + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SLT, l, r, "", b); | |
222 | 222 | if(op->getToken() == ">") |
223 | - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OGT, l, r, "", b); | |
223 | + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SGT, l, r, "", b); | |
224 | 224 | } |
225 | 225 | if(op->getToken() == "&&") { |
226 | 226 | return llvm::BinaryOperator::Create(llvm::Instruction::And, l, r, "", b); |