mirror of
https://github.com/ziglang/zig.git
synced 2024-12-03 10:28:48 +00:00
std.debug.StackIterator: account for SPARC %fp quirk
On SPARC, previous %fp is saved with a 14 slots offset from current %fp+bias. Also account for the bias constant at the new_fp calculation.
This commit is contained in:
parent
2d447b57cc
commit
1eb2e48014
@ -366,8 +366,18 @@ pub const StackIterator = struct {
|
||||
// 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)
|
||||
@ -394,7 +404,7 @@ pub const StackIterator = struct {
|
||||
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.
|
||||
|
Loading…
Reference in New Issue
Block a user