aboutsummaryrefslogtreecommitdiff
path: root/src/link/Wasm/Atom.zig
diff options
context:
space:
mode:
authorLuuk de Gram <luuk@degram.dev>2022-12-17 17:17:34 +0100
committerLuuk de Gram <luuk@degram.dev>2022-12-17 17:17:34 +0100
commit2a62dbda0bb5e5c8a1c92a058b684309bd7efeeb (patch)
tree923fba4c3fff74adf5e5e7f2ec921b6c7825ba46 /src/link/Wasm/Atom.zig
parent476202eec03a2196daab7f9998c556796cc42eca (diff)
downloadzig-2a62dbda0bb5e5c8a1c92a058b684309bd7efeeb.tar.gz
zig-2a62dbda0bb5e5c8a1c92a058b684309bd7efeeb.zip
wasm-linker: fix type index relocations
Previously we used the relocation index to find the corresponding symbol that represents the type. However, the index actually represents the index into the list of types. We solved this by first retrieving the original type, and then finding its location in the new list of types. When the atom file is 'null', it means the type originates from a Zig function pointer or a synthetic function. In both cases, the final type index was already resolved and therefore equals to relocation's index value.
Diffstat (limited to 'src/link/Wasm/Atom.zig')
-rw-r--r--src/link/Wasm/Atom.zig13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/link/Wasm/Atom.zig b/src/link/Wasm/Atom.zig
index 4f16a1c2fb..f716cd56ee 100644
--- a/src/link/Wasm/Atom.zig
+++ b/src/link/Wasm/Atom.zig
@@ -168,12 +168,13 @@ fn relocationValue(atom: Atom, relocation: types.Relocation, wasm_bin: *const Wa
.R_WASM_TABLE_INDEX_SLEB,
.R_WASM_TABLE_INDEX_SLEB64,
=> return wasm_bin.function_table.get(target_loc) orelse 0,
- .R_WASM_TYPE_INDEX_LEB => return blk: {
- if (symbol.isUndefined()) {
- const imp = wasm_bin.imports.get(target_loc).?;
- break :blk imp.kind.function;
- }
- break :blk wasm_bin.functions.values()[symbol.index - wasm_bin.imported_functions_count].type_index;
+ .R_WASM_TYPE_INDEX_LEB => {
+ const file_index = atom.file orelse {
+ return relocation.index;
+ };
+
+ const original_type = wasm_bin.objects.items[file_index].func_types[relocation.index];
+ return wasm_bin.getTypeIndex(original_type).?;
},
.R_WASM_GLOBAL_INDEX_I32,
.R_WASM_GLOBAL_INDEX_LEB,