https://sourceware.org/bugzilla/show_bug.cgi?id=33131
--- Comment #2 from Indu Bhagat <indu.bhagat at oracle dot com> ---
Confirmed.
objdump also hits the same assertion.
$ gdb --args objdump --sframe libffi_convenience.a
...
Breakpoint 2, sframe_decoder_get_fre (ctx=0x72cbd0, func_idx=0, fre_idx=33,
fre=0x7fffffffd980)
at <src>/binutils-gdb/binutils-gdb/libsframe/sframe.c:1267
1267 sframe_assert (fre->fre_start_addr < fdep->sfde_func_size);
1: fre->fre_start_addr = 255
2: fdep->sfde_func_size = 255
The offending function is in win64.o:
0000000000000000 <ffi_call_win64>:
0: 48 8b 04 24 mov (%rsp),%rax
4: 48 89 2e mov %rbp,(%rsi)
7: 48 89 46 08 mov %rax,0x8(%rsi)
...
fd: c9 leave
fe: c3 ret
ff: 90 nop
00000018 000000000000009c 00000000 FDE cie=00000000
pc=0000000000000000..00000000000000ff
DW_CFA_advance_loc: 14 to 000000000000000e
DW_CFA_def_cfa: r6 (rbp) ofs 16
DW_CFA_offset: r6 (rbp) at cfa-16
DW_CFA_advance_loc1: 83 to 0000000000000061
DW_CFA_remember_state
DW_CFA_def_cfa: r7 (rsp) ofs 8
DW_CFA_restore: r6 (rbp)
...
DW_CFA_advance_loc: 9 to 00000000000000fe
DW_CFA_remember_state
DW_CFA_def_cfa: r7 (rsp) ofs 8
DW_CFA_restore: r6 (rbp)
DW_CFA_advance_loc: 1 to 00000000000000ff
DW_CFA_restore_state
DW_CFA_nop
(See how the size of the function is 0xff and the last advance_loc location is
also 0xff.
Looking at gcc/libffi/src/x86/win64.S, I see that the CFIs involved here are
.cfi_restore_state and .cfi_endproc in the src.
.globl ffi_call_win64
.hidden ffi_call_win64
ffi_call_win64:
.cfi_startproc
endbr64
...
.align 8
99: call abort@PLT
leaveq; .cfi_remember_state; .cfi_def_cfa %rsp, 8; .cfi_restore %rbp; ret;
.cfi_restore_state
.cfi_endproc
We could update the assertion in libsframe to not be so uptight, the nop is
unreachable code. If gas permits this sequence, SFrame will need to allow too
I guess...
--
You are receiving this mail because:
You are on the CC list for the bug.