Commit 7efd7e49e80e7de96c8cca9a29d72b6e435d52a7

Authored by Austin Sun
1 parent 344a5bcfc7
Exists in master

for is up

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

... ... @@ -170,7 +170,51 @@
170 170 return NULL;
171 171 }
172 172 //for statement
  173 +llvm::Value * ForStmt::Emit()
  174 +{
  175 + pushScope();
  176 + llvm::LLVMContext * context = irgen.GetContext();
  177 + llvm::Function * func = irgen.GetFunction();
  178 + llvm::BasicBlock * headBlock = llvm::BasicBlock::Create(context, "headBlock", func);
  179 + llvm::BasicBlock * footBlock = llvm::BasicBlock::Create(context, "footBlock", func);
  180 + llvm::BasicBlock * incBlock = llvm::BasicBlock::Create(context, "incBlock", func);
  181 + llvm::BasicBlock * bodyBlock = llvm::BasicBlock::Create(context, "bodyBlock", func);
  182 + llvm::Value * condition;
173 183  
  184 +
  185 + // init and branch to head
  186 + init->Emit();
  187 +
  188 + llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock());
  189 +
  190 + // head
  191 + irgen.SetBasicBlock(headBlock);
  192 + condition = test->Emit();
  193 + if(!irgen.GetBasicBlock()->getTerminator())
  194 + {
  195 + llvm::BranchInst::Create(bodyBlock, footBlock, condition, irgen.GetBasicBlock());
  196 + }
  197 +
  198 + // body
  199 + irgen.SetBasicBlock(bodyBlock);
  200 + body->Emit();
  201 + if(!irgen.GetBasicBlock()->getTerminator())
  202 + {
  203 + llvm::BranchInst::Create(incBlock, irgen.GetBasicBlock());
  204 + }
  205 +
  206 + // step
  207 + irgen.SetBasicBlock(incBlock);
  208 + step->Emit();
  209 + if(!irgen.GetBasicBlock()->getTerminator())
  210 + {
  211 + llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock());
  212 + }
  213 +
  214 + irgen.SetBasicBlock(footBlock);
  215 + popScope();
  216 + return NULL;
  217 +}
174 218 //while statement
175 219  
176 220 //if statement
177 221  
178 222  
... ... @@ -178,16 +222,16 @@
178 222 llvm::LLVMContext * context = irgen.GetContext();
179 223 llvm::Function * func = irgen.GetFunction();
180 224 llvm::BasicBlock * elseBlock = NULL;
181   - llvm::BasicBlock * thenBlock = llvm::BasicBlock::Create(*context, "thenBlock", func);
182   - llvm::BasicBlock * footBlock = llvm::BasicBlock::Create(*context, "footBlock", func);
  225 + llvm::BasicBlock * thenBlock = llvm::BasicBlock::Create(context, "thenBlock", func);
  226 + llvm::BasicBlock * footBlock = llvm::BasicBlock::Create(context, "footBlock", func);
183 227 llvm::Value * val;
184   - llvm::Value * cond = test->Emit();
  228 + llvm::Value * condition = test->Emit();
185 229 if(elseBody)
186 230 {
187 231 elseBlock = llvm::BasicBlock::Create(*context, "elseBlock", func);
188 232 }
189 233  
190   - val = llvm::BranchInst::Create(thenBlock, elseBody ? elseBlock : footBlock, cond, irgen.GetBasicBlock());
  234 + val = llvm::BranchInst::Create(thenBlock, elseBody ? elseBlock : footBlock, condition, irgen.GetBasicBlock());
191 235 pushScope();
192 236 irgen.SetBasicBlock(thenBlock);
193 237 body->Emit();
194 238  
... ... @@ -228,10 +272,10 @@
228 272 llvm::LLVMContext * context = irgen.GetContext();
229 273 if (expr){
230 274 llvm::Value * retVal = expr->Emit();
231   - retVal = llvm::ReturnInst::Create(*context, retVal, irgen.GetBasicBlock());
  275 + retVal = llvm::ReturnInst::Create(context, retVal, irgen.GetBasicBlock());
232 276 return retVal;
233 277 }
234   - val = llvm::ReturnInst::Create(*context, irgen.GetBasicBlock());
  278 + val = llvm::ReturnInst::Create(context, irgen.GetBasicBlock());
235 279 return val;
236 280 }
237 281  
... ... @@ -52,7 +52,6 @@
52 52 StmtBlock(List<VarDecl*> *variableDeclarations, List<Stmt*> *statements);
53 53 const char *GetPrintNameForNode() { return "StmtBlock"; }
54 54 void PrintChildren(int indentLevel);
55   -
56 55 llvm::Value *Emit();
57 56 };
58 57  
... ... @@ -99,6 +98,7 @@
99 98 const char *GetPrintNameForNode() { return "ForStmt"; }
100 99 void PrintChildren(int indentLevel);
101 100  
  101 + llvm::Value *Emit();
102 102 };
103 103  
104 104 class WhileStmt : public LoopStmt