reimplement X86ATTAsmPrinter::GetGlobalAddressSymbol in terms of
authorChris Lattner <sabre@nondot.org>
Fri, 11 Sep 2009 05:58:44 +0000 (05:58 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 11 Sep 2009 05:58:44 +0000 (05:58 +0000)
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

lib/Target/X86/AsmPrinter/X86MCInstLower.cpp

index 05f45408776ba57e09b8b93d951413aaa39c60ab..c25f2acc3a52161912c53b33f9781eb4d9c35882 100644 (file)
@@ -44,15 +44,16 @@ MCSymbol *X86ATTAsmPrinter::GetPICBaseSymbol() {
 MCSymbol *X86ATTAsmPrinter::GetGlobalAddressSymbol(const MachineOperand &MO) {
   const GlobalValue *GV = MO.getGlobal();
   
 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);
   
   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_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.
     // Handle dllimport linkage.
-    Name = "__imp_" + Name;
+    const char *Prefix = "__imp_";
+    Name.insert(Name.begin(), Prefix, Prefix+strlen(Prefix));
     break;
     break;
+  }
   case X86II::MO_DARWIN_NONLAZY:
   case X86II::MO_DARWIN_NONLAZY_PIC_BASE:
   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:
     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:
     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;
     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;
   }
   
   case X86II::MO_PLT:       Name += "@PLT";       break;
   }
   
-  return OutContext.GetOrCreateSymbol(Name);
+  return OutContext.GetOrCreateSymbol(Name.str());
 }
 
 MCSymbol *X86ATTAsmPrinter::GetExternalSymbolSymbol(const MachineOperand &MO) {
 }
 
 MCSymbol *X86ATTAsmPrinter::GetExternalSymbolSymbol(const MachineOperand &MO) {
-  SmallString<256> Name;
+  SmallString<128> Name;
   Name += MAI->getGlobalPrefix();
   Name += MO.getSymbolName();
   
   Name += MAI->getGlobalPrefix();
   Name += MO.getSymbolName();