diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2025-01-10 00:42:04 -0800 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2025-01-15 15:11:36 -0800 |
| commit | a327d238f1fa6c79ac8254785082b8ffb54945f0 (patch) | |
| tree | da521e3f1e3cce70072f0bf6fc07eefa2d474d84 /src/codegen.zig | |
| parent | d999a8e33b75a6ddd477cc71d8f682fe703496eb (diff) | |
| download | zig-a327d238f1fa6c79ac8254785082b8ffb54945f0.tar.gz zig-a327d238f1fa6c79ac8254785082b8ffb54945f0.zip | |
wasm linker: handle function data references properly
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index e133ee9937..b38844e4e2 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -738,19 +738,32 @@ fn lowerNavRef( dev.check(link.File.Tag.wasm.devFeature()); const wasm = lf.cast(.wasm).?; assert(reloc_parent == .none); - if (is_obj) { - try wasm.out_relocs.append(gpa, .{ - .offset = @intCast(code.items.len), - .pointee = .{ .symbol_index = try wasm.navSymbolIndex(nav_index) }, - .tag = if (ptr_width_bytes == 4) .memory_addr_i32 else .memory_addr_i64, - .addend = @intCast(offset), - }); + if (is_fn_body) { + const gop = try wasm.zcu_indirect_function_set.getOrPut(gpa, nav_index); + if (!gop.found_existing) gop.value_ptr.* = {}; + if (is_obj) { + @panic("TODO add out_reloc for this"); + } else { + try wasm.func_table_fixups.append(gpa, .{ + .table_index = @enumFromInt(gop.index), + .offset = @intCast(code.items.len), + }); + } } else { - try wasm.nav_fixups.ensureUnusedCapacity(gpa, 1); - wasm.nav_fixups.appendAssumeCapacity(.{ - .navs_exe_index = try wasm.refNavExe(nav_index), - .offset = @intCast(code.items.len), - }); + if (is_obj) { + try wasm.out_relocs.append(gpa, .{ + .offset = @intCast(code.items.len), + .pointee = .{ .symbol_index = try wasm.navSymbolIndex(nav_index) }, + .tag = if (ptr_width_bytes == 4) .memory_addr_i32 else .memory_addr_i64, + .addend = @intCast(offset), + }); + } else { + try wasm.nav_fixups.ensureUnusedCapacity(gpa, 1); + wasm.nav_fixups.appendAssumeCapacity(.{ + .navs_exe_index = try wasm.refNavExe(nav_index), + .offset = @intCast(code.items.len), + }); + } } code.appendNTimesAssumeCapacity(0, ptr_width_bytes); return; |
