From 7efd7e49e80e7de96c8cca9a29d72b6e435d52a7 Mon Sep 17 00:00:00 2001 From: Austin Sun Date: Tue, 17 May 2016 16:24:16 -0700 Subject: [PATCH] for is up --- ast_stmt.cc | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++------ ast_stmt.h | 2 +- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/ast_stmt.cc b/ast_stmt.cc index 3ca999e..cea0772 100644 --- a/ast_stmt.cc +++ b/ast_stmt.cc @@ -170,7 +170,51 @@ 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; + + + // init and branch to head + init->Emit(); + + llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock()); + // head + irgen.SetBasicBlock(headBlock); + condition = test->Emit(); + if(!irgen.GetBasicBlock()->getTerminator()) + { + llvm::BranchInst::Create(bodyBlock, footBlock, condition, irgen.GetBasicBlock()); + } + + // body + irgen.SetBasicBlock(bodyBlock); + body->Emit(); + if(!irgen.GetBasicBlock()->getTerminator()) + { + llvm::BranchInst::Create(incBlock, irgen.GetBasicBlock()); + } + + // step + irgen.SetBasicBlock(incBlock); + step->Emit(); + if(!irgen.GetBasicBlock()->getTerminator()) + { + llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock()); + } + + irgen.SetBasicBlock(footBlock); + popScope(); + return NULL; +} //while statement //if statement @@ -178,16 +222,16 @@ llvm::Value * IfStmt::Emit(){ llvm::LLVMContext * context = irgen.GetContext(); llvm::Function * func = irgen.GetFunction(); llvm::BasicBlock * elseBlock = NULL; - llvm::BasicBlock * thenBlock = llvm::BasicBlock::Create(*context, "thenBlock", func); - llvm::BasicBlock * footBlock = llvm::BasicBlock::Create(*context, "footBlock", func); + llvm::BasicBlock * thenBlock = llvm::BasicBlock::Create(context, "thenBlock", func); + llvm::BasicBlock * footBlock = llvm::BasicBlock::Create(context, "footBlock", func); llvm::Value * val; - llvm::Value * cond = test->Emit(); + llvm::Value * condition = test->Emit(); if(elseBody) { elseBlock = llvm::BasicBlock::Create(*context, "elseBlock", func); } - val = llvm::BranchInst::Create(thenBlock, elseBody ? elseBlock : footBlock, cond, irgen.GetBasicBlock()); + val = llvm::BranchInst::Create(thenBlock, elseBody ? elseBlock : footBlock, condition, irgen.GetBasicBlock()); pushScope(); irgen.SetBasicBlock(thenBlock); body->Emit(); @@ -228,10 +272,10 @@ llvm::Value * ReturnStmt::Emit(){ llvm::LLVMContext * context = irgen.GetContext(); if (expr){ llvm::Value * retVal = expr->Emit(); - retVal = llvm::ReturnInst::Create(*context, retVal, irgen.GetBasicBlock()); + retVal = llvm::ReturnInst::Create(context, retVal, irgen.GetBasicBlock()); return retVal; } - val = llvm::ReturnInst::Create(*context, irgen.GetBasicBlock()); + val = llvm::ReturnInst::Create(context, irgen.GetBasicBlock()); return val; } diff --git a/ast_stmt.h b/ast_stmt.h index f1acd5e..cc62ab5 100644 --- a/ast_stmt.h +++ b/ast_stmt.h @@ -52,7 +52,6 @@ class StmtBlock : public Stmt StmtBlock(List *variableDeclarations, List *statements); const char *GetPrintNameForNode() { return "StmtBlock"; } void PrintChildren(int indentLevel); - llvm::Value *Emit(); }; @@ -99,6 +98,7 @@ class ForStmt : public LoopStmt const char *GetPrintNameForNode() { return "ForStmt"; } void PrintChildren(int indentLevel); + llvm::Value *Emit(); }; class WhileStmt : public LoopStmt -- 1.9.1