Commit 5d9d0bcccc933b0df7085169997768ea94a64aeb

Authored by Jeffrey Johnson
1 parent 2d15c0427d
Exists in master

Bug fixes

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

... ... @@ -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 }
... ... @@ -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);