From 3b93536821ccf3428850ce3c2bd93d3e11556ee5 Mon Sep 17 00:00:00 2001 From: Jeffrey C Johnson Date: Thu, 19 May 2016 16:23:00 -0700 Subject: [PATCH] Functions maybe working? --- ast_decl.cc | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/ast_decl.cc b/ast_decl.cc index 9732a7b..3698138 100644 --- a/ast_decl.cc +++ b/ast_decl.cc @@ -68,22 +68,14 @@ void FnDecl::PrintChildren(int indentLevel) { } llvm::Value* VarDecl::Emit() { - llvm::Value* val; - if(type == Type::intType || type == Type::uintType) - val = new llvm::AllocaInst(llvm::Type::getInt32Ty(*irgen.GetContext()), id->GetName(), irgen.GetBasicBlock()); - if(type == Type::boolType) - val = new llvm::AllocaInst(llvm::Type::getInt1Ty(*irgen.GetContext()), id->GetName(), irgen.GetBasicBlock()); - else if(type == Type::voidType) - val = new llvm::AllocaInst(llvm::Type::getInt32Ty(*irgen.GetContext()), id->GetName(), irgen.GetBasicBlock()); - else if(type == Type::floatType) - val = new llvm::AllocaInst(llvm::Type::getVoidTy(*irgen.GetContext()), id->GetName(), irgen.GetBasicBlock()); + llvm::Value* val = new llvm::AllocaInst(convertType(type), id->GetName(), irgen.GetBasicBlock()); if(assignTo) val = new llvm::StoreInst(val, assignTo->Emit(), NULL, irgen.GetBasicBlock()); return val; } llvm::Value* FnDecl::Emit() { + llvm::BasicBlock* oldBlock = irgen.GetBasicBlock(); llvm::LLVMContext* context = irgen.GetContext(); - llvm::BasicBlock::Create(*context, "funcBlock", irgen.GetBasicBlock()); pushScope(); vector types; for(int i = 0; i < formals->NumElements(); i++) { @@ -92,6 +84,12 @@ llvm::Value* FnDecl::Emit() { } llvm::FunctionType* ft = llvm::FunctionType::get(convertType(returnType), types, false); popScope(); - return llvm::Function::Create(ft, llvm::Function::ExternalLinkage, id->GetName(), irgen.GetOrCreateModule("program")); + llvm::Function* func = llvm::Function::Create(ft, llvm::Function::ExternalLinkage, id->GetName(), irgen.GetOrCreateModule("program")); + llvm::BasicBlock * block = llvm::BasicBlock::Create(*context, "funcBlock", func); + irgen.SetBasicBlock(block); + llvm::Value* ret = body->Emit(); + llvm::ReturnInst::Create(*context, ret, block); + irgen.SetBasicBlock(oldBlock); + return func; } -- 1.9.1