authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-11-28 21:56:45+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-11-28 22:04:00+01:00
log78b8ce5095abf6516dc414b8cf487acedbd0ce99
tree3d3abfc33595667d5645a9e34ee76c0f3d8fb665
parent0bf054f4c54d23678939828a5b72627ce4d27e94
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

test: Change llvm_targets to actually emit an object for each target.

Without doing this, we don't actually test whether the data layout string we generate matches LLVM's. A number of targets had to be commented out due to this change: * Some are using a non-working experimental LLVM backend (arc, csky, ...). * Some don't have working LLD support (lanai, sparc, ...). * Some don't have working self-hosted linker support (nvptx). * Some are using ABIs that haven't been standardized (loongarch32). Finally, all non-x86 uefi targets are hopelessly broken and can't really be fixed until we change our emit logic to lower *-uefi-* verbatim rather than to *-windows-*. See: https://github.com/ziglang/zig/issues/21630

2 files changed, 49 insertions(+), 65 deletions(-)

test/llvm_targets.zig+48-48
...@@ -42,12 +42,12 @@ const targets = [_]std.Target.Query{...@@ -42,12 +42,12 @@ const targets = [_]std.Target.Query{
42 .{ .cpu_arch = .aarch64_be, .os_tag = .netbsd, .abi = .none },42 .{ .cpu_arch = .aarch64_be, .os_tag = .netbsd, .abi = .none },
4343
44 .{ .cpu_arch = .amdgcn, .os_tag = .amdhsa, .abi = .none },44 .{ .cpu_arch = .amdgcn, .os_tag = .amdhsa, .abi = .none },
45 .{ .cpu_arch = .amdgcn, .os_tag = .amdpal, .abi = .none },45 // .{ .cpu_arch = .amdgcn, .os_tag = .amdpal, .abi = .none },
46 .{ .cpu_arch = .amdgcn, .os_tag = .mesa3d, .abi = .none },46 // .{ .cpu_arch = .amdgcn, .os_tag = .mesa3d, .abi = .none },
4747
48 .{ .cpu_arch = .arc, .os_tag = .freestanding, .abi = .none },48 // .{ .cpu_arch = .arc, .os_tag = .freestanding, .abi = .none },
49 .{ .cpu_arch = .arc, .os_tag = .linux, .abi = .gnu },49 // .{ .cpu_arch = .arc, .os_tag = .linux, .abi = .gnu },
50 .{ .cpu_arch = .arc, .os_tag = .linux, .abi = .none },50 // .{ .cpu_arch = .arc, .os_tag = .linux, .abi = .none },
5151
52 .{ .cpu_arch = .arm, .os_tag = .freebsd, .abi = .eabi },52 .{ .cpu_arch = .arm, .os_tag = .freebsd, .abi = .eabi },
53 .{ .cpu_arch = .arm, .os_tag = .freebsd, .abi = .eabihf },53 .{ .cpu_arch = .arm, .os_tag = .freebsd, .abi = .eabihf },
...@@ -69,8 +69,8 @@ const targets = [_]std.Target.Query{...@@ -69,8 +69,8 @@ const targets = [_]std.Target.Query{
69 .{ .cpu_arch = .arm, .os_tag = .openbsd, .abi = .eabihf },69 .{ .cpu_arch = .arm, .os_tag = .openbsd, .abi = .eabihf },
70 .{ .cpu_arch = .arm, .os_tag = .rtems, .abi = .eabi },70 .{ .cpu_arch = .arm, .os_tag = .rtems, .abi = .eabi },
71 .{ .cpu_arch = .arm, .os_tag = .rtems, .abi = .eabihf },71 .{ .cpu_arch = .arm, .os_tag = .rtems, .abi = .eabihf },
72 .{ .cpu_arch = .arm, .os_tag = .uefi, .abi = .eabi },72 // .{ .cpu_arch = .arm, .os_tag = .uefi, .abi = .eabi },
73 .{ .cpu_arch = .arm, .os_tag = .uefi, .abi = .eabihf },73 // .{ .cpu_arch = .arm, .os_tag = .uefi, .abi = .eabihf },
7474
75 .{ .cpu_arch = .armeb, .os_tag = .freebsd, .abi = .eabi },75 .{ .cpu_arch = .armeb, .os_tag = .freebsd, .abi = .eabi },
76 .{ .cpu_arch = .armeb, .os_tag = .freebsd, .abi = .eabihf },76 .{ .cpu_arch = .armeb, .os_tag = .freebsd, .abi = .eabihf },
...@@ -94,37 +94,37 @@ const targets = [_]std.Target.Query{...@@ -94,37 +94,37 @@ const targets = [_]std.Target.Query{
9494
95 .{ .cpu_arch = .bpfel, .os_tag = .freestanding, .abi = .none },95 .{ .cpu_arch = .bpfel, .os_tag = .freestanding, .abi = .none },
9696
97 .{ .cpu_arch = .csky, .os_tag = .freestanding, .abi = .eabi },97 // .{ .cpu_arch = .csky, .os_tag = .freestanding, .abi = .eabi },
98 .{ .cpu_arch = .csky, .os_tag = .freestanding, .abi = .eabihf },98 // .{ .cpu_arch = .csky, .os_tag = .freestanding, .abi = .eabihf },
99 .{ .cpu_arch = .csky, .os_tag = .linux, .abi = .eabi },99 // .{ .cpu_arch = .csky, .os_tag = .linux, .abi = .eabi },
100 .{ .cpu_arch = .csky, .os_tag = .linux, .abi = .eabihf },100 // .{ .cpu_arch = .csky, .os_tag = .linux, .abi = .eabihf },
101 .{ .cpu_arch = .csky, .os_tag = .linux, .abi = .gnueabi },101 // .{ .cpu_arch = .csky, .os_tag = .linux, .abi = .gnueabi },
102 .{ .cpu_arch = .csky, .os_tag = .linux, .abi = .gnueabihf },102 // .{ .cpu_arch = .csky, .os_tag = .linux, .abi = .gnueabihf },
103103
104 .{ .cpu_arch = .hexagon, .os_tag = .freestanding, .abi = .none },104 .{ .cpu_arch = .hexagon, .os_tag = .freestanding, .abi = .none },
105 .{ .cpu_arch = .hexagon, .os_tag = .linux, .abi = .none },105 .{ .cpu_arch = .hexagon, .os_tag = .linux, .abi = .none },
106106
107 .{ .cpu_arch = .lanai, .os_tag = .freestanding, .abi = .none },107 // .{ .cpu_arch = .lanai, .os_tag = .freestanding, .abi = .none },
108108
109 .{ .cpu_arch = .loongarch32, .os_tag = .freestanding, .abi = .none },109 // .{ .cpu_arch = .loongarch32, .os_tag = .freestanding, .abi = .none },
110 .{ .cpu_arch = .loongarch32, .os_tag = .linux, .abi = .none },110 // .{ .cpu_arch = .loongarch32, .os_tag = .linux, .abi = .none },
111 .{ .cpu_arch = .loongarch32, .os_tag = .uefi, .abi = .none },111 // .{ .cpu_arch = .loongarch32, .os_tag = .uefi, .abi = .none },
112112
113 .{ .cpu_arch = .loongarch64, .os_tag = .freestanding, .abi = .none },113 .{ .cpu_arch = .loongarch64, .os_tag = .freestanding, .abi = .none },
114 .{ .cpu_arch = .loongarch64, .os_tag = .linux, .abi = .gnu },114 .{ .cpu_arch = .loongarch64, .os_tag = .linux, .abi = .gnu },
115 .{ .cpu_arch = .loongarch64, .os_tag = .linux, .abi = .gnuf32 },115 // .{ .cpu_arch = .loongarch64, .os_tag = .linux, .abi = .gnuf32 },
116 .{ .cpu_arch = .loongarch64, .os_tag = .linux, .abi = .gnusf },116 .{ .cpu_arch = .loongarch64, .os_tag = .linux, .abi = .gnusf },
117 .{ .cpu_arch = .loongarch64, .os_tag = .linux, .abi = .musl },117 .{ .cpu_arch = .loongarch64, .os_tag = .linux, .abi = .musl },
118 .{ .cpu_arch = .loongarch64, .os_tag = .linux, .abi = .none },118 .{ .cpu_arch = .loongarch64, .os_tag = .linux, .abi = .none },
119 .{ .cpu_arch = .loongarch64, .os_tag = .uefi, .abi = .none },119 // .{ .cpu_arch = .loongarch64, .os_tag = .uefi, .abi = .none },
120120
121 .{ .cpu_arch = .m68k, .os_tag = .freestanding, .abi = .none },121 // .{ .cpu_arch = .m68k, .os_tag = .freestanding, .abi = .none },
122 .{ .cpu_arch = .m68k, .os_tag = .haiku, .abi = .none },122 // .{ .cpu_arch = .m68k, .os_tag = .haiku, .abi = .none },
123 .{ .cpu_arch = .m68k, .os_tag = .linux, .abi = .gnu },123 // .{ .cpu_arch = .m68k, .os_tag = .linux, .abi = .gnu },
124 .{ .cpu_arch = .m68k, .os_tag = .linux, .abi = .musl },124 // .{ .cpu_arch = .m68k, .os_tag = .linux, .abi = .musl },
125 .{ .cpu_arch = .m68k, .os_tag = .linux, .abi = .none },125 // .{ .cpu_arch = .m68k, .os_tag = .linux, .abi = .none },
126 .{ .cpu_arch = .m68k, .os_tag = .netbsd, .abi = .none },126 // .{ .cpu_arch = .m68k, .os_tag = .netbsd, .abi = .none },
127 .{ .cpu_arch = .m68k, .os_tag = .rtems, .abi = .none },127 // .{ .cpu_arch = .m68k, .os_tag = .rtems, .abi = .none },
128128
129 .{ .cpu_arch = .mips, .os_tag = .freebsd, .abi = .eabi },129 .{ .cpu_arch = .mips, .os_tag = .freebsd, .abi = .eabi },
130 .{ .cpu_arch = .mips, .os_tag = .freebsd, .abi = .eabihf },130 .{ .cpu_arch = .mips, .os_tag = .freebsd, .abi = .eabihf },
...@@ -178,12 +178,12 @@ const targets = [_]std.Target.Query{...@@ -178,12 +178,12 @@ const targets = [_]std.Target.Query{
178178
179 .{ .cpu_arch = .msp430, .os_tag = .freestanding, .abi = .none },179 .{ .cpu_arch = .msp430, .os_tag = .freestanding, .abi = .none },
180180
181 .{ .cpu_arch = .nvptx, .os_tag = .cuda, .abi = .none },181 // .{ .cpu_arch = .nvptx, .os_tag = .cuda, .abi = .none },
182 .{ .cpu_arch = .nvptx, .os_tag = .nvcl, .abi = .none },182 // .{ .cpu_arch = .nvptx, .os_tag = .nvcl, .abi = .none },
183 .{ .cpu_arch = .nvptx64, .os_tag = .cuda, .abi = .none },183 // .{ .cpu_arch = .nvptx64, .os_tag = .cuda, .abi = .none },
184 .{ .cpu_arch = .nvptx64, .os_tag = .nvcl, .abi = .none },184 // .{ .cpu_arch = .nvptx64, .os_tag = .nvcl, .abi = .none },
185185
186 .{ .cpu_arch = .powerpc, .os_tag = .aix, .abi = .eabihf },186 // .{ .cpu_arch = .powerpc, .os_tag = .aix, .abi = .eabihf },
187 .{ .cpu_arch = .powerpc, .os_tag = .freebsd, .abi = .eabi },187 .{ .cpu_arch = .powerpc, .os_tag = .freebsd, .abi = .eabi },
188 .{ .cpu_arch = .powerpc, .os_tag = .freebsd, .abi = .eabihf },188 .{ .cpu_arch = .powerpc, .os_tag = .freebsd, .abi = .eabihf },
189 .{ .cpu_arch = .powerpc, .os_tag = .freestanding, .abi = .eabi },189 .{ .cpu_arch = .powerpc, .os_tag = .freestanding, .abi = .eabi },
...@@ -206,7 +206,7 @@ const targets = [_]std.Target.Query{...@@ -206,7 +206,7 @@ const targets = [_]std.Target.Query{
206 .{ .cpu_arch = .powerpcle, .os_tag = .freestanding, .abi = .eabi },206 .{ .cpu_arch = .powerpcle, .os_tag = .freestanding, .abi = .eabi },
207 .{ .cpu_arch = .powerpcle, .os_tag = .freestanding, .abi = .eabihf },207 .{ .cpu_arch = .powerpcle, .os_tag = .freestanding, .abi = .eabihf },
208208
209 .{ .cpu_arch = .powerpc64, .os_tag = .aix, .abi = .none },209 // .{ .cpu_arch = .powerpc64, .os_tag = .aix, .abi = .none },
210 .{ .cpu_arch = .powerpc64, .os_tag = .freebsd, .abi = .none },210 .{ .cpu_arch = .powerpc64, .os_tag = .freebsd, .abi = .none },
211 .{ .cpu_arch = .powerpc64, .os_tag = .freestanding, .abi = .none },211 .{ .cpu_arch = .powerpc64, .os_tag = .freestanding, .abi = .none },
212 .{ .cpu_arch = .powerpc64, .os_tag = .linux, .abi = .gnu },212 .{ .cpu_arch = .powerpc64, .os_tag = .linux, .abi = .gnu },
...@@ -226,7 +226,7 @@ const targets = [_]std.Target.Query{...@@ -226,7 +226,7 @@ const targets = [_]std.Target.Query{
226 .{ .cpu_arch = .riscv32, .os_tag = .linux, .abi = .musl },226 .{ .cpu_arch = .riscv32, .os_tag = .linux, .abi = .musl },
227 .{ .cpu_arch = .riscv32, .os_tag = .linux, .abi = .none },227 .{ .cpu_arch = .riscv32, .os_tag = .linux, .abi = .none },
228 .{ .cpu_arch = .riscv32, .os_tag = .rtems, .abi = .none },228 .{ .cpu_arch = .riscv32, .os_tag = .rtems, .abi = .none },
229 .{ .cpu_arch = .riscv32, .os_tag = .uefi, .abi = .none },229 // .{ .cpu_arch = .riscv32, .os_tag = .uefi, .abi = .none },
230230
231 .{ .cpu_arch = .riscv64, .os_tag = .freebsd, .abi = .none },231 .{ .cpu_arch = .riscv64, .os_tag = .freebsd, .abi = .none },
232 .{ .cpu_arch = .riscv64, .os_tag = .freestanding, .abi = .none },232 .{ .cpu_arch = .riscv64, .os_tag = .freestanding, .abi = .none },
...@@ -241,20 +241,20 @@ const targets = [_]std.Target.Query{...@@ -241,20 +241,20 @@ const targets = [_]std.Target.Query{
241 .{ .cpu_arch = .riscv64, .os_tag = .openbsd, .abi = .none },241 .{ .cpu_arch = .riscv64, .os_tag = .openbsd, .abi = .none },
242 .{ .cpu_arch = .riscv64, .os_tag = .rtems, .abi = .none },242 .{ .cpu_arch = .riscv64, .os_tag = .rtems, .abi = .none },
243 .{ .cpu_arch = .riscv64, .os_tag = .serenity, .abi = .none },243 .{ .cpu_arch = .riscv64, .os_tag = .serenity, .abi = .none },
244 .{ .cpu_arch = .riscv64, .os_tag = .uefi, .abi = .none },244 // .{ .cpu_arch = .riscv64, .os_tag = .uefi, .abi = .none },
245245
246 .{ .cpu_arch = .s390x, .os_tag = .freestanding, .abi = .none },246 .{ .cpu_arch = .s390x, .os_tag = .freestanding, .abi = .none },
247 .{ .cpu_arch = .s390x, .os_tag = .linux, .abi = .gnu },247 .{ .cpu_arch = .s390x, .os_tag = .linux, .abi = .gnu },
248 .{ .cpu_arch = .s390x, .os_tag = .linux, .abi = .none },248 .{ .cpu_arch = .s390x, .os_tag = .linux, .abi = .none },
249 .{ .cpu_arch = .s390x, .os_tag = .zos, .abi = .none },249 // .{ .cpu_arch = .s390x, .os_tag = .zos, .abi = .none },
250250
251 .{ .cpu_arch = .sparc, .os_tag = .freestanding, .abi = .none },251 // .{ .cpu_arch = .sparc, .os_tag = .freestanding, .abi = .none },
252 .{ .cpu_arch = .sparc, .os_tag = .illumos, .abi = .none },252 // .{ .cpu_arch = .sparc, .os_tag = .illumos, .abi = .none },
253 .{ .cpu_arch = .sparc, .os_tag = .linux, .abi = .gnu },253 // .{ .cpu_arch = .sparc, .os_tag = .linux, .abi = .gnu },
254 .{ .cpu_arch = .sparc, .os_tag = .linux, .abi = .none },254 // .{ .cpu_arch = .sparc, .os_tag = .linux, .abi = .none },
255 .{ .cpu_arch = .sparc, .os_tag = .netbsd, .abi = .none },255 // .{ .cpu_arch = .sparc, .os_tag = .netbsd, .abi = .none },
256 .{ .cpu_arch = .sparc, .os_tag = .rtems, .abi = .none },256 // .{ .cpu_arch = .sparc, .os_tag = .rtems, .abi = .none },
257 .{ .cpu_arch = .sparc, .os_tag = .solaris, .abi = .none },257 // .{ .cpu_arch = .sparc, .os_tag = .solaris, .abi = .none },
258258
259 .{ .cpu_arch = .sparc64, .os_tag = .freebsd, .abi = .none },259 .{ .cpu_arch = .sparc64, .os_tag = .freebsd, .abi = .none },
260 .{ .cpu_arch = .sparc64, .os_tag = .freestanding, .abi = .none },260 .{ .cpu_arch = .sparc64, .os_tag = .freestanding, .abi = .none },
...@@ -301,8 +301,8 @@ const targets = [_]std.Target.Query{...@@ -301,8 +301,8 @@ const targets = [_]std.Target.Query{
301 .{ .cpu_arch = .thumbeb, .os_tag = .rtems, .abi = .eabi },301 .{ .cpu_arch = .thumbeb, .os_tag = .rtems, .abi = .eabi },
302 .{ .cpu_arch = .thumbeb, .os_tag = .rtems, .abi = .eabihf },302 .{ .cpu_arch = .thumbeb, .os_tag = .rtems, .abi = .eabihf },
303303
304 .{ .cpu_arch = .ve, .os_tag = .freestanding, .abi = .none },304 // .{ .cpu_arch = .ve, .os_tag = .freestanding, .abi = .none },
305 .{ .cpu_arch = .ve, .os_tag = .linux, .abi = .none },305 // .{ .cpu_arch = .ve, .os_tag = .linux, .abi = .none },
306306
307 .{ .cpu_arch = .wasm32, .os_tag = .emscripten, .abi = .none },307 .{ .cpu_arch = .wasm32, .os_tag = .emscripten, .abi = .none },
308 .{ .cpu_arch = .wasm32, .os_tag = .freestanding, .abi = .none },308 .{ .cpu_arch = .wasm32, .os_tag = .freestanding, .abi = .none },
...@@ -374,10 +374,10 @@ const targets = [_]std.Target.Query{...@@ -374,10 +374,10 @@ const targets = [_]std.Target.Query{
374 .{ .cpu_arch = .x86_64, .os_tag = .windows, .abi = .itanium },374 .{ .cpu_arch = .x86_64, .os_tag = .windows, .abi = .itanium },
375 .{ .cpu_arch = .x86_64, .os_tag = .windows, .abi = .msvc },375 .{ .cpu_arch = .x86_64, .os_tag = .windows, .abi = .msvc },
376376
377 .{ .cpu_arch = .xcore, .os_tag = .freestanding, .abi = .none },377 // .{ .cpu_arch = .xcore, .os_tag = .freestanding, .abi = .none },
378378
379 .{ .cpu_arch = .xtensa, .os_tag = .freestanding, .abi = .none },379 // .{ .cpu_arch = .xtensa, .os_tag = .freestanding, .abi = .none },
380 .{ .cpu_arch = .xtensa, .os_tag = .linux, .abi = .none },380 // .{ .cpu_arch = .xtensa, .os_tag = .linux, .abi = .none },
381};381};
382382
383pub fn addCases(383pub fn addCases(
...@@ -394,7 +394,7 @@ pub fn addCases(...@@ -394,7 +394,7 @@ pub fn addCases(
394 .xtensa => if (!build_options.llvm_has_xtensa) continue,394 .xtensa => if (!build_options.llvm_has_xtensa) continue,
395 else => {},395 else => {},
396 };396 };
397 var case = ctx.noEmitUsingLlvmBackend("llvm_targets", b.resolveTargetQuery(target_query));397 var case = ctx.addObjLlvm("llvm_targets", b.resolveTargetQuery(target_query));
398 case.addCompile("");398 case.addCompile("");
399 }399 }
400}400}
test/src/Cases.zig+1-17
...@@ -204,34 +204,18 @@ pub fn exeFromCompiledC(ctx: *Cases, name: []const u8, target_query: std.Target....@@ -204,34 +204,18 @@ pub fn exeFromCompiledC(ctx: *Cases, name: []const u8, target_query: std.Target.
204 return &ctx.cases.items[ctx.cases.items.len - 1];204 return &ctx.cases.items[ctx.cases.items.len - 1];
205}205}
206206
207pub fn noEmitUsingLlvmBackend(ctx: *Cases, name: []const u8, target: std.Build.ResolvedTarget) *Case {207pub fn addObjLlvm(ctx: *Cases, name: []const u8, target: std.Build.ResolvedTarget) *Case {
208 ctx.cases.append(Case{208 ctx.cases.append(Case{
209 .name = name,209 .name = name,
210 .target = target,210 .target = target,
211 .updates = std.ArrayList(Update).init(ctx.cases.allocator),211 .updates = std.ArrayList(Update).init(ctx.cases.allocator),
212 .output_mode = .Obj,212 .output_mode = .Obj,
213 .emit_bin = false,
214 .deps = std.ArrayList(DepModule).init(ctx.arena),213 .deps = std.ArrayList(DepModule).init(ctx.arena),
215 .backend = .llvm,214 .backend = .llvm,
216 }) catch @panic("out of memory");215 }) catch @panic("out of memory");
217 return &ctx.cases.items[ctx.cases.items.len - 1];216 return &ctx.cases.items[ctx.cases.items.len - 1];
218}217}
219218
220/// Adds a test case that uses the LLVM backend to emit an executable.
221/// Currently this implies linking libc, because only then we can generate a testable executable.
222pub fn exeUsingLlvmBackend(ctx: *Cases, name: []const u8, target: std.Build.ResolvedTarget) *Case {
223 ctx.cases.append(Case{
224 .name = name,
225 .target = target,
226 .updates = std.ArrayList(Update).init(ctx.cases.allocator),
227 .output_mode = .Exe,
228 .deps = std.ArrayList(DepModule).init(ctx.arena),
229 .backend = .llvm,
230 .link_libc = true,
231 }) catch @panic("out of memory");
232 return &ctx.cases.items[ctx.cases.items.len - 1];
233}
234
235pub fn addObj(219pub fn addObj(
236 ctx: *Cases,220 ctx: *Cases,
237 name: []const u8,221 name: []const u8,