aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2012-08-12 08:09:45 +0000
committerNick Lewycky <nicholas@mxc.ca>2012-08-12 08:09:45 +0000
commit0c5602de8c0dfa716f54306a1c540b98ab803584 (patch)
tree34442be29c0cad8742592665d1faefcfe69baeb2
parent2c63d5e8c23cc60859130ead8e3b203d3cdda346 (diff)
downloadexternal_llvm-0c5602de8c0dfa716f54306a1c540b98ab803584.zip
external_llvm-0c5602de8c0dfa716f54306a1c540b98ab803584.tar.gz
external_llvm-0c5602de8c0dfa716f54306a1c540b98ab803584.tar.bz2
When emitting the PC range in an FDE, use the same data encoding for both ends
of the range. Fixes PR13581! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161739 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/MC/MCDwarf.cpp15
-rw-r--r--test/MC/ELF/fde.s28
2 files changed, 34 insertions, 9 deletions
diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp
index 722779a..4c63e43 100644
--- a/lib/MC/MCDwarf.cpp
+++ b/lib/MC/MCDwarf.cpp
@@ -1294,20 +1294,17 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
streamer.EmitSymbolValue(&cieStart, 4);
}
- unsigned fdeEncoding = MOFI->getFDEEncoding(UsingCFI);
- unsigned size = getSizeForEncoding(streamer, fdeEncoding);
-
// PC Begin
- unsigned PCBeginEncoding = IsEH ? fdeEncoding :
- (unsigned)dwarf::DW_EH_PE_absptr;
- unsigned PCBeginSize = getSizeForEncoding(streamer, PCBeginEncoding);
- EmitSymbol(streamer, *frame.Begin, PCBeginEncoding, "FDE initial location");
+ unsigned PCEncoding = IsEH ? MOFI->getFDEEncoding(UsingCFI)
+ : (unsigned)dwarf::DW_EH_PE_absptr;
+ unsigned PCSize = getSizeForEncoding(streamer, PCEncoding);
+ EmitSymbol(streamer, *frame.Begin, PCEncoding, "FDE initial location");
// PC Range
const MCExpr *Range = MakeStartMinusEndExpr(streamer, *frame.Begin,
*frame.End, 0);
if (verboseAsm) streamer.AddComment("FDE address range");
- streamer.EmitAbsValue(Range, size);
+ streamer.EmitAbsValue(Range, PCSize);
if (IsEH) {
// Augmentation Data Length
@@ -1330,7 +1327,7 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
EmitCFIInstructions(streamer, frame.Instructions, frame.Begin);
// Padding
- streamer.EmitValueToAlignment(PCBeginSize);
+ streamer.EmitValueToAlignment(PCSize);
return fdeEnd;
}
diff --git a/test/MC/ELF/fde.s b/test/MC/ELF/fde.s
new file mode 100644
index 0000000..b7fa48b
--- /dev/null
+++ b/test/MC/ELF/fde.s
@@ -0,0 +1,28 @@
+# RUN: llvm-mc -filetype=obj %s -o %t.o && llvm-objdump -s %t.o
+# PR13581
+
+# CHECK: Contents of section .debug_frame:
+# CHECK-NEXT: 0000 14000000 ffffffff 01000178 100c0708 ...........x....
+# CHECK-NEXT: 0010 90010000 00000000 1c000000 00000000 ................
+# CHECK-NEXT: 0020 00000000 00000000 11000000 00000000 ................
+# CHECK-NEXT: 0030 410e1086 02430d06 A....C..
+
+__cxx_global_var_init: # @__cxx_global_var_init
+ .cfi_startproc
+.Lfunc_begin0:
+# BB#0: # %entry
+ pushq %rbp
+.Ltmp2:
+ .cfi_def_cfa_offset 16
+.Ltmp3:
+ .cfi_offset %rbp, -16
+ movq %rsp, %rbp
+.Ltmp4:
+ .cfi_def_cfa_register %rbp
+.Ltmp5:
+ callq _Z2rsv@PLT
+ movl %eax, _ZL1i(%rip)
+ popq %rbp
+ ret
+ .cfi_endproc
+ .cfi_sections .debug_frame