From 77c8f7674db1a3c57fa9d8916957a01f9961ef9c Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Tue, 8 Jul 2008 00:55:58 +0000 Subject: [PATCH] Avoid unnecessary string construction during asm printing. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53215 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/AsmPrinter.h | 1 + lib/CodeGen/AsmPrinter.cpp | 10 +++++--- lib/Target/X86/X86ATTAsmPrinter.cpp | 38 ++++++++++++++++++++--------- lib/Target/X86/X86ATTAsmPrinter.h | 2 ++ 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index fbb0821c217..3514af7c810 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -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: diff --git a/lib/CodeGen/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp index 35c36719807..3f89792053b 100644 --- a/lib/CodeGen/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter.cpp @@ -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); +} diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp index 6e83cbc5915..463016c2dd3 100644 --- a/lib/Target/X86/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/X86ATTAsmPrinter.cpp @@ -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& Personalities = MMI->getPersonalities(); - for (std::vector::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(); diff --git a/lib/Target/X86/X86ATTAsmPrinter.h b/lib/Target/X86/X86ATTAsmPrinter.h index 4f17a12b10b..f9479fd41d4 100644 --- a/lib/Target/X86/X86ATTAsmPrinter.h +++ b/lib/Target/X86/X86ATTAsmPrinter.h @@ -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