From 496eb69273d363f21ca3923f00714b229882e42a Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 21 Apr 2022 20:28:36 -0700 Subject: [PATCH] CI: add non-LLVM backends to the test matrix We can't yet run the behavior tests with stage3, but at least we can run them with stage2, and we can use the proper test matrix. This commit also adds use_llvm and ofmt to the zig build system. --- build.zig | 12 +++ ci/zinc/linux_test.sh | 26 +++--- lib/std/build.zig | 14 ++++ test/tests.zig | 179 +++++++++++++++++++++++++++++++----------- 4 files changed, 168 insertions(+), 63 deletions(-) diff --git a/build.zig b/build.zig index 4d3cf492bd..e9f0b69400 100644 --- a/build.zig +++ b/build.zig @@ -445,6 +445,9 @@ pub fn build(b: *Builder) !void { false, // skip_single_threaded skip_non_native, skip_libc, + skip_stage1, + omit_stage2, + is_stage1, )); toolchain_step.dependOn(tests.addPkgTests( @@ -457,6 +460,9 @@ pub fn build(b: *Builder) !void { true, // skip_single_threaded skip_non_native, true, // skip_libc + skip_stage1, + omit_stage2 or true, // TODO get these all passing + is_stage1, )); toolchain_step.dependOn(tests.addPkgTests( @@ -469,6 +475,9 @@ pub fn build(b: *Builder) !void { true, // skip_single_threaded skip_non_native, true, // skip_libc + skip_stage1, + omit_stage2 or true, // TODO get these all passing + is_stage1, )); toolchain_step.dependOn(tests.addCompareOutputTests(b, test_filter, modes)); @@ -494,6 +503,9 @@ pub fn build(b: *Builder) !void { false, skip_non_native, skip_libc, + skip_stage1, + omit_stage2 or true, // TODO get these all passing + is_stage1, ); const test_step = b.step("test", "Run all the tests"); diff --git a/ci/zinc/linux_test.sh b/ci/zinc/linux_test.sh index 180589cc8e..01aee9a502 100755 --- a/ci/zinc/linux_test.sh +++ b/ci/zinc/linux_test.sh @@ -48,25 +48,19 @@ cd $WORKSPACE $ZIG fmt --check . --exclude test/cases/ # Build stage2 standalone so that we can test stage2 against stage2 compiler-rt. -$ZIG build -p stage2 -Dstatic-llvm -Dtarget=native-native-musl --search-prefix "$DEPS_LOCAL" +$ZIG build -p stage2 -Dstatic-llvm -Dtarget=native-native-musl --search-prefix "$DEPS_LOCAL" # Ensure that stage2 can build itself. -./stage2/bin/zig build -p stage3 -Dstatic-llvm -Dtarget=native-native-musl --search-prefix "$DEPS_LOCAL" +stage2/bin/zig build -p stage3 -Dstatic-llvm -Dtarget=native-native-musl --search-prefix "$DEPS_LOCAL" +stage2/bin/zig build # test building self-hosted without LLVM +stage2/bin/zig build -Dtarget=arm-linux-musleabihf # test building self-hosted for 32-bit arm -stage2/bin/zig test test/behavior.zig -I test -fLLVM -stage2/bin/zig test test/behavior.zig -I test -fno-LLVM -stage2/bin/zig test test/behavior.zig -I test -fLLVM -target aarch64-linux --test-cmd qemu-aarch64 --test-cmd-bin -stage2/bin/zig test test/behavior.zig -I test -fno-LLVM -target aarch64-linux --test-cmd qemu-aarch64 --test-cmd-bin -stage2/bin/zig test test/behavior.zig -I test -ofmt=c -stage2/bin/zig test test/behavior.zig -I test -fno-LLVM -target wasm32-wasi --test-cmd wasmtime --test-cmd-bin -stage2/bin/zig test test/behavior.zig -I test -fLLVM -target wasm32-wasi --test-cmd wasmtime --test-cmd-bin -stage2/bin/zig test test/behavior.zig -I test -fno-LLVM -target arm-linux --test-cmd qemu-arm --test-cmd-bin -stage2/bin/zig test test/behavior.zig -I test -fLLVM -target aarch64-macos --test-no-exec -stage2/bin/zig test test/behavior.zig -I test -fno-LLVM -target aarch64-macos --test-no-exec -stage2/bin/zig test test/behavior.zig -I test -fLLVM -target x86_64-macos --test-no-exec -stage2/bin/zig test test/behavior.zig -I test -fno-LLVM -target x86_64-macos --test-no-exec +# Here we use stage2 instead of stage3 because of two bugs remaining: +# * https://github.com/ziglang/zig/issues/11367 (and corresponding workaround in compiler source) +# * https://github.com/ziglang/zig/pull/11492#issuecomment-1112871321 +stage2/bin/zig build test-behavior -fqemu -fwasmtime -$ZIG build test-behavior -fqemu -fwasmtime +$ZIG build test-behavior -fqemu -fwasmtime -Domit-stage2 $ZIG build test-compiler-rt -fqemu -fwasmtime $ZIG build test-std -fqemu -fwasmtime $ZIG build test-minilibc -fqemu -fwasmtime @@ -79,8 +73,6 @@ $ZIG build test-runtime-safety -fqemu -fwasmtime $ZIG build test-translate-c -fqemu -fwasmtime $ZIG build test-run-translated-c -fqemu -fwasmtime $ZIG build docs -fqemu -fwasmtime -$ZIG build # test building self-hosted without LLVM -$ZIG build -Dtarget=arm-linux-musleabihf # test building self-hosted for 32-bit arm $ZIG build test-fmt -fqemu -fwasmtime $ZIG build test-stage2 -fqemu -fwasmtime diff --git a/lib/std/build.zig b/lib/std/build.zig index 38744cea1e..b50678a0e5 100644 --- a/lib/std/build.zig +++ b/lib/std/build.zig @@ -1590,6 +1590,8 @@ pub const LibExeObjStep = struct { want_lto: ?bool = null, use_stage1: ?bool = null, + use_llvm: ?bool = null, + ofmt: ?std.Target.ObjectFormat = null, output_path_source: GeneratedFile, output_lib_path_source: GeneratedFile, @@ -2351,6 +2353,18 @@ pub const LibExeObjStep = struct { } } + if (self.use_llvm) |use_llvm| { + if (use_llvm) { + try zig_args.append("-fLLVM"); + } else { + try zig_args.append("-fno-LLVM"); + } + } + + if (self.ofmt) |ofmt| { + try zig_args.append(try std.fmt.allocPrint(builder.allocator, "-ofmt={s}", .{@tagName(ofmt)})); + } + if (self.entry_symbol_name) |entry| { try zig_args.append("--entry"); try zig_args.append(entry); diff --git a/test/tests.zig b/test/tests.zig index ee4b922021..62c437e7f7 100644 --- a/test/tests.zig +++ b/test/tests.zig @@ -34,6 +34,7 @@ const TestTarget = struct { link_libc: bool = false, single_threaded: bool = false, disable_native: bool = false, + backend: ?std.builtin.CompilerBackend = null, }; const test_targets = blk: { @@ -42,15 +43,73 @@ const test_targets = blk: { // lot of branches) @setEvalBranchQuota(50000); break :blk [_]TestTarget{ - TestTarget{}, - TestTarget{ + .{}, + .{ .link_libc = true, }, - TestTarget{ + .{ .single_threaded = true, }, - TestTarget{ + .{ + .link_libc = true, + .backend = .stage2_c, + }, + .{ + .target = .{ + .cpu_arch = .x86_64, + .os_tag = .linux, + .abi = .none, + }, + .backend = .stage2_x86_64, + }, + .{ + .target = .{ + .cpu_arch = .aarch64, + .os_tag = .linux, + }, + .backend = .stage2_aarch64, + }, + .{ + .target = .{ + .cpu_arch = .wasm32, + .os_tag = .wasi, + }, + .single_threaded = true, + .backend = .stage2_wasm, + }, + .{ + .target = .{ + .cpu_arch = .arm, + .os_tag = .linux, + }, + .backend = .stage2_wasm, + }, + .{ + .target = CrossTarget.parse(.{ + .arch_os_abi = "arm-linux-none", + .cpu_features = "generic+v8a", + }) catch unreachable, + .backend = .stage2_arm, + }, + .{ + .target = .{ + .cpu_arch = .aarch64, + .os_tag = .macos, + .abi = .gnu, + }, + .backend = .stage2_aarch64, + }, + .{ + .target = .{ + .cpu_arch = .x86_64, + .os_tag = .macos, + .abi = .gnu, + }, + .backend = .stage2_x86_64, + }, + + .{ .target = .{ .cpu_arch = .wasm32, .os_tag = .wasi, @@ -58,7 +117,7 @@ const test_targets = blk: { .link_libc = false, .single_threaded = true, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .wasm32, .os_tag = .wasi, @@ -67,14 +126,14 @@ const test_targets = blk: { .single_threaded = true, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .x86_64, .os_tag = .linux, .abi = .none, }, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .x86_64, .os_tag = .linux, @@ -82,7 +141,7 @@ const test_targets = blk: { }, .link_libc = true, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .x86_64, .os_tag = .linux, @@ -91,14 +150,14 @@ const test_targets = blk: { .link_libc = true, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .i386, .os_tag = .linux, .abi = .none, }, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .i386, .os_tag = .linux, @@ -106,7 +165,7 @@ const test_targets = blk: { }, .link_libc = true, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .i386, .os_tag = .linux, @@ -115,14 +174,14 @@ const test_targets = blk: { .link_libc = true, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .aarch64, .os_tag = .linux, .abi = .none, }, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .aarch64, .os_tag = .linux, @@ -130,7 +189,7 @@ const test_targets = blk: { }, .link_libc = true, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .aarch64, .os_tag = .linux, @@ -138,7 +197,7 @@ const test_targets = blk: { }, .link_libc = true, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .aarch64, .os_tag = .windows, @@ -147,13 +206,13 @@ const test_targets = blk: { .link_libc = true, }, - TestTarget{ + .{ .target = CrossTarget.parse(.{ .arch_os_abi = "arm-linux-none", .cpu_features = "generic+v8a", }) catch unreachable, }, - TestTarget{ + .{ .target = CrossTarget.parse(.{ .arch_os_abi = "arm-linux-musleabihf", .cpu_features = "generic+v8a", @@ -161,7 +220,7 @@ const test_targets = blk: { .link_libc = true, }, // https://github.com/ziglang/zig/issues/3287 - //TestTarget{ + //.{ // .target = CrossTarget.parse(.{ // .arch_os_abi = "arm-linux-gnueabihf", // .cpu_features = "generic+v8a", @@ -169,7 +228,7 @@ const test_targets = blk: { // .link_libc = true, //}, - TestTarget{ + .{ .target = .{ .cpu_arch = .mips, .os_tag = .linux, @@ -177,7 +236,7 @@ const test_targets = blk: { }, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .mips, .os_tag = .linux, @@ -187,7 +246,7 @@ const test_targets = blk: { }, // https://github.com/ziglang/zig/issues/4927 - //TestTarget{ + //.{ // .target = .{ // .cpu_arch = .mips, // .os_tag = .linux, @@ -196,7 +255,7 @@ const test_targets = blk: { // .link_libc = true, //}, - TestTarget{ + .{ .target = .{ .cpu_arch = .mipsel, .os_tag = .linux, @@ -204,7 +263,7 @@ const test_targets = blk: { }, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .mipsel, .os_tag = .linux, @@ -214,7 +273,7 @@ const test_targets = blk: { }, // https://github.com/ziglang/zig/issues/4927 - //TestTarget{ + //.{ // .target = .{ // .cpu_arch = .mipsel, // .os_tag = .linux, @@ -223,14 +282,14 @@ const test_targets = blk: { // .link_libc = true, //}, - TestTarget{ + .{ .target = .{ .cpu_arch = .powerpc, .os_tag = .linux, .abi = .none, }, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .powerpc, .os_tag = .linux, @@ -239,7 +298,7 @@ const test_targets = blk: { .link_libc = true, }, // https://github.com/ziglang/zig/issues/2256 - //TestTarget{ + //.{ // .target = .{ // .cpu_arch = .powerpc, // .os_tag = .linux, @@ -248,7 +307,7 @@ const test_targets = blk: { // .link_libc = true, //}, - TestTarget{ + .{ .target = .{ .cpu_arch = .riscv64, .os_tag = .linux, @@ -256,7 +315,7 @@ const test_targets = blk: { }, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .riscv64, .os_tag = .linux, @@ -266,7 +325,7 @@ const test_targets = blk: { }, // https://github.com/ziglang/zig/issues/3340 - //TestTarget{ + //.{ // .target = .{ // .cpu_arch = .riscv64, // .os = .linux, @@ -275,7 +334,7 @@ const test_targets = blk: { // .link_libc = true, //}, - TestTarget{ + .{ .target = .{ .cpu_arch = .x86_64, .os_tag = .macos, @@ -283,7 +342,7 @@ const test_targets = blk: { }, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .aarch64, .os_tag = .macos, @@ -291,7 +350,7 @@ const test_targets = blk: { }, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .i386, .os_tag = .windows, @@ -299,7 +358,7 @@ const test_targets = blk: { }, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .x86_64, .os_tag = .windows, @@ -307,7 +366,7 @@ const test_targets = blk: { }, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .i386, .os_tag = .windows, @@ -316,7 +375,7 @@ const test_targets = blk: { .link_libc = true, }, - TestTarget{ + .{ .target = .{ .cpu_arch = .x86_64, .os_tag = .windows, @@ -326,38 +385,38 @@ const test_targets = blk: { }, // Do the release tests last because they take a long time - TestTarget{ + .{ .mode = .ReleaseFast, }, - TestTarget{ + .{ .link_libc = true, .mode = .ReleaseFast, }, - TestTarget{ + .{ .mode = .ReleaseFast, .single_threaded = true, }, - TestTarget{ + .{ .mode = .ReleaseSafe, }, - TestTarget{ + .{ .link_libc = true, .mode = .ReleaseSafe, }, - TestTarget{ + .{ .mode = .ReleaseSafe, .single_threaded = true, }, - TestTarget{ + .{ .mode = .ReleaseSmall, }, - TestTarget{ + .{ .link_libc = true, .mode = .ReleaseSmall, }, - TestTarget{ + .{ .mode = .ReleaseSmall, .single_threaded = true, }, @@ -524,6 +583,9 @@ pub fn addPkgTests( skip_single_threaded: bool, skip_non_native: bool, skip_libc: bool, + skip_stage1: bool, + skip_stage2: bool, + is_stage1: bool, ) *build.Step { const step = b.step(b.fmt("test-{s}", .{name}), desc); @@ -549,6 +611,11 @@ pub fn addPkgTests( continue; } + if (test_target.backend) |backend| switch (backend) { + .stage1 => if (skip_stage1) continue, + else => if (skip_stage2) continue, + } else if (is_stage1 and skip_stage1) continue; + const want_this_mode = for (modes) |m| { if (m == test_target.mode) break true; } else false; @@ -565,12 +632,14 @@ pub fn addPkgTests( const these_tests = b.addTest(root_src); const single_threaded_txt = if (test_target.single_threaded) "single" else "multi"; - these_tests.setNamePrefix(b.fmt("{s}-{s}-{s}-{s}-{s} ", .{ + const backend_txt = if (test_target.backend) |backend| @tagName(backend) else "default"; + these_tests.setNamePrefix(b.fmt("{s}-{s}-{s}-{s}-{s}-{s} ", .{ name, triple_prefix, @tagName(test_target.mode), libc_prefix, single_threaded_txt, + backend_txt, })); these_tests.single_threaded = test_target.single_threaded; these_tests.setFilter(test_filter); @@ -581,6 +650,24 @@ pub fn addPkgTests( } these_tests.overrideZigLibDir("lib"); these_tests.addIncludePath("test"); + if (test_target.backend) |backend| switch (backend) { + .stage1 => { + these_tests.use_stage1 = true; + }, + .stage2_llvm => { + these_tests.use_stage1 = false; + these_tests.use_llvm = true; + }, + .stage2_c => { + these_tests.use_stage1 = false; + these_tests.use_llvm = false; + these_tests.ofmt = .c; + }, + else => { + these_tests.use_stage1 = false; + these_tests.use_llvm = false; + }, + }; step.dependOn(&these_tests.step); }