diff --git a/build.zig b/build.zig index 36bb1e0f73..5f9b56fa6d 100644 --- a/build.zig +++ b/build.zig @@ -718,7 +718,7 @@ fn addCmakeCfgOptionsToExe( }; exe.linkSystemLibrary("unwind"); }, - .ios, .macos, .watchos, .tvos => { + .ios, .macos, .watchos, .tvos, .visionos => { exe.linkLibCpp(); }, .windows => { diff --git a/lib/compiler/aro/aro/Compilation.zig b/lib/compiler/aro/aro/Compilation.zig index 8329ad4405..d6b9b91780 100644 --- a/lib/compiler/aro/aro/Compilation.zig +++ b/lib/compiler/aro/aro/Compilation.zig @@ -912,12 +912,12 @@ fn generateVaListType(comp: *Compilation) !Type { const kind: Kind = switch (comp.target.cpu.arch) { .aarch64 => switch (comp.target.os.tag) { .windows => @as(Kind, .char_ptr), - .ios, .macos, .tvos, .watchos => .char_ptr, + .ios, .macos, .tvos, .watchos, .visionos => .char_ptr, else => .aarch64_va_list, }, .sparc, .wasm32, .wasm64, .bpfel, .bpfeb, .riscv32, .riscv64, .avr, .spirv32, .spirv64 => .void_ptr, .powerpc => switch (comp.target.os.tag) { - .ios, .macos, .tvos, .watchos, .aix => @as(Kind, .char_ptr), + .ios, .macos, .tvos, .watchos, .visionos, .aix => @as(Kind, .char_ptr), else => return Type{ .specifier = .void }, // unknown }, .x86, .msp430 => .char_ptr, diff --git a/lib/compiler/aro/aro/target.zig b/lib/compiler/aro/aro/target.zig index dcb4777de6..62f9ffad1a 100644 --- a/lib/compiler/aro/aro/target.zig +++ b/lib/compiler/aro/aro/target.zig @@ -706,6 +706,7 @@ pub fn toLLVMTriple(target: std.Target, buf: []u8) []const u8 { .ios => "ios", .tvos => "tvos", .watchos => "watchos", + .visionos => "xros", .driverkit => "driverkit", .shadermodel => "shadermodel", .liteos => "liteos", diff --git a/lib/compiler_rt/clear_cache.zig b/lib/compiler_rt/clear_cache.zig index 33d34ee42d..a2ea8f7c8e 100644 --- a/lib/compiler_rt/clear_cache.zig +++ b/lib/compiler_rt/clear_cache.zig @@ -45,7 +45,7 @@ fn clear_cache(start: usize, end: usize) callconv(.C) void { else => false, }; const apple = switch (os) { - .ios, .macos, .watchos, .tvos => true, + .ios, .macos, .watchos, .tvos, .visionos => true, else => false, }; if (x86) { diff --git a/lib/std/Target.zig b/lib/std/Target.zig index 842442e37b..6ffb302884 100644 --- a/lib/std/Target.zig +++ b/lib/std/Target.zig @@ -46,6 +46,7 @@ pub const Os = struct { elfiamcu, tvos, watchos, + visionos, driverkit, mesa3d, contiki, @@ -65,7 +66,7 @@ pub const Os = struct { pub inline fn isDarwin(tag: Tag) bool { return switch (tag) { - .ios, .macos, .watchos, .tvos => true, + .ios, .macos, .watchos, .tvos, .visionos => true, else => false, }; } @@ -316,6 +317,12 @@ pub const Os = struct { .max = .{ .major = 17, .minor = 1, .patch = 0 }, }, }, + .visionos => return .{ + .semver = .{ + .min = .{ .major = 1, .minor = 0, .patch = 0 }, + .max = .{ .major = 1, .minor = 0, .patch = 0 }, + }, + }, .netbsd => return .{ .semver = .{ .min = .{ .major = 8, .minor = 0, .patch = 0 }, @@ -380,6 +387,7 @@ pub const Os = struct { .ios, .tvos, .watchos, + .visionos, .netbsd, .openbsd, .dragonfly, @@ -416,6 +424,7 @@ pub const Os = struct { .ios, .tvos, .watchos, + .visionos, .dragonfly, .openbsd, .haiku, @@ -577,6 +586,7 @@ pub const Abi = enum { .ios, .tvos, .watchos, + .visionos, .driverkit, .shadermodel, .liteos, // TODO: audit this @@ -652,7 +662,7 @@ pub const ObjectFormat = enum { pub fn default(os_tag: Os.Tag, cpu_arch: Cpu.Arch) ObjectFormat { return switch (os_tag) { .windows, .uefi => .coff, - .ios, .macos, .watchos, .tvos => .macho, + .ios, .macos, .watchos, .tvos, .visionos => .macho, .plan9 => .plan9, else => return switch (cpu_arch) { .wasm32, .wasm64 => .wasm, @@ -1525,6 +1535,7 @@ pub inline fn hasDynamicLinker(self: Target) bool { .ios, .tvos, .watchos, + .visionos, .macos, .uefi, .windows, @@ -1729,6 +1740,7 @@ pub fn standardDynamicLinkerPath_cpu_os_abi(cpu: Cpu, os_tag: Os.Tag, abi: Abi) .tvos, .watchos, .macos, + .visionos, => return copy(&result, "/usr/lib/dyld"), // Operating systems in this list have been verified as not having a standard @@ -2314,7 +2326,7 @@ pub fn c_type_bit_size(target: Target, c_type: CType) u16 { }, }, - .macos, .ios, .tvos, .watchos => switch (c_type) { + .macos, .ios, .tvos, .watchos, .visionos => switch (c_type) { .char => return 8, .short, .ushort => return 16, .int, .uint, .float => return 32, diff --git a/lib/std/Target/Query.zig b/lib/std/Target/Query.zig index d290e2a8d2..528dbfedcb 100644 --- a/lib/std/Target/Query.zig +++ b/lib/std/Target/Query.zig @@ -171,6 +171,7 @@ fn updateOsVersionRange(self: *Query, os: Target.Os) void { .ios, .tvos, .watchos, + .visionos, .netbsd, .openbsd, .dragonfly, @@ -613,6 +614,7 @@ fn parseOs(result: *Query, diags: *ParseOptions.Diagnostics, text: []const u8) ! .ios, .tvos, .watchos, + .visionos, .netbsd, .openbsd, .linux, diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig index d1c8a24f0a..96feab5c02 100644 --- a/lib/std/Thread.zig +++ b/lib/std/Thread.zig @@ -39,7 +39,7 @@ impl: Impl, pub const max_name_len = switch (native_os) { .linux => 15, .windows => 31, - .macos, .ios, .watchos, .tvos => 63, + .macos, .ios, .watchos, .tvos, .visionos => 63, .netbsd => 31, .freebsd => 15, .openbsd => 23, @@ -114,7 +114,7 @@ pub fn setName(self: Thread, name: []const u8) SetNameError!void { else => |err| return windows.unexpectedStatus(err), } }, - .macos, .ios, .watchos, .tvos => if (use_pthreads) { + .macos, .ios, .watchos, .tvos, .visionos => if (use_pthreads) { // There doesn't seem to be a way to set the name for an arbitrary thread, only the current one. if (self.getHandle() != std.c.pthread_self()) return error.Unsupported; @@ -217,7 +217,7 @@ pub fn getName(self: Thread, buffer_ptr: *[max_name_len:0]u8) GetNameError!?[]co else => |err| return windows.unexpectedStatus(err), } }, - .macos, .ios, .watchos, .tvos => if (use_pthreads) { + .macos, .ios, .watchos, .tvos, .visionos => if (use_pthreads) { const err = std.c.pthread_getname_np(self.getHandle(), buffer.ptr, max_name_len + 1); switch (err) { .SUCCESS => return std.mem.sliceTo(buffer, 0), @@ -266,7 +266,7 @@ pub const Id = switch (native_os) { .haiku, .wasi, => u32, - .macos, .ios, .watchos, .tvos => u64, + .macos, .ios, .watchos, .tvos, .visionos => u64, .windows => windows.DWORD, else => usize, }; @@ -588,7 +588,7 @@ const PosixThreadImpl = struct { .linux => { return LinuxThreadImpl.getCurrentId(); }, - .macos, .ios, .watchos, .tvos => { + .macos, .ios, .watchos, .tvos, .visionos => { var thread_id: u64 = undefined; // Pass thread=null to get the current thread ID. assert(c.pthread_threadid_np(null, &thread_id) == 0); @@ -1434,7 +1434,7 @@ test "setName, getName" { context.test_done_event.wait(); switch (native_os) { - .macos, .ios, .watchos, .tvos => { + .macos, .ios, .watchos, .tvos, .visionos => { const res = thread.setName("foobar"); try std.testing.expectError(error.Unsupported, res); }, diff --git a/lib/std/builtin.zig b/lib/std/builtin.zig index 6f6e0c97fc..9151c612c2 100644 --- a/lib/std/builtin.zig +++ b/lib/std/builtin.zig @@ -597,7 +597,7 @@ pub const VaListX86_64 = extern struct { pub const VaList = switch (builtin.cpu.arch) { .aarch64, .aarch64_be => switch (builtin.os.tag) { .windows => *u8, - .ios, .macos, .tvos, .watchos => *u8, + .ios, .macos, .tvos, .watchos, .visionos => *u8, else => @compileError("disabled due to miscompilations"), // VaListAarch64, }, .arm => switch (builtin.os.tag) { diff --git a/lib/std/c.zig b/lib/std/c.zig index 9b3fe4fcb4..b1da7c0a2d 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -35,7 +35,7 @@ pub inline fn versionCheck(comptime glibc_version: std.SemanticVersion) bool { pub usingnamespace switch (native_os) { .linux => @import("c/linux.zig"), .windows => @import("c/windows.zig"), - .macos, .ios, .tvos, .watchos => @import("c/darwin.zig"), + .macos, .ios, .tvos, .watchos, .visionos => @import("c/darwin.zig"), .freebsd, .kfreebsd => @import("c/freebsd.zig"), .netbsd => @import("c/netbsd.zig"), .dragonfly => @import("c/dragonfly.zig"), @@ -63,7 +63,7 @@ pub const pthread_mutex_t = switch (native_os) { else => @compileError("unsupported ABI"), }; }, - .macos, .ios, .tvos, .watchos => extern struct { + .macos, .ios, .tvos, .watchos, .visionos => extern struct { sig: c_long = 0x32AAABA7, data: [data_len]u8 = [_]u8{0} ** data_len, @@ -113,7 +113,7 @@ pub const pthread_cond_t = switch (native_os) { .linux => extern struct { data: [48]u8 align(@alignOf(usize)) = [_]u8{0} ** 48, }, - .macos, .ios, .tvos, .watchos => extern struct { + .macos, .ios, .tvos, .watchos, .visionos => extern struct { sig: c_long = 0x3CB0B1BB, data: [data_len]u8 = [_]u8{0} ** data_len, const data_len = if (@sizeOf(usize) == 8) 40 else 24; @@ -166,7 +166,7 @@ pub const pthread_rwlock_t = switch (native_os) { data: [56]u8 align(@alignOf(usize)) = [_]u8{0} ** 56, }, }, - .macos, .ios, .tvos, .watchos => extern struct { + .macos, .ios, .tvos, .watchos, .visionos => extern struct { sig: c_long = 0x2DA8B3B4, data: [192]u8 = [_]u8{0} ** 192, }, @@ -214,7 +214,7 @@ pub const AT = switch (native_os) { /// Remove directory instead of unlinking file pub const REMOVEDIR = 0x200; }, - .macos, .ios, .tvos, .watchos => struct { + .macos, .ios, .tvos, .watchos, .visionos => struct { pub const FDCWD = -2; /// Use effective ids in access check pub const EACCESS = 0x0010; @@ -458,7 +458,7 @@ pub const O = switch (native_os) { DIRECTORY: bool = false, _: u10 = 0, }, - .macos, .ios, .tvos, .watchos => packed struct(u32) { + .macos, .ios, .tvos, .watchos, .visionos => packed struct(u32) { ACCMODE: std.posix.ACCMODE = .RDONLY, NONBLOCK: bool = false, APPEND: bool = false, @@ -620,7 +620,7 @@ pub const MAP = switch (native_os) { NORESERVE: bool = false, _: u27 = 0, }, - .macos, .ios, .tvos, .watchos => packed struct(u32) { + .macos, .ios, .tvos, .watchos, .visionos => packed struct(u32) { TYPE: enum(u4) { SHARED = 0x01, PRIVATE = 0x02, @@ -685,7 +685,7 @@ pub const cc_t = u8; /// Indices into the `cc` array in the `termios` struct. pub const V = switch (native_os) { .linux => linux.V, - .macos, .ios, .tvos, .watchos, .netbsd, .openbsd => enum { + .macos, .ios, .tvos, .watchos, .visionos, .netbsd, .openbsd => enum { EOF, EOL, EOL2, @@ -784,7 +784,7 @@ pub const V = switch (native_os) { pub const NCCS = switch (native_os) { .linux => linux.NCCS, - .macos, .ios, .tvos, .watchos, .freebsd, .kfreebsd, .netbsd, .openbsd, .dragonfly => 20, + .macos, .ios, .tvos, .watchos, .visionos, .freebsd, .kfreebsd, .netbsd, .openbsd, .dragonfly => 20, .haiku => 11, .solaris, .illumos => 19, .emscripten, .wasi => 32, @@ -793,7 +793,7 @@ pub const NCCS = switch (native_os) { pub const termios = switch (native_os) { .linux => linux.termios, - .macos, .ios, .tvos, .watchos => extern struct { + .macos, .ios, .tvos, .watchos, .visionos => extern struct { iflag: tc_iflag_t, oflag: tc_oflag_t, cflag: tc_cflag_t, @@ -843,7 +843,7 @@ pub const termios = switch (native_os) { pub const tc_iflag_t = switch (native_os) { .linux => linux.tc_iflag_t, - .macos, .ios, .tvos, .watchos => packed struct(u64) { + .macos, .ios, .tvos, .watchos, .visionos => packed struct(u64) { IGNBRK: bool = false, BRKINT: bool = false, IGNPAR: bool = false, @@ -953,7 +953,7 @@ pub const tc_iflag_t = switch (native_os) { pub const tc_oflag_t = switch (native_os) { .linux => linux.tc_oflag_t, - .macos, .ios, .tvos, .watchos => packed struct(u64) { + .macos, .ios, .tvos, .watchos, .visionos => packed struct(u64) { OPOST: bool = false, ONLCR: bool = false, OXTABS: bool = false, @@ -1050,7 +1050,7 @@ pub const CSIZE = switch (native_os) { pub const tc_cflag_t = switch (native_os) { .linux => linux.tc_cflag_t, - .macos, .ios, .tvos, .watchos => packed struct(u64) { + .macos, .ios, .tvos, .watchos, .visionos => packed struct(u64) { CIGNORE: bool = false, _1: u5 = 0, CSTOPB: bool = false, @@ -1186,7 +1186,7 @@ pub const tc_cflag_t = switch (native_os) { pub const tc_lflag_t = switch (native_os) { .linux => linux.tc_lflag_t, - .macos, .ios, .tvos, .watchos => packed struct(u64) { + .macos, .ios, .tvos, .watchos, .visionos => packed struct(u64) { ECHOKE: bool = false, ECHOE: bool = false, ECHOK: bool = false, @@ -1312,7 +1312,7 @@ pub const tc_lflag_t = switch (native_os) { pub const speed_t = switch (native_os) { .linux => linux.speed_t, - .macos, .ios, .tvos, .watchos, .openbsd => enum(u64) { + .macos, .ios, .tvos, .watchos, .visionos, .openbsd => enum(u64) { B0 = 0, B50 = 50, B75 = 75, @@ -1535,7 +1535,7 @@ pub const fstatat = switch (native_os) { }; pub const getdirentries = switch (native_os) { - .macos, .ios, .tvos, .watchos => private.__getdirentries64, + .macos, .ios, .tvos, .watchos, .visionos => private.__getdirentries64, else => private.getdirentries, }; @@ -1569,7 +1569,7 @@ pub const readdir = switch (native_os) { }; pub const realpath = switch (native_os) { - .macos, .ios, .tvos, .watchos => private.@"realpath$DARWIN_EXTSN", + .macos, .ios, .tvos, .watchos, .visionos => private.@"realpath$DARWIN_EXTSN", else => private.realpath, }; diff --git a/lib/std/crypto/tlcsprng.zig b/lib/std/crypto/tlcsprng.zig index 9293887a59..7adbcc1c5e 100644 --- a/lib/std/crypto/tlcsprng.zig +++ b/lib/std/crypto/tlcsprng.zig @@ -29,6 +29,7 @@ const os_has_fork = switch (native_os) { .illumos, .tvos, .watchos, + .visionos, .haiku, => true, diff --git a/lib/std/debug.zig b/lib/std/debug.zig index d1d6201b80..9fb7cd4561 100644 --- a/lib/std/debug.zig +++ b/lib/std/debug.zig @@ -706,7 +706,7 @@ pub const StackIterator = struct { const unwind_state = &self.unwind_state.?; const module = try unwind_state.debug_info.getModuleForAddress(unwind_state.dwarf_context.pc); switch (native_os) { - .macos, .ios, .watchos, .tvos => { + .macos, .ios, .watchos, .tvos, .visionos => { // __unwind_info is a requirement for unwinding on Darwin. It may fall back to DWARF, but unwinding // via DWARF before attempting to use the compact unwind info will produce incorrect results. if (module.unwind_info) |unwind_info| { @@ -2129,7 +2129,7 @@ pub const DebugInfo = struct { }; pub const ModuleDebugInfo = switch (native_os) { - .macos, .ios, .watchos, .tvos => struct { + .macos, .ios, .watchos, .tvos, .visionos => struct { base_address: usize, vmaddr_slide: usize, mapped_memory: []align(mem.page_size) const u8, diff --git a/lib/std/dynamic_library.zig b/lib/std/dynamic_library.zig index a6ef8ac6c7..f0e8ae0f11 100644 --- a/lib/std/dynamic_library.zig +++ b/lib/std/dynamic_library.zig @@ -16,7 +16,7 @@ pub const DynLib = struct { else DlDynLib, .windows => WindowsDynLib, - .macos, .tvos, .watchos, .ios, .freebsd, .netbsd, .openbsd, .dragonfly, .solaris, .illumos => DlDynLib, + .macos, .tvos, .watchos, .ios, .visionos, .freebsd, .netbsd, .openbsd, .dragonfly, .solaris, .illumos => DlDynLib, else => @compileError("unsupported platform"), }; @@ -461,7 +461,7 @@ test "dynamic_library" { const libname = switch (native_os) { .linux, .freebsd, .openbsd, .solaris, .illumos => "invalid_so.so", .windows => "invalid_dll.dll", - .macos, .tvos, .watchos, .ios => "invalid_dylib.dylib", + .macos, .tvos, .watchos, .ios, .visionos => "invalid_dylib.dylib", else => return error.SkipZigTest, }; diff --git a/lib/std/mem.zig b/lib/std/mem.zig index 1ea67d2cce..901cb98edc 100644 --- a/lib/std/mem.zig +++ b/lib/std/mem.zig @@ -13,7 +13,7 @@ const native_endian = builtin.cpu.arch.endian(); pub const page_size = switch (builtin.cpu.arch) { .wasm32, .wasm64 => 64 * 1024, .aarch64 => switch (builtin.os.tag) { - .macos, .ios, .watchos, .tvos => 16 * 1024, + .macos, .ios, .watchos, .tvos, .visionos => 16 * 1024, else => 4 * 1024, }, .sparc64 => 8 * 1024, diff --git a/lib/std/os.zig b/lib/std/os.zig index 53f1bef4fe..ae5babe4ae 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -76,6 +76,7 @@ pub fn isGetFdPathSupportedOnTarget(os: std.Target.Os) bool { .ios, .watchos, .tvos, + .visionos, .linux, .solaris, .illumos, @@ -110,7 +111,7 @@ pub fn getFdPath(fd: std.posix.fd_t, out_buffer: *[MAX_PATH_BYTES]u8) std.posix. const end_index = std.unicode.wtf16LeToWtf8(out_buffer, wide_slice); return out_buffer[0..end_index]; }, - .macos, .ios, .watchos, .tvos => { + .macos, .ios, .watchos, .tvos, .visionos => { // On macOS, we can use F.GETPATH fcntl command to query the OS for // the path to the file descriptor. @memset(out_buffer[0..MAX_PATH_BYTES], 0); diff --git a/lib/std/posix.zig b/lib/std/posix.zig index e80e64b45e..a03e6e736c 100644 --- a/lib/std/posix.zig +++ b/lib/std/posix.zig @@ -604,7 +604,7 @@ pub fn getrandom(buffer: []u8) GetRandomError!void { } } switch (native_os) { - .netbsd, .openbsd, .macos, .ios, .tvos, .watchos => { + .netbsd, .openbsd, .macos, .ios, .tvos, .watchos, .visionos => { system.arc4random_buf(buffer.ptr, buffer.len); return; }, @@ -823,7 +823,7 @@ pub fn read(fd: fd_t, buf: []u8) ReadError!usize { // Prevents EINVAL. const max_count = switch (native_os) { .linux => 0x7ffff000, - .macos, .ios, .watchos, .tvos => maxInt(i32), + .macos, .ios, .watchos, .tvos, .visionos => maxInt(i32), else => maxInt(isize), }; while (true) { @@ -962,7 +962,7 @@ pub fn pread(fd: fd_t, buf: []u8, offset: u64) PReadError!usize { // Prevent EINVAL. const max_count = switch (native_os) { .linux => 0x7ffff000, - .macos, .ios, .watchos, .tvos => maxInt(i32), + .macos, .ios, .watchos, .tvos, .visionos => maxInt(i32), else => maxInt(isize), }; @@ -1069,7 +1069,7 @@ pub fn ftruncate(fd: fd_t, length: u64) TruncateError!void { /// On these systems, the read races with concurrent writes to the same file descriptor. pub fn preadv(fd: fd_t, iov: []const iovec, offset: u64) PReadError!usize { const have_pread_but_not_preadv = switch (native_os) { - .windows, .macos, .ios, .watchos, .tvos, .haiku => true, + .windows, .macos, .ios, .watchos, .tvos, .visionos, .haiku => true, else => false, }; if (have_pread_but_not_preadv) { @@ -1211,7 +1211,7 @@ pub fn write(fd: fd_t, bytes: []const u8) WriteError!usize { const max_count = switch (native_os) { .linux => 0x7ffff000, - .macos, .ios, .watchos, .tvos => maxInt(i32), + .macos, .ios, .watchos, .tvos, .visionos => maxInt(i32), else => maxInt(isize), }; while (true) { @@ -1370,7 +1370,7 @@ pub fn pwrite(fd: fd_t, bytes: []const u8, offset: u64) PWriteError!usize { // Prevent EINVAL. const max_count = switch (native_os) { .linux => 0x7ffff000, - .macos, .ios, .watchos, .tvos => maxInt(i32), + .macos, .ios, .watchos, .tvos, .visionos => maxInt(i32), else => maxInt(isize), }; @@ -1423,7 +1423,7 @@ pub fn pwrite(fd: fd_t, bytes: []const u8, offset: u64) PWriteError!usize { /// If `iov.len` is larger than `IOV_MAX`, a partial write will occur. pub fn pwritev(fd: fd_t, iov: []const iovec_const, offset: u64) PWriteError!usize { const have_pwrite_but_not_pwritev = switch (native_os) { - .windows, .macos, .ios, .watchos, .tvos, .haiku => true, + .windows, .macos, .ios, .watchos, .tvos, .visionos, .haiku => true, else => false, }; @@ -1838,7 +1838,7 @@ pub fn execveZ( .NOTDIR => return error.NotDir, .TXTBSY => return error.FileBusy, else => |err| switch (native_os) { - .macos, .ios, .tvos, .watchos => switch (err) { + .macos, .ios, .tvos, .watchos, .visionos => switch (err) { .BADEXEC => return error.InvalidExe, .BADARCH => return error.InvalidExe, else => return unexpectedErrno(err), @@ -6115,7 +6115,7 @@ pub fn sendfile( const size_t = std.meta.Int(.unsigned, @typeInfo(usize).Int.bits - 1); const max_count = switch (native_os) { .linux => 0x7ffff000, - .macos, .ios, .watchos, .tvos => maxInt(i32), + .macos, .ios, .watchos, .tvos, .visionos => maxInt(i32), else => maxInt(size_t), }; @@ -6260,7 +6260,7 @@ pub fn sendfile( } } }, - .macos, .ios, .tvos, .watchos => sf: { + .macos, .ios, .tvos, .watchos, .visionos => sf: { var hdtr_data: std.c.sf_hdtr = undefined; var hdtr: ?*std.c.sf_hdtr = null; if (headers.len != 0 or trailers.len != 0) { @@ -7236,7 +7236,7 @@ pub fn ptrace(request: u32, pid: pid_t, addr: usize, signal: usize) PtraceError! else => |err| return unexpectedErrno(err), }, - .macos, .ios, .tvos, .watchos => switch (errno(std.c.ptrace( + .macos, .ios, .tvos, .watchos, .visionos => switch (errno(std.c.ptrace( @intCast(request), pid, @ptrFromInt(addr), diff --git a/lib/std/process.zig b/lib/std/process.zig index 8f3f990890..eefdca6ec5 100644 --- a/lib/std/process.zig +++ b/lib/std/process.zig @@ -1395,6 +1395,7 @@ pub fn getUserInfo(name: []const u8) !UserInfo { .watchos, .tvos, .ios, + .visionos, .freebsd, .netbsd, .openbsd, @@ -1536,7 +1537,7 @@ pub const can_execv = switch (native_os) { /// Tells whether spawning child processes is supported (e.g. via ChildProcess) pub const can_spawn = switch (native_os) { - .wasi, .watchos, .tvos => false, + .wasi, .watchos, .tvos, .visionos => false, else => true, }; diff --git a/lib/std/start.zig b/lib/std/start.zig index bcd39a27bf..24674614e2 100644 --- a/lib/std/start.zig +++ b/lib/std/start.zig @@ -576,6 +576,7 @@ fn maybeIgnoreSigpipe() void { .ios, .watchos, .tvos, + .visionos, .dragonfly, .freebsd, => true, diff --git a/lib/std/time.zig b/lib/std/time.zig index e8b37d3010..57f58ae839 100644 --- a/lib/std/time.zig +++ b/lib/std/time.zig @@ -205,7 +205,7 @@ pub const Instant = struct { }, // On darwin, use UPTIME_RAW instead of MONOTONIC as it ticks while // suspended. - .macos, .ios, .tvos, .watchos => posix.CLOCK.UPTIME_RAW, + .macos, .ios, .tvos, .watchos, .visionos => posix.CLOCK.UPTIME_RAW, // On freebsd derivatives, use MONOTONIC_FAST as currently there's // no precision tradeoff. .freebsd, .dragonfly => posix.CLOCK.MONOTONIC_FAST, diff --git a/lib/std/zig/LibCDirs.zig b/lib/std/zig/LibCDirs.zig index a5357f3e75..44c318c359 100644 --- a/lib/std/zig/LibCDirs.zig +++ b/lib/std/zig/LibCDirs.zig @@ -222,7 +222,7 @@ pub fn detectFromBuilding( fn libCGenericName(target: std.Target) [:0]const u8 { switch (target.os.tag) { .windows => return "mingw", - .macos, .ios, .tvos, .watchos => return "darwin", + .macos, .ios, .tvos, .watchos, .visionos => return "darwin", else => {}, } switch (target.abi) { diff --git a/lib/std/zig/system/darwin.zig b/lib/std/zig/system/darwin.zig index 8917bf5d3a..8296a81db6 100644 --- a/lib/std/zig/system/darwin.zig +++ b/lib/std/zig/system/darwin.zig @@ -45,6 +45,7 @@ pub fn getSdk(allocator: Allocator, target: Target) ?[]const u8 { }, .watchos => if (is_simulator_abi) "watchsimulator" else "watchos", .tvos => if (is_simulator_abi) "appletvsimulator" else "appletvos", + .visionos => if (is_simulator_abi) "xrsimulator" else "xros", else => return null, }; const argv = &[_][]const u8{ "/usr/bin/xcrun", "--sdk", sdk, "--show-sdk-path" }; diff --git a/src/Compilation.zig b/src/Compilation.zig index c533f2fae7..dc36d50e42 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -5325,6 +5325,12 @@ pub fn addCCArgs( })); }, }, + .visionos => { + const ver = target.os.version_range.semver.min; + try argv.append(try std.fmt.allocPrint(arena, "-mxros-version-min={d}.{d}.{d}", .{ + ver.major, ver.minor, ver.patch, + })); + }, else => {}, } diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 7419e778a1..9d4f1b19d2 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -145,6 +145,7 @@ pub fn targetTriple(allocator: Allocator, target: std.Target) ![]const u8 { .ios => "ios", .tvos => "tvos", .watchos => "watchos", + .visionos => "xros", .driverkit => "driverkit", .shadermodel => "shadermodel", .liteos => "liteos", @@ -245,6 +246,9 @@ pub fn targetOs(os_tag: std.Target.Os.Tag) llvm.OSType { .elfiamcu => .ELFIAMCU, .tvos => .TvOS, .watchos => .WatchOS, + // TODO: blocked by LLVM 18 + // .visionos => .XROS, + .visionos => unreachable, .mesa3d => .Mesa3D, .contiki => .Contiki, .amdpal => .AMDPAL, diff --git a/src/codegen/llvm/bindings.zig b/src/codegen/llvm/bindings.zig index ee87aef6ac..088de25bce 100644 --- a/src/codegen/llvm/bindings.zig +++ b/src/codegen/llvm/bindings.zig @@ -315,6 +315,8 @@ pub const OSType = enum(c_int) { TvOS, WatchOS, DriverKit, + // TODO: blocked by LLVM 18 + // VisionOS, Mesa3D, Contiki, AMDPAL, diff --git a/src/libtsan.zig b/src/libtsan.zig index 8f8ecce67d..832814fac1 100644 --- a/src/libtsan.zig +++ b/src/libtsan.zig @@ -125,7 +125,7 @@ pub fn buildTsan(comp: *Compilation, prog_node: *std.Progress.Node) BuildError!v } const platform_tsan_sources = switch (target.os.tag) { - .ios, .macos, .watchos, .tvos => &darwin_tsan_sources, + .ios, .macos, .watchos, .tvos, .visionos => &darwin_tsan_sources, .windows => &windows_tsan_sources, else => &unix_tsan_sources, }; diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 01e03a10ba..4401f38fec 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -3674,9 +3674,15 @@ pub inline fn getPageSize(self: MachO) u16 { pub fn requiresCodeSig(self: MachO) bool { if (self.entitlements) |_| return true; // if (self.options.adhoc_codesign) |cs| return cs; - return switch (self.getTarget().cpu.arch) { - .aarch64 => true, - else => false, + const target = self.getTarget(); + return switch (target.cpu.arch) { + .aarch64 => switch (target.os.tag) { + .macos => true, + .watchos, .tvos, .ios, .visionos => target.abi == .simulator, + else => false, + }, + .x86_64 => false, + else => unreachable, }; } @@ -4377,6 +4383,7 @@ pub const Platform = struct { .TVOS, .TVOSSIMULATOR => .tvos, .WATCHOS, .WATCHOSSIMULATOR => .watchos, .MACCATALYST => .ios, + .VISIONOS, .VISIONOSSIMULATOR => .visionos, else => @panic("TODO"), }, .abi = switch (cmd.platform) { @@ -4384,6 +4391,7 @@ pub const Platform = struct { .IOSSIMULATOR, .TVOSSIMULATOR, .WATCHOSSIMULATOR, + .VISIONOSSIMULATOR, => .simulator, else => .none, }, @@ -4434,6 +4442,7 @@ pub const Platform = struct { }, .tvos => if (plat.abi == .simulator) .TVOSSIMULATOR else .TVOS, .watchos => if (plat.abi == .simulator) .WATCHOSSIMULATOR else .WATCHOS, + .visionos => if (plat.abi == .simulator) .VISIONOSSIMULATOR else .VISIONOS, else => unreachable, }; } @@ -4502,13 +4511,15 @@ const SupportedPlatforms = struct { // Source: https://github.com/apple-oss-distributions/ld64/blob/59a99ab60399c5e6c49e6945a9e1049c42b71135/src/ld/PlatformSupport.cpp#L52 // zig fmt: off const supported_platforms = [_]SupportedPlatforms{ - .{ .macos, .none, 0xA0E00, 0xA0800 }, - .{ .ios, .none, 0xC0000, 0x70000 }, - .{ .tvos, .none, 0xC0000, 0x70000 }, - .{ .watchos, .none, 0x50000, 0x20000 }, - .{ .ios, .simulator, 0xD0000, 0x80000 }, - .{ .tvos, .simulator, 0xD0000, 0x80000 }, - .{ .watchos, .simulator, 0x60000, 0x20000 }, + .{ .macos, .none, 0xA0E00, 0xA0800 }, + .{ .ios, .none, 0xC0000, 0x70000 }, + .{ .tvos, .none, 0xC0000, 0x70000 }, + .{ .watchos, .none, 0x50000, 0x20000 }, + .{ .visionos, .none, 0x10000, 0x10000 }, + .{ .ios, .simulator, 0xD0000, 0x80000 }, + .{ .tvos, .simulator, 0xD0000, 0x80000 }, + .{ .watchos, .simulator, 0x60000, 0x20000 }, + .{ .visionos, .simulator, 0x10000, 0x10000 }, }; // zig fmt: on diff --git a/src/link/MachO/Dylib.zig b/src/link/MachO/Dylib.zig index 6acfb2080c..226094e997 100644 --- a/src/link/MachO/Dylib.zig +++ b/src/link/MachO/Dylib.zig @@ -671,7 +671,7 @@ pub const TargetMatcher = struct { try self.target_strings.append(allocator, apple_string); switch (platform) { - .IOSSIMULATOR, .TVOSSIMULATOR, .WATCHOSSIMULATOR => { + .IOSSIMULATOR, .TVOSSIMULATOR, .WATCHOSSIMULATOR, .VISIONOSSIMULATOR => { // For Apple simulator targets, linking gets tricky as we need to link against the simulator // hosts dylibs too. const host_target = try targetToAppleString(allocator, cpu_arch, .MACOS); @@ -714,9 +714,11 @@ pub const TargetMatcher = struct { .IOS => "ios", .TVOS => "tvos", .WATCHOS => "watchos", + .VISIONOS => "xros", .IOSSIMULATOR => "ios-simulator", .TVOSSIMULATOR => "tvos-simulator", .WATCHOSSIMULATOR => "watchos-simulator", + .VISIONOSSIMULATOR => "xros-simulator", .BRIDGEOS => "bridgeos", .MACCATALYST => "maccatalyst", .DRIVERKIT => "driverkit", diff --git a/src/main.zig b/src/main.zig index e6eb60138b..e229f33ab7 100644 --- a/src/main.zig +++ b/src/main.zig @@ -4446,7 +4446,7 @@ fn runOrTestHotSwap( } switch (builtin.target.os.tag) { - .macos, .ios, .tvos, .watchos => { + .macos, .ios, .tvos, .watchos, .visionos => { const PosixSpawn = @import("DarwinPosixSpawn.zig"); var attr = try PosixSpawn.Attr.init(); diff --git a/src/target.zig b/src/target.zig index fa782075c7..1a18643c64 100644 --- a/src/target.zig +++ b/src/target.zig @@ -26,6 +26,7 @@ pub fn libcNeedsLibUnwind(target: std.Target) bool { .ios, .watchos, .tvos, + .visionos, .freestanding, .wasi, // Wasm/WASI currently doesn't offer support for libunwind, so don't link it. => false, diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index ae1f02422b..33fdf8ea87 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -681,6 +681,8 @@ static_assert((Triple::OSType)ZigLLVM_PS4 == Triple::PS4, ""); static_assert((Triple::OSType)ZigLLVM_ELFIAMCU == Triple::ELFIAMCU, ""); static_assert((Triple::OSType)ZigLLVM_TvOS == Triple::TvOS, ""); static_assert((Triple::OSType)ZigLLVM_WatchOS == Triple::WatchOS, ""); +// TODO: blocked by LLVM 18 +// static_assert((Triple::OSType)ZigLLVM_XROS == Triple::VisionOS, ""); static_assert((Triple::OSType)ZigLLVM_Mesa3D == Triple::Mesa3D, ""); static_assert((Triple::OSType)ZigLLVM_Contiki == Triple::Contiki, ""); static_assert((Triple::OSType)ZigLLVM_AMDPAL == Triple::AMDPAL, ""); diff --git a/src/zig_llvm.h b/src/zig_llvm.h index e133cb01b7..ee0ace5630 100644 --- a/src/zig_llvm.h +++ b/src/zig_llvm.h @@ -235,6 +235,8 @@ enum ZigLLVM_OSType { ZigLLVM_TvOS, // Apple tvOS ZigLLVM_WatchOS, // Apple watchOS ZigLLVM_DriverKit, // Apple DriverKit + // TODO: blocked by LLVM 18 + // ZigLLVM_XROS, // Apple VisionOS ZigLLVM_Mesa3D, ZigLLVM_Contiki, ZigLLVM_AMDPAL, // AMD PAL Runtime