diff options
| author | Andrew Burgess <aburgess@redhat.com> | 2026-01-23 16:34:01 +0000 |
|---|---|---|
| committer | Andrew Burgess <aburgess@redhat.com> | 2026-03-05 17:45:29 +0000 |
| commit | e4fe38115fea0a9f357527959893f18ca8d51a03 (patch) | |
| tree | 838dfb91a6dab6a79535aa90d61b9e2c074cf97a /zlib/contrib/pascal/zlibpas.pas | |
| parent | 99d7dc93ce3a5bbcf30ac6715edf3fb3c0e92d94 (diff) | |
| download | fsf-binutils-gdb-master.zip fsf-binutils-gdb-master.tar.gz fsf-binutils-gdb-master.tar.bz2 | |
I noticed that gdb.FinishBreakpoint doesn't work if the parent
function is a tail call function. In bpfinishpy_init we use
get_frame_pc to find the address at which the finish breakpoint should
be placed within the previous frame.
However, if the previous frame is a tail call frame, then get_frame_pc
will return an address outside of the tail call function, an address
which will not be reached on the return path.
Unlike other recent tail call fixes I've made, we cannot switch to
using something like get_frame_address_in_block here as in the tail
call case this will return an address within the function, but not an
address that will be executed when we return.
What we need to do in the tail call case is create the finish
breakpoint in the frame that called the tail call function. Or if
that frame is itself a tail call, then we should walk back up the call
stack until we find a non-tail call function.
This can be achieved by adding a call to skip_tailcall_frames into
bpfinishpy_init after our existing call to get_prev_frame.
I've extended the existing test case to cover this additional
situation.
Approved-By: Tom Tromey <tom@tromey.com>
Diffstat (limited to 'zlib/contrib/pascal/zlibpas.pas')
0 files changed, 0 insertions, 0 deletions
