From 2a3c20bf269c3adef88e16902c041819eea04183 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 11 Sep 2009 06:36:33 +0000 Subject: change FnStubs from being a StringMap to being a much more efficient SmallPtrSet. This eliminates string craziness and fixes CodeGen/X86/darwin-quote.ll with the new asmprinter. Codegen is producing stubs in a nondeterminstic order, but it was doing this before anyway. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81511 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp | 29 +++++++++++++++++++------- lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h | 3 ++- lib/Target/X86/AsmPrinter/X86MCInstLower.cpp | 19 ++++++++++------- 3 files changed, 34 insertions(+), 17 deletions(-) (limited to 'lib/Target') diff --git a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp index 445cc13ec2..00ae058b61 100644 --- a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp @@ -24,8 +24,10 @@ #include "llvm/Module.h" #include "llvm/Type.h" #include "llvm/Assembly/Writer.h" -#include "llvm/MC/MCStreamer.h" +#include "llvm/MC/MCContext.h" #include "llvm/MC/MCSectionMachO.h" +#include "llvm/MC/MCStreamer.h" +#include "llvm/MC/MCSymbol.h" #include "llvm/CodeGen/MachineJumpTableInfo.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ErrorHandling.h" @@ -320,8 +322,9 @@ void X86ATTAsmPrinter::printSymbolOperand(const MachineOperand &MO) { GVStubs[Name] = Mang->getMangledName(GV); else if (MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE) HiddenGVStubs[Name] = Mang->getMangledName(GV); - else if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) - FnStubs[Name] = Mang->getMangledName(GV); + else if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) { + FnStubs.insert(OutContext.GetOrCreateSymbol(Name)); + } // If the name begins with a dollar-sign, enclose it in parens. We do this // to avoid having it look like an integer immediate to the assembler. @@ -336,8 +339,8 @@ void X86ATTAsmPrinter::printSymbolOperand(const MachineOperand &MO) { case MachineOperand::MO_ExternalSymbol: { std::string Name = Mang->makeNameProper(MO.getSymbolName()); if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) { - FnStubs[Name+"$stub"] = Name; Name += "$stub"; + FnStubs.insert(OutContext.GetOrCreateSymbol(Name)); } // If the name begins with a dollar-sign, enclose it in parens. We do this @@ -881,10 +884,20 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) { MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 5, SectionKind::getMetadata()); OutStreamer.SwitchSection(TheSection); - for (StringMap::iterator I = FnStubs.begin(), - E = FnStubs.end(); I != E; ++I) - O << I->getKeyData() << ":\n" << "\t.indirect_symbol " << I->second - << "\n\thlt ; hlt ; hlt ; hlt ; hlt\n"; + // FIXME: This iteration order is unstable!! + for (SmallPtrSet::iterator I = FnStubs.begin(), + E = FnStubs.end(); I != E; ++I) { + MCSymbol *Sym = *I; + Sym->print(O, MAI); + + O << ":\n" << "\t.indirect_symbol "; + + // Get the MCSymbol without the $stub suffix. + Sym = OutContext.GetOrCreateSymbol(StringRef(Sym->getName()).substr(0, + Sym->getName().size()-5)); + Sym->print(O, MAI); + O << "\n\thlt ; hlt ; hlt ; hlt ; hlt\n"; + } O << '\n'; } diff --git a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h index 0dd35a7aa3..2146270afd 100644 --- a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h +++ b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h @@ -216,7 +216,8 @@ class VISIBILITY_HIDDEN X86ATTAsmPrinter : public AsmPrinter { void emitFunctionHeader(const MachineFunction &MF); // Necessary for Darwin to print out the apprioriate types of linker stubs - StringMap FnStubs, GVStubs, HiddenGVStubs; + StringMap GVStubs, HiddenGVStubs; + SmallPtrSet FnStubs; // Darwin $stub stubs. // Necessary for dllexport support StringSet<> CygMingStubs, DLLExportedFns, DLLExportedGVs; diff --git a/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp b/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp index 1cccfa95aa..2aced087d0 100644 --- a/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp +++ b/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp @@ -78,10 +78,12 @@ MCSymbol *X86ATTAsmPrinter::GetGlobalAddressSymbol(const MachineOperand &MO) { Name += "$non_lazy_ptr"; HiddenGVStubs[Name.str()] = StringRef(Name.data(), Name.size()-13); break; - case X86II::MO_DARWIN_STUB: + case X86II::MO_DARWIN_STUB: { Name += "$stub"; - FnStubs[Name.str()] = StringRef(Name.data(), Name.size()-5); - break; + MCSymbol *Sym = OutContext.GetOrCreateSymbol(Name.str()); + FnStubs.insert(Sym); + return Sym; + } // FIXME: These probably should be a modifier on the symbol or something?? case X86II::MO_TLSGD: Name += "@TLSGD"; break; case X86II::MO_GOTTPOFF: Name += "@GOTTPOFF"; break; @@ -114,12 +116,13 @@ MCSymbol *X86ATTAsmPrinter::GetExternalSymbolSymbol(const MachineOperand &MO) { Name.insert(Name.begin(), Prefix, Prefix+strlen(Prefix)); break; } - case X86II::MO_DARWIN_STUB: - // Insert: FnStub["_foo$stub"] = "_foo"; + case X86II::MO_DARWIN_STUB: { Name += "$stub"; - FnStubs[Name.str()] = StringRef(Name.data(), Name.size()-5); - break; - // FIXME: These probably should be a modifier on the symbol or something?? + MCSymbol *Sym = OutContext.GetOrCreateSymbol(Name.str()); + FnStubs.insert(Sym); + return Sym; + } + // FIXME: These probably should be a modifier on the symbol or something?? case X86II::MO_TLSGD: Name += "@TLSGD"; break; case X86II::MO_GOTTPOFF: Name += "@GOTTPOFF"; break; case X86II::MO_INDNTPOFF: Name += "@INDNTPOFF"; break; -- cgit v1.2.3