Commit eefa7b6f6111c27ae104e69c08ecdba654c9a55f
1 parent
1ff8269e79
Exists in
master
well
Showing 2 changed files with 44 additions and 2 deletions Side-by-side Diff
ast_stmt.cc
View file @
eefa7b6
... | ... | @@ -215,7 +215,38 @@ |
215 | 215 | return NULL; |
216 | 216 | } |
217 | 217 | //while statement |
218 | +llvm::Value * WhileStmt::Emit(){ | |
219 | + pushScope(); | |
220 | + llvm::LLVMContext * context = irgen.GetContext(); | |
221 | + llvm::Function * f = irgen.GetFunction(); | |
222 | + llvm::Value * cond; | |
218 | 223 | |
224 | + llvm::BasicBlock * headBlock = llvm::BasicBlock::Create(*context, "headBlock", f); | |
225 | + llvm::BasicBlock * footBlock = llvm::BasicBlock::Create(*context, "footBlock", f); | |
226 | + llvm::BasicBlock * bodyBlock = llvm::BasicBlock::Create(*context, "bodyBlock", f); | |
227 | + llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock()); | |
228 | + | |
229 | + irgen.SetBasicBlock(headBlock); | |
230 | + cond = test->Emit(); | |
231 | + if(!irgen.GetBasicBlock()->getTerminator()) | |
232 | + { | |
233 | + llvm::BranchInst::Create(bodyBlock, footBlock, cond, irgen.GetBasicBlock()); // given in the slides | |
234 | + } | |
235 | + | |
236 | + irgen.SetBasicBlock(bodyBlock); | |
237 | + body->Emit(); | |
238 | + if(!irgen.GetBasicBlock()->getTerminator()) | |
239 | + { | |
240 | + llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock()); // given in the slides | |
241 | + } | |
242 | + | |
243 | + | |
244 | + irgen.SetBasicBlock(footBlock); | |
245 | + popScope(); | |
246 | + return NULL; | |
247 | +} | |
248 | + | |
249 | + | |
219 | 250 | //if statement |
220 | 251 | llvm::Value * IfStmt::Emit(){ |
221 | 252 | llvm::LLVMContext * context = irgen.GetContext(); |
222 | 253 | |
... | ... | @@ -258,11 +289,19 @@ |
258 | 289 | } |
259 | 290 | |
260 | 291 | llvm::Value * BreakStmt::Emit(){ |
261 | - return NULL; | |
292 | + llvm::Value * val; | |
293 | + llvm::LLVMContext * context = irgen.GetContext(); | |
294 | + llvm::Function * func = irgen.GetFunction(); | |
295 | + llvm::BasicBlock * breakBlock = llvm::BasicBlock::Create(*context, "breakBlock", func); | |
296 | + val=llvm::Create (breakBlock, irgen.GetBasicBlock()); | |
262 | 297 | } |
263 | 298 | |
264 | 299 | llvm::Value * ContinueStmt::Emit(){ |
265 | - return NULL; | |
300 | + llvm::Value * val; | |
301 | + llvm::LLVMContext * context = irgen.GetContext(); | |
302 | + llvm::Function * func = irgen.GetFunction(); | |
303 | + llvm::BasicBlock * contBlock = llvm::BasicBlock::Create(*context, "contBlock", func); | |
304 | + val=llvm::Create (breakBlock, irgen.GetBasicBlock()); | |
266 | 305 | } |
267 | 306 | |
268 | 307 | //Not sure |
269 | 308 | |
... | ... | @@ -286,9 +325,11 @@ |
286 | 325 | for (int i = 0; i < cases->NumElements(); i++){ |
287 | 326 | //cases->Nth(i)->Emit(); |
288 | 327 | |
328 | + //llvm::BasicBlock * headBlock = llvm::BasicBlock::Create(*context, "headBlock", func); | |
289 | 329 | } |
290 | 330 | //Emit of expression |
291 | 331 | llvm::Value * exprVal=expr->Emit(); |
332 | + | |
292 | 333 | //create switch instruction |
293 | 334 | //val=llvm::SwitchInst::Create(Value *Value, BasicBlock *Default, unsigned NumCases, BasicBlock *InsertAtEnd); |
294 | 335 | //for each case 'addCase to switch stmt', EMIT for stmt in case, create terminator instruction |