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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user