# HG changeset patch # User ChristianK # Date 1216026435 -7200 # Node ID a7a26f538d6e749e8655817791061e3ac15da903 # Parent d920a244691b8e322957a21abd77393ad4f84619 [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) diff -r d920a244691b -r a7a26f538d6e dmd/statement.c --- 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; } diff -r d920a244691b -r a7a26f538d6e dmd/statement.h --- 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 }; diff -r d920a244691b -r a7a26f538d6e gen/llvmhelpers.cpp --- 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()); } /****************************************************************************************/ diff -r d920a244691b -r a7a26f538d6e gen/statements.cpp --- 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) diff -r d920a244691b -r a7a26f538d6e ir/irfunction.h --- 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 LabelToBBMap; + LabelToBBMap labelToBB; + // landing pads for try statements IRLandingPad landingPad;