diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index 8f470e5b14..2091984180 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -4674,3 +4674,16 @@ fn resolveFunctionSynthetic( }); } } + +pub fn addFunction( + wasm: *Wasm, + resolution: FunctionImport.Resolution, + params: []const std.wasm.Valtype, + returns: []const std.wasm.Valtype, +) Allocator.Error!void { + wasm.functions.putAssumeCapacity(resolution, {}); + _ = try wasm.addFuncType(.{ + .params = try wasm.internValtypeList(params), + .returns = try wasm.internValtypeList(returns), + }); +} diff --git a/src/link/Wasm/Flush.zig b/src/link/Wasm/Flush.zig index 137edd5bd5..1a46350e95 100644 --- a/src/link/Wasm/Flush.zig +++ b/src/link/Wasm/Flush.zig @@ -168,11 +168,17 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void { if (ip.isFunctionType(ip.getNav(nav_export.nav_index).typeOf(ip))) { log.debug("flush export '{s}' nav={d}", .{ nav_export.name.slice(wasm), nav_export.nav_index }); const function_index = Wasm.FunctionIndex.fromIpNav(wasm, nav_export.nav_index).?; - switch (export_index.ptr(zcu).opts.visibility) { - .default, .protected => try wasm.function_exports.put(gpa, nav_export.name, function_index), - .hidden => try wasm.hidden_function_exports.put(gpa, nav_export.name, function_index), + const explicit = f.missing_exports.swapRemove(nav_export.name); + const is_hidden = !explicit and switch (export_index.ptr(zcu).opts.visibility) { + .protected => false, + .hidden => true, + .default => !comp.config.rdynamic, + }; + if (is_hidden) { + try wasm.hidden_function_exports.put(gpa, nav_export.name, function_index); + } else { + try wasm.function_exports.put(gpa, nav_export.name, function_index); } - _ = f.missing_exports.swapRemove(nav_export.name); _ = f.function_imports.swapRemove(nav_export.name); if (nav_export.name.toOptional() == entry_name) @@ -281,9 +287,7 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void { // We also initialize bss segments (using memory.fill) as part of this // function. if (wasm.any_passive_inits) { - wasm.functions.putAssumeCapacity(.__wasm_init_memory, {}); - const empty = try wasm.internValtypeList(&.{}); - _ = try wasm.addFuncType(.{ .params = empty, .returns = empty }); + try wasm.addFunction(.__wasm_init_memory, &.{}, &.{}); } // When we have TLS GOT entries and shared memory is enabled, @@ -291,8 +295,8 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void { if (shared_memory) { // This logic that checks `any_tls_relocs` is missing the part where it // also notices threadlocal globals from Zcu code. - if (wasm.any_tls_relocs) wasm.functions.putAssumeCapacity(.__wasm_apply_global_tls_relocs, {}); - wasm.functions.putAssumeCapacity(.__wasm_init_tls, {}); + if (wasm.any_tls_relocs) try wasm.addFunction(.__wasm_apply_global_tls_relocs, &.{}, &.{}); + try wasm.addFunction(.__wasm_init_tls, &.{.i32}, &.{}); } try wasm.tables.ensureUnusedCapacity(gpa, 1);