diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2019-05-16 14:31:54 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-05-16 14:31:54 -0400 |
| commit | 8468ff0fe1466d8b38aff1d265d953b5cc8fefe6 (patch) | |
| tree | 584a749d0d79d662f12454b0e2179dde12ad3056 /std | |
| parent | 07d0aee11a5725dc22eeaa116fb59c40a1a7c99c (diff) | |
| parent | 978fab817caacb7bb3ba96fe3ec08bab1c78c1da (diff) | |
| download | zig-8468ff0fe1466d8b38aff1d265d953b5cc8fefe6.tar.gz zig-8468ff0fe1466d8b38aff1d265d953b5cc8fefe6.zip | |
Merge pull request #2507 from ziglang/wasm-libs
improvements to build-lib use case of WebAssembly
Diffstat (limited to 'std')
| -rw-r--r-- | std/special/bootstrap.zig | 23 | ||||
| -rw-r--r-- | std/special/c.zig | 6 |
2 files changed, 18 insertions, 11 deletions
diff --git a/std/special/bootstrap.zig b/std/special/bootstrap.zig index e6505c836b..b389c03c8c 100644 --- a/std/special/bootstrap.zig +++ b/std/special/bootstrap.zig @@ -8,34 +8,41 @@ 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()); } switch (builtin.arch) { - builtin.Arch.x86_64 => { + .x86_64 => { argc_ptr = asm ("lea (%%rsp), %[argc]" : [argc] "=r" (-> [*]usize) ); }, - builtin.Arch.i386 => { + .i386 => { argc_ptr = asm ("lea (%%esp), %[argc]" : [argc] "=r" (-> [*]usize) ); }, - builtin.Arch.aarch64, builtin.Arch.aarch64_be => { + .aarch64, .aarch64_be => { argc_ptr = asm ("mov %[argc], sp" : [argc] "=r" (-> [*]usize) ); diff --git a/std/special/c.zig b/std/special/c.zig index d5de52a6a3..6332d9a12e 100644 --- a/std/special/c.zig +++ b/std/special/c.zig @@ -11,14 +11,14 @@ const maxInt = std.math.maxInt; const is_wasm = switch (builtin.arch) { .wasm32, .wasm64 => true, else => false}; const is_freestanding = switch (builtin.os) { .freestanding => true, else => false }; comptime { - if (is_freestanding and is_wasm) { + if (is_freestanding and is_wasm and builtin.link_libc) { @export("_start", wasm_start, .Strong); } } 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, |
