authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-10 19:07:37-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-15 15:11:36-08:00
log9c14645b58dffa9fb1578170440f32b63f924a85
tree31c4461dd87d5ea6e0a1c90a931574510f73f4bb
parenta327d238f1fa6c79ac8254785082b8ffb54945f0

wasm codegen: fix freeing of locals


1 files changed, 5 insertions(+), 4 deletions(-)

src/arch/wasm/CodeGen.zig+5-4
......@@ -77,6 +77,7 @@ mir_instructions: *std.MultiArrayList(Mir.Inst),
7777/// Contains extra data for MIR
7878mir_extra: *std.ArrayListUnmanaged(u32),
7979start_mir_extra_off: u32,
80start_locals_off: u32,
8081/// List of all locals' types generated throughout this declaration
8182/// used to emit locals count at start of 'code' section.
8283locals: *std.ArrayListUnmanaged(u8),
......@@ -209,7 +210,7 @@ const WValue = union(enum) {
209210 if (local_value < reserved + 2) return; // reserved locals may never be re-used. Also accounts for 2 stack locals.
210211
211212 const index = local_value - reserved;
212 const valtype: std.wasm.Valtype = @enumFromInt(gen.locals.items[index]);
213 const valtype: std.wasm.Valtype = @enumFromInt(gen.locals.items[gen.start_locals_off + index]);
213214 switch (valtype) {
214215 .i32 => gen.free_locals_i32.append(gen.gpa, local_value) catch return, // It's ok to fail any of those, a new local can be allocated instead
215216 .i64 => gen.free_locals_i64.append(gen.gpa, local_value) catch return,
......@@ -1295,6 +1296,7 @@ pub fn function(
12951296 .mir_extra = &wasm.mir_extra,
12961297 .locals = &wasm.all_zcu_locals,
12971298 .start_mir_extra_off = @intCast(wasm.mir_extra.items.len),
1299 .start_locals_off = @intCast(wasm.all_zcu_locals.items.len),
12981300 };
12991301 defer code_gen.deinit();
13001302
......@@ -1309,7 +1311,6 @@ fn functionInner(cg: *CodeGen, any_returns: bool) InnerError!Function {
13091311 const zcu = cg.pt.zcu;
13101312
13111313 const start_mir_off: u32 = @intCast(wasm.mir_instructions.len);
1312 const start_locals_off: u32 = @intCast(wasm.all_zcu_locals.items.len);
13131314
13141315 try cg.branches.append(cg.gpa, .{});
13151316 // clean up outer branch
......@@ -1339,8 +1340,8 @@ fn functionInner(cg: *CodeGen, any_returns: bool) InnerError!Function {
13391340 .mir_len = @intCast(wasm.mir_instructions.len - start_mir_off),
13401341 .mir_extra_off = cg.start_mir_extra_off,
13411342 .mir_extra_len = cg.extraLen(),
1342 .locals_off = start_locals_off,
1343 .locals_len = @intCast(wasm.all_zcu_locals.items.len - start_locals_off),
1343 .locals_off = cg.start_locals_off,
1344 .locals_len = @intCast(wasm.all_zcu_locals.items.len - cg.start_locals_off),
13441345 .prologue = if (cg.initial_stack_value == .none) .none else .{
13451346 .sp_local = cg.initial_stack_value.local.value,
13461347 .flags = .{ .stack_alignment = cg.stack_alignment },