Commit eefa7b6f6111c27ae104e69c08ecdba654c9a55f

Authored by Austin Sun
1 parent 1ff8269e79
Exists in master

well

Showing 2 changed files with 44 additions and 2 deletions Side-by-side Diff

... ... @@ -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
... ... @@ -108,6 +108,7 @@
108 108 const char *GetPrintNameForNode() { return "WhileStmt"; }
109 109 void PrintChildren(int indentLevel);
110 110  
  111 + llvm::Value *Emit();
111 112 };
112 113  
113 114 class IfStmt : public ConditionalStmt