From fcac8617b4e3c8fcb3a8c888fe77fa8bff1c2057 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 d1d7799907d00b315576a4c2acf32b886989d86c..4cb5745e31abf6c9570c0cff0d15be71b8c14a2f 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, -- 2.54.0