refactor update_cpu_features.zig

Most of this commit is whitespace changes, moving to use RLS
for assigning the `CpuModel`
This commit is contained in:
David Rubin
2024-11-25 00:06:14 -08:00
parent 9e17e097e5
commit f36f7d54a7
24 changed files with 1079 additions and 1082 deletions

View File

@@ -426,23 +426,6 @@ const llvm_targets = [_]LlvmTarget{
.llvm_name = "ARM",
.td_name = "ARM.td",
.branch_quota = 10000,
.extra_cpus = &.{
.{
.llvm_name = "generic",
.zig_name = "baseline",
.features = &.{"v7a"},
},
.{
.llvm_name = null,
.zig_name = "exynos_m1",
.features = &.{ "v8a", "exynos" },
},
.{
.llvm_name = null,
.zig_name = "exynos_m2",
.features = &.{ "v8a", "exynos" },
},
},
.feature_overrides = &.{
.{
.llvm_name = "exynos",
@@ -902,6 +885,23 @@ const llvm_targets = [_]LlvmTarget{
.zig_name = "has_v9_5a",
},
},
.extra_cpus = &.{
.{
.llvm_name = "generic",
.zig_name = "baseline",
.features = &.{"v7a"},
},
.{
.llvm_name = null,
.zig_name = "exynos_m1",
.features = &.{ "v8a", "exynos" },
},
.{
.llvm_name = null,
.zig_name = "exynos_m2",
.features = &.{ "v8a", "exynos" },
},
},
// LLVM removed support for v2 and v3 but zig wants to support targeting old hardware
.extra_features = &.{
.{
@@ -1224,37 +1224,38 @@ pub fn main() anyerror!void {
defer arena_state.deinit();
const arena = arena_state.allocator();
const stderr = std.io.getStdErr();
var args = try std.process.argsWithAllocator(arena);
const args0 = args.next().?;
const llvm_tblgen_exe = args.next() orelse
usageAndExit(stderr, args0, 1);
usageAndExit(args0, 1);
if (std.mem.eql(u8, llvm_tblgen_exe, "--help")) {
usageAndExit(std.io.getStdOut(), args0, 0);
usageAndExit(args0, 0);
}
if (std.mem.startsWith(u8, llvm_tblgen_exe, "-")) {
usageAndExit(stderr, args0, 1);
usageAndExit(args0, 1);
}
const llvm_src_root = args.next() orelse
usageAndExit(stderr, args0, 1);
usageAndExit(args0, 1);
if (std.mem.startsWith(u8, llvm_src_root, "-")) {
usageAndExit(stderr, args0, 1);
usageAndExit(args0, 1);
}
const zig_src_root = args.next() orelse
usageAndExit(stderr, args0, 1);
usageAndExit(args0, 1);
if (std.mem.startsWith(u8, zig_src_root, "-")) {
usageAndExit(stderr, args0, 1);
usageAndExit(args0, 1);
}
var filter: ?[]const u8 = null;
if (args.next()) |arg| filter = arg;
if (args.skip()) usageAndExit(stderr, args0, 1);
// there shouldn't be any more argument after the optional filter
if (args.skip()) usageAndExit(args0, 1);
var zig_src_dir = try fs.cwd().openDir(zig_src_root, .{});
defer zig_src_dir.close();
@@ -1265,7 +1266,7 @@ pub fn main() anyerror!void {
if (builtin.single_threaded) {
for (llvm_targets) |llvm_target| {
if (filter) |zig_name| if (!std.mem.eql(u8, llvm_target.zig_name, zig_name)) continue;
try processOneTarget(Job{
try processOneTarget(.{
.llvm_tblgen_exe = llvm_tblgen_exe,
.llvm_src_root = llvm_src_root,
.zig_src_dir = zig_src_dir,
@@ -1311,7 +1312,7 @@ fn processOneTarget(job: Job) void {
const progress_node = job.root_progress.start(llvm_target.zig_name, 3);
defer progress_node.end();
const tblgen_progress = progress_node.start("invoke llvm-tblgen", 0);
const tblgen_progress = progress_node.start("running llvm-tblgen", 0);
const child_args = [_][]const u8{
job.llvm_tblgen_exe,
@@ -1348,16 +1349,16 @@ fn processOneTarget(job: Job) void {
},
};
const json_parse_progress = progress_node.start("parse JSON", 0);
const json_parse_progress = progress_node.start("parsing JSON", 0);
const parsed = try json.parseFromSlice(json.Value, arena, json_text, .{});
defer parsed.deinit();
const root_map = &parsed.value.object;
json_parse_progress.end();
const render_progress = progress_node.start("render zig code", 0);
const render_progress = progress_node.start("rendering Zig code", 0);
// So far LLVM has only had a few aliases for the same CPU.
// So far, LLVM only has a few aliases for the same CPU.
var cpu_aliases = std.StringHashMap(std.SegmentedList(struct {
llvm: []const u8,
zig: []const u8,
@@ -1431,7 +1432,7 @@ fn processOneTarget(job: Job) void {
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_obj = root_map.get(other_key).?.object;
const other_llvm_name = other_obj.get("Name").?.string;
const other_zig_name = (try llvmFeatureNameToZigNameOmit(
arena,
@@ -1448,7 +1449,7 @@ fn processOneTarget(job: Job) void {
if (kv.value_ptr.object.get("DefaultExts")) |exts_val| {
for (exts_val.array.items) |ext| {
const other_key = ext.object.get("def").?.string;
const other_obj = &root_map.getPtr(other_key).?.object;
const other_obj = root_map.get(other_key).?.object;
const other_llvm_name = other_obj.get("Name").?.string;
const other_zig_name = (try llvmFeatureNameToZigNameOmit(
arena,
@@ -1505,7 +1506,7 @@ fn processOneTarget(job: Job) void {
const features = kv.value_ptr.object.get("Features").?.array;
for (features.items) |feature| {
const feature_key = feature.object.get("def").?.string;
const feature_obj = &root_map.getPtr(feature_key).?.object;
const feature_obj = root_map.get(feature_key).?.object;
const feature_llvm_name = feature_obj.get("Name").?.string;
if (feature_llvm_name.len == 0) continue;
const feature_zig_name = (try llvmFeatureNameToZigNameOmit(
@@ -1525,7 +1526,7 @@ fn processOneTarget(job: Job) void {
const tune_features = kv.value_ptr.object.get("TuneFeatures").?.array;
for (tune_features.items) |feature| {
const feature_key = feature.object.get("def").?.string;
const feature_obj = &root_map.getPtr(feature_key).?.object;
const feature_obj = root_map.get(feature_key).?.object;
const feature_llvm_name = feature_obj.get("Name").?.string;
if (feature_llvm_name.len == 0) continue;
const feature_zig_name = (try llvmFeatureNameToZigNameOmit(
@@ -1569,12 +1570,10 @@ fn processOneTarget(job: Job) 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" });
var target_dir = try job.zig_src_dir.makeOpenPath(target_sub_path, .{});
var target_dir = try job.zig_src_dir.openDir("lib/std/Target", .{});
defer target_dir.close();
const zig_code_basename = try std.fmt.allocPrint(arena, "{s}.zig", .{llvm_target.zig_name});
var zig_code_file = try target_dir.createFile(zig_code_basename, .{});
defer zig_code_file.close();
@@ -1705,7 +1704,7 @@ fn processOneTarget(job: Job) void {
mem.sort([]const u8, cpu_features.items, {}, asciiLessThan);
if (cpu.llvm_name) |llvm_name| {
try w.print(
\\ pub const {} = CpuModel{{
\\ pub const {}: CpuModel = .{{
\\ .name = "{}",
\\ .llvm_name = "{}",
\\ .features = featureSet(&[_]Feature{{
@@ -1716,7 +1715,7 @@ fn processOneTarget(job: Job) void {
});
} else {
try w.print(
\\ pub const {} = CpuModel{{
\\ pub const {}: CpuModel = .{{
\\ .name = "{}",
\\ .llvm_name = null,
\\ .features = featureSet(&[_]Feature{{
@@ -1753,8 +1752,9 @@ fn processOneTarget(job: Job) void {
render_progress.end();
}
fn usageAndExit(file: fs.File, arg0: []const u8, code: u8) noreturn {
file.writer().print(
fn usageAndExit(arg0: []const u8, code: u8) noreturn {
const stderr = std.io.getStdErr();
stderr.writer().print(
\\Usage: {s} /path/to/llvm-tblgen /path/git/llvm-project /path/git/zig [zig_name filter]
\\
\\Updates lib/std/target/<target>.zig from llvm/lib/Target/<Target>/<Target>.td .
@@ -1765,18 +1765,15 @@ fn usageAndExit(file: fs.File, arg0: []const u8, code: u8) noreturn {
std.process.exit(code);
}
fn featureLessThan(context: void, a: Feature, b: Feature) bool {
_ = context;
fn featureLessThan(_: void, a: Feature, b: Feature) bool {
return std.ascii.lessThanIgnoreCase(a.zig_name, b.zig_name);
}
fn cpuLessThan(context: void, a: Cpu, b: Cpu) bool {
_ = context;
fn cpuLessThan(_: void, a: Cpu, b: Cpu) bool {
return std.ascii.lessThanIgnoreCase(a.zig_name, b.zig_name);
}
fn asciiLessThan(context: void, a: []const u8, b: []const u8) bool {
_ = context;
fn asciiLessThan(_: void, a: []const u8, b: []const u8) bool {
return std.ascii.lessThanIgnoreCase(a, b);
}
@@ -1803,7 +1800,7 @@ fn llvmFeatureNameToZigNameOmit(
return try llvmNameToZigName(arena, llvm_name);
}
fn hasSuperclass(obj: *json.ObjectMap, class_name: []const u8) bool {
fn hasSuperclass(obj: *const json.ObjectMap, class_name: []const u8) bool {
const superclasses_json = obj.get("!superclasses") orelse return false;
for (superclasses_json.array.items) |superclass_json| {
const superclass = superclass_json.string;