authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-05-11 20:52:47+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2025-05-11 20:52:47+02:00
logc3906718b343c20e4021e68e68a9c163a98c2741
treebcdd69a2fd160842f5a72a7a054d8fae042b35ab
parent837e0f9c377d66f323926427551cc7db84a7151d
parent23cb2b26626dafacfc5e0b567a43b88e1a22fe18
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #23810 from alexrp/more-test-targets


11 files changed, 378 insertions(+), 61 deletions(-)

lib/compiler/build_runner.zig+7-5
......@@ -241,8 +241,9 @@ pub fn main() !void {
241241 // but it is handled by the parent process. The build runner
242242 // only sees this flag.
243243 graph.system_package_mode = true;
244 } else if (mem.eql(u8, arg, "--glibc-runtimes")) {
245 builder.glibc_runtimes_dir = nextArgOrFatal(args, &arg_idx);
244 } else if (mem.eql(u8, arg, "--libc-runtimes") or mem.eql(u8, arg, "--glibc-runtimes")) {
245 // --glibc-runtimes was the old name of the flag; kept for compatibility for now.
246 builder.libc_runtimes_dir = nextArgOrFatal(args, &arg_idx);
246247 } else if (mem.eql(u8, arg, "--verbose-link")) {
247248 builder.verbose_link = true;
248249 } else if (mem.eql(u8, arg, "--verbose-air")) {
......@@ -1279,9 +1280,10 @@ fn usage(b: *std.Build, out_stream: anytype) !void {
12791280 \\ -fqemu, -fno-qemu Integration with system-installed QEMU to execute
12801281 \\ foreign-architecture programs on Linux hosts
12811282 \\ (default: no)
1282 \\ --glibc-runtimes [path] Enhances QEMU integration by providing glibc built
1283 \\ for multiple foreign architectures, allowing
1284 \\ execution of non-native programs that link with glibc.
1283 \\ --libc-runtimes [path] Enhances QEMU integration by providing dynamic libc
1284 \\ (e.g. glibc or musl) built for multiple foreign
1285 \\ architectures, allowing execution of non-native
1286 \\ programs that link with libc.
12851287 \\ -frosetta, -fno-rosetta Rely on Rosetta to execute x86_64 programs on
12861288 \\ ARM64 macOS hosts. (default: no)
12871289 \\ -fwasmtime, -fno-wasmtime Integration with system-installed wasmtime to
lib/std/Build.zig+3-2
......@@ -79,7 +79,8 @@ enable_wine: bool = false,
7979/// this will be the directory $glibc-build-dir/install/glibcs
8080/// Given the example of the aarch64 target, this is the directory
8181/// that contains the path `aarch64-linux-gnu/lib/ld-linux-aarch64.so.1`.
82glibc_runtimes_dir: ?[]const u8 = null,
82/// Also works for dynamic musl.
83libc_runtimes_dir: ?[]const u8 = null,
8384
8485dep_prefix: []const u8 = "",
8586
......@@ -390,7 +391,7 @@ fn createChildOnly(
390391 .enable_rosetta = parent.enable_rosetta,
391392 .enable_wasmtime = parent.enable_wasmtime,
392393 .enable_wine = parent.enable_wine,
393 .glibc_runtimes_dir = parent.glibc_runtimes_dir,
394 .libc_runtimes_dir = parent.libc_runtimes_dir,
394395 .dep_prefix = parent.fmt("{s}{s}.", .{ parent.dep_prefix, dep_name }),
395396 .modules = .init(allocator),
396397 .named_writefiles = .init(allocator),
lib/std/Build/Step/Run.zig+21-23
......@@ -1026,11 +1026,11 @@ fn runCommand(
10261026 }
10271027
10281028 const root_target = exe.rootModuleTarget();
1029 const need_cross_glibc = root_target.isGnuLibC() and
1030 exe.is_linking_libc;
1029 const need_cross_libc = exe.is_linking_libc and
1030 (root_target.isGnuLibC() or (root_target.isMuslLibC() and exe.linkage == .dynamic));
10311031 const other_target = exe.root_module.resolved_target.?.result;
10321032 switch (std.zig.system.getExternalExecutor(b.graph.host.result, &other_target, .{
1033 .qemu_fixes_dl = need_cross_glibc and b.glibc_runtimes_dir != null,
1033 .qemu_fixes_dl = need_cross_libc and b.libc_runtimes_dir != null,
10341034 .link_libc = exe.is_linking_libc,
10351035 })) {
10361036 .native, .rosetta => {
......@@ -1047,31 +1047,29 @@ fn runCommand(
10471047 },
10481048 .qemu => |bin_name| {
10491049 if (b.enable_qemu) {
1050 const glibc_dir_arg = if (need_cross_glibc)
1051 b.glibc_runtimes_dir orelse
1052 return failForeign(run, "--glibc-runtimes", argv[0], exe)
1053 else
1054 null;
1055
10561050 try interp_argv.append(bin_name);
10571051
1058 if (glibc_dir_arg) |dir| {
1059 try interp_argv.append("-L");
1060 try interp_argv.append(b.pathJoin(&.{
1061 dir,
1062 try std.zig.target.glibcRuntimeTriple(
1063 b.allocator,
1064 root_target.cpu.arch,
1065 root_target.os.tag,
1066 root_target.abi,
1067 ),
1068 }));
1052 if (need_cross_libc) {
1053 if (b.libc_runtimes_dir) |dir| {
1054 try interp_argv.append("-L");
1055 try interp_argv.append(b.pathJoin(&.{
1056 dir,
1057 try if (root_target.isGnuLibC()) std.zig.target.glibcRuntimeTriple(
1058 b.allocator,
1059 root_target.cpu.arch,
1060 root_target.os.tag,
1061 root_target.abi,
1062 ) else if (root_target.isMuslLibC()) std.zig.target.muslRuntimeTriple(
1063 b.allocator,
1064 root_target.cpu.arch,
1065 root_target.abi,
1066 ) else unreachable,
1067 }));
1068 } else return failForeign(run, "--libc-runtimes", argv[0], exe);
10691069 }
10701070
10711071 try interp_argv.appendSlice(argv);
1072 } else {
1073 return failForeign(run, "-fqemu", argv[0], exe);
1074 }
1072 } else return failForeign(run, "-fqemu", argv[0], exe);
10751073 },
10761074 .darling => |bin_name| {
10771075 if (b.enable_darling) {
lib/std/Target.zig+10-28
......@@ -838,7 +838,6 @@ pub const Abi = enum {
838838 .aix => if (arch == .powerpc) .eabihf else .none,
839839 .haiku => switch (arch) {
840840 .arm,
841 .thumb,
842841 .powerpc,
843842 => .eabihf,
844843 else => .none,
......@@ -877,22 +876,13 @@ pub const Abi = enum {
877876 },
878877 .freebsd => switch (arch) {
879878 .arm,
880 .armeb,
881 .thumb,
882 .thumbeb,
883879 .powerpc,
884880 => .eabihf,
885 // Soft float tends to be more common for MIPS.
886 .mips,
887 .mipsel,
888 => .eabi,
889881 else => .none,
890882 },
891883 .netbsd => switch (arch) {
892884 .arm,
893885 .armeb,
894 .thumb,
895 .thumbeb,
896886 .powerpc,
897887 => .eabihf,
898888 // Soft float tends to be more common for MIPS.
......@@ -903,7 +893,6 @@ pub const Abi = enum {
903893 },
904894 .openbsd => switch (arch) {
905895 .arm,
906 .thumb,
907896 => .eabi,
908897 .powerpc,
909898 => .eabihf,
......@@ -2205,7 +2194,6 @@ pub const DynamicLinker = struct {
22052194
22062195 .haiku => switch (cpu.arch) {
22072196 .arm,
2208 .thumb,
22092197 .aarch64,
22102198 .m68k,
22112199 .powerpc,
......@@ -2234,9 +2222,7 @@ pub const DynamicLinker = struct {
22342222
22352223 .linux => if (abi.isAndroid())
22362224 switch (cpu.arch) {
2237 .arm,
2238 .thumb,
2239 => if (abi == .androideabi) init("/system/bin/linker") else none,
2225 .arm => if (abi == .androideabi) init("/system/bin/linker") else none,
22402226
22412227 .aarch64,
22422228 .riscv64,
......@@ -2454,19 +2440,11 @@ pub const DynamicLinker = struct {
24542440
24552441 .freebsd => switch (cpu.arch) {
24562442 .arm,
2457 .armeb,
2458 .thumb,
2459 .thumbeb,
24602443 .aarch64,
2461 .mips,
2462 .mipsel,
2463 .mips64,
2464 .mips64el,
24652444 .powerpc,
24662445 .powerpc64,
24672446 .powerpc64le,
24682447 .riscv64,
2469 .sparc64,
24702448 .x86,
24712449 .x86_64,
24722450 => initFmt("{s}/libexec/ld-elf.so.1", .{
......@@ -2481,8 +2459,6 @@ pub const DynamicLinker = struct {
24812459 .netbsd => switch (cpu.arch) {
24822460 .arm,
24832461 .armeb,
2484 .thumb,
2485 .thumbeb,
24862462 .aarch64,
24872463 .aarch64_be,
24882464 .m68k,
......@@ -2491,6 +2467,8 @@ pub const DynamicLinker = struct {
24912467 .mips64,
24922468 .mips64el,
24932469 .powerpc,
2470 .powerpc64,
2471 .riscv32,
24942472 .riscv64,
24952473 .sparc,
24962474 .sparc64,
......@@ -2502,7 +2480,6 @@ pub const DynamicLinker = struct {
25022480
25032481 .openbsd => switch (cpu.arch) {
25042482 .arm,
2505 .thumb,
25062483 .aarch64,
25072484 .mips64,
25082485 .mips64el,
......@@ -2530,11 +2507,16 @@ pub const DynamicLinker = struct {
25302507 },
25312508
25322509 .illumos,
2510 => switch (cpu.arch) {
2511 .x86,
2512 .x86_64,
2513 => initFmt("/lib/{s}ld.so.1", .{if (ptrBitWidth_cpu_abi(cpu, .none) == 64) "64/" else ""}),
2514 else => none,
2515 },
2516
25332517 .solaris,
25342518 => switch (cpu.arch) {
2535 .sparc,
25362519 .sparc64,
2537 .x86,
25382520 .x86_64,
25392521 => initFmt("/lib/{s}ld.so.1", .{if (ptrBitWidth_cpu_abi(cpu, .none) == 64) "64/" else ""}),
25402522 else => none,
lib/std/fs/test.zig+1
......@@ -1394,6 +1394,7 @@ test "pwritev, preadv" {
13941394test "setEndPos" {
13951395 // https://github.com/ziglang/zig/issues/20747 (open fd does not have write permission)
13961396 if (native_os == .wasi and builtin.link_libc) return error.SkipZigTest;
1397 if (builtin.cpu.arch.isMIPS64() and (builtin.abi == .gnuabin32 or builtin.abi == .muslabin32)) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/23806
13971398
13981399 var tmp = tmpDir(.{});
13991400 defer tmp.cleanup();
lib/std/hash/xxhash.zig+3
......@@ -781,6 +781,7 @@ fn testExpect(comptime H: type, seed: anytype, input: []const u8, expected: u64)
781781
782782test "xxhash3" {
783783 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
784 if (builtin.cpu.arch.isMIPS64() and (builtin.abi == .gnuabin32 or builtin.abi == .muslabin32)) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/23807
784785
785786 const H = XxHash3;
786787 // Non-Seeded Tests
......@@ -814,6 +815,7 @@ test "xxhash3" {
814815
815816test "xxhash3 smhasher" {
816817 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
818 if (builtin.cpu.arch.isMIPS64() and (builtin.abi == .gnuabin32 or builtin.abi == .muslabin32)) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/23807
817819
818820 const Test = struct {
819821 fn do() !void {
......@@ -827,6 +829,7 @@ test "xxhash3 smhasher" {
827829
828830test "xxhash3 iterative api" {
829831 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
832 if (builtin.cpu.arch.isMIPS64() and (builtin.abi == .gnuabin32 or builtin.abi == .muslabin32)) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/23807
830833
831834 const Test = struct {
832835 fn do() !void {
lib/std/os/linux/test.zig+2
......@@ -8,6 +8,8 @@ const expectEqual = std.testing.expectEqual;
88const fs = std.fs;
99
1010test "fallocate" {
11 if (builtin.cpu.arch.isMIPS64() and (builtin.abi == .gnuabin32 or builtin.abi == .muslabin32)) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/23809
12
1113 var tmp = std.testing.tmpDir(.{});
1214 defer tmp.cleanup();
1315
lib/std/posix/test.zig+2
......@@ -1391,6 +1391,8 @@ fn expectMode(dir: posix.fd_t, file: []const u8, mode: posix.mode_t) !void {
13911391}
13921392
13931393test "fchmodat smoke test" {
1394 if (builtin.cpu.arch.isMIPS64() and (builtin.abi == .gnuabin32 or builtin.abi == .muslabin32)) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/23808
1395
13941396 if (!std.fs.has_executable_bit) return error.SkipZigTest;
13951397
13961398 var tmp = tmpDir(.{});
lib/std/zig/target.zig+14
......@@ -131,6 +131,20 @@ pub fn glibcRuntimeTriple(
131131 };
132132}
133133
134/// Returns the subdirectory triple to be used to find the correct musl for the given `arch` and
135/// `abi` in an installation directory.
136///
137/// `abi` must be a musl ABI, i.e. `.isMusl()`.
138pub fn muslRuntimeTriple(
139 allocator: Allocator,
140 arch: std.Target.Cpu.Arch,
141 abi: std.Target.Abi,
142) Allocator.Error![]const u8 {
143 assert(abi.isMusl());
144
145 return std.Target.linuxTripleSimple(allocator, arch, .linux, abi);
146}
147
134148pub fn osArchName(target: std.Target) [:0]const u8 {
135149 return switch (target.os.tag) {
136150 .linux => switch (target.cpu.arch) {
test/behavior/basic.zig+1
......@@ -1204,6 +1204,7 @@ test "arrays and vectors with big integers" {
12041204 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
12051205 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
12061206 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
1207 if (builtin.zig_backend == .stage2_llvm and (builtin.abi == .gnuabin32 or builtin.abi == .muslabin32)) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/23805
12071208
12081209 inline for (.{ u65528, u65529, u65535 }) |Int| {
12091210 var a: [1]Int = undefined;
test/tests.zig+314-3
......@@ -20,6 +20,7 @@ pub const StackTracesContext = @import("src/StackTrace.zig");
2020pub const DebuggerContext = @import("src/Debugger.zig");
2121
2222const TestTarget = struct {
23 linkage: ?std.builtin.LinkMode = null,
2324 target: std.Target.Query = .{},
2425 optimize_mode: std.builtin.OptimizeMode = .Debug,
2526 link_libc: ?bool = null,
......@@ -30,8 +31,9 @@ const TestTarget = struct {
3031 strip: ?bool = null,
3132 skip_modules: []const []const u8 = &.{},
3233
33 // This is intended for targets that are known to be slow to compile, or require a newer LLVM
34 // version than is present on the CI machines, etc.
34 // This is intended for targets that, for any reason, shouldn't be run as part of a normal test
35 // invocation. This could be because of a slow backend, requiring a newer LLVM version, being
36 // too niche, etc.
3537 extra_target: bool = false,
3638};
3739
......@@ -240,6 +242,15 @@ const test_targets = blk: {
240242 },
241243 .link_libc = true,
242244 },
245 .{
246 .target = .{
247 .cpu_arch = .x86_64,
248 .os_tag = .linux,
249 .abi = .musl,
250 },
251 .linkage = .dynamic,
252 .link_libc = true,
253 },
243254 .{
244255 .target = .{
245256 .cpu_arch = .x86_64,
......@@ -248,6 +259,16 @@ const test_targets = blk: {
248259 },
249260 .link_libc = true,
250261 },
262 .{
263 .target = .{
264 .cpu_arch = .x86_64,
265 .os_tag = .linux,
266 .abi = .muslx32,
267 },
268 .linkage = .dynamic,
269 .link_libc = true,
270 .extra_target = true,
271 },
251272 .{
252273 .target = .{
253274 .cpu_arch = .x86_64,
......@@ -273,6 +294,17 @@ const test_targets = blk: {
273294 },
274295 .link_libc = true,
275296 },
297 // https://github.com/ziglang/zig/issues/7935
298 // .{
299 // .target = .{
300 // .cpu_arch = .x86,
301 // .os_tag = .linux,
302 // .abi = .musl,
303 // },
304 // .linkage = .dynamic,
305 // .link_libc = true,
306 // .extra_target = true,
307 // },
276308 .{
277309 .target = .{
278310 .cpu_arch = .x86,
......@@ -297,6 +329,15 @@ const test_targets = blk: {
297329 },
298330 .link_libc = true,
299331 },
332 .{
333 .target = .{
334 .cpu_arch = .aarch64,
335 .os_tag = .linux,
336 .abi = .musl,
337 },
338 .linkage = .dynamic,
339 .link_libc = true,
340 },
300341 .{
301342 .target = .{
302343 .cpu_arch = .aarch64,
......@@ -329,6 +370,16 @@ const test_targets = blk: {
329370 },
330371 .link_libc = true,
331372 },
373 .{
374 .target = .{
375 .cpu_arch = .aarch64_be,
376 .os_tag = .linux,
377 .abi = .musl,
378 },
379 .linkage = .dynamic,
380 .link_libc = true,
381 .extra_target = true,
382 },
332383 .{
333384 .target = .{
334385 .cpu_arch = .aarch64_be,
......@@ -360,6 +411,17 @@ const test_targets = blk: {
360411 },
361412 .link_libc = true,
362413 },
414 // Crashes in weird ways when applying relocations.
415 // .{
416 // .target = .{
417 // .cpu_arch = .arm,
418 // .os_tag = .linux,
419 // .abi = .musleabi,
420 // },
421 // .linkage = .dynamic,
422 // .link_libc = true,
423 // .extra_target = true,
424 // },
363425 .{
364426 .target = .{
365427 .cpu_arch = .arm,
......@@ -368,6 +430,17 @@ const test_targets = blk: {
368430 },
369431 .link_libc = true,
370432 },
433 // Crashes in weird ways when applying relocations.
434 // .{
435 // .target = .{
436 // .cpu_arch = .arm,
437 // .os_tag = .linux,
438 // .abi = .musleabihf,
439 // },
440 // .linkage = .dynamic,
441 // .link_libc = true,
442 // .extra_target = true,
443 // },
371444 .{
372445 .target = .{
373446 .cpu_arch = .arm,
......@@ -407,6 +480,17 @@ const test_targets = blk: {
407480 },
408481 .link_libc = true,
409482 },
483 // Crashes in weird ways when applying relocations.
484 // .{
485 // .target = .{
486 // .cpu_arch = .armeb,
487 // .os_tag = .linux,
488 // .abi = .musleabi,
489 // },
490 // .linkage = .dynamic,
491 // .link_libc = true,
492 // .extra_target = true,
493 // },
410494 .{
411495 .target = .{
412496 .cpu_arch = .armeb,
......@@ -415,6 +499,17 @@ const test_targets = blk: {
415499 },
416500 .link_libc = true,
417501 },
502 // Crashes in weird ways when applying relocations.
503 // .{
504 // .target = .{
505 // .cpu_arch = .armeb,
506 // .os_tag = .linux,
507 // .abi = .musleabihf,
508 // },
509 // .linkage = .dynamic,
510 // .link_libc = true,
511 // .extra_target = true,
512 // },
418513 .{
419514 .target = .{
420515 .cpu_arch = .armeb,
......@@ -516,6 +611,19 @@ const test_targets = blk: {
516611 // https://github.com/llvm/llvm-project/pull/111217
517612 .skip_modules = &.{"std"},
518613 },
614 // Currently crashes in qemu-hexagon.
615 // .{
616 // .target = .{
617 // .cpu_arch = .hexagon,
618 // .os_tag = .linux,
619 // .abi = .musl,
620 // },
621 // .linkage = .dynamic,
622 // .link_libc = true,
623 // // https://github.com/llvm/llvm-project/pull/111217
624 // .skip_modules = &.{"std"},
625 // .extra_target = true,
626 // },
519627
520628 .{
521629 .target = .{
......@@ -534,6 +642,17 @@ const test_targets = blk: {
534642 .link_libc = true,
535643 .skip_modules = &.{"std"},
536644 },
645 .{
646 .target = .{
647 .cpu_arch = .loongarch64,
648 .os_tag = .linux,
649 .abi = .musl,
650 },
651 .linkage = .dynamic,
652 .link_libc = true,
653 .skip_modules = &.{"std"},
654 .extra_target = true,
655 },
537656 .{
538657 .target = .{
539658 .cpu_arch = .loongarch64,
......@@ -566,6 +685,16 @@ const test_targets = blk: {
566685 },
567686 .link_libc = true,
568687 },
688 .{
689 .target = .{
690 .cpu_arch = .mips,
691 .os_tag = .linux,
692 .abi = .musleabi,
693 },
694 .linkage = .dynamic,
695 .link_libc = true,
696 .extra_target = true,
697 },
569698 .{
570699 .target = .{
571700 .cpu_arch = .mips,
......@@ -574,6 +703,16 @@ const test_targets = blk: {
574703 },
575704 .link_libc = true,
576705 },
706 .{
707 .target = .{
708 .cpu_arch = .mips,
709 .os_tag = .linux,
710 .abi = .musleabihf,
711 },
712 .linkage = .dynamic,
713 .link_libc = true,
714 .extra_target = true,
715 },
577716 .{
578717 .target = .{
579718 .cpu_arch = .mips,
......@@ -613,13 +752,33 @@ const test_targets = blk: {
613752 },
614753 .link_libc = true,
615754 },
755 .{
756 .target = .{
757 .cpu_arch = .mipsel,
758 .os_tag = .linux,
759 .abi = .musleabi,
760 },
761 .linkage = .dynamic,
762 .link_libc = true,
763 .extra_target = true,
764 },
765 .{
766 .target = .{
767 .cpu_arch = .mipsel,
768 .os_tag = .linux,
769 .abi = .musleabihf,
770 },
771 .link_libc = true,
772 },
616773 .{
617774 .target = .{
618775 .cpu_arch = .mipsel,
619776 .os_tag = .linux,
620777 .abi = .musleabihf,
621778 },
779 .linkage = .dynamic,
622780 .link_libc = true,
781 .extra_target = true,
623782 },
624783 .{
625784 .target = .{
......@@ -653,6 +812,34 @@ const test_targets = blk: {
653812 },
654813 .link_libc = true,
655814 },
815 .{
816 .target = .{
817 .cpu_arch = .mips64,
818 .os_tag = .linux,
819 .abi = .muslabi64,
820 },
821 .linkage = .dynamic,
822 .link_libc = true,
823 .extra_target = true,
824 },
825 .{
826 .target = .{
827 .cpu_arch = .mips64,
828 .os_tag = .linux,
829 .abi = .muslabin32,
830 },
831 .link_libc = true,
832 },
833 .{
834 .target = .{
835 .cpu_arch = .mips64,
836 .os_tag = .linux,
837 .abi = .muslabin32,
838 },
839 .linkage = .dynamic,
840 .link_libc = true,
841 .extra_target = true,
842 },
656843 .{
657844 .target = .{
658845 .cpu_arch = .mips64,
......@@ -661,6 +848,14 @@ const test_targets = blk: {
661848 },
662849 .link_libc = true,
663850 },
851 .{
852 .target = .{
853 .cpu_arch = .mips64,
854 .os_tag = .linux,
855 .abi = .gnuabin32,
856 },
857 .link_libc = true,
858 },
664859
665860 .{
666861 .target = .{
......@@ -677,6 +872,34 @@ const test_targets = blk: {
677872 },
678873 .link_libc = true,
679874 },
875 .{
876 .target = .{
877 .cpu_arch = .mips64el,
878 .os_tag = .linux,
879 .abi = .muslabi64,
880 },
881 .linkage = .dynamic,
882 .link_libc = true,
883 .extra_target = true,
884 },
885 .{
886 .target = .{
887 .cpu_arch = .mips64el,
888 .os_tag = .linux,
889 .abi = .muslabin32,
890 },
891 .link_libc = true,
892 },
893 .{
894 .target = .{
895 .cpu_arch = .mips64el,
896 .os_tag = .linux,
897 .abi = .muslabin32,
898 },
899 .linkage = .dynamic,
900 .link_libc = true,
901 .extra_target = true,
902 },
680903 .{
681904 .target = .{
682905 .cpu_arch = .mips64el,
......@@ -685,6 +908,14 @@ const test_targets = blk: {
685908 },
686909 .link_libc = true,
687910 },
911 .{
912 .target = .{
913 .cpu_arch = .mips64el,
914 .os_tag = .linux,
915 .abi = .gnuabin32,
916 },
917 .link_libc = true,
918 },
688919
689920 .{
690921 .target = .{
......@@ -708,13 +939,37 @@ const test_targets = blk: {
708939 },
709940 .link_libc = true,
710941 },
942 .{
943 .target = .{
944 .cpu_arch = .powerpc,
945 .os_tag = .linux,
946 .abi = .musleabi,
947 },
948 .linkage = .dynamic,
949 .link_libc = true,
950 // https://github.com/ziglang/zig/issues/2256
951 .skip_modules = &.{"std"},
952 .extra_target = true,
953 },
954 .{
955 .target = .{
956 .cpu_arch = .powerpc,
957 .os_tag = .linux,
958 .abi = .musleabihf,
959 },
960 .link_libc = true,
961 },
711962 .{
712963 .target = .{
713964 .cpu_arch = .powerpc,
714965 .os_tag = .linux,
715966 .abi = .musleabihf,
716967 },
968 .linkage = .dynamic,
717969 .link_libc = true,
970 // https://github.com/ziglang/zig/issues/2256
971 .skip_modules = &.{"std"},
972 .extra_target = true,
718973 },
719974 .{
720975 .target = .{
......@@ -752,6 +1007,16 @@ const test_targets = blk: {
7521007 },
7531008 .link_libc = true,
7541009 },
1010 .{
1011 .target = .{
1012 .cpu_arch = .powerpc64,
1013 .os_tag = .linux,
1014 .abi = .musl,
1015 },
1016 .linkage = .dynamic,
1017 .link_libc = true,
1018 .extra_target = true,
1019 },
7551020 // Requires ELFv1 linker support.
7561021 // .{
7571022 // .target = .{
......@@ -776,6 +1041,16 @@ const test_targets = blk: {
7761041 },
7771042 .link_libc = true,
7781043 },
1044 .{
1045 .target = .{
1046 .cpu_arch = .powerpc64le,
1047 .os_tag = .linux,
1048 .abi = .musl,
1049 },
1050 .linkage = .dynamic,
1051 .link_libc = true,
1052 .extra_target = true,
1053 },
7791054 .{
7801055 .target = .{
7811056 .cpu_arch = .powerpc64le,
......@@ -814,6 +1089,16 @@ const test_targets = blk: {
8141089 },
8151090 .link_libc = true,
8161091 },
1092 .{
1093 .target = .{
1094 .cpu_arch = .riscv32,
1095 .os_tag = .linux,
1096 .abi = .musl,
1097 },
1098 .linkage = .dynamic,
1099 .link_libc = true,
1100 .extra_target = true,
1101 },
8171102 .{
8181103 .target = .{
8191104 .cpu_arch = .riscv32,
......@@ -852,6 +1137,16 @@ const test_targets = blk: {
8521137 },
8531138 .link_libc = true,
8541139 },
1140 .{
1141 .target = .{
1142 .cpu_arch = .riscv64,
1143 .os_tag = .linux,
1144 .abi = .musl,
1145 },
1146 .linkage = .dynamic,
1147 .link_libc = true,
1148 .extra_target = true,
1149 },
8551150 .{
8561151 .target = .{
8571152 .cpu_arch = .riscv64,
......@@ -885,6 +1180,17 @@ const test_targets = blk: {
8851180 },
8861181 .link_libc = true,
8871182 },
1183 // Currently hangs in qemu-s390x.
1184 // .{
1185 // .target = .{
1186 // .cpu_arch = .s390x,
1187 // .os_tag = .linux,
1188 // .abi = .musl,
1189 // },
1190 // .linkage = .dynamic,
1191 // .link_libc = true,
1192 // .extra_target = true,
1193 // },
8881194 .{
8891195 .target = .{
8901196 .cpu_arch = .s390x,
......@@ -1518,6 +1824,7 @@ pub fn addModuleTests(b: *std.Build, options: ModuleTestOptions) *Step {
15181824 .use_lld = test_target.use_lld,
15191825 .zig_lib_dir = b.path("lib"),
15201826 });
1827 these_tests.linkage = test_target.linkage;
15211828 if (options.no_builtin) these_tests.no_builtin = true;
15221829 if (options.build_options) |build_options| {
15231830 these_tests.root_module.addOptions("build_options", build_options);
......@@ -1532,11 +1839,14 @@ pub fn addModuleTests(b: *std.Build, options: ModuleTestOptions) *Step {
15321839 else
15331840 "";
15341841 const use_lld = if (test_target.use_lld == false) "-no-lld" else "";
1842 const linkage_name = if (test_target.linkage) |linkage| switch (linkage) {
1843 inline else => |t| "-" ++ @tagName(t),
1844 } else "";
15351845 const use_pic = if (test_target.pic == true) "-pic" else "";
15361846
15371847 for (options.include_paths) |include_path| these_tests.addIncludePath(b.path(include_path));
15381848
1539 const qualified_name = b.fmt("{s}-{s}-{s}-{s}{s}{s}{s}{s}{s}", .{
1849 const qualified_name = b.fmt("{s}-{s}-{s}-{s}{s}{s}{s}{s}{s}{s}", .{
15401850 options.name,
15411851 triple_txt,
15421852 model_txt,
......@@ -1545,6 +1855,7 @@ pub fn addModuleTests(b: *std.Build, options: ModuleTestOptions) *Step {
15451855 single_threaded_suffix,
15461856 backend_suffix,
15471857 use_lld,
1858 linkage_name,
15481859 use_pic,
15491860 });
15501861