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(
23472347 (is_spirv and (context == null or context == .constant or context == .pointer)),
23482348 .param => is_nvptx,
23492349 .input, .output, .uniform, .push_constant, .storage_buffer, .physical_storage_buffer => is_spirv,
2350 .externref, .funcref => target.cpu.has(.wasm, .reference_types),
23502351 };
23512352}
23522353
lib/std/lang.zig+4
......@@ -567,6 +567,10 @@ pub const AddressSpace = enum(u5) {
567567
568568 /// This address space only addresses the "lookup" ram
569569 lut,
570
571 // Web Assembly
572 externref,
573 funcref,
570574};
571575
572576/// 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 {
46744674 .wasm32, .wasm64 => &.{
46754675 .{ .zig = .generic, .llvm = Builder.AddrSpace.wasm.default, .force_in_data_layout = true },
46764676 .{ .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 },
4678 .{ .zig = null, .llvm = Builder.AddrSpace.wasm.funcref, .non_integral = true, .size = 8, .abi = 8 },
4677 .{ .zig = .externref, .llvm = Builder.AddrSpace.wasm.externref, .non_integral = true, .size = 8, .abi = 8 },
4678 .{ .zig = .funcref, .llvm = Builder.AddrSpace.wasm.funcref, .non_integral = true, .size = 8, .abi = 8 },
46794679 },
46804680 .m68k => &.{
46814681 .{ .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
10591059 .cog,
10601060 .lut,
10611061 .hub,
1062 .externref,
1063 .funcref,
10621064 => unreachable,
10631065 };
10641066}