From 228252f98157132488a8e2616d9c95a28c167c5c Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 18 Sep 2009 20:22:52 +0000 Subject: [PATCH] Make a new X8632_MachoTargetObjectFile TLOF implementation whose getSymbolForDwarfGlobalReference is smart enough to know that it needs to register the stub it references with MachineModuleInfoMachO, so that it gets emitted at the end of the file. Move stub emission from X86ATTAsmPrinter::doFinalization to the new X86ATTAsmPrinter::EmitEndOfAsmFile asmprinter hook. The important thing here is that EmitEndOfAsmFile is called *after* the ehframes are emitted, so we get all the stubs. This allows us to remove a gross hack from the asmprinter where it would "just know" that it needed to output stubs for personality functions. Now this is all driven from a consistent interface. The testcase change is just reordering the expected output now that the stubs come out after the ehframe instead of before. This also unblocks other changes that Bill wants to make. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82269 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../X86/AsmPrinter/X86ATTAsmPrinter.cpp | 25 +-------------- lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h | 5 +-- lib/Target/X86/X86ISelLowering.cpp | 2 +- lib/Target/X86/X86TargetObjectFile.cpp | 31 +++++++++++++++++++ lib/Target/X86/X86TargetObjectFile.h | 11 +++++++ test/CodeGen/X86/personality.ll | 7 +++-- 6 files changed, 51 insertions(+), 30 deletions(-) diff --git a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp index 6365bc0f957..26d4793412f 100644 --- a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp @@ -879,7 +879,7 @@ void X86ATTAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) { O << "\t.size\t" << name << ", " << Size << '\n'; } -bool X86ATTAsmPrinter::doFinalization(Module &M) { +void X86ATTAsmPrinter::EmitEndOfAsmFile(Module &M) { if (Subtarget->isTargetDarwin()) { // All darwin targets use mach-o. TargetLoweringObjectFileMachO &TLOFMacho = @@ -888,26 +888,6 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) { MachineModuleInfoMachO &MMIMacho = MMI->getObjFileInfo(); - // Add the (possibly multiple) personalities to the set of global value - // stubs. Only referenced functions get into the Personalities list. - if (!Subtarget->is64Bit()) { - const std::vector &Personalities = MMI->getPersonalities(); - for (unsigned i = 0, e = Personalities.size(); i != e; ++i) { - if (Personalities[i] == 0) - continue; - - SmallString<128> Name; - Mang->getNameWithPrefix(Name, Personalities[i], true /*private label*/); - Name += "$non_lazy_ptr"; - MCSymbol *NLPName = OutContext.GetOrCreateSymbol(Name.str()); - - const MCSymbol *&StubName = MMIMacho.getGVStubEntry(NLPName); - Name.clear(); - Mang->getNameWithPrefix(Name, Personalities[i], false); - StubName = OutContext.GetOrCreateSymbol(Name.str()); - } - } - // Output stubs for dynamically-linked functions. MachineModuleInfoMachO::SymbolListTy Stubs; @@ -1010,8 +990,5 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) { O << "\t.ascii \" -export:" << i->getKeyData() << "\"\n"; } } - - // Do common shutdown. - return AsmPrinter::doFinalization(M); } diff --git a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h index 78e3d7de62c..7ede60be10f 100644 --- a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h +++ b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h @@ -58,8 +58,9 @@ class VISIBILITY_HIDDEN X86ATTAsmPrinter : public AsmPrinter { AsmPrinter::getAnalysisUsage(AU); } - bool doFinalization(Module &M); - + + virtual void EmitEndOfAsmFile(Module &M); + void printInstructionThroughMCStreamer(const MachineInstr *MI); diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 6154d2641c6..16f737d9124 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -65,7 +65,7 @@ static TargetLoweringObjectFile *createTLOF(X86TargetMachine &TM) { case X86Subtarget::isDarwin: if (TM.getSubtarget().is64Bit()) return new X8664_MachoTargetObjectFile(); - return new TargetLoweringObjectFileMachO(); + return new X8632_MachoTargetObjectFile(); case X86Subtarget::isELF: return new TargetLoweringObjectFileELF(); case X86Subtarget::isMingw: diff --git a/lib/Target/X86/X86TargetObjectFile.cpp b/lib/Target/X86/X86TargetObjectFile.cpp index 4b4cc457aed..d39b3c43242 100644 --- a/lib/Target/X86/X86TargetObjectFile.cpp +++ b/lib/Target/X86/X86TargetObjectFile.cpp @@ -10,9 +10,40 @@ #include "X86TargetObjectFile.h" #include "llvm/ADT/SmallString.h" #include "llvm/Support/Mangler.h" +#include "llvm/MC/MCContext.h" #include "llvm/MC/MCExpr.h" +#include "llvm/CodeGen/MachineModuleInfoImpls.h" using namespace llvm; +const MCExpr *X8632_MachoTargetObjectFile:: +getSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, + MachineModuleInfo *MMI, + bool &IsIndirect, bool &IsPCRel) const { + // The mach-o version of this method defaults to returning a stub reference. + IsIndirect = true; + IsPCRel = false; + + + MachineModuleInfoMachO &MachOMMI = + MMI->getObjFileInfo(); + + SmallString<128> Name; + Mang->getNameWithPrefix(Name, GV, true); + Name += "$non_lazy_ptr"; + + // Add information about the stub reference to MachOMMI so that the stub gets + // emitted by the asmprinter. + MCSymbol *Sym = getContext().GetOrCreateSymbol(Name.str()); + const MCSymbol *&StubSym = MachOMMI.getGVStubEntry(Sym); + if (StubSym == 0) { + Name.clear(); + Mang->getNameWithPrefix(Name, GV, false); + StubSym = getContext().GetOrCreateSymbol(Name.str()); + } + + return MCSymbolRefExpr::Create(Sym, getContext()); +} + const MCExpr *X8664_MachoTargetObjectFile:: getSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, MachineModuleInfo *MMI, diff --git a/lib/Target/X86/X86TargetObjectFile.h b/lib/Target/X86/X86TargetObjectFile.h index bee32a57390..377a93bb715 100644 --- a/lib/Target/X86/X86TargetObjectFile.h +++ b/lib/Target/X86/X86TargetObjectFile.h @@ -14,6 +14,17 @@ namespace llvm { + /// X8632_MachoTargetObjectFile - This TLOF implementation is used for + /// Darwin/x86-32. + class X8632_MachoTargetObjectFile : public TargetLoweringObjectFileMachO { + public: + + virtual const MCExpr * + getSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, + MachineModuleInfo *MMI, + bool &IsIndirect, bool &IsPCRel) const; + }; + /// X8664_MachoTargetObjectFile - This TLOF implementation is used for /// Darwin/x86-64. class X8664_MachoTargetObjectFile : public TargetLoweringObjectFileMachO { diff --git a/test/CodeGen/X86/personality.ll b/test/CodeGen/X86/personality.ll index a4d72a722d1..5acf04cc06c 100644 --- a/test/CodeGen/X86/personality.ll +++ b/test/CodeGen/X86/personality.ll @@ -41,9 +41,10 @@ declare void @__cxa_end_catch() ; X64: Leh_frame_common_begin: ; X64: .long ___gxx_personality_v0@GOTPCREL+4 +; X32: Leh_frame_common_begin: +; X32: .long L___gxx_personality_v0$non_lazy_ptr- +; .... + ; X32: .section __IMPORT,__pointers,non_lazy_symbol_pointers ; X32: L___gxx_personality_v0$non_lazy_ptr: ; X32: .indirect_symbol ___gxx_personality_v0 -; .... -; X32: Leh_frame_common_begin: -; X32: .long L___gxx_personality_v0$non_lazy_ptr- \ No newline at end of file -- 2.34.1