From 5e6a1919c730f7c3ad27b9e5c3ddc8938fc2f43f Mon Sep 17 00:00:00 2001 From: mlugg Date: Wed, 3 Sep 2025 13:11:25 +0100 Subject: [PATCH] fix aarch64-macos DWARF unwinding turns out this isn't technically specific to that target at all; other targets just don't emit mid-function 'ret' instructions as much so certain CFI instruction patterns were only seen on aarch64. thanks to jacob for finding the bug <3 --- lib/std/debug/Dwarf/Unwind/VirtualMachine.zig | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/std/debug/Dwarf/Unwind/VirtualMachine.zig b/lib/std/debug/Dwarf/Unwind/VirtualMachine.zig index 66100f5eda..997af95cbd 100644 --- a/lib/std/debug/Dwarf/Unwind/VirtualMachine.zig +++ b/lib/std/debug/Dwarf/Unwind/VirtualMachine.zig @@ -48,7 +48,10 @@ const ColumnRange = struct { }; columns: std.ArrayList(Column) = .empty, -stack: std.ArrayList(ColumnRange) = .empty, +stack: std.ArrayList(struct { + cfa: Column, + columns: ColumnRange, +}) = .empty, current_row: Row = .{}, /// The result of executing the CIE's initial_instructions @@ -205,17 +208,21 @@ pub fn step( column.rule = .{ .register = i.target_register }; }, .remember_state => { - try self.stack.append(gpa, self.current_row.columns); + try self.stack.append(gpa, .{ + .cfa = self.current_row.cfa, + .columns = self.current_row.columns, + }); self.current_row.copy_on_write = true; }, .restore_state => { - const restored_columns = self.stack.pop() orelse return error.InvalidOperation; + const restored = self.stack.pop() orelse return error.InvalidOperation; self.columns.shrinkRetainingCapacity(self.columns.items.len - self.current_row.columns.len); - try self.columns.ensureUnusedCapacity(gpa, restored_columns.len); + try self.columns.ensureUnusedCapacity(gpa, restored.columns.len); + self.current_row.cfa = restored.cfa; self.current_row.columns.start = self.columns.items.len; - self.current_row.columns.len = restored_columns.len; - self.columns.appendSliceAssumeCapacity(self.columns.items[restored_columns.start..][0..restored_columns.len]); + self.current_row.columns.len = restored.columns.len; + self.columns.appendSliceAssumeCapacity(self.columns.items[restored.columns.start..][0..restored.columns.len]); }, .def_cfa => |i| { try self.resolveCopyOnWrite(gpa);