From 5d9d0bcccc933b0df7085169997768ea94a64aeb Mon Sep 17 00:00:00 2001 From: Jeffrey C Johnson Date: Fri, 20 May 2016 12:45:53 -0700 Subject: [PATCH] Bug fixes --- ast_decl.cc | 18 ++++++++++++++---- ast_expr.cc | 28 ++++++++++++++-------------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/ast_decl.cc b/ast_decl.cc index c054886..ec50f87 100644 --- a/ast_decl.cc +++ b/ast_decl.cc @@ -68,8 +68,14 @@ void FnDecl::PrintChildren(int indentLevel) { } llvm::Value* VarDecl::Emit() { - llvm::Value* val = new llvm::AllocaInst(convertType(type), id->GetName(), irgen.GetBasicBlock()); - if(assignTo) val = new llvm::StoreInst(val, assignTo->Emit(), NULL, irgen.GetBasicBlock()); + llvm::BasicBlock* b = irgen.GetBasicBlock(); + llvm::Value* val; + if(b) val = new llvm::AllocaInst(convertType(type), id->GetName(), b); + else { + llvm::Constant* e = assignTo ? (llvm::Constant*)assignTo->Emit() : llvm::Constant::getNullValue(convertType(type)); + val = new llvm::GlobalVariable(*irgen.GetOrCreateModule("program"), convertType(type), false, llvm::GlobalValue::ExternalLinkage, e, ""); + } + if(assignTo) val = new llvm::StoreInst(val, assignTo->Emit(), "", b); addToScope(id->GetName(), this, val); return val; } @@ -90,8 +96,12 @@ llvm::Value* FnDecl::Emit() { for(int i = 0; i < formals->NumElements(); i++) { formals->Nth(i)->Emit(); } - llvm::Value* ret = body->Emit(); - llvm::ReturnInst::Create(*context, ret, block); + body->Emit(); + if(!block->getTerminator()) { + llvm::Value* retVar = new llvm::AllocaInst(convertType(returnType), "", block); + llvm::Value* ret = new llvm::LoadInst(retVar, "", block); + llvm::ReturnInst::Create(*context, ret, block); + } irgen.SetBasicBlock(oldBlock); return func; } diff --git a/ast_expr.cc b/ast_expr.cc index 00e0780..64733eb 100644 --- a/ast_expr.cc +++ b/ast_expr.cc @@ -133,11 +133,11 @@ void Call::PrintChildren(int indentLevel) { } llvm::Value* VarExpr::Emit() { - return new llvm::LoadInst(findSymbol(id->GetName()).second, NULL, irgen.GetBasicBlock()); + return new llvm::LoadInst(findSymbol(id->GetName()).second, "", irgen.GetBasicBlock()); } llvm::Value* AssignExpr::Emit() { - return new llvm::StoreInst(left->Emit(), right->Emit(), NULL, irgen.GetBasicBlock()); + return new llvm::StoreInst(left->Emit(), right->Emit(), "", irgen.GetBasicBlock()); } string Operator::getToken() const { @@ -188,17 +188,17 @@ llvm::Value* CompoundExpr::Emit() { if(op->getToken() == "/") return llvm::BinaryOperator::Create(llvm::Instruction::FDiv, l, r, "", b); if(op->getToken() == "==") - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_EQ, l, r, "", b); + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OEQ, l, r, "", b); if(op->getToken() == "!=") - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_NE, l, r, "", b); + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_ONE, l, r, "", b); if(op->getToken() == "<=") - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SLE, l, r, "", b); + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OLE, l, r, "", b); if(op->getToken() == ">=") - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SGE, l, r, "", b); + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OGE, l, r, "", b); if(op->getToken() == "<") - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SLT, l, r, "", b); + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OLT, l, r, "", b); if(op->getToken() == ">") - return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SGT, l, r, "", b); + return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OGT, l, r, "", b); } if(l->getType()->isIntOrIntVectorTy()) { if(op->getToken() == "+") @@ -210,17 +210,17 @@ llvm::Value* CompoundExpr::Emit() { if(op->getToken() == "/") return llvm::BinaryOperator::Create(llvm::Instruction::SDiv, l, r, "", b); if(op->getToken() == "==") - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OEQ, l, r, "", b); + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_EQ, l, r, "", b); if(op->getToken() == "!=") - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_ONE, l, r, "", b); + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_NE, l, r, "", b); if(op->getToken() == "<=") - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OLE, l, r, "", b); + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SLE, l, r, "", b); if(op->getToken() == ">=") - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OGE, l, r, "", b); + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SGE, l, r, "", b); if(op->getToken() == "<") - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OLT, l, r, "", b); + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SLT, l, r, "", b); if(op->getToken() == ">") - return llvm::CmpInst::Create(llvm::CmpInst::FCmp, llvm::CmpInst::FCMP_OGT, l, r, "", b); + return llvm::CmpInst::Create(llvm::CmpInst::ICmp, llvm::CmpInst::ICMP_SGT, l, r, "", b); } if(op->getToken() == "&&") { return llvm::BinaryOperator::Create(llvm::Instruction::And, l, r, "", b); -- 1.9.1