fix AsmPrinter::GetBlockAddressSymbol to always return a unique
authorChris Lattner <sabre@nondot.org>
Sun, 14 Mar 2010 17:53:23 +0000 (17:53 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 14 Mar 2010 17:53:23 +0000 (17:53 +0000)
label instead of trying to form one based on the BB name (which
causes collisions if the name is empty).  This fixes PR6608

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98495 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/AsmPrinter.h
include/llvm/CodeGen/MachineModuleInfo.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/CodeGen/MachineModuleInfo.cpp
lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
test/CodeGen/ARM/indirectbr.ll
test/CodeGen/PowerPC/indirectbr.ll
test/CodeGen/XCore/indirectbr.ll

index a909bd6d9d440df7437e4ae96b60b688f0c86005..a36105f93c19205fd8e8b880f267473439a700e9 100644 (file)
@@ -337,8 +337,7 @@ namespace llvm {
     /// GetBlockAddressSymbol - Return the MCSymbol used to satisfy BlockAddress
     /// uses of the specified basic block.
     MCSymbol *GetBlockAddressSymbol(const BlockAddress *BA) const;
-    MCSymbol *GetBlockAddressSymbol(const Function *F,
-                                    const BasicBlock *BB) const;
+    MCSymbol *GetBlockAddressSymbol(const BasicBlock *BB) const;
 
     /// EmitBasicBlockStart - This method prints the label for the specified
     /// MachineBasicBlock, an alignment (if present) and a comment describing
index 30f99db85b2ff8ca0aa8db4454934e9fb6ebf060..2b813cc9d3a9af7081ef331afda5e12af41c4678 100644 (file)
@@ -139,6 +139,11 @@ class MachineModuleInfo : public ImmutablePass {
   /// llvm.compiler.used.
   SmallPtrSet<const Function *, 32> UsedFunctions;
 
+  
+  /// AddrLabelSymbols - This map keeps track of which symbol is being used for
+  /// the specified basic block's address of label.
+  DenseMap<AssertingVH<BasicBlock>, MCSymbol*> AddrLabelSymbols;
+  
   bool CallsEHReturn;
   bool CallsUnwindInit;
  
@@ -203,6 +208,11 @@ public:
   /// handling comsumers.
   std::vector<MachineMove> &getFrameMoves() { return FrameMoves; }
   
+  /// getAddrLabelSymbol - Return the symbol to be used for the specified basic
+  /// block when its address is taken.  This cannot be its normal LBB label
+  /// because the block may be accessed outside its containing function.
+  MCSymbol *getAddrLabelSymbol(const BasicBlock *BB);
+  
   //===- EH ---------------------------------------------------------------===//
 
   /// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the
index f20560088232c49752f070c408c3a9d538d0e8e0..6d5adb66b7f8a269866a2d935b6d279b6456331d 100644 (file)
@@ -1580,28 +1580,11 @@ bool AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
 }
 
 MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BlockAddress *BA) const {
-  return GetBlockAddressSymbol(BA->getFunction(), BA->getBasicBlock());
+  return MMI->getAddrLabelSymbol(BA->getBasicBlock());
 }
 
-MCSymbol *AsmPrinter::GetBlockAddressSymbol(const Function *F,
-                                            const BasicBlock *BB) const {
-  assert(BB->hasName() &&
-         "Address of anonymous basic block not supported yet!");
-
-  // This code must use the function name itself, and not the function number,
-  // since it must be possible to generate the label name from within other
-  // functions.
-  SmallString<60> FnName;
-  Mang->getNameWithPrefix(FnName, F, false);
-
-  // FIXME: THIS IS BROKEN IF THE LLVM BASIC BLOCK DOESN'T HAVE A NAME!
-  SmallString<60> NameResult;
-  Mang->getNameWithPrefix(NameResult,
-                          StringRef("BA") + Twine((unsigned)FnName.size()) + 
-                          "_" + FnName.str() + "_" + BB->getName(), 
-                          Mangler::Private);
-
-  return OutContext.GetOrCreateTemporarySymbol(NameResult.str());
+MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BasicBlock *BB) const {
+  return MMI->getAddrLabelSymbol(BB);
 }
 
 /// GetCPISymbol - Return the symbol for the specified constant pool entry.
@@ -1730,7 +1713,7 @@ void AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock *MBB) const {
     const BasicBlock *BB = MBB->getBasicBlock();
     if (VerboseAsm)
       OutStreamer.AddComment("Address Taken");
-    OutStreamer.EmitLabel(GetBlockAddressSymbol(BB->getParent(), BB));
+    OutStreamer.EmitLabel(GetBlockAddressSymbol(BB));
   }
 
   // Print the main label for the block.
