wasm-linker: correctly resolve undefined functions

We now resolve undefined symbols during incremental-compilation
where we discard the current symbol if we detect we found
an existing symbol which is not the one currently being updated.
The symbol will always be discarded in favor of the existing symbol
in such a case.
This commit is contained in:
Luuk de Gram 2023-06-15 20:15:01 +02:00
parent e3db210cf1
commit 44b322ce64
No known key found for this signature in database
GPG Key ID: A8CFE58E4DC7D664
2 changed files with 12 additions and 2 deletions

View File

@ -1909,6 +1909,17 @@ pub fn addOrUpdateImport(
global_gop.value_ptr.* = loc;
try wasm.resolved_symbols.put(wasm.base.allocator, loc, {});
try wasm.undefs.putNoClobber(wasm.base.allocator, decl_name_index, loc);
} else if (global_gop.value_ptr.*.index != symbol_index) {
// We are not updating a symbol, but found an existing global
// symbol with the same name. This means we always favor the
// existing symbol, regardless whether it's defined or not.
// We can also skip storing the import as we will not output
// this symbol.
return wasm.discarded.put(
wasm.base.allocator,
.{ .file = null, .index = symbol_index },
global_gop.value_ptr.*,
);
}
if (type_index) |ty_index| {
@ -1924,8 +1935,8 @@ pub fn addOrUpdateImport(
};
}
} else {
// non-functions will not be imported from the runtime, but only resolved during link-time
symbol.tag = .data;
return; // non-functions will not be imported from the runtime, but only resolved during link-time
}
}

View File

@ -11,7 +11,6 @@ comptime {
const builtin = @import("builtin");
test "issue 529 fixed" {
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO