authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-07-07 18:45:59+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-07-07 18:45:59+02:00
log4e5ca9bc42a5f3f64e6b826553a5bf937e3ede91
treeb4bbe112805fccf4570d1a7256d355c176fc48b2
parent8219c86100b9679255ad06bf6a743716bef26102
parent164578636cfe760ab03f8f37f039ca7e5a0c801b

Merge pull request '`std.Target`: add `switch` (Nintendo Switch) Os tag' (#36081) from alexrp/zig:nintendo-switch-target into master

Reviewed-on: https://codeberg.org/ziglang/zig/pulls/36081

8 files changed, 39 insertions(+), 62 deletions(-)

lib/std/Build/Configuration.zig+3
...@@ -2618,6 +2618,7 @@ pub const TargetQuery = struct {...@@ -2618,6 +2618,7 @@ pub const TargetQuery = struct {
2618 uefi,2618 uefi,
2619 @"3ds",2619 @"3ds",
2620 wiiu,2620 wiiu,
2621 @"switch",
2621 psx,2622 psx,
2622 ps3,2623 ps3,
2623 ps4,2624 ps4,
...@@ -2669,6 +2670,7 @@ pub const TargetQuery = struct {...@@ -2669,6 +2670,7 @@ pub const TargetQuery = struct {
2669 .uefi => .uefi,2670 .uefi => .uefi,
2670 .@"3ds" => .@"3ds",2671 .@"3ds" => .@"3ds",
2671 .wiiu => .wiiu,2672 .wiiu => .wiiu,
2673 .@"switch" => .@"switch",
2672 .psx => .psx,2674 .psx => .psx,
2673 .ps3 => .ps3,2675 .ps3 => .ps3,
2674 .ps4 => .ps4,2676 .ps4 => .ps4,
...@@ -2720,6 +2722,7 @@ pub const TargetQuery = struct {...@@ -2720,6 +2722,7 @@ pub const TargetQuery = struct {
2720 .uefi => .uefi,2722 .uefi => .uefi,
2721 .@"3ds" => .@"3ds",2723 .@"3ds" => .@"3ds",
2722 .wiiu => .wiiu,2724 .wiiu => .wiiu,
2725 .@"switch" => .@"switch",
2723 .psx => .psx,2726 .psx => .psx,
2724 .ps3 => .ps3,2727 .ps3 => .ps3,
2725 .ps4 => .ps4,2728 .ps4 => .ps4,
lib/std/Target.zig+23-58
...@@ -50,6 +50,7 @@ pub const Os = struct {...@@ -50,6 +50,7 @@ pub const Os = struct {
5050
51 @"3ds",51 @"3ds",
52 wiiu,52 wiiu,
53 @"switch",
5354
54 psx,55 psx,
55 ps3,56 ps3,
...@@ -74,14 +75,6 @@ pub const Os = struct {...@@ -74,14 +75,6 @@ pub const Os = struct {
7475
75 ashetos,76 ashetos,
7677
77 // LLVM tags deliberately omitted:
78 // - bridgeos
79 // - cheriotrtos
80 // - darwin
81 // - kfreebsd
82 // - nacl
83 // - shadermodel
84
85 pub inline fn isDarwin(tag: Tag) bool {78 pub inline fn isDarwin(tag: Tag) bool {
86 return switch (tag) {79 return switch (tag) {
87 .driverkit,80 .driverkit,
...@@ -204,6 +197,7 @@ pub const Os = struct {...@@ -204,6 +197,7 @@ pub const Os = struct {
204197
205 .@"3ds",198 .@"3ds",
206 .wiiu,199 .wiiu,
200 .@"switch",
207201
208 .psp,202 .psp,
209 .vita,203 .vita,
...@@ -640,6 +634,13 @@ pub const Os = struct {...@@ -640,6 +634,13 @@ pub const Os = struct {
640 },634 },
641 },635 },
642636
637 .@"switch" => .{
638 .semver = .{
639 .min = .{ .major = 1, .minor = 0, .patch = 0 },
640 .max = .{ .major = 22, .minor = 5, .patch = 0 },
641 },
642 },
643
643 .psp => .{644 .psp => .{
644 .semver = .{645 .semver = .{
645 // https://www.psdevwiki.com/psp/Official_Firmware_(OFW)#1.XX_Kernel646 // https://www.psdevwiki.com/psp/Official_Firmware_(OFW)#1.XX_Kernel
...@@ -825,33 +826,6 @@ pub const Abi = enum {...@@ -825,33 +826,6 @@ pub const Abi = enum {
825 ohoseabi,826 ohoseabi,
826 call0,827 call0,
827828
828 // LLVM tags deliberately omitted:
829 // - amplification
830 // - anyhit
831 // - callable
832 // - closesthit
833 // - compute
834 // - coreclr
835 // - domain
836 // - geometry
837 // - gnueabit64
838 // - gnueabihft64
839 // - gnuf64
840 // - gnut64
841 // - hull
842 // - intersection
843 // - library
844 // - llvm
845 // - mesh
846 // - miss
847 // - mlibc
848 // - mtia
849 // - pauthtest
850 // - pixel
851 // - raygeneration
852 // - rootsignature
853 // - vertex
854
855 pub fn default(arch: Cpu.Arch, os_tag: Os.Tag) Abi {829 pub fn default(arch: Cpu.Arch, os_tag: Os.Tag) Abi {
856 return switch (os_tag) {830 return switch (os_tag) {
857 .freestanding, .other => switch (arch) {831 .freestanding, .other => switch (arch) {
...@@ -979,6 +953,7 @@ pub const Abi = enum {...@@ -979,6 +953,7 @@ pub const Abi = enum {
979 .tvos,953 .tvos,
980 .visionos,954 .visionos,
981 .watchos,955 .watchos,
956 .@"switch",
982 .ps3,957 .ps3,
983 .ps4,958 .ps4,
984 .ps5,959 .ps5,
...@@ -1079,9 +1054,6 @@ pub const ObjectFormat = enum {...@@ -1079,9 +1054,6 @@ pub const ObjectFormat = enum {
1079 /// The WebAssembly binary format.1054 /// The WebAssembly binary format.
1080 wasm,1055 wasm,
10811056
1082 // LLVM tags deliberately omitted:
1083 // - dxcontainer
1084
1085 pub fn fileExt(of: ObjectFormat, arch: Cpu.Arch) [:0]const u8 {1057 pub fn fileExt(of: ObjectFormat, arch: Cpu.Arch) [:0]const u8 {
1086 return switch (of) {1058 return switch (of) {
1087 .c => ".c",1059 .c => ".c",
...@@ -1439,24 +1411,6 @@ pub const Cpu = struct {...@@ -1439,24 +1411,6 @@ pub const Cpu = struct {
1439 xtensa,1411 xtensa,
1440 xtensaeb,1412 xtensaeb,
14411413
1442 // LLVM tags deliberately omitted:
1443 // - aarch64_32
1444 // - amdil
1445 // - amdil64
1446 // - dxil
1447 // - r600
1448 // - hsail
1449 // - hsail64
1450 // - renderscript32
1451 // - renderscript64
1452 // - shave
1453 // - sparcel
1454 // - spir
1455 // - spir64
1456 // - spirv
1457 // - tce
1458 // - tcele
1459
1460 /// An architecture family can encompass multiple architectures as represented by `Arch`.1414 /// An architecture family can encompass multiple architectures as represented by `Arch`.
1461 /// For a given family tag, it is guaranteed that an `std.Target.<tag>` namespace exists1415 /// For a given family tag, it is guaranteed that an `std.Target.<tag>` namespace exists
1462 /// containing CPU model and feature data.1416 /// containing CPU model and feature data.
...@@ -2096,6 +2050,7 @@ pub const Cpu = struct {...@@ -2096,6 +2050,7 @@ pub const Cpu = struct {
2096 .ios, .tvos => &aarch64.cpu.apple_a7,2050 .ios, .tvos => &aarch64.cpu.apple_a7,
2097 .visionos => &aarch64.cpu.apple_m2,2051 .visionos => &aarch64.cpu.apple_m2,
2098 .watchos => &aarch64.cpu.apple_s4,2052 .watchos => &aarch64.cpu.apple_s4,
2053 .@"switch" => &aarch64.cpu.cortex_a57,
2099 else => generic(arch),2054 else => generic(arch),
2100 },2055 },
2101 .avr => &avr.cpu.avr2,2056 .avr => &avr.cpu.avr2,
...@@ -2327,8 +2282,9 @@ pub fn requiresLibC(target: *const Target) bool {...@@ -2327,8 +2282,9 @@ pub fn requiresLibC(target: *const Target) bool {
2327 .plan9,2282 .plan9,
2328 .other,2283 .other,
2329 .@"3ds",2284 .@"3ds",
2330 .tios,
2331 .wiiu,2285 .wiiu,
2286 .@"switch",
2287 .tios,
2332 .ashetos,2288 .ashetos,
2333 => false,2289 => false,
2334 };2290 };
...@@ -2477,6 +2433,7 @@ pub const DynamicLinker = struct {...@@ -2477,6 +2433,7 @@ pub const DynamicLinker = struct {
24772433
2478 .@"3ds",2434 .@"3ds",
2479 .wiiu,2435 .wiiu,
2436 .@"switch",
24802437
2481 .emscripten,2438 .emscripten,
2482 .wasi,2439 .wasi,
...@@ -2696,7 +2653,6 @@ pub const DynamicLinker = struct {...@@ -2696,7 +2653,6 @@ pub const DynamicLinker = struct {
2696 .or1k,2653 .or1k,
2697 => |arch| if (abi == .gnu) initFmt("/lib/ld-linux-{s}.so.1", .{@tagName(arch)}) else none,2654 => |arch| if (abi == .gnu) initFmt("/lib/ld-linux-{s}.so.1", .{@tagName(arch)}) else none,
26982655
2699 // TODO: `-be` architecture support.
2700 .csky => initFmt("/lib/ld-linux-cskyv2{s}.so.1", .{switch (abi) {2656 .csky => initFmt("/lib/ld-linux-cskyv2{s}.so.1", .{switch (abi) {
2701 .gnueabi => "",2657 .gnueabi => "",
2702 .gnueabihf => "-hf",2658 .gnueabihf => "-hf",
...@@ -2902,6 +2858,7 @@ pub const DynamicLinker = struct {...@@ -2902,6 +2858,7 @@ pub const DynamicLinker = struct {
29022858
2903 .@"3ds",2859 .@"3ds",
2904 .wiiu,2860 .wiiu,
2861 .@"switch",
29052862
2906 .psx,2863 .psx,
2907 .psp,2864 .psp,
...@@ -3467,6 +3424,14 @@ pub fn cTypeBitSize(target: *const Target, c_type: CType) u16 {...@@ -3467,6 +3424,14 @@ pub fn cTypeBitSize(target: *const Target, c_type: CType) u16 {
3467 .longlong, .ulonglong, .double, .longdouble => return 64,3424 .longlong, .ulonglong, .double, .longdouble => return 64,
3468 },3425 },
34693426
3427 .@"switch" => switch (c_type) {
3428 .char => return 8,
3429 .short, .ushort => return 16,
3430 .int, .uint, .float => return 32,
3431 .long, .ulong, .longlong, .ulonglong, .double => return 64,
3432 .longdouble => return 128,
3433 },
3434
3470 .psx => switch (c_type) {3435 .psx => switch (c_type) {
3471 .char => return 8,3436 .char => return 8,
3472 .short, .ushort => return 16,3437 .short, .ushort => return 16,
lib/std/debug.zig+1
...@@ -511,6 +511,7 @@ pub fn defaultPanic(msg: []const u8, first_trace_addr: ?usize) noreturn {...@@ -511,6 +511,7 @@ pub fn defaultPanic(msg: []const u8, first_trace_addr: ?usize) noreturn {
511511
512 .@"3ds",512 .@"3ds",
513 .wiiu,513 .wiiu,
514 .@"switch",
514515
515 .psx,516 .psx,
516 .psp,517 .psp,
lib/std/start.zig+1
...@@ -78,6 +78,7 @@ comptime {...@@ -78,6 +78,7 @@ comptime {
7878
79 .@"3ds",79 .@"3ds",
80 .wiiu,80 .wiiu,
81 .@"switch",
8182
82 .psx,83 .psx,
83 .psp,84 .psp,
src/Compilation.zig+1
...@@ -6196,6 +6196,7 @@ fn addCommonCCArgs(...@@ -6196,6 +6196,7 @@ fn addCommonCCArgs(
6196 // Homebrew targets without LLVM support; use communities's preferred macros.6196 // Homebrew targets without LLVM support; use communities's preferred macros.
6197 .@"3ds" => try argv.append("-D__3DS__"),6197 .@"3ds" => try argv.append("-D__3DS__"),
6198 .wiiu => try argv.append("-D__WIIU__"),6198 .wiiu => try argv.append("-D__WIIU__"),
6199 .@"switch" => try argv.append("-D__SWITCH__"),
6199 .psx => try argv.append("-D__psx__"),6200 .psx => try argv.append("-D__psx__"),
6200 .psp => try argv.append("-D__PSP__"),6201 .psp => try argv.append("-D__PSP__"),
6201 .vita => try argv.append("-D__vita__"),6202 .vita => try argv.append("-D__vita__"),
src/codegen/llvm.zig+2-1
...@@ -239,7 +239,6 @@ pub fn targetTriple(allocator: Allocator, target: *const std.Target) ![]const u8...@@ -239,7 +239,6 @@ pub fn targetTriple(allocator: Allocator, target: *const std.Target) ![]const u8
239 .vulkan => "vulkan",239 .vulkan => "vulkan",
240 .managarm => "managarm",240 .managarm => "managarm",
241241
242 .@"3ds",
243 .contiki,242 .contiki,
244 .freestanding,243 .freestanding,
245 .opencl, // https://llvm.org/docs/SPIRVUsage.html#target-triples244 .opencl, // https://llvm.org/docs/SPIRVUsage.html#target-triples
...@@ -250,7 +249,9 @@ pub fn targetTriple(allocator: Allocator, target: *const std.Target) ![]const u8...@@ -250,7 +249,9 @@ pub fn targetTriple(allocator: Allocator, target: *const std.Target) ![]const u8
250 .psp,249 .psp,
251 .vita,250 .vita,
252 .tios,251 .tios,
252 .@"3ds",
253 .wiiu,253 .wiiu,
254 .@"switch",
254 .ashetos,255 .ashetos,
255 => "unknown",256 => "unknown",
256 };257 };
src/target.zig+7-3
...@@ -62,9 +62,13 @@ pub fn libCxxNeedsLibUnwind(target: *const std.Target) bool {...@@ -62,9 +62,13 @@ pub fn libCxxNeedsLibUnwind(target: *const std.Target) bool {
62}62}
6363
64pub fn requiresPie(target: *const std.Target, link_mode: std.lang.LinkMode) bool {64pub fn requiresPie(target: *const std.Target, link_mode: std.lang.LinkMode) bool {
65 return target.os.tag == .fuchsia or65 return switch (target.os.tag) {
66 (target.abi.isAndroid() and link_mode == .dynamic) or66 .ashetos,
67 target.os.tag == .ashetos;67 .fuchsia,
68 .@"switch",
69 => true,
70 else => target.abi.isAndroid() and link_mode == .dynamic,
71 };
68}72}
6973
70/// This function returns whether non-pic code is completely invalid on the given target.74/// This function returns whether non-pic code is completely invalid on the given target.
test/llvm_targets.zig+1
...@@ -22,6 +22,7 @@ const targets = [_]std.Target.Query{...@@ -22,6 +22,7 @@ const targets = [_]std.Target.Query{
22 .{ .cpu_arch = .aarch64, .os_tag = .openbsd, .abi = .none },22 .{ .cpu_arch = .aarch64, .os_tag = .openbsd, .abi = .none },
23 .{ .cpu_arch = .aarch64, .os_tag = .rtems, .abi = .none },23 .{ .cpu_arch = .aarch64, .os_tag = .rtems, .abi = .none },
24 .{ .cpu_arch = .aarch64, .os_tag = .serenity, .abi = .none },24 .{ .cpu_arch = .aarch64, .os_tag = .serenity, .abi = .none },
25 .{ .cpu_arch = .aarch64, .os_tag = .@"switch", .abi = .none },
25 .{ .cpu_arch = .aarch64, .os_tag = .tvos, .abi = .none },26 .{ .cpu_arch = .aarch64, .os_tag = .tvos, .abi = .none },
26 .{ .cpu_arch = .aarch64, .os_tag = .tvos, .abi = .simulator },27 .{ .cpu_arch = .aarch64, .os_tag = .tvos, .abi = .simulator },
27 .{ .cpu_arch = .aarch64, .os_tag = .uefi, .abi = .none },28 .{ .cpu_arch = .aarch64, .os_tag = .uefi, .abi = .none },