Avoid unnecessary string construction during asm printing.
authorEvan Cheng <evan.cheng@apple.com>
Tue, 8 Jul 2008 00:55:58 +0000 (00:55 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Tue, 8 Jul 2008 00:55:58 +0000 (00:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53215 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/AsmPrinter.h
lib/CodeGen/AsmPrinter.cpp
lib/Target/X86/X86ATTAsmPrinter.cpp
lib/Target/X86/X86ATTAsmPrinter.h

index fbb0821c2172a49151e2c13adbfcf0d649f0c041..3514af7c81017b91a00159cba40849f0ba9684ba 100644 (file)
@@ -351,6 +351,7 @@ namespace llvm {
     /// printSuffixedName - This prints a name with preceding 
     /// getPrivateGlobalPrefix and the specified suffix, handling quoted names
     /// correctly.
+    void printSuffixedName(const char *Name, const char* Suffix);
     void printSuffixedName(std::string &Name, const char* Suffix);
 
   private:
index 35c36719807b720ea2ed5eb769bd37b10be38d1e..3f89792053b42185dc9ec68f7149a15cf43bfa26 100644 (file)
@@ -1377,7 +1377,7 @@ void AsmPrinter::printBasicBlockLabel(const MachineBasicBlock *MBB,
     O << ':';
   if (printComment && MBB->getBasicBlock())
     O << '\t' << TAI->getCommentString() << ' '
-      << MBB->getBasicBlock()->getName();
+      << MBB->getBasicBlock()->getNameStart();
 }
 
 /// printPICJumpTableSetLabel - This method prints a set label for the
@@ -1445,10 +1445,14 @@ void AsmPrinter::printDataDirective(const Type *type) {
   }
 }
 
-void AsmPrinter::printSuffixedName(std::string &Name, const char* Suffix) {
+void AsmPrinter::printSuffixedName(const char *Name, const char* Suffix) {
   if (Name[0]=='\"')
     O << '\"' << TAI->getPrivateGlobalPrefix() << 
-         Name.substr(1, Name.length()-2) << Suffix << '\"';
+         Name[1] << Suffix << '\"';
   else
     O << TAI->getPrivateGlobalPrefix() << Name << Suffix;
 }
+
+void AsmPrinter::printSuffixedName(std::string &Name, const char* Suffix) {
+  printSuffixedName(Name.c_str(), Suffix);
+}
index 6e83cbc5915a626d0d4790c5814d044ea60fd2a9..463016c2dd3494837f7519158d0f1fde5ac3585f 100644 (file)
@@ -974,6 +974,16 @@ void X86ATTAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
   EmitGlobalConstant(C);
 }
 
+/// printGVStub - Print stub for a global value.
+///
+void X86ATTAsmPrinter::printGVStub(const char *GV, const char *Prefix) {
+  if (Prefix) O << Prefix;
+  printSuffixedName(GV, "$non_lazy_ptr");
+  O << ":\n\t.indirect_symbol ";
+  if (Prefix) O << Prefix;
+  O << GV << "\n\t.long\t0\n";
+}
+
 
 bool X86ATTAsmPrinter::doFinalization(Module &M) {
   // Print out module-level global variables here.
@@ -1012,7 +1022,7 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) {
          i != e; ++i, ++j) {
       SwitchToDataSection("\t.section __IMPORT,__jump_table,symbol_stubs,"
                           "self_modifying_code+pure_instructions,5", 0);
-      std::string p = i->getKeyData();
+      const char *p = i->getKeyData();
       printSuffixedName(p, "$stub");
       O << ":\n"
            "\t.indirect_symbol " << p << "\n"
@@ -1021,28 +1031,32 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) {
 
     O << '\n';
 
+    // Print global value stubs.
+    bool InStubSection = false;
     if (TAI->doesSupportExceptionHandling() && MMI && !Subtarget->is64Bit()) {
       // Add the (possibly multiple) personalities to the set of global values.
       // Only referenced functions get into the Personalities list.
       const std::vector<Function *>& Personalities = MMI->getPersonalities();
-
       for (std::vector<Function *>::const_iterator I = Personalities.begin(),
-             E = Personalities.end(); I != E; ++I)
-        if (*I) GVStubs.insert('_' + (*I)->getName());
+             E = Personalities.end(); I != E; ++I) {
+        if (!*I)
+          continue;
+        if (!InStubSection) {
+          SwitchToDataSection(
+                     "\t.section __IMPORT,__pointers,non_lazy_symbol_pointers");
+          InStubSection = true;
+        }
+        printGVStub((*I)->getNameStart(), "_");
+      }
     }
 
     // Output stubs for external and common global variables.
-    if (!GVStubs.empty())
+    if (!InStubSection && !GVStubs.empty())
       SwitchToDataSection(
                     "\t.section __IMPORT,__pointers,non_lazy_symbol_pointers");
     for (StringSet<>::iterator i = GVStubs.begin(), e = GVStubs.end();
-         i != e; ++i) {
-      std::string p = i->getKeyData();
-      printSuffixedName(p, "$non_lazy_ptr");
-      O << ":\n"
-           "\t.indirect_symbol " << p << "\n"
-           "\t.long\t0\n";
-    }
+         i != e; ++i)
+      printGVStub(i->getKeyData());
 
     // Emit final debug information.
     DW.EndModule();
index 4f17a12b10b1a59e34cd61923b8aa570ebc6b947..f9479fd41d47563107384c1df3829dd11f4a2425 100644 (file)
@@ -120,6 +120,8 @@ struct VISIBILITY_HIDDEN X86ATTAsmPrinter : public AsmPrinter {
   void printPICLabel(const MachineInstr *MI, unsigned Op);
   void printModuleLevelGV(const GlobalVariable* GVar);
 
+  void printGVStub(const char *GV, const char *Prefix = NULL);
+
   bool runOnMachineFunction(MachineFunction &F);
 
   /// getSectionForFunction - Return the section that we should emit the