Compare View
Commits (4)
Diff
Showing 3 changed files Side-by-side Diff
ast.cc
View file @
06def1c
ast.h
View file @
06def1c
ast_decl.cc
View file @
06def1c
... | ... | @@ -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 | +} |