authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-11-21 21:45:09-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-11-22 11:33:34-07:00
loga34a51ef6eb4bd8dfab14bd8bfe1193d5573eacf
tree7cba9d333f6ebae6208e8487080bea896086acf7
parent44ae978523f759382d5724fac1ffd83a2d0eda2c

aro: use ArrayList in GCCDetector instead of BoundedArray

These arrays don't really all have an upper bound of 16; in fact they have different upper bounds. Presumably the reason 16 was used for all of them was to avoid code bloat with BoundedArray. Well, now even more code bloat has been eliminated because now it's using `ArrayList([]const u8)` which is certainly instantiated elsewhere. Furthermore, the different corrected upper bounds can be specified at each instance of the array list.

1 files changed, 24 insertions(+), 17 deletions(-)

deps/aro/aro/Driver/GCCDetector.zig+24-17
......@@ -29,7 +29,7 @@ pub fn appendToolPath(self: *const GCCDetector, tc: *Toolchain) !void {
2929 }, .program);
3030}
3131
32fn addDefaultGCCPrefixes(prefixes: *PathPrefixes, tc: *const Toolchain) !void {
32fn addDefaultGCCPrefixes(prefixes: *std.ArrayListUnmanaged([]const u8), tc: *const Toolchain) !void {
3333 const sysroot = tc.getSysroot();
3434 const target = tc.getTarget();
3535 if (sysroot.len == 0 and target.os.tag == .linux and tc.filesystem.exists("/opt/rh")) {
......@@ -57,14 +57,12 @@ fn addDefaultGCCPrefixes(prefixes: *PathPrefixes, tc: *const Toolchain) !void {
5757 }
5858}
5959
60const PathPrefixes = std.BoundedArray([]const u8, 16);
61
6260fn collectLibDirsAndTriples(
6361 tc: *Toolchain,
64 lib_dirs: *PathPrefixes,
65 triple_aliases: *PathPrefixes,
66 biarch_libdirs: *PathPrefixes,
67 biarch_triple_aliases: *PathPrefixes,
62 lib_dirs: *std.ArrayListUnmanaged([]const u8),
63 triple_aliases: *std.ArrayListUnmanaged([]const u8),
64 biarch_libdirs: *std.ArrayListUnmanaged([]const u8),
65 biarch_triple_aliases: *std.ArrayListUnmanaged([]const u8),
6866) !void {
6967 const AArch64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
7068 const AArch64Triples: [4][]const u8 = .{ "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-redhat-linux", "aarch64-suse-linux" };
......@@ -408,10 +406,18 @@ pub fn discover(self: *GCCDetector, tc: *Toolchain) !void {
408406 else
409407 target_util.get32BitArchVariant(target);
410408
411 var candidate_lib_dirs: PathPrefixes = .{};
412 var candidate_triple_aliases: PathPrefixes = .{};
413 var candidate_biarch_lib_dirs: PathPrefixes = .{};
414 var candidate_biarch_triple_aliases: PathPrefixes = .{};
409 var candidate_lib_dirs_buffer: [16][]const u8 = undefined;
410 var candidate_lib_dirs = std.ArrayListUnmanaged([]const u8).initBuffer(&candidate_lib_dirs_buffer);
411
412 var candidate_triple_aliases_buffer: [16][]const u8 = undefined;
413 var candidate_triple_aliases = std.ArrayListUnmanaged([]const u8).initBuffer(&candidate_triple_aliases_buffer);
414
415 var candidate_biarch_lib_dirs_buffer: [16][]const u8 = undefined;
416 var candidate_biarch_lib_dirs = std.ArrayListUnmanaged([]const u8).initBuffer(&candidate_biarch_lib_dirs_buffer);
417
418 var candidate_biarch_triple_aliases_buffer: [16][]const u8 = undefined;
419 var candidate_biarch_triple_aliases = std.ArrayListUnmanaged([]const u8).initBuffer(&candidate_biarch_triple_aliases_buffer);
420
415421 try collectLibDirsAndTriples(
416422 tc,
417423 &candidate_lib_dirs,
......@@ -433,7 +439,8 @@ pub fn discover(self: *GCCDetector, tc: *Toolchain) !void {
433439 }
434440 }
435441
436 var prefixes: PathPrefixes = .{};
442 var prefixes_buf: [16][]const u8 = undefined;
443 var prefixes = std.ArrayListUnmanaged([]const u8).initBuffer(&prefixes_buf);
437444 const gcc_toolchain_dir = gccToolchainDir(tc);
438445 if (gcc_toolchain_dir.len != 0) {
439446 const adjusted = if (gcc_toolchain_dir[gcc_toolchain_dir.len - 1] == '/')
......@@ -455,10 +462,10 @@ pub fn discover(self: *GCCDetector, tc: *Toolchain) !void {
455462 }
456463
457464 const v0 = GCCVersion.parse("0.0.0");
458 for (prefixes.constSlice()) |prefix| {
465 for (prefixes.items) |prefix| {
459466 if (!tc.filesystem.exists(prefix)) continue;
460467
461 for (candidate_lib_dirs.constSlice()) |suffix| {
468 for (candidate_lib_dirs.items) |suffix| {
462469 defer fib.reset();
463470 const lib_dir = std.fs.path.join(fib.allocator(), &.{ prefix, suffix }) catch continue;
464471 if (!tc.filesystem.exists(lib_dir)) continue;
......@@ -467,17 +474,17 @@ pub fn discover(self: *GCCDetector, tc: *Toolchain) !void {
467474 const gcc_cross_dir_exists = tc.filesystem.joinedExists(&.{ lib_dir, "/gcc-cross" });
468475
469476 try self.scanLibDirForGCCTriple(tc, target, lib_dir, triple_str, false, gcc_dir_exists, gcc_cross_dir_exists);
470 for (candidate_triple_aliases.constSlice()) |candidate| {
477 for (candidate_triple_aliases.items) |candidate| {
471478 try self.scanLibDirForGCCTriple(tc, target, lib_dir, candidate, false, gcc_dir_exists, gcc_cross_dir_exists);
472479 }
473480 }
474 for (candidate_biarch_lib_dirs.constSlice()) |suffix| {
481 for (candidate_biarch_lib_dirs.items) |suffix| {
475482 const lib_dir = std.fs.path.join(fib.allocator(), &.{ prefix, suffix }) catch continue;
476483 if (!tc.filesystem.exists(lib_dir)) continue;
477484
478485 const gcc_dir_exists = tc.filesystem.joinedExists(&.{ lib_dir, "/gcc" });
479486 const gcc_cross_dir_exists = tc.filesystem.joinedExists(&.{ lib_dir, "/gcc-cross" });
480 for (candidate_biarch_triple_aliases.constSlice()) |candidate| {
487 for (candidate_biarch_triple_aliases.items) |candidate| {
481488 try self.scanLibDirForGCCTriple(tc, target, lib_dir, candidate, true, gcc_dir_exists, gcc_cross_dir_exists);
482489 }
483490 }