[PATCH 3/4] [gdb/tdep, aarch64] Fix frame address of last insn in leaf function
Tom de Vries
tdevries@suse.de
Fri Jan 20 10:25:44 GMT 2023
On 1/19/23 11:46, Tom de Vries via Gdb-patches wrote:
> diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c
> index b576d3b9d99..06349353716 100644
> --- a/gdb/aarch64-tdep.c
> +++ b/gdb/aarch64-tdep.c
> @@ -996,7 +996,11 @@ aarch64_make_prologue_cache_1 (frame_info_ptr this_frame,
> if (unwound_fp == 0)
> return;
>
> - cache->prev_sp = unwound_fp + cache->framesize;
> + if (cache->framereg == AARCH64_SP_REGNUM
> + && get_frame_register_unsigned (this_frame, AARCH64_FP_REGNUM) == unwound_fp)
> + cache->prev_sp = unwound_fp;
> + else
> + cache->prev_sp = unwound_fp + cache->framesize;
>
> /* Calculate actual addresses of saved registers using offsets
> determined by aarch64_analyze_prologue. */
I came across the aarch64 version of stack_frame_destroyed_p, and
realized I can do the fix like this:
...
@@ -999,7 +1001,10 @@ aarch64_make_prologue_cache_1 (frame_info_ptr
this_frame,
if (unwound_fp == 0)
return;
- cache->prev_sp = unwound_fp + cache->framesize;
+ cache->prev_sp = unwound_fp;
+ if (!aarch64_stack_frame_destroyed_p (get_frame_arch (this_frame),
+ cache->prev_pc))
+ cache->prev_sp += cache->framesize;
/* Calculate actual addresses of saved registers using offsets
determined by aarch64_analyze_prologue. */
...
This fixes both the leaf and non-leaf case.
Thanks,
- Tom
More information about the Gdb-patches
mailing list