From a3da3eea8f3bf0c9e26a84e9c280662d95c6bda2 Mon Sep 17 00:00:00 2001 From: Ryan King Date: Wed, 17 Jun 2026 22:36:19 +0200 Subject: [PATCH] wasm: add externref and funcref address spaces (#35813) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes https://codeberg.org/ziglang/zig/issues/31190 Reviewed-on: https://codeberg.org/ziglang/zig/pulls/35813 Reviewed-by: Alex Rønne Petersen --- lib/std/Target.zig | 1 + lib/std/lang.zig | 4 ++++ src/codegen/llvm.zig | 4 ++-- src/codegen/spirv/Module.zig | 2 ++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/std/Target.zig b/lib/std/Target.zig index 3d4886e47d0e7d5ffa4b4ed0b53e0f12d2668a20..98eb5a8b46361335173e924a4d03727d295b0674 100644 --- a/lib/std/Target.zig +++ b/lib/std/Target.zig @@ -2347,6 +2347,7 @@ pub fn supportsAddressSpace( (is_spirv and (context == null or context == .constant or context == .pointer)), .param => is_nvptx, .input, .output, .uniform, .push_constant, .storage_buffer, .physical_storage_buffer => is_spirv, + .externref, .funcref => target.cpu.has(.wasm, .reference_types), }; } diff --git a/lib/std/lang.zig b/lib/std/lang.zig index 7f04a24804bc5cafb02fc6d83c8fd7d3fedaeac8..c108d7050d003465ec080d76335ac25e3ded3446 100644 --- a/lib/std/lang.zig +++ b/lib/std/lang.zig @@ -567,6 +567,10 @@ pub const AddressSpace = enum(u5) { /// This address space only addresses the "lookup" ram lut, + + // Web Assembly + externref, + funcref, }; /// This data structure is used by the Zig language code generation and diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 0b5f8490ce10f90397847f8fd3c520c3632c285b..f687382dada59d488106487c1e32b0540d0086f3 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -4674,8 +4674,8 @@ fn llvmAddrSpaceInfo(target: *const std.Target) []const AddrSpaceInfo { .wasm32, .wasm64 => &.{ .{ .zig = .generic, .llvm = Builder.AddrSpace.wasm.default, .force_in_data_layout = true }, .{ .zig = null, .llvm = Builder.AddrSpace.wasm.variable, .non_integral = true }, - .{ .zig = null, .llvm = Builder.AddrSpace.wasm.externref, .non_integral = true, .size = 8, .abi = 8 }, - .{ .zig = null, .llvm = Builder.AddrSpace.wasm.funcref, .non_integral = true, .size = 8, .abi = 8 }, + .{ .zig = .externref, .llvm = Builder.AddrSpace.wasm.externref, .non_integral = true, .size = 8, .abi = 8 }, + .{ .zig = .funcref, .llvm = Builder.AddrSpace.wasm.funcref, .non_integral = true, .size = 8, .abi = 8 }, }, .m68k => &.{ .{ .zig = .generic, .llvm = .default, .abi = 16, .pref = 32 }, diff --git a/src/codegen/spirv/Module.zig b/src/codegen/spirv/Module.zig index 52e8588cafac531df34583644a9b0f74ba391a58..a4e30f2ec9d75321c419e7ed0fc391955a67dced 100644 --- a/src/codegen/spirv/Module.zig +++ b/src/codegen/spirv/Module.zig @@ -1059,6 +1059,8 @@ pub fn storageClass(module: *Module, as: std.lang.AddressSpace) spec.StorageClas .cog, .lut, .hub, + .externref, + .funcref, => unreachable, }; } -- 2.54.0