From f50203c83667ed3ad0c57fdc953322a5f9c221ac Mon Sep 17 00:00:00 2001 From: Luuk de Gram Date: Sun, 6 Feb 2022 12:49:42 +0100 Subject: [PATCH] wasm: update test runner This updates the test runner for stage2 to emit to stdout with the passed, skipped and failed tests similar to the LLVM backend. Another change to this is the start function, as it's now more in line with stage1's. The stage2 test infrastructure for wasm/wasi has been updated to reflect this as well. --- lib/std/special/test_runner.zig | 2 +- lib/std/start.zig | 8 +- src/arch/wasm/CodeGen.zig | 2 +- src/link/Wasm.zig | 16 ++- src/link/Wasm/Symbol.zig | 5 +- test/stage2/wasm.zig | 225 ++++++++++++++++---------------- 6 files changed, 128 insertions(+), 130 deletions(-) diff --git a/lib/std/special/test_runner.zig b/lib/std/special/test_runner.zig index fe20e10141d3637ac703416c2ca4c7f1ba4a9ac1..9848cb5a3ee87fcd8192e8ded55b0dece01107c8 100644 --- a/lib/std/special/test_runner.zig +++ b/lib/std/special/test_runner.zig @@ -144,7 +144,7 @@ pub fn main2() anyerror!void { } }; } - if (builtin.zig_backend == .stage2_llvm) { + if (builtin.zig_backend == .stage2_llvm or builtin.zig_backend == .stage2_wasm) { const passed = builtin.test_functions.len - skipped - failed; const stderr = std.io.getStdErr(); writeInt(stderr, passed) catch {}; diff --git a/lib/std/start.zig b/lib/std/start.zig index a3cc3d00a8ba4a7717895ff09da621a65e3a78d6..6e28ca61a392031a82de29eb01881cbda2805176 100644 --- a/lib/std/start.zig +++ b/lib/std/start.zig @@ -31,7 +31,7 @@ comptime { } else if (builtin.os.tag == .windows) { @export(wWinMainCRTStartup2, .{ .name = "wWinMainCRTStartup" }); } else if (builtin.os.tag == .wasi and @hasDecl(root, "main")) { - @export(wasmMain2, .{ .name = "_start" }); + @export(wasiMain2, .{ .name = "_start" }); } else { if (!@hasDecl(root, "_start")) { @export(_start2, .{ .name = "_start" }); @@ -100,17 +100,17 @@ fn callMain2() noreturn { exit2(0); } -fn wasmMain2() u8 { +fn wasiMain2() noreturn { switch (@typeInfo(@typeInfo(@TypeOf(root.main)).Fn.return_type.?)) { .Void => { root.main(); - return 0; + std.os.wasi.proc_exit(0); }, .Int => |info| { if (info.bits != 8 or info.signedness == .signed) { @compileError(bad_main_ret); } - return root.main(); + std.os.wasi.proc_exit(root.main()); }, else => @compileError("Bad return type main"), } diff --git a/src/arch/wasm/CodeGen.zig b/src/arch/wasm/CodeGen.zig index b1e7a0d3a125bcb613a7515191babb6c1071793b..9f0736f0551078fac69d624e42f558197f097eed 100644 --- a/src/arch/wasm/CodeGen.zig +++ b/src/arch/wasm/CodeGen.zig @@ -954,7 +954,7 @@ pub const DeclGen = struct { } else if (decl.val.castTag(.extern_fn)) |extern_fn| { const ext_decl = extern_fn.data.owner_decl; var func_type = try genFunctype(self.gpa, ext_decl.ty, self.target()); - func_type.deinit(self.gpa); + defer func_type.deinit(self.gpa); ext_decl.fn_link.wasm.type_index = try self.bin_file.putOrGetFuncType(func_type); return Result{ .appended = {} }; } else { diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index e6988e9232200752f8983cc20fe45dd67be45c1e..d62f3a42014206a79ad5fd651a5c4878f1db8421 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -260,7 +260,7 @@ pub fn updateDecl(self: *Wasm, module: *Module, decl: *Module.Decl) !void { if (build_options.have_llvm) { if (self.llvm_object) |llvm_object| return llvm_object.updateDecl(module, decl); } - if (!decl.ty.hasRuntimeBits()) return; + assert(decl.link.wasm.sym_index != 0); // Must call allocateDeclIndexes() decl.link.wasm.clear(); @@ -297,8 +297,7 @@ pub fn updateDecl(self: *Wasm, module: *Module, decl: *Module.Decl) !void { fn finishUpdateDecl(self: *Wasm, decl: *Module.Decl, code: []const u8) !void { if (decl.isExtern()) { - try self.addOrUpdateImport(decl); - return; + return self.addOrUpdateImport(decl); } if (code.len == 0) return; @@ -407,16 +406,18 @@ pub fn freeDecl(self: *Wasm, decl: *Module.Decl) void { self.symbols.items[atom.sym_index].tag = .dead; // to ensure it does not end in the names section for (atom.locals.items) |local_atom| { self.symbols.items[local_atom.sym_index].tag = .dead; // also for any local symbol + self.symbols_free_list.append(self.base.allocator, local_atom.sym_index) catch {}; } - atom.deinit(self.base.allocator); if (decl.isExtern()) { - const import = self.imports.fetchRemove(decl.link.wasm.sym_index).?.value; + const import = self.imports.fetchRemove(atom.sym_index).?.value; switch (import.kind) { .function => self.imported_functions_count -= 1, else => unreachable, } } + + atom.deinit(self.base.allocator); } /// Appends a new entry to the indirect function table @@ -441,10 +442,13 @@ fn addOrUpdateImport(self: *Wasm, decl: *Module.Decl) !void { switch (decl.ty.zigTypeTag()) { .Fn => { const gop = try self.imports.getOrPut(self.base.allocator, symbol_index); + const module_name = if (decl.getExternFn().?.lib_name) |lib_name| blk: { + break :blk std.mem.sliceTo(lib_name, 0); + } else self.host_name; if (!gop.found_existing) { self.imported_functions_count += 1; gop.value_ptr.* = .{ - .module_name = self.host_name, + .module_name = module_name, .name = std.mem.span(symbol.name), .kind = .{ .function = decl.fn_link.wasm.type_index }, }; diff --git a/src/link/Wasm/Symbol.zig b/src/link/Wasm/Symbol.zig index 0f2247f5d15e5629ea15366e1963bdf575cbfdc8..53d96d6382ac463a8b01ddf15339eb30080e9d72 100644 --- a/src/link/Wasm/Symbol.zig +++ b/src/link/Wasm/Symbol.zig @@ -142,19 +142,20 @@ pub fn format(self: Symbol, comptime fmt: []const u8, options: std.fmt.FormatOpt _ = fmt; _ = options; - const kind_fmt: u8 = switch (self.kind) { + const kind_fmt: u8 = switch (self.tag) { .function => 'F', .data => 'D', .global => 'G', .section => 'S', .event => 'E', .table => 'T', + .dead => '-', }; const visible: []const u8 = if (self.isVisible()) "yes" else "no"; const binding: []const u8 = if (self.isLocal()) "local" else "global"; try writer.print( "{c} binding={s} visible={s} id={d} name={s}", - .{ kind_fmt, binding, visible, self.index(), self.name }, + .{ kind_fmt, binding, visible, self.index, self.name }, ); } diff --git a/test/stage2/wasm.zig b/test/stage2/wasm.zig index 20ff65e0a765f36dc3e68da3a748147ca5df2830..7c7e203b40b3f369dd3c967f2daf29117b532b6e 100644 --- a/test/stage2/wasm.zig +++ b/test/stage2/wasm.zig @@ -11,37 +11,31 @@ pub fn addCases(ctx: *TestContext) !void { var case = ctx.exe("wasm function calls", wasi); case.addCompareOutput( - \\pub fn main() u8 { + \\pub fn main() void { \\ foo(); \\ bar(); - \\ return 42; \\} \\fn foo() void { \\ bar(); \\ bar(); \\} \\fn bar() void {} - , - "42\n", - ); + , ""); case.addCompareOutput( - \\pub fn main() u8 { + \\pub fn main() void { \\ bar(); \\ foo(); \\ foo(); \\ bar(); \\ foo(); \\ bar(); - \\ return 42; \\} \\fn foo() void { \\ bar(); \\} \\fn bar() void {} - , - "42\n", - ); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -56,23 +50,22 @@ pub fn addCases(ctx: *TestContext) !void { \\} \\fn bar() void {} , - "0\n", + "", ); case.addCompareOutput( - \\pub fn main() u8 { + \\pub fn main() void { \\ foo(10, 20); - \\ return 5; \\} \\fn foo(x: u8, y: u8) void { _ = x; _ = y; } - , "5\n"); + , ""); } { var case = ctx.exe("wasm locals", wasi); case.addCompareOutput( - \\pub fn main() u8 { + \\pub fn main() void { \\ var i: u8 = 5; \\ var y: f32 = 42.0; \\ var x: u8 = 10; @@ -80,38 +73,38 @@ pub fn addCases(ctx: *TestContext) !void { \\ y; \\ x; \\ } - \\ return i; + \\ if (i != 5) unreachable; \\} - , "5\n"); + , ""); case.addCompareOutput( - \\pub fn main() u8 { + \\pub fn main() void { \\ var i: u8 = 5; \\ var y: f32 = 42.0; \\ _ = y; \\ var x: u8 = 10; \\ foo(i, x); \\ i = x; - \\ return i; + \\ if (i != 10) unreachable; \\} \\fn foo(x: u8, y: u8) void { \\ _ = y; \\ var i: u8 = 10; \\ i = x; \\} - , "10\n"); + , ""); } { var case = ctx.exe("wasm binary operands", wasi); case.addCompareOutput( - \\pub fn main() u8 { + \\pub fn main() void { \\ var i: u8 = 5; \\ i += 20; - \\ return i; + \\ if (i != 25) unreachable; \\} - , "25\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -119,7 +112,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (i +% 1 != -2147483648) unreachable; \\ return; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -127,34 +120,34 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (i +% 1 != 0) unreachable; \\ return; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { \\ var i: u8 = 255; \\ return i +% 1; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { \\ var i: u8 = 5; \\ i += 20; \\ var result: u8 = foo(i, 10); - \\ return result; + \\ return result - 35; \\} \\fn foo(x: u8, y: u8) u8 { \\ return x + y; \\} - , "35\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { \\ var i: u8 = 20; \\ i -= 5; - \\ return i; + \\ return i - 15; \\} - , "15\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -162,7 +155,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (i -% 1 != 2147483647) unreachable; \\ return; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -170,26 +163,26 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (i -% 1 != 63) unreachable; \\ return; \\} - , "0\n"); + , ""); case.addCompareOutput( - \\pub fn main() u8 { + \\pub fn main() void { \\ var i: u4 = 0; - \\ return i -% 1; + \\ if(i -% 1 != 15) unreachable; \\} - , "15\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { \\ var i: u8 = 5; \\ i -= 3; \\ var result: u8 = foo(i, 10); - \\ return result; + \\ return result - 8; \\} \\fn foo(x: u8, y: u8) u8 { \\ return y - x; \\} - , "8\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -202,7 +195,7 @@ pub fn addCases(ctx: *TestContext) !void { \\fn foo(x: u32, y: u32) u32 { \\ return x * y; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -211,7 +204,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (result != -2) unreachable; \\ return; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -219,7 +212,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (i *% 3 != 1) unreachable; \\ return; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -227,7 +220,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (i *% 3 != 1) unreachable; \\ return; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -240,31 +233,31 @@ pub fn addCases(ctx: *TestContext) !void { \\fn foo(x: u32, y: u32) u32 { \\ return x / y; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { \\ var i: u8 = 5; \\ i &= 6; - \\ return i; + \\ return i - 4; \\} - , "4\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { \\ var i: u8 = 5; \\ i |= 6; - \\ return i; + \\ return i - 7; \\} - , "7\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { \\ var i: u8 = 5; \\ i ^= 6; - \\ return i; + \\ return i - 3; \\} - , "3\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -273,7 +266,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (b) unreachable; \\ return; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -282,7 +275,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (!b) unreachable; \\ return; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -291,7 +284,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (!b) unreachable; \\ return; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -300,7 +293,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (!b) unreachable; \\ return; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -309,7 +302,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (b) unreachable; \\ return; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -318,7 +311,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (b) unreachable; \\ return; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -327,7 +320,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (b) unreachable; \\ return; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -336,7 +329,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (!b) unreachable; \\ return; \\} - , "0\n"); + , ""); } { @@ -348,9 +341,9 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (i > @as(u8, 4)) { \\ i += 10; \\ } - \\ return i; + \\ return i - 15; \\} - , "15\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { @@ -360,9 +353,9 @@ pub fn addCases(ctx: *TestContext) !void { \\ } else { \\ i = 2; \\ } - \\ return i; + \\ return i - 2; \\} - , "2\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { @@ -372,9 +365,9 @@ pub fn addCases(ctx: *TestContext) !void { \\ } else if(i == @as(u8, 5)) { \\ i = 20; \\ } - \\ return i; + \\ return i - 20; \\} - , "20\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { @@ -388,9 +381,9 @@ pub fn addCases(ctx: *TestContext) !void { \\ i = 20; \\ } \\ } - \\ return i; + \\ return i - 31; \\} - , "31\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -405,7 +398,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ const x = if(ok) @as(i32, 20) else @as(i32, 10); \\ return x; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() void { @@ -425,7 +418,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ }; \\ return val + 10; \\} - , "0\n"); + , ""); } { @@ -438,9 +431,9 @@ pub fn addCases(ctx: *TestContext) !void { \\ i += 1; \\ } \\ - \\ return i; + \\ return i - 5; \\} - , "5\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { @@ -449,9 +442,9 @@ pub fn addCases(ctx: *TestContext) !void { \\ var x: u8 = 1; \\ i += x; \\ } - \\ return i; + \\ return i - 10; \\} - , "10\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { @@ -461,9 +454,9 @@ pub fn addCases(ctx: *TestContext) !void { \\ i += x; \\ if (i == @as(u8, 5)) break; \\ } - \\ return i; + \\ return i - 5; \\} - , "5\n"); + , ""); } { @@ -485,7 +478,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ } \\ return; \\} - , "0\n"); + , ""); case.addCompareOutput( \\const Number = enum { One, Two, Three }; @@ -507,7 +500,7 @@ pub fn addCases(ctx: *TestContext) !void { \\fn assert(val: bool) void { \\ if(!val) unreachable; \\} - , "0\n"); + , ""); } { @@ -518,9 +511,9 @@ pub fn addCases(ctx: *TestContext) !void { \\ \\pub fn main() u8 { \\ var example: Example = .{ .x = 5 }; - \\ return example.x; + \\ return example.x - 5; \\} - , "5\n"); + , ""); case.addCompareOutput( \\const Example = struct { x: u8 }; @@ -528,18 +521,18 @@ pub fn addCases(ctx: *TestContext) !void { \\pub fn main() u8 { \\ var example: Example = .{ .x = 5 }; \\ example.x = 10; - \\ return example.x; + \\ return example.x - 10; \\} - , "10\n"); + , ""); case.addCompareOutput( \\const Example = struct { x: u8, y: u8 }; \\ \\pub fn main() u8 { \\ var example: Example = .{ .x = 5, .y = 10 }; - \\ return example.y + example.x; + \\ return example.y + example.x - 15; \\} - , "15\n"); + , ""); case.addCompareOutput( \\const Example = struct { x: u8, y: u8 }; @@ -549,9 +542,9 @@ pub fn addCases(ctx: *TestContext) !void { \\ var example2: Example = .{ .x = 10, .y = 20 }; \\ \\ example = example2; - \\ return example.y + example.x; + \\ return example.y + example.x - 30; \\} - , "30\n"); + , ""); case.addCompareOutput( \\const Example = struct { x: u8, y: u8 }; @@ -560,9 +553,9 @@ pub fn addCases(ctx: *TestContext) !void { \\ var example: Example = .{ .x = 5, .y = 10 }; \\ \\ example = .{ .x = 10, .y = 20 }; - \\ return example.y + example.x; + \\ return example.y + example.x - 30; \\} - , "30\n"); + , ""); } { @@ -578,9 +571,9 @@ pub fn addCases(ctx: *TestContext) !void { \\ else => 5, \\ }; \\ - \\ return a; + \\ return a - 2; \\} - , "2\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { @@ -592,9 +585,9 @@ pub fn addCases(ctx: *TestContext) !void { \\ else => 5, \\ }; \\ - \\ return a; + \\ return a - 3; \\} - , "3\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { @@ -606,9 +599,9 @@ pub fn addCases(ctx: *TestContext) !void { \\ else => 5, \\ }; \\ - \\ return a; + \\ return a - 5; \\} - , "5\n"); + , ""); case.addCompareOutput( \\const MyEnum = enum { One, Two, Three }; @@ -621,9 +614,9 @@ pub fn addCases(ctx: *TestContext) !void { \\ .Three => 3, \\ }; \\ - \\ return a; + \\ return a - 2; \\} - , "2\n"); + , ""); } { @@ -641,35 +634,35 @@ pub fn addCases(ctx: *TestContext) !void { \\fn assert(b: bool) void { \\ if (!b) unreachable; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { \\ var e: anyerror!u8 = 5; \\ const i = e catch 10; - \\ return i; + \\ return i - 5; \\} - , "5\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { \\ var e: anyerror!u8 = error.Foo; \\ const i = e catch 10; - \\ return i; + \\ return i - 10; \\} - , "10\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { \\ var e = foo(); \\ const i = e catch 69; - \\ return i; + \\ return i - 5; \\} \\ \\fn foo() anyerror!u8 { \\ return 5; \\} - , "5\n"); + , ""); } { @@ -679,24 +672,24 @@ pub fn addCases(ctx: *TestContext) !void { \\pub fn main() u8 { \\ var e = foo(); \\ const i = e catch 69; - \\ return i; + \\ return i - 69; \\} \\ \\fn foo() anyerror!u8 { \\ return error.Bruh; \\} - , "69\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { \\ var e = foo(); \\ const i = e catch 42; - \\ return i; + \\ return i - 42; \\} \\ \\fn foo() anyerror!u8 { \\ return error.Dab; \\} - , "42\n"); + , ""); } { @@ -709,7 +702,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ _ = y; \\ return; \\} - , "0\n"); + , ""); } { @@ -722,9 +715,9 @@ pub fn addCases(ctx: *TestContext) !void { \\ if (x) |val| { \\ y = val; \\ } - \\ return y; + \\ return y - 5; \\} - , "5\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { @@ -735,22 +728,22 @@ pub fn addCases(ctx: *TestContext) !void { \\ } \\ return y; \\} - , "0\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { \\ var x: ?u8 = 5; - \\ return x.?; + \\ return x.? - 5; \\} - , "5\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { \\ var x: u8 = 5; \\ var y: ?u8 = x; - \\ return y.?; + \\ return y.? - 5; \\} - , "5\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { @@ -763,7 +756,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ } \\ return 0; \\} - , "0\n"); + , ""); } { @@ -774,13 +767,13 @@ pub fn addCases(ctx: *TestContext) !void { \\ var x: u8 = 0; \\ \\ foo(&x); - \\ return x; + \\ return x - 2; \\} \\ \\fn foo(x: *u8)void { \\ x.* = 2; \\} - , "2\n"); + , ""); case.addCompareOutput( \\pub fn main() u8 { @@ -788,7 +781,7 @@ pub fn addCases(ctx: *TestContext) !void { \\ \\ foo(&x); \\ bar(&x); - \\ return x; + \\ return x - 4; \\} \\ \\fn foo(x: *u8)void { @@ -798,6 +791,6 @@ pub fn addCases(ctx: *TestContext) !void { \\fn bar(x: *u8) void { \\ x.* += 2; \\} - , "4\n"); + , ""); } } -- 2.54.0