wasm linker: don't pretend it's possible to export data symbols

This commit is contained in:
Andrew Kelley 2025-01-11 17:50:17 -08:00
parent 0dd0ebb6e2
commit fbdcb2289b
3 changed files with 32 additions and 10 deletions

View File

@ -154,14 +154,15 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void {
if (nav_export.name.toOptional() == entry_name)
wasm.entry_resolution = .fromIpNav(wasm, nav_export.nav_index);
} else {
try wasm.global_exports.append(gpa, .{
.name = nav_export.name,
.global_index = Wasm.GlobalIndex.fromIpNav(wasm, nav_export.nav_index).?,
});
// This is a data export because Zcu currently has no way to
// export wasm globals.
_ = f.missing_exports.swapRemove(nav_export.name);
_ = f.data_imports.swapRemove(nav_export.name);
// `f.global_imports` is ignored because Zcu has no way to
// export wasm globals.
if (!is_obj) {
diags.addError("unable to export data symbol '{s}'; not emitting a relocatable", .{
nav_export.name.slice(wasm),
});
}
}
}

View File

@ -31,8 +31,6 @@ test {
_ = @import("behavior/error.zig");
_ = @import("behavior/eval.zig");
_ = @import("behavior/export_builtin.zig");
_ = @import("behavior/export_self_referential_type_info.zig");
_ = @import("behavior/extern.zig");
_ = @import("behavior/field_parent_ptr.zig");
_ = @import("behavior/floatop.zig");
_ = @import("behavior/fn.zig");
@ -45,7 +43,6 @@ test {
_ = @import("behavior/hasfield.zig");
_ = @import("behavior/if.zig");
_ = @import("behavior/import.zig");
_ = @import("behavior/import_c_keywords.zig");
_ = @import("behavior/incomplete_struct_param_tld.zig");
_ = @import("behavior/inline_switch.zig");
_ = @import("behavior/int128.zig");
@ -127,6 +124,16 @@ test {
{
_ = @import("behavior/export_keyword.zig");
}
if (!builtin.cpu.arch.isWasm()) {
// Due to lack of import/export of global support
// (https://github.com/ziglang/zig/issues/4866), these tests correctly
// cause linker errors, since a data symbol cannot be exported when
// building an executable.
_ = @import("behavior/export_self_referential_type_info.zig");
_ = @import("behavior/extern.zig");
_ = @import("behavior/import_c_keywords.zig");
}
}
// This bug only repros in the root file

View File

@ -6,6 +6,11 @@ test "exporting enum value" {
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
if (builtin.cpu.arch.isWasm()) {
// https://github.com/ziglang/zig/issues/4866
return error.SkipZigTest;
}
const S = struct {
const E = enum(c_int) { one, two };
const e: E = .two;
@ -33,6 +38,11 @@ test "exporting using namespace access" {
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
if (builtin.cpu.arch.isWasm()) {
// https://github.com/ziglang/zig/issues/4866
return error.SkipZigTest;
}
const S = struct {
const Inner = struct {
const x: u32 = 5;
@ -46,7 +56,6 @@ test "exporting using namespace access" {
}
test "exporting comptime-known value" {
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_x86_64 and
(builtin.target.ofmt != .elf and
@ -56,6 +65,11 @@ test "exporting comptime-known value" {
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
if (builtin.cpu.arch.isWasm()) {
// https://github.com/ziglang/zig/issues/4866
return error.SkipZigTest;
}
const x: u32 = 10;
@export(&x, .{ .name = "exporting_comptime_known_value_foo" });
const S = struct {