std.debug: fix incorrect FP unwinding on RISC-V and SPARC

I broke this when porting this logic for the `std.debug` rework in
https://github.com/ziglang/zig/pull/25227. The offset that I copied was
actually being treated as relative to the address of the *saved* base
pointer. I think it makes more sense to do what I did and just treat all
offsets as relative to this frame's base.
This commit is contained in:
mlugg 2025-10-09 14:14:19 +01:00 committed by Matthew Lugg
parent c383cd50d5
commit 80f6b8c4b3

View File

@ -993,6 +993,8 @@ const StackIterator = union(enum) {
/// Offset of the saved return address wrt the frame pointer.
const ra_offset = off: {
if (native_arch.isRISCV()) break :off -1 * @sizeOf(usize);
if (native_arch.isSPARC()) break :off 15 * @sizeOf(usize);
if (native_arch.isPowerPC64()) break :off 2 * @sizeOf(usize);
// On s390x, r14 is the link register and we need to grab it from its customary slot in the
// register save area (ELF ABI s390x Supplement §1.2.2.2).