From eefa7b6f6111c27ae104e69c08ecdba654c9a55f Mon Sep 17 00:00:00 2001 From: Austin Sun Date: Thu, 19 May 2016 10:21:29 -0700 Subject: [PATCH] well --- ast_stmt.cc | 45 +++++++++++++++++++++++++++++++++++++++++++-- ast_stmt.h | 1 + 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/ast_stmt.cc b/ast_stmt.cc index a8e3f6e..6bdc3b6 100644 --- a/ast_stmt.cc +++ b/ast_stmt.cc @@ -215,6 +215,37 @@ llvm::Value * ForStmt::Emit() return NULL; } //while statement +llvm::Value * WhileStmt::Emit(){ + pushScope(); + llvm::LLVMContext * context = irgen.GetContext(); + llvm::Function * f = irgen.GetFunction(); + llvm::Value * cond; + + llvm::BasicBlock * headBlock = llvm::BasicBlock::Create(*context, "headBlock", f); + llvm::BasicBlock * footBlock = llvm::BasicBlock::Create(*context, "footBlock", f); + llvm::BasicBlock * bodyBlock = llvm::BasicBlock::Create(*context, "bodyBlock", f); + llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock()); + + irgen.SetBasicBlock(headBlock); + cond = test->Emit(); + if(!irgen.GetBasicBlock()->getTerminator()) + { + llvm::BranchInst::Create(bodyBlock, footBlock, cond, irgen.GetBasicBlock()); // given in the slides + } + + irgen.SetBasicBlock(bodyBlock); + body->Emit(); + if(!irgen.GetBasicBlock()->getTerminator()) + { + llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock()); // given in the slides + } + + + irgen.SetBasicBlock(footBlock); + popScope(); + return NULL; +} + //if statement llvm::Value * IfStmt::Emit(){ @@ -258,11 +289,19 @@ llvm::Value * IfStmt::Emit(){ } llvm::Value * BreakStmt::Emit(){ - return NULL; + llvm::Value * val; + llvm::LLVMContext * context = irgen.GetContext(); + llvm::Function * func = irgen.GetFunction(); + llvm::BasicBlock * breakBlock = llvm::BasicBlock::Create(*context, "breakBlock", func); + val=llvm::Create (breakBlock, irgen.GetBasicBlock()); } llvm::Value * ContinueStmt::Emit(){ - return NULL; + llvm::Value * val; + llvm::LLVMContext * context = irgen.GetContext(); + llvm::Function * func = irgen.GetFunction(); + llvm::BasicBlock * contBlock = llvm::BasicBlock::Create(*context, "contBlock", func); + val=llvm::Create (breakBlock, irgen.GetBasicBlock()); } //Not sure @@ -286,9 +325,11 @@ llvm::Value * SwitchStmt::Emit(){ for (int i = 0; i < cases->NumElements(); i++){ //cases->Nth(i)->Emit(); + //llvm::BasicBlock * headBlock = llvm::BasicBlock::Create(*context, "headBlock", func); } //Emit of expression llvm::Value * exprVal=expr->Emit(); + //create switch instruction //val=llvm::SwitchInst::Create(Value *Value, BasicBlock *Default, unsigned NumCases, BasicBlock *InsertAtEnd); //for each case 'addCase to switch stmt', EMIT for stmt in case, create terminator instruction diff --git a/ast_stmt.h b/ast_stmt.h index cc62ab5..a2de7e7 100644 --- a/ast_stmt.h +++ b/ast_stmt.h @@ -108,6 +108,7 @@ class WhileStmt : public LoopStmt const char *GetPrintNameForNode() { return "WhileStmt"; } void PrintChildren(int indentLevel); + llvm::Value *Emit(); }; class IfStmt : public ConditionalStmt -- 1.9.1