Re: [PATCH v2 1/9] gdb: Generalize handling of the shadow stack pointer.

Thiago Jung Bauermann
2026-03-06T03:57:40Z

Thiago Jung Bauermann <thiago.bauermann@linaro.org> writes:

> Christina Schimpe <christina.schimpe@intel.com> writes:
>
>> +static bool
>> +amd64_linux_top_addr_empty_shadow_stack
>> + (gdbarch *gdbarch, const CORE_ADDR addr,
>> + const std::pair<CORE_ADDR, CORE_ADDR> range)
>> {
>> - if (regnum == gdbarch_pc_regnum (gdbarch))
>> - reg->how = DWARF2_FRAME_REG_RA;
>> - else if (regnum == gdbarch_sp_regnum (gdbarch))
>> - reg->how = DWARF2_FRAME_REG_CFA;
>> - else if (regnum == AMD64_PL3_SSP_REGNUM)
>> - {
>> - reg->how = DWARF2_FRAME_REG_FN;
>> - reg->loc.fn = amd64_linux_dwarf2_prev_ssp;
>> - }
>> + return addr == range.second;
>> }
>
> Next week I'll provide the AArch64 implementation of this hook,
> if you can squash it into your patch.

It turns out I had it in my notes for patch 6:

diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c
index 836af863d3ad..112d42c6a1ac 100644
--- a/gdb/aarch64-tdep.c
+++ b/gdb/aarch64-tdep.c
@@ -1909,6 +1909,23 @@ aarch64_pop_gcs_entry (regcache *regs)
regcache_cooked_write_unsigned (regs, tdep->gcs_reg_base, gcs_addr + 8);
}

+static bool
+aarch64_top_addr_empty_shadow_stack (gdbarch *gdbarch, const CORE_ADDR addr,
+ const std::pair<CORE_ADDR, CORE_ADDR> range)
+{
+ gdb_assert (addr >= range.first);
+
+ /* For AArch64, addr must be strictly less than the upper address in the
+ range, but other architectures allow it to be equal to the upper
+ address when the stack is empty so GDB core works with those addresses
+ and can send them our way. */
+ gdb_assert (addr <= range.second);
+
+ /* The GCS grows down, and the oldest entry isn't an address.
+ Just the value '0'. */
+ return addr >= range.second - 8;
+}
+
/* Implement the "push_dummy_call" gdbarch method. */

static CORE_ADDR
@@ -4790,7 +4807,12 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)

/* AArch64's shadow stack pointer is the GCSPR. */
if (tdep->has_gcs ())
- set_gdbarch_ssp_regnum (gdbarch, tdep->gcs_reg_base);
+ {
+ /* AArch64's shadow stack pointer is the GCSPR. */
+ set_gdbarch_ssp_regnum (gdbarch, tdep->gcs_reg_base);
+ set_gdbarch_top_addr_empty_shadow_stack
+ (gdbarch, aarch64_top_addr_empty_shadow_stack);
+ }

/* ABI */
set_gdbarch_short_bit (gdbarch, 16);

So with the above, for this patch:

Reviewed-by: Thiago Jung Bauermann <thiago.bauermann@linaro.org>

--
Thiago