zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 2a62dbda0bb5e5c8a1c92a058b684309bd7efeeb (tree)
parent 476202eec03a2196daab7f9998c556796cc42eca
Author: Luuk de Gram <luuk@degram.dev>
Date:   Sat, 17 Dec 2022 17:17:34 +0100

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:
Msrc/link/Wasm/Atom.zig | 13+++++++------
1 file changed, 7 insertions(+), 6 deletions(-)

diff --git 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,