From 7e7ac3a6f7bcdacbe912d9267f25b86755982dfc Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 14 Jul 2008 11:07:15 +0200 Subject: [PATCH] [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) --- dmd/statement.c | 1 - dmd/statement.h | 1 - gen/llvmhelpers.cpp | 9 ++++++--- gen/statements.cpp | 16 ++++++++++------ ir/irfunction.h | 4 ++++ 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/dmd/statement.c b/dmd/statement.c index 1a46907a..0f08a134 100644 --- a/dmd/statement.c +++ b/dmd/statement.c @@ -3883,7 +3883,6 @@ LabelStatement::LabelStatement(Loc loc, Identifier *ident, Statement *statement) this->enclosinghandler = NULL; this->lblock = NULL; this->isReturnLabel = 0; - this->llvmBB = NULL; this->asmLabel = false; } diff --git a/dmd/statement.h b/dmd/statement.h index ab1d0043..f04baf91 100644 --- a/dmd/statement.h +++ b/dmd/statement.h @@ -871,7 +871,6 @@ struct LabelStatement : Statement void toIR(IRState *irs); // LLVMDC - llvm::BasicBlock* llvmBB; bool asmLabel; // for labels inside inline assembler }; diff --git a/gen/llvmhelpers.cpp b/gen/llvmhelpers.cpp index f47e0232..564abdc1 100644 --- a/gen/llvmhelpers.cpp +++ b/gen/llvmhelpers.cpp @@ -186,8 +186,11 @@ void DtoGoto(Loc* loc, Identifier* target, EnclosingHandler* enclosinghandler) 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 @@ void DtoGoto(Loc* loc, Identifier* target, EnclosingHandler* enclosinghandler) // 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 --git a/gen/statements.cpp b/gen/statements.cpp index f971c046..56e30415 100644 --- a/gen/statements.cpp +++ b/gen/statements.cpp @@ -1033,16 +1033,20 @@ void LabelStatement::toIR(IRState* p) } 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 --git a/ir/irfunction.h b/ir/irfunction.h index 31cb20e8..ac98ad97 100644 --- a/ir/irfunction.h +++ b/ir/irfunction.h @@ -26,6 +26,10 @@ struct IrFunction : IrBase llvm::AllocaInst* srcfileArg; llvm::AllocaInst* msgArg; + // label to basic block lookup + typedef std::map LabelToBBMap; + LabelToBBMap labelToBB; + // landing pads for try statements IRLandingPad landingPad;