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 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