authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-10-18 22:49:08+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-10-18 22:49:08+02:00
log705a6b4efb7b19feb7d2ee86f2ac6e56653cb923
treeaee7300b340265badd4f57d5f1402b64f604e887
parent4812a98ce535e5c3f27c081b94153612cd4817ac
parent26500dafe53d1e4215adb411045d1680f75da685

Merge pull request '`std.debug.SelfInfo.MachO`: fix a few bugs' (#37318) from alexrp/zig:macos-unwind-stuff into master

Reviewed-on: https://codeberg.org/ziglang/zig/pulls/37318

2 files changed, 9 insertions(+), 7 deletions(-)

lib/std/debug/SelfInfo/MachO.zig+6-6
......@@ -417,7 +417,7 @@ fn unwindFrameInner(si: *SelfInfo, io: Io, context: *UnwindContext) !usize {
417417 const rules = try context.computeRules(gpa, dwarf, unwind.vmaddr_slide, encoding.value.arm64.dwarf);
418418 return context.next(gpa, &rules);
419419 },
420 .FRAME => ip: {
420 .FRAME, .FRAME_PAUTH_LR => ip: {
421421 const frame = encoding.value.arm64.frame;
422422
423423 const fp = (try dwarfRegNative(&context.cpu_state, fp_reg_num)).*;
......@@ -426,10 +426,10 @@ fn unwindFrameInner(si: *SelfInfo, io: Io, context: *UnwindContext) !usize {
426426 var reg_addr = fp - @sizeOf(usize);
427427 inline for (@typeInfo(@TypeOf(frame.x_reg_pairs)).@"struct".field_names, 0..) |field_name, i| {
428428 if (@field(frame.x_reg_pairs, field_name) != 0) {
429 (try dwarfRegNative(&context.cpu_state, 19 + i)).* = @as(*const usize, @ptrFromInt(reg_addr)).*;
430 reg_addr += @sizeOf(usize);
431 (try dwarfRegNative(&context.cpu_state, 20 + i)).* = @as(*const usize, @ptrFromInt(reg_addr)).*;
432 reg_addr += @sizeOf(usize);
429 (try dwarfRegNative(&context.cpu_state, 19 + i * 2)).* = @as(*const usize, @ptrFromInt(reg_addr)).*;
430 reg_addr -= @sizeOf(usize);
431 (try dwarfRegNative(&context.cpu_state, 20 + i * 2)).* = @as(*const usize, @ptrFromInt(reg_addr)).*;
432 reg_addr -= @sizeOf(usize);
433433 }
434434 }
435435
......@@ -437,7 +437,7 @@ fn unwindFrameInner(si: *SelfInfo, io: Io, context: *UnwindContext) !usize {
437437 // vector registers in the AArch64 `cpu_context` anyway, so there's no reason to
438438 // fail a legitimate unwind just because we're asked to restore the registers here.
439439 // If some weird/broken unwind info tells us to read them later, we will fail then.
440 reg_addr += 16 * @as(usize, @popCount(@as(u4, @bitCast(frame.d_reg_pairs))));
440 reg_addr -= 16 * @as(usize, @popCount(@as(u4, @bitCast(frame.d_reg_pairs))));
441441
442442 const new_ip = @as(*const usize, @ptrFromInt(ip_ptr)).*;
443443 const new_fp = @as(*const usize, @ptrFromInt(fp)).*;
lib/std/macho.zig+3-1
......@@ -2137,6 +2137,7 @@ pub const UNWIND_ARM64_MODE = enum(u4) {
21372137 FRAMELESS = 2,
21382138 DWARF = 3,
21392139 FRAME = 4,
2140 FRAME_PAUTH_LR = 5,
21402141};
21412142
21422143pub const UNWIND_ARM64_FRAME_X19_X20_PAIR: u32 = 0x00000001;
......@@ -2189,13 +2190,14 @@ pub const CompactUnwindEncoding = packed struct(u32) {
21892190 x25_x26: u1,
21902191 x27_x28: u1,
21912192 },
2193 unused: u3 = 0,
21922194 d_reg_pairs: packed struct(u4) {
21932195 d8_d9: u1,
21942196 d10_d11: u1,
21952197 d12_d13: u1,
21962198 d14_d15: u1,
21972199 },
2198 _: u15,
2200 _: u12,
21992201 },
22002202 frameless: packed struct(u24) {
22012203 _: u12 = 0,