[llvm-commits] [llvm] r129635 - in /llvm/trunk: include/llvm/CodeGen/TargetLoweringObjectFileImpl.h include/llvm/Target/TargetLoweringObjectFile.h lib/CodeGen/AsmPrinter/DwarfCFIException.cpp lib/CodeGen/TargetLoweringObjectFileImpl.cpp lib/Target/TargetLoweringObjectFile.cpp

Rafael Espindola rafael.espindola at gmail.com
Fri Apr 15 20:51:21 PDT 2011


Author: rafael
Date: Fri Apr 15 22:51:21 2011
New Revision: 129635

URL: http://llvm.org/viewvc/llvm-project?rev=129635&view=rev
Log:
Put each personality function in a section. This fixes the gnu ld warning:

  error in foo.o; no .eh_frame_hdr table will be created.

Modified:
    llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
    llvm/trunk/include/llvm/Target/TargetLoweringObjectFile.h
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
    llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
    llvm/trunk/lib/Target/TargetLoweringObjectFile.cpp

Modified: llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h?rev=129635&r1=129634&r2=129635&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h (original)
+++ llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h Fri Apr 15 22:51:21 2011
@@ -58,6 +58,11 @@
   virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
 
   virtual const MCSection *getEHFrameSection() const;
+  virtual MCSymbol *getPersonalityPICSymbol(StringRef Name) const;
+
+  virtual void emitPersonalityValue(MCStreamer &Streamer,
+                                    const TargetMachine &TM,
+                                    const MCSymbol *Sym) const;
 
   const MCSection *getDataRelSection() const { return DataRelSection; }
 

Modified: llvm/trunk/include/llvm/Target/TargetLoweringObjectFile.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLoweringObjectFile.h?rev=129635&r1=129634&r2=129635&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Target/TargetLoweringObjectFile.h (original)
+++ llvm/trunk/include/llvm/Target/TargetLoweringObjectFile.h Fri Apr 15 22:51:21 2011
@@ -140,6 +140,10 @@
   const MCSection *getStaticDtorSection() const { return StaticDtorSection; }
   const MCSection *getLSDASection() const { return LSDASection; }
   virtual const MCSection *getEHFrameSection() const = 0;
+  virtual MCSymbol *getPersonalityPICSymbol(StringRef Name) const;
+  virtual void emitPersonalityValue(MCStreamer &Streamer,
+                                    const TargetMachine &TM,
+                                    const MCSymbol *Sym) const;
   const MCSection *getDwarfAbbrevSection() const { return DwarfAbbrevSection; }
   const MCSection *getDwarfInfoSection() const { return DwarfInfoSection; }
   const MCSection *getDwarfLineSection() const { return DwarfLineSection; }

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp?rev=129635&r1=129634&r2=129635&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp Fri Apr 15 22:51:21 2011
@@ -58,19 +58,14 @@
   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
   unsigned PerEncoding = TLOF.getPersonalityEncoding();
 
-  // Begin eh frame section.
-  Asm->OutStreamer.SwitchSection(TLOF.getEHFrameSection());
-
   if ((PerEncoding & 0x70) != dwarf::DW_EH_PE_pcrel)
     return;
 
   // Emit references to all used personality functions
   const std::vector<const Function*> &Personalities = MMI->getPersonalities();
   for (size_t i = 0, e = Personalities.size(); i != e; ++i) {
-    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("personality", i));
     const MCSymbol *Sym = Asm->Mang->getSymbol(Personalities[i]);
-    unsigned Size = Asm->TM.getTargetData()->getPointerSize();
-    Asm->OutStreamer.EmitSymbolValue(Sym, Size);
+    TLOF.emitPersonalityValue(Asm->OutStreamer, Asm->TM, Sym);
   }
 }
 
@@ -123,8 +118,8 @@
     break;
   }
   case dwarf::DW_EH_PE_pcrel: {
-    Sym = Asm->GetTempSymbol("personality",
-                             MMI->getPersonalityIndex());
+    MCContext &Context = Asm->OutStreamer.getContext();
+    Sym = TLOF.getPersonalityPICSymbol(Per->getName());
     break;
   }
   }

Modified: llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp?rev=129635&r1=129634&r2=129635&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp (original)
+++ llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp Fri Apr 15 22:51:21 2011
@@ -23,6 +23,7 @@
 #include "llvm/MC/MCSectionMachO.h"
 #include "llvm/MC/MCSectionELF.h"
 #include "llvm/MC/MCSectionCOFF.h"
+#include "llvm/MC/MCStreamer.h"
 #include "llvm/MC/MCSymbol.h"
 #include "llvm/Target/Mangler.h"
 #include "llvm/Target/TargetData.h"
@@ -176,6 +177,38 @@
                                     SectionKind::getDataRel());
 }
 
+MCSymbol *
+TargetLoweringObjectFileELF::getPersonalityPICSymbol(StringRef Name) const {
+  Twine FullName = StringRef("DW.ref.") + Name;
+  return getContext().GetOrCreateSymbol(FullName);
+}
+
+void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
+                                                       const TargetMachine &TM,
+                                                   const MCSymbol *Sym) const {
+    MCSymbol *Label = getPersonalityPICSymbol(Sym->getName());
+    Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);
+    Streamer.EmitSymbolAttribute(Label, MCSA_Weak);
+    Twine SectionName = StringRef(".data.") + Label->getName();
+    SmallString<64> NameData;
+    SectionName.toVector(NameData);
+    unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP;
+    const MCSection *Sec = getContext().getELFSection(NameData,
+                                                      ELF::SHT_PROGBITS,
+                                                      Flags,
+                                                      SectionKind::getDataRel(),
+                                                      0, Label->getName());
+    Streamer.SwitchSection(Sec);
+    Streamer.EmitValueToAlignment(8);
+    Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);
+    const MCExpr *E = MCConstantExpr::Create(8, getContext());
+    Streamer.EmitELFSize(Label, E);
+    Streamer.EmitLabel(Label);
+
+    unsigned Size = TM.getTargetData()->getPointerSize();
+    Streamer.EmitSymbolValue(Sym, Size);
+}
+
 static SectionKind
 getELFKindForNamedSection(StringRef Name, SectionKind K) {
   // FIXME: Why is this here? Codegen is should not be in the business

Modified: llvm/trunk/lib/Target/TargetLoweringObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetLoweringObjectFile.cpp?rev=129635&r1=129634&r2=129635&view=diff
==============================================================================
--- llvm/trunk/lib/Target/TargetLoweringObjectFile.cpp (original)
+++ llvm/trunk/lib/Target/TargetLoweringObjectFile.cpp Fri Apr 15 22:51:21 2011
@@ -120,6 +120,18 @@
   return false;
 }
 
+MCSymbol *
+TargetLoweringObjectFile::getPersonalityPICSymbol(StringRef Name) const {
+  assert(0 && "Not Available in this format.");
+}
+
+void TargetLoweringObjectFile::emitPersonalityValue(MCStreamer &Streamer,
+                                                    const TargetMachine &TM,
+                                                    const MCSymbol *Sym) const {
+  assert(0 && "Not Available in this format.");
+}
+
+
 /// getKindForGlobal - This is a top-level target-independent classifier for
 /// a global variable.  Given an global variable and information from TM, it
 /// classifies the global in a variety of ways that make various target





More information about the llvm-commits mailing list