From d0c6ed189b334fa4ad60485724d59ad9a78b0046 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 26 May 2026 15:53:05 -0700 Subject: [PATCH] Maker: fix Target deserialization more disciplined Target / Query separation even though they're both serialized in the same struct --- lib/compiler/Maker/Step/Compile.zig | 4 +- lib/compiler/Maker/Step/Run.zig | 3 +- lib/compiler/Maker/Step/TranslateC.zig | 9 +-- lib/std/Build/Configuration.zig | 90 ++++++++++++++++++++------ 4 files changed, 76 insertions(+), 30 deletions(-) diff --git a/lib/compiler/Maker/Step/Compile.zig b/lib/compiler/Maker/Step/Compile.zig index 67006980770166273380ae96f8d592051aab8497..99b9374ef98678462ba6441cccb0481ccd8d8b32 100644 --- a/lib/compiler/Maker/Step/Compile.zig +++ b/lib/compiler/Maker/Step/Compile.zig @@ -1291,11 +1291,9 @@ fn appendModuleFlags( if (m.resolved_target.get(conf)) |resolved_target| { // Communicate the query via CLI since it's more compact. - if (resolved_target.query.get(conf)) |compact_query| { + if (resolved_target.unwrapQuery(conf)) |query| { try zig_args.ensureUnusedCapacity(gpa, 6); - const query = compact_query.unwrap(conf); - zig_args.appendAssumeCapacity("-target"); zig_args.appendAssumeCapacity(try query.zigTriple(arena)); diff --git a/lib/compiler/Maker/Step/Run.zig b/lib/compiler/Maker/Step/Run.zig index 1fb85a908c632e16121c3c574dd212ec79cc3b77..5bda5b4463ddc0fbe8d35fe6af3f542d9df8ada7 100644 --- a/lib/compiler/Maker/Step/Run.zig +++ b/lib/compiler/Maker/Step/Run.zig @@ -1823,8 +1823,7 @@ fn runCommand( } const root_module = producer.root_module.get(conf); const root_module_target = root_module.resolved_target.get(conf).?.result.get(conf); - const other_target_query = root_module_target.unwrap(conf); - const root_target = std.zig.system.resolveTargetQuery(io, other_target_query) catch unreachable; + const root_target = root_module_target.unwrapTarget(conf); const link_libc = maker.stepByIndex(producer_index).extended.compile.is_linking_libc; const host: std.Target = std.zig.system.resolveTargetQuery(io, .{}) catch |he| switch (he) { diff --git a/lib/compiler/Maker/Step/TranslateC.zig b/lib/compiler/Maker/Step/TranslateC.zig index f0355d8bcc913c4694bc547fdef8bd2de46ceeb5..4d7df09fe6e0090c24da0c005ec4669c51768510 100644 --- a/lib/compiler/Maker/Step/TranslateC.zig +++ b/lib/compiler/Maker/Step/TranslateC.zig @@ -40,10 +40,11 @@ pub fn make( argv.appendAssumeCapacity("--global-cache-dir"); argv.appendAssumeCapacity(graph.global_cache_root.path orelse "."); - if (conf_tc.target.get(conf).?.query.unwrap()) |compact_query| { - const query = compact_query.get(conf).unwrap(conf); - argv.appendAssumeCapacity("-target"); - argv.appendAssumeCapacity(try query.zigTriple(arena)); + if (conf_tc.target.get(conf)) |resolved_target| { + if (resolved_target.unwrapQuery(conf)) |query| { + argv.appendAssumeCapacity("-target"); + argv.appendAssumeCapacity(try query.zigTriple(arena)); + } } switch (conf_tc.flags.optimize) { diff --git a/lib/std/Build/Configuration.zig b/lib/std/Build/Configuration.zig index 5f4887cbe08547f60ac8271b557567a88900298f..eda3a73e5e82f3d1b7b466927dc1f0cdca49c2f5 100644 --- a/lib/std/Build/Configuration.zig +++ b/lib/std/Build/Configuration.zig @@ -2144,6 +2144,33 @@ pub const ResolvedTarget = struct { return (unwrap(this) orelse return null).get(c); } }; + + pub fn unwrapQuery(rt: *const ResolvedTarget, c: *const Configuration) ?std.Target.Query { + const tq = rt.query.get(c) orelse return null; + const cpu_arch = tq.flags.cpu_arch.unwrap() orelse rt.result.get(c).flags.cpu_arch.unwrap().?; + return .{ + .cpu_arch = cpu_arch, + .cpu_model = switch (tq.flags.cpu_model) { + .native => .native, + .baseline => .baseline, + .determined_by_arch_os => .determined_by_arch_os, + .explicit => .{ .explicit = cpu_arch.parseCpuModel(tq.cpu_name.value.?.slice(c)).? }, + }, + .cpu_features_add = tq.cpu_features_add.value orelse .empty, + .cpu_features_sub = tq.cpu_features_sub.value orelse .empty, + .os_tag = tq.flags.os_tag.unwrap(), + .os_version_min = tq.os_version_min.u.unwrap(c), + .os_version_max = tq.os_version_max.u.unwrap(c), + .glibc_version = if (tq.glibc_version.value) |s| + std.SemanticVersion.parse(s.slice(c)) catch unreachable + else + null, + .android_api_level = tq.android_api_level.value, + .abi = tq.flags.abi.unwrap(), + .dynamic_linker = if (tq.dynamic_linker.value) |s| .init(s.slice(c)) else null, + .ofmt = tq.flags.object_format.unwrap(), + }; + } }; pub const TargetQuery = struct { @@ -2731,29 +2758,50 @@ pub const TargetQuery = struct { dynamic_linker: bool, }; - pub fn unwrap(tq: *const TargetQuery, c: *const Configuration) std.Target.Query { - const cpu_arch = tq.flags.cpu_arch.unwrap(); + pub fn unwrapTarget(tq: *const TargetQuery, c: *const Configuration) std.Target { + const cpu_arch = tq.flags.cpu_arch.unwrap().?; + const os_tag = tq.flags.os_tag.unwrap().?; return .{ - .cpu_arch = cpu_arch, - .cpu_model = switch (tq.flags.cpu_model) { - .native => .native, - .baseline => .baseline, - .determined_by_arch_os => .determined_by_arch_os, - .explicit => .{ .explicit = cpu_arch.?.parseCpuModel(tq.cpu_name.value.?.slice(c)).? }, + .cpu = .{ + .arch = cpu_arch, + .model = cpu_arch.parseCpuModel(tq.cpu_name.value.?.slice(c)).?, + .features = tq.cpu_features_add.value.?, }, - .cpu_features_add = tq.cpu_features_add.value orelse .empty, - .cpu_features_sub = tq.cpu_features_sub.value orelse .empty, - .os_tag = tq.flags.os_tag.unwrap(), - .os_version_min = tq.os_version_min.u.unwrap(c), - .os_version_max = tq.os_version_max.u.unwrap(c), - .glibc_version = if (tq.glibc_version.value) |s| - std.SemanticVersion.parse(s.slice(c)) catch unreachable - else - null, - .android_api_level = tq.android_api_level.value, - .abi = tq.flags.abi.unwrap(), - .dynamic_linker = if (tq.dynamic_linker.value) |s| .init(s.slice(c)) else null, - .ofmt = tq.flags.object_format.unwrap(), + .os = .{ + .tag = os_tag, + .version_range = switch (os_tag) { + .linux => .{ .linux = .{ + .range = .{ + .min = tq.os_version_min.u.unwrap(c).?.semver, + .max = tq.os_version_max.u.unwrap(c).?.semver, + }, + .glibc = std.SemanticVersion.parse(tq.glibc_version.value.?.slice(c)) catch unreachable, + .android = tq.android_api_level.value.?, + } }, + .hurd => .{ .hurd = .{ + .range = .{ + .min = tq.os_version_min.u.unwrap(c).?.semver, + .max = tq.os_version_max.u.unwrap(c).?.semver, + }, + .glibc = std.SemanticVersion.parse(tq.glibc_version.value.?.slice(c)) catch unreachable, + } }, + .windows => .{ .windows = .{ + .min = tq.os_version_min.u.unwrap(c).?.windows, + .max = tq.os_version_max.u.unwrap(c).?.windows, + } }, + else => switch (tq.os_version_min.u.unwrap(c).?) { + .none => .{ .none = {} }, + .semver => |min| .{ .semver = .{ + .min = min, + .max = tq.os_version_max.u.unwrap(c).?.semver, + } }, + .windows => unreachable, + }, + }, + }, + .abi = tq.flags.abi.unwrap().?, + .ofmt = tq.flags.object_format.unwrap().?, + .dynamic_linker = .init(if (tq.dynamic_linker.value) |s| s.slice(c) else null), }; } }; -- 2.54.0