switch HiddenGVStubs to be a DenseMap instead of a string map, mirroring FnStubs...
authorChris Lattner <sabre@nondot.org>
Fri, 11 Sep 2009 07:03:20 +0000 (07:03 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 11 Sep 2009 07:03:20 +0000 (07:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81514 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h
lib/Target/X86/AsmPrinter/X86MCInstLower.cpp

index 83ffdb894976718959eed02bd85f694f8e78603a..418e7d9d633fda0f14e40cb6f99634e70d260fc2 100644 (file)
@@ -330,7 +330,16 @@ void X86ATTAsmPrinter::printSymbolOperand(const MachineOperand &MO) {
         StubSym = OutContext.GetOrCreateSymbol(NameStr.str());
       }
     } else if (MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE){
-      HiddenGVStubs[Name] = Mang->getMangledName(GV);
+      SmallString<128> NameStr;
+      Mang->getNameWithPrefix(NameStr, GV, true);
+      NameStr += "$non_lazy_ptr";
+      MCSymbol *Sym = OutContext.GetOrCreateSymbol(NameStr.str());
+      MCSymbol *&StubSym = HiddenGVStubs[Sym];
+      if (StubSym == 0) {
+        NameStr.clear();
+        Mang->getNameWithPrefix(NameStr, GV, false);
+        StubSym = OutContext.GetOrCreateSymbol(NameStr.str());
+      }
     } else if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) {
       SmallString<128> NameStr;
       Mang->getNameWithPrefix(NameStr, GV, true);
@@ -949,10 +958,13 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) {
     if (!HiddenGVStubs.empty()) {
       OutStreamer.SwitchSection(getObjFileLowering().getDataSection());
       EmitAlignment(2);
-      for (StringMap<std::string>::iterator I = HiddenGVStubs.begin(),
-           E = HiddenGVStubs.end(); I != E; ++I)
-        O << I->getKeyData() << ":\n" << MAI->getData32bitsDirective()
-          << I->second << '\n';
+      for (DenseMap<MCSymbol*, MCSymbol*>::iterator I = HiddenGVStubs.begin(),
+           E = HiddenGVStubs.end(); I != E; ++I) {
+        I->first->print(O, MAI);
+        O << ":\n" << MAI->getData32bitsDirective();
+        I->second->print(O, MAI);
+        O << '\n';
+      }
     }
 
     // Funny Darwin hack: This flag tells the linker that no global symbols
index 3545dce25f7035a72e493743f9de2601dc4ffe5e..8c534f67c804981287f16668587d38a4768f3290 100644 (file)
@@ -215,10 +215,10 @@ class VISIBILITY_HIDDEN X86ATTAsmPrinter : public AsmPrinter {
 
   void emitFunctionHeader(const MachineFunction &MF);
 
-  // Necessary for Darwin to print out the apprioriate types of linker stubs
-  StringMap<std::string> HiddenGVStubs;
+  // Necessary for Darwin to print out the appropriate types of linker stubs.
   DenseMap<MCSymbol*, MCSymbol*> FnStubs;  // Darwin $stub stubs.
   DenseMap<MCSymbol*, MCSymbol*> GVStubs;  // Darwin $non_lazy_ptr stub.
+  DenseMap<MCSymbol*, MCSymbol*> HiddenGVStubs;  // Darwin $non_lazy_ptr stub.
 
   // Necessary for dllexport support
   StringSet<> CygMingStubs, DLLExportedFns, DLLExportedGVs;
index 9f135fb37ae6d0ebd85e8d53b3a40e47c5370c3f..3cdb83f6527add61efea90ef9e2fbafd2452fdb3 100644 (file)
@@ -82,10 +82,17 @@ MCSymbol *X86ATTAsmPrinter::GetGlobalAddressSymbol(const MachineOperand &MO) {
     return Sym;
     
   }
-  case X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE:
+  case X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE: {
     Name += "$non_lazy_ptr";
-    HiddenGVStubs[Name.str()] = StringRef(Name.data(), Name.size()-13);
+    MCSymbol *Sym = OutContext.GetOrCreateSymbol(Name.str());
+    MCSymbol *&StubSym = HiddenGVStubs[Sym];
+    if (StubSym == 0) {
+      Name.clear();
+      Mang->getNameWithPrefix(Name, GV, false);
+      StubSym = OutContext.GetOrCreateSymbol(Name.str());
+    }
     break;
+  }
   case X86II::MO_DARWIN_STUB: {
     Name += "$stub";
     MCSymbol *Sym = OutContext.GetOrCreateSymbol(Name.str());