diff --git a/ast_stmt.cc b/ast_stmt.cc index 5f68f8b..118dc11 100644 --- a/ast_stmt.cc +++ b/ast_stmt.cc @@ -24,7 +24,7 @@ void Program::PrintChildren(int indentLevel) { } //pls work llvm::Value* Program::Emit() { - llvm::Module *module = irGen->GetOrCreateModule("swag"); + llvm::Module *module = irGen->GetOrCreateModule("program"); pushScope(); for (int i = 0; i < decls->NumElements(); i++){ decls->Nth(i)->Emit(); @@ -136,8 +136,9 @@ void SwitchStmt::PrintChildren(int indentLevel) { if (cases) cases->PrintAll(indentLevel+1); if (def) def->Print(indentLevel+1); } - +//----------------------------------------------------------------------- //rest of the emits +//----------------------------------------------------------------------- llvm::Value * StmtBlock::Emit(){ pushScope(); for (int i = 0; i < decls->NumElements(); i++){ @@ -147,8 +148,6 @@ llvm::Value * StmtBlock::Emit(){ stmts->Nth(i)->Emit(); } - //TODO - popScope(); return NULL; } @@ -171,8 +170,49 @@ llvm::Value * ConditionalStmt::Emit(){ return NULL; } //for statement + //while statement + //if statement +llvm::Value * IfStmt::Emit(){ + 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::Value * val; + llvm::Value * cond = test->Emit(); + llvm::LLVMContext * context = irGen->GetContext(); + if(elseBody) + { + elseBlock = llvm::BasicBlock::Create(*context, "elseBlock", func); + } + + val = llvm::BranchInst::Create(thenBlock, elseBody ? elseBlock : footBlock, cond, irGen->GetBasicBlock()); + pushScope(); + irGen->SetBasicBlock(thenBlock); + body->Emit(); + + if(!irGen->GetBasicBlock()->getTerminator()) + { + val = llvm::BranchInst::Create(footBlock, irGen->GetBasicBlock()); + } + popScope(); + + if(elseBody) + { + pushScope(); + irGen->SetBasicBlock(elseBlock); + elseBody->Emit(); + + if(!irGen->GetBasicBlock()->getTerminator()) + { + val = llvm::BranchInst::Create(footBlock, irGen->GetBasicBlock()); + } + popScope(); + } + irGen->SetBasicBlock(footBlock); + return val; +} llvm::Value * BreakStmt::Emit(){ return NULL; diff --git a/ast_stmt.h b/ast_stmt.h index 53eac9d..f1acd5e 100644 --- a/ast_stmt.h +++ b/ast_stmt.h @@ -121,6 +121,7 @@ class IfStmt : public ConditionalStmt const char *GetPrintNameForNode() { return "IfStmt"; } void PrintChildren(int indentLevel); + llvm::Value *Emit(); }; class IfStmtExprError : public IfStmt