From 55f2a6684ed8beb229143de75f3d1120c913b955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl=20=C3=85stholm?= Date: Tue, 9 Jan 2024 17:32:16 +0100 Subject: [PATCH] update_cpu_features: Support omitting deps --- tools/update_cpu_features.zig | 65 ++++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/tools/update_cpu_features.zig b/tools/update_cpu_features.zig index d840c4fb4..51d09d2dd 100644 --- a/tools/update_cpu_features.zig +++ b/tools/update_cpu_features.zig @@ -16,6 +16,7 @@ const FeatureOverride = struct { flatten: bool = false, zig_name: ?[]const u8 = null, desc: ?[]const u8 = null, + omit_deps: []const []const u8 = &.{}, extra_deps: []const []const u8 = &.{}, }; @@ -1114,18 +1115,8 @@ fn processOneTarget(job: Job) anyerror!void { var deps = std.ArrayList([]const u8).init(arena); var omit = false; var flatten = false; - const implies = kv.value_ptr.object.get("Implies").?.array; - for (implies.items) |imply| { - const other_key = imply.object.get("def").?.string; - const other_obj = &root_map.getPtr(other_key).?.object; - const other_llvm_name = other_obj.get("Name").?.string; - const other_zig_name = (try llvmNameToZigNameOmit( - arena, - llvm_target, - other_llvm_name, - )) orelse continue; - try deps.append(other_zig_name); - } + var omit_deps: []const []const u8 = &.{}; + var extra_deps: []const []const u8 = &.{}; for (llvm_target.feature_overrides) |feature_override| { if (mem.eql(u8, llvm_name, feature_override.llvm_name)) { if (feature_override.omit) { @@ -1142,12 +1133,30 @@ fn processOneTarget(job: Job) anyerror!void { if (feature_override.desc) |override_desc| { desc = override_desc; } - for (feature_override.extra_deps) |extra_dep| { - try deps.append(extra_dep); - } + omit_deps = feature_override.omit_deps; + extra_deps = feature_override.extra_deps; break; } } + const implies = kv.value_ptr.object.get("Implies").?.array; + for (implies.items) |imply| { + const other_key = imply.object.get("def").?.string; + const other_obj = &root_map.getPtr(other_key).?.object; + const other_llvm_name = other_obj.get("Name").?.string; + const other_zig_name = (try llvmNameToZigNameOmit( + arena, + llvm_target, + other_llvm_name, + )) orelse continue; + for (omit_deps) |omit_dep| { + if (mem.eql(u8, other_zig_name, omit_dep)) break; + } else { + try deps.append(other_zig_name); + } + } + for (extra_deps) |extra_dep| { + try deps.append(extra_dep); + } const feature: Feature = .{ .llvm_name = llvm_name, .zig_name = zig_name, @@ -1170,6 +1179,21 @@ fn processOneTarget(job: Job) anyerror!void { var zig_name = try llvmNameToZigName(arena, llvm_name); var deps = std.ArrayList([]const u8).init(arena); + var omit_deps: []const []const u8 = &.{}; + var extra_deps: []const []const u8 = &.{}; + for (llvm_target.feature_overrides) |feature_override| { + if (mem.eql(u8, llvm_name, feature_override.llvm_name)) { + if (feature_override.omit) { + continue :root_it; + } + if (feature_override.zig_name) |override_name| { + zig_name = override_name; + } + omit_deps = feature_override.omit_deps; + extra_deps = feature_override.extra_deps; + break; + } + } const features = kv.value_ptr.object.get("Features").?.array; for (features.items) |feature| { const feature_key = feature.object.get("def").?.string; @@ -1181,7 +1205,14 @@ fn processOneTarget(job: Job) anyerror!void { llvm_target, feature_llvm_name, )) orelse continue; - try deps.append(feature_zig_name); + for (omit_deps) |omit_dep| { + if (mem.eql(u8, feature_zig_name, omit_dep)) break; + } else { + try deps.append(feature_zig_name); + } + } + for (extra_deps) |extra_dep| { + try deps.append(extra_dep); } const tune_features = kv.value_ptr.object.get("TuneFeatures").?.array; for (tune_features.items) |feature| { @@ -1228,7 +1259,7 @@ fn processOneTarget(job: Job) anyerror!void { mem.sort(Feature, all_features.items, {}, featureLessThan); mem.sort(Cpu, all_cpus.items, {}, cpuLessThan); - const target_sub_path = try fs.path.join(arena, &.{ "lib", "std", "target" }); + const target_sub_path = try fs.path.join(arena, &.{ "lib", "std", "Target" }); var target_dir = try job.zig_src_dir.makeOpenPath(target_sub_path, .{}); defer target_dir.close();