authorgravatar for pawel.ko@interia.plxReveres <pawel.ko@interia.pl> 2022-02-21 22:40:45+01:00
committergravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2022-02-23 08:57:20+01:00
logb2805666a7ced0fd11ab7f25f7599d372e766c42
treecd0c1ce52ac46860254ec7a4009fcb0ebc27fbba
parent6fdcf1ad2d860120564f328535903c4c70e30a0d

stage1-wasm: implement shared memory


5 files changed, 20 insertions(+), 0 deletions(-)

lib/std/build.zig+4
......@@ -1508,6 +1508,7 @@ pub const LibExeObjStep = struct {
15081508 export_table: bool = false,
15091509 initial_memory: ?u64 = null,
15101510 max_memory: ?u64 = null,
1511 shared_memory: bool = false,
15111512 global_base: ?u64 = null,
15121513 c_std: Builder.CStd,
15131514 override_lib_dir: ?[]const u8,
......@@ -2566,6 +2567,9 @@ pub const LibExeObjStep = struct {
25662567 if (self.max_memory) |max_memory| {
25672568 try zig_args.append(builder.fmt("--max-memory={d}", .{max_memory}));
25682569 }
2570 if (self.shared_memory) {
2571 try zig_args.append("--shared-memory");
2572 }
25692573 if (self.global_base) |global_base| {
25702574 try zig_args.append(builder.fmt("--global-base={d}", .{global_base}));
25712575 }
src/Compilation.zig+3
......@@ -757,6 +757,7 @@ pub const InitOptions = struct {
757757 linker_export_table: bool = false,
758758 linker_initial_memory: ?u64 = null,
759759 linker_max_memory: ?u64 = null,
760 linker_shared_memory: bool = false,
760761 linker_global_base: ?u64 = null,
761762 linker_export_symbol_names: []const []const u8 = &.{},
762763 each_lib_rpath: ?bool = null,
......@@ -1560,6 +1561,7 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
15601561 .export_table = options.linker_export_table,
15611562 .initial_memory = options.linker_initial_memory,
15621563 .max_memory = options.linker_max_memory,
1564 .shared_memory = options.linker_shared_memory,
15631565 .global_base = options.linker_global_base,
15641566 .export_symbol_names = options.linker_export_symbol_names,
15651567 .z_nodelete = options.linker_z_nodelete,
......@@ -2337,6 +2339,7 @@ fn addNonIncrementalStuffToCacheManifest(comp: *Compilation, man: *Cache.Manifes
23372339 man.hash.add(comp.bin_file.options.import_memory);
23382340 man.hash.addOptional(comp.bin_file.options.initial_memory);
23392341 man.hash.addOptional(comp.bin_file.options.max_memory);
2342 man.hash.add(comp.bin_file.options.shared_memory);
23402343 man.hash.addOptional(comp.bin_file.options.global_base);
23412344
23422345 // Mach-O specific stuff
src/link.zig+1
......@@ -125,6 +125,7 @@ pub const Options = struct {
125125 export_table: bool,
126126 initial_memory: ?u64,
127127 max_memory: ?u64,
128 shared_memory: bool,
128129 export_symbol_names: []const []const u8,
129130 global_base: ?u64,
130131 is_native_os: bool,
src/link/Wasm.zig+5
......@@ -1652,6 +1652,7 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
16521652 man.hash.add(self.base.options.export_table);
16531653 man.hash.addOptional(self.base.options.initial_memory);
16541654 man.hash.addOptional(self.base.options.max_memory);
1655 man.hash.add(self.base.options.shared_memory);
16551656 man.hash.addOptional(self.base.options.global_base);
16561657 man.hash.add(self.base.options.export_symbol_names.len);
16571658 // strip does not need to go into the linker hash because it is part of the hash namespace
......@@ -1757,6 +1758,10 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
17571758 try argv.append(arg);
17581759 }
17591760
1761 if (self.base.options.shared_memory) {
1762 try argv.append("--shared-memory");
1763 }
1764
17601765 if (self.base.options.global_base) |global_base| {
17611766 const arg = try std.fmt.allocPrint(arena, "--global-base={d}", .{global_base});
17621767 try argv.append(arg);
src/main.zig+7
......@@ -438,6 +438,7 @@ const usage_build_generic =
438438 \\ --export-table (WebAssembly) export function table to the host environment
439439 \\ --initial-memory=[bytes] (WebAssembly) initial size of the linear memory
440440 \\ --max-memory=[bytes] (WebAssembly) maximum size of the linear memory
441 \\ --shared-memory (WebAssembly) use shared linear memory
441442 \\ --global-base=[addr] (WebAssembly) where to start to place global data
442443 \\ --export=[value] (WebAssembly) Force a symbol to be exported
443444 \\
......@@ -635,6 +636,7 @@ fn buildOutputType(
635636 var linker_export_table: bool = false;
636637 var linker_initial_memory: ?u64 = null;
637638 var linker_max_memory: ?u64 = null;
639 var linker_shared_memory: bool = false;
638640 var linker_global_base: ?u64 = null;
639641 var linker_z_nodelete = false;
640642 var linker_z_notext = false;
......@@ -1207,6 +1209,8 @@ fn buildOutputType(
12071209 linker_initial_memory = parseIntSuffix(arg, "--initial-memory=".len);
12081210 } else if (mem.startsWith(u8, arg, "--max-memory=")) {
12091211 linker_max_memory = parseIntSuffix(arg, "--max-memory=".len);
1212 } else if (mem.startsWith(u8, arg, "--shared-memory")) {
1213 linker_shared_memory = true;
12101214 } else if (mem.startsWith(u8, arg, "--global-base=")) {
12111215 linker_global_base = parseIntSuffix(arg, "--global-base=".len);
12121216 } else if (mem.startsWith(u8, arg, "--export=")) {
......@@ -1623,6 +1627,8 @@ fn buildOutputType(
16231627 linker_initial_memory = parseIntSuffix(arg, "--initial-memory=".len);
16241628 } else if (mem.startsWith(u8, arg, "--max-memory=")) {
16251629 linker_max_memory = parseIntSuffix(arg, "--max-memory=".len);
1630 } else if (mem.startsWith(u8, arg, "--shared-memory")) {
1631 linker_shared_memory = true;
16261632 } else if (mem.startsWith(u8, arg, "--global-base=")) {
16271633 linker_global_base = parseIntSuffix(arg, "--global-base=".len);
16281634 } else if (mem.startsWith(u8, arg, "--export=")) {
......@@ -2620,6 +2626,7 @@ fn buildOutputType(
26202626 .linker_export_table = linker_export_table,
26212627 .linker_initial_memory = linker_initial_memory,
26222628 .linker_max_memory = linker_max_memory,
2629 .linker_shared_memory = linker_shared_memory,
26232630 .linker_global_base = linker_global_base,
26242631 .linker_export_symbol_names = linker_export_symbol_names.items,
26252632 .linker_z_nodelete = linker_z_nodelete,