GCC uses a different encoding of pointers in the FDE when using
authorRafael Espindola <rafael.espindola@gmail.com>
Sun, 1 May 2011 04:49:54 +0000 (04:49 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Sun, 1 May 2011 04:49:54 +0000 (04:49 +0000)
-fno-dwarf2-cfi-asm. Implement the same behavior.

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

13 files changed:
include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
include/llvm/MC/MCDwarf.h
include/llvm/Target/TargetAsmInfo.h
include/llvm/Target/TargetLoweringObjectFile.h
lib/CodeGen/AsmPrinter/DwarfTableException.cpp
lib/CodeGen/TargetLoweringObjectFileImpl.cpp
lib/MC/MCAsmStreamer.cpp
lib/MC/MCDwarf.cpp
lib/MC/MCELFStreamer.cpp
lib/Target/TargetLoweringObjectFile.cpp
lib/Target/X86/X86TargetObjectFile.cpp
lib/Target/X86/X86TargetObjectFile.h
test/CodeGen/X86/no-cfi.ll [new file with mode: 0644]

index 493526aa7f3820ee6261d4d59248b69c82066631..829f580df33d74bc9db16ce05cfa12daea9da029 100644 (file)
@@ -188,7 +188,7 @@ public:
 
   virtual unsigned getPersonalityEncoding() const;
   virtual unsigned getLSDAEncoding() const;
 
   virtual unsigned getPersonalityEncoding() const;
   virtual unsigned getLSDAEncoding() const;
-  virtual unsigned getFDEEncoding() const;
+  virtual unsigned getFDEEncoding(bool CFI) const;
   virtual unsigned getTTypeEncoding() const;
 };
 
   virtual unsigned getTTypeEncoding() const;
 };
 
index ea2af78eb4e6be60ee13f71e3abe86954357fc2f..3bbcf3eb6ed06ebe4ea0f145d9a60719d588ea89 100644 (file)
@@ -281,8 +281,8 @@ namespace llvm {
     //
     // This emits the frame info section.
     //
     //
     // This emits the frame info section.
     //
-    static void Emit(MCStreamer &streamer);
-    static void EmitDarwin(MCStreamer &streamer);
+    static void Emit(MCStreamer &streamer, bool usingCFI);
+    static void EmitDarwin(MCStreamer &streamer, bool usingCFI);
     static void EmitAdvanceLoc(MCStreamer &Streamer, uint64_t AddrDelta);
     static void EncodeAdvanceLoc(uint64_t AddrDelta, raw_ostream &OS,
                                  const TargetAsmInfo &AsmInfo);
     static void EmitAdvanceLoc(MCStreamer &Streamer, uint64_t AddrDelta);
     static void EncodeAdvanceLoc(uint64_t AddrDelta, raw_ostream &OS,
                                  const TargetAsmInfo &AsmInfo);
index f469cbb02c594d9f4d638a652266f6f0e658f5c4..0271b670464e4f9998107114f91366d111513dbc 100644 (file)
@@ -58,8 +58,8 @@ public:
     return TLOF->getEHFrameSection();
   }
 
     return TLOF->getEHFrameSection();
   }
 
