commit d8cb8b7baec1ed3e3457486b35d64bdae9904ab4 (tree)
parent c13355abda21e90443ae9ea59706e491111a8bcb
Author: Alex Rønne Petersen <alex@alexrp.com>
Date: Mon, 20 Oct 2025 03:45:20 +0200
std.debug: fix FP unwinding for hppa/hppa64
Diffstat:
1 file changed, 10 insertions(+), 0 deletions(-)
diff --git a/lib/std/debug.zig b/lib/std/debug.zig
@@ -994,6 +994,11 @@ const StackIterator = union(enum) {
/// Offset of the saved base pointer (previous frame pointer) wrt the frame pointer.
const fp_to_bp_offset = off: {
+ // On 32-bit PA-RISC, the base pointer is the final word of the frame marker.
+ if (native_arch == .hppa) break :off -1 * @sizeOf(usize);
+ // On 64-bit PA-RISC, the frame marker was shrunk significantly; now there's just the return
+ // address followed by the base pointer.
+ if (native_arch == .hppa64) break :off -1 * @sizeOf(usize);
// On LoongArch and RISC-V, the frame pointer points to the top of the saved register area,
// in which the base pointer is the first word.
if (native_arch.isLoongArch() or native_arch.isRISCV()) break :off -2 * @sizeOf(usize);
@@ -1008,6 +1013,11 @@ const StackIterator = union(enum) {
/// Offset of the saved return address wrt the frame pointer.
const fp_to_ra_offset = off: {
+ // On 32-bit PA-RISC, the return address sits in the middle-ish of the frame marker.
+ if (native_arch == .hppa) break :off -5 * @sizeOf(usize);
+ // On 64-bit PA-RISC, the frame marker was shrunk significantly; now there's just the return
+ // address followed by the base pointer.
+ if (native_arch == .hppa64) break :off -2 * @sizeOf(usize);
// On LoongArch and RISC-V, the frame pointer points to the top of the saved register area,
// in which the return address is the second word.
if (native_arch.isLoongArch() or native_arch.isRISCV()) break :off -1 * @sizeOf(usize);