aboutsummaryrefslogtreecommitdiff
path: root/src/link
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-02-01 12:29:22 -0800
committerGitHub <noreply@github.com>2021-02-01 12:29:22 -0800
commit1517ed0a5ede7da476fdffa8bfe74dab3d1e3810 (patch)
treeb229bdbac93fd8b24b9ac6a8b2c654db67508886 /src/link
parentc0685458a2f9463bf3c2276f9b5d9ca4b3157cd7 (diff)
parentcc46c1b9024beefdd82ce8abd07e8849a72db20c (diff)
downloadzig-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.zig14
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);