Rename getPersonalityPICSymbol to getCFIPersonalitySymbol, document it, and
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 27 Apr 2011 23:08:15 +0000 (23:08 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 27 Apr 2011 23:08:15 +0000 (23:08 +0000)
give it a bit more responsibility. Also implement it for MachO.

If hacked to use cfi, 32 bit MachO will produce

.cfi_personality 155, L___gxx_personality_v0$non_lazy_ptr

and 64 bit will produce

.cfi_presonality ___gxx_personality_v0

The general idea is that .cfi_personality gets passed the final symbol. It is
up to codegen to produce it if using indirect representation (like 32 bit
MachO), but it is up to MC to decide which relocations to create.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130341 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
include/llvm/Target/TargetLoweringObjectFile.h
lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
lib/CodeGen/TargetLoweringObjectFileImpl.cpp
lib/Target/TargetLoweringObjectFile.cpp
lib/Target/X86/X86TargetObjectFile.cpp
lib/Target/X86/X86TargetObjectFile.h

index 8aa34f0174be1859c9490fac2221f340ef5e8721..411e4ccd081df99f8870fb3a3a2b960cd03a5596 100644 (file)
@@ -58,7 +58,6 @@ public:
   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,
@@ -86,6 +85,11 @@ public:
   getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
                                  MachineModuleInfo *MMI, unsigned Encoding,
                                  MCStreamer &Streamer) const;
+
+  // getCFIPersonalitySymbol - The symbol that gets passed to .cfi_personality.
+  virtual MCSymbol *
+  getCFIPersonalitySymbol(const GlobalValue *GV, unsigned Encoding,
+                          Mangler *Mang, MachineModuleInfo *MMI) const;
 };
 
 
@@ -177,6 +181,11 @@ public:
                                  MachineModuleInfo *MMI, unsigned Encoding,
                                  MCStreamer &Streamer) const;
 
+  // getCFIPersonalitySymbol - The symbol that gets passed to .cfi_personality.
+  virtual MCSymbol *
+  getCFIPersonalitySymbol(const GlobalValue *GV, unsigned Encoding,
+                          Mangler *Mang, MachineModuleInfo *MMI) const;
+
   virtual unsigned getPersonalityEncoding() const;
   virtual unsigned getLSDAEncoding() const;
   virtual unsigned getFDEEncoding() const;
index c787dfb630410eb7ee2bae67209f15167688728b..e4bbd018d7662204fc9d641e30fbf017739e45c9 100644 (file)
@@ -140,7 +140,6 @@ public:
   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;
@@ -222,6 +221,11 @@ public:
                                  MachineModuleInfo *MMI, unsigned Encoding,
                                  MCStreamer &Streamer) const;
 
+  // getCFIPersonalitySymbol - The symbol that gets passed to .cfi_personality.
+  virtual MCSymbol *
+  getCFIPersonalitySymbol(const GlobalValue *GV, unsigned Encoding,
+                          Mangler *Mang, MachineModuleInfo *MMI) const;
+
   /// 
   const MCExpr *
   getExprForDwarfReference(const MCSymbol *Sym, unsigned Encoding,
index 70c0c8a82eb034526c7d52a7d95780927dc096da..5b92edeb29b487e1e93268ab517c43ccddd5afe3 100644 (file)
@@ -109,17 +109,8 @@ void DwarfCFIException::BeginFunction(const MachineFunction *MF) {
   if (PerEncoding == dwarf::DW_EH_PE_omit || !Per)
     return;
 
-  const MCSymbol *Sym;
-  switch (PerEncoding & 0x70) {
-  default:
-    report_fatal_error("We do not support this DWARF encoding yet!");
-  case dwarf::DW_EH_PE_absptr:
-    Sym = Asm->Mang->getSymbol(Per);
-    break;
-  case dwarf::DW_EH_PE_pcrel:
-    Sym = TLOF.getPersonalityPICSymbol(Per->getName());
-    break;
-  }
+  const MCSymbol *Sym = TLOF.getCFIPersonalitySymbol(Per, PerEncoding,
+                                                     Asm->Mang, MMI);
   Asm->OutStreamer.EmitCFIPersonality(Sym, PerEncoding);
 }
 
index 7888a838ad9cefbfe28d2fb70e48ad1cc0f43cf2..1a4da73ffa5272953f17244d50f1883a20163416 100644 (file)
@@ -178,15 +178,29 @@ const MCSection *TargetLoweringObjectFileELF::getEHFrameSection() const {
 }
 
 MCSymbol *
-TargetLoweringObjectFileELF::getPersonalityPICSymbol(StringRef Name) const {
-  Twine FullName = StringRef("DW.ref.") + Name;
-  return getContext().GetOrCreateSymbol(FullName);
+TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV,
+                                                     unsigned Encoding,
+                                                     Mangler *Mang,
+                                                MachineModuleInfo *MMI) const {
+  switch (Encoding & 0x70) {
+  default:
+    report_fatal_error("We do not support this DWARF encoding yet!");
+  case dwarf::DW_EH_PE_absptr:
+    return  Mang->getSymbol(GV);
+    break;
+  case dwarf::DW_EH_PE_pcrel: {
+    Twine FullName = StringRef("DW.ref.") + Mang->getSymbol(GV)->getName();
+    return getContext().GetOrCreateSymbol(FullName);
+    break;
+  }
+  }
 }
 
 void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
                                                        const TargetMachine &TM,
-                                                   const MCSymbol *Sym) const {
-  MCSymbol *Label = getPersonalityPICSymbol(Sym->getName());
+                                                       const MCSymbol *Sym) const {
+  Twine FullName = StringRef("DW.ref.") + Sym->getName();
+  MCSymbol *Label = getContext().GetOrCreateSymbol(FullName);
   Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);
   Streamer.EmitSymbolAttribute(Label, MCSA_Weak);
   Twine SectionName = StringRef(".data.") + Label->getName();
