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 4d3cf492bd0944ab51fe2528b92a36a81c16b55e..e9f0b69400813fc05958bde839b940947f3fbfe3 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 180589cc8ef8bd8fb8c038ba70d12ee8e8e33025..01aee9a502aab445d1417f3f8b1f3eee949d50df 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 38744cea1eabe4c486d4ffdc0f24c30de8b5d646..b50678a0e550586364ef9da3228c764881806517 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 ee4b92202184de9d7d0f08c0df4d4d19864e5a6f..62c437e7f73ec43f9c244c182c9750ce095a8294 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); } -- 2.54.0