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;...@@ -19,273 +19,63 @@ const Blake3 = std.crypto.hash.Blake3;
1919
20const LibCTarget = struct {20const LibCTarget = struct {
21 name: []const u8,21 name: []const u8,
22 arch: MultiArch,22 arch: Arch,
23 abi: MultiAbi,23 abi: Abi,
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 }
54};24};
5525
56const glibc_targets = [_]LibCTarget{26const glibc_targets = [_]LibCTarget{
57 LibCTarget{27 .{ .name = "arc-linux-gnu", .arch = .arc, .abi = .gnu },
58 .name = "aarch64_be-linux-gnu",28 .{ .name = "arm-linux-gnueabi", .arch = .arm, .abi = .gnueabi },
59 .arch = MultiArch{ .specific = Arch.aarch64_be },29 .{ .name = "arm-linux-gnueabihf", .arch = .arm, .abi = .gnueabihf },
60 .abi = MultiAbi{ .specific = Abi.gnu },30 .{ .name = "armeb-linux-gnueabi", .arch = .armeb, .abi = .gnueabi },
61 },31 .{ .name = "armeb-linux-gnueabihf", .arch = .armeb, .abi = .gnueabihf },
62 LibCTarget{32 .{ .name = "aarch64-linux-gnu", .arch = .aarch64, .abi = .gnu },
63 .name = "aarch64-linux-gnu",33 .{ .name = "aarch64_be-linux-gnu", .arch = .aarch64_be, .abi = .gnu },
64 .arch = MultiArch{ .specific = Arch.aarch64 },34 .{ .name = "csky-linux-gnuabiv2-soft", .arch = .csky, .abi = .gnueabi },
65 .abi = MultiAbi{ .specific = Abi.gnu },35 .{ .name = "csky-linux-gnuabiv2", .arch = .csky, .abi = .gnueabihf },
66 },36 .{ .name = "loongarch64-linux-gnu-lp64d", .arch = .loongarch64, .abi = .gnu },
67 LibCTarget{37 .{ .name = "loongarch64-linux-gnu-lp64s", .arch = .loongarch64, .abi = .gnusf },
68 .name = "armeb-linux-gnueabi",38 .{ .name = "m68k-linux-gnu", .arch = .m68k, .abi = .gnu },
69 .arch = MultiArch{ .specific = Arch.armeb },39 .{ .name = "mips-linux-gnu", .arch = .mips, .abi = .gnueabihf },
70 .abi = MultiAbi{ .specific = Abi.gnueabi },40 .{ .name = "mips-linux-gnu-soft", .arch = .mips, .abi = .gnueabi },
71 },41 .{ .name = "mipsel-linux-gnu-soft", .arch = .mipsel, .abi = .gnueabi },
72 LibCTarget{42 .{ .name = "mipsel-linux-gnu", .arch = .mipsel, .abi = .gnueabihf },
73 .name = "armeb-linux-gnueabihf",43 .{ .name = "mips64-linux-gnu-n64", .arch = .mips64, .abi = .gnuabi64 },
74 .arch = MultiArch{ .specific = Arch.armeb },44 .{ .name = "mips64-linux-gnu-n32", .arch = .mips64, .abi = .gnuabin32 },
75 .abi = MultiAbi{ .specific = Abi.gnueabihf },45 .{ .name = "mips64el-linux-gnu-n64", .arch = .mips64el, .abi = .gnuabi64 },
76 },46 .{ .name = "mips64el-linux-gnu-n32", .arch = .mips64el, .abi = .gnuabin32 },
77 LibCTarget{47 .{ .name = "powerpc-linux-gnu-soft", .arch = .powerpc, .abi = .gnueabi },
78 .name = "arm-linux-gnueabi",48 .{ .name = "powerpc-linux-gnu", .arch = .powerpc, .abi = .gnueabihf },
79 .arch = MultiArch{ .specific = Arch.arm },49 .{ .name = "powerpc64-linux-gnu", .arch = .powerpc64, .abi = .gnu },
80 .abi = MultiAbi{ .specific = Abi.gnueabi },50 .{ .name = "powerpc64le-linux-gnu", .arch = .powerpc64le, .abi = .gnu },
81 },51 .{ .name = "riscv32-linux-gnu-rv32imafdc-ilp32d", .arch = .riscv32, .abi = .gnu },
82 LibCTarget{52 .{ .name = "riscv64-linux-gnu-rv64imafdc-lp64d", .arch = .riscv64, .abi = .gnu },
83 .name = "arm-linux-gnueabihf",53 .{ .name = "s390x-linux-gnu", .arch = .s390x, .abi = .gnu },
84 .arch = MultiArch{ .specific = Arch.arm },54 .{ .name = "sparcv9-linux-gnu", .arch = .sparc, .abi = .gnu },
85 .abi = MultiAbi{ .specific = Abi.gnueabihf },55 .{ .name = "sparc64-linux-gnu", .arch = .sparc64, .abi = .gnu },
86 },56 .{ .name = "i686-linux-gnu", .arch = .x86, .abi = .gnu },
87 LibCTarget{57 .{ .name = "x86_64-linux-gnu", .arch = .x86_64, .abi = .gnu },
88 .name = "arc-linux-gnu",58 .{ .name = "x86_64-linux-gnu-x32", .arch = .x86_64, .abi = .gnux32 },
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 },
217};59};
21860
219const musl_targets = [_]LibCTarget{61const musl_targets = [_]LibCTarget{
220 LibCTarget{62 .{ .name = "arm", .arch = .arm, .abi = .musl },
221 .name = "aarch64",63 .{ .name = "aarch64", .arch = .aarch64, .abi = .musl },
222 .arch = MultiArch.aarch64,64 .{ .name = "loongarch64", .arch = .loongarch64, .abi = .musl },
223 .abi = MultiAbi.musl,65 .{ .name = "m68k", .arch = .m68k, .abi = .musl },
224 },66 .{ .name = "mips", .arch = .mips, .abi = .musl },
225 LibCTarget{67 .{ .name = "mips64", .arch = .mips64, .abi = .musl },
226 .name = "arm",68 .{ .name = "powerpc", .arch = .powerpc, .abi = .musl },
227 .arch = MultiArch.arm,69 .{ .name = "powerpc64", .arch = .powerpc64, .abi = .musl },
228 .abi = MultiAbi.musl,70 .{ .name = "riscv32", .arch = .riscv32, .abi = .musl },
229 },71 .{ .name = "riscv64", .arch = .riscv64, .abi = .musl },
230 LibCTarget{72 .{ .name = "s390x", .arch = .s390x, .abi = .musl },
231 .name = "i386",73 .{ .name = "i386", .arch = .x86, .abi = .musl },
232 .arch = MultiArch{ .specific = .x86 },74 .{ .name = "x86_64", .arch = .x86_64, .abi = .musl },
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 },
285};75};
28676
287const DestTarget = struct {77const DestTarget = struct {
288 arch: MultiArch,78 arch: Arch,
289 os: OsTag,79 os: OsTag,
290 abi: Abi,80 abi: Abi,
29181
...@@ -300,7 +90,7 @@ const DestTarget = struct {...@@ -300,7 +90,7 @@ const DestTarget = struct {
300 pub fn eql(self: @This(), a: DestTarget, b: DestTarget, b_index: usize) bool {90 pub fn eql(self: @This(), a: DestTarget, b: DestTarget, b_index: usize) bool {
301 _ = self;91 _ = self;
302 _ = b_index;92 _ = b_index;
303 return a.arch.eql(b.arch) and93 return a.arch == b.arch and
304 a.os == b.os and94 a.os == b.os and
305 a.abi == b.abi;95 a.abi == b.abi;
306 }96 }
...@@ -363,22 +153,16 @@ pub fn main() !void {...@@ -363,22 +153,16 @@ pub fn main() !void {
363153
364 const out_dir = opt_out_dir orelse usageAndExit(args[0]);154 const out_dir = opt_out_dir orelse usageAndExit(args[0]);
365 const abi_name = opt_abi orelse usageAndExit(args[0]);155 const abi_name = opt_abi orelse usageAndExit(args[0]);
366 const vendor = if (std.mem.eql(u8, abi_name, "musl"))156 const vendor = std.meta.stringToEnum(LibCVendor, abi_name) orelse {
367 LibCVendor.musl
368 else if (std.mem.eql(u8, abi_name, "glibc"))
369 LibCVendor.glibc
370 else {
371 std.debug.print("unrecognized C ABI: {s}\n", .{abi_name});157 std.debug.print("unrecognized C ABI: {s}\n", .{abi_name});
372 usageAndExit(args[0]);158 usageAndExit(args[0]);
373 };159 };
374 const generic_name = try std.fmt.allocPrint(allocator, "generic-{s}", .{abi_name});
375160
376 // TODO compiler crashed when I wrote this the canonical way161 const generic_name = try std.fmt.allocPrint(allocator, "generic-{s}", .{abi_name});
377 var libc_targets: []const LibCTarget = undefined;162 const libc_targets = switch (vendor) {
378 switch (vendor) {163 .glibc => &glibc_targets,
379 .musl => libc_targets = &musl_targets,164 .musl => &musl_targets,
380 .glibc => libc_targets = &glibc_targets,165 };
381 }
382166
383 var path_table = PathTable.init(allocator);167 var path_table = PathTable.init(allocator);
384 var hash_to_contents = HashToContents.init(allocator);168 var hash_to_contents = HashToContents.init(allocator);
...@@ -390,22 +174,15 @@ pub fn main() !void {...@@ -390,22 +174,15 @@ pub fn main() !void {
390 for (libc_targets) |libc_target| {174 for (libc_targets) |libc_target| {
391 const dest_target = DestTarget{175 const dest_target = DestTarget{
392 .arch = libc_target.arch,176 .arch = libc_target.arch,
393 .abi = switch (vendor) {
394 .musl => .musl,
395 .glibc => libc_target.abi.specific,
396 },
397 .os = .linux,177 .os = .linux,
178 .abi = libc_target.abi,
398 };179 };
180
399 search: for (search_paths.items) |search_path| {181 search: for (search_paths.items) |search_path| {
400 var sub_path: []const []const u8 = undefined;182 const sub_path = switch (vendor) {
401 switch (vendor) {183 .glibc => &[_][]const u8{ search_path, libc_target.name, "usr", "include" },
402 .musl => {184 .musl => &[_][]const u8{ search_path, libc_target.name, "usr", "local", "musl", "include" },
403 sub_path = &[_][]const u8{ search_path, libc_target.name, "usr", "local", "musl", "include" };185 };
404 },
405 .glibc => {
406 sub_path = &[_][]const u8{ search_path, libc_target.name, "usr", "include" };
407 },
408 }
409 const target_include_dir = try std.fs.path.join(allocator, sub_path);186 const target_include_dir = try std.fs.path.join(allocator, sub_path);
410 var dir_stack = std.ArrayList([]const u8).init(allocator);187 var dir_stack = std.ArrayList([]const u8).init(allocator);
411 try dir_stack.append(target_include_dir);188 try dir_stack.append(target_include_dir);
...@@ -515,12 +292,8 @@ pub fn main() !void {...@@ -515,12 +292,8 @@ pub fn main() !void {
515 if (contents.is_generic) continue;292 if (contents.is_generic) continue;
516293
517 const dest_target = hash_kv.key_ptr.*;294 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 };
522 const out_subpath = try std.fmt.allocPrint(allocator, "{s}-{s}-{s}", .{295 const out_subpath = try std.fmt.allocPrint(allocator, "{s}-{s}-{s}", .{
523 arch_name,296 @tagName(dest_target.arch),
524 @tagName(dest_target.os),297 @tagName(dest_target.os),
525 @tagName(dest_target.abi),298 @tagName(dest_target.abi),
526 });299 });