@@ -834,6 +848,29 @@ getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
     getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
 }
 
+MCSymbol *TargetLoweringObjectFileMachO::
+getCFIPersonalitySymbol(const GlobalValue *GV, unsigned Encoding, Mangler *Mang,
+                        MachineModuleInfo *MMI) const {
+  // The mach-o version of this method defaults to returning a stub reference.
+  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 *SSym = getContext().GetOrCreateSymbol(Name.str());
+  MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
+  if (StubSym.getPointer() == 0) {
+    MCSymbol *Sym = Mang->getSymbol(GV);
+    StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
+  }
+
+  return SSym;
+}
+
 unsigned TargetLoweringObjectFileMachO::getPersonalityEncoding() const {
   return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
 }
index 040e0f920b09be46ea3bd14ec822f40bd053183f..07f9773eb2e868f37d0fbc7fb3b66084e314dd02 100644 (file)
@@ -120,16 +120,15 @@ static bool IsNullTerminatedString(const Constant *C) {
   return false;
 }
 
-MCSymbol *
-TargetLoweringObjectFile::getPersonalityPICSymbol(StringRef Name) const {
-  assert(0 && "Not Available in this format.");
-  return 0;
+MCSymbol *TargetLoweringObjectFile::
+getCFIPersonalitySymbol(const GlobalValue *GV, unsigned Encoding, Mangler *Mang,
+                        MachineModuleInfo *MMI) const {
+  return Mang->getSymbol(GV);
 }
 
 void TargetLoweringObjectFile::emitPersonalityValue(MCStreamer &Streamer,
                                                     const TargetMachine &TM,
                                                     const MCSymbol *Sym) const {
-  assert(0 && "Not Available in this format.");
 }
 
 
index 3b1e33d002272e8c0283e9b69dc05916f7cb69a7..68c5aadcfcff8663d39fa44573e4c44a98f4b266 100644 (file)
@@ -38,6 +38,12 @@ getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
     getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
 }
 
+MCSymbol *X8664_MachoTargetObjectFile::
+getCFIPersonalitySymbol(const GlobalValue *GV, unsigned Encoding, Mangler *Mang,
+                        MachineModuleInfo *MMI) const {
+  return Mang->getSymbol(GV);
+}
+
 unsigned X8632_ELFTargetObjectFile::getPersonalityEncoding() const {
   if (TM.getRelocationModel() == Reloc::PIC_)
     return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
index f2fd49caca3828160140667e781015613cf9740a..7d14175271fb76801c4dde2862cb4548d09e0fd0 100644 (file)
@@ -25,6 +25,12 @@ namespace llvm {
     getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
                                    MachineModuleInfo *MMI, unsigned Encoding,
                                    MCStreamer &Streamer) const;
+
+    // getCFIPersonalitySymbol - The symbol that gets passed to
+    // .cfi_personality.
+    virtual MCSymbol *
+    getCFIPersonalitySymbol(const GlobalValue *GV, unsigned Encoding,
+                            Mangler *Mang, MachineModuleInfo *MMI) const;
   };
 
   class X8632_ELFTargetObjectFile : public TargetLoweringObjectFileELF {