Skip to content

Commit dc76049

Browse files
committed
process_headers: Merge header directories for some targets.
These are almost entirely identical, with these exceptions: * lib/libc/include/csky-linux-{gnueabi,gnueabihf} * gnu/{lib-names,stubs}.h will need manual patching for float ABI. * lib/libc/include/{powerpc-linux-{gnueabi,gnueabihf},{powerpc64,powerpc64le}-linux-gnu} * bits/long-double.h will need manual patching for long double ABI.
1 parent c04be63 commit dc76049

File tree

1 file changed

+62
-74
lines changed

1 file changed

+62
-74
lines changed

tools/process_headers.zig

Lines changed: 62 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -21,41 +21,42 @@ const Blake3 = std.crypto.hash.Blake3;
2121
const LibCTarget = struct {
2222
arch: Arch,
2323
abi: Abi,
24+
dest: ?[]const u8 = null,
2425
};
2526

2627
const glibc_targets = [_]LibCTarget{
2728
.{ .arch = .arc, .abi = .gnu },
28-
.{ .arch = .arm, .abi = .gnueabi },
29-
.{ .arch = .arm, .abi = .gnueabihf },
30-
.{ .arch = .armeb, .abi = .gnueabi },
31-
.{ .arch = .armeb, .abi = .gnueabihf },
32-
.{ .arch = .aarch64, .abi = .gnu },
33-
.{ .arch = .aarch64_be, .abi = .gnu },
34-
.{ .arch = .csky, .abi = .gnueabi },
35-
.{ .arch = .csky, .abi = .gnueabihf },
36-
.{ .arch = .loongarch64, .abi = .gnu },
37-
.{ .arch = .loongarch64, .abi = .gnusf },
29+
.{ .arch = .arm, .abi = .gnueabi, .dest = "arm-linux-gnu" },
30+
.{ .arch = .arm, .abi = .gnueabihf, .dest = "arm-linux-gnu" },
31+
.{ .arch = .armeb, .abi = .gnueabi, .dest = "arm-linux-gnu" },
32+
.{ .arch = .armeb, .abi = .gnueabihf, .dest = "arm-linux-gnu" },
33+
.{ .arch = .aarch64, .abi = .gnu, .dest = "aarch64-linux-gnu" },
34+
.{ .arch = .aarch64_be, .abi = .gnu, .dest = "aarch64-linux-gnu" },
35+
.{ .arch = .csky, .abi = .gnueabi, .dest = "csky-linux-gnu" },
36+
.{ .arch = .csky, .abi = .gnueabihf, .dest = "csky-linux-gnu" },
37+
.{ .arch = .loongarch64, .abi = .gnu, .dest = "loongarch-linux-gnu" },
38+
.{ .arch = .loongarch64, .abi = .gnusf, .dest = "loongarch-linux-gnu" },
3839
.{ .arch = .m68k, .abi = .gnu },
39-
.{ .arch = .mips, .abi = .gnueabi },
40-
.{ .arch = .mips, .abi = .gnueabihf },
41-
.{ .arch = .mipsel, .abi = .gnueabi },
42-
.{ .arch = .mipsel, .abi = .gnueabihf },
43-
.{ .arch = .mips64, .abi = .gnuabi64 },
44-
.{ .arch = .mips64, .abi = .gnuabin32 },
45-
.{ .arch = .mips64el, .abi = .gnuabi64 },
46-
.{ .arch = .mips64el, .abi = .gnuabin32 },
47-
.{ .arch = .powerpc, .abi = .gnueabi },
48-
.{ .arch = .powerpc, .abi = .gnueabihf },
49-
.{ .arch = .powerpc64, .abi = .gnu },
50-
.{ .arch = .powerpc64le, .abi = .gnu },
51-
.{ .arch = .riscv32, .abi = .gnu },
52-
.{ .arch = .riscv64, .abi = .gnu },
40+
.{ .arch = .mips, .abi = .gnueabi, .dest = "mips-linux-gnu" },
41+
.{ .arch = .mips, .abi = .gnueabihf, .dest = "mips-linux-gnu" },
42+
.{ .arch = .mipsel, .abi = .gnueabi, .dest = "mips-linux-gnu" },
43+
.{ .arch = .mipsel, .abi = .gnueabihf, .dest = "mips-linux-gnu" },
44+
.{ .arch = .mips64, .abi = .gnuabi64, .dest = "mips-linux-gnu" },
45+
.{ .arch = .mips64, .abi = .gnuabin32, .dest = "mips-linux-gnu" },
46+
.{ .arch = .mips64el, .abi = .gnuabi64, .dest = "mips-linux-gnu" },
47+
.{ .arch = .mips64el, .abi = .gnuabin32, .dest = "mips-linux-gnu" },
48+
.{ .arch = .powerpc, .abi = .gnueabi, .dest = "powerpc-linux-gnu" },
49+
.{ .arch = .powerpc, .abi = .gnueabihf, .dest = "powerpc-linux-gnu" },
50+
.{ .arch = .powerpc64, .abi = .gnu, .dest = "powerpc-linux-gnu" },
51+
.{ .arch = .powerpc64le, .abi = .gnu, .dest = "powerpc-linux-gnu" },
52+
.{ .arch = .riscv32, .abi = .gnu, .dest = "riscv-linux-gnu" },
53+
.{ .arch = .riscv64, .abi = .gnu, .dest = "riscv-linux-gnu" },
5354
.{ .arch = .s390x, .abi = .gnu },
54-
.{ .arch = .sparc, .abi = .gnu },
55-
.{ .arch = .sparc64, .abi = .gnu },
56-
.{ .arch = .x86, .abi = .gnu },
57-
.{ .arch = .x86_64, .abi = .gnu },
58-
.{ .arch = .x86_64, .abi = .gnux32 },
55+
.{ .arch = .sparc, .abi = .gnu, .dest = "sparc-linux-gnu" },
56+
.{ .arch = .sparc64, .abi = .gnu, .dest = "sparc-linux-gnu" },
57+
.{ .arch = .x86, .abi = .gnu, .dest = "x86-linux-gnu" },
58+
.{ .arch = .x86_64, .abi = .gnu, .dest = "x86-linux-gnu" },
59+
.{ .arch = .x86_64, .abi = .gnux32, .dest = "x86-linux-gnu" },
5960
};
6061

