[llvm] r200255 - ARM MC: Fix the initial DWARF CFI unwind info at the start of a function

Mark Seaborn mseaborn at chromium.org
Mon Jan 27 14:38:14 PST 2014


Author: mseaborn
Date: Mon Jan 27 16:38:14 2014
New Revision: 200255

URL: http://llvm.org/viewvc/llvm-project?rev=200255&view=rev
Log:
ARM MC: Fix the initial DWARF CFI unwind info at the start of a function

This brings MC into line with GNU 'as' on ARM, and it brings the ARM
target into line with most other LLVM targets, which declare the
initial CFI state with addInitialFrameState().

Without this, functions generated with .cfi_startproc/endproc on ARM
will tend to cause GDB to abort with:
  gdb/dwarf2-frame.c:1132: internal-error: Unknown CFA rule.

I've also tested this by comparing the output of "readelf -w" on the
object files produced by llvm-mc and gas when given the .s file added
here.

This change is part of addressing PR18636.

Differential Revision: http://llvm-reviews.chandlerc.com/D2597

Added:
    llvm/trunk/test/MC/ARM/dwarf-cfi-initial-state.s   (with props)
Modified:
    llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp

Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp?rev=200255&r1=200254&r2=200255&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp (original)
+++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp Mon Jan 27 16:38:14 2014
@@ -212,10 +212,16 @@ static MCRegisterInfo *createARMMCRegist
 static MCAsmInfo *createARMMCAsmInfo(const MCRegisterInfo &MRI, StringRef TT) {
   Triple TheTriple(TT);
 
+  MCAsmInfo *MAI;
   if (TheTriple.isOSBinFormatMachO())
-    return new ARMMCAsmInfoDarwin();
+    MAI = new ARMMCAsmInfoDarwin();
+  else
+    MAI = new ARMELFMCAsmInfo();
 
-  return new ARMELFMCAsmInfo();
+  unsigned Reg = MRI.getDwarfRegNum(ARM::SP, true);
+  MAI->addInitialFrameState(MCCFIInstruction::createDefCfa(0, Reg, 0));
+
+  return MAI;
 }
 
 static MCCodeGenInfo *createARMMCCodeGenInfo(StringRef TT, Reloc::Model RM,

Added: llvm/trunk/test/MC/ARM/dwarf-cfi-initial-state.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/dwarf-cfi-initial-state.s?rev=200255&view=auto
==============================================================================
--- llvm/trunk/test/MC/ARM/dwarf-cfi-initial-state.s (added)
+++ llvm/trunk/test/MC/ARM/dwarf-cfi-initial-state.s Mon Jan 27 16:38:14 2014
@@ -0,0 +1,16 @@
+# RUN: llvm-mc < %s -triple=armv7-linux-gnueabi -filetype=obj -o - \
+# RUN:     | llvm-dwarfdump - | FileCheck %s
+
+.cfi_sections .debug_frame
+.cfi_startproc
+bx lr
+.cfi_endproc
+
+# CHECK: .debug_frame contents:
+# CHECK: CIE
+# CHECK-NOT: DW_CFA
+# When llvm-dwarfdump prints the full info for the DW_CFA_def_cfa
+# field, we can check that here too.
+# CHECK: DW_CFA_def_cfa:
+# CHECK-NOT: DW_CFA
+# CHECK: FDE

Propchange: llvm/trunk/test/MC/ARM/dwarf-cfi-initial-state.s
------------------------------------------------------------------------------
    svn:eol-style = LF





More information about the llvm-commits mailing list