aboutsummaryrefslogtreecommitdiff
path: root/lib/std/debug.zig
diff options
context:
space:
mode:
Diffstat (limited to 'lib/std/debug.zig')
-rw-r--r--lib/std/debug.zig15
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/std/debug.zig b/lib/std/debug.zig
index 5c6043c8c3..5e44214753 100644
--- a/lib/std/debug.zig
+++ b/lib/std/debug.zig
@@ -825,8 +825,19 @@ const StackIterator = union(enum) {
// in our caller's frame and above.
return .{ .di = .init(&.current()) };
}
- flushSparcWindows();
- return .{ .fp = @frameAddress() };
+ return .{
+ // On SPARC, the frame pointer will point to the previous frame's save area,
+ // meaning we will read the previous return address and thus miss a frame.
+ // Instead, start at the stack pointer so we get the return address from the
+ // current frame's save area. The addition of the stack bias cannot fail here
+ // since we know we have a valid stack pointer.
+ .fp = if (native_arch.isSPARC()) sp: {
+ flushSparcWindows();
+ break :sp asm (""
+ : [_] "={o6}" (-> usize),
+ ) + stack_bias;
+ } else @frameAddress(),
+ };
}
fn deinit(si: *StackIterator) void {
switch (si.*) {