Commit 978fab817c

Andrew Kelley <andrew@ziglang.org>
2019-05-16 20:17:00
the wasm freestanding _start function is return value void
1 parent 81e960e
Changed files (2)
std
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
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,