From c215b3ef5d9627f5fb6fe9034e46bc29ae592916 Mon Sep 17 00:00:00 2001 From: Dale Johannesen Date: Mon, 19 May 2008 21:38:18 +0000 Subject: [PATCH] Handle quoted names when constructing $stub's, $non_lazy_ptr's and $lazy_ptr's. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51277 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/AsmPrinter.h | 5 +++ lib/CodeGen/AsmPrinter.cpp | 7 ++++ lib/Target/ARM/ARMAsmPrinter.cpp | 41 +++++++++++++-------- lib/Target/PowerPC/PPCAsmPrinter.cpp | 53 ++++++++++++++++++---------- lib/Target/X86/X86ATTAsmPrinter.cpp | 6 ++-- lib/Target/X86/X86AsmPrinter.cpp | 12 ++++--- 6 files changed, 85 insertions(+), 39 deletions(-) diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index ddd91620b21..dd42ce141a3 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -348,6 +348,11 @@ namespace llvm { /// specified type. void printDataDirective(const Type *type); + /// printSuffixedName - This prints a name with preceding + /// getPrivateGlobalPrefix and the specified suffix, handling quoted names + /// correctly. + void printSuffixedName(std::string &Name, const char* Suffix); + private: void EmitLLVMUsedList(Constant *List); void EmitXXStructorList(Constant *List); diff --git a/lib/CodeGen/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp index 9c4e789251a..d225dbce9fe 100644 --- a/lib/CodeGen/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter.cpp @@ -1435,3 +1435,10 @@ void AsmPrinter::printDataDirective(const Type *type) { } } +void AsmPrinter::printSuffixedName(std::string &Name, const char* Suffix) { + if (Name[0]=='\"') + O << "\"" << TAI->getPrivateGlobalPrefix() << + Name.substr(1, Name.length()-2) << Suffix << "\""; + else + O << TAI->getPrivateGlobalPrefix() << Name << Suffix; +} diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp index ed7077129c7..e850ef1983b 100644 --- a/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/ARMAsmPrinter.cpp @@ -127,10 +127,10 @@ namespace { Name += ACPV->getSymbol(); if (ACPV->isNonLazyPointer()) { GVNonLazyPtrs.insert(Name); - O << TAI->getPrivateGlobalPrefix() << Name << "$non_lazy_ptr"; + printSuffixedName(Name, "$non_lazy_ptr"); } else if (ACPV->isStub()) { FnStubs.insert(Name); - O << TAI->getPrivateGlobalPrefix() << Name << "$stub"; + printSuffixedName(Name, "$stub"); } else O << Name; if (ACPV->hasModifier()) O << "(" << ACPV->getModifier() << ")"; @@ -295,7 +295,7 @@ void ARMAsmPrinter::printOperand(const MachineInstr *MI, int opNum, GV->hasLinkOnceLinkage()); if (isExt && isCallOp && Subtarget->isTargetDarwin() && TM.getRelocationModel() != Reloc::Static) { - O << TAI->getPrivateGlobalPrefix() << Name << "$stub"; + printSuffixedName(Name, "$stub"); FnStubs.insert(Name); } else O << Name; @@ -318,7 +318,7 @@ void ARMAsmPrinter::printOperand(const MachineInstr *MI, int opNum, Name += MO.getSymbolName(); if (isCallOp && Subtarget->isTargetDarwin() && TM.getRelocationModel() != Reloc::Static) { - O << TAI->getPrivateGlobalPrefix() << Name << "$stub"; + printSuffixedName(Name, "$stub"); FnStubs.insert(Name); } else O << Name; @@ -1004,21 +1004,32 @@ bool ARMAsmPrinter::doFinalization(Module &M) { EmitAlignment(2); O << "\t.code\t32\n"; - O << "L" << *i << "$stub:\n"; + std::string p = *i; + printSuffixedName(p, "$stub"); + O << ":\n"; O << "\t.indirect_symbol " << *i << "\n"; - O << "\tldr ip, L" << *i << "$slp\n"; + O << "\tldr ip, "; + printSuffixedName(p, "$slp"); + O << "\n"; if (TM.getRelocationModel() == Reloc::PIC_) { - O << "L" << *i << "$scv:\n"; + printSuffixedName(p, "$scv"); + O << ":\n"; O << "\tadd ip, pc, ip\n"; } O << "\tldr pc, [ip, #0]\n"; - O << "L" << *i << "$slp:\n"; - if (TM.getRelocationModel() == Reloc::PIC_) - O << "\t.long\tL" << *i << "$lazy_ptr-(L" << *i << "$scv+8)\n"; - else - O << "\t.long\tL" << *i << "$lazy_ptr\n"; + printSuffixedName(p, "$slp"); + O << ":\n"; + O << "\t.long\t"; + printSuffixedName(p, "$lazy_ptr"); + if (TM.getRelocationModel() == Reloc::PIC_) { + O << "-("; + printSuffixedName(p, "$scv"); + O << "+8)\n"; + } else + O << "\n"; SwitchToDataSection(".lazy_symbol_pointer", 0); - O << "L" << *i << "$lazy_ptr:\n"; + printSuffixedName(p, "$lazy_ptr"); + O << ":\n"; O << "\t.indirect_symbol " << *i << "\n"; O << "\t.long\tdyld_stub_binding_helper\n"; } @@ -1029,7 +1040,9 @@ bool ARMAsmPrinter::doFinalization(Module &M) { SwitchToDataSection(".non_lazy_symbol_pointer", 0); for (std::set::iterator i = GVNonLazyPtrs.begin(), e = GVNonLazyPtrs.end(); i != e; ++i) { - O << "L" << *i << "$non_lazy_ptr:\n"; + std::string p = *i; + printSuffixedName(p, "$non_lazy_ptr"); + O << ":\n"; O << "\t.indirect_symbol " << *i << "\n"; O << "\t.long\t0\n"; } diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp index bd4975c42f7..75bf3b36e3f 100644 --- a/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -189,7 +189,7 @@ namespace { // Dynamically-resolved functions need a stub for the function. std::string Name = Mang->getValueName(GV); FnStubs.insert(Name); - O << "L" << Name << "$stub"; + printSuffixedName(Name, "$stub"); if (GV->hasExternalWeakLinkage()) ExtWeakSymbols.insert(GV); return; @@ -198,7 +198,7 @@ namespace { if (MO.getType() == MachineOperand::MO_ExternalSymbol) { std::string Name(TAI->getGlobalPrefix()); Name += MO.getSymbolName(); FnStubs.insert(Name); - O << "L" << Name << "$stub"; + printSuffixedName(Name, "$stub"); return; } } @@ -377,7 +377,7 @@ void PPCAsmPrinter::printOp(const MachineOperand &MO) { if (TM.getRelocationModel() != Reloc::Static) { std::string Name(TAI->getGlobalPrefix()); Name += MO.getSymbolName(); GVStubs.insert(Name); - O << "L" << Name << "$non_lazy_ptr"; + printSuffixedName(Name, "$non_lazy_ptr"); return; } O << TAI->getGlobalPrefix() << MO.getSymbolName(); @@ -392,7 +392,7 @@ void PPCAsmPrinter::printOp(const MachineOperand &MO) { if (((GV->isDeclaration() || GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() || GV->hasCommonLinkage()))) { GVStubs.insert(Name); - O << "L" << Name << "$non_lazy_ptr"; + printSuffixedName(Name, "$non_lazy_ptr"); if (GV->hasExternalWeakLinkage()) ExtWeakSymbols.insert(GV); return; @@ -422,7 +422,7 @@ void PPCAsmPrinter::EmitExternalGlobal(const GlobalVariable *GV) { std::string Name = getGlobalLinkName(GV); if (TM.getRelocationModel() != Reloc::Static) { GVStubs.insert(Name); - O << "L" << Name << "$non_lazy_ptr"; + printSuffixedName(Name, "$non_lazy_ptr"); return; } O << Name; @@ -1051,22 +1051,30 @@ bool DarwinAsmPrinter::doFinalization(Module &M) { SwitchToTextSection("\t.section __TEXT,__picsymbolstub1,symbol_stubs," "pure_instructions,32"); EmitAlignment(4); - O << "L" << *i << "$stub:\n"; + std::string p = *i; + std::string L0p = (p[0]=='\"') ? "\"L0$" + p.substr(1) : "L0$" + p ; + printSuffixedName(p, "$stub"); + O << ":\n"; O << "\t.indirect_symbol " << *i << "\n"; O << "\tmflr r0\n"; - O << "\tbcl 20,31,L0$" << *i << "\n"; - O << "L0$" << *i << ":\n"; + O << "\tbcl 20,31," << L0p << "\n"; + O << L0p << ":\n"; O << "\tmflr r11\n"; - O << "\taddis r11,r11,ha16(L" << *i << "$lazy_ptr-L0$" << *i << ")\n"; + O << "\taddis r11,r11,ha16("; + printSuffixedName(p, "$lazy_ptr"); + O << "-" << L0p << ")\n"; O << "\tmtlr r0\n"; if (isPPC64) - O << "\tldu r12,lo16(L" << *i << "$lazy_ptr-L0$" << *i << ")(r11)\n"; + O << "\tldu r12,lo16("; else - O << "\tlwzu r12,lo16(L" << *i << "$lazy_ptr-L0$" << *i << ")(r11)\n"; + O << "\tlwzu r12,lo16("; + printSuffixedName(p, "$lazy_ptr"); + O << "-" << L0p << ")(r11)\n"; O << "\tmtctr r12\n"; O << "\tbctr\n"; SwitchToDataSection(".lazy_symbol_pointer"); - O << "L" << *i << "$lazy_ptr:\n"; + printSuffixedName(p, "$lazy_ptr"); + O << ":\n"; O << "\t.indirect_symbol " << *i << "\n"; if (isPPC64) O << "\t.quad dyld_stub_binding_helper\n"; @@ -1079,17 +1087,24 @@ bool DarwinAsmPrinter::doFinalization(Module &M) { SwitchToTextSection("\t.section __TEXT,__symbol_stub1,symbol_stubs," "pure_instructions,16"); EmitAlignment(4); - O << "L" << *i << "$stub:\n"; + std::string p = *i; + printSuffixedName(p, "$stub"); + O << ":\n"; O << "\t.indirect_symbol " << *i << "\n"; - O << "\tlis r11,ha16(L" << *i << "$lazy_ptr)\n"; + O << "\tlis r11,ha16("; + printSuffixedName(p, "$lazy_ptr"); + O << ")\n"; if (isPPC64) - O << "\tldu r12,lo16(L" << *i << "$lazy_ptr)(r11)\n"; + O << "\tldu r12,lo16("; else - O << "\tlwzu r12,lo16(L" << *i << "$lazy_ptr)(r11)\n"; + O << "\tlwzu r12,lo16("; + printSuffixedName(p, "$lazy_ptr"); + O << ")(r11)\n"; O << "\tmtctr r12\n"; O << "\tbctr\n"; SwitchToDataSection(".lazy_symbol_pointer"); - O << "L" << *i << "$lazy_ptr:\n"; + printSuffixedName(p, "$lazy_ptr"); + O << ":\n"; O << "\t.indirect_symbol " << *i << "\n"; if (isPPC64) O << "\t.quad dyld_stub_binding_helper\n"; @@ -1115,7 +1130,9 @@ bool DarwinAsmPrinter::doFinalization(Module &M) { SwitchToDataSection(".non_lazy_symbol_pointer"); for (std::set::iterator I = GVStubs.begin(), E = GVStubs.end(); I != E; ++I) { - O << "L" << *I << "$non_lazy_ptr:\n"; + std::string p = *I; + printSuffixedName(p, "$non_lazy_ptr"); + O << ":\n"; O << "\t.indirect_symbol " << *I << "\n"; if (isPPC64) O << "\t.quad\t0\n"; diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp index 4659deb1467..5cae112f578 100644 --- a/lib/Target/X86/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/X86ATTAsmPrinter.cpp @@ -314,10 +314,10 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, // Dynamically-resolved functions need a stub for the function. if (isCallOp && isa(GV)) { FnStubs.insert(Name); - O << TAI->getPrivateGlobalPrefix() << Name << "$stub"; + printSuffixedName(Name, "$stub"); } else { GVStubs.insert(Name); - O << TAI->getPrivateGlobalPrefix() << Name << "$non_lazy_ptr"; + printSuffixedName(Name, "$non_lazy_ptr"); } } else { if (GV->hasDLLImportLinkage()) @@ -398,7 +398,7 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, Name += MO.getSymbolName(); if (isCallOp && printStub(TM, Subtarget)) { FnStubs.insert(Name); - O << TAI->getPrivateGlobalPrefix() << Name << "$stub"; + printSuffixedName(Name, "$stub"); return; } if (!isCallOp) diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp index a99588b13b3..caccf52b075 100644 --- a/lib/Target/X86/X86AsmPrinter.cpp +++ b/lib/Target/X86/X86AsmPrinter.cpp @@ -385,8 +385,10 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) { i != e; ++i, ++j) { SwitchToDataSection("\t.section __IMPORT,__jump_table,symbol_stubs," "self_modifying_code+pure_instructions,5", 0); - O << "L" << *i << "$stub:\n"; - O << "\t.indirect_symbol " << *i << "\n"; + std::string p = *i; + printSuffixedName(p, "$stub"); + O << ":\n"; + O << "\t.indirect_symbol " << p << "\n"; O << "\thlt ; hlt ; hlt ; hlt ; hlt\n"; } @@ -408,8 +410,10 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) { "\t.section __IMPORT,__pointers,non_lazy_symbol_pointers"); for (std::set::iterator i = GVStubs.begin(), e = GVStubs.end(); i != e; ++i) { - O << "L" << *i << "$non_lazy_ptr:\n"; - O << "\t.indirect_symbol " << *i << "\n"; + std::string p = *i; + printSuffixedName(p, "$non_lazy_ptr"); + O << ":\n"; + O << "\t.indirect_symbol " << p << "\n"; O << "\t.long\t0\n"; } -- 2.34.1