diff --git a/std/special/bootstrap.zig b/std/special/bootstrap.zig index e8f943b78..b389c03c8 100644 --- a/std/special/bootstrap.zig +++ b/std/special/bootstrap.zig @@ -8,17 +8,24 @@ const assert = std.debug.assert; var argc_ptr: [*]usize = undefined; +const is_wasm = switch (builtin.arch) { .wasm32, .wasm64 => true, else => false}; + comptime { - const strong_linkage = builtin.GlobalLinkage.Strong; if (builtin.link_libc) { - @export("main", main, strong_linkage); - } else if (builtin.os == builtin.Os.windows) { - @export("WinMainCRTStartup", WinMainCRTStartup, strong_linkage); + @export("main", main, .Strong); + } else if (builtin.os == .windows) { + @export("WinMainCRTStartup", WinMainCRTStartup, .Strong); + } else if (is_wasm and builtin.os == .freestanding) { + @export("_start", wasm_freestanding_start, .Strong); } else { - @export("_start", _start, strong_linkage); + @export("_start", _start, .Strong); } } +extern fn wasm_freestanding_start() void { + _ = callMain(); +} + nakedcc fn _start() noreturn { if (builtin.os == builtin.Os.wasi) { std.os.wasi.proc_exit(callMain()); @@ -40,10 +47,6 @@ nakedcc fn _start() noreturn { : [argc] "=r" (-> [*]usize) ); }, - .wasm32, .wasm64 => { - _ = callMain(); - while (true) {} - }, else => @compileError("unsupported arch"), } // If LLVM inlines stack variables into _start, they will overwrite diff --git a/std/special/c.zig b/std/special/c.zig index 281e17746..6332d9a12 100644 --- a/std/special/c.zig +++ b/std/special/c.zig @@ -17,8 +17,8 @@ comptime { } extern fn main(argc: c_int, argv: [*][*]u8) c_int; -extern fn wasm_start() c_int { - return main(0, undefined); +extern fn wasm_start() void { + _ = main(0, undefined); } // Avoid dragging in the runtime safety mechanisms into this .o file,