Change calculation of frame_id by amd64 epilogue unwinder
authorBruno Larsen <blarsen@redhat.com>
Fri, 19 Aug 2022 13:11:28 +0000 (15:11 +0200)
committerBruno Larsen <blarsen@redhat.com>
Fri, 21 Oct 2022 10:49:26 +0000 (12:49 +0200)
commit49d7cd733a7f1b87aa1d40318b3d7c2b65aca5ac
tree9b2192f62d8eb5eb4ed79e94aaf23b6f833833d8
parent7c0cca765e4630a5b3b8df285c7b0f90b6cb41cc
Change calculation of frame_id by amd64 epilogue unwinder

When GDB is stopped at a ret instruction and no debug information is
available for unwinding, GDB defaults to the amd64 epilogue unwinder, to
be able to generate a decent backtrace. However, when calculating the
frame id, the epilogue unwinder generates information as if the return
instruction was the whole frame.

This was an issue especially when attempting to reverse debug, as GDB
would place a step_resume_breakpoint from the epilogue of a function if
we were to attempt to skip that function, and this breakpoint should
ideally have the current function's frame_id to avoid other problems
such as PR record/16678.

This commit changes the frame_id calculation for the amd64 epilogue,
so that it is always the same as the dwarf2 unwinder's frame_id.

It also adds a test to confirm that the frame_id will be the same,
regardless of using the epilogue unwinder or not, thanks to Andrew
Burgess.

Co-Authored-By: Andrew Burgess <aburgess@redhat.com>
gdb/amd64-tdep.c
gdb/testsuite/gdb.base/unwind-on-each-insn-foo.c [new file with mode: 0644]
gdb/testsuite/gdb.base/unwind-on-each-insn.c [new file with mode: 0644]
gdb/testsuite/gdb.base/unwind-on-each-insn.exp [new file with mode: 0644]