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;