Commit 55f2a6684e

Carl Åstholm <carl@astholm.se>
2024-01-09 17:32:16
update_cpu_features: Support omitting deps
1 parent 60094cc
Changed files (1)
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();