authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-10-16 03:38:15+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-11-02 10:42:53+01:00
log497b502ce465189a96421be831c0cc0be6e8c2f9
tree71856bf092e666f66734b56390e535bfdbbb76aa
parent270fbbcd86b02fcd02ad9b818d9de39dfe671754
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

process_headers: Simplify the code a bit.


1 files changed, 62 insertions(+), 289 deletions(-)

tools/process_headers.zig+62-289
......@@ -19,273 +19,63 @@ const Blake3 = std.crypto.hash.Blake3;
1919
2020const LibCTarget = struct {
2121 name: []const u8,
22 arch: MultiArch,
23 abi: MultiAbi,
24};
25
26const MultiArch = union(enum) {
27 aarch64,
28 arm,
29 mips,
30 mips64,
31 powerpc64,
32 specific: Arch,
33
34 fn eql(a: MultiArch, b: MultiArch) bool {
35 if (@intFromEnum(a) != @intFromEnum(b))
36 return false;
37 if (a != .specific)
38 return true;
39 return a.specific == b.specific;
40 }
41};
42
43const MultiAbi = union(enum) {
44 musl,
45 specific: Abi,
46
47 fn eql(a: MultiAbi, b: MultiAbi) bool {
48 if (@intFromEnum(a) != @intFromEnum(b))
49 return false;
50 if (std.meta.Tag(MultiAbi)(a) != .specific)
51 return true;
52 return a.specific == b.specific;
53 }
22 arch: Arch,
23 abi: Abi,
5424};
5525
5626const glibc_targets = [_]LibCTarget{
57 LibCTarget{
58 .name = "aarch64_be-linux-gnu",
59 .arch = MultiArch{ .specific = Arch.aarch64_be },
60 .abi = MultiAbi{ .specific = Abi.gnu },
61 },
62 LibCTarget{
63 .name = "aarch64-linux-gnu",
64 .arch = MultiArch{ .specific = Arch.aarch64 },
65 .abi = MultiAbi{ .specific = Abi.gnu },
66 },
67 LibCTarget{
68 .name = "armeb-linux-gnueabi",
69 .arch = MultiArch{ .specific = Arch.armeb },
70 .abi = MultiAbi{ .specific = Abi.gnueabi },
71 },
72 LibCTarget{
73 .name = "armeb-linux-gnueabihf",
74 .arch = MultiArch{ .specific = Arch.armeb },
75 .abi = MultiAbi{ .specific = Abi.gnueabihf },
76 },
77 LibCTarget{
78 .name = "arm-linux-gnueabi",
79 .arch = MultiArch{ .specific = Arch.arm },
80 .abi = MultiAbi{ .specific = Abi.gnueabi },
81 },
82 LibCTarget{
83 .name = "arm-linux-gnueabihf",
84 .arch = MultiArch{ .specific = Arch.arm },
85 .abi = MultiAbi{ .specific = Abi.gnueabihf },
86 },
87 LibCTarget{
88 .name = "arc-linux-gnu",
89 .arch = MultiArch{ .specific = Arch.arc },
90 .abi = MultiAbi{ .specific = Abi.gnu },
91 },
92 LibCTarget{
93 .name = "csky-linux-gnuabiv2",
94 .arch = MultiArch{ .specific = Arch.csky },
95 .abi = MultiAbi{ .specific = Abi.gnueabihf },
96 },
97 LibCTarget{
98 .name = "csky-linux-gnuabiv2-soft",
99 .arch = MultiArch{ .specific = Arch.csky },
100 .abi = MultiAbi{ .specific = Abi.gnueabi },
101 },
102 LibCTarget{
103 .name = "i686-linux-gnu",
104 .arch = MultiArch{ .specific = Arch.x86 },
105 .abi = MultiAbi{ .specific = Abi.gnu },
106 },
107 LibCTarget{
108 .name = "mips64el-linux-gnu-n32",
109 .arch = MultiArch{ .specific = Arch.mips64el },
110 .abi = MultiAbi{ .specific = Abi.gnuabin32 },
111 },
112 LibCTarget{
113 .name = "mips64el-linux-gnu-n64",
114 .arch = MultiArch{ .specific = Arch.mips64el },
115 .abi = MultiAbi{ .specific = Abi.gnuabi64 },
116 },
117 LibCTarget{
118 .name = "mips64-linux-gnu-n32",
119 .arch = MultiArch{ .specific = Arch.mips64 },
120 .abi = MultiAbi{ .specific = Abi.gnuabin32 },
121 },
122 LibCTarget{
123 .name = "mips64-linux-gnu-n64",
124 .arch = MultiArch{ .specific = Arch.mips64 },
125 .abi = MultiAbi{ .specific = Abi.gnuabi64 },
126 },
127 LibCTarget{
128 .name = "mipsel-linux-gnu",
129 .arch = MultiArch{ .specific = Arch.mipsel },
130 .abi = MultiAbi{ .specific = Abi.gnueabihf },
131 },
132 LibCTarget{
133 .name = "mipsel-linux-gnu-soft",
134 .arch = MultiArch{ .specific = Arch.mipsel },
135 .abi = MultiAbi{ .specific = Abi.gnueabi },
136 },
137 LibCTarget{
138 .name = "mips-linux-gnu",
139 .arch = MultiArch{ .specific = Arch.mips },
140 .abi = MultiAbi{ .specific = Abi.gnueabihf },
141 },
142 LibCTarget{
143 .name = "mips-linux-gnu-soft",
144 .arch = MultiArch{ .specific = Arch.mips },
145 .abi = MultiAbi{ .specific = Abi.gnueabi },
146 },
147 LibCTarget{
148 .name = "powerpc64le-linux-gnu",
149 .arch = MultiArch{ .specific = Arch.powerpc64le },
150 .abi = MultiAbi{ .specific = Abi.gnu },
151 },
152 LibCTarget{
153 .name = "powerpc64-linux-gnu",
154 .arch = MultiArch{ .specific = Arch.powerpc64 },
155 .abi = MultiAbi{ .specific = Abi.gnu },
156 },
157 LibCTarget{
158 .name = "powerpc-linux-gnu",
159 .arch = MultiArch{ .specific = Arch.powerpc },
160 .abi = MultiAbi{ .specific = Abi.gnueabihf },
161 },
162 LibCTarget{
163 .name = "powerpc-linux-gnu-soft",
164 .arch = MultiArch{ .specific = Arch.powerpc },
165 .abi = MultiAbi{ .specific = Abi.gnueabi },
166 },
167 LibCTarget{
168 .name = "riscv32-linux-gnu-rv32imafdc-ilp32d",
169 .arch = MultiArch{ .specific = Arch.riscv32 },
170 .abi = MultiAbi{ .specific = Abi.gnu },
171 },
172 LibCTarget{
173 .name = "riscv64-linux-gnu-rv64imafdc-lp64d",
174 .arch = MultiArch{ .specific = Arch.riscv64 },
175 .abi = MultiAbi{ .specific = Abi.gnu },
176 },
177 LibCTarget{
178 .name = "s390x-linux-gnu",
179 .arch = MultiArch{ .specific = Arch.s390x },
180 .abi = MultiAbi{ .specific = Abi.gnu },
181 },
182 LibCTarget{
183 .name = "sparcv9-linux-gnu",
184 .arch = MultiArch{ .specific = Arch.sparc },
185 .abi = MultiAbi{ .specific = Abi.gnu },
186 },
187 LibCTarget{
188 .name = "sparc64-linux-gnu",
189 .arch = MultiArch{ .specific = Arch.sparc64 },
190 .abi = MultiAbi{ .specific = Abi.gnu },
191 },
192 LibCTarget{
193 .name = "x86_64-linux-gnu",
194 .arch = MultiArch{ .specific = Arch.x86_64 },
195 .abi = MultiAbi{ .specific = Abi.gnu },
196 },
197 LibCTarget{
198 .name = "x86_64-linux-gnu-x32",
199 .arch = MultiArch{ .specific = Arch.x86_64 },
200 .abi = MultiAbi{ .specific = Abi.gnux32 },
201 },
202 LibCTarget{
203 .name = "m68k-linux-gnu",
204 .arch = MultiArch{ .specific = Arch.m68k },
205 .abi = MultiAbi{ .specific = Abi.gnu },
206 },
207 LibCTarget{
208 .name = "loongarch64-linux-gnu-lp64d",
209 .arch = MultiArch{ .specific = .loongarch64 },
210 .abi = MultiAbi{ .specific = Abi.gnu },
211 },
212 LibCTarget{
213 .name = "loongarch64-linux-gnu-lp64s",
214 .arch = MultiArch{ .specific = .loongarch64 },
215 .abi = MultiAbi{ .specific = Abi.gnusf },
216 },
27 .{ .name = "arc-linux-gnu", .arch = .arc, .abi = .gnu },
28 .{ .name = "arm-linux-gnueabi", .arch = .arm, .abi = .gnueabi },
29 .{ .name = "arm-linux-gnueabihf", .arch = .arm, .abi = .gnueabihf },
30 .{ .name = "armeb-linux-gnueabi", .arch = .armeb, .abi = .gnueabi },
31 .{ .name = "armeb-linux-gnueabihf", .arch = .armeb, .abi = .gnueabihf },
32 .{ .name = "aarch64-linux-gnu", .arch = .aarch64, .abi = .gnu },
33 .{ .name = "aarch64_be-linux-gnu", .arch = .aarch64_be, .abi = .gnu },
34 .{ .name = "csky-linux-gnuabiv2-soft", .arch = .csky, .abi = .gnueabi },
35 .{ .name = "csky-linux-gnuabiv2", .arch = .csky, .abi = .gnueabihf },
36 .{ .name = "loongarch64-linux-gnu-lp64d", .arch = .loongarch64, .abi = .gnu },
37 .{ .name = "loongarch64-linux-gnu-lp64s", .arch = .loongarch64, .abi = .gnusf },
38 .{ .name = "m68k-linux-gnu", .arch = .m68k, .abi = .gnu },
39 .{ .name = "mips-linux-gnu", .arch = .mips, .abi = .gnueabihf },
40 .{ .name = "mips-linux-gnu-soft", .arch = .mips, .abi = .gnueabi },
41 .{ .name = "mipsel-linux-gnu-soft", .arch = .mipsel, .abi = .gnueabi },
42 .{ .name = "mipsel-linux-gnu", .arch = .mipsel, .abi = .gnueabihf },
43 .{ .name = "mips64-linux-gnu-n64", .arch = .mips64, .abi = .gnuabi64 },
44 .{ .name = "mips64-linux-gnu-n32", .arch = .mips64, .abi = .gnuabin32 },
45 .{ .name = "mips64el-linux-gnu-n64", .arch = .mips64el, .abi = .gnuabi64 },
46 .{ .name = "mips64el-linux-gnu-n32", .arch = .mips64el, .abi = .gnuabin32 },
47 .{ .name = "powerpc-linux-gnu-soft", .arch = .powerpc, .abi = .gnueabi },
48 .{ .name = "powerpc-linux-gnu", .arch = .powerpc, .abi = .gnueabihf },
49 .{ .name = "powerpc64-linux-gnu", .arch = .powerpc64, .abi = .gnu },
50 .{ .name = "powerpc64le-linux-gnu", .arch = .powerpc64le, .abi = .gnu },
51 .{ .name = "riscv32-linux-gnu-rv32imafdc-ilp32d", .arch = .riscv32, .abi = .gnu },
52 .{ .name = "riscv64-linux-gnu-rv64imafdc-lp64d", .arch = .riscv64, .abi = .gnu },
53 .{ .name = "s390x-linux-gnu", .arch = .s390x, .abi = .gnu },
54 .{ .name = "sparcv9-linux-gnu", .arch = .sparc, .abi = .gnu },
55 .{ .name = "sparc64-linux-gnu", .arch = .sparc64, .abi = .gnu },
56 .{ .name = "i686-linux-gnu", .arch = .x86, .abi = .gnu },
57 .{ .name = "x86_64-linux-gnu", .arch = .x86_64, .abi = .gnu },
58 .{ .name = "x86_64-linux-gnu-x32", .arch = .x86_64, .abi = .gnux32 },
21759};
21860
21961const musl_targets = [_]LibCTarget{
220 LibCTarget{
221 .name = "aarch64",
222 .arch = MultiArch.aarch64,
223 .abi = MultiAbi.musl,
224 },
225 LibCTarget{
226 .name = "arm",
227 .arch = MultiArch.arm,
228 .abi = MultiAbi.musl,
229 },
230 LibCTarget{
231 .name = "i386",
232 .arch = MultiArch{ .specific = .x86 },
233 .abi = MultiAbi.musl,
234 },
235 LibCTarget{
236 .name = "loongarch64",
237 .arch = MultiArch{ .specific = .loongarch64 },
238 .abi = MultiAbi.musl,
239 },
240 LibCTarget{
241 .name = "mips",
242 .arch = MultiArch.mips,
243 .abi = MultiAbi.musl,
244 },
245 LibCTarget{
246 .name = "mips64",
247 .arch = MultiArch.mips64,
248 .abi = MultiAbi.musl,
249 },
250 LibCTarget{
251 .name = "powerpc",
252 .arch = MultiArch{ .specific = .powerpc },
253 .abi = MultiAbi.musl,
254 },
255 LibCTarget{
256 .name = "powerpc64",
257 .arch = MultiArch.powerpc64,
258 .abi = MultiAbi.musl,
259 },
260 LibCTarget{
261 .name = "riscv32",
262 .arch = MultiArch{ .specific = .riscv32 },
263 .abi = MultiAbi.musl,
264 },
265 LibCTarget{
266 .name = "riscv64",
267 .arch = MultiArch{ .specific = .riscv64 },
268 .abi = MultiAbi.musl,
269 },
270 LibCTarget{
271 .name = "s390x",
272 .arch = MultiArch{ .specific = .s390x },
273 .abi = MultiAbi.musl,
274 },
275 LibCTarget{
276 .name = "x86_64",
277 .arch = MultiArch{ .specific = .x86_64 },
278 .abi = MultiAbi.musl,
279 },
280 LibCTarget{
281 .name = "m68k",
282 .arch = MultiArch{ .specific = .m68k },
283 .abi = MultiAbi{ .specific = .musl },
284 },
62 .{ .name = "arm", .arch = .arm, .abi = .musl },
63 .{ .name = "aarch64", .arch = .aarch64, .abi = .musl },
64 .{ .name = "loongarch64", .arch = .loongarch64, .abi = .musl },
65 .{ .name = "m68k", .arch = .m68k, .abi = .musl },
66 .{ .name = "mips", .arch = .mips, .abi = .musl },
67 .{ .name = "mips64", .arch = .mips64, .abi = .musl },
68 .{ .name = "powerpc", .arch = .powerpc, .abi = .musl },
69 .{ .name = "powerpc64", .arch = .powerpc64, .abi = .musl },
70 .{ .name = "riscv32", .arch = .riscv32, .abi = .musl },
71 .{ .name = "riscv64", .arch = .riscv64, .abi = .musl },
72 .{ .name = "s390x", .arch = .s390x, .abi = .musl },
73 .{ .name = "i386", .arch = .x86, .abi = .musl },
74 .{ .name = "x86_64", .arch = .x86_64, .abi = .musl },
28575};
28676
28777const DestTarget = struct {
288 arch: MultiArch,
78 arch: Arch,
28979 os: OsTag,
29080 abi: Abi,
29181
......@@ -300,7 +90,7 @@ const DestTarget = struct {
30090 pub fn eql(self: @This(), a: DestTarget, b: DestTarget, b_index: usize) bool {
30191 _ = self;
30292 _ = b_index;
303 return a.arch.eql(b.arch) and
93 return a.arch == b.arch and
30494 a.os == b.os and
30595 a.abi == b.abi;
30696 }
......@@ -363,22 +153,16 @@ pub fn main() !void {
363153
364154 const out_dir = opt_out_dir orelse usageAndExit(args[0]);
365155 const abi_name = opt_abi orelse usageAndExit(args[0]);
366 const vendor = if (std.mem.eql(u8, abi_name, "musl"))
367 LibCVendor.musl
368 else if (std.mem.eql(u8, abi_name, "glibc"))
369 LibCVendor.glibc
370 else {
156 const vendor = std.meta.stringToEnum(LibCVendor, abi_name) orelse {
371157 std.debug.print("unrecognized C ABI: {s}\n", .{abi_name});
372158 usageAndExit(args[0]);
373159 };
374 const generic_name = try std.fmt.allocPrint(allocator, "generic-{s}", .{abi_name});
375160
376 // TODO compiler crashed when I wrote this the canonical way
377 var libc_targets: []const LibCTarget = undefined;
378 switch (vendor) {
379 .musl => libc_targets = &musl_targets,
380 .glibc => libc_targets = &glibc_targets,
381 }
161 const generic_name = try std.fmt.allocPrint(allocator, "generic-{s}", .{abi_name});
162 const libc_targets = switch (vendor) {
163 .glibc => &glibc_targets,
164 .musl => &musl_targets,
165 };
382166
383167 var path_table = PathTable.init(allocator);
384168 var hash_to_contents = HashToContents.init(allocator);
......@@ -390,22 +174,15 @@ pub fn main() !void {
390174 for (libc_targets) |libc_target| {
391175 const dest_target = DestTarget{
392176 .arch = libc_target.arch,
393 .abi = switch (vendor) {
394 .musl => .musl,
395 .glibc => libc_target.abi.specific,
396 },
397177 .os = .linux,
178 .abi = libc_target.abi,
398179 };
180
399181 search: for (search_paths.items) |search_path| {
400 var sub_path: []const []const u8 = undefined;
401 switch (vendor) {
402 .musl => {
403 sub_path = &[_][]const u8{ search_path, libc_target.name, "usr", "local", "musl", "include" };
404 },
405 .glibc => {
406 sub_path = &[_][]const u8{ search_path, libc_target.name, "usr", "include" };
407 },
408 }
182 const sub_path = switch (vendor) {
183 .glibc => &[_][]const u8{ search_path, libc_target.name, "usr", "include" },
184 .musl => &[_][]const u8{ search_path, libc_target.name, "usr", "local", "musl", "include" },
185 };
409186 const target_include_dir = try std.fs.path.join(allocator, sub_path);
410187 var dir_stack = std.ArrayList([]const u8).init(allocator);
411188 try dir_stack.append(target_include_dir);
......@@ -515,12 +292,8 @@ pub fn main() !void {
515292 if (contents.is_generic) continue;
516293
517294 const dest_target = hash_kv.key_ptr.*;
518 const arch_name = switch (dest_target.arch) {
519 .specific => |a| @tagName(a),
520 else => @tagName(dest_target.arch),
521 };
522295 const out_subpath = try std.fmt.allocPrint(allocator, "{s}-{s}-{s}", .{
523 arch_name,
296 @tagName(dest_target.arch),
524297 @tagName(dest_target.os),
525298 @tagName(dest_target.abi),
526299 });