From d85267ef5ad69423fb72ee2c955f207cf477140e Mon Sep 17 00:00:00 2001 From: Tomas Lindquist Olsen Date: Sat, 14 Jun 2008 06:13:35 +0200 Subject: [PATCH] [svn r284] Fixed some problems with cases, code is not as pretty, but it doesn't crash llvm! --- gen/statements.cpp | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/gen/statements.cpp b/gen/statements.cpp index 3ade3951..88eab17e 100644 --- a/gen/statements.cpp +++ b/gen/statements.cpp @@ -651,6 +651,14 @@ void SwitchStatement::toIR(IRState* p) llvm::BasicBlock* oldend = gIR->scopeend(); + // clear data from previous passes... :/ + for (int i=0; idim; ++i) + { + CaseStatement* cs = (CaseStatement*)cases->data[i]; + cs->bodyBB = NULL; + cs->llvmIdx = NULL; + } + // string switch? llvm::GlobalVariable* switchTable = 0; Array caseArray; @@ -752,17 +760,15 @@ void CaseStatement::toIR(IRState* p) Logger::println("CaseStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; - if (!bodyBB) + llvm::BasicBlock* nbb = llvm::BasicBlock::Create("case", p->topfunc(), p->scopeend()); + + if (bodyBB && !bodyBB->getTerminator()) { - bodyBB = llvm::BasicBlock::Create("case", p->topfunc(), p->scopeend()); - } - else - { - bodyBB->moveAfter(p->scopebb()); + llvm::BranchInst::Create(nbb, bodyBB); } + bodyBB = nbb; if (exp->type->isintegral()) { - assert(!llvmIdx); LLConstant* c = exp->toConstElem(p); llvmIdx = isaConstantInt(c); } @@ -787,7 +793,13 @@ void DefaultStatement::toIR(IRState* p) assert(bodyBB); - bodyBB->moveAfter(p->scopebb()); + llvm::BasicBlock* nbb = llvm::BasicBlock::Create("default", p->topfunc(), p->scopeend()); + + if (!bodyBB->getTerminator()) + { + llvm::BranchInst::Create(nbb, bodyBB); + } + bodyBB = nbb; if (!p->scopereturned()) llvm::BranchInst::Create(bodyBB, p->scopebb()); @@ -1088,7 +1100,7 @@ void GotoCaseStatement::toIR(IRState* p) assert(!p->scopereturned()); if (!cs->bodyBB) { - cs->bodyBB = llvm::BasicBlock::Create("case", p->topfunc(), p->scopeend()); + cs->bodyBB = llvm::BasicBlock::Create("goto_case", p->topfunc(), p->scopeend()); } emit_finallyblocks(p, enclosingtryfinally, sw->enclosingtryfinally);