commit fcac8617b4e3c8fcb3a8c888fe77fa8bff1c2057 (tree)
parent 7d478114ec5ae74f977bf22050088a470f471721
Author: Lukas Lalinsky <lukas@lalinsky.com>
Date: Thu, 9 Oct 2025 08:52:52 +0200
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.
Diffstat:
1 file changed, 2 insertions(+), 0 deletions(-)
diff --git 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,