Commit 7efd7e49e80e7de96c8cca9a29d72b6e435d52a7
1 parent
344a5bcfc7
Exists in
master
for is up
Showing 2 changed files with 51 additions and 7 deletions Side-by-side Diff
ast_stmt.cc
View file @
7efd7e4
... | ... | @@ -170,7 +170,51 @@ |
170 | 170 | return NULL; |
171 | 171 | } |
172 | 172 | //for statement |
173 | +llvm::Value * ForStmt::Emit() | |
174 | +{ | |
175 | + pushScope(); | |
176 | + llvm::LLVMContext * context = irgen.GetContext(); | |
177 | + llvm::Function * func = irgen.GetFunction(); | |
178 | + llvm::BasicBlock * headBlock = llvm::BasicBlock::Create(context, "headBlock", func); | |
179 | + llvm::BasicBlock * footBlock = llvm::BasicBlock::Create(context, "footBlock", func); | |
180 | + llvm::BasicBlock * incBlock = llvm::BasicBlock::Create(context, "incBlock", func); | |
181 | + llvm::BasicBlock * bodyBlock = llvm::BasicBlock::Create(context, "bodyBlock", func); | |
182 | + llvm::Value * condition; | |
173 | 183 | |
184 | + | |
185 | + // init and branch to head | |
186 | + init->Emit(); | |
187 | + | |
188 | + llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock()); | |
189 | + | |
190 | + // head | |
191 | + irgen.SetBasicBlock(headBlock); | |
192 | + condition = test->Emit(); | |
193 | + if(!irgen.GetBasicBlock()->getTerminator()) | |
194 | + { | |
195 | + llvm::BranchInst::Create(bodyBlock, footBlock, condition, irgen.GetBasicBlock()); | |
196 | + } | |
197 | + | |
198 | + // body | |
199 | + irgen.SetBasicBlock(bodyBlock); | |
200 | + body->Emit(); | |
201 | + if(!irgen.GetBasicBlock()->getTerminator()) | |
202 | + { | |
203 | + llvm::BranchInst::Create(incBlock, irgen.GetBasicBlock()); | |
204 | + } | |
205 | + | |
206 | + // step | |
207 | + irgen.SetBasicBlock(incBlock); | |
208 | + step->Emit(); | |
209 | + if(!irgen.GetBasicBlock()->getTerminator()) | |
210 | + { | |
211 | + llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock()); | |
212 | + } | |
213 | + | |
214 | + irgen.SetBasicBlock(footBlock); | |
215 | + popScope(); | |
216 | + return NULL; | |
217 | +} | |
174 | 218 | //while statement |
175 | 219 | |
176 | 220 | //if statement |
177 | 221 | |
178 | 222 | |
... | ... | @@ -178,16 +222,16 @@ |
178 | 222 | llvm::LLVMContext * context = irgen.GetContext(); |
179 | 223 | llvm::Function * func = irgen.GetFunction(); |
180 | 224 | llvm::BasicBlock * elseBlock = NULL; |
181 | - llvm::BasicBlock * thenBlock = llvm::BasicBlock::Create(*context, "thenBlock", func); | |
182 | - llvm::BasicBlock * footBlock = llvm::BasicBlock::Create(*context, "footBlock", func); | |
225 | + llvm::BasicBlock * thenBlock = llvm::BasicBlock::Create(context, "thenBlock", func); | |
226 | + llvm::BasicBlock * footBlock = llvm::BasicBlock::Create(context, "footBlock", func); | |
183 | 227 | llvm::Value * val; |
184 | - llvm::Value * cond = test->Emit(); | |
228 | + llvm::Value * condition = test->Emit(); | |
185 | 229 | if(elseBody) |
186 | 230 | { |
187 | 231 | elseBlock = llvm::BasicBlock::Create(*context, "elseBlock", func); |
188 | 232 | } |
189 | 233 | |
190 | - val = llvm::BranchInst::Create(thenBlock, elseBody ? elseBlock : footBlock, cond, irgen.GetBasicBlock()); | |
234 | + val = llvm::BranchInst::Create(thenBlock, elseBody ? elseBlock : footBlock, condition, irgen.GetBasicBlock()); | |
191 | 235 | pushScope(); |
192 | 236 | irgen.SetBasicBlock(thenBlock); |
193 | 237 | body->Emit(); |
194 | 238 | |
... | ... | @@ -228,10 +272,10 @@ |
228 | 272 | llvm::LLVMContext * context = irgen.GetContext(); |
229 | 273 | if (expr){ |
230 | 274 | llvm::Value * retVal = expr->Emit(); |
231 | - retVal = llvm::ReturnInst::Create(*context, retVal, irgen.GetBasicBlock()); | |
275 | + retVal = llvm::ReturnInst::Create(context, retVal, irgen.GetBasicBlock()); | |
232 | 276 | return retVal; |
233 | 277 | } |
234 | - val = llvm::ReturnInst::Create(*context, irgen.GetBasicBlock()); | |
278 | + val = llvm::ReturnInst::Create(context, irgen.GetBasicBlock()); | |
235 | 279 | return val; |
236 | 280 | } |
237 | 281 |
ast_stmt.h
View file @
7efd7e4
... | ... | @@ -52,7 +52,6 @@ |
52 | 52 | StmtBlock(List<VarDecl*> *variableDeclarations, List<Stmt*> *statements); |
53 | 53 | const char *GetPrintNameForNode() { return "StmtBlock"; } |
54 | 54 | void PrintChildren(int indentLevel); |
55 | - | |
56 | 55 | llvm::Value *Emit(); |
57 | 56 | }; |
58 | 57 | |
... | ... | @@ -99,6 +98,7 @@ |
99 | 98 | const char *GetPrintNameForNode() { return "ForStmt"; } |
100 | 99 | void PrintChildren(int indentLevel); |
101 | 100 | |
101 | + llvm::Value *Emit(); | |
102 | 102 | }; |
103 | 103 | |
104 | 104 | class WhileStmt : public LoopStmt |