authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-03-13 14:35:59-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-03-15 10:48:15-07:00
log149aa9afb7b57340c5dd7be8032b843fe439b668
tree040a961f8815117c5aba3b1617325d3fc3fe387b
parentbc79328dcf3a8653e26c7fe7b4cd8fc7fff6c421

add a workaround for miscompilation regarding alignment

See tracking issue #14904

1 files changed, 17 insertions(+), 2 deletions(-)

lib/std/zig/Server.zig+17-2
......@@ -105,8 +105,10 @@ pub fn receiveMessage(s: *Server) !InMessage.Header {
105105 assert(fifo.readableLength() == buf.len);
106106 if (buf.len >= @sizeOf(Header)) {
107107 const header = @ptrCast(*align(1) const Header, buf[0..@sizeOf(Header)]);
108 const bytes_len = bswap(header.bytes_len);
109 const tag = bswap(header.tag);
108 // workaround for https://github.com/ziglang/zig/issues/14904
109 const bytes_len = bswap_and_workaround_u32(&header.bytes_len);
110 // workaround for https://github.com/ziglang/zig/issues/14904
111 const tag = bswap_and_workaround_tag(&header.tag);
110112
111113 if (buf.len - @sizeOf(Header) >= bytes_len) {
112114 fifo.discard(@sizeOf(Header));
......@@ -278,6 +280,19 @@ fn bswap_u32_array(slice: []u32) void {
278280 for (slice) |*elem| elem.* = @byteSwap(elem.*);
279281}
280282
283/// workaround for https://github.com/ziglang/zig/issues/14904
284fn bswap_and_workaround_u32(x: *align(1) const u32) u32 {
285 const bytes_ptr = @ptrCast(*const [4]u8, x);
286 return std.mem.readIntLittle(u32, bytes_ptr);
287}
288
289/// workaround for https://github.com/ziglang/zig/issues/14904
290fn bswap_and_workaround_tag(x: *align(1) const InMessage.Tag) InMessage.Tag {
291 const bytes_ptr = @ptrCast(*const [4]u8, x);
292 const int = std.mem.readIntLittle(u32, bytes_ptr);
293 return @intToEnum(InMessage.Tag, int);
294}
295
281296const OutMessage = std.zig.Server.Message;
282297const InMessage = std.zig.Client.Message;
283298