From 2b5306a94b0c2bf83f10e4634cec77a19dd2e08d Mon Sep 17 00:00:00 2001 From: Lukas Lalinsky Date: Thu, 9 Oct 2025 08:52:52 +0200 Subject: [PATCH] Add missing clobbers to context switching This only shows in release mode, the compiler tries to preserve some value in rdi, but that gets replaced inside the fiber. This would not happen in the C calling convention, but in these normal Zig functions, it can happen. --- lib/std/Io/EventLoop.zig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/std/Io/EventLoop.zig b/lib/std/Io/EventLoop.zig index d1d7799907..4cb5745e31 100644 --- a/lib/std/Io/EventLoop.zig +++ b/lib/std/Io/EventLoop.zig @@ -644,6 +644,7 @@ inline fn contextSwitch(message: *const SwitchMessage) *const SwitchMessage { : [received_message] "={x1}" (-> *const @FieldType(SwitchMessage, "contexts")), : [message_to_send] "{x1}" (&message.contexts), : .{ + .x0 = true, .x1 = true, .x2 = true, .x3 = true, @@ -745,6 +746,7 @@ inline fn contextSwitch(message: *const SwitchMessage) *const SwitchMessage { .rdx = true, .rbx = true, .rsi = true, + .rdi = true, .r8 = true, .r9 = true, .r10 = true,