summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-09-11 07:03:20 +0000
committerChris Lattner <sabre@nondot.org>2009-09-11 07:03:20 +0000
commit19a9f42f20b10865385877bdb42619020dc95270 (patch)
tree696fdc71ed4442068b8c9838e8427a700987d0b1 /llvm/lib
parent446d589cad866950b524f8e999ca214ec6a91da2 (diff)
downloadbcm5719-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.cpp22
-rw-r--r--llvm/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h4
-rw-r--r--llvm/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp11
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());
OpenPOWER on IntegriCloud