Make a new X8632_MachoTargetObjectFile TLOF implementation whose
authorChris Lattner <sabre@nondot.org>
Fri, 18 Sep 2009 20:22:52 +0000 (20:22 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 18 Sep 2009 20:22:52 +0000 (20:22 +0000)
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

lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h
lib/Target/X86/X86ISelLowering.cpp
lib/Target/X86/X86TargetObjectFile.cpp
lib/Target/X86/X86TargetObjectFile.h
test/CodeGen/X86/personality.ll

index 6365bc0f9573429d517baf912c136c825678bf30..26d4793412f8c93b83b7f88891b9f87edec17918 100644 (file)
@@ -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<MachineModuleInfoMachO>();
     
-    // 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<Function*> &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);
 }
 
index 78e3d7de62cef51d1bd07fb83664dd62315744ff..7ede60be10f5336072644bda76e9e2abb6d003cc 100644 (file)
@@ -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);
 
 
index 6154d2641c6ffcad430aebde171598cc285d4845..16f737d91244ec11c931d468c3a7b5f2f6738c0e 100644 (file)
@@ -65,7 +65,7 @@ static TargetLoweringObjectFile *createTLOF(X86TargetMachine &TM) {
   case X86Subtarget::isDarwin:
     if (TM.getSubtarget<X86Subtarget>().is64Bit())
       return new X8664_MachoTargetObjectFile();
-    return new TargetLoweringObjectFileMachO();
+    return new X8632_MachoTargetObjectFile();
   case X86Subtarget::isELF:
     return new TargetLoweringObjectFileELF();
   case X86Subtarget::isMingw:
index 4b4cc457aed05c4f331272933a90aaed49a6e0b1..d39b3c4324205a7d8fc7606557a8a771188c9e61 100644 (file)
 #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<MachineModuleInfoMachO>();
+  
+  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,
index bee32a573903939c023b59a8fe340db8a36acbc1..377a93bb71529a77c37d37dd63f56bf8d449c4a4 100644 (file)
 
 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 {
index a4d72a722d1f5ad30c018c7d4dc92cdbc426b08a..5acf04cc06c10b4a857f798bd75799717f654a1a 100644 (file)
@@ -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