diff options
author | Chris Lattner <sabre@nondot.org> | 2009-09-11 05:58:44 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-09-11 05:58:44 +0000 |
commit | a49ea86ba234c6b738dda33ef608781a86bde1b9 (patch) | |
tree | 85dd11d374520604cfbe486d1b024f0a90a0d176 | |
parent | ceddb2b8565023b7d525f1bfd0afc5ba6e7f807f (diff) |
reimplement X86ATTAsmPrinter::GetGlobalAddressSymbol in terms of
Mangler::getNameWithPrefix. In addition to avoiding some over
quoting, this also is more efficient because it uses smallvector
instead of std::string thrashing.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81508 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/X86/AsmPrinter/X86MCInstLower.cpp | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp b/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp index 05f4540877..c25f2acc3a 100644 --- a/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp +++ b/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp @@ -44,15 +44,16 @@ MCSymbol *X86ATTAsmPrinter::GetPICBaseSymbol() { MCSymbol *X86ATTAsmPrinter::GetGlobalAddressSymbol(const MachineOperand &MO) { const GlobalValue *GV = MO.getGlobal(); - const char *Suffix = ""; - if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) - Suffix = "$stub"; - else if (MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY || - MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY_PIC_BASE || - MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE) - Suffix = "$non_lazy_ptr"; + bool isImplicitlyPrivate = false; + if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB || + MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY || + MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY_PIC_BASE || + MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE) + isImplicitlyPrivate = true; + + SmallString<128> Name; + Mang->getNameWithPrefix(Name, GV, isImplicitlyPrivate); - std::string Name = Mang->getMangledName(GV, Suffix, Suffix[0] != '\0'); if (Subtarget->isTargetCygMing()) DecorateCygMingName(Name, GV); @@ -62,19 +63,24 @@ MCSymbol *X86ATTAsmPrinter::GetGlobalAddressSymbol(const MachineOperand &MO) { case X86II::MO_GOT_ABSOLUTE_ADDRESS: // Doesn't modify symbol name. case X86II::MO_PIC_BASE_OFFSET: // Doesn't modify symbol name. break; - case X86II::MO_DLLIMPORT: + case X86II::MO_DLLIMPORT: { // Handle dllimport linkage. - Name = "__imp_" + Name; + const char *Prefix = "__imp_"; + Name.insert(Name.begin(), Prefix, Prefix+strlen(Prefix)); break; + } case X86II::MO_DARWIN_NONLAZY: case X86II::MO_DARWIN_NONLAZY_PIC_BASE: - GVStubs[Name] = Mang->getMangledName(GV); + Name += "$non_lazy_ptr"; + GVStubs[Name.str()] = StringRef(Name.data(), Name.size()-13); break; case X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE: - HiddenGVStubs[Name] = Mang->getMangledName(GV); + Name += "$non_lazy_ptr"; + HiddenGVStubs[Name.str()] = StringRef(Name.data(), Name.size()-13); break; case X86II::MO_DARWIN_STUB: - FnStubs[Name] = Mang->getMangledName(GV); + Name += "$stub"; + FnStubs[Name.str()] = StringRef(Name.data(), Name.size()-5); break; // FIXME: These probably should be a modifier on the symbol or something?? case X86II::MO_TLSGD: Name += "@TLSGD"; break; @@ -88,11 +94,11 @@ MCSymbol *X86ATTAsmPrinter::GetGlobalAddressSymbol(const MachineOperand &MO) { case X86II::MO_PLT: Name += "@PLT"; break; } - return OutContext.GetOrCreateSymbol(Name); + return OutContext.GetOrCreateSymbol(Name.str()); } MCSymbol *X86ATTAsmPrinter::GetExternalSymbolSymbol(const MachineOperand &MO) { - SmallString<256> Name; + SmallString<128> Name; Name += MAI->getGlobalPrefix(); Name += MO.getSymbolName(); |