summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Seaborn <mseaborn@chromium.org>2014-01-27 22:38:14 +0000
committerMark Seaborn <mseaborn@chromium.org>2014-01-27 22:38:14 +0000
commit66aefa805b0c0be252bf092816464eec566b713b (patch)
tree8ed88ff34d61f3f4009242ee906dbf3724014661
parent410f38e01597120b41e406ec1cea69127463f9e5 (diff)
downloadllvm-66aefa805b0c0be252bf092816464eec566b713b.tar.gz
llvm-66aefa805b0c0be252bf092816464eec566b713b.tar.bz2
llvm-66aefa805b0c0be252bf092816464eec566b713b.tar.xz
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200255 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp10
-rw-r--r--test/MC/ARM/dwarf-cfi-initial-state.s16
2 files changed, 24 insertions, 2 deletions
diff --git a/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp b/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
index 2d7c25f31d..4581f41130 100644
--- a/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
+++ b/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
@@ -212,10 +212,16 @@ static MCRegisterInfo *createARMMCRegisterInfo(StringRef Triple) {
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,
diff --git a/test/MC/ARM/dwarf-cfi-initial-state.s b/test/MC/ARM/dwarf-cfi-initial-state.s
new file mode 100644
index 0000000000..2d638e9c4b
--- /dev/null
+++ b/test/MC/ARM/dwarf-cfi-initial-state.s
@@ -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