Commit 3b93536821ccf3428850ce3c2bd93d3e11556ee5

Authored by Jeffrey Johnson
1 parent 07ca8cc178
Exists in master

Functions maybe working?

Showing 1 changed file with 9 additions and 11 deletions Side-by-side Diff

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