diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index cd08cbfdfd..cf1a560fb3 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -3502,7 +3502,7 @@ fn markFunction(wasm: *Wasm, i: ObjectFunctionIndex, override_export: bool) link if (!is_obj and (override_export or function.flags.isExported(rdynamic))) { const symbol_name = function.name.unwrap().?; - if (function.flags.visibility_hidden) { + if (!override_export and function.flags.visibility_hidden) { try wasm.hidden_function_exports.put(gpa, symbol_name, @enumFromInt(gop.index)); } else { try wasm.function_exports.put(gpa, symbol_name, @enumFromInt(gop.index)); diff --git a/src/link/Wasm/Flush.zig b/src/link/Wasm/Flush.zig index 800803cc21..c001b751d4 100644 --- a/src/link/Wasm/Flush.zig +++ b/src/link/Wasm/Flush.zig @@ -210,9 +210,8 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void { const function_index = Wasm.FunctionIndex.fromIpNav(wasm, nav_export.nav_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, + .default, .protected => false, }; if (is_hidden) { try wasm.hidden_function_exports.put(gpa, nav_export.name, function_index); diff --git a/test/link/wasm/export/build.zig b/test/link/wasm/export/build.zig index 21b185dac4..cf2c75e3b4 100644 --- a/test/link/wasm/export/build.zig +++ b/test/link/wasm/export/build.zig @@ -11,7 +11,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize const no_export = b.addExecutable(.{ .name = "no-export", .root_module = b.createModule(.{ - .root_source_file = b.path("main.zig"), + .root_source_file = b.path("main-hidden.zig"), .optimize = optimize, .target = b.resolveTargetQuery(.{ .cpu_arch = .wasm32, .os_tag = .freestanding }), }), @@ -36,7 +36,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize const force_export = b.addExecutable(.{ .name = "force", .root_module = b.createModule(.{ - .root_source_file = b.path("main.zig"), + .root_source_file = b.path("main-hidden.zig"), .optimize = optimize, .target = b.resolveTargetQuery(.{ .cpu_arch = .wasm32, .os_tag = .freestanding }), }), diff --git a/test/link/wasm/export/main-hidden.zig b/test/link/wasm/export/main-hidden.zig new file mode 100644 index 0000000000..12589d064c --- /dev/null +++ b/test/link/wasm/export/main-hidden.zig @@ -0,0 +1,4 @@ +fn foo() callconv(.c) void {} +comptime { + @export(&foo, .{ .name = "foo", .visibility = .hidden }); +} diff --git a/test/link/wasm/function-table/build.zig b/test/link/wasm/function-table/build.zig index 38a2bf1e32..f922b06aec 100644 --- a/test/link/wasm/function-table/build.zig +++ b/test/link/wasm/function-table/build.zig @@ -40,7 +40,7 @@ fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.Optimize check_export.checkInHeaders(); check_export.checkExact("Section export"); - check_export.checkExact("entries 2"); + check_export.checkExact("entries 3"); check_export.checkExact("name __indirect_function_table"); // as per linker specification check_export.checkExact("kind table");