aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-01-10 00:42:04 -0800
committerAndrew Kelley <andrew@ziglang.org>2025-01-15 15:11:36 -0800
commita327d238f1fa6c79ac8254785082b8ffb54945f0 (patch)
treeda521e3f1e3cce70072f0bf6fc07eefa2d474d84 /src/codegen.zig
parentd999a8e33b75a6ddd477cc71d8f682fe703496eb (diff)
downloadzig-a327d238f1fa6c79ac8254785082b8ffb54945f0.tar.gz
zig-a327d238f1fa6c79ac8254785082b8ffb54945f0.zip
wasm linker: handle function data references properly
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig37
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;