aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/std/debug.zig10
1 files changed, 9 insertions, 1 deletions
diff --git a/lib/std/debug.zig b/lib/std/debug.zig
index 6083939bde..13dd03d16d 100644
--- a/lib/std/debug.zig
+++ b/lib/std/debug.zig
@@ -190,7 +190,15 @@ pub inline fn getContext(context: *ThreadContext) bool {
}
const result = have_getcontext and os.system.getcontext(context) == 0;
- if (native_os == .macos) assert(context.mcsize == @sizeOf(std.c.mcontext_t));
+ if (native_os == .macos) {
+ assert(context.mcsize == @sizeOf(std.c.mcontext_t));
+
+ // On aarch64-macos, the system getcontext doesn't write anything into the pc
+ // register slot, it only writes lr. This makes the context consistent with
+ // other aarch64 getcontext implementations which write the current lr
+ // (where getcontext will return to) into both the lr and pc slot of the context.
+ if (native_arch == .aarch64) context.mcontext.ss.pc = context.mcontext.ss.lr;
+ }
return result;
}