From 912fed338019487ec025ecbe3cd27134d75fe6e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Tue, 14 Oct 2025 09:52:10 +0200 Subject: [PATCH] std.debug: use the SP as the initial FP on SPARC The FP would point to the register save area for the previous frame, while the SP points to the register save area for the current frame. So use the latter. --- lib/std/debug.zig | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/std/debug.zig b/lib/std/debug.zig index 5c6043c8c3c29c8aa6d508225e03704f48f0d3cd..5e4421475371629e6a8fe90ee5dc95aff63b63b5 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.*) { -- 2.54.0