When emitting the PC range in an FDE, use the same data encoding for both ends

of the range. Fixes PR13581!

llvm-svn: 161739
This commit is contained in:
Nick Lewycky 2012-08-12 08:09:45 +00:00
parent 3d2b271362
commit 333449cd65
2 changed files with 34 additions and 9 deletions

View File

@ -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;
}

28
llvm/test/MC/ELF/fde.s Normal file
View File

@ -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