diff options
| author | Chris Lattner <sabre@nondot.org> | 2009-09-11 07:03:20 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2009-09-11 07:03:20 +0000 |
| commit | 19a9f42f20b10865385877bdb42619020dc95270 (patch) | |
| tree | 696fdc71ed4442068b8c9838e8427a700987d0b1 /llvm/lib | |
| parent | 446d589cad866950b524f8e999ca214ec6a91da2 (diff) | |
| download | bcm5719-llvm-19a9f42f20b10865385877bdb42619020dc95270.tar.gz bcm5719-llvm-19a9f42f20b10865385877bdb42619020dc95270.zip | |
switch HiddenGVStubs to be a DenseMap instead of a string map, mirroring FnStubs and GVStubs.
llvm-svn: 81514
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp | 22 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp | 11 |
3 files changed, 28 insertions, 9 deletions
diff --git a/llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp b/llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp index 83ffdb89497..418e7d9d633 100644 --- a/llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp +++ b/llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp @@ -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 diff --git a/llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h b/llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h index 3545dce25f7..8c534f67c80 100644 --- a/llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h +++ b/llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h @@ -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; diff --git a/llvm/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp b/llvm/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp index 9f135fb37ae..3cdb83f6527 100644 --- a/llvm/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp +++ b/llvm/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp @@ -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()); |

