Commit 3b93536821ccf3428850ce3c2bd93d3e11556ee5
1 parent
07ca8cc178
Exists in
master
Functions maybe working?
Showing 1 changed file with 9 additions and 11 deletions Side-by-side Diff
ast_decl.cc
View file @
3b93536
... | ... | @@ -68,22 +68,14 @@ |
68 | 68 | } |
69 | 69 | |
70 | 70 | llvm::Value* VarDecl::Emit() { |
71 | - llvm::Value* val; | |
72 | - if(type == Type::intType || type == Type::uintType) | |
73 | - val = new llvm::AllocaInst(llvm::Type::getInt32Ty(*irgen.GetContext()), id->GetName(), irgen.GetBasicBlock()); | |
74 | - if(type == Type::boolType) | |
75 | - val = new llvm::AllocaInst(llvm::Type::getInt1Ty(*irgen.GetContext()), id->GetName(), irgen.GetBasicBlock()); | |
76 | - else if(type == Type::voidType) | |
77 | - val = new llvm::AllocaInst(llvm::Type::getInt32Ty(*irgen.GetContext()), id->GetName(), irgen.GetBasicBlock()); | |
78 | - else if(type == Type::floatType) | |
79 | - val = new llvm::AllocaInst(llvm::Type::getVoidTy(*irgen.GetContext()), id->GetName(), irgen.GetBasicBlock()); | |
71 | + llvm::Value* val = new llvm::AllocaInst(convertType(type), id->GetName(), irgen.GetBasicBlock()); | |
80 | 72 | if(assignTo) val = new llvm::StoreInst(val, assignTo->Emit(), NULL, irgen.GetBasicBlock()); |
81 | 73 | return val; |
82 | 74 | } |
83 | 75 | |
84 | 76 | llvm::Value* FnDecl::Emit() { |
77 | + llvm::BasicBlock* oldBlock = irgen.GetBasicBlock(); | |
85 | 78 | llvm::LLVMContext* context = irgen.GetContext(); |
86 | - llvm::BasicBlock::Create(*context, "funcBlock", irgen.GetBasicBlock()); | |
87 | 79 | pushScope(); |
88 | 80 | vector<llvm::Type*> types; |
89 | 81 | for(int i = 0; i < formals->NumElements(); i++) { |
... | ... | @@ -92,6 +84,12 @@ |
92 | 84 | } |
93 | 85 | llvm::FunctionType* ft = llvm::FunctionType::get(convertType(returnType), types, false); |
94 | 86 | popScope(); |
95 | - return llvm::Function::Create(ft, llvm::Function::ExternalLinkage, id->GetName(), irgen.GetOrCreateModule("program")); | |
87 | + llvm::Function* func = llvm::Function::Create(ft, llvm::Function::ExternalLinkage, id->GetName(), irgen.GetOrCreateModule("program")); | |
88 | + llvm::BasicBlock * block = llvm::BasicBlock::Create(*context, "funcBlock", func); | |
89 | + irgen.SetBasicBlock(block); | |
90 | + llvm::Value* ret = body->Emit(); | |
91 | + llvm::ReturnInst::Create(*context, ret, block); | |
92 | + irgen.SetBasicBlock(oldBlock); | |
93 | + return func; | |
96 | 94 | } |