ziglang/zig

WASI assert(@alignOf(i16) == 2) fails when compiling for AVR

190n opened this issue · 1 comments

190n commented

Zig Version

0.12.0

Steps to Reproduce and Observed Behavior

Compile a small file using std.log for AVR:

// foo.zig
const std = @import("std");

extern fn logBackend(ptr: [*:0]const u8, len: usize) void;

pub fn logFn(
    comptime level: std.log.Level,
    comptime scope: @Type(.EnumLiteral),
    comptime format: []const u8,
    args: anytype,
) void {
    const level_prefix = comptime level.asText();
    const prefix = comptime level_prefix ++ switch (scope) {
        .default => ": ",
        else => " (" ++ @tagName(scope) ++ "): ",
    };

    var buf: [1024:0]u8 = undefined;
    const string = std.fmt.bufPrintZ(&buf, prefix ++ format, args) catch &buf;
    logBackend(string.ptr, string.len);
}

pub const std_options = std.Options{
    .logFn = logFn,
};

export fn meow() u16 {
    std.log.info("meow called", .{});
    return 5;
}
$ zig build-obj foo.zig -O ReleaseFast -target avr-freestanding -mcpu=atmega4809 -freference-trace
/usr/lib/zig/std/debug.zig:403:14: error: reached unreachable code
    if (!ok) unreachable; // assertion failure
             ^~~~~~~~~~~
/usr/lib/zig/std/os/wasi.zig:12:11: note: called from here
    assert(@alignOf(i16) == 2);
    ~~~~~~^~~~~~~~~~~~~~~~~~~~

This assertion fails since apparently i16 is 1 byte aligned on AVR.

If I remove only the std.log.info line, it compiles fine.

Expected Behavior

I expect this file to compile without issues, since I provided a backend for std.log which doesn't need any OS support. It seems std.os.wasi is getting referenced by the definition of std.Options, as that uses os.wasi.fd_t:

    wasiCwd: fn () os.wasi.fd_t = fs.defaultWasiCwd,

It seems like I can fix this by changing that definition to have the type void on non-WASM targets, but I'm not 100% confident that doesn't break anything else. I can PR that change if desired.

190n commented

NVM, this is a duplicate of #19665 which I didn't notice.