authorgravatar for code@ryank.ingRyan King <code@ryank.ing> 2026-06-17 22:36:19+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-06-17 22:36:19+02:00
loga3da3eea8f3bf0c9e26a84e9c280662d95c6bda2
tree303f597cb33f7f2ebd820b588205862ff9d56601
parent180f6156f58b921920f3491f423759b4d7bd187c

wasm: add externref and funcref address spaces (#35813)

closes https://codeberg.org/ziglang/zig/issues/31190 Reviewed-on: https://codeberg.org/ziglang/zig/pulls/35813 Reviewed-by: Alex Rønne Petersen <alex@alexrp.com>

4 files changed, 9 insertions(+), 2 deletions(-)

lib/std/Target.zig+1
...@@ -2347,6 +2347,7 @@ pub fn supportsAddressSpace(...@@ -2347,6 +2347,7 @@ pub fn supportsAddressSpace(
2347 (is_spirv and (context == null or context == .constant or context == .pointer)),2347 (is_spirv and (context == null or context == .constant or context == .pointer)),
2348 .param => is_nvptx,2348 .param => is_nvptx,
2349 .input, .output, .uniform, .push_constant, .storage_buffer, .physical_storage_buffer => is_spirv,2349 .input, .output, .uniform, .push_constant, .storage_buffer, .physical_storage_buffer => is_spirv,
2350 .externref, .funcref => target.cpu.has(.wasm, .reference_types),
2350 };2351 };
2351}2352}
23522353
lib/std/lang.zig+4
...@@ -567,6 +567,10 @@ pub const AddressSpace = enum(u5) {...@@ -567,6 +567,10 @@ pub const AddressSpace = enum(u5) {
567567
568 /// This address space only addresses the "lookup" ram568 /// This address space only addresses the "lookup" ram
569 lut,569 lut,
570
571 // Web Assembly
572 externref,
573 funcref,
570};574};
571575
572/// This data structure is used by the Zig language code generation and576/// This data structure is used by the Zig language code generation and
src/codegen/llvm.zig+2-2
...@@ -4674,8 +4674,8 @@ fn llvmAddrSpaceInfo(target: *const std.Target) []const AddrSpaceInfo {...@@ -4674,8 +4674,8 @@ fn llvmAddrSpaceInfo(target: *const std.Target) []const AddrSpaceInfo {
4674 .wasm32, .wasm64 => &.{4674 .wasm32, .wasm64 => &.{
4675 .{ .zig = .generic, .llvm = Builder.AddrSpace.wasm.default, .force_in_data_layout = true },4675 .{ .zig = .generic, .llvm = Builder.AddrSpace.wasm.default, .force_in_data_layout = true },
4676 .{ .zig = null, .llvm = Builder.AddrSpace.wasm.variable, .non_integral = true },4676 .{ .zig = null, .llvm = Builder.AddrSpace.wasm.variable, .non_integral = true },
4677 .{ .zig = null, .llvm = Builder.AddrSpace.wasm.externref, .non_integral = true, .size = 8, .abi = 8 },4677 .{ .zig = .externref, .llvm = Builder.AddrSpace.wasm.externref, .non_integral = true, .size = 8, .abi = 8 },
4678 .{ .zig = null, .llvm = Builder.AddrSpace.wasm.funcref, .non_integral = true, .size = 8, .abi = 8 },4678 .{ .zig = .funcref, .llvm = Builder.AddrSpace.wasm.funcref, .non_integral = true, .size = 8, .abi = 8 },
4679 },4679 },
4680 .m68k => &.{4680 .m68k => &.{
4681 .{ .zig = .generic, .llvm = .default, .abi = 16, .pref = 32 },4681 .{ .zig = .generic, .llvm = .default, .abi = 16, .pref = 32 },
src/codegen/spirv/Module.zig+2
...@@ -1059,6 +1059,8 @@ pub fn storageClass(module: *Module, as: std.lang.AddressSpace) spec.StorageClas...@@ -1059,6 +1059,8 @@ pub fn storageClass(module: *Module, as: std.lang.AddressSpace) spec.StorageClas
1059 .cog,1059 .cog,
1060 .lut,1060 .lut,
1061 .hub,1061 .hub,
1062 .externref,
1063 .funcref,
1062 => unreachable,1064 => unreachable,
1063 };1065 };
1064}1066}