Mercurial > projects > ldc
comparison gen/statements.c @ 78:2332006e1fa4 trunk
[svn r82] Fixed: Fall-through switch cases were broken.
author | lindquist |
---|---|
date | Wed, 31 Oct 2007 20:50:21 +0100 |
parents | b706170e24a9 |
children | 875617f89c51 |
comparison
equal
deleted
inserted
replaced
77:714057ff2dbb | 78:2332006e1fa4 |
---|---|
253 LOG_SCOPE; | 253 LOG_SCOPE; |
254 | 254 |
255 // create while blocks | 255 // create while blocks |
256 llvm::BasicBlock* oldend = gIR->scopeend(); | 256 llvm::BasicBlock* oldend = gIR->scopeend(); |
257 llvm::BasicBlock* whilebb = new llvm::BasicBlock("whilecond", gIR->topfunc(), oldend); | 257 llvm::BasicBlock* whilebb = new llvm::BasicBlock("whilecond", gIR->topfunc(), oldend); |
258 llvm::BasicBlock* whilebodybb = new llvm::BasicBlock("whilebody", gIR->topfunc(), oldend); | |
258 llvm::BasicBlock* endbb = new llvm::BasicBlock("endwhile", gIR->topfunc(), oldend); | 259 llvm::BasicBlock* endbb = new llvm::BasicBlock("endwhile", gIR->topfunc(), oldend); |
259 | 260 |
260 // move into the while block | 261 // move into the while block |
261 p->ir->CreateBr(whilebb); | 262 p->ir->CreateBr(whilebb); |
262 //new llvm::BranchInst(whilebb, gIR->scopebegin()); | 263 //new llvm::BranchInst(whilebb, gIR->scopebegin()); |
267 // create the condition | 268 // create the condition |
268 elem* cond_e = condition->toElem(p); | 269 elem* cond_e = condition->toElem(p); |
269 llvm::Value* cond_val = LLVM_DtoBoolean(cond_e->getValue()); | 270 llvm::Value* cond_val = LLVM_DtoBoolean(cond_e->getValue()); |
270 delete cond_e; | 271 delete cond_e; |
271 | 272 |
272 // while body block | |
273 llvm::BasicBlock* whilebodybb = new llvm::BasicBlock("whilebody", gIR->topfunc(), endbb); | |
274 | |
275 // conditional branch | 273 // conditional branch |
276 llvm::Value* ifbreak = new llvm::BranchInst(whilebodybb, endbb, cond_val, whilebb); | 274 llvm::Value* ifbreak = new llvm::BranchInst(whilebodybb, endbb, cond_val, p->scopebb()); |
277 | 275 |
278 // rewrite scope | 276 // rewrite scope |
279 gIR->scope() = IRScope(whilebodybb,endbb); | 277 gIR->scope() = IRScope(whilebodybb,endbb); |
280 | 278 |
281 // do while body code | 279 // do while body code |
578 p->loopbbs.push_back(IRScope(p->scopebb(),endbb)); | 576 p->loopbbs.push_back(IRScope(p->scopebb(),endbb)); |
579 static_cast<CaseStatement*>(cases->data[i])->statement->toIR(p); | 577 static_cast<CaseStatement*>(cases->data[i])->statement->toIR(p); |
580 p->loopbbs.pop_back(); | 578 p->loopbbs.pop_back(); |
581 | 579 |
582 llvm::BasicBlock* curbb = p->scopebb(); | 580 llvm::BasicBlock* curbb = p->scopebb(); |
583 if (!curbb->empty() && !curbb->back().isTerminator()) | 581 if (curbb->empty() || !curbb->back().isTerminator()) |
584 { | 582 { |
585 new llvm::BranchInst(nextbb, curbb); | 583 new llvm::BranchInst(nextbb, curbb); |
586 } | 584 } |
587 } | 585 } |
588 | 586 |
589 // default statement | 587 // default statement |
590 if (defbb) | 588 if (defbb) |
591 { | 589 { |
592 p->scope() = IRScope(defbb,endbb); | 590 p->scope() = IRScope(defbb,endbb); |
593 p->loopbbs.push_back(IRScope(defbb,endbb)); | 591 p->loopbbs.push_back(IRScope(defbb,endbb)); |
592 Logger::println("doing default statement"); | |
594 sdefault->statement->toIR(p); | 593 sdefault->statement->toIR(p); |
595 p->loopbbs.pop_back(); | 594 p->loopbbs.pop_back(); |
596 | 595 |
597 llvm::BasicBlock* curbb = p->scopebb(); | 596 llvm::BasicBlock* curbb = p->scopebb(); |
598 if (!curbb->empty() && !curbb->back().isTerminator()) | 597 if (curbb->empty() || !curbb->back().isTerminator()) |
599 { | 598 { |
600 new llvm::BranchInst(endbb, curbb); | 599 new llvm::BranchInst(endbb, curbb); |
601 } | 600 } |
602 } | 601 } |
603 | 602 |