diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-03-04 18:23:11 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-03-04 18:23:11 -0700 |
| commit | bccef441963434b452a623abbb9315fd92c1e255 (patch) | |
| tree | 4c0ea89b8fa895b3d34749ec089e45438d79466b /lib/std/debug.zig | |
| parent | 0c06a1885fad9a9bb85342632a0b7c8a3a0733e9 (diff) | |
| parent | 041212a41cfaf029dc3eb9740467b721c76f406c (diff) | |
| download | zig-bccef441963434b452a623abbb9315fd92c1e255.tar.gz zig-bccef441963434b452a623abbb9315fd92c1e255.zip | |
Merge remote-tracking branch 'origin/master' into llvm12
Syncing with master branch because I want to re-run
update_clang_options.zig in the llvm12 branch.
Diffstat (limited to 'lib/std/debug.zig')
| -rw-r--r-- | lib/std/debug.zig | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/lib/std/debug.zig b/lib/std/debug.zig index f32c1a6156..74fb95ffa8 100644 --- a/lib/std/debug.zig +++ b/lib/std/debug.zig @@ -360,14 +360,24 @@ pub const StackIterator = struct { }; } - // Negative offset of the saved BP wrt the frame pointer. + // Offset of the saved BP wrt the frame pointer. const fp_offset = if (builtin.arch.isRISCV()) // On RISC-V the frame pointer points to the top of the saved register // area, on pretty much every other architecture it points to the stack // slot where the previous frame pointer is saved. 2 * @sizeOf(usize) + else if (builtin.arch.isSPARC()) + // On SPARC the previous frame pointer is stored at 14 slots past %fp+BIAS. + 14 * @sizeOf(usize) else 0; + + const fp_bias = if (builtin.arch.isSPARC()) + // On SPARC frame pointers are biased by a constant. + 2047 + else + 0; + // Positive offset of the saved PC wrt the frame pointer. const pc_offset = if (builtin.arch == .powerpc64le) 2 * @sizeOf(usize) @@ -388,13 +398,17 @@ pub const StackIterator = struct { } fn next_internal(self: *StackIterator) ?usize { - const fp = math.sub(usize, self.fp, fp_offset) catch return null; + const fp = if (builtin.arch.isSPARC()) + // On SPARC the offset is positive. (!) + math.add(usize, self.fp, fp_offset) catch return null + else + math.sub(usize, self.fp, fp_offset) catch return null; // Sanity check. if (fp == 0 or !mem.isAligned(fp, @alignOf(usize))) return null; - const new_fp = @intToPtr(*const usize, fp).*; + const new_fp = math.add(usize, @intToPtr(*const usize, fp).*, fp_bias) catch return null; // Sanity check: the stack grows down thus all the parent frames must be // be at addresses that are greater (or equal) than the previous one. |
