authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-11-24 22:23:26-08:00
committergravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-11-25 01:11:06-08:00
logbc3ed51b7f750e0471a97ec2f7724326885ba71a
tree555b3a839dff917c03c5e7e05cd12a887f1d4876
parente2f24a2d7096e4a28ba74513ed9473da0b7fb372
signaturelock-open Commit is signed but in an unrecognized format.

cleanup `update_cpu_feature.zig`

* Cleanup the argument handling logic to allow for optional arguments. * Add a filter for which `llvm_target` to process. * Switch to using a threadpool, needed for skipping llvm targets cleanly and better distributes the work. * Remove a seemingly useless piece of logic. I re-ran the script and it gave identical outputs.

1 files changed, 33 insertions(+), 38 deletions(-)

tools/update_cpu_features.zig+33-38
...@@ -1220,32 +1220,38 @@ pub fn main() anyerror!void {...@@ -1220,32 +1220,38 @@ pub fn main() anyerror!void {
1220 defer arena_state.deinit();1220 defer arena_state.deinit();
1221 const arena = arena_state.allocator();1221 const arena = arena_state.allocator();
12221222
1223 const args = try std.process.argsAlloc(arena);1223 const stderr = std.io.getStdErr();
1224 if (args.len <= 1) {1224 var args = try std.process.argsWithAllocator(arena);
1225 usageAndExit(std.io.getStdErr(), args[0], 1);1225 const args0 = args.next().?;
1226 }
1227 if (std.mem.eql(u8, args[1], "--help")) {
1228 usageAndExit(std.io.getStdOut(), args[0], 0);
1229 }
1230 if (args.len < 4) {
1231 usageAndExit(std.io.getStdErr(), args[0], 1);
1232 }
12331226
1234 const llvm_tblgen_exe = args[1];1227 const llvm_tblgen_exe = args.next() orelse
1228 usageAndExit(stderr, args0, 1);
1229
1230 if (std.mem.eql(u8, llvm_tblgen_exe, "--help")) {
1231 usageAndExit(std.io.getStdOut(), args0, 0);
1232 }
1235 if (std.mem.startsWith(u8, llvm_tblgen_exe, "-")) {1233 if (std.mem.startsWith(u8, llvm_tblgen_exe, "-")) {
1236 usageAndExit(std.io.getStdErr(), args[0], 1);1234 usageAndExit(stderr, args0, 1);
1237 }1235 }
12381236
1239 const llvm_src_root = args[2];1237 const llvm_src_root = args.next() orelse
1238 usageAndExit(stderr, args0, 1);
1239
1240 if (std.mem.startsWith(u8, llvm_src_root, "-")) {1240 if (std.mem.startsWith(u8, llvm_src_root, "-")) {
1241 usageAndExit(std.io.getStdErr(), args[0], 1);1241 usageAndExit(stderr, args0, 1);
1242 }1242 }
12431243
1244 const zig_src_root = args[3];1244 const zig_src_root = args.next() orelse
1245 usageAndExit(stderr, args0, 1);
1245 if (std.mem.startsWith(u8, zig_src_root, "-")) {1246 if (std.mem.startsWith(u8, zig_src_root, "-")) {
1246 usageAndExit(std.io.getStdErr(), args[0], 1);1247 usageAndExit(stderr, args0, 1);
1247 }1248 }
12481249
1250 var filter: ?[]const u8 = null;
1251 if (args.next()) |arg| filter = arg;
1252
1253 if (args.skip()) usageAndExit(stderr, args0, 1);
1254
1249 var zig_src_dir = try fs.cwd().openDir(zig_src_root, .{});1255 var zig_src_dir = try fs.cwd().openDir(zig_src_root, .{});
1250 defer zig_src_dir.close();1256 defer zig_src_dir.close();
12511257
...@@ -1254,6 +1260,7 @@ pub fn main() anyerror!void {...@@ -1254,6 +1260,7 @@ pub fn main() anyerror!void {
12541260
1255 if (builtin.single_threaded) {1261 if (builtin.single_threaded) {
1256 for (llvm_targets) |llvm_target| {1262 for (llvm_targets) |llvm_target| {
1263 if (filter) |zig_name| if (!std.mem.eql(u8, llvm_target.zig_name, zig_name)) continue;
1257 try processOneTarget(Job{1264 try processOneTarget(Job{
1258 .llvm_tblgen_exe = llvm_tblgen_exe,1265 .llvm_tblgen_exe = llvm_tblgen_exe,
1259 .llvm_src_root = llvm_src_root,1266 .llvm_src_root = llvm_src_root,
...@@ -1263,8 +1270,12 @@ pub fn main() anyerror!void {...@@ -1263,8 +1270,12 @@ pub fn main() anyerror!void {
1263 });1270 });
1264 }1271 }
1265 } else {1272 } else {
1266 var threads = try arena.alloc(std.Thread, llvm_targets.len);1273 var pool: std.Thread.Pool = undefined;
1267 for (llvm_targets, 0..) |llvm_target, i| {1274 try pool.init(.{ .allocator = arena, .n_jobs = llvm_targets.len });
1275 defer pool.deinit();
1276
1277 for (llvm_targets) |llvm_target| {
1278 if (filter) |zig_name| if (!std.mem.eql(u8, llvm_target.zig_name, zig_name)) continue;
1268 const job = Job{1279 const job = Job{
1269 .llvm_tblgen_exe = llvm_tblgen_exe,1280 .llvm_tblgen_exe = llvm_tblgen_exe,
1270 .llvm_src_root = llvm_src_root,1281 .llvm_src_root = llvm_src_root,
...@@ -1272,10 +1283,7 @@ pub fn main() anyerror!void {...@@ -1272,10 +1283,7 @@ pub fn main() anyerror!void {
1272 .root_progress = root_progress,1283 .root_progress = root_progress,
1273 .llvm_target = llvm_target,1284 .llvm_target = llvm_target,
1274 };1285 };
1275 threads[i] = try std.Thread.spawn(.{}, processOneTarget, .{job});1286 try pool.spawn(processOneTarget, .{job});
1276 }
1277 for (threads) |thread| {
1278 thread.join();
1279 }1287 }
1280 }1288 }
1281}1289}
...@@ -1288,7 +1296,8 @@ const Job = struct {...@@ -1288,7 +1296,8 @@ const Job = struct {
1288 llvm_target: LlvmTarget,1296 llvm_target: LlvmTarget,
1289};1297};
12901298
1291fn processOneTarget(job: Job) anyerror!void {1299fn processOneTarget(job: Job) void {
1300 errdefer |err| std.debug.panic("panic: {s}", .{@errorName(err)});
1292 const llvm_target = job.llvm_target;1301 const llvm_target = job.llvm_target;
12931302
1294 var arena_state = std.heap.ArenaAllocator.init(std.heap.page_allocator);1303 var arena_state = std.heap.ArenaAllocator.init(std.heap.page_allocator);
...@@ -1522,20 +1531,6 @@ fn processOneTarget(job: Job) anyerror!void {...@@ -1522,20 +1531,6 @@ fn processOneTarget(job: Job) anyerror!void {
1522 )) orelse continue;1531 )) orelse continue;
1523 try deps.append(feature_zig_name);1532 try deps.append(feature_zig_name);
1524 }1533 }
1525 for (llvm_target.feature_overrides) |feature_override| {
1526 if (mem.eql(u8, llvm_name, feature_override.llvm_name)) {
1527 if (feature_override.omit) {
1528 continue;
1529 }
1530 if (feature_override.zig_name) |override_name| {
1531 zig_name = override_name;
1532 }
1533 for (feature_override.extra_deps) |extra_dep| {
1534 try deps.append(extra_dep);
1535 }
1536 break;
1537 }
1538 }
1539 try all_cpus.append(.{1534 try all_cpus.append(.{
1540 .llvm_name = llvm_name,1535 .llvm_name = llvm_name,
1541 .zig_name = zig_name,1536 .zig_name = zig_name,
...@@ -1756,7 +1751,7 @@ fn processOneTarget(job: Job) anyerror!void {...@@ -1756,7 +1751,7 @@ fn processOneTarget(job: Job) anyerror!void {
17561751
1757fn usageAndExit(file: fs.File, arg0: []const u8, code: u8) noreturn {1752fn usageAndExit(file: fs.File, arg0: []const u8, code: u8) noreturn {
1758 file.writer().print(1753 file.writer().print(
1759 \\Usage: {s} /path/to/llvm-tblgen /path/git/llvm-project /path/git/zig1754 \\Usage: {s} /path/to/llvm-tblgen /path/git/llvm-project /path/git/zig [zig_name filter]
1760 \\1755 \\
1761 \\Updates lib/std/target/<target>.zig from llvm/lib/Target/<Target>/<Target>.td .1756 \\Updates lib/std/target/<target>.zig from llvm/lib/Target/<Target>/<Target>.td .
1762 \\1757 \\