From 24ecf45569f10743c5df6a39e6e71dcee265786a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 23 Nov 2024 17:57:39 +0100 Subject: [PATCH 01/13] std.Target: Add Os.HurdVersionRange for Os.Tag.hurd. This is necessary since isGnuLibC() is true for hurd, so we need to be able to represent a glibc version for it. Also add an Os.TaggedVersionRange.gnuLibCVersion() convenience function. --- lib/std/Build/Cache.zig | 5 +++ lib/std/Target.zig | 40 ++++++++++++++++--- lib/std/Target/Query.zig | 10 ++--- lib/std/c.zig | 5 +-- lib/std/zig/system.zig | 13 +++--- lib/std/zig/target.zig | 4 +- src/Builtin.zig | 34 ++++++++++++++++ src/Compilation.zig | 2 +- src/codegen/llvm.zig | 16 +++++--- src/glibc.zig | 6 +-- src/libcxx.zig | 6 +-- src/link/Elf.zig | 2 +- test/link/glibc_compat/build.zig | 5 +-- .../link/glibc_compat/glibc_runtime_check.zig | 2 +- 14 files changed, 111 insertions(+), 39 deletions(-) diff --git a/lib/std/Build/Cache.zig b/lib/std/Build/Cache.zig index 16ecf3c0b0..3f96c5f93c 100644 --- a/lib/std/Build/Cache.zig +++ b/lib/std/Build/Cache.zig @@ -217,6 +217,11 @@ pub const HashHelper = struct { }, std.Target.Os.TaggedVersionRange => { switch (x) { + .hurd => |hurd| { + hh.add(hurd.range.min); + hh.add(hurd.range.max); + hh.add(hurd.glibc); + }, .linux => |linux| { hh.add(linux.range.min); hh.add(linux.range.max); diff --git a/lib/std/Target.zig b/lib/std/Target.zig index b2808255b0..8f2329d541 100644 --- a/lib/std/Target.zig +++ b/lib/std/Target.zig @@ -187,7 +187,6 @@ pub const Os = struct { .hermit, .aix, - .hurd, .rtems, .zos, @@ -218,6 +217,7 @@ pub const Os = struct { .vulkan, => .semver, + .hurd => .hurd, .linux => .linux, .windows => .windows, @@ -356,6 +356,21 @@ pub const Os = struct { } }; + pub const HurdVersionRange = struct { + range: std.SemanticVersion.Range, + glibc: std.SemanticVersion, + + pub inline fn includesVersion(range: HurdVersionRange, ver: std.SemanticVersion) bool { + return range.range.includesVersion(ver); + } + + /// Checks if system is guaranteed to be at least `version` or older than `version`. + /// Returns `null` if a runtime check is required. + pub inline fn isAtLeast(range: HurdVersionRange, ver: std.SemanticVersion) ?bool { + return range.range.isAtLeast(ver); + } + }; + pub const LinuxVersionRange = struct { range: std.SemanticVersion.Range, glibc: std.SemanticVersion, @@ -400,6 +415,7 @@ pub const Os = struct { pub const VersionRange = union { none: void, semver: std.SemanticVersion.Range, + hurd: HurdVersionRange, linux: LinuxVersionRange, windows: WindowsVersion.Range, @@ -456,9 +472,12 @@ pub const Os = struct { }, }, .hurd => .{ - .semver = .{ - .min = .{ .major = 0, .minor = 9, .patch = 0 }, - .max = .{ .major = 0, .minor = 9, .patch = 0 }, + .hurd = .{ + .range = .{ + .min = .{ .major = 0, .minor = 9, .patch = 0 }, + .max = .{ .major = 0, .minor = 9, .patch = 0 }, + }, + .glibc = .{ .major = 2, .minor = 28, .patch = 0 }, }, }, .linux => .{ @@ -632,8 +651,17 @@ pub const Os = struct { pub const TaggedVersionRange = union(enum) { none: void, semver: std.SemanticVersion.Range, + hurd: HurdVersionRange, linux: LinuxVersionRange, windows: WindowsVersion.Range, + + pub fn gnuLibCVersion(range: TaggedVersionRange) ?std.SemanticVersion { + return switch (range) { + .none, .semver, .windows => null, + .hurd => |h| h.glibc, + .linux => |l| l.glibc, + }; + } }; /// Provides a tagged union. `Target` does not store the tag because it is @@ -642,6 +670,7 @@ pub const Os = struct { return switch (os.tag.versionRangeTag()) { .none => .{ .none = {} }, .semver => .{ .semver = os.version_range.semver }, + .hurd => .{ .hurd = os.version_range.hurd }, .linux => .{ .linux = os.version_range.linux }, .windows => .{ .windows = os.version_range.windows }, }; @@ -651,12 +680,13 @@ pub const Os = struct { /// Returns `null` if a runtime check is required. pub inline fn isAtLeast(os: Os, comptime tag: Tag, ver: switch (tag.versionRangeTag()) { .none => void, - .semver, .linux => std.SemanticVersion, + .semver, .hurd, .linux => std.SemanticVersion, .windows => WindowsVersion, }) ?bool { return if (os.tag != tag) false else switch (tag.versionRangeTag()) { .none => true, inline .semver, + .hurd, .linux, .windows, => |field| @field(os.version_range, @tagName(field)).isAtLeast(ver), diff --git a/lib/std/Target/Query.zig b/lib/std/Target/Query.zig index f3e280ee32..144b2d60af 100644 --- a/lib/std/Target/Query.zig +++ b/lib/std/Target/Query.zig @@ -102,7 +102,7 @@ pub fn fromTarget(target: Target) Query { .os_version_min = undefined, .os_version_max = undefined, .abi = target.abi, - .glibc_version = if (target.isGnuLibC()) target.os.version_range.linux.glibc else null, + .glibc_version = target.os.versionRange().gnuLibCVersion(), .android_api_level = if (target.abi.isAndroid()) target.os.version_range.linux.android else null, }; result.updateOsVersionRange(target.os); @@ -132,9 +132,9 @@ fn updateOsVersionRange(self: *Query, os: Target.Os) void { .{ .semver = os.version_range.semver.min }, .{ .semver = os.version_range.semver.max }, }, - .linux => .{ - .{ .semver = os.version_range.linux.range.min }, - .{ .semver = os.version_range.linux.range.max }, + inline .hurd, .linux => |t| .{ + .{ .semver = @field(os.version_range, @tagName(t)).range.min }, + .{ .semver = @field(os.version_range, @tagName(t)).range.max }, }, .windows => .{ .{ .windows = os.version_range.windows.min }, @@ -544,7 +544,7 @@ fn parseOs(result: *Query, diags: *ParseOptions.Diagnostics, text: []const u8) ! const version_text = it.rest(); if (version_text.len > 0) switch (tag.versionRangeTag()) { .none => return error.InvalidOperatingSystemVersion, - .semver, .linux => range: { + .semver, .hurd, .linux => range: { var range_it = mem.splitSequence(u8, version_text, "..."); result.os_version_min = .{ .semver = parseVersion(range_it.first()) catch |err| switch (err) { diff --git a/lib/std/c.zig b/lib/std/c.zig index e9961556fb..c6a5a85521 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -56,9 +56,8 @@ pub inline fn versionCheck(comptime version: std.SemanticVersion) bool { if (!builtin.link_libc) break :blk false; if (native_abi.isMusl()) break :blk true; if (builtin.target.isGnuLibC()) { - const ver = builtin.os.version_range.linux.glibc; - const order = ver.order(version); - break :blk switch (order) { + const ver = builtin.os.versionRange().gnuLibCVersion().?; + break :blk switch (ver.order(version)) { .gt, .eq => true, .lt => false, }; diff --git a/lib/std/zig/system.zig b/lib/std/zig/system.zig index d4eb76dc3d..48b195dc3e 100644 --- a/lib/std/zig/system.zig +++ b/lib/std/zig/system.zig @@ -311,8 +311,8 @@ pub fn resolveTargetQuery(query: Target.Query) DetectError!Target { if (query.os_version_min) |min| switch (min) { .none => {}, - .semver => |semver| switch (os.tag) { - .linux => os.version_range.linux.range.min = semver, + .semver => |semver| switch (os.tag.versionRangeTag()) { + inline .hurd, .linux => |t| @field(os.version_range, @tagName(t)).range.min = semver, else => os.version_range.semver.min = semver, }, .windows => |win_ver| os.version_range.windows.min = win_ver, @@ -320,15 +320,18 @@ pub fn resolveTargetQuery(query: Target.Query) DetectError!Target { if (query.os_version_max) |max| switch (max) { .none => {}, - .semver => |semver| switch (os.tag) { - .linux => os.version_range.linux.range.max = semver, + .semver => |semver| switch (os.tag.versionRangeTag()) { + inline .hurd, .linux => |t| @field(os.version_range, @tagName(t)).range.max = semver, else => os.version_range.semver.max = semver, }, .windows => |win_ver| os.version_range.windows.max = win_ver, }; if (query.glibc_version) |glibc| { - os.version_range.linux.glibc = glibc; + switch (os.tag.versionRangeTag()) { + inline .hurd, .linux => |t| @field(os.version_range, @tagName(t)).glibc = glibc, + else => {}, + } } if (query.android_api_level) |android| { diff --git a/lib/std/zig/target.zig b/lib/std/zig/target.zig index c72b221936..b9116f557f 100644 --- a/lib/std/zig/target.zig +++ b/lib/std/zig/target.zig @@ -88,10 +88,10 @@ pub fn canBuildLibC(target: std.Target) bool { const ver = target.os.version_range.semver; return ver.min.order(libc.os_ver.?) != .lt; } - // Ensure glibc (aka *-linux-gnu) version is supported + // Ensure glibc (aka *-(linux,hurd)-gnu) version is supported if (target.isGnuLibC()) { const min_glibc_ver = libc.glibc_min orelse return true; - const target_glibc_ver = target.os.version_range.linux.glibc; + const target_glibc_ver = target.os.versionRange().gnuLibCVersion().?; return target_glibc_ver.order(min_glibc_ver) != .lt; } return true; diff --git a/src/Builtin.zig b/src/Builtin.zig index f3018d3023..a212ef4c36 100644 --- a/src/Builtin.zig +++ b/src/Builtin.zig @@ -142,6 +142,40 @@ pub fn append(opts: @This(), buffer: *std.ArrayList(u8)) Allocator.Error!void { linux.android, }), + .hurd => |hurd| try buffer.writer().print( + \\ .hurd = .{{ + \\ .range = .{{ + \\ .min = .{{ + \\ .major = {}, + \\ .minor = {}, + \\ .patch = {}, + \\ }}, + \\ .max = .{{ + \\ .major = {}, + \\ .minor = {}, + \\ .patch = {}, + \\ }}, + \\ }}, + \\ .glibc = .{{ + \\ .major = {}, + \\ .minor = {}, + \\ .patch = {}, + \\ }}, + \\ }}}}, + \\ + , .{ + hurd.range.min.major, + hurd.range.min.minor, + hurd.range.min.patch, + + hurd.range.max.major, + hurd.range.max.minor, + hurd.range.max.patch, + + hurd.glibc.major, + hurd.glibc.minor, + hurd.glibc.patch, + }), .windows => |windows| try buffer.writer().print( \\ .windows = .{{ \\ .min = {c}, diff --git a/src/Compilation.zig b/src/Compilation.zig index 3ad5c7932f..cc3807b1c9 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -5315,7 +5315,7 @@ pub fn addCCArgs( if (comp.config.link_libc) { if (target.isGnuLibC()) { - const target_version = target.os.version_range.linux.glibc; + const target_version = target.os.versionRange().gnuLibCVersion().?; const glibc_minor_define = try std.fmt.allocPrint(arena, "-D__GLIBC_MINOR__={d}", .{ target_version.minor, }); diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index fb20d4d622..e7d7c4923d 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -245,7 +245,7 @@ pub fn targetTriple(allocator: Allocator, target: std.Target) ![]const u8 { ver.min.minor, ver.min.patch, }), - .linux => |ver| try llvm_triple.writer().print("{d}.{d}.{d}", .{ + inline .linux, .hurd => |ver| try llvm_triple.writer().print("{d}.{d}.{d}", .{ ver.range.min.major, ver.range.min.minor, ver.range.min.patch, @@ -290,11 +290,15 @@ pub fn targetTriple(allocator: Allocator, target: std.Target) ![]const u8 { .semver, .windows, => {}, - .linux => |ver| if (target.abi.isGnu()) try llvm_triple.writer().print("{d}.{d}.{d}", .{ - ver.glibc.major, - ver.glibc.minor, - ver.glibc.patch, - }) else if (target.abi.isAndroid()) try llvm_triple.writer().print("{d}", .{ver.android}), + inline .hurd, .linux => |ver| if (target.abi.isGnu()) { + try llvm_triple.writer().print("{d}.{d}.{d}", .{ + ver.glibc.major, + ver.glibc.minor, + ver.glibc.patch, + }); + } else if (@TypeOf(ver) == std.Target.Os.LinuxVersionRange and target.abi.isAndroid()) { + try llvm_triple.writer().print("{d}", .{ver.android}); + }, } return llvm_triple.toOwnedSlice(); diff --git a/src/glibc.zig b/src/glibc.zig index f1ac544163..5bad947e5d 100644 --- a/src/glibc.zig +++ b/src/glibc.zig @@ -188,7 +188,7 @@ pub fn buildCrtFile(comp: *Compilation, crt_file: CrtFile, prog_node: std.Progre const arena = arena_allocator.allocator(); const target = comp.root_mod.resolved_target.result; - const target_ver = target.os.version_range.linux.glibc; + const target_ver = target.os.versionRange().gnuLibCVersion().?; const nonshared_stat = target_ver.order(.{ .major = 2, .minor = 32, .patch = 0 }) != .gt; const start_old_init_fini = target_ver.order(.{ .major = 2, .minor = 33, .patch = 0 }) != .gt; @@ -750,7 +750,7 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi const arena = arena_allocator.allocator(); const target = comp.getTarget(); - const target_version = target.os.version_range.linux.glibc; + const target_version = target.os.versionRange().gnuLibCVersion().?; // Use the global cache directory. var cache: Cache = .{ @@ -1218,7 +1218,7 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi } fn queueSharedObjects(comp: *Compilation, so_files: BuiltSharedObjects) void { - const target_version = comp.getTarget().os.version_range.linux.glibc; + const target_version = comp.getTarget().os.versionRange().gnuLibCVersion().?; assert(comp.glibc_so_files == null); comp.glibc_so_files = so_files; diff --git a/src/libcxx.zig b/src/libcxx.zig index ec89ac1cfc..39fd999112 100644 --- a/src/libcxx.zig +++ b/src/libcxx.zig @@ -262,7 +262,7 @@ pub fn buildLibCXX(comp: *Compilation, prog_node: std.Progress.Node) BuildError! if (target.isGnuLibC()) { // glibc 2.16 introduced aligned_alloc - if (target.os.version_range.linux.glibc.order(.{ .major = 2, .minor = 16, .patch = 0 }) == .lt) { + if (target.os.versionRange().gnuLibCVersion().?.order(.{ .major = 2, .minor = 16, .patch = 0 }) == .lt) { try cflags.append("-D_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION"); } } @@ -477,7 +477,7 @@ pub fn buildLibCXXABI(comp: *Compilation, prog_node: std.Progress.Node) BuildErr } try cflags.append("-D_LIBCXXABI_HAS_NO_THREADS"); } else if (target.abi.isGnu()) { - if (target.os.tag != .linux or !(target.os.version_range.linux.glibc.order(.{ .major = 2, .minor = 18, .patch = 0 }) == .lt)) + if (target.os.tag != .linux or !(target.os.versionRange().gnuLibCVersion().?.order(.{ .major = 2, .minor = 18, .patch = 0 }) == .lt)) try cflags.append("-DHAVE___CXA_THREAD_ATEXIT_IMPL"); } @@ -500,7 +500,7 @@ pub fn buildLibCXXABI(comp: *Compilation, prog_node: std.Progress.Node) BuildErr if (target.isGnuLibC()) { // glibc 2.16 introduced aligned_alloc - if (target.os.version_range.linux.glibc.order(.{ .major = 2, .minor = 16, .patch = 0 }) == .lt) { + if (target.os.versionRange().gnuLibCVersion().?.order(.{ .major = 2, .minor = 16, .patch = 0 }) == .lt) { try cflags.append("-D_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION"); } } diff --git a/src/link/Elf.zig b/src/link/Elf.zig index a068ac6cdc..608ff2fe3a 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -2013,7 +2013,7 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s } else if (target.isGnuLibC()) { for (glibc.libs) |lib| { if (lib.removed_in) |rem_in| { - if (target.os.version_range.linux.glibc.order(rem_in) != .lt) continue; + if (target.os.versionRange().gnuLibCVersion().?.order(rem_in) != .lt) continue; } const lib_path = try std.fmt.allocPrint(arena, "{}{c}lib{s}.so.{d}", .{ diff --git a/test/link/glibc_compat/build.zig b/test/link/glibc_compat/build.zig index 29df30151b..e9d7ee412e 100644 --- a/test/link/glibc_compat/build.zig +++ b/test/link/glibc_compat/build.zig @@ -5,10 +5,7 @@ const builtin = @import("builtin"); // run-time glibc version needs to be new enough. Check the host's glibc // version. Note that this does not allow for translation/vm/emulation // services to run these tests. -const running_glibc_ver: ?std.SemanticVersion = switch (builtin.os.tag) { - .linux => builtin.os.version_range.linux.glibc, - else => null, -}; +const running_glibc_ver = builtin.os.versionRange().gnuLibCVersion(); pub fn build(b: *std.Build) void { const test_step = b.step("test", "Test"); diff --git a/test/link/glibc_compat/glibc_runtime_check.zig b/test/link/glibc_compat/glibc_runtime_check.zig index 5a925d8583..14da8acc2c 100644 --- a/test/link/glibc_compat/glibc_runtime_check.zig +++ b/test/link/glibc_compat/glibc_runtime_check.zig @@ -21,7 +21,7 @@ const c_string = @cImport( ); // Version of glibc this test is being built to run against -const glibc_ver = builtin.target.os.version_range.linux.glibc; +const glibc_ver = builtin.os.versionRange().gnuLibCVersion().?; // PR #17034 - fstat moved between libc_nonshared and libc fn checkStat() !void { From ddcde20817b185d6aefa5d48a2f1dff282d01b00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 24 Nov 2024 21:37:54 +0100 Subject: [PATCH 02/13] std.Target: Fix Abi.default() for mips64/mips64el. This is necessary after: * 270fbbcd86b02fcd02ad9b818d9de39dfe671754 * 11915ae48e44cfd9d4e5c5823919fb24951e68f9 --- lib/std/Target.zig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/std/Target.zig b/lib/std/Target.zig index 8f2329d541..59e9f349f3 100644 --- a/lib/std/Target.zig +++ b/lib/std/Target.zig @@ -862,6 +862,9 @@ pub const Abi = enum { .mips, .mipsel, => .musleabi, + .mips64, + .mips64el, + => .muslabi64, else => .musl, }, .rtems => switch (arch) { From 1e0267a96b5bb1e0703f81778715346441e3c54f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 24 Nov 2024 20:44:48 +0100 Subject: [PATCH 03/13] std.os.linux.pie: Fix a relocation error for s390x. --- lib/std/os/linux/pie.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/std/os/linux/pie.zig b/lib/std/os/linux/pie.zig index 5099f39563..572f3ddf96 100644 --- a/lib/std/os/linux/pie.zig +++ b/lib/std/os/linux/pie.zig @@ -178,7 +178,7 @@ inline fn getDynamicSymbol() [*]elf.Dyn { \\ .hidden _DYNAMIC \\ larl %[ret], 1f \\ ag %[ret], 0(%[ret]) - \\ b 2f + \\ jg 2f \\ 1: .quad _DYNAMIC - . \\ 2: : [ret] "=r" (-> [*]elf.Dyn), From 9c7776a9389f2c752c9cc66b653844a7d935f719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 23 Nov 2024 15:45:15 +0100 Subject: [PATCH 04/13] test: Enable -Dtest-target-filter=... to work for test-c-abi. --- build.zig | 6 +++++- test/tests.zig | 21 +++++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/build.zig b/build.zig index ed84e037ae..f57080a5c9 100644 --- a/build.zig +++ b/build.zig @@ -541,7 +541,11 @@ pub fn build(b: *std.Build) !void { enable_ios_sdk, enable_symlinks_windows, )); - test_step.dependOn(tests.addCAbiTests(b, skip_non_native, skip_release)); + test_step.dependOn(tests.addCAbiTests(b, .{ + .test_target_filters = test_target_filters, + .skip_non_native = skip_non_native, + .skip_release = skip_release, + })); test_step.dependOn(tests.addLinkTests(b, enable_macos_sdk, enable_ios_sdk, enable_symlinks_windows)); test_step.dependOn(tests.addStackTraceTests(b, test_filters, optimization_modes)); test_step.dependOn(tests.addCliTests(b)); diff --git a/test/tests.zig b/test/tests.zig index d7b36f522b..666c5a115d 100644 --- a/test/tests.zig +++ b/test/tests.zig @@ -1486,19 +1486,32 @@ pub fn addModuleTests(b: *std.Build, options: ModuleTestOptions) *Step { return step; } -pub fn addCAbiTests(b: *std.Build, skip_non_native: bool, skip_release: bool) *Step { +const CAbiTestOptions = struct { + test_target_filters: []const []const u8, + skip_non_native: bool, + skip_release: bool, +}; + +pub fn addCAbiTests(b: *std.Build, options: CAbiTestOptions) *Step { const step = b.step("test-c-abi", "Run the C ABI tests"); const optimize_modes: [3]OptimizeMode = .{ .Debug, .ReleaseSafe, .ReleaseFast }; for (optimize_modes) |optimize_mode| { - if (optimize_mode != .Debug and skip_release) continue; + if (optimize_mode != .Debug and options.skip_release) continue; for (c_abi_targets) |c_abi_target| { - if (skip_non_native and !c_abi_target.target.isNative()) continue; + if (options.skip_non_native and !c_abi_target.target.isNative()) continue; const resolved_target = b.resolveTargetQuery(c_abi_target.target); const target = resolved_target.result; + const triple_txt = target.zigTriple(b.allocator) catch @panic("OOM"); + + if (options.test_target_filters.len > 0) { + for (options.test_target_filters) |filter| { + if (std.mem.indexOf(u8, triple_txt, filter) != null) break; + } else continue; + } if (target.os.tag == .windows and target.cpu.arch == .aarch64) { // https://github.com/ziglang/zig/issues/14908 @@ -1507,7 +1520,7 @@ pub fn addCAbiTests(b: *std.Build, skip_non_native: bool, skip_release: bool) *S const test_step = b.addTest(.{ .name = b.fmt("test-c-abi-{s}-{s}-{s}{s}{s}{s}", .{ - target.zigTriple(b.allocator) catch @panic("OOM"), + triple_txt, target.cpu.model.name, @tagName(optimize_mode), if (c_abi_target.use_llvm == true) From 2a29381117be7196378229d1c4e797f704675c61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 23 Nov 2024 18:00:00 +0100 Subject: [PATCH 05/13] test: Enable -Dtest-target-filter=... to work for test-cases and test-translate-c. --- build.zig | 2 +- test/src/Cases.zig | 14 ++++++++++++-- test/src/TranslateC.zig | 13 ++++++++++++- test/tests.zig | 16 ++++++++++------ 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/build.zig b/build.zig index f57080a5c9..a6285c85f1 100644 --- a/build.zig +++ b/build.zig @@ -442,7 +442,7 @@ pub fn build(b: *std.Build) !void { test_step.dependOn(check_fmt); const test_cases_step = b.step("test-cases", "Run the main compiler test cases"); - try tests.addCases(b, test_cases_step, test_filters, target, .{ + try tests.addCases(b, test_cases_step, test_filters, test_target_filters, target, .{ .skip_translate_c = skip_translate_c, .skip_run_translated_c = skip_run_translated_c, }, .{ diff --git a/test/src/Cases.zig b/test/src/Cases.zig index 9314b5677b..bc5e2c25bc 100644 --- a/test/src/Cases.zig +++ b/test/src/Cases.zig @@ -539,13 +539,14 @@ pub fn lowerToTranslateCSteps( b: *std.Build, parent_step: *std.Build.Step, test_filters: []const []const u8, + test_target_filters: []const []const u8, target: std.Build.ResolvedTarget, translate_c_options: TranslateCOptions, ) void { const tests = @import("../tests.zig"); const test_translate_c_step = b.step("test-translate-c", "Run the C translation tests"); if (!translate_c_options.skip_translate_c) { - tests.addTranslateCTests(b, test_translate_c_step, test_filters); + tests.addTranslateCTests(b, test_translate_c_step, test_filters, test_target_filters); parent_step.dependOn(test_translate_c_step); } @@ -620,6 +621,7 @@ pub fn lowerToBuildSteps( b: *std.Build, parent_step: *std.Build.Step, test_filters: []const []const u8, + test_target_filters: []const []const u8, ) void { const host = std.zig.system.resolveTargetQuery(.{}) catch |err| std.debug.panic("unable to detect native host: {s}\n", .{@errorName(err)}); @@ -648,6 +650,14 @@ pub fn lowerToBuildSteps( if (std.mem.indexOf(u8, case.name, test_filter)) |_| break; } else if (test_filters.len > 0) continue; + const triple_txt = case.target.result.zigTriple(b.allocator) catch @panic("OOM"); + + if (test_target_filters.len > 0) { + for (test_target_filters) |filter| { + if (std.mem.indexOf(u8, triple_txt, filter) != null) break; + } else continue; + } + const writefiles = b.addWriteFiles(); var file_sources = std.StringHashMap(std.Build.LazyPath).init(b.allocator); defer file_sources.deinit(); @@ -740,7 +750,7 @@ pub fn lowerToBuildSteps( "--", "-lc", "-target", - case.target.result.zigTriple(b.allocator) catch @panic("OOM"), + triple_txt, }); run_c.addArtifactArg(artifact); break :run_step run_c; diff --git a/test/src/TranslateC.zig b/test/src/TranslateC.zig index c4cadcef5b..18d5e1ce50 100644 --- a/test/src/TranslateC.zig +++ b/test/src/TranslateC.zig @@ -2,6 +2,7 @@ b: *std.Build, step: *std.Build.Step, test_index: usize, test_filters: []const []const u8, +test_target_filters: []const []const u8, const TestCase = struct { name: []const u8, @@ -92,6 +93,16 @@ pub fn addCase(self: *TranslateCContext, case: *const TestCase) void { if (mem.indexOf(u8, annotated_case_name, test_filter)) |_| break; } else if (self.test_filters.len > 0) return; + const target = b.resolveTargetQuery(case.target); + + if (self.test_target_filters.len > 0) { + const triple_txt = target.result.zigTriple(b.allocator) catch @panic("OOM"); + + for (self.test_target_filters) |filter| { + if (std.mem.indexOf(u8, triple_txt, filter) != null) break; + } else return; + } + const write_src = b.addWriteFiles(); const first_src = case.sources.items[0]; const root_source_file = write_src.add(first_src.filename, first_src.source); @@ -101,7 +112,7 @@ pub fn addCase(self: *TranslateCContext, case: *const TestCase) void { const translate_c = b.addTranslateC(.{ .root_source_file = root_source_file, - .target = b.resolveTargetQuery(case.target), + .target = target, .optimize = .Debug, }); diff --git a/test/tests.zig b/test/tests.zig index 666c5a115d..ac23bac754 100644 --- a/test/tests.zig +++ b/test/tests.zig @@ -1237,18 +1237,22 @@ pub fn addAssembleAndLinkTests(b: *std.Build, test_filters: []const []const u8, return cases.step; } -pub fn addTranslateCTests(b: *std.Build, parent_step: *std.Build.Step, test_filters: []const []const u8) void { +pub fn addTranslateCTests( + b: *std.Build, + parent_step: *std.Build.Step, + test_filters: []const []const u8, + test_target_filters: []const []const u8, +) void { const cases = b.allocator.create(TranslateCContext) catch @panic("OOM"); cases.* = TranslateCContext{ .b = b, .step = parent_step, .test_index = 0, .test_filters = test_filters, + .test_target_filters = test_target_filters, }; translate_c.addCases(cases); - - return; } pub fn addRunTranslatedCTests( @@ -1267,8 +1271,6 @@ pub fn addRunTranslatedCTests( }; run_translated_c.addCases(cases); - - return; } const ModuleTestOptions = struct { @@ -1565,6 +1567,7 @@ pub fn addCases( b: *std.Build, parent_step: *Step, test_filters: []const []const u8, + test_target_filters: []const []const u8, target: std.Build.ResolvedTarget, translate_c_options: @import("src/Cases.zig").TranslateCOptions, build_options: @import("cases.zig").BuildOptions, @@ -1580,12 +1583,13 @@ pub fn addCases( cases.addFromDir(dir, b); try @import("cases.zig").addCases(&cases, build_options, b); - cases.lowerToTranslateCSteps(b, parent_step, test_filters, target, translate_c_options); + cases.lowerToTranslateCSteps(b, parent_step, test_filters, test_target_filters, target, translate_c_options); cases.lowerToBuildSteps( b, parent_step, test_filters, + test_target_filters, ); } From 9d10246a809752be6952ba3d9021e8cbfc1931a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 23 Nov 2024 18:06:27 +0100 Subject: [PATCH 06/13] test: Enable -Dtest-target-filter=... to work for test-debugger. --- build.zig | 1 + test/src/Debugger.zig | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/build.zig b/build.zig index a6285c85f1..c0ebf5407e 100644 --- a/build.zig +++ b/build.zig @@ -552,6 +552,7 @@ pub fn build(b: *std.Build) !void { test_step.dependOn(tests.addAssembleAndLinkTests(b, test_filters, optimization_modes)); if (tests.addDebuggerTests(b, .{ .test_filters = test_filters, + .test_target_filters = test_target_filters, .gdb = b.option([]const u8, "gdb", "path to gdb binary"), .lldb = b.option([]const u8, "lldb", "path to lldb binary"), .optimize_modes = optimization_modes, diff --git a/test/src/Debugger.zig b/test/src/Debugger.zig index b4b453700d..1c8e861a3e 100644 --- a/test/src/Debugger.zig +++ b/test/src/Debugger.zig @@ -4,6 +4,7 @@ root_step: *std.Build.Step, pub const Options = struct { test_filters: []const []const u8, + test_target_filters: []const []const u8, gdb: ?[]const u8, lldb: ?[]const u8, optimize_modes: []const std.builtin.OptimizeMode, @@ -1988,6 +1989,12 @@ fn addTest( for (db.options.test_filters) |test_filter| { if (std.mem.indexOf(u8, name, test_filter)) |_| return; } + if (db.options.test_target_filters.len > 0) { + const triple_txt = target.resolved.result.zigTriple(db.b.allocator) catch @panic("OOM"); + for (db.options.test_target_filters) |filter| { + if (std.mem.indexOf(u8, triple_txt, filter) != null) break; + } else return; + } const files_wf = db.b.addWriteFiles(); const exe = db.b.addExecutable(.{ .name = name, From fefcdc56735744efaa53d26adc44b2c4ab1c8abb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 24 Nov 2024 20:43:11 +0100 Subject: [PATCH 07/13] test: Allow setting PIC/PIE in test cases. --- test/src/Cases.zig | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/test/src/Cases.zig b/test/src/Cases.zig index bc5e2c25bc..e6d1f966c0 100644 --- a/test/src/Cases.zig +++ b/test/src/Cases.zig @@ -88,6 +88,8 @@ pub const Case = struct { expect_exact: bool = false, backend: Backend = .stage2, link_libc: bool = false, + pic: ?bool = null, + pie: ?bool = null, deps: std.ArrayList(DepModule), @@ -425,6 +427,8 @@ fn addFromDirInner( const is_test = try manifest.getConfigForKeyAssertSingle("is_test", bool); const link_libc = try manifest.getConfigForKeyAssertSingle("link_libc", bool); const output_mode = try manifest.getConfigForKeyAssertSingle("output_mode", std.builtin.OutputMode); + const pic = try manifest.getConfigForKeyAssertSingle("pic", ?bool); + const pie = try manifest.getConfigForKeyAssertSingle("pie", ?bool); if (manifest.type == .translate_c) { for (c_frontends) |c_frontend| { @@ -488,6 +492,8 @@ fn addFromDirInner( .is_test = is_test, .output_mode = output_mode, .link_libc = link_libc, + .pic = pic, + .pie = pie, .deps = std.ArrayList(DepModule).init(ctx.cases.allocator), }); try cases.append(next); @@ -695,6 +701,8 @@ pub fn lowerToBuildSteps( }; if (case.link_libc) artifact.linkLibC(); + if (case.pic) |pic| artifact.root_module.pic = pic; + if (case.pie) |pie| artifact.pie = pie; switch (case.backend) { .stage1 => continue, @@ -958,6 +966,10 @@ const TestManifestConfigDefaults = struct { return "false"; } else if (std.mem.eql(u8, key, "c_frontend")) { return "clang"; + } else if (std.mem.eql(u8, key, "pic")) { + return "null"; + } else if (std.mem.eql(u8, key, "pie")) { + return "null"; } else unreachable; } }; @@ -991,6 +1003,8 @@ const TestManifest = struct { .{ "c_frontend", {} }, .{ "link_libc", {} }, .{ "backend", {} }, + .{ "pic", {} }, + .{ "pie", {} }, }); const Type = enum { @@ -1219,7 +1233,12 @@ const TestManifest = struct { }; } }.parse, - .@"struct" => @compileError("no default parser for " ++ @typeName(T)), + .optional => |o| return struct { + fn parse(str: []const u8) anyerror!T { + if (std.mem.eql(u8, str, "null")) return null; + return try getDefaultParser(o.child)(str); + } + }.parse, else => @compileError("no default parser for " ++ @typeName(T)), } } From ad2be71514adb5f46176c80d6376e74df5f93c93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 24 Nov 2024 20:45:02 +0100 Subject: [PATCH 08/13] test: Add test cases for PIC/PIE on various supported platforms. Closes #22052. --- test/cases/pic_freestanding.zig | 14 ++++++++++++++ test/cases/pic_linux.zig | 14 ++++++++++++++ test/cases/pie_freestanding.zig | 16 ++++++++++++++++ test/cases/pie_linux.zig | 10 ++++++++++ 4 files changed, 54 insertions(+) create mode 100644 test/cases/pic_freestanding.zig create mode 100644 test/cases/pic_linux.zig create mode 100644 test/cases/pie_freestanding.zig create mode 100644 test/cases/pie_linux.zig diff --git a/test/cases/pic_freestanding.zig b/test/cases/pic_freestanding.zig new file mode 100644 index 0000000000..86e37662e2 --- /dev/null +++ b/test/cases/pic_freestanding.zig @@ -0,0 +1,14 @@ +const builtin = @import("builtin"); +const std = @import("std"); + +fn _start() callconv(.naked) void {} + +comptime { + @export(&_start, .{ .name = if (builtin.cpu.arch.isMIPS()) "__start" else "_start" }); +} + +// compile +// backend=stage2,llvm +// target=arm-freestanding,armeb-freestanding,thumb-freestanding,thumbeb-freestanding,aarch64-freestanding,aarch64_be-freestanding,loongarch64-freestanding,mips-freestanding,mipsel-freestanding,mips64-freestanding,mips64el-freestanding,powerpc-freestanding,powerpcle-freestanding,powerpc64-freestanding,powerpc64le-freestanding,riscv32-freestanding,riscv64-freestanding,s390x-freestanding,x86-freestanding,x86_64-freestanding +// pic=true +// output_mode=Exe diff --git a/test/cases/pic_linux.zig b/test/cases/pic_linux.zig new file mode 100644 index 0000000000..a699db95a3 --- /dev/null +++ b/test/cases/pic_linux.zig @@ -0,0 +1,14 @@ +const std = @import("std"); + +// Eventually, this test should be made to work without libc by providing our +// own `__tls_get_addr` implementation. powerpcle-linux should be added to the +// target list here when that happens. +// +// https://github.com/ziglang/zig/issues/20625 +pub fn main() void {} + +// run +// backend=stage2,llvm +// target=arm-linux,armeb-linux,thumb-linux,thumbeb-linux,aarch64-linux,aarch64_be-linux,loongarch64-linux,mips-linux,mipsel-linux,mips64-linux,mips64el-linux,powerpc-linux,powerpc64-linux,powerpc64le-linux,riscv32-linux,riscv64-linux,s390x-linux,x86-linux,x86_64-linux +// pic=true +// link_libc=true diff --git a/test/cases/pie_freestanding.zig b/test/cases/pie_freestanding.zig new file mode 100644 index 0000000000..9a86ddbc42 --- /dev/null +++ b/test/cases/pie_freestanding.zig @@ -0,0 +1,16 @@ +const builtin = @import("builtin"); +const std = @import("std"); + +// The self-hosted backends currently output a bunch of bad relocations for PIE, +// so this test is LLVM only for now. +fn _start() callconv(.naked) void {} + +comptime { + @export(&_start, .{ .name = if (builtin.cpu.arch.isMIPS()) "__start" else "_start" }); +} + +// compile +// backend=llvm +// target=arm-freestanding,armeb-freestanding,thumb-freestanding,thumbeb-freestanding,aarch64-freestanding,aarch64_be-freestanding,loongarch64-freestanding,mips-freestanding,mipsel-freestanding,mips64-freestanding,mips64el-freestanding,powerpc-freestanding,powerpcle-freestanding,powerpc64-freestanding,powerpc64le-freestanding,riscv32-freestanding,riscv64-freestanding,s390x-freestanding,x86-freestanding,x86_64-freestanding +// pie=true +// output_mode=Exe diff --git a/test/cases/pie_linux.zig b/test/cases/pie_linux.zig new file mode 100644 index 0000000000..293a172e9c --- /dev/null +++ b/test/cases/pie_linux.zig @@ -0,0 +1,10 @@ +const std = @import("std"); + +// The self-hosted backends can't handle `.hidden _DYNAMIC` and `.weak _DYNAMIC` +// directives in inline assembly yet, so this test is LLVM only for now. +pub fn main() void {} + +// run +// backend=llvm +// target=arm-linux,armeb-linux,thumb-linux,thumbeb-linux,aarch64-linux,aarch64_be-linux,loongarch64-linux,mips-linux,mipsel-linux,mips64-linux,mips64el-linux,powerpc-linux,powerpcle-linux,powerpc64-linux,powerpc64le-linux,riscv32-linux,riscv64-linux,s390x-linux,x86-linux,x86_64-linux +// pie=true From c4cd3c0541d605141b80c5b65f4a5d09c02c0f96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 24 Nov 2024 21:47:13 +0100 Subject: [PATCH 09/13] test: Force compile test cases to be codegen'd if requested. --- test/src/Cases.zig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/src/Cases.zig b/test/src/Cases.zig index e6d1f966c0..78f538fb16 100644 --- a/test/src/Cases.zig +++ b/test/src/Cases.zig @@ -723,6 +723,10 @@ pub fn lowerToBuildSteps( switch (update.case) { .Compile => { + // Force the binary to be emitted if requested. + if (case.emit_bin) { + _ = artifact.getEmittedBin(); + } parent_step.dependOn(&artifact.step); }, .CompareObjectFile => |expected_output| { From 2298108dafbdc54ad85a12f3e0c3f5a0a608be05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 24 Nov 2024 22:03:34 +0100 Subject: [PATCH 10/13] test: Allow tests to set emit_bin=false. --- test/src/Cases.zig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/src/Cases.zig b/test/src/Cases.zig index 78f538fb16..2a601637e6 100644 --- a/test/src/Cases.zig +++ b/test/src/Cases.zig @@ -429,6 +429,7 @@ fn addFromDirInner( const output_mode = try manifest.getConfigForKeyAssertSingle("output_mode", std.builtin.OutputMode); const pic = try manifest.getConfigForKeyAssertSingle("pic", ?bool); const pie = try manifest.getConfigForKeyAssertSingle("pie", ?bool); + const emit_bin = try manifest.getConfigForKeyAssertSingle("emit_bin", bool); if (manifest.type == .translate_c) { for (c_frontends) |c_frontend| { @@ -489,6 +490,7 @@ fn addFromDirInner( .target = resolved_target, .backend = backend, .updates = std.ArrayList(Cases.Update).init(ctx.cases.allocator), + .emit_bin = emit_bin, .is_test = is_test, .output_mode = output_mode, .link_libc = link_libc, @@ -964,6 +966,8 @@ const TestManifestConfigDefaults = struct { .run_translated_c => "Obj", .cli => @panic("TODO test harness for CLI tests"), }; + } else if (std.mem.eql(u8, key, "emit_bin")) { + return "true"; } else if (std.mem.eql(u8, key, "is_test")) { return "false"; } else if (std.mem.eql(u8, key, "link_libc")) { @@ -1001,6 +1005,7 @@ const TestManifest = struct { trailing_bytes: []const u8 = "", const valid_keys = std.StaticStringMap(void).initComptime(.{ + .{ "emit_bin", {} }, .{ "is_test", {} }, .{ "output_mode", {} }, .{ "target", {} }, From 4b16d81318fb9804a3f9703dda4673339777e924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 24 Nov 2024 22:04:17 +0100 Subject: [PATCH 11/13] test: Set emit_bin=false for all nvptx tests. error: thread 165232 panic: TODO: rewrite the NvPtx.flushModule function /home/alexrp/Source/ziglang/zig/src/link/NvPtx.zig:123:5: 0x1ed99ce in flushModule (zig) @panic("TODO: rewrite the NvPtx.flushModule function"); ^ /home/alexrp/Source/ziglang/zig/src/link/NvPtx.zig:110:28: 0x1c2e7e6 in flush (zig) return self.flushModule(arena, tid, prog_node); ^ /home/alexrp/Source/ziglang/zig/src/link.zig:874:77: 0x1a55bd3 in flush (zig) return @as(*tag.Type(), @fieldParentPtr("base", base)).flush(arena, tid, prog_node); ^ /home/alexrp/Source/ziglang/zig/src/Compilation.zig:2411:17: 0x1a553f9 in flush (zig) lf.flush(arena, tid, prog_node) catch |err| switch (err) { ^ /home/alexrp/Source/ziglang/zig/src/Compilation.zig:2348:22: 0x1a595ba in update (zig) try flush(comp, arena, .{ ^ /home/alexrp/Source/ziglang/zig/src/main.zig:4114:32: 0x1ae392b in serve (zig) try comp.update(main_progress_node); ^ /home/alexrp/Source/ziglang/zig/src/main.zig:3555:22: 0x1b05322 in buildOutputType (zig) try serve( ^ /home/alexrp/Source/ziglang/zig/src/main.zig:265:31: 0x195faca in mainArgs (zig) return buildOutputType(gpa, arena, args, .{ .build = .Obj }); ^ /home/alexrp/Source/ziglang/zig/src/main.zig:200:20: 0x195c995 in main (zig) return mainArgs(gpa, arena, args); ^ /home/alexrp/Source/ziglang/zig/lib/std/start.zig:617:37: 0x195c49e in main (zig) const result = root.main() catch |err| { ^ --- test/nvptx.zig | 1 + 1 file changed, 1 insertion(+) diff --git a/test/nvptx.zig b/test/nvptx.zig index fd4c66db89..dd68e8a7de 100644 --- a/test/nvptx.zig +++ b/test/nvptx.zig @@ -95,6 +95,7 @@ fn addPtx(ctx: *Cases, target: std.Build.ResolvedTarget, name: []const u8) *Case .output_mode = .Obj, .deps = std.ArrayList(Cases.DepModule).init(ctx.cases.allocator), .link_libc = false, + .emit_bin = false, .backend = .llvm, // Bug in Debug mode .optimize_mode = .ReleaseSafe, From 1d1ca8485454a4b14f20376aff532bfe7c959155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 24 Nov 2024 22:04:49 +0100 Subject: [PATCH 12/13] test: Set emit_bin=false for spirv_mergable_pointers.zig. /home/alexrp/.cache/zig/b/18236e302af25e3fb99bc6a232ddc447/builtin.zig:6:5: error: TODO (SPIR-V): Implement unsigned composite int type of 64 bits pub const zig_backend = std.builtin.CompilerBackend.stage2_spirv64; ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --- test/cases/spirv_mergable_pointers.zig | 1 + 1 file changed, 1 insertion(+) diff --git a/test/cases/spirv_mergable_pointers.zig b/test/cases/spirv_mergable_pointers.zig index 240c485f9d..b45484a516 100644 --- a/test/cases/spirv_mergable_pointers.zig +++ b/test/cases/spirv_mergable_pointers.zig @@ -14,3 +14,4 @@ export fn a() void { // output_mode=Obj // backend=stage2 // target=spirv64-vulkan +// emit_bin=false From 5beb5f20d282fd0db8715899ba6a5d6630d91bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 24 Nov 2024 22:05:06 +0100 Subject: [PATCH 13/13] test: Set emit_bin=false for some safety tests. This should hopefully be reverted soon with Andrew's work on the self-hosted wasm linker. error: thread 171731 panic: integer overflow /home/alexrp/Source/ziglang/zig/src/link/Wasm.zig:2392:32: 0x22b709e in setupMemory (zig) break :index sym.index - wasm.imported_globals_count; ^ /home/alexrp/Source/ziglang/zig/src/link/Wasm.zig:2678:25: 0x1ed1be6 in flushModule (zig) try wasm.setupMemory(); ^ /home/alexrp/Source/ziglang/zig/src/link/Wasm.zig:2619:28: 0x1c2e4d4 in flush (zig) return wasm.flushModule(arena, tid, prog_node); ^ /home/alexrp/Source/ziglang/zig/src/link.zig:874:77: 0x1a55ad7 in flush (zig) return @as(*tag.Type(), @fieldParentPtr("base", base)).flush(arena, tid, prog_node); ^ /home/alexrp/Source/ziglang/zig/src/Compilation.zig:2411:17: 0x1a553f9 in flush (zig) lf.flush(arena, tid, prog_node) catch |err| switch (err) { ^ /home/alexrp/Source/ziglang/zig/src/Compilation.zig:2371:22: 0x1a58d60 in update (zig) try flush(comp, arena, .{ ^ /home/alexrp/Source/ziglang/zig/src/main.zig:4114:32: 0x1ae392b in serve (zig) try comp.update(main_progress_node); ^ /home/alexrp/Source/ziglang/zig/src/main.zig:3555:22: 0x1b05322 in buildOutputType (zig) try serve( ^ /home/alexrp/Source/ziglang/zig/src/main.zig:265:31: 0x195faca in mainArgs (zig) return buildOutputType(gpa, arena, args, .{ .build = .Obj }); ^ /home/alexrp/Source/ziglang/zig/src/main.zig:200:20: 0x195c995 in main (zig) return mainArgs(gpa, arena, args); ^ /home/alexrp/Source/ziglang/zig/lib/std/start.zig:617:37: 0x195c49e in main (zig) const result = root.main() catch |err| { ^ --- test/cases/inherit_want_safety.zig | 1 + test/cases/no_compile_panic_for_unchecked_arith.zig | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/test/cases/inherit_want_safety.zig b/test/cases/inherit_want_safety.zig index c9cd399df9..b7f1a92b27 100644 --- a/test/cases/inherit_want_safety.zig +++ b/test/cases/inherit_want_safety.zig @@ -35,3 +35,4 @@ pub export fn entry() usize { // compile // output_mode=Obj +// emit_bin=false diff --git a/test/cases/no_compile_panic_for_unchecked_arith.zig b/test/cases/no_compile_panic_for_unchecked_arith.zig index a9aa8272b1..f94e5b1869 100644 --- a/test/cases/no_compile_panic_for_unchecked_arith.zig +++ b/test/cases/no_compile_panic_for_unchecked_arith.zig @@ -13,4 +13,4 @@ export fn entry() usize { // compile // output_mode=Obj -// backend=stage2,llvm +// emit_bin=false