@@ -21,41 +21,42 @@ const Blake3 = std.crypto.hash.Blake3;
21
21
const LibCTarget = struct {
22
22
arch : Arch ,
23
23
abi : Abi ,
24
+ dest : ? []const u8 = null ,
24
25
};
25
26
26
27
const glibc_targets = [_ ]LibCTarget {
27
28
.{ .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" },
38
39
.{ .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" },
53
54
.{ .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" },
59
60
};
60
61
61
62
const musl_targets = [_ ]LibCTarget {
@@ -88,43 +89,20 @@ const freebsd_targets = [_]LibCTarget{
88
89
};
89
90
90
91
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" },
93
94
.{ .arch = .aarch64 , .abi = .none },
94
95
.{ .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" },
99
100
.{ .arch = .sparc , .abi = .none },
100
101
.{ .arch = .sparc64 , .abi = .none },
101
102
.{ .arch = .x86 , .abi = .none },
102
103
.{ .arch = .x86_64 , .abi = .none },
103
104
};
104
105
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
-
128
106
const Contents = struct {
129
107
bytes : []const u8 ,
130
108
hit_count : usize ,
@@ -138,7 +116,7 @@ const Contents = struct {
138
116
};
139
117
140
118
const HashToContents = std .StringHashMap (Contents );
141
- const TargetToHash = std .ArrayHashMap ( DestTarget , []const u8 , DestTarget . HashContext , true );
119
+ const TargetToHash = std .StringArrayHashMap ( []const u8 );
142
120
const PathTable = std .StringHashMap (* TargetToHash );
143
121
144
122
const LibCVendor = enum {
@@ -236,15 +214,16 @@ pub fn main() !void {
236
214
else = > unreachable ,
237
215
},
238
216
};
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" ,
245
224
},
246
- . abi = libc_target .abi ,
247
- };
225
+ @tagName ( libc_target .abi ) ,
226
+ }) ;
248
227
249
228
search : for (search_paths .items ) | search_path | {
250
229
const sub_path = switch (vendor ) {
@@ -307,7 +286,21 @@ pub fn main() !void {
307
286
path_gop .value_ptr .* = ptr ;
308
287
break :blk ptr ;
309
288
};
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
+ }
311
304
},
312
305
else = > std .debug .print ("warning: weird file: {s}\n " , .{full_path }),
313
306
}
@@ -363,12 +356,7 @@ pub fn main() !void {
363
356
if (contents .is_generic ) continue ;
364
357
365
358
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 .* });
372
360
try std .fs .cwd ().makePath (std .fs .path .dirname (full_path ).? );
373
361
try std .fs .cwd ().writeFile (.{ .sub_path = full_path , .data = contents .bytes });
374
362
}
0 commit comments