Compare View

switch
from
...
to
 
Commits (4)

Diff

Showing 3 changed files Side-by-side Diff

... ... @@ -94,3 +94,7 @@ void popScope() {
94 94 void addToScope(string s, Decl* d, llvm::Value * v) {
95 95 symbols[symbols.size()-1][s] = make_pair(d, v);
96 96 }
  97 +
  98 +bool global(){
  99 + return symbols.front()==symbols.back();
  100 +}
... ... @@ -122,7 +122,7 @@ void pushScope();
122 122 void popScope();
123 123 void addToScope(string s, Decl* d, llvm::Value * v);
124 124 extern SymbolTable symbols;
125   -
  125 +bool global();
126 126  
127 127 #endif
128 128  
... ... @@ -67,6 +67,7 @@ void FnDecl::PrintChildren(int indentLevel) {
67 67 if (body) body->Print(indentLevel+1, "(body) ");
68 68 }
69 69  
  70 +/*
70 71 llvm::Value* VarDecl::Emit() {
71 72 llvm::BasicBlock* b = irgen.GetBasicBlock();
72 73 llvm::Value* val;
... ... @@ -79,7 +80,25 @@ llvm::Value* VarDecl::Emit() {
79 80 addToScope(id->GetName(), this, val);
80 81 return val;
81 82 }
  83 + */
  84 +llvm::Value * VarDecl::Emit(){
  85 + Type * t = type;
  86 + llvm::Type * ltyp=convertType(t);
  87 + llvm::Value * val;
  88 + llvm::Module *mod = irgen.GetOrCreateModule("program");
  89 + if (global()){
  90 + val = new llvm::GlobalVariable(*mod, ltyp, false, llvm::GlobalValue::ExternalLinkage, llvm::Constant::getNullValue(ltyp), llvm::Twine(id->GetName()));
  91 + addToScope(id->GetName(),this, val);
  92 + }
  93 + else{
  94 + val = new llvm::AllocaInst(ltyp, llvm::Twine(id->GetName()), irgen.GetBasicBlock());
  95 + addToScope(id->GetName(),this, val);
  96 + }
  97 + return val;
  98 +}
  99 +
82 100  
  101 +/*
83 102 llvm::Value* FnDecl::Emit() {
84 103 llvm::BasicBlock* oldBlock = irgen.GetBasicBlock();
85 104 llvm::LLVMContext* context = irgen.GetContext();
... ... @@ -106,4 +125,44 @@ llvm::Value* FnDecl::Emit() {
106 125 irgen.SetBasicBlock(oldBlock);
107 126 return func;
108 127 }
  128 +*/
  129 +llvm::Value * FnDecl::Emit(){
  130 + llvm::Module *mod = irgen.GetOrCreateModule("program");
  131 + llvm::Type *rt = convertType(this->returnType);
  132 +
  133 + std::vector<llvm::Type *> ref;
  134 + for (int i = 0; i < formals->NumElements(); i++){
  135 + ref.push_back(convertType(formals->Nth(i)->GetType()));
  136 + }
  137 + llvm::ArrayRef<llvm::Type *> ar(ref);
  138 + llvm::FunctionType * ft = llvm::FunctionType::get(rt, ar, false);
109 139  
  140 + llvm::Value * funcval = mod->getOrInsertFunction(llvm::StringRef(this->GetIdentifier()->GetName()), ft);
  141 + llvm::Function * fp = llvm::cast<llvm::Function>(funcval);
  142 +
  143 + addToScope(id->GetName(),this, funcval);
  144 + //TODO is this how you set it?
  145 + irgen.SetFunction(fp);
  146 +
  147 + //SetName
  148 + pushScope();
  149 + llvm::Function::arg_iterator args = fp->arg_begin();
  150 +
  151 + llvm::LLVMContext *context = irgen.GetContext();
  152 + llvm::BasicBlock * varbb = llvm::BasicBlock::Create(*context, "entry", fp);
  153 + irgen.SetBasicBlock(varbb);
  154 + for (int i = 0; i < formals->NumElements(); args++, i++){
  155 + VarDecl * currvd = formals->Nth(i);
  156 + string currname = string(currvd->GetIdentifier()->GetName());
  157 + args->setName(currname);
  158 + llvm::Value * currargv = currvd->Emit();
  159 + llvm::StoreInst * si = new llvm::StoreInst(&*args, currargv, varbb);
  160 + }
  161 + //Emit StmtBlock
  162 + if ( StmtBlock * sb = dynamic_cast<StmtBlock *>(body) ){
  163 + sb->Emit();
  164 + }
  165 + popScope();
  166 + irgen.SetFunction(NULL);
  167 + return funcval;
  168 +}