-  unsigned getFDEEncoding() const {
-    return TLOF->getFDEEncoding();
+  unsigned getFDEEncoding(bool CFI) const {
+    return TLOF->getFDEEncoding(CFI);
   }
 
   bool isFunctionEHFrameSymbolPrivate() const {
   }
 
   bool isFunctionEHFrameSymbolPrivate() const {
index 360f3ceb2ab4094c8663b17ce1dde985b482702b..7402ed697232f542689e73ffa8c4a433f6e67b86 100644 (file)
@@ -233,7 +233,7 @@ public:
   
   virtual unsigned getPersonalityEncoding() const;
   virtual unsigned getLSDAEncoding() const;
   
   virtual unsigned getPersonalityEncoding() const;
   virtual unsigned getLSDAEncoding() const;
-  virtual unsigned getFDEEncoding() const;
+  virtual unsigned getFDEEncoding(bool CFI) const;
   virtual unsigned getTTypeEncoding() const;
 
 protected:
   virtual unsigned getTTypeEncoding() const;
 
 protected:
index 751901183cd0bf8496fc76b8929b5f5cf7ba1bb5..b50d8bd3cecc57a1b98cc8170b47d40f56b3e5aa 100644 (file)
@@ -92,7 +92,7 @@ void DwarfTableException::EmitCIE(const Function *PersonalityFn, unsigned Index)
   // personality function reference:
 
   unsigned LSDAEncoding = TLOF.getLSDAEncoding();
   // personality function reference:
 
   unsigned LSDAEncoding = TLOF.getLSDAEncoding();
-  unsigned FDEEncoding = TLOF.getFDEEncoding();
+  unsigned FDEEncoding = TLOF.getFDEEncoding(false);
   unsigned PerEncoding = TLOF.getPersonalityEncoding();
 
   char Augmentation[6] = { 0 };
   unsigned PerEncoding = TLOF.getPersonalityEncoding();
 
   char Augmentation[6] = { 0 };
@@ -168,7 +168,7 @@ void DwarfTableException::EmitFDE(const FunctionEHFrameInfo &EHFrameInfo) {
   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
 
   unsigned LSDAEncoding = TLOF.getLSDAEncoding();
   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
 
   unsigned LSDAEncoding = TLOF.getLSDAEncoding();
-  unsigned FDEEncoding = TLOF.getFDEEncoding();
+  unsigned FDEEncoding = TLOF.getFDEEncoding(false);
 
   Asm->OutStreamer.SwitchSection(TLOF.getEHFrameSection());
 
 
   Asm->OutStreamer.SwitchSection(TLOF.getEHFrameSection());
 
index aff33aa9d5107418024b3672b0853b5fbe635e52..6ed91b09966ea86f60806adec5c5b1f8cff05930 100644 (file)
@@ -879,7 +879,7 @@ unsigned TargetLoweringObjectFileMachO::getLSDAEncoding() const {
   return DW_EH_PE_pcrel;
 }
 
   return DW_EH_PE_pcrel;
 }
 
-unsigned TargetLoweringObjectFileMachO::getFDEEncoding() const {
+unsigned TargetLoweringObjectFileMachO::getFDEEncoding(bool CFI) const {
   return DW_EH_PE_pcrel;
 }
 
   return DW_EH_PE_pcrel;
 }
 
index 8f9209d67f01696acf837615aad27d3019c1cfa7..9717c016a92b49816a25eb3695d9ea4e783b77e4 100644 (file)
@@ -1069,6 +1069,9 @@ void MCAsmStreamer::Finish() {
   // Dump out the dwarf file & directory tables and line tables.
   if (getContext().hasDwarfFiles() && !UseLoc)
     MCDwarfFileTable::Emit(this);
   // Dump out the dwarf file & directory tables and line tables.
   if (getContext().hasDwarfFiles() && !UseLoc)
     MCDwarfFileTable::Emit(this);
+
+  if (getNumFrameInfos() && !UseCFI)
+    MCDwarfFrameEmitter::Emit(*this, false);
 }
 
 MCStreamer *llvm::createAsmStreamer(MCContext &Context,
 }
 
 MCStreamer *llvm::createAsmStreamer(MCContext &Context,
index 09a87fb0bfdcc430d754df6e088a1a82aeff9554..f61f0c24cf6c305872bc61f62b543599e09dc7e4 100644 (file)
@@ -500,9 +500,11 @@ namespace {
   class FrameEmitterImpl {
     int CFAOffset;
     int CIENum;
   class FrameEmitterImpl {
     int CFAOffset;
     int CIENum;
+    bool UsingCFI;
 
   public:
 
   public:
-    FrameEmitterImpl() : CFAOffset(0), CIENum(0) {
+    FrameEmitterImpl(bool usingCFI) : CFAOffset(0), CIENum(0),
+                     UsingCFI(usingCFI) {
     }
 
     const MCSymbol &EmitCIE(MCStreamer &streamer,
     }
 
     const MCSymbol &EmitCIE(MCStreamer &streamer,
@@ -702,7 +704,7 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,
     streamer.EmitIntValue(lsdaEncoding, 1);
   }
   // Encoding of the FDE pointers
     streamer.EmitIntValue(lsdaEncoding, 1);
   }
   // Encoding of the FDE pointers
-  streamer.EmitIntValue(asmInfo.getFDEEncoding(), 1);
+  streamer.EmitIntValue(asmInfo.getFDEEncoding(UsingCFI), 1);
 
   // Initial Instructions
 
 
   // Initial Instructions
 
@@ -753,7 +755,7 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
   const MCExpr *offset = MakeStartMinusEndExpr(streamer, cieStart, *fdeStart,
                                                0);
   streamer.EmitAbsValue(offset, 4);
   const MCExpr *offset = MakeStartMinusEndExpr(streamer, cieStart, *fdeStart,
                                                0);
   streamer.EmitAbsValue(offset, 4);
-  unsigned fdeEncoding = asmInfo.getFDEEncoding();
+  unsigned fdeEncoding = asmInfo.getFDEEncoding(UsingCFI);
   unsigned size = getSizeForEncoding(streamer, fdeEncoding);
 
   // PC Begin
   unsigned size = getSizeForEncoding(streamer, fdeEncoding);
 
   // PC Begin
@@ -837,8 +839,9 @@ namespace llvm {
 // compatible with the one in CodeGen. It is useful during the transition
 // to make it easy to compare the outputs, but should probably be removed
 // afterwards.
 // compatible with the one in CodeGen. It is useful during the transition
 // to make it easy to compare the outputs, but should probably be removed
 // afterwards.
-void MCDwarfFrameEmitter::EmitDarwin(MCStreamer &streamer) {
-  FrameEmitterImpl Emitter;
+void MCDwarfFrameEmitter::EmitDarwin(MCStreamer &streamer,
+                                     bool usingCFI) {
+  FrameEmitterImpl Emitter(usingCFI);
   DenseMap<const MCSymbol*, const MCSymbol*> Personalities;
   const MCSymbol *aCIE = NULL;
   const MCDwarfFrameInfo *aFrame = NULL;
   DenseMap<const MCSymbol*, const MCSymbol*> Personalities;
   const MCSymbol *aCIE = NULL;
   const MCDwarfFrameInfo *aFrame = NULL;
@@ -892,17 +895,18 @@ void MCDwarfFrameEmitter::EmitDarwin(MCStreamer &streamer) {
     streamer.EmitLabel(fdeEnd);
 }
 
     streamer.EmitLabel(fdeEnd);
 }
 
-void MCDwarfFrameEmitter::Emit(MCStreamer &streamer) {
+void MCDwarfFrameEmitter::Emit(MCStreamer &streamer,
+                               bool usingCFI) {
   const MCContext &context = streamer.getContext();
   const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
   if (!asmInfo.isFunctionEHFrameSymbolPrivate()) {
   const MCContext &context = streamer.getContext();
   const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
   if (!asmInfo.isFunctionEHFrameSymbolPrivate()) {
-    EmitDarwin(streamer);
+    EmitDarwin(streamer, usingCFI);
     return;
   }
 
   MCSymbol *fdeEnd = NULL;
   DenseMap<CIEKey, const MCSymbol*> CIEStarts;
     return;
   }
 
   MCSymbol *fdeEnd = NULL;
   DenseMap<CIEKey, const MCSymbol*> CIEStarts;
-  FrameEmitterImpl Emitter;
+  FrameEmitterImpl Emitter(usingCFI);
 
   for (unsigned i = 0, n = streamer.getNumFrameInfos(); i < n; ++i) {
     const MCDwarfFrameInfo &frame = streamer.getFrameInfo(i);
 
   for (unsigned i = 0, n = streamer.getNumFrameInfos(); i < n; ++i) {
     const MCDwarfFrameInfo &frame = streamer.getFrameInfo(i);
index 9fc9173914d2da06a739d955b254466b3a5365c3..be8e2e3891fed11142b4a66f27edf0aa4d7d1c7b 100644 (file)
@@ -346,7 +346,7 @@ void MCELFStreamer::EmitInstToData(const MCInst &Inst) {
 
 void MCELFStreamer::Finish() {
   if (getNumFrameInfos())
 
 void MCELFStreamer::Finish() {
   if (getNumFrameInfos())
-    MCDwarfFrameEmitter::Emit(*this);
+    MCDwarfFrameEmitter::Emit(*this, true);
 
   for (std::vector<LocalCommon>::const_iterator i = LocalCommons.begin(),
                                                 e = LocalCommons.end();
 
   for (std::vector<LocalCommon>::const_iterator i = LocalCommons.begin(),
                                                 e = LocalCommons.end();
index 325493db25d2e42569b74c812556d2ccb9f046a8..717ad4122013d75461a0bce437c1ad56a63b403a 100644 (file)
@@ -350,7 +350,7 @@ unsigned TargetLoweringObjectFile::getLSDAEncoding() const {
   return dwarf::DW_EH_PE_absptr;
 }
 
   return dwarf::DW_EH_PE_absptr;
 }
 
-unsigned TargetLoweringObjectFile::getFDEEncoding() const {
+unsigned TargetLoweringObjectFile::getFDEEncoding(bool CFI) const {
   return dwarf::DW_EH_PE_absptr;
 }
 
   return dwarf::DW_EH_PE_absptr;
 }
 
index b32fe798392a0de19a608d892e6f6a2443ef7ff3..f4adeb5ab699d2a6f58441e19d62c66c7725f183 100644 (file)
@@ -58,7 +58,7 @@ unsigned X8632_ELFTargetObjectFile::getLSDAEncoding() const {
     return DW_EH_PE_absptr;
 }
 
     return DW_EH_PE_absptr;
 }
 
-unsigned X8632_ELFTargetObjectFile::getFDEEncoding() const {
+unsigned X8632_ELFTargetObjectFile::getFDEEncoding(bool FDE) const {
   if (TM.getRelocationModel() == Reloc::PIC_)
     return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
   else
   if (TM.getRelocationModel() == Reloc::PIC_)
     return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
   else
@@ -97,8 +97,15 @@ unsigned X8664_ELFTargetObjectFile::getLSDAEncoding() const {
   return DW_EH_PE_absptr;
 }
 
   return DW_EH_PE_absptr;
 }
 
-unsigned X8664_ELFTargetObjectFile::getFDEEncoding() const {
-  return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
+unsigned X8664_ELFTargetObjectFile::getFDEEncoding(bool CFI) const {
+  if (CFI)
+    return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
+
+  CodeModel::Model Model = TM.getCodeModel();
+  if (TM.getRelocationModel() == Reloc::PIC_)
+    return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
+
+  return DW_EH_PE_udata4;
 }
 
 unsigned X8664_ELFTargetObjectFile::getTTypeEncoding() const {
 }
 
 unsigned X8664_ELFTargetObjectFile::getTTypeEncoding() const {
index e7ed014f12e1149798da1a2e2a3d7003f93db2f9..e21b5bffd0594eaab2a442dd1e2752124178b9b8 100644 (file)
@@ -40,7 +40,7 @@ namespace llvm {
       :TM(tm) { }
     virtual unsigned getPersonalityEncoding() const;
     virtual unsigned getLSDAEncoding() const;
       :TM(tm) { }
     virtual unsigned getPersonalityEncoding() const;
     virtual unsigned getLSDAEncoding() const;
-    virtual unsigned getFDEEncoding() const;
+    virtual unsigned getFDEEncoding(bool CFI) const;
     virtual unsigned getTTypeEncoding() const;
   };
 
     virtual unsigned getTTypeEncoding() const;
   };
 
@@ -51,7 +51,7 @@ namespace llvm {
       :TM(tm) { }
     virtual unsigned getPersonalityEncoding() const;
     virtual unsigned getLSDAEncoding() const;
       :TM(tm) { }
     virtual unsigned getPersonalityEncoding() const;
     virtual unsigned getLSDAEncoding() const;
-    virtual unsigned getFDEEncoding() const;
+    virtual unsigned getFDEEncoding(bool CFI) const;
     virtual unsigned getTTypeEncoding() const;
   };
 
     virtual unsigned getTTypeEncoding() const;
   };
 
diff --git a/test/CodeGen/X86/no-cfi.ll b/test/CodeGen/X86/no-cfi.ll
new file mode 100644 (file)
index 0000000..f9985d4
--- /dev/null
@@ -0,0 +1,38 @@
+; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -disable-cfi | FileCheck --check-prefix=STATIC %s
+; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -disable-cfi -relocation-model=pic | FileCheck --check-prefix=PIC %s
+
+; STATIC:      .ascii   "zPLR"
+; STATIC:      .byte   3
+; STATIC-NEXT: .long   __gxx_personality_v0
+; STATIC-NEXT: .byte   3
+; STATIC-NEXT: .byte   3
+
+; PIC:      .ascii   "zPLR"
+; PIC:      .byte   155
+; PIC-NEXT: .L
+; PIC-NEXT: .long   DW.ref.__gxx_personality_v0-.L
+; PIC-NEXT: .byte   27
+; PIC-NEXT: .byte   27
+
+
+define void @bar() {
+entry:
+  %call = invoke i32 @foo()
+          to label %invoke.cont unwind label %lpad
+
+invoke.cont:
+  ret void
+
+lpad:
+  %exn = call i8* @llvm.eh.exception() nounwind
+  %eh.selector = call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* %exn, i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*), i8* null) nounwind
+  ret void
+}
+
+declare i32 @foo()
+
+declare i8* @llvm.eh.exception() nounwind readonly
+
+declare i32 @__gxx_personality_v0(...)
+
+declare i32 @llvm.eh.selector(i8*, i8*, ...) nounwind