6162
const musl_targets = [_]LibCTarget{
@@ -88,43 +89,20 @@ const freebsd_targets = [_]LibCTarget{
8889
};
8990

9091
const netbsd_targets = [_]LibCTarget{
91-
.{ .arch = .arm, .abi = .eabi },
92-
.{ .arch = .arm, .abi = .eabihf },
92+
.{ .arch = .arm, .abi = .eabi, .dest = "arm-netbsd-eabi" },
93+
.{ .arch = .arm, .abi = .eabihf, .dest = "arm-netbsd-eabi" },
9394
.{ .arch = .aarch64, .abi = .none },
9495
.{ .arch = .m68k, .abi = .none },
95-
.{ .arch = .mips, .abi = .eabi },
96-
.{ .arch = .mips, .abi = .eabihf },
97-
.{ .arch = .powerpc, .abi = .eabi },
98-
.{ .arch = .powerpc, .abi = .eabihf },
96+
.{ .arch = .mips, .abi = .eabi, .dest = "mips-netbsd-eabi" },
97+
.{ .arch = .mips, .abi = .eabihf, .dest = "mips-netbsd-eabi" },
98+
.{ .arch = .powerpc, .abi = .eabi, .dest = "powerpc-netbsd-eabi" },
99+
.{ .arch = .powerpc, .abi = .eabihf, .dest = "powerpc-netbsd-eabi" },
99100
.{ .arch = .sparc, .abi = .none },
100101
.{ .arch = .sparc64, .abi = .none },
101102
.{ .arch = .x86, .abi = .none },
102103
.{ .arch = .x86_64, .abi = .none },
103104
};
104105

105-
const DestTarget = struct {
106-
arch: Arch,
107-
os: OsTag,
108-
abi: Abi,
109-
110-
const HashContext = struct {
111-
pub fn hash(self: @This(), a: DestTarget) u32 {
112-
_ = self;
113-
return @intFromEnum(a.arch) +%
114-
(@intFromEnum(a.os) *% @as(u32, 4202347608)) +%
115-
(@intFromEnum(a.abi) *% @as(u32, 4082223418));
116-
}
117-
118-
pub fn eql(self: @This(), a: DestTarget, b: DestTarget, b_index: usize) bool {
119-
_ = self;
120-
_ = b_index;
121-
return a.arch == b.arch and
122-
a.os == b.os and
123-
a.abi == b.abi;
124-
}
125-
};
126-
};
127-
128106
const Contents = struct {
129107
bytes: []const u8,
130108
hit_count: usize,
@@ -138,7 +116,7 @@ const Contents = struct {
138116
};
139117

140118
const HashToContents = std.StringHashMap(Contents);
141-
const TargetToHash = std.ArrayHashMap(DestTarget, []const u8, DestTarget.HashContext, true);
119+
const TargetToHash = std.StringArrayHashMap([]const u8);
142120
const PathTable = std.StringHashMap(*TargetToHash);
143121

144122
const LibCVendor = enum {
@@ -236,15 +214,16 @@ pub fn main() !void {
236214
else => unreachable,
237215
},
238216
};
239-
const dest_target = DestTarget{
240-
.arch = libc_target.arch,
241-
.os = switch (vendor) {
242-
.musl, .glibc => .linux,
243-
.freebsd => .freebsd,
244-
.netbsd => .netbsd,
217+
218+
const dest_target = if (libc_target.dest) |dest| dest else try std.fmt.allocPrint(allocator, "{s}-{s}-{s}", .{
219+
@tagName(libc_target.arch),
220+
switch (vendor) {
221+
.musl, .glibc => "linux",
222+
.freebsd => "freebsd",
223+
.netbsd => "netbsd",
245224
},
246-
.abi = libc_target.abi,
247-
};
225+
@tagName(libc_target.abi),
226+
});
248227

249228
search: for (search_paths.items) |search_path| {
250229
const sub_path = switch (vendor) {
@@ -307,7 +286,21 @@ pub fn main() !void {
307286
path_gop.value_ptr.* = ptr;
308287
break :blk ptr;
309288
};
310-
try target_to_hash.putNoClobber(dest_target, hash);
289+
// When `dest` is set, there are a few rare cases where we expect to overwrite a header. For
290+
// example, `bits/long-double.h` differs very slightly between `powerpc64le-linux-gnu` and
291+
// other `powerpc*-linux-gnu` targets, and we unify those targets as `powerpc-linux-gnu`. In
292+
// such cases, we manually patch the affected header after processing, so it's fine that
293+
// only one header wins here.
294+
if (libc_target.dest != null) {
295+
const hash_gop = try target_to_hash.getOrPut(dest_target);
296+
if (hash_gop.found_existing) std.debug.print("overwrote: {s} {s} {s}\n", .{
297+
libc_dir,
298+
rel_path,
299+
dest_target,
300+
}) else hash_gop.value_ptr.* = hash;
301+
} else {
302+
try target_to_hash.putNoClobber(dest_target, hash);
303+
}
311304
},
312305
else => std.debug.print("warning: weird file: {s}\n", .{full_path}),
313306
}
@@ -363,12 +356,7 @@ pub fn main() !void {
363356
if (contents.is_generic) continue;
364357

365358
const dest_target = hash_kv.key_ptr.*;
366-
const out_subpath = try std.fmt.allocPrint(allocator, "{s}-{s}-{s}", .{
367-
@tagName(dest_target.arch),
368-
@tagName(dest_target.os),
369-
@tagName(dest_target.abi),
370-
});
371-
const full_path = try std.fs.path.join(allocator, &[_][]const u8{ out_dir, out_subpath, path_kv.key_ptr.* });
359+
const full_path = try std.fs.path.join(allocator, &[_][]const u8{ out_dir, dest_target, path_kv.key_ptr.* });
372360
try std.fs.cwd().makePath(std.fs.path.dirname(full_path).?);
373361
try std.fs.cwd().writeFile(.{ .sub_path = full_path, .data = contents.bytes });
374362
}

0 commit comments

Comments
 (0)