Compare View
Commits (3)
Diff
Showing 3 changed files Side-by-side Diff
ast_expr.cc
View file @
eefa7b6
... | ... | @@ -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 | + |
ast_stmt.cc
View file @
eefa7b6
... | ... | @@ -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(){ |
ast_stmt.h
View file @
eefa7b6