Compare View

switch
from
...
to
 
Commits (3)

Diff

Showing 3 changed files Side-by-side Diff

... ... @@ -168,11 +168,15 @@ llvm::Value* CompoundExpr::Emit() {
168 168 llvm::Value* l = l ? left->Emit() : NULL;
169 169 llvm::Value* r = r ? right->Emit() : NULL;
170 170 llvm::BasicBlock* b = irgen.GetBasicBlock();
171   - if(!l) { // TODO : Implement
  171 + //austins additional value
  172 + llvm::Value *val;
  173 + if(!l) {
172 174 if(op->getToken() == "++")
173   - return NULL;
  175 + val = llvm::ConstantInt::get(irgen.GetIntType(), 1);
  176 + return llvm::BinaryOperator::CreateAdd(l, val, "", irgen.GetBasicBlock());
174 177 if(op->getToken() == "--")
175   - return NULL;
  178 + val = llvm::ConstantInt::get(irgen.GetIntType(), 1);
  179 + return llvm::BinaryOperator::CreateSub(l, val, "", irgen.GetBasicBlock());
176 180 }
177 181 if(l->getType()->isFPOrFPVectorTy()) {
178 182 if(op->getToken() == "+")
... ... @@ -226,3 +230,4 @@ llvm::Value* CompoundExpr::Emit() {
226 230 }
227 231 return NULL;
228 232 }
  233 +
... ... @@ -181,7 +181,6 @@ llvm::Value * ForStmt::Emit()
181 181 llvm::BasicBlock * bodyBlock = llvm::BasicBlock::Create(*context, "bodyBlock", func);
182 182 llvm::Value * condition;
183 183  
184   -
185 184 // init and branch to head
186 185 init->Emit();
187 186  
... ... @@ -216,6 +215,37 @@ llvm::Value * ForStmt::Emit()
216 215 return NULL;
217 216 }
218 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;
  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 +
219 249  
220 250 //if statement
221 251 llvm::Value * IfStmt::Emit(){
... ... @@ -259,11 +289,19 @@ llvm::Value * IfStmt::Emit(){
259 289 }
260 290  
261 291 llvm::Value * BreakStmt::Emit(){
262   - 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());
263 297 }
264 298  
265 299 llvm::Value * ContinueStmt::Emit(){
266   - 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());
267 305 }
268 306  
269 307 //Not sure
... ... @@ -280,7 +318,22 @@ llvm::Value * ReturnStmt::Emit(){
280 318 }
281 319  
282 320 llvm::Value * SwitchStmt::Emit(){
283   - return NULL;
  321 + llvm::Value * val;
  322 + llvm::LLVMContext * context = irgen.GetContext();
  323 + llvm::Function * func = irgen.GetFunction();
  324 + //find all cases and create a basic block for all of them
  325 + for (int i = 0; i < cases->NumElements(); i++){
  326 + //cases->Nth(i)->Emit();
  327 +
  328 + //llvm::BasicBlock * headBlock = llvm::BasicBlock::Create(*context, "headBlock", func);
  329 + }
  330 + //Emit of expression
  331 + llvm::Value * exprVal=expr->Emit();
  332 +
  333 + //create switch instruction
  334 + //val=llvm::SwitchInst::Create(Value *Value, BasicBlock *Default, unsigned NumCases, BasicBlock *InsertAtEnd);
  335 + //for each case 'addCase to switch stmt', EMIT for stmt in case, create terminator instruction
  336 +
284 337 }
285 338  
286 339 llvm::Value * SwitchLabel::Emit(){
... ... @@ -108,6 +108,7 @@ class WhileStmt : public LoopStmt
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