mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-10 02:36:06 +00:00
Avoid unnecessary string construction during asm printing.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53215 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
82eec45b00
commit
77c8f7674d
@ -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:
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user