From f1ba7fa3b582d5668ffe65daff5b923a632929f1 Mon Sep 17 00:00:00 2001 From: Austin Sun Date: Fri, 20 May 2016 17:25:29 -0700 Subject: [PATCH] i think i fixed them --- ast_decl.cc | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/ast_decl.cc b/ast_decl.cc index ec50f87..479468f 100644 --- a/ast_decl.cc +++ b/ast_decl.cc @@ -66,7 +66,7 @@ void FnDecl::PrintChildren(int indentLevel) { if (formals) formals->PrintAll(indentLevel+1, "(formals) "); if (body) body->Print(indentLevel+1, "(body) "); } - +/* llvm::Value* VarDecl::Emit() { llvm::BasicBlock* b = irgen.GetBasicBlock(); llvm::Value* val; @@ -79,7 +79,25 @@ llvm::Value* VarDecl::Emit() { addToScope(id->GetName(), this, val); return val; } + */ +llvm::Value * VarDecl::Emit(){ + Type * t = type; + llvm::Type * ltyp=convertType(t); + llvm::Value * val; + llvm::Module *mod = irgen.GetOrCreateModule("program"); + if (global()){ + val = new llvm::GlobalVariable(*mod, ltyp, false, llvm::GlobalValue::ExternalLinkage, llvm::Constant::getNullValue(ltyp), llvm::Twine(id->GetName())); + addToScope(id->GetName(),this, val); + } + else{ + val = new llvm::AllocaInst(ltyp, llvm::Twine(id->GetName()), irgen.GetBasicBlock()); + addToScope(id->GetName(),this, val); + } + return val; +} + +/* llvm::Value* FnDecl::Emit() { llvm::BasicBlock* oldBlock = irgen.GetBasicBlock(); llvm::LLVMContext* context = irgen.GetContext(); @@ -105,4 +123,44 @@ llvm::Value* FnDecl::Emit() { irgen.SetBasicBlock(oldBlock); return func; } +*/ +llvm::Value * FnDecl::Emit(){ + llvm::Module *mod = irgen.GetOrCreateModule("program"); + llvm::Type *rt = convertType(this->returnType); + + std::vector ref; + for (int i = 0; i < formals->NumElements(); i++){ + ref.push_back(convertType(formals->Nth(i)->GetType())); + } + llvm::ArrayRef ar(ref); + llvm::FunctionType * ft = llvm::FunctionType::get(rt, ar, false); + llvm::Value * funcval = mod->getOrInsertFunction(llvm::StringRef(this->GetIdentifier()->GetName()), ft); + llvm::Function * fp = llvm::cast(funcval); + + addToScope(id->GetName(),this, funcval); + //TODO is this how you set it? + irgen.SetFunction(fp); + + //SetName + pushScope(); + llvm::Function::arg_iterator args = fp->arg_begin(); + + llvm::LLVMContext *context = irgen.GetContext(); + llvm::BasicBlock * varbb = llvm::BasicBlock::Create(*context, "entry", fp); + irgen.SetBasicBlock(varbb); + for (int i = 0; i < formals->NumElements(); args++, i++){ + VarDecl * currvd = formals->Nth(i); + string currname = string(currvd->GetIdentifier()->GetName()); + args->setName(currname); + llvm::Value * currargv = currvd->Emit(); + llvm::StoreInst * si = new llvm::StoreInst(&*args, currargv, varbb); + } + //Emit StmtBlock + if ( StmtBlock * sb = dynamic_cast(body) ){ + sb->Emit(); + } + popScope(); + irgen.SetFunction(NULL); + return funcval; +} -- 1.9.1