Mercurial > projects > ldc
changeset 353:a7a26f538d6e trunk
[svn r374] Move label target basic block from AST to IRFunction. This is a first step to allowing labels to be emitted multiple times. (for instance within finally blocks)
author | ChristianK |
---|---|
date | Mon, 14 Jul 2008 11:07:15 +0200 |
parents | d920a244691b |
children | ac654d4cb935 |
files | dmd/statement.c dmd/statement.h gen/llvmhelpers.cpp gen/statements.cpp ir/irfunction.h |
diffstat | 5 files changed, 20 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/dmd/statement.c Mon Jul 14 10:01:09 2008 +0200 +++ b/dmd/statement.c Mon Jul 14 11:07:15 2008 +0200 @@ -3883,7 +3883,6 @@ this->enclosinghandler = NULL; this->lblock = NULL; this->isReturnLabel = 0; - this->llvmBB = NULL; this->asmLabel = false; }
--- a/dmd/statement.h Mon Jul 14 10:01:09 2008 +0200 +++ b/dmd/statement.h Mon Jul 14 11:07:15 2008 +0200 @@ -871,7 +871,6 @@ void toIR(IRState *irs); // LLVMDC - llvm::BasicBlock* llvmBB; bool asmLabel; // for labels inside inline assembler };
--- a/gen/llvmhelpers.cpp Mon Jul 14 10:01:09 2008 +0200 +++ b/gen/llvmhelpers.cpp Mon Jul 14 11:07:15 2008 +0200 @@ -186,8 +186,11 @@ if(lblstmt->asmLabel) error("cannot goto into inline asm block", loc->toChars()); - if (lblstmt->llvmBB == NULL) - lblstmt->llvmBB = llvm::BasicBlock::Create("label", gIR->topfunc()); + // find target basic block + std::string labelname = target->toChars(); + llvm::BasicBlock*& targetBB = gIR->func()->labelToBB[labelname]; + if (targetBB == NULL) + targetBB = llvm::BasicBlock::Create("label", gIR->topfunc()); // find finallys between goto and label EnclosingHandler* endfinally = enclosinghandler; @@ -202,7 +205,7 @@ // emit code for finallys between goto and label DtoEnclosingHandlers(enclosinghandler, endfinally); - llvm::BranchInst::Create(lblstmt->llvmBB, gIR->scopebb()); + llvm::BranchInst::Create(targetBB, gIR->scopebb()); } /****************************************************************************************/
--- a/gen/statements.cpp Mon Jul 14 10:01:09 2008 +0200 +++ b/gen/statements.cpp Mon Jul 14 11:07:15 2008 +0200 @@ -1033,16 +1033,20 @@ } else { + std::string labelname = ident->toChars(); + llvm::BasicBlock*& labelBB = p->func()->labelToBB[labelname]; + llvm::BasicBlock* oldend = gIR->scopeend(); - if (llvmBB) - llvmBB->moveBefore(oldend); - else - llvmBB = llvm::BasicBlock::Create("label", p->topfunc(), oldend); + if (labelBB != NULL) { + labelBB->moveBefore(oldend); + } else { + labelBB = llvm::BasicBlock::Create("label", p->topfunc(), oldend); + } if (!p->scopereturned()) - llvm::BranchInst::Create(llvmBB, p->scopebb()); + llvm::BranchInst::Create(labelBB, p->scopebb()); - p->scope() = IRScope(llvmBB,oldend); + p->scope() = IRScope(labelBB,oldend); } if (statement)
--- a/ir/irfunction.h Mon Jul 14 10:01:09 2008 +0200 +++ b/ir/irfunction.h Mon Jul 14 11:07:15 2008 +0200 @@ -26,6 +26,10 @@ llvm::AllocaInst* srcfileArg; llvm::AllocaInst* msgArg; + // label to basic block lookup + typedef std::map<std::string, llvm::BasicBlock*> LabelToBBMap; + LabelToBBMap labelToBB; + // landing pads for try statements IRLandingPad landingPad;