diff options
| author | Alex Rønne Petersen <alex@alexrp.com> | 2025-10-20 03:45:20 +0200 |
|---|---|---|
| committer | Alex Rønne Petersen <alex@alexrp.com> | 2025-10-23 19:34:02 +0200 |
| commit | d8cb8b7baec1ed3e3457486b35d64bdae9904ab4 (patch) | |
| tree | 2ec80c5925bc9f30f218925710a1cc0c38637c07 /lib/std/debug.zig | |
| parent | c13355abda21e90443ae9ea59706e491111a8bcb (diff) | |
| download | zig-d8cb8b7baec1ed3e3457486b35d64bdae9904ab4.tar.gz zig-d8cb8b7baec1ed3e3457486b35d64bdae9904ab4.zip | |
std.debug: fix FP unwinding for hppa/hppa64
Diffstat (limited to 'lib/std/debug.zig')
| -rw-r--r-- | lib/std/debug.zig | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/lib/std/debug.zig b/lib/std/debug.zig index 677630fbcf..57d6f45111 100644 --- 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); |