index fdbda8f715fa6f1b6f2aef14c2fad2905eb30cca..a23cc1a8771a5aa5691dcc95c052f98901cc1936 100644 (file)
@@ -104,6 +104,18 @@ void MachineModuleInfo::AnalyzeModule(Module &M) {
       UsedFunctions.insert(F);
 }
 
+/// getAddrLabelSymbol - Return the symbol to be used for the specified basic
+/// block when its address is taken.  This cannot be its normal LBB label
+/// because the block may be accessed outside its containing function.
+MCSymbol *MachineModuleInfo::getAddrLabelSymbol(const BasicBlock *BB) {
+  assert(BB->hasAddressTaken() &&
+         "Shouldn't get label for block without address taken");
+  MCSymbol *&Entry = AddrLabelSymbols[const_cast<BasicBlock*>(BB)];
+  if (Entry) return Entry;
+  return Entry = Context.CreateTempSymbol();
+}
+
+
 //===-EH-------------------------------------------------------------------===//
 
 /// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the
index ac71af5a78c6d6d3f82e8c1b666f74c6c5ce63c8..d91d8bdeceba5da5882d1db4b80fb5fe34c52a64 100644 (file)
@@ -2035,6 +2035,8 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
   case ISD::EntryToken:       // These nodes remain the same.
   case ISD::BasicBlock:
   case ISD::Register:
+  //case ISD::VALUETYPE:
+  //case ISD::CONDCODE:
   case ISD::HANDLENODE:
   case ISD::TargetConstant:
   case ISD::TargetConstantFP:
index f05033773bb5cb853bfc3d479cb8a14701e686a3..f898060581a95405410472feda70c403072e847b 100644 (file)
@@ -59,6 +59,6 @@ L1:                                               ; preds = %L2, %bb2
   store i8* blockaddress(@foo, %L5), i8** @nextaddr, align 4
   ret i32 %res.3
 }
-; ARM: .long L_BA4__foo_L5-(LPC{{.*}}+8)
-; THUMB: .long L_BA4__foo_L5-(LPC{{.*}}+4)
-; THUMB2: .long L_BA4__foo_L5
+; ARM: .long Ltmp0-(LPC{{.*}}+8)
+; THUMB: .long Ltmp0-(LPC{{.*}}+4)
+; THUMB2: .long Ltmp0
index 233d923695afd794e81a54b1bd1201f1db2191e3..9b76ecc43db9d2c055a667234f1a34eeee8ec9ce 100644 (file)
@@ -43,12 +43,12 @@ L2:                                               ; preds = %L3, %bb2
 
 L1:                                               ; preds = %L2, %bb2
   %res.3 = phi i32 [ %phitmp, %L2 ], [ 2, %bb2 ]  ; <i32> [#uses=1]
-; PIC: addis r4, r4, ha16(L_BA4__foo_L5-"L1$pb")
-; PIC: li r6, lo16(L_BA4__foo_L5-"L1$pb")
+; PIC: addis r4, r4, ha16(Ltmp0-"L1$pb")
+; PIC: li r6, lo16(Ltmp0-"L1$pb")
 ; PIC: add r4, r4, r6
 ; PIC: stw r4
-; STATIC: li r5, lo16(L_BA4__foo_L5)
-; STATIC: addis r5, r5, ha16(L_BA4__foo_L5)
+; STATIC: li r5, lo16(Ltmp0)
+; STATIC: addis r5, r5, ha16(Ltmp0)
 ; STATIC: stw r5
   store i8* blockaddress(@foo, %L5), i8** @nextaddr, align 4
   ret i32 %res.3
index a8f00cc497fcae96e08c606a3c150204d63abf78..92690029cd0e6f6e5c8c83d3b852011133f932bf 100644 (file)
@@ -38,7 +38,7 @@ L2:                                               ; preds = %L3, %bb2
 
 L1:                                               ; preds = %L2, %bb2
   %res.3 = phi i32 [ %phitmp, %L2 ], [ 2, %bb2 ]  ; <i32> [#uses=1]
-; CHECK: ldap r11, .LBA3_foo_L5
+; CHECK: ldap r11, .Ltmp0
 ; CHECK: stw r11, dp[nextaddr]
   store i8* blockaddress(@foo, %L5), i8** @nextaddr, align 4
   ret i32 %res.3