[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