diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-02-01 12:29:22 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-01 12:29:22 -0800 |
| commit | 1517ed0a5ede7da476fdffa8bfe74dab3d1e3810 (patch) | |
| tree | b229bdbac93fd8b24b9ac6a8b2c654db67508886 /src/link | |
| parent | c0685458a2f9463bf3c2276f9b5d9ca4b3157cd7 (diff) | |
| parent | cc46c1b9024beefdd82ce8abd07e8849a72db20c (diff) | |
| download | zig-1517ed0a5ede7da476fdffa8bfe74dab3d1e3810.tar.gz zig-1517ed0a5ede7da476fdffa8bfe74dab3d1e3810.zip | |
Merge pull request #7895 from Luukdegram/wasm-control-flow
stage2: wasm control flow
Diffstat (limited to 'src/link')
| -rw-r--r-- | src/link/Wasm.zig | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index 7d30fc377a..547ab2a012 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -103,13 +103,14 @@ pub fn updateDecl(self: *Wasm, module: *Module, decl: *Module.Decl) !void { var context = codegen.Context{ .gpa = self.base.allocator, - .values = codegen.ValueTable.init(self.base.allocator), + .values = .{}, .code = managed_code, .func_type_data = managed_functype, .decl = decl, .err_msg = undefined, + .locals = .{}, }; - defer context.values.deinit(); + defer context.deinit(); // generate the 'code' section for the function declaration context.gen() catch |err| switch (err) { @@ -121,6 +122,13 @@ pub fn updateDecl(self: *Wasm, module: *Module, decl: *Module.Decl) !void { else => |e| return err, }; + // as locals are patched afterwards, the offsets of funcidx's are off, + // here we update them to correct them + for (decl.fn_link.wasm.?.idx_refs.items) |*func| { + // For each local, add 6 bytes (count + type) + func.offset += @intCast(u32, context.locals.items.len * 6); + } + fn_data.functype = context.func_type_data.toUnmanaged(); fn_data.code = context.code.toUnmanaged(); } @@ -237,7 +245,7 @@ pub fn flushModule(self: *Wasm, comp: *Compilation) !void { try writer.writeAll(fn_data.code.items[current..idx_ref.offset]); current = idx_ref.offset; // Use a fixed width here to make calculating the code size - // in codegen.wasm.genCode() simpler. + // in codegen.wasm.gen() simpler. var buf: [5]u8 = undefined; leb.writeUnsignedFixed(5, &buf, self.getFuncidx(idx_ref.decl).?); try writer.writeAll(&buf); |
