diff --git a/ast_stmt.cc b/ast_stmt.cc index 16f82d0..0ba8410 100644 --- a/ast_stmt.cc +++ b/ast_stmt.cc @@ -169,51 +169,49 @@ llvm::Value * DeclStmt::Emit(){ llvm::Value * ConditionalStmt::Emit(){ return NULL; } -//for statement + llvm::Value * ForStmt::Emit() { pushScope(); llvm::LLVMContext * context = irgen.GetContext(); - llvm::Function * func = irgen.GetFunction(); - llvm::BasicBlock * headBlock = llvm::BasicBlock::Create(*context, "headBlock", func); - llvm::BasicBlock * footBlock = llvm::BasicBlock::Create(*context, "footBlock", func); - llvm::BasicBlock * incBlock = llvm::BasicBlock::Create(*context, "incBlock", func); - llvm::BasicBlock * bodyBlock = llvm::BasicBlock::Create(*context, "bodyBlock", func); - llvm::Value * condition; + llvm::Function * f = irgen.GetFunction(); + llvm::BasicBlock * headBlock = llvm::BasicBlock::Create(*context, "headBlock", f); + llvm::BasicBlock * footBlock = llvm::BasicBlock::Create(*context, "footBlock", f); + llvm::BasicBlock * stepBlock = llvm::BasicBlock::Create(*context, "stepBlock", f); + llvm::BasicBlock * bodyBlock = llvm::BasicBlock::Create(*context, "bodyBlock", f); + llvm::Value * cond; // init and branch to head init->Emit(); - llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock()); + llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock()); // given in the slides // head irgen.SetBasicBlock(headBlock); - condition = test->Emit(); + cond = test->Emit(); if(!irgen.GetBasicBlock()->getTerminator()) { - llvm::BranchInst::Create(bodyBlock, footBlock, condition, irgen.GetBasicBlock()); + llvm::BranchInst::Create(bodyBlock, footBlock, cond, irgen.GetBasicBlock()); // given in the slides } - // body irgen.SetBasicBlock(bodyBlock); body->Emit(); if(!irgen.GetBasicBlock()->getTerminator()) { - llvm::BranchInst::Create(incBlock, irgen.GetBasicBlock()); + llvm::BranchInst::Create(stepBlock, irgen.GetBasicBlock()); // given in the slides } - // step - irgen.SetBasicBlock(incBlock); + irgen.SetBasicBlock(stepBlock); step->Emit(); if(!irgen.GetBasicBlock()->getTerminator()) { - llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock()); + llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock()); // given in the slides } - irgen.SetBasicBlock(footBlock); popScope(); return NULL; } + //while statement llvm::Value * WhileStmt::Emit(){ pushScope(); @@ -321,11 +319,11 @@ llvm::Value * ReturnStmt::Emit(){ //stack for both llvm::Value * SwitchStmt::Emit(){ - /* - llvm::Value * val; + + llvm::SwitchInst * val; llvm::LLVMContext * context = irgen.GetContext(); llvm::Function * func = irgen.GetFunction(); - llvm::BasicBlock * blockArr = new llvm::BasicBlock [cases->NumElements()]; + llvm::BasicBlock * blockArr = new llvm::BasicBlock[cases->NumElements()]; //find all cases and create a basic block for all of them for (int i = 0; i < cases->NumElements(); i++){ blockArr[i]= new llvm::BasicBlock::Create(*context, "switchBlock", func); @@ -340,13 +338,11 @@ llvm::Value * SwitchStmt::Emit(){ for(int i=0; iNumElements();i++){ //add addCase to switch stmt //addcase to val method - val.AddCase (i, blockArr[i]); + val.addCase (i, blockArr[i]); cases->Nth(i)->Emit(); irgen.GetBasicBlock()->getTerminator(); } return val; - */ - return NULL; } llvm::Value * SwitchLabel::Emit(){