[llvm-commits] [llvm] r82269 - in /llvm/trunk: 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

Chris Lattner sabre at nondot.org
Fri Sep 18 13:22:52 PDT 2009


Author: lattner
Date: Fri Sep 18 15:22:52 2009
New Revision: 82269

URL: http://llvm.org/viewvc/llvm-project?rev=82269&view=rev
Log:
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.

Modified:
    llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
    llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
    llvm/trunk/lib/Target/X86/X86TargetObjectFile.cpp
    llvm/trunk/lib/Target/X86/X86TargetObjectFile.h
    llvm/trunk/test/CodeGen/X86/personality.ll

Modified: llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp?rev=82269&r1=82268&r2=82269&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp Fri Sep 18 15:22:52 2009
@@ -879,7 +879,7 @@
     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 @@
     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 @@
         O << "\t.ascii \" -export:" << i->getKeyData() << "\"\n";
     }
   }
-
-  // Do common shutdown.
-  return AsmPrinter::doFinalization(M);
 }
 

Modified: llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h?rev=82269&r1=82268&r2=82269&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h (original)
+++ llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h Fri Sep 18 15:22:52 2009
@@ -58,8 +58,9 @@
     AsmPrinter::getAnalysisUsage(AU);
   }
 
-  bool doFinalization(Module &M);
-
+  
+  virtual void EmitEndOfAsmFile(Module &M);
+  
   void printInstructionThroughMCStreamer(const MachineInstr *MI);
 
 

Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=82269&r1=82268&r2=82269&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Fri Sep 18 15:22:52 2009
@@ -65,7 +65,7 @@
   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:

Modified: llvm/trunk/lib/Target/X86/X86TargetObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetObjectFile.cpp?rev=82269&r1=82268&r2=82269&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/X86TargetObjectFile.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86TargetObjectFile.cpp Fri Sep 18 15:22:52 2009
@@ -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<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,

Modified: llvm/trunk/lib/Target/X86/X86TargetObjectFile.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetObjectFile.h?rev=82269&r1=82268&r2=82269&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/X86TargetObjectFile.h (original)
+++ llvm/trunk/lib/Target/X86/X86TargetObjectFile.h Fri Sep 18 15:22:52 2009
@@ -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 {

Modified: llvm/trunk/test/CodeGen/X86/personality.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/personality.ll?rev=82269&r1=82268&r2=82269&view=diff

==============================================================================
--- llvm/trunk/test/CodeGen/X86/personality.ll (original)
+++ llvm/trunk/test/CodeGen/X86/personality.ll Fri Sep 18 15:22:52 2009
@@ -41,9 +41,10 @@
 ; X64: Leh_frame_common_begin:
 ; X64: .long	___gxx_personality_v0 at 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





More information about the llvm-commits mailing list