authorgravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2022-01-06 20:18:24+01:00
committergravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2022-01-07 18:35:08+01:00
log247b638ccf8bfd5e0c4729935d230022726f97aa
tree8be0dcff1863b5252b9c305992c36f5299f3334f
parent6d951aff7e32b1b0252d341e66517a9a9ee98a2d
signaturelock-open Commit is signed but in an unrecognized format.

Pass `--allow-unknown-exports` to wasmtime

Also skip exporting non-function symbols when we're building a WASI command using the stage2 llvm backend.

7 files changed, 17 insertions(+), 12 deletions(-)

lib/std/build.zig+2
...@@ -2659,6 +2659,8 @@ pub const LibExeObjStep = struct {...@@ -2659,6 +2659,8 @@ pub const LibExeObjStep = struct {
2659 try zig_args.append(bin_name);2659 try zig_args.append(bin_name);
2660 try zig_args.append("--test-cmd");2660 try zig_args.append("--test-cmd");
2661 try zig_args.append("--dir=.");2661 try zig_args.append("--dir=.");
2662 try zig_args.append("--test-cmd");
2663 try zig_args.append("--allow-unknown-exports"); // TODO: Remove when stage2 is default compiler
2662 try zig_args.append("--test-cmd-bin");2664 try zig_args.append("--test-cmd-bin");
2663 } else {2665 } else {
2664 try zig_args.append("--test-no-exec");2666 try zig_args.append("--test-no-exec");
src/Compilation.zig+2-2
...@@ -1882,9 +1882,9 @@ pub fn destroy(self: *Compilation) void {...@@ -1882,9 +1882,9 @@ pub fn destroy(self: *Compilation) void {
1882 self.astgen_wait_group.deinit();1882 self.astgen_wait_group.deinit();
18831883
1884 for (self.export_symbol_names.items) |symbol_name| {1884 for (self.export_symbol_names.items) |symbol_name| {
1885 self.gpa.free(symbol_name);1885 gpa.free(symbol_name);
1886 }1886 }
1887 self.export_symbol_names.deinit(self.gpa);1887 self.export_symbol_names.deinit(gpa);
18881888
1889 // This destroys `self`.1889 // This destroys `self`.
1890 self.arena_state.promote(gpa).deinit();1890 self.arena_state.promote(gpa).deinit();
src/link/Wasm.zig+7
...@@ -1256,8 +1256,15 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {...@@ -1256,8 +1256,15 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
1256 try argv.append(try std.fmt.allocPrint(arena, "--export={s}", .{symbol_name}));1256 try argv.append(try std.fmt.allocPrint(arena, "--export={s}", .{symbol_name}));
1257 }1257 }
1258 } else {1258 } else {
1259 const skip_export_non_fn = target.os.tag == .wasi and
1260 self.base.options.wasi_exec_model == .command;
1259 for (module.decl_exports.values()) |exports| {1261 for (module.decl_exports.values()) |exports| {
1260 for (exports) |exprt| {1262 for (exports) |exprt| {
1263 if (skip_export_non_fn and exprt.exported_decl.ty.zigTypeTag() != .Fn) {
1264 // skip exporting symbols when we're building a WASI command
1265 // and the symbol is not a function
1266 continue;
1267 }
1261 const symbol_name = exprt.exported_decl.name;1268 const symbol_name = exprt.exported_decl.name;
1262 const arg = try std.fmt.allocPrint(arena, "--export={s}", .{symbol_name});1269 const arg = try std.fmt.allocPrint(arena, "--export={s}", .{symbol_name});
1263 try argv.append(arg);1270 try argv.append(arg);
src/stage1.zig+3-7
...@@ -468,13 +468,9 @@ export fn stage2_fetch_file(...@@ -468,13 +468,9 @@ export fn stage2_fetch_file(
468 return contents.ptr;468 return contents.ptr;
469}469}
470470
471export fn stage2_append_symbol(stage1: *Module, name_ptr: ?[*:0]const u8) Error {471export fn stage2_append_symbol(stage1: *Module, name_ptr: [*c]const u8, name_len: usize) Error {
472 if (name_len == 0) return Error.None;
472 const comp = @intToPtr(*Compilation, stage1.userdata);473 const comp = @intToPtr(*Compilation, stage1.userdata);
473474 comp.export_symbol_names.append(comp.gpa, name_ptr[0..name_len]) catch return Error.OutOfMemory;
474 if (name_ptr) |unwrapped_name| {
475 const symbol_name = std.mem.sliceTo(unwrapped_name, 0);
476 if (symbol_name.len == 0) return Error.None;
477 comp.export_symbol_names.append(comp.gpa, symbol_name) catch return Error.OutOfMemory;
478 }
479 return Error.None;475 return Error.None;
480}476}
src/stage1/codegen.cpp+1-1
...@@ -9912,7 +9912,7 @@ void codegen_build_object(CodeGen *g) {...@@ -9912,7 +9912,7 @@ void codegen_build_object(CodeGen *g) {
9912 auto export_it = g->exported_symbol_names.entry_iterator();9912 auto export_it = g->exported_symbol_names.entry_iterator();
9913 decltype(g->exported_symbol_names)::Entry *curr_entry = nullptr;9913 decltype(g->exported_symbol_names)::Entry *curr_entry = nullptr;
9914 while ((curr_entry = export_it.next()) != nullptr) {9914 while ((curr_entry = export_it.next()) != nullptr) {
9915 if ((err = stage2_append_symbol(&g->stage1, buf_ptr(curr_entry->key)))) {9915 if ((err = stage2_append_symbol(&g->stage1, buf_ptr(curr_entry->key), buf_len(curr_entry->key)))) {
9916 fprintf(stderr, "Unable to export symbol '%s': %s\n", buf_ptr(curr_entry->key), err_str(err));9916 fprintf(stderr, "Unable to export symbol '%s': %s\n", buf_ptr(curr_entry->key), err_str(err));
9917 }9917 }
9918 }9918 }
src/stage1/stage2.h+1-1
...@@ -183,6 +183,6 @@ ZIG_EXTERN_C const char *stage2_add_link_lib(struct ZigStage1 *stage1,...@@ -183,6 +183,6 @@ ZIG_EXTERN_C const char *stage2_add_link_lib(struct ZigStage1 *stage1,
183 const char *symbol_name_ptr, size_t symbol_name_len);183 const char *symbol_name_ptr, size_t symbol_name_len);
184184
185// ABI warning185// ABI warning
186ZIG_EXTERN_C enum Error stage2_append_symbol(struct ZigStage1 *stage1, const char *name_ptr);186ZIG_EXTERN_C enum Error stage2_append_symbol(struct ZigStage1 *stage1, const char *name_ptr, size_t name_len);
187187
188#endif188#endif
src/stage1/zig0.cpp+1-1
...@@ -555,7 +555,7 @@ struct Stage2SemVer stage2_version(void) {...@@ -555,7 +555,7 @@ struct Stage2SemVer stage2_version(void) {
555 return {ZIG_VERSION_MAJOR, ZIG_VERSION_MINOR, ZIG_VERSION_PATCH};555 return {ZIG_VERSION_MAJOR, ZIG_VERSION_MINOR, ZIG_VERSION_PATCH};
556}556}
557557
558Error stage2_append_symbol(struct ZigStage1 *stage1, const char *name_ptr)558Error stage2_append_symbol(struct ZigStage1 *stage1, const char *name_ptr, size_t name_len)
559{559{
560 return ErrorNone;560 return ErrorNone;
561}561}