authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-02-26 15:51:32-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-02-26 15:58:10-05:00
logade10387a583351fe597b58c4c9ceb97d959adf5
tree5e508bc243ec6e65c1d2a11908d7e28bcf0b8c48
parent1ec1097bd389b9af1b3e40d9edbc4c1c0b65f6a1
signaturelock-open Commit is signed but in an unrecognized format.

breaking changes to the way targets work in zig

* CLI: `-target [name]` instead of `--target-*` args. This matches clang's API. * `builtin.Environ` renamed to `builtin.Abi` - likewise `builtin.environ` renamed to `builtin.abi` * stop hiding the concept of sub-arch. closes #1526 * `zig targets` only shows available targets. closes #438 * include all targets in readme, even those that don't print with `zig targets` but note they are Tier 4 * refactor target.cpp and make the naming conventions more consistent * introduce the concept of a "default C ABI" for a given OS/Arch combo. As a rule of thumb, if the system compiler is clang or gcc then the default C ABI is the gnu ABI.

25 files changed, 874 insertions(+), 739 deletions(-)

README.md+36-21
......@@ -77,39 +77,54 @@ clarity.
7777 - what sizes are the C integer types
7878 - C ABI calling convention for this target
7979 - bootstrap code and default panic handler
80 * `zig targets` is guaranteed to include this target.
8081
8182#### Tier 4 Support
8283
8384 * Support for these targets is entirely experimental.
8485 * LLVM may have the target as an experimental target, which means that you
8586 need to use Zig-provided binaries for the target to be available, or
86 build LLVM from source with special configure flags.
87 build LLVM from source with special configure flags. `zig targets` will
88 display the target if it is available.
8789 * This target may be considered deprecated by an official party,
8890 [such as macosx/i386](https://support.apple.com/en-us/HT208436) in which
8991 case this target will remain forever stuck in Tier 4.
92 * This target may only support `--emit asm` and cannot emit object files.
9093
9194#### Support Table
9295
93| | freestanding | linux | macosx | windows | freebsd | netbsd | UEFI | other |
94|--------|--------------|--------|--------|---------|---------|------- | -------|--------|
95|x86_64 | Tier 2 | Tier 1 | Tier 1 | Tier 1 | Tier 2 | Tier 2 | Tier 2 | Tier 3 |
96|i386 | Tier 2 | Tier 2 | Tier 4 | Tier 2 | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
97|arm | Tier 2 | Tier 3 | Tier 3 | Tier 3 | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
98|arm64 | Tier 2 | Tier 2 | Tier 3 | Tier 3 | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
99|bpf | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
100|hexagon | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
101|mips | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
102|powerpc | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
103|r600 | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
104|amdgcn | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
105|sparc | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
106|s390x | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
107|spir | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
108|lanai | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
109|wasm32 | Tier 4 | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
110|wasm64 | Tier 4 | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
111|riscv32 | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | Tier 4 | Tier 4 |
112|riscv64 | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | Tier 4 | Tier 4 |
96| | freestanding | linux | macosx | windows | freebsd | netbsd | UEFI | other |
97|-------------|--------------|--------|--------|---------|---------|------- | -------|--------|
98|x86_64 | Tier 2 | Tier 1 | Tier 1 | Tier 1 | Tier 2 | Tier 2 | Tier 2 | Tier 3 |
99|i386 | Tier 2 | Tier 2 | Tier 4 | Tier 2 | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
100|arm | Tier 2 | Tier 3 | Tier 3 | Tier 3 | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
101|arm64 | Tier 2 | Tier 2 | Tier 3 | Tier 3 | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
102|avr | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | N/A | Tier 3 |
103|bpf | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | N/A | Tier 3 |
104|hexagon | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | N/A | Tier 3 |
105|mips | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | N/A | Tier 3 |
106|powerpc | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | N/A | Tier 3 |
107|amdgcn | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | N/A | Tier 3 |
108|sparc | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | N/A | Tier 3 |
109|s390x | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | N/A | Tier 3 |
110|lanai | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | N/A | Tier 3 |
111|wasm32 | Tier 4 | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
112|wasm64 | Tier 4 | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
113|riscv32 | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | Tier 4 | Tier 4 |
114|riscv64 | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | Tier 4 | Tier 4 |
115|xcore | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | N/A | Tier 4 |
116|nvptx | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | N/A | Tier 4 |
117|msp430 | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | N/A | Tier 4 |
118|r600 | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | N/A | Tier 4 |
119|arc | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | N/A | Tier 4 |
120|tce | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | N/A | Tier 4 |
121|le | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | N/A | Tier 4 |
122|amdil | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | N/A | Tier 4 |
123|hsail | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | N/A | Tier 4 |
124|spir | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | N/A | Tier 4 |
125|kalimba | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | N/A | Tier 4 |
126|shave | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | N/A | Tier 4 |
127|renderscript | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | N/A | Tier 4 |
113128
114129## Community
115130
doc/docgen.zig+1-8
......@@ -1105,14 +1105,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
11051105 },
11061106 }
11071107 if (code.target_windows) {
1108 try test_args.appendSlice([][]const u8{
1109 "--target-os",
1110 "windows",
1111 "--target-arch",
1112 "x86_64",
1113 "--target-environ",
1114 "msvc",
1115 });
1108 try test_args.appendSlice([][]const u8{ "-target", "x86_64-windows" });
11161109 }
11171110 const result = exec(allocator, &env_map, test_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "test failed");
11181111 const escaped_stderr = try escapeHtml(allocator, result.stderr);
src-self-hosted/link.zig+2-2
......@@ -326,7 +326,7 @@ fn constructLinkerArgsCoff(ctx: *Context) !void {
326326 switch (ctx.comp.target.getArch()) {
327327 builtin.Arch.i386 => try ctx.args.append(c"-MACHINE:X86"),
328328 builtin.Arch.x86_64 => try ctx.args.append(c"-MACHINE:X64"),
329 builtin.Arch.aarch64v8 => try ctx.args.append(c"-MACHINE:ARM"),
329 builtin.Arch.aarch64 => try ctx.args.append(c"-MACHINE:ARM"),
330330 else => return error.UnsupportedLinkArchitecture,
331331 }
332332
......@@ -552,7 +552,7 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {
552552 }
553553 },
554554 DarwinPlatform.Kind.IPhoneOS => {
555 if (ctx.comp.target.getArch() == builtin.Arch.aarch64v8) {
555 if (ctx.comp.target.getArch() == builtin.Arch.aarch64) {
556556 // iOS does not need any crt1 files for arm64
557557 } else if (platform.versionLessThan(3, 1)) {
558558 try ctx.args.append(c"-lcrt1.o");
src-self-hosted/main.zig+7-11
......@@ -154,9 +154,7 @@ const usage_build_generic =
154154 \\ release-small optimize for small binary, safety off
155155 \\ --static Output will be statically linked
156156 \\ --strip Exclude debug symbols
157 \\ --target-arch [name] Specify target architecture
158 \\ --target-environ [name] Specify target environment
159 \\ --target-os [name] Specify target operating system
157 \\ -target [name] <arch><sub>-<os>-<abi> see the targets command
160158 \\ --verbose-tokenize Turn on compiler debug output for tokenization
161159 \\ --verbose-ast-tree Turn on compiler debug output for parsing into an AST (tree view)
162160 \\ --verbose-ast-fmt Turn on compiler debug output for parsing into an AST (render source)
......@@ -220,9 +218,7 @@ const args_build_generic = []Flag{
220218 Flag.Bool("--pkg-end"),
221219 Flag.Bool("--static"),
222220 Flag.Bool("--strip"),
223 Flag.Arg1("--target-arch"),
224 Flag.Arg1("--target-environ"),
225 Flag.Arg1("--target-os"),
221 Flag.Arg1("-target"),
226222 Flag.Bool("--verbose-tokenize"),
227223 Flag.Bool("--verbose-ast-tree"),
228224 Flag.Bool("--verbose-ast-fmt"),
......@@ -839,15 +835,15 @@ fn cmdTargets(allocator: *Allocator, args: []const []const u8) !void {
839835 }
840836 try stdout.write("\n");
841837
842 try stdout.write("Environments:\n");
838 try stdout.write("C ABIs:\n");
843839 {
844840 comptime var i: usize = 0;
845 inline while (i < @memberCount(builtin.Environ)) : (i += 1) {
846 comptime const environ_tag = @memberName(builtin.Environ, i);
841 inline while (i < @memberCount(builtin.Abi)) : (i += 1) {
842 comptime const abi_tag = @memberName(builtin.Abi, i);
847843 // NOTE: Cannot use empty string, see #918.
848 comptime const native_str = if (comptime mem.eql(u8, environ_tag, @tagName(builtin.environ))) " (native)\n" else "\n";
844 comptime const native_str = if (comptime mem.eql(u8, abi_tag, @tagName(builtin.abi))) " (native)\n" else "\n";
849845
850 try stdout.print(" {}{}", environ_tag, native_str);
846 try stdout.print(" {}{}", abi_tag, native_str);
851847 }
852848 }
853849}
src-self-hosted/target.zig+38-206
......@@ -16,7 +16,7 @@ pub const Target = union(enum) {
1616 pub const Cross = struct {
1717 arch: builtin.Arch,
1818 os: builtin.Os,
19 environ: builtin.Environ,
19 abi: builtin.Abi,
2020 object_format: builtin.ObjectFormat,
2121 };
2222
......@@ -49,16 +49,16 @@ pub const Target = union(enum) {
4949 }
5050
5151 pub fn getArch(self: Target) builtin.Arch {
52 return switch (self) {
53 Target.Native => builtin.arch,
54 @TagType(Target).Cross => |t| t.arch,
55 };
52 switch (self) {
53 Target.Native => return builtin.arch,
54 @TagType(Target).Cross => |t| return t.arch,
55 }
5656 }
5757
58 pub fn getEnviron(self: Target) builtin.Environ {
58 pub fn getAbi(self: Target) builtin.Abi {
5959 return switch (self) {
60 Target.Native => builtin.environ,
61 @TagType(Target).Cross => |t| t.environ,
60 Target.Native => builtin.abi,
61 @TagType(Target).Cross => |t| t.abi,
6262 };
6363 }
6464
......@@ -93,46 +93,10 @@ pub const Target = union(enum) {
9393 /// TODO expose the arch and subarch separately
9494 pub fn isArmOrThumb(self: Target) bool {
9595 return switch (self.getArch()) {
96 builtin.Arch.armv8_3a,
97 builtin.Arch.armv8_2a,
98 builtin.Arch.armv8_1a,
99 builtin.Arch.armv8,
100 builtin.Arch.armv8r,
101 builtin.Arch.armv8m_baseline,
102 builtin.Arch.armv8m_mainline,
103 builtin.Arch.armv7,
104 builtin.Arch.armv7em,
105 builtin.Arch.armv7m,
106 builtin.Arch.armv7s,
107 builtin.Arch.armv7k,
108 builtin.Arch.armv7ve,
109 builtin.Arch.armv6,
110 builtin.Arch.armv6m,
111 builtin.Arch.armv6k,
112 builtin.Arch.armv6t2,
113 builtin.Arch.armv5,
114 builtin.Arch.armv5te,
115 builtin.Arch.armv4t,
116 builtin.Arch.armebv8_3a,
117 builtin.Arch.armebv8_2a,
118 builtin.Arch.armebv8_1a,
119 builtin.Arch.armebv8,
120 builtin.Arch.armebv8r,
121 builtin.Arch.armebv8m_baseline,
122 builtin.Arch.armebv8m_mainline,
123 builtin.Arch.armebv7,
124 builtin.Arch.armebv7em,
125 builtin.Arch.armebv7m,
126 builtin.Arch.armebv7s,
127 builtin.Arch.armebv7k,
128 builtin.Arch.armebv7ve,
129 builtin.Arch.armebv6,
130 builtin.Arch.armebv6m,
131 builtin.Arch.armebv6k,
132 builtin.Arch.armebv6t2,
133 builtin.Arch.armebv5,
134 builtin.Arch.armebv5te,
135 builtin.Arch.armebv4t,
96 builtin.Arch.arm,
97 builtin.Arch.armeb,
98 builtin.Arch.aarch64,
99 builtin.Arch.aarch64_be,
136100 builtin.Arch.thumb,
137101 builtin.Arch.thumbeb,
138102 => true,
......@@ -155,14 +119,14 @@ pub const Target = union(enum) {
155119 // LLVM WebAssembly output support requires the target to be activated at
156120 // build type with -DCMAKE_LLVM_EXPIERMENTAL_TARGETS_TO_BUILD=WebAssembly.
157121 //
158 // LLVM determines the output format based on the environment suffix,
122 // LLVM determines the output format based on the abi suffix,
159123 // defaulting to an object based on the architecture. The default format in
160124 // LLVM 6 sets the wasm arch output incorrectly to ELF. We need to
161125 // explicitly set this ourself in order for it to work.
162126 //
163127 // This is fixed in LLVM 7 and you will be able to get wasm output by
164128 // using the target triple `wasm32-unknown-unknown-unknown`.
165 const env_name = if (self.isWasm()) "wasm" else @tagName(self.getEnviron());
129 const env_name = if (self.isWasm()) "wasm" else @tagName(self.getAbi());
166130
167131 var out = &std.io.BufferOutStream.init(&result).stream;
168132 try out.print("{}-unknown-{}-{}", @tagName(self.getArch()), @tagName(self.getOs()), env_name);
......@@ -181,46 +145,8 @@ pub const Target = union(enum) {
181145 => return 16,
182146
183147 builtin.Arch.arc,
184 builtin.Arch.armv8_3a,
185 builtin.Arch.armv8_2a,
186 builtin.Arch.armv8_1a,
187 builtin.Arch.armv8,
188 builtin.Arch.armv8r,
189 builtin.Arch.armv8m_baseline,
190 builtin.Arch.armv8m_mainline,
191 builtin.Arch.armv7,
192 builtin.Arch.armv7em,
193 builtin.Arch.armv7m,
194 builtin.Arch.armv7s,
195 builtin.Arch.armv7k,
196 builtin.Arch.armv7ve,
197 builtin.Arch.armv6,
198 builtin.Arch.armv6m,
199 builtin.Arch.armv6k,
200 builtin.Arch.armv6t2,
201 builtin.Arch.armv5,
202 builtin.Arch.armv5te,
203 builtin.Arch.armv4t,
204 builtin.Arch.armebv8_3a,
205 builtin.Arch.armebv8_2a,
206 builtin.Arch.armebv8_1a,
207 builtin.Arch.armebv8,
208 builtin.Arch.armebv8r,
209 builtin.Arch.armebv8m_baseline,
210 builtin.Arch.armebv8m_mainline,
211 builtin.Arch.armebv7,
212 builtin.Arch.armebv7em,
213 builtin.Arch.armebv7m,
214 builtin.Arch.armebv7s,
215 builtin.Arch.armebv7k,
216 builtin.Arch.armebv7ve,
217 builtin.Arch.armebv6,
218 builtin.Arch.armebv6m,
219 builtin.Arch.armebv6k,
220 builtin.Arch.armebv6t2,
221 builtin.Arch.armebv5,
222 builtin.Arch.armebv5te,
223 builtin.Arch.armebv4t,
148 builtin.Arch.arm,
149 builtin.Arch.armeb,
224150 builtin.Arch.hexagon,
225151 builtin.Arch.le32,
226152 builtin.Arch.mips,
......@@ -241,29 +167,15 @@ pub const Target = union(enum) {
241167 builtin.Arch.amdil,
242168 builtin.Arch.hsail,
243169 builtin.Arch.spir,
244 builtin.Arch.kalimbav3,
245 builtin.Arch.kalimbav4,
246 builtin.Arch.kalimbav5,
170 builtin.Arch.kalimba,
247171 builtin.Arch.shave,
248172 builtin.Arch.lanai,
249173 builtin.Arch.wasm32,
250174 builtin.Arch.renderscript32,
251175 => return 32,
252176
253 builtin.Arch.aarch64v8_3a,
254 builtin.Arch.aarch64v8_2a,
255 builtin.Arch.aarch64v8_1a,
256 builtin.Arch.aarch64v8,
257 builtin.Arch.aarch64v8r,
258 builtin.Arch.aarch64v8m_baseline,
259 builtin.Arch.aarch64v8m_mainline,
260 builtin.Arch.aarch64_bev8_3a,
261 builtin.Arch.aarch64_bev8_2a,
262 builtin.Arch.aarch64_bev8_1a,
263 builtin.Arch.aarch64_bev8,
264 builtin.Arch.aarch64_bev8r,
265 builtin.Arch.aarch64_bev8m_baseline,
266 builtin.Arch.aarch64_bev8m_mainline,
177 builtin.Arch.aarch64,
178 builtin.Arch.aarch64_be,
267179 builtin.Arch.mips64,
268180 builtin.Arch.mips64el,
269181 builtin.Arch.powerpc64,
......@@ -287,17 +199,17 @@ pub const Target = union(enum) {
287199 }
288200
289201 pub fn getFloatAbi(self: Target) FloatAbi {
290 return switch (self.getEnviron()) {
291 builtin.Environ.gnueabihf,
292 builtin.Environ.eabihf,
293 builtin.Environ.musleabihf,
202 return switch (self.getAbi()) {
203 builtin.Abi.gnueabihf,
204 builtin.Abi.eabihf,
205 builtin.Abi.musleabihf,
294206 => FloatAbi.Hard,
295207 else => FloatAbi.Soft,
296208 };
297209 }
298210
299211 pub fn getDynamicLinkerPath(self: Target) ?[]const u8 {
300 const env = self.getEnviron();
212 const env = self.getAbi();
301213 const arch = self.getArch();
302214 const os = self.getOs();
303215 switch (os) {
......@@ -306,21 +218,21 @@ pub const Target = union(enum) {
306218 },
307219 builtin.Os.linux => {
308220 switch (env) {
309 builtin.Environ.android => {
221 builtin.Abi.android => {
310222 if (self.is64bit()) {
311223 return "/system/bin/linker64";
312224 } else {
313225 return "/system/bin/linker";
314226 }
315227 },
316 builtin.Environ.gnux32 => {
228 builtin.Abi.gnux32 => {
317229 if (arch == builtin.Arch.x86_64) {
318230 return "/libx32/ld-linux-x32.so.2";
319231 }
320232 },
321 builtin.Environ.musl,
322 builtin.Environ.musleabi,
323 builtin.Environ.musleabihf,
233 builtin.Abi.musl,
234 builtin.Abi.musleabi,
235 builtin.Abi.musleabihf,
324236 => {
325237 if (arch == builtin.Arch.x86_64) {
326238 return "/lib/ld-musl-x86_64.so.1";
......@@ -334,70 +246,18 @@ pub const Target = union(enum) {
334246 builtin.Arch.sparcel,
335247 => return "/lib/ld-linux.so.2",
336248
337 builtin.Arch.aarch64v8_3a,
338 builtin.Arch.aarch64v8_2a,
339 builtin.Arch.aarch64v8_1a,
340 builtin.Arch.aarch64v8,
341 builtin.Arch.aarch64v8r,
342 builtin.Arch.aarch64v8m_baseline,
343 builtin.Arch.aarch64v8m_mainline,
344 => return "/lib/ld-linux-aarch64.so.1",
345
346 builtin.Arch.aarch64_bev8_3a,
347 builtin.Arch.aarch64_bev8_2a,
348 builtin.Arch.aarch64_bev8_1a,
349 builtin.Arch.aarch64_bev8,
350 builtin.Arch.aarch64_bev8r,
351 builtin.Arch.aarch64_bev8m_baseline,
352 builtin.Arch.aarch64_bev8m_mainline,
353 => return "/lib/ld-linux-aarch64_be.so.1",
354
355 builtin.Arch.armv8_3a,
356 builtin.Arch.armv8_2a,
357 builtin.Arch.armv8_1a,
358 builtin.Arch.armv8,
359 builtin.Arch.armv8r,
360 builtin.Arch.armv8m_baseline,
361 builtin.Arch.armv8m_mainline,
362 builtin.Arch.armv7,
363 builtin.Arch.armv7em,
364 builtin.Arch.armv7m,
365 builtin.Arch.armv7s,
366 builtin.Arch.armv7k,
367 builtin.Arch.armv7ve,
368 builtin.Arch.armv6,
369 builtin.Arch.armv6m,
370 builtin.Arch.armv6k,
371 builtin.Arch.armv6t2,
372 builtin.Arch.armv5,
373 builtin.Arch.armv5te,
374 builtin.Arch.armv4t,
249 builtin.Arch.aarch64 => return "/lib/ld-linux-aarch64.so.1",
250
251 builtin.Arch.aarch64_be => return "/lib/ld-linux-aarch64_be.so.1",
252
253 builtin.Arch.arm,
375254 builtin.Arch.thumb,
376255 => return switch (self.getFloatAbi()) {
377256 FloatAbi.Hard => return "/lib/ld-linux-armhf.so.3",
378257 else => return "/lib/ld-linux.so.3",
379258 },
380259
381 builtin.Arch.armebv8_3a,
382 builtin.Arch.armebv8_2a,
383 builtin.Arch.armebv8_1a,
384 builtin.Arch.armebv8,
385 builtin.Arch.armebv8r,
386 builtin.Arch.armebv8m_baseline,
387 builtin.Arch.armebv8m_mainline,
388 builtin.Arch.armebv7,
389 builtin.Arch.armebv7em,
390 builtin.Arch.armebv7m,
391 builtin.Arch.armebv7s,
392 builtin.Arch.armebv7k,
393 builtin.Arch.armebv7ve,
394 builtin.Arch.armebv6,
395 builtin.Arch.armebv6m,
396 builtin.Arch.armebv6k,
397 builtin.Arch.armebv6t2,
398 builtin.Arch.armebv5,
399 builtin.Arch.armebv5te,
400 builtin.Arch.armebv4t,
260 builtin.Arch.armeb,
401261 builtin.Arch.thumbeb,
402262 => return switch (self.getFloatAbi()) {
403263 FloatAbi.Hard => return "/lib/ld-linux-armhf.so.3",
......@@ -441,9 +301,7 @@ pub const Target = union(enum) {
441301 builtin.Arch.hsail64,
442302 builtin.Arch.spir,
443303 builtin.Arch.spir64,
444 builtin.Arch.kalimbav3,
445 builtin.Arch.kalimbav4,
446 builtin.Arch.kalimbav5,
304 builtin.Arch.kalimba,
447305 builtin.Arch.shave,
448306 builtin.Arch.lanai,
449307 builtin.Arch.wasm32,
......@@ -566,35 +424,9 @@ pub const Target = union(enum) {
566424 pub fn getDarwinArchString(self: Target) []const u8 {
567425 const arch = self.getArch();
568426 switch (arch) {
569 builtin.Arch.aarch64v8_3a,
570 builtin.Arch.aarch64v8_2a,
571 builtin.Arch.aarch64v8_1a,
572 builtin.Arch.aarch64v8,
573 builtin.Arch.aarch64v8r,
574 builtin.Arch.aarch64v8m_baseline,
575 builtin.Arch.aarch64v8m_mainline,
576 => return "arm64",
427 builtin.Arch.aarch64 => return "arm64",
577428 builtin.Arch.thumb,
578 builtin.Arch.armv8_3a,
579 builtin.Arch.armv8_2a,
580 builtin.Arch.armv8_1a,
581 builtin.Arch.armv8,
582 builtin.Arch.armv8r,
583 builtin.Arch.armv8m_baseline,
584 builtin.Arch.armv8m_mainline,
585 builtin.Arch.armv7,
586 builtin.Arch.armv7em,
587 builtin.Arch.armv7m,
588 builtin.Arch.armv7s,
589 builtin.Arch.armv7k,
590 builtin.Arch.armv7ve,
591 builtin.Arch.armv6,
592 builtin.Arch.armv6m,
593 builtin.Arch.armv6k,
594 builtin.Arch.armv6t2,
595 builtin.Arch.armv5,
596 builtin.Arch.armv5te,
597 builtin.Arch.armv4t,
429 builtin.Arch.arm,
598430 => return "arm",
599431 builtin.Arch.powerpc => return "ppc",
600432 builtin.Arch.powerpc64 => return "ppc64",
src/all_types.hpp+2-1
......@@ -1784,7 +1784,8 @@ struct CodeGen {
17841784 unsigned pointer_size_bytes;
17851785 uint32_t target_os_index;
17861786 uint32_t target_arch_index;
1787 uint32_t target_environ_index;
1787 uint32_t target_sub_arch_index;
1788 uint32_t target_abi_index;
17881789 uint32_t target_oformat_index;
17891790 bool is_big_endian;
17901791 bool have_pub_main;
src/analyze.cpp+1-1
......@@ -1102,7 +1102,7 @@ bool want_first_arg_sret(CodeGen *g, FnTypeId *fn_type_id) {
11021102 if (type_is_c_abi_int(g, fn_type_id->return_type)) {
11031103 return false;
11041104 }
1105 if (g->zig_target->arch.arch == ZigLLVM_x86_64) {
1105 if (g->zig_target->arch == ZigLLVM_x86_64) {
11061106 X64CABIClass abi_class = type_c_abi_x86_64_class(g, fn_type_id->return_type);
11071107 return abi_class == X64CABIClass_MEMORY;
11081108 } else if (target_is_arm(g->zig_target)) {
src/buffer.hpp+1-3
......@@ -132,9 +132,7 @@ void buf_appendf(Buf *buf, const char *format, ...)
132132
133133static inline bool buf_eql_mem(Buf *buf, const char *mem, size_t mem_len) {
134134 assert(buf->list.length);
135 if (buf_len(buf) != mem_len)
136 return false;
137 return memcmp(buf_ptr(buf), mem, mem_len) == 0;
135 return mem_eql_mem(buf_ptr(buf), buf_len(buf), mem, mem_len);
138136}
139137
140138static inline bool buf_eql_str(Buf *buf, const char *str) {
src/codegen.cpp+71-47
......@@ -29,9 +29,9 @@ static void init_darwin_native(CodeGen *g) {
2929
3030 // Allow conflicts among OSX and iOS, but choose the default platform.
3131 if (osx_target && ios_target) {
32 if (g->zig_target->arch.arch == ZigLLVM_arm ||
33 g->zig_target->arch.arch == ZigLLVM_aarch64 ||
34 g->zig_target->arch.arch == ZigLLVM_thumb)
32 if (g->zig_target->arch == ZigLLVM_arm ||
33 g->zig_target->arch == ZigLLVM_aarch64 ||
34 g->zig_target->arch == ZigLLVM_thumb)
3535 {
3636 osx_target = nullptr;
3737 } else {
......@@ -347,8 +347,8 @@ static LLVMCallConv get_llvm_cc(CodeGen *g, CallingConvention cc) {
347347 case CallingConventionC: return LLVMCCallConv;
348348 case CallingConventionCold:
349349 // cold calling convention only works on x86.
350 if (g->zig_target->arch.arch == ZigLLVM_x86 ||
351 g->zig_target->arch.arch == ZigLLVM_x86_64)
350 if (g->zig_target->arch == ZigLLVM_x86 ||
351 g->zig_target->arch == ZigLLVM_x86_64)
352352 {
353353 // cold calling convention is not supported on windows
354354 if (g->zig_target->os == OsWindows) {
......@@ -364,7 +364,7 @@ static LLVMCallConv get_llvm_cc(CodeGen *g, CallingConvention cc) {
364364 zig_unreachable();
365365 case CallingConventionStdcall:
366366 // stdcall calling convention only works on x86.
367 if (g->zig_target->arch.arch == ZigLLVM_x86) {
367 if (g->zig_target->arch == ZigLLVM_x86) {
368368 return LLVMX86StdcallCallConv;
369369 } else {
370370 return LLVMCCallConv;
......@@ -463,7 +463,7 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, ZigFn *fn_table_entry) {
463463 bool external_linkage = linkage != GlobalLinkageIdInternal;
464464 CallingConvention cc = fn_table_entry->type_entry->data.fn.fn_type_id.cc;
465465 if (cc == CallingConventionStdcall && external_linkage &&
466 g->zig_target->arch.arch == ZigLLVM_x86)
466 g->zig_target->arch == ZigLLVM_x86)
467467 {
468468 // prevent llvm name mangling
469469 symbol_name = buf_sprintf("\x01_%s", buf_ptr(symbol_name));
......@@ -2095,7 +2095,7 @@ static bool iter_function_params_c_abi(CodeGen *g, ZigType *fn_type, FnWalk *fn_
20952095 return true;
20962096 }
20972097
2098 if (g->zig_target->arch.arch == ZigLLVM_x86_64) {
2098 if (g->zig_target->arch == ZigLLVM_x86_64) {
20992099 X64CABIClass abi_class = type_c_abi_x86_64_class(g, ty);
21002100 size_t ty_size = type_size(g, ty);
21012101 if (abi_class == X64CABIClass_MEMORY) {
......@@ -3344,9 +3344,9 @@ static LLVMValueRef gen_valgrind_client_request(CodeGen *g, LLVMValueRef default
33443344 LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->type_ref;
33453345 bool asm_has_side_effects = true;
33463346 bool asm_is_alignstack = false;
3347 if (g->zig_target->arch.arch == ZigLLVM_x86_64) {
3347 if (g->zig_target->arch == ZigLLVM_x86_64) {
33483348 if (g->zig_target->os == OsLinux || target_is_darwin(g->zig_target) || g->zig_target->os == OsSolaris ||
3349 (g->zig_target->os == OsWindows && g->zig_target->env_type != ZigLLVM_MSVC))
3349 (g->zig_target->os == OsWindows && g->zig_target->abi != ZigLLVM_MSVC))
33503350 {
33513351 if (g->cur_fn->valgrind_client_request_array == nullptr) {
33523352 LLVMBasicBlockRef prev_block = LLVMGetInsertBlock(g->builder);
......@@ -3586,7 +3586,7 @@ static void gen_set_stack_pointer(CodeGen *g, LLVMValueRef aligned_end_addr) {
35863586 LLVMValueRef write_register_fn_val = get_write_register_fn_val(g);
35873587
35883588 if (g->sp_md_node == nullptr) {
3589 Buf *sp_reg_name = buf_create_from_str(arch_stack_pointer_register_name(&g->zig_target->arch));
3589 Buf *sp_reg_name = buf_create_from_str(arch_stack_pointer_register_name(g->zig_target->arch));
35903590 LLVMValueRef str_node = LLVMMDString(buf_ptr(sp_reg_name), buf_len(sp_reg_name) + 1);
35913591 g->sp_md_node = LLVMMDNode(&str_node, 1);
35923592 }
......@@ -7284,8 +7284,8 @@ Buf *codegen_generate_builtin_source(CodeGen *g) {
72847284 buf_appendf(contents, "pub const Os = enum {\n");
72857285 uint32_t field_count = (uint32_t)target_os_count();
72867286 for (uint32_t i = 0; i < field_count; i += 1) {
7287 Os os_type = get_target_os(i);
7288 const char *name = get_target_os_name(os_type);
7287 Os os_type = target_os_enum(i);
7288 const char *name = target_os_name(os_type);
72897289 buf_appendf(contents, " %s,\n", name);
72907290
72917291 if (os_type == g->zig_target->os) {
......@@ -7299,53 +7299,77 @@ Buf *codegen_generate_builtin_source(CodeGen *g) {
72997299
73007300 const char *cur_arch = nullptr;
73017301 {
7302 buf_appendf(contents, "pub const Arch = enum {\n");
7302 buf_appendf(contents, "pub const Arch = union(enum) {\n");
73037303 uint32_t field_count = (uint32_t)target_arch_count();
7304 for (uint32_t i = 0; i < field_count; i += 1) {
7305 const ArchType *arch_type = get_target_arch(i);
7306 Buf *arch_name = buf_alloc();
7307 buf_resize(arch_name, 50);
7308 get_arch_name(buf_ptr(arch_name), arch_type);
7309 buf_resize(arch_name, strlen(buf_ptr(arch_name)));
7310
7311 buf_appendf(contents, " %s,\n", buf_ptr(arch_name));
7304 for (uint32_t arch_i = 0; arch_i < field_count; arch_i += 1) {
7305 ZigLLVM_ArchType arch = target_arch_enum(arch_i);
7306 const char *arch_name = target_arch_name(arch);
7307 SubArchList sub_arch_list = target_subarch_list(arch);
7308 if (sub_arch_list == SubArchListNone) {
7309 buf_appendf(contents, " %s,\n", arch_name);
7310 if (arch == g->zig_target->arch) {
7311 g->target_arch_index = arch_i;
7312 cur_arch = buf_ptr(buf_sprintf("Arch.%s", arch_name));
7313 }
7314 } else {
7315 const char *sub_arch_list_name = target_subarch_list_name(sub_arch_list);
7316 buf_appendf(contents, " %s: %s,\n", arch_name, sub_arch_list_name);
7317 if (arch == g->zig_target->arch) {
7318 size_t sub_count = target_subarch_count(sub_arch_list);
7319 for (size_t sub_i = 0; sub_i < sub_count; sub_i += 1) {
7320 ZigLLVM_SubArchType sub = target_subarch_enum(sub_arch_list, sub_i);
7321 if (sub == g->zig_target->sub_arch) {
7322 g->target_sub_arch_index = sub_i;
7323 cur_arch = buf_ptr(buf_sprintf("Arch{ .%s = Arch.%s.%s }",
7324 arch_name, sub_arch_list_name, target_subarch_name(sub)));
7325 }
7326 }
7327 }
7328 }
7329 }
73127330
7313 if (arch_type->arch == g->zig_target->arch.arch &&
7314 arch_type->sub_arch == g->zig_target->arch.sub_arch)
7315 {
7316 g->target_arch_index = i;
7317 cur_arch = buf_ptr(arch_name);
7331 uint32_t list_count = target_subarch_list_count();
7332 // start at index 1 to skip None
7333 for (uint32_t list_i = 1; list_i < list_count; list_i += 1) {
7334 SubArchList sub_arch_list = target_subarch_list_enum(list_i);
7335 const char *subarch_list_name = target_subarch_list_name(sub_arch_list);
7336 buf_appendf(contents, " pub const %s = enum {\n", subarch_list_name);
7337 size_t sub_count = target_subarch_count(sub_arch_list);
7338 for (size_t sub_i = 0; sub_i < sub_count; sub_i += 1) {
7339 ZigLLVM_SubArchType sub = target_subarch_enum(sub_arch_list, sub_i);
7340 buf_appendf(contents, " %s,\n", target_subarch_name(sub));
73187341 }
7342 buf_appendf(contents, " };\n");
73197343 }
73207344 buf_appendf(contents, "};\n\n");
73217345 }
73227346 assert(cur_arch != nullptr);
73237347
7324 const char *cur_environ = nullptr;
7348 const char *cur_abi = nullptr;
73257349 {
7326 buf_appendf(contents, "pub const Environ = enum {\n");
7327 uint32_t field_count = (uint32_t)target_environ_count();
7350 buf_appendf(contents, "pub const Abi = enum {\n");
7351 uint32_t field_count = (uint32_t)target_abi_count();
73287352 for (uint32_t i = 0; i < field_count; i += 1) {
7329 ZigLLVM_EnvironmentType environ_type = get_target_environ(i);
7330 const char *name = ZigLLVMGetEnvironmentTypeName(environ_type);
7353 ZigLLVM_EnvironmentType abi = target_abi_enum(i);
7354 const char *name = target_abi_name(abi);
73317355 buf_appendf(contents, " %s,\n", name);
73327356
7333 if (environ_type == g->zig_target->env_type) {
7334 g->target_environ_index = i;
7335 cur_environ = name;
7357 if (abi == g->zig_target->abi) {
7358 g->target_abi_index = i;
7359 cur_abi = name;
73367360 }
73377361 }
73387362 buf_appendf(contents, "};\n\n");
73397363 }
7340 assert(cur_environ != nullptr);
7364 assert(cur_abi != nullptr);
73417365
73427366 const char *cur_obj_fmt = nullptr;
73437367 {
73447368 buf_appendf(contents, "pub const ObjectFormat = enum {\n");
73457369 uint32_t field_count = (uint32_t)target_oformat_count();
73467370 for (uint32_t i = 0; i < field_count; i += 1) {
7347 ZigLLVM_ObjectFormatType oformat = get_target_oformat(i);
7348 const char *name = get_target_oformat_name(oformat);
7371 ZigLLVM_ObjectFormatType oformat = target_oformat_enum(i);
7372 const char *name = target_oformat_name(oformat);
73497373 buf_appendf(contents, " %s,\n", name);
73507374
73517375 ZigLLVM_ObjectFormatType target_oformat = target_object_format(g->zig_target);
......@@ -7633,8 +7657,8 @@ Buf *codegen_generate_builtin_source(CodeGen *g) {
76337657 buf_appendf(contents, "pub const is_test = %s;\n", bool_to_str(g->is_test_build));
76347658 buf_appendf(contents, "pub const single_threaded = %s;\n", bool_to_str(g->is_single_threaded));
76357659 buf_appendf(contents, "pub const os = Os.%s;\n", cur_os);
7636 buf_appendf(contents, "pub const arch = Arch.%s;\n", cur_arch);
7637 buf_appendf(contents, "pub const environ = Environ.%s;\n", cur_environ);
7660 buf_appendf(contents, "pub const arch = %s;\n", cur_arch);
7661 buf_appendf(contents, "pub const abi = Abi.%s;\n", cur_abi);
76387662 buf_appendf(contents, "pub const object_format = ObjectFormat.%s;\n", cur_obj_fmt);
76397663 buf_appendf(contents, "pub const mode = %s;\n", build_mode_to_str(g->build_mode));
76407664 buf_appendf(contents, "pub const link_libc = %s;\n", bool_to_str(g->libc_link_lib != nullptr));
......@@ -7669,11 +7693,11 @@ static Error define_builtin_compile_vars(CodeGen *g) {
76697693 cache_bool(&cache_hash, g->is_test_build);
76707694 cache_bool(&cache_hash, g->is_single_threaded);
76717695 cache_int(&cache_hash, g->zig_target->is_native);
7672 cache_int(&cache_hash, g->zig_target->arch.arch);
7673 cache_int(&cache_hash, g->zig_target->arch.sub_arch);
7696 cache_int(&cache_hash, g->zig_target->arch);
7697 cache_int(&cache_hash, g->zig_target->sub_arch);
76747698 cache_int(&cache_hash, g->zig_target->vendor);
76757699 cache_int(&cache_hash, g->zig_target->os);
7676 cache_int(&cache_hash, g->zig_target->env_type);
7700 cache_int(&cache_hash, g->zig_target->abi);
76777701 cache_bool(&cache_hash, g->have_err_ret_tracing);
76787702 cache_bool(&cache_hash, g->libc_link_lib != nullptr);
76797703 cache_bool(&cache_hash, g->valgrind_support);
......@@ -7901,7 +7925,7 @@ static void detect_libc(CodeGen *g) {
79017925 // without a cross compiling libc kit.
79027926 fprintf(stderr,
79037927 "Cannot link against libc for non-native OS '%s' without providing a libc installation file.\n"
7904 "See `zig libc --help` for more details.\n", get_target_os_name(g->zig_target->os));
7928 "See `zig libc --help` for more details.\n", target_os_name(g->zig_target->os));
79057929 exit(1);
79067930 }
79077931}
......@@ -8799,11 +8823,11 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) {
87998823 cache_int(ch, g->build_mode);
88008824 cache_int(ch, g->out_type);
88018825 cache_bool(ch, g->zig_target->is_native);
8802 cache_int(ch, g->zig_target->arch.arch);
8803 cache_int(ch, g->zig_target->arch.sub_arch);
8826 cache_int(ch, g->zig_target->arch);
8827 cache_int(ch, g->zig_target->sub_arch);
88048828 cache_int(ch, g->zig_target->vendor);
88058829 cache_int(ch, g->zig_target->os);
8806 cache_int(ch, g->zig_target->env_type);
8830 cache_int(ch, g->zig_target->abi);
88078831 cache_int(ch, g->subsystem);
88088832 cache_bool(ch, g->is_static);
88098833 cache_bool(ch, g->strip_debug_symbols);
src/error.cpp+5
......@@ -37,6 +37,11 @@ const char *err_str(Error err) {
3737 case ErrorPathTooLong: return "path too long";
3838 case ErrorCCompilerCannotFindFile: return "C compiler cannot find file";
3939 case ErrorReadingDepFile: return "failed to read .d file";
40 case ErrorMissingArchitecture: return "missing architecture";
41 case ErrorMissingOperatingSystem: return "missing operating system";
42 case ErrorUnknownArchitecture: return "unrecognized architecture";
43 case ErrorUnknownOperatingSystem: return "unrecognized operating system";
44 case ErrorUnknownABI: return "unrecognized C ABI";
4045 }
4146 return "(invalid error)";
4247}
src/error.hpp+5
......@@ -39,6 +39,11 @@ enum Error {
3939 ErrorPathTooLong,
4040 ErrorCCompilerCannotFindFile,
4141 ErrorReadingDepFile,
42 ErrorMissingArchitecture,
43 ErrorMissingOperatingSystem,
44 ErrorUnknownArchitecture,
45 ErrorUnknownOperatingSystem,
46 ErrorUnknownABI,
4247};
4348
4449const char *err_str(Error err);
src/libc_installation.cpp+10-8
......@@ -103,7 +103,7 @@ Error zig_libc_parse(ZigLibCInstallation *libc, Buf *libc_file, const ZigTarget
103103 if (buf_len(&libc->crt_dir) == 0) {
104104 if (!target_is_darwin(target)) {
105105 if (verbose) {
106 fprintf(stderr, "crt_dir may not be empty for %s\n", get_target_os_name(target->os));
106 fprintf(stderr, "crt_dir may not be empty for %s\n", target_os_name(target->os));
107107 }
108108 return ErrorSemanticAnalyzeFail;
109109 }
......@@ -112,7 +112,7 @@ Error zig_libc_parse(ZigLibCInstallation *libc, Buf *libc_file, const ZigTarget
112112 if (buf_len(&libc->lib_dir) == 0) {
113113 if (!target_is_darwin(target) && target->os != OsWindows) {
114114 if (verbose) {
115 fprintf(stderr, "lib_dir may not be empty for %s\n", get_target_os_name(target->os));
115 fprintf(stderr, "lib_dir may not be empty for %s\n", target_os_name(target->os));
116116 }
117117 return ErrorSemanticAnalyzeFail;
118118 }
......@@ -121,7 +121,7 @@ Error zig_libc_parse(ZigLibCInstallation *libc, Buf *libc_file, const ZigTarget
121121 if (buf_len(&libc->static_lib_dir) == 0) {
122122 if (!target_is_darwin(target) && target->os != OsWindows) {
123123 if (verbose) {
124 fprintf(stderr, "static_lib_dir may not be empty for %s\n", get_target_os_name(target->os));
124 fprintf(stderr, "static_lib_dir may not be empty for %s\n", target_os_name(target->os));
125125 }
126126 return ErrorSemanticAnalyzeFail;
127127 }
......@@ -130,7 +130,7 @@ Error zig_libc_parse(ZigLibCInstallation *libc, Buf *libc_file, const ZigTarget
130130 if (buf_len(&libc->msvc_lib_dir) == 0) {
131131 if (target->os == OsWindows) {
132132 if (verbose) {
133 fprintf(stderr, "msvc_lib_dir may not be empty for %s\n", get_target_os_name(target->os));
133 fprintf(stderr, "msvc_lib_dir may not be empty for %s\n", target_os_name(target->os));
134134 }
135135 return ErrorSemanticAnalyzeFail;
136136 }
......@@ -139,7 +139,7 @@ Error zig_libc_parse(ZigLibCInstallation *libc, Buf *libc_file, const ZigTarget
139139 if (buf_len(&libc->kernel32_lib_dir) == 0) {
140140 if (target->os == OsWindows) {
141141 if (verbose) {
142 fprintf(stderr, "kernel32_lib_dir may not be empty for %s\n", get_target_os_name(target->os));
142 fprintf(stderr, "kernel32_lib_dir may not be empty for %s\n", target_os_name(target->os));
143143 }
144144 return ErrorSemanticAnalyzeFail;
145145 }
......@@ -148,7 +148,7 @@ Error zig_libc_parse(ZigLibCInstallation *libc, Buf *libc_file, const ZigTarget
148148 if (buf_len(&libc->dynamic_linker_path) == 0) {
149149 if (!target_is_darwin(target) && target->os != OsWindows) {
150150 if (verbose) {
151 fprintf(stderr, "dynamic_linker_path may not be empty for %s\n", get_target_os_name(target->os));
151 fprintf(stderr, "dynamic_linker_path may not be empty for %s\n", target_os_name(target->os));
152152 }
153153 return ErrorSemanticAnalyzeFail;
154154 }
......@@ -334,8 +334,10 @@ static Error zig_libc_find_native_dynamic_linker_posix(ZigLibCInstallation *self
334334#endif
335335 ZigTarget native_target;
336336 get_native_target(&native_target);
337 Buf *dynamic_linker_path = target_dynamic_linker(&native_target);
338 buf_init_from_buf(&self->dynamic_linker_path, dynamic_linker_path);
337 const char *dynamic_linker_path = target_dynamic_linker(&native_target);
338 if (dynamic_linker_path != nullptr) {
339 buf_init_from_str(&self->dynamic_linker_path, dynamic_linker_path);
340 }
339341 return ErrorNone;
340342}
341343#endif
src/link.cpp+17-17
......@@ -96,7 +96,7 @@ static Buf *build_compiler_rt(CodeGen *parent_gen) {
9696}
9797
9898static const char *get_darwin_arch_string(const ZigTarget *t) {
99 switch (t->arch.arch) {
99 switch (t->arch) {
100100 case ZigLLVM_aarch64:
101101 return "arm64";
102102 case ZigLLVM_thumb:
......@@ -109,13 +109,13 @@ static const char *get_darwin_arch_string(const ZigTarget *t) {
109109 case ZigLLVM_ppc64le:
110110 return "ppc64le";
111111 default:
112 return ZigLLVMGetArchTypeName(t->arch.arch);
112 return ZigLLVMGetArchTypeName(t->arch);
113113 }
114114}
115115
116116
117117static const char *getLDMOption(const ZigTarget *t) {
118 switch (t->arch.arch) {
118 switch (t->arch) {
119119 case ZigLLVM_x86:
120120 return "elf_i386";
121121 case ZigLLVM_aarch64:
......@@ -149,7 +149,7 @@ static const char *getLDMOption(const ZigTarget *t) {
149149 case ZigLLVM_systemz:
150150 return "elf64_s390";
151151 case ZigLLVM_x86_64:
152 if (t->env_type == ZigLLVM_GNUX32) {
152 if (t->abi == ZigLLVM_GNUX32) {
153153 return "elf32_x86_64";
154154 }
155155 // Any target elf will use the freebsd osabi if suffixed with "_fbsd".
......@@ -191,8 +191,8 @@ static void construct_linker_job_elf(LinkJob *lj) {
191191 bool shared = !g->is_static && is_lib;
192192 Buf *soname = nullptr;
193193 if (g->is_static) {
194 if (g->zig_target->arch.arch == ZigLLVM_arm || g->zig_target->arch.arch == ZigLLVM_armeb ||
195 g->zig_target->arch.arch == ZigLLVM_thumb || g->zig_target->arch.arch == ZigLLVM_thumbeb)
194 if (g->zig_target->arch == ZigLLVM_arm || g->zig_target->arch == ZigLLVM_armeb ||
195 g->zig_target->arch == ZigLLVM_thumb || g->zig_target->arch == ZigLLVM_thumbeb)
196196 {
197197 lj->args.append("-Bstatic");
198198 } else {
......@@ -375,16 +375,16 @@ static void construct_linker_job_wasm(LinkJob *lj) {
375375}
376376
377377//static bool is_target_cyg_mingw(const ZigTarget *target) {
378// return (target->os == ZigLLVM_Win32 && target->env_type == ZigLLVM_Cygnus) ||
379// (target->os == ZigLLVM_Win32 && target->env_type == ZigLLVM_GNU);
378// return (target->os == ZigLLVM_Win32 && target->abi == ZigLLVM_Cygnus) ||
379// (target->os == ZigLLVM_Win32 && target->abi == ZigLLVM_GNU);
380380//}
381381
382382static void coff_append_machine_arg(CodeGen *g, ZigList<const char *> *list) {
383 if (g->zig_target->arch.arch == ZigLLVM_x86) {
383 if (g->zig_target->arch == ZigLLVM_x86) {
384384 list->append("-MACHINE:X86");
385 } else if (g->zig_target->arch.arch == ZigLLVM_x86_64) {
385 } else if (g->zig_target->arch == ZigLLVM_x86_64) {
386386 list->append("-MACHINE:X64");
387 } else if (g->zig_target->arch.arch == ZigLLVM_arm) {
387 } else if (g->zig_target->arch == ZigLLVM_arm) {
388388 list->append("-MACHINE:ARM");
389389 }
390390}
......@@ -470,7 +470,7 @@ static void add_nt_link_args(LinkJob *lj, bool is_library) {
470470// lj->args.append("-Bdynamic");
471471// if (dll || shared) {
472472// lj->args.append("-e");
473// if (g->zig_target.arch.arch == ZigLLVM_x86) {
473// if (g->zig_target.arch == ZigLLVM_x86) {
474474// lj->args.append("_DllMainCRTStartup@12");
475475// } else {
476476// lj->args.append("DllMainCRTStartup");
......@@ -496,7 +496,7 @@ static void add_nt_link_args(LinkJob *lj, bool is_library) {
496496//lj->args.append("-lmingw32");
497497
498498//lj->args.append("-lgcc");
499//bool is_android = (g->zig_target.env_type == ZigLLVM_Android);
499//bool is_android = (g->zig_target.abi == ZigLLVM_Android);
500500//bool is_cyg_ming = is_target_cyg_mingw(&g->zig_target);
501501//if (!g->is_static && !is_android) {
502502// if (!is_cyg_ming) {
......@@ -637,7 +637,7 @@ static void construct_linker_job_coff(LinkJob *lj) {
637637 continue;
638638 }
639639 if (link_lib->provided_explicitly) {
640 if (lj->codegen->zig_target->env_type == ZigLLVM_GNU) {
640 if (lj->codegen->zig_target->abi == ZigLLVM_GNU) {
641641 Buf *arg = buf_sprintf("-l%s", buf_ptr(link_lib->name));
642642 lj->args.append(buf_ptr(arg));
643643 }
......@@ -764,8 +764,8 @@ static void get_darwin_platform(LinkJob *lj, DarwinPlatform *platform) {
764764 }
765765
766766 if (platform->kind == IPhoneOS &&
767 (g->zig_target->arch.arch == ZigLLVM_x86 ||
768 g->zig_target->arch.arch == ZigLLVM_x86_64))
767 (g->zig_target->arch == ZigLLVM_x86 ||
768 g->zig_target->arch == ZigLLVM_x86_64))
769769 {
770770 platform->kind = IPhoneOSSimulator;
771771 }
......@@ -886,7 +886,7 @@ static void construct_linker_job_macho(LinkJob *lj) {
886886 }
887887 break;
888888 case IPhoneOS:
889 if (g->zig_target->arch.arch == ZigLLVM_aarch64) {
889 if (g->zig_target->arch == ZigLLVM_aarch64) {
890890 // iOS does not need any crt1 files for arm64
891891 } else if (darwin_version_lt(&platform, 3, 1)) {
892892 lj->args.append("-lcrt1.o");
src/main.cpp+38-45
......@@ -69,9 +69,7 @@ static int print_full_usage(const char *arg0, FILE *file, int return_code) {
6969 " --single-threaded source may assume it is only used single-threaded\n"
7070 " --static output will be statically linked\n"
7171 " --strip exclude debug symbols\n"
72 " --target-arch [name] specify target architecture\n"
73 " --target-environ [name] specify target environment\n"
74 " --target-os [name] specify target operating system\n"
72 " -target [name] <arch><sub>-<os>-<abi> see the targets command\n"
7573 " --verbose-tokenize enable compiler debug output for tokenization\n"
7674 " --verbose-ast enable compiler debug output for AST parsing\n"
7775 " --verbose-link enable compiler debug output for linking\n"
......@@ -145,6 +143,14 @@ static const char *ZIG_ZEN = "\n"
145143" * Minimize energy spent on coding style.\n"
146144" * Together we serve end users.\n";
147145
146static bool arch_available_in_llvm(ZigLLVM_ArchType arch) {
147 LLVMTargetRef target_ref;
148 char *err_msg = nullptr;
149 char triple_string[128];
150 sprintf(triple_string, "%s-unknown-unknown-unknown", ZigLLVMGetArchTypeName(arch));
151 return !LLVMGetTargetFromTriple(triple_string, &target_ref, &err_msg);
152}
153
148154static int print_target_list(FILE *f) {
149155 ZigTarget native;
150156 get_native_target(&native);
......@@ -152,28 +158,36 @@ static int print_target_list(FILE *f) {
152158 fprintf(f, "Architectures:\n");
153159 size_t arch_count = target_arch_count();
154160 for (size_t arch_i = 0; arch_i < arch_count; arch_i += 1) {
155 const ArchType *arch = get_target_arch(arch_i);
156 char arch_name[50];
157 get_arch_name(arch_name, arch);
158 const char *native_str = (native.arch.arch == arch->arch && native.arch.sub_arch == arch->sub_arch) ?
159 " (native)" : "";
160 fprintf(f, " %s%s\n", arch_name, native_str);
161 ZigLLVM_ArchType arch = target_arch_enum(arch_i);
162 if (!arch_available_in_llvm(arch))
163 continue;
164 const char *arch_name = target_arch_name(arch);
165 SubArchList sub_arch_list = target_subarch_list(arch);
166 size_t sub_count = target_subarch_count(sub_arch_list);
167 const char *arch_native_str = (native.arch == arch) ? " (native)" : "";
168 fprintf(stderr, " %s%s\n", arch_name, arch_native_str);
169 for (size_t sub_i = 0; sub_i < sub_count; sub_i += 1) {
170 ZigLLVM_SubArchType sub = target_subarch_enum(sub_arch_list, sub_i);
171 const char *sub_name = target_subarch_name(sub);
172 const char *sub_native_str = (native.arch == arch && native.sub_arch == sub) ? " (native)" : "";
173 fprintf(f, " %s%s\n", sub_name, sub_native_str);
174 }
161175 }
162176
163177 fprintf(f, "\nOperating Systems:\n");
164178 size_t os_count = target_os_count();
165179 for (size_t i = 0; i < os_count; i += 1) {
166 Os os_type = get_target_os(i);
180 Os os_type = target_os_enum(i);
167181 const char *native_str = (native.os == os_type) ? " (native)" : "";
168 fprintf(f, " %s%s\n", get_target_os_name(os_type), native_str);
182 fprintf(f, " %s%s\n", target_os_name(os_type), native_str);
169183 }
170184
171 fprintf(f, "\nEnvironments:\n");
172 size_t environ_count = target_environ_count();
173 for (size_t i = 0; i < environ_count; i += 1) {
174 ZigLLVM_EnvironmentType environ_type = get_target_environ(i);
175 const char *native_str = (native.env_type == environ_type) ? " (native)" : "";
176 fprintf(f, " %s%s\n", ZigLLVMGetEnvironmentTypeName(environ_type), native_str);
185 fprintf(f, "\nC ABIs:\n");
186 size_t abi_count = target_abi_count();
187 for (size_t i = 0; i < abi_count; i += 1) {
188 ZigLLVM_EnvironmentType abi = target_abi_enum(i);
189 const char *native_str = (native.abi == abi) ? " (native)" : "";
190 fprintf(f, " %s%s\n", target_abi_name(abi), native_str);
177191 }
178192
179193 return EXIT_SUCCESS;
......@@ -397,9 +411,7 @@ int main(int argc, char **argv) {
397411 ZigList<const char *> link_libs = {0};
398412 ZigList<const char *> forbidden_link_libs = {0};
399413 ZigList<const char *> frameworks = {0};
400 const char *target_arch = nullptr;
401 const char *target_os = nullptr;
402 const char *target_environ = nullptr;
414 const char *target_string = nullptr;
403415 bool rdynamic = false;
404416 const char *mmacosx_version_min = nullptr;
405417 const char *mios_version_min = nullptr;
......@@ -740,12 +752,8 @@ int main(int argc, char **argv) {
740752 asm_files.append(argv[i]);
741753 } else if (strcmp(arg, "--cache-dir") == 0) {
742754 cache_dir = argv[i];
743 } else if (strcmp(arg, "--target-arch") == 0) {
744 target_arch = argv[i];
745 } else if (strcmp(arg, "--target-os") == 0) {
746 target_os = argv[i];
747 } else if (strcmp(arg, "--target-environ") == 0) {
748 target_environ = argv[i];
755 } else if (strcmp(arg, "-target") == 0) {
756 target_string = argv[i];
749757 } else if (strcmp(arg, "-mmacosx-version-min") == 0) {
750758 mmacosx_version_min = argv[i];
751759 } else if (strcmp(arg, "-mios-version-min") == 0) {
......@@ -874,27 +882,12 @@ int main(int argc, char **argv) {
874882 init_all_targets();
875883
876884 ZigTarget target;
877 if (!target_arch && !target_os && !target_environ) {
885 if (target_string == nullptr) {
878886 get_native_target(&target);
879887 } else {
880 get_unknown_target(&target);
881 if (target_arch) {
882 if (parse_target_arch(target_arch, &target.arch)) {
883 fprintf(stderr, "invalid --target-arch argument\n");
884 return print_error_usage(arg0);
885 }
886 }
887 if (target_os) {
888 if (parse_target_os(target_os, &target.os)) {
889 fprintf(stderr, "invalid --target-os argument\n");
890 return print_error_usage(arg0);
891 }
892 }
893 if (target_environ) {
894 if (parse_target_environ(target_environ, &target.env_type)) {
895 fprintf(stderr, "invalid --target-environ argument\n");
896 return print_error_usage(arg0);
897 }
888 if ((err = target_parse_triple(&target, target_string))) {
889 fprintf(stderr, "invalid target: %s\n", err_str(err));
890 return print_error_usage(arg0);
898891 }
899892 }
900893
src/target.cpp+534-259
......@@ -13,115 +13,105 @@
1313
1414#include <stdio.h>
1515
16static const ArchType arch_list[] = {
17 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v8_3a},
18 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v8_2a},
19 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v8_1a},
20 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v8},
21 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v8r},
22 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v8m_baseline},
23 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v8m_mainline},
24 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v7},
25 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v7em},
26 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v7m},
27 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v7s},
28 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v7k},
29 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v7ve},
30 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v6},
31 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v6m},
32 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v6k},
33 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v6t2},
34 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v5},
35 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v5te},
36 {ZigLLVM_arm, ZigLLVM_ARMSubArch_v4t},
37
38 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v8_3a},
39 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v8_2a},
40 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v8_1a},
41 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v8},
42 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v8r},
43 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v8m_baseline},
44 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v8m_mainline},
45 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v7},
46 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v7em},
47 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v7m},
48 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v7s},
49 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v7k},
50 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v7ve},
51 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v6},
52 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v6m},
53 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v6k},
54 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v6t2},
55 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v5},
56 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v5te},
57 {ZigLLVM_armeb, ZigLLVM_ARMSubArch_v4t},
58
59 {ZigLLVM_aarch64, ZigLLVM_ARMSubArch_v8_3a},
60 {ZigLLVM_aarch64, ZigLLVM_ARMSubArch_v8_2a},
61 {ZigLLVM_aarch64, ZigLLVM_ARMSubArch_v8_1a},
62 {ZigLLVM_aarch64, ZigLLVM_ARMSubArch_v8},
63 {ZigLLVM_aarch64, ZigLLVM_ARMSubArch_v8r},
64 {ZigLLVM_aarch64, ZigLLVM_ARMSubArch_v8m_baseline},
65 {ZigLLVM_aarch64, ZigLLVM_ARMSubArch_v8m_mainline},
66
67 {ZigLLVM_aarch64_be, ZigLLVM_ARMSubArch_v8_3a},
68 {ZigLLVM_aarch64_be, ZigLLVM_ARMSubArch_v8_2a},
69 {ZigLLVM_aarch64_be, ZigLLVM_ARMSubArch_v8_1a},
70 {ZigLLVM_aarch64_be, ZigLLVM_ARMSubArch_v8},
71 {ZigLLVM_aarch64_be, ZigLLVM_ARMSubArch_v8r},
72 {ZigLLVM_aarch64_be, ZigLLVM_ARMSubArch_v8m_baseline},
73 {ZigLLVM_aarch64_be, ZigLLVM_ARMSubArch_v8m_mainline},
74
75 {ZigLLVM_arc, ZigLLVM_NoSubArch},
76 {ZigLLVM_avr, ZigLLVM_NoSubArch},
77 {ZigLLVM_bpfel, ZigLLVM_NoSubArch},
78 {ZigLLVM_bpfeb, ZigLLVM_NoSubArch},
79 {ZigLLVM_hexagon, ZigLLVM_NoSubArch},
80 {ZigLLVM_mips, ZigLLVM_NoSubArch},
81 {ZigLLVM_mipsel, ZigLLVM_NoSubArch},
82 {ZigLLVM_mips64, ZigLLVM_NoSubArch},
83 {ZigLLVM_mips64el, ZigLLVM_NoSubArch},
84 {ZigLLVM_msp430, ZigLLVM_NoSubArch},
85 {ZigLLVM_nios2, ZigLLVM_NoSubArch},
86 {ZigLLVM_ppc, ZigLLVM_NoSubArch},
87 {ZigLLVM_ppc64, ZigLLVM_NoSubArch},
88 {ZigLLVM_ppc64le, ZigLLVM_NoSubArch},
89 {ZigLLVM_r600, ZigLLVM_NoSubArch},
90 {ZigLLVM_amdgcn, ZigLLVM_NoSubArch},
91 {ZigLLVM_riscv32, ZigLLVM_NoSubArch},
92 {ZigLLVM_riscv64, ZigLLVM_NoSubArch},
93 {ZigLLVM_sparc, ZigLLVM_NoSubArch},
94 {ZigLLVM_sparcv9, ZigLLVM_NoSubArch},
95 {ZigLLVM_sparcel, ZigLLVM_NoSubArch},
96 {ZigLLVM_systemz, ZigLLVM_NoSubArch},
97 {ZigLLVM_tce, ZigLLVM_NoSubArch},
98 {ZigLLVM_tcele, ZigLLVM_NoSubArch},
99 {ZigLLVM_thumb, ZigLLVM_NoSubArch},
100 {ZigLLVM_thumbeb, ZigLLVM_NoSubArch},
101 {ZigLLVM_x86, ZigLLVM_NoSubArch},
102 {ZigLLVM_x86_64, ZigLLVM_NoSubArch},
103 {ZigLLVM_xcore, ZigLLVM_NoSubArch},
104 {ZigLLVM_nvptx, ZigLLVM_NoSubArch},
105 {ZigLLVM_nvptx64, ZigLLVM_NoSubArch},
106 {ZigLLVM_le32, ZigLLVM_NoSubArch},
107 {ZigLLVM_le64, ZigLLVM_NoSubArch},
108 {ZigLLVM_amdil, ZigLLVM_NoSubArch},
109 {ZigLLVM_amdil64, ZigLLVM_NoSubArch},
110 {ZigLLVM_hsail, ZigLLVM_NoSubArch},
111 {ZigLLVM_hsail64, ZigLLVM_NoSubArch},
112 {ZigLLVM_spir, ZigLLVM_NoSubArch},
113 {ZigLLVM_spir64, ZigLLVM_NoSubArch},
114
115 {ZigLLVM_kalimba, ZigLLVM_KalimbaSubArch_v3},
116 {ZigLLVM_kalimba, ZigLLVM_KalimbaSubArch_v4},
117 {ZigLLVM_kalimba, ZigLLVM_KalimbaSubArch_v5},
118
119 {ZigLLVM_shave, ZigLLVM_NoSubArch},
120 {ZigLLVM_lanai, ZigLLVM_NoSubArch},
121 {ZigLLVM_wasm32, ZigLLVM_NoSubArch},
122 {ZigLLVM_wasm64, ZigLLVM_NoSubArch},
123 {ZigLLVM_renderscript32, ZigLLVM_NoSubArch},
124 {ZigLLVM_renderscript64, ZigLLVM_NoSubArch},
16static const SubArchList subarch_list_list[] = {
17 SubArchListNone,
18 SubArchListArm32,
19 SubArchListArm64,
20 SubArchListKalimba,
21};
22
23static const ZigLLVM_SubArchType subarch_list_arm32[] = {
24 ZigLLVM_ARMSubArch_v8_4a,
25 ZigLLVM_ARMSubArch_v8_3a,
26 ZigLLVM_ARMSubArch_v8_2a,
27 ZigLLVM_ARMSubArch_v8_1a,
28 ZigLLVM_ARMSubArch_v8,
29 ZigLLVM_ARMSubArch_v8r,
30 ZigLLVM_ARMSubArch_v8m_baseline,
31 ZigLLVM_ARMSubArch_v8m_mainline,
32 ZigLLVM_ARMSubArch_v7,
33 ZigLLVM_ARMSubArch_v7em,
34 ZigLLVM_ARMSubArch_v7m,
35 ZigLLVM_ARMSubArch_v7s,
36 ZigLLVM_ARMSubArch_v7k,
37 ZigLLVM_ARMSubArch_v7ve,
38 ZigLLVM_ARMSubArch_v6,
39 ZigLLVM_ARMSubArch_v6m,
40 ZigLLVM_ARMSubArch_v6k,
41 ZigLLVM_ARMSubArch_v6t2,
42 ZigLLVM_ARMSubArch_v5,
43 ZigLLVM_ARMSubArch_v5te,
44 ZigLLVM_ARMSubArch_v4t,
45};
46
47static const ZigLLVM_SubArchType subarch_list_arm64[] = {
48 ZigLLVM_ARMSubArch_v8_4a,
49 ZigLLVM_ARMSubArch_v8_3a,
50 ZigLLVM_ARMSubArch_v8_2a,
51 ZigLLVM_ARMSubArch_v8_1a,
52 ZigLLVM_ARMSubArch_v8,
53 ZigLLVM_ARMSubArch_v8r,
54 ZigLLVM_ARMSubArch_v8m_baseline,
55 ZigLLVM_ARMSubArch_v8m_mainline,
56};
57
58static const ZigLLVM_SubArchType subarch_list_kalimba[] = {
59 ZigLLVM_KalimbaSubArch_v5,
60 ZigLLVM_KalimbaSubArch_v4,
61 ZigLLVM_KalimbaSubArch_v3,
62};
63
64static const ZigLLVM_ArchType arch_list[] = {
65 ZigLLVM_arm,
66 ZigLLVM_armeb,
67 ZigLLVM_aarch64,
68 ZigLLVM_aarch64_be,
69 ZigLLVM_arc,
70 ZigLLVM_avr,
71 ZigLLVM_bpfel,
72 ZigLLVM_bpfeb,
73 ZigLLVM_hexagon,
74 ZigLLVM_mips,
75 ZigLLVM_mipsel,
76 ZigLLVM_mips64,
77 ZigLLVM_mips64el,
78 ZigLLVM_msp430,
79 ZigLLVM_nios2,
80 ZigLLVM_ppc,
81 ZigLLVM_ppc64,
82 ZigLLVM_ppc64le,
83 ZigLLVM_r600,
84 ZigLLVM_amdgcn,
85 ZigLLVM_riscv32,
86 ZigLLVM_riscv64,
87 ZigLLVM_sparc,
88 ZigLLVM_sparcv9,
89 ZigLLVM_sparcel,
90 ZigLLVM_systemz,
91 ZigLLVM_tce,
92 ZigLLVM_tcele,
93 ZigLLVM_thumb,
94 ZigLLVM_thumbeb,
95 ZigLLVM_x86,
96 ZigLLVM_x86_64,
97 ZigLLVM_xcore,
98 ZigLLVM_nvptx,
99 ZigLLVM_nvptx64,
100 ZigLLVM_le32,
101 ZigLLVM_le64,
102 ZigLLVM_amdil,
103 ZigLLVM_amdil64,
104 ZigLLVM_hsail,
105 ZigLLVM_hsail64,
106 ZigLLVM_spir,
107 ZigLLVM_spir64,
108 ZigLLVM_kalimba,
109 ZigLLVM_shave,
110 ZigLLVM_lanai,
111 ZigLLVM_wasm32,
112 ZigLLVM_wasm64,
113 ZigLLVM_renderscript32,
114 ZigLLVM_renderscript64,
125115};
126116
127117static const ZigLLVM_VendorType vendor_list[] = {
......@@ -179,7 +169,7 @@ static const Os os_list[] = {
179169};
180170
181171// Coordinate with zig_llvm.h
182static const ZigLLVM_EnvironmentType environ_list[] = {
172static const ZigLLVM_EnvironmentType abi_list[] = {
183173 ZigLLVM_UnknownEnvironment,
184174
185175 ZigLLVM_GNU,
......@@ -214,11 +204,12 @@ size_t target_oformat_count(void) {
214204 return array_length(oformat_list);
215205}
216206
217ZigLLVM_ObjectFormatType get_target_oformat(size_t index) {
207ZigLLVM_ObjectFormatType target_oformat_enum(size_t index) {
208 assert(index < array_length(oformat_list));
218209 return oformat_list[index];
219210}
220211
221const char *get_target_oformat_name(ZigLLVM_ObjectFormatType oformat) {
212const char *target_oformat_name(ZigLLVM_ObjectFormatType oformat) {
222213 switch (oformat) {
223214 case ZigLLVM_UnknownObjectFormat: return "unknown";
224215 case ZigLLVM_COFF: return "coff";
......@@ -233,22 +224,25 @@ size_t target_arch_count(void) {
233224 return array_length(arch_list);
234225}
235226
236const ArchType *get_target_arch(size_t index) {
237 return &arch_list[index];
227ZigLLVM_ArchType target_arch_enum(size_t index) {
228 assert(index < array_length(arch_list));
229 return arch_list[index];
238230}
239231
240232size_t target_vendor_count(void) {
241233 return array_length(vendor_list);
242234}
243235
244ZigLLVM_VendorType get_target_vendor(size_t index) {
236ZigLLVM_VendorType target_vendor_enum(size_t index) {
237 assert(index < array_length(vendor_list));
245238 return vendor_list[index];
246239}
247240
248241size_t target_os_count(void) {
249242 return array_length(os_list);
250243}
251Os get_target_os(size_t index) {
244Os target_os_enum(size_t index) {
245 assert(index < array_length(os_list));
252246 return os_list[index];
253247}
254248
......@@ -391,7 +385,7 @@ static Os get_zig_os_type(ZigLLVM_OSType os_type) {
391385 zig_unreachable();
392386}
393387
394const char *get_target_os_name(Os os_type) {
388const char *target_os_name(Os os_type) {
395389 switch (os_type) {
396390 case OsFreestanding:
397391 return "freestanding";
......@@ -434,80 +428,251 @@ const char *get_target_os_name(Os os_type) {
434428 zig_unreachable();
435429}
436430
437size_t target_environ_count(void) {
438 return array_length(environ_list);
431size_t target_abi_count(void) {
432 return array_length(abi_list);
433}
434ZigLLVM_EnvironmentType target_abi_enum(size_t index) {
435 assert(index < array_length(abi_list));
436 return abi_list[index];
439437}
440ZigLLVM_EnvironmentType get_target_environ(size_t index) {
441 return environ_list[index];
438const char *target_abi_name(ZigLLVM_EnvironmentType abi) {
439 if (abi == ZigLLVM_UnknownEnvironment)
440 return "none";
441 return ZigLLVMGetEnvironmentTypeName(abi);
442442}
443443
444444void get_native_target(ZigTarget *target) {
445445 ZigLLVM_OSType os_type;
446446 ZigLLVM_ObjectFormatType oformat; // ignored; based on arch/os
447447 ZigLLVMGetNativeTarget(
448 &target->arch.arch,
449 &target->arch.sub_arch,
448 &target->arch,
449 &target->sub_arch,
450450 &target->vendor,
451451 &os_type,
452 &target->env_type,
452 &target->abi,
453453 &oformat);
454454 target->os = get_zig_os_type(os_type);
455455 target->is_native = true;
456 if (target->abi == ZigLLVM_UnknownEnvironment) {
457 target->abi = target_default_abi(target->arch, target->os);
458 }
456459}
457460
458void get_unknown_target(ZigTarget *target) {
459 target->arch.arch = ZigLLVM_UnknownArch;
460 target->arch.sub_arch = ZigLLVM_NoSubArch;
461 target->vendor = ZigLLVM_UnknownVendor;
462 target->os = OsFreestanding;
463 target->env_type = ZigLLVM_UnknownEnvironment;
464 target->is_native = false;
461Error target_parse_archsub(ZigLLVM_ArchType *out_arch, ZigLLVM_SubArchType *out_sub,
462 const char *archsub_ptr, size_t archsub_len)
463{
464 for (size_t arch_i = 0; arch_i < array_length(arch_list); arch_i += 1) {
465 ZigLLVM_ArchType arch = arch_list[arch_i];
466 SubArchList sub_arch_list = target_subarch_list(arch);
467 size_t subarch_count = target_subarch_count(sub_arch_list);
468 if (subarch_count == 0) {
469 if (mem_eql_str(archsub_ptr, archsub_len, target_arch_name(arch))) {
470 *out_arch = arch;
471 *out_sub = ZigLLVM_NoSubArch;
472 return ErrorNone;
473 }
474 continue;
475 }
476 for (size_t sub_i = 0; sub_i < subarch_count; sub_i += 1) {
477 ZigLLVM_SubArchType sub = target_subarch_enum(sub_arch_list, sub_i);
478 char arch_name[64];
479 int n = sprintf(arch_name, "%s%s", target_arch_name(arch), target_subarch_name(sub));
480 if (mem_eql_mem(arch_name, n, archsub_ptr, archsub_len)) {
481 *out_arch = arch;
482 *out_sub = sub;
483 return ErrorNone;
484 }
485 }
486 }
487 return ErrorUnknownArchitecture;
465488}
466489
467static void get_arch_name_raw(char *out_str, ZigLLVM_ArchType arch, ZigLLVM_SubArchType sub_arch) {
468 const char *sub_str = (sub_arch == ZigLLVM_NoSubArch) ? "" : ZigLLVMGetSubArchTypeName(sub_arch);
469 sprintf(out_str, "%s%s", ZigLLVMGetArchTypeName(arch), sub_str);
470}
490SubArchList target_subarch_list(ZigLLVM_ArchType arch) {
491 switch (arch) {
492 case ZigLLVM_UnknownArch:
493 zig_unreachable();
494 case ZigLLVM_arm:
495 case ZigLLVM_armeb:
496 case ZigLLVM_thumb:
497 case ZigLLVM_thumbeb:
498 return SubArchListArm32;
499
500 case ZigLLVM_aarch64:
501 case ZigLLVM_aarch64_be:
502 return SubArchListArm64;
503
504 case ZigLLVM_kalimba:
505 return SubArchListKalimba;
471506
472void get_arch_name(char *out_str, const ArchType *arch) {
473 return get_arch_name_raw(out_str, arch->arch, arch->sub_arch);
507 case ZigLLVM_arc:
508 case ZigLLVM_avr:
509 case ZigLLVM_bpfel:
510 case ZigLLVM_bpfeb:
511 case ZigLLVM_hexagon:
512 case ZigLLVM_mips:
513 case ZigLLVM_mipsel:
514 case ZigLLVM_mips64:
515 case ZigLLVM_mips64el:
516 case ZigLLVM_msp430:
517 case ZigLLVM_nios2:
518 case ZigLLVM_ppc:
519 case ZigLLVM_ppc64:
520 case ZigLLVM_ppc64le:
521 case ZigLLVM_r600:
522 case ZigLLVM_amdgcn:
523 case ZigLLVM_riscv32:
524 case ZigLLVM_riscv64:
525 case ZigLLVM_sparc:
526 case ZigLLVM_sparcv9:
527 case ZigLLVM_sparcel:
528 case ZigLLVM_systemz:
529 case ZigLLVM_tce:
530 case ZigLLVM_tcele:
531 case ZigLLVM_x86:
532 case ZigLLVM_x86_64:
533 case ZigLLVM_xcore:
534 case ZigLLVM_nvptx:
535 case ZigLLVM_nvptx64:
536 case ZigLLVM_le32:
537 case ZigLLVM_le64:
538 case ZigLLVM_amdil:
539 case ZigLLVM_amdil64:
540 case ZigLLVM_hsail:
541 case ZigLLVM_hsail64:
542 case ZigLLVM_spir:
543 case ZigLLVM_spir64:
544 case ZigLLVM_shave:
545 case ZigLLVM_lanai:
546 case ZigLLVM_wasm32:
547 case ZigLLVM_wasm64:
548 case ZigLLVM_renderscript32:
549 case ZigLLVM_renderscript64:
550 return SubArchListNone;
551 }
552 zig_unreachable();
474553}
475554
476int parse_target_arch(const char *str, ArchType *out_arch) {
477 for (size_t i = 0; i < array_length(arch_list); i += 1) {
478 const ArchType *arch = &arch_list[i];
479 char arch_name[50];
480 get_arch_name_raw(arch_name, arch->arch, arch->sub_arch);
481 if (strcmp(arch_name, str) == 0) {
482 *out_arch = *arch;
555size_t target_subarch_count(SubArchList sub_arch_list) {
556 switch (sub_arch_list) {
557 case SubArchListNone:
483558 return 0;
484 }
559 case SubArchListArm32:
560 return array_length(subarch_list_arm32);
561 case SubArchListArm64:
562 return array_length(subarch_list_arm64);
563 case SubArchListKalimba:
564 return array_length(subarch_list_kalimba);
565 }
566 zig_unreachable();
567}
568
569ZigLLVM_SubArchType target_subarch_enum(SubArchList sub_arch_list, size_t i) {
570 switch (sub_arch_list) {
571 case SubArchListNone:
572 zig_unreachable();
573 case SubArchListArm32:
574 assert(i < array_length(subarch_list_arm32));
575 return subarch_list_arm32[i];
576 case SubArchListArm64:
577 assert(i < array_length(subarch_list_arm64));
578 return subarch_list_arm64[i];
579 case SubArchListKalimba:
580 assert(i < array_length(subarch_list_kalimba));
581 return subarch_list_kalimba[i];
582 }
583 zig_unreachable();
584}
585
586const char *target_subarch_name(ZigLLVM_SubArchType subarch) {
587 return ZigLLVMGetSubArchTypeName(subarch);
588}
589
590size_t target_subarch_list_count(void) {
591 return array_length(subarch_list_list);
592}
593
594SubArchList target_subarch_list_enum(size_t index) {
595 assert(index < array_length(subarch_list_list));
596 return subarch_list_list[index];
597}
598
599const char *target_subarch_list_name(SubArchList sub_arch_list) {
600 switch (sub_arch_list) {
601 case SubArchListNone:
602 return "None";
603 case SubArchListArm32:
604 return "Arm32";
605 case SubArchListArm64:
606 return "Arm64";
607 case SubArchListKalimba:
608 return "Kalimba";
485609 }
486 return ErrorFileNotFound;
610 zig_unreachable();
487611}
488612
489int parse_target_os(const char *str, Os *out_os) {
613Error target_parse_os(Os *out_os, const char *os_ptr, size_t os_len) {
490614 for (size_t i = 0; i < array_length(os_list); i += 1) {
491615 Os os = os_list[i];
492 const char *os_name = get_target_os_name(os);
493 if (strcmp(os_name, str) == 0) {
616 const char *os_name = target_os_name(os);
617 if (mem_eql_str(os_ptr, os_len, os_name)) {
494618 *out_os = os;
495 return 0;
619 return ErrorNone;
496620 }
497621 }
498 return ErrorFileNotFound;
622 return ErrorUnknownOperatingSystem;
499623}
500624
501int parse_target_environ(const char *str, ZigLLVM_EnvironmentType *out_environ) {
502 for (size_t i = 0; i < array_length(environ_list); i += 1) {
503 ZigLLVM_EnvironmentType env_type = environ_list[i];
504 const char *environ_name = ZigLLVMGetEnvironmentTypeName(env_type);
505 if (strcmp(environ_name, str) == 0) {
506 *out_environ = env_type;
507 return 0;
625Error target_parse_abi(ZigLLVM_EnvironmentType *out_abi, const char *abi_ptr, size_t abi_len) {
626 for (size_t i = 0; i < array_length(abi_list); i += 1) {
627 ZigLLVM_EnvironmentType abi = abi_list[i];
628 const char *abi_name = target_abi_name(abi);
629 if (mem_eql_str(abi_ptr, abi_len, abi_name)) {
630 *out_abi = abi;
631 return ErrorNone;
632 }
633 }
634 return ErrorUnknownABI;
635}
636
637Error target_parse_triple(ZigTarget *target, const char *triple) {
638 Error err;
639 SplitIterator it = memSplit(str(triple), str("-"));
640
641 Optional<Slice<uint8_t>> opt_archsub = SplitIterator_next(&it);
642 Optional<Slice<uint8_t>> opt_os = SplitIterator_next(&it);
643 Optional<Slice<uint8_t>> opt_abi = SplitIterator_next(&it);
644
645 if (!opt_archsub.is_some)
646 return ErrorMissingArchitecture;
647
648 if (!opt_os.is_some)
649 return ErrorMissingOperatingSystem;
650
651 if ((err = target_parse_archsub(&target->arch, &target->sub_arch,
652 (char*)opt_archsub.value.ptr, opt_archsub.value.len)))
653 {
654 return err;
655 }
656
657 if ((err = target_parse_os(&target->os, (char*)opt_os.value.ptr, opt_os.value.len))) {
658 return err;
659 }
660
661 if (opt_abi.is_some) {
662 if ((err = target_parse_abi(&target->abi, (char*)opt_abi.value.ptr, opt_abi.value.len))) {
663 return err;
508664 }
665 } else {
666 target->abi = target_default_abi(target->arch, target->os);
509667 }
510 return ErrorFileNotFound;
668
669 target->vendor = ZigLLVM_UnknownVendor;
670 target->is_native = false;
671 return ErrorNone;
672}
673
674const char *target_arch_name(ZigLLVM_ArchType arch) {
675 return ZigLLVMGetArchTypeName(arch);
511676}
512677
513678void init_all_targets(void) {
......@@ -519,37 +684,21 @@ void init_all_targets(void) {
519684}
520685
521686void get_target_triple(Buf *triple, const ZigTarget *target) {
522 char arch_name[50];
523 get_arch_name(arch_name, &target->arch);
524
525687 buf_resize(triple, 0);
526
527 // LLVM WebAssembly output support requires the target to be activated at
528 // build type with -DCMAKE_LLVM_EXPIERMENTAL_TARGETS_TO_BUILD=WebAssembly.
529 //
530 // LLVM determines the output format based on the environment suffix,
531 // defaulting to an object based on the architecture. The default format in
532 // LLVM 6 sets the wasm arch output incorrectly to ELF. We need to
533 // explicitly set this ourself in order for it to work.
534 //
535 // This is fixed in LLVM 7 and you will be able to get wasm output by
536 // using the target triple `wasm32-unknown-unknown-unknown`.
537 if (!strncmp(arch_name, "wasm", 4)) {
538 buf_appendf(triple, "%s-%s-%s-wasm", arch_name,
539 ZigLLVMGetVendorTypeName(target->vendor),
540 ZigLLVMGetOSTypeName(get_llvm_os_type(target->os)));
541 } else {
542 buf_appendf(triple, "%s-%s-%s-%s", arch_name,
543 ZigLLVMGetVendorTypeName(target->vendor),
544 ZigLLVMGetOSTypeName(get_llvm_os_type(target->os)),
545 ZigLLVMGetEnvironmentTypeName(target->env_type));
546 }
688 buf_appendf(triple, "%s%s-%s-%s-%s",
689 ZigLLVMGetArchTypeName(target->arch),
690 ZigLLVMGetSubArchTypeName(target->sub_arch),
691 ZigLLVMGetVendorTypeName(target->vendor),
692 ZigLLVMGetOSTypeName(get_llvm_os_type(target->os)),
693 ZigLLVMGetEnvironmentTypeName(target->abi));
547694}
548695
549696bool target_is_darwin(const ZigTarget *target) {
550697 switch (target->os) {
551698 case OsMacOSX:
552699 case OsIOS:
700 case OsWatchOS:
701 case OsTvOS:
553702 return true;
554703 default:
555704 return false;
......@@ -562,8 +711,8 @@ ZigLLVM_ObjectFormatType target_object_format(const ZigTarget *target) {
562711 } else if (target_is_darwin(target)) {
563712 return ZigLLVM_MachO;
564713 }
565 if (target->arch.arch == ZigLLVM_wasm32 ||
566 target->arch.arch == ZigLLVM_wasm64)
714 if (target->arch == ZigLLVM_wasm32 ||
715 target->arch == ZigLLVM_wasm64)
567716 {
568717 return ZigLLVM_Wasm;
569718 }
......@@ -639,7 +788,7 @@ static int get_arch_pointer_bit_width(ZigLLVM_ArchType arch) {
639788uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id) {
640789 switch (target->os) {
641790 case OsFreestanding:
642 switch (target->arch.arch) {
791 switch (target->arch) {
643792 case ZigLLVM_msp430:
644793 switch (id) {
645794 case CIntTypeShort:
......@@ -667,7 +816,7 @@ uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id) {
667816 return 32;
668817 case CIntTypeLong:
669818 case CIntTypeULong:
670 return get_arch_pointer_bit_width(target->arch.arch);
819 return get_arch_pointer_bit_width(target->arch);
671820 case CIntTypeLongLong:
672821 case CIntTypeULongLong:
673822 return 64;
......@@ -690,7 +839,7 @@ uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id) {
690839 return 32;
691840 case CIntTypeLong:
692841 case CIntTypeULong:
693 return get_arch_pointer_bit_width(target->arch.arch);
842 return get_arch_pointer_bit_width(target->arch);
694843 case CIntTypeLongLong:
695844 case CIntTypeULongLong:
696845 return 64;
......@@ -748,7 +897,7 @@ bool target_allows_addr_zero(const ZigTarget *target) {
748897}
749898
750899const char *target_o_file_ext(const ZigTarget *target) {
751 if (target->env_type == ZigLLVM_MSVC || target->os == OsWindows || target->os == OsUefi) {
900 if (target->abi == ZigLLVM_MSVC || target->os == OsWindows || target->os == OsUefi) {
752901 return ".obj";
753902 } else {
754903 return ".o";
......@@ -798,7 +947,7 @@ enum FloatAbi {
798947};
799948
800949static FloatAbi get_float_abi(const ZigTarget *target) {
801 const ZigLLVM_EnvironmentType env = target->env_type;
950 const ZigLLVM_EnvironmentType env = target->abi;
802951 if (env == ZigLLVM_GNUEABIHF ||
803952 env == ZigLLVM_EABIHF ||
804953 env == ZigLLVM_MuslEABIHF)
......@@ -813,71 +962,154 @@ static bool is_64_bit(ZigLLVM_ArchType arch) {
813962 return get_arch_pointer_bit_width(arch) == 64;
814963}
815964
816Buf *target_dynamic_linker(const ZigTarget *target) {
817 if (target->os == OsFreeBSD) {
818 return buf_create_from_str("/libexec/ld-elf.so.1");
819 }
820 if (target->os == OsNetBSD) {
821 return buf_create_from_str("/libexec/ld.elf_so");
822 }
965const char *target_dynamic_linker(const ZigTarget *target) {
966 switch (target->os) {
967 case OsFreeBSD:
968 return "/libexec/ld-elf.so.1";
969 case OsNetBSD:
970 return "/libexec/ld.elf_so";
971 case OsLinux: {
972 const ZigLLVM_EnvironmentType abi = target->abi;
973 if (abi == ZigLLVM_Android) {
974 if (is_64_bit(target->arch)) {
975 return "/system/bin/linker64";
976 } else {
977 return "/system/bin/linker";
978 }
979 }
823980
824 const ZigLLVM_ArchType arch = target->arch.arch;
825 const ZigLLVM_EnvironmentType env = target->env_type;
981 switch (target->arch) {
982 case ZigLLVM_UnknownArch:
983 zig_unreachable();
984 case ZigLLVM_x86:
985 case ZigLLVM_sparc:
986 case ZigLLVM_sparcel:
987 return "/lib/ld-linux.so.2";
988
989 case ZigLLVM_aarch64:
990 return "/lib/ld-linux-aarch64.so.1";
991
992 case ZigLLVM_aarch64_be:
993 return "/lib/ld-linux-aarch64_be.so.1";
994
995 case ZigLLVM_arm:
996 case ZigLLVM_thumb:
997 if (get_float_abi(target) == FloatAbiHard) {
998 return "/lib/ld-linux-armhf.so.3";
999 } else {
1000 return "/lib/ld-linux.so.3";
1001 }
8261002
827 if (env == ZigLLVM_Android) {
828 if (is_64_bit(arch)) {
829 return buf_create_from_str("/system/bin/linker64");
830 } else {
831 return buf_create_from_str("/system/bin/linker");
832 }
833 } else if (arch == ZigLLVM_x86 ||
834 arch == ZigLLVM_sparc ||
835 arch == ZigLLVM_sparcel)
836 {
837 return buf_create_from_str("/lib/ld-linux.so.2");
838 } else if (arch == ZigLLVM_aarch64) {
839 return buf_create_from_str("/lib/ld-linux-aarch64.so.1");
840 } else if (arch == ZigLLVM_aarch64_be) {
841 return buf_create_from_str("/lib/ld-linux-aarch64_be.so.1");
842 } else if (arch == ZigLLVM_arm || arch == ZigLLVM_thumb) {
843 if (get_float_abi(target) == FloatAbiHard) {
844 return buf_create_from_str("/lib/ld-linux-armhf.so.3");
845 } else {
846 return buf_create_from_str("/lib/ld-linux.so.3");
847 }
848 } else if (arch == ZigLLVM_armeb || arch == ZigLLVM_thumbeb) {
849 if (get_float_abi(target) == FloatAbiHard) {
850 return buf_create_from_str("/lib/ld-linux-armhf.so.3");
851 } else {
852 return buf_create_from_str("/lib/ld-linux.so.3");
1003 case ZigLLVM_armeb:
1004 case ZigLLVM_thumbeb:
1005 if (get_float_abi(target) == FloatAbiHard) {
1006 return "/lib/ld-linux-armhf.so.3";
1007 } else {
1008 return "/lib/ld-linux.so.3";
1009 }
1010
1011 case ZigLLVM_mips:
1012 case ZigLLVM_mipsel:
1013 case ZigLLVM_mips64:
1014 case ZigLLVM_mips64el:
1015 zig_panic("TODO implement target_dynamic_linker for mips");
1016
1017 case ZigLLVM_ppc:
1018 return "/lib/ld.so.1";
1019
1020 case ZigLLVM_ppc64:
1021 return "/lib64/ld64.so.2";
1022
1023 case ZigLLVM_ppc64le:
1024 return "/lib64/ld64.so.2";
1025
1026 case ZigLLVM_systemz:
1027 return "/lib64/ld64.so.1";
1028
1029 case ZigLLVM_sparcv9:
1030 return "/lib64/ld-linux.so.2";
1031
1032 case ZigLLVM_x86_64:
1033 if (abi == ZigLLVM_GNUX32) {
1034 return "/libx32/ld-linux-x32.so.2";
1035 }
1036 if (abi == ZigLLVM_Musl || abi == ZigLLVM_MuslEABI || abi == ZigLLVM_MuslEABIHF) {
1037 return "/lib/ld-musl-x86_64.so.1";
1038 }
1039 return "/lib64/ld-linux-x86-64.so.2";
1040
1041 case ZigLLVM_wasm32:
1042 case ZigLLVM_wasm64:
1043 return nullptr;
1044
1045 case ZigLLVM_arc:
1046 case ZigLLVM_avr:
1047 case ZigLLVM_bpfel:
1048 case ZigLLVM_bpfeb:
1049 case ZigLLVM_hexagon:
1050 case ZigLLVM_msp430:
1051 case ZigLLVM_nios2:
1052 case ZigLLVM_r600:
1053 case ZigLLVM_amdgcn:
1054 case ZigLLVM_riscv32:
1055 case ZigLLVM_riscv64:
1056 case ZigLLVM_tce:
1057 case ZigLLVM_tcele:
1058 case ZigLLVM_xcore:
1059 case ZigLLVM_nvptx:
1060 case ZigLLVM_nvptx64:
1061 case ZigLLVM_le32:
1062 case ZigLLVM_le64:
1063 case ZigLLVM_amdil:
1064 case ZigLLVM_amdil64:
1065 case ZigLLVM_hsail:
1066 case ZigLLVM_hsail64:
1067 case ZigLLVM_spir:
1068 case ZigLLVM_spir64:
1069 case ZigLLVM_kalimba:
1070 case ZigLLVM_shave:
1071 case ZigLLVM_lanai:
1072 case ZigLLVM_renderscript32:
1073 case ZigLLVM_renderscript64:
1074 zig_panic("TODO implement target_dynamic_linker for this arch");
1075 }
1076 zig_unreachable();
8531077 }
854 } else if (arch == ZigLLVM_mips || arch == ZigLLVM_mipsel ||
855 arch == ZigLLVM_mips64 || arch == ZigLLVM_mips64el)
856 {
857 // when you want to solve this TODO, grep clang codebase for
858 // getLinuxDynamicLinker
859 zig_panic("TODO figure out MIPS dynamic linker name");
860 } else if (arch == ZigLLVM_ppc) {
861 return buf_create_from_str("/lib/ld.so.1");
862 } else if (arch == ZigLLVM_ppc64) {
863 return buf_create_from_str("/lib64/ld64.so.2");
864 } else if (arch == ZigLLVM_ppc64le) {
865 return buf_create_from_str("/lib64/ld64.so.2");
866 } else if (arch == ZigLLVM_systemz) {
867 return buf_create_from_str("/lib64/ld64.so.1");
868 } else if (arch == ZigLLVM_sparcv9) {
869 return buf_create_from_str("/lib64/ld-linux.so.2");
870 } else if (arch == ZigLLVM_x86_64 &&
871 env == ZigLLVM_GNUX32)
872 {
873 return buf_create_from_str("/libx32/ld-linux-x32.so.2");
874 } else if (arch == ZigLLVM_x86_64 &&
875 (env == ZigLLVM_Musl || env == ZigLLVM_MuslEABI || env == ZigLLVM_MuslEABIHF))
876 {
877 return buf_create_from_str("/lib/ld-musl-x86_64.so.1");
878 } else {
879 return buf_create_from_str("/lib64/ld-linux-x86-64.so.2");
1078 case OsFreestanding:
1079 case OsIOS:
1080 case OsTvOS:
1081 case OsWatchOS:
1082 case OsMacOSX:
1083 return nullptr;
1084
1085 case OsAnanas:
1086 case OsCloudABI:
1087 case OsDragonFly:
1088 case OsFuchsia:
1089 case OsKFreeBSD:
1090 case OsLv2:
1091 case OsOpenBSD:
1092 case OsSolaris:
1093 case OsWindows:
1094 case OsHaiku:
1095 case OsMinix:
1096 case OsRTEMS:
1097 case OsNaCl:
1098 case OsCNK:
1099 case OsAIX:
1100 case OsCUDA:
1101 case OsNVCL:
1102 case OsAMDHSA:
1103 case OsPS4:
1104 case OsELFIAMCU:
1105 case OsMesa3D:
1106 case OsContiki:
1107 case OsAMDPAL:
1108 case OsZen:
1109 case OsUefi:
1110 zig_panic("TODO implement target_dynamic_linker for this OS");
8801111 }
1112 zig_unreachable();
8811113}
8821114
8831115bool target_can_exec(const ZigTarget *host_target, const ZigTarget *guest_target) {
......@@ -888,15 +1120,15 @@ bool target_can_exec(const ZigTarget *host_target, const ZigTarget *guest_target
8881120 return true;
8891121 }
8901122
891 if (guest_target->os == host_target->os && guest_target->arch.arch == host_target->arch.arch &&
892 guest_target->arch.sub_arch == host_target->arch.sub_arch)
1123 if (guest_target->os == host_target->os && guest_target->arch == host_target->arch &&
1124 guest_target->sub_arch == host_target->sub_arch)
8931125 {
8941126 // OS, arch, and sub-arch match
8951127 return true;
8961128 }
8971129
8981130 if (guest_target->os == OsWindows && host_target->os == OsWindows &&
899 host_target->arch.arch == ZigLLVM_x86_64 && guest_target->arch.arch == ZigLLVM_x86)
1131 host_target->arch == ZigLLVM_x86_64 && guest_target->arch == ZigLLVM_x86)
9001132 {
9011133 // 64-bit windows can run 32-bit programs
9021134 return true;
......@@ -905,8 +1137,8 @@ bool target_can_exec(const ZigTarget *host_target, const ZigTarget *guest_target
9051137 return false;
9061138}
9071139
908const char *arch_stack_pointer_register_name(const ArchType *arch) {
909 switch (arch->arch) {
1140const char *arch_stack_pointer_register_name(ZigLLVM_ArchType arch) {
1141 switch (arch) {
9101142 case ZigLLVM_UnknownArch:
9111143 zig_unreachable();
9121144 case ZigLLVM_x86:
......@@ -969,7 +1201,7 @@ const char *arch_stack_pointer_register_name(const ArchType *arch) {
9691201}
9701202
9711203bool target_is_arm(const ZigTarget *target) {
972 switch (target->arch.arch) {
1204 switch (target->arch) {
9731205 case ZigLLVM_UnknownArch:
9741206 zig_unreachable();
9751207 case ZigLLVM_aarch64:
......@@ -1031,12 +1263,12 @@ bool target_is_arm(const ZigTarget *target) {
10311263
10321264// Valgrind supports more, but Zig does not support them yet.
10331265bool target_has_valgrind_support(const ZigTarget *target) {
1034 switch (target->arch.arch) {
1266 switch (target->arch) {
10351267 case ZigLLVM_UnknownArch:
10361268 zig_unreachable();
10371269 case ZigLLVM_x86_64:
10381270 return (target->os == OsLinux || target_is_darwin(target) || target->os == OsSolaris ||
1039 (target->os == OsWindows && target->env_type != ZigLLVM_MSVC));
1271 (target->os == OsWindows && target->abi != ZigLLVM_MSVC));
10401272 default:
10411273 return false;
10421274 }
......@@ -1055,3 +1287,46 @@ bool target_supports_fpic(const ZigTarget *target) {
10551287 // C compiler argument is valid.
10561288 return target->os != OsWindows;
10571289}
1290
1291ZigLLVM_EnvironmentType target_default_abi(ZigLLVM_ArchType arch, Os os) {
1292 switch (os) {
1293 case OsFreestanding:
1294 case OsAnanas:
1295 case OsCloudABI:
1296 case OsDragonFly:
1297 case OsLv2:
1298 case OsSolaris:
1299 case OsHaiku:
1300 case OsMinix:
1301 case OsRTEMS:
1302 case OsNaCl:
1303 case OsCNK:
1304 case OsAIX:
1305 case OsCUDA:
1306 case OsNVCL:
1307 case OsAMDHSA:
1308 case OsPS4:
1309 case OsELFIAMCU:
1310 case OsMesa3D:
1311 case OsContiki:
1312 case OsAMDPAL:
1313 case OsZen:
1314 return ZigLLVM_EABI;
1315 case OsOpenBSD:
1316 case OsMacOSX:
1317 case OsFreeBSD:
1318 case OsIOS:
1319 case OsTvOS:
1320 case OsWatchOS:
1321 case OsFuchsia:
1322 case OsKFreeBSD:
1323 case OsNetBSD:
1324 return ZigLLVM_GNU;
1325 case OsWindows:
1326 case OsUefi:
1327 return ZigLLVM_MSVC;
1328 case OsLinux:
1329 return ZigLLVM_Musl;
1330 }
1331 zig_unreachable();
1332}
src/target.hpp+40-25
......@@ -12,11 +12,6 @@
1212
1313struct Buf;
1414
15struct ArchType {
16 ZigLLVM_ArchType arch;
17 ZigLLVM_SubArchType sub_arch;
18};
19
2015// Synchronize with target.cpp::os_list
2116enum Os {
2217 OsFreestanding,
......@@ -54,6 +49,14 @@ enum Os {
5449 OsUefi,
5550};
5651
52// Synchronize with target.cpp::subarch_list_list
53enum SubArchList {
54 SubArchListNone,
55 SubArchListArm32,
56 SubArchListArm64,
57 SubArchListKalimba,
58};
59
5760enum TargetSubsystem {
5861 TargetSubsystemAuto, // Zig should infer the subsystem
5962 TargetSubsystemConsole,
......@@ -67,10 +70,11 @@ enum TargetSubsystem {
6770};
6871
6972struct ZigTarget {
70 ArchType arch;
73 ZigLLVM_ArchType arch;
74 ZigLLVM_SubArchType sub_arch;
7175 ZigLLVM_VendorType vendor;
7276 Os os;
73 ZigLLVM_EnvironmentType env_type;
77 ZigLLVM_EnvironmentType abi;
7478 bool is_native;
7579};
7680
......@@ -87,39 +91,50 @@ enum CIntType {
8791 CIntTypeCount,
8892};
8993
94Error target_parse_triple(ZigTarget *target, const char *triple);
95Error target_parse_archsub(ZigLLVM_ArchType *arch, ZigLLVM_SubArchType *sub,
96 const char *archsub_ptr, size_t archsub_len);
97Error target_parse_os(Os *os, const char *os_ptr, size_t os_len);
98Error target_parse_abi(ZigLLVM_EnvironmentType *abi, const char *abi_ptr, size_t abi_len);
99
90100size_t target_arch_count(void);
91const ArchType *get_target_arch(size_t index);
92void get_arch_name(char *out_str, const ArchType *arch);
101ZigLLVM_ArchType target_arch_enum(size_t index);
102const char *target_arch_name(ZigLLVM_ArchType arch);
103
104SubArchList target_subarch_list(ZigLLVM_ArchType arch);
105size_t target_subarch_count(SubArchList sub_arch_list);
106ZigLLVM_SubArchType target_subarch_enum(SubArchList subarch_list, size_t index);
107const char *target_subarch_name(ZigLLVM_SubArchType subarch);
93108
94const char *arch_stack_pointer_register_name(const ArchType *arch);
109size_t target_subarch_list_count(void);
110SubArchList target_subarch_list_enum(size_t index);
111const char *target_subarch_list_name(SubArchList sub_arch_list);
112
113const char *arch_stack_pointer_register_name(ZigLLVM_ArchType arch);
95114
96115size_t target_vendor_count(void);
97ZigLLVM_VendorType get_target_vendor(size_t index);
116ZigLLVM_VendorType target_vendor_enum(size_t index);
98117
99118size_t target_os_count(void);
100Os get_target_os(size_t index);
101const char *get_target_os_name(Os os_type);
119Os target_os_enum(size_t index);
120const char *target_os_name(Os os_type);
102121
103size_t target_environ_count(void);
104ZigLLVM_EnvironmentType get_target_environ(size_t index);
122size_t target_abi_count(void);
123ZigLLVM_EnvironmentType target_abi_enum(size_t index);
124const char *target_abi_name(ZigLLVM_EnvironmentType abi);
125ZigLLVM_EnvironmentType target_default_abi(ZigLLVM_ArchType arch, Os os);
105126
106127
107128size_t target_oformat_count(void);
108ZigLLVM_ObjectFormatType get_target_oformat(size_t index);
109const char *get_target_oformat_name(ZigLLVM_ObjectFormatType oformat);
129ZigLLVM_ObjectFormatType target_oformat_enum(size_t index);
130const char *target_oformat_name(ZigLLVM_ObjectFormatType oformat);
110131ZigLLVM_ObjectFormatType target_object_format(const ZigTarget *target);
111132
112133void get_native_target(ZigTarget *target);
113void get_unknown_target(ZigTarget *target);
114
115int parse_target_arch(const char *str, ArchType *arch);
116int parse_target_os(const char *str, Os *os);
117int parse_target_environ(const char *str, ZigLLVM_EnvironmentType *env_type);
134void get_target_triple(Buf *triple, const ZigTarget *target);
118135
119136void init_all_targets(void);
120137
121void get_target_triple(Buf *triple, const ZigTarget *target);
122
123138void resolve_target_object_format(ZigTarget *target);
124139
125140uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id);
......@@ -131,7 +146,7 @@ const char *target_exe_file_ext(const ZigTarget *target);
131146const char *target_lib_file_ext(const ZigTarget *target, bool is_static,
132147 size_t version_major, size_t version_minor, size_t version_patch);
133148
134Buf *target_dynamic_linker(const ZigTarget *target);
149const char *target_dynamic_linker(const ZigTarget *target);
135150
136151bool target_can_exec(const ZigTarget *host_target, const ZigTarget *guest_target);
137152ZigLLVM_OSType get_llvm_os_type(Os os_type);
src/util.hpp+7-4
......@@ -147,11 +147,14 @@ static inline T clamp(T min_value, T value, T max_value) {
147147 return max(min(value, max_value), min_value);
148148}
149149
150static inline bool mem_eql_str(const char *mem, size_t mem_len, const char *str) {
151 size_t str_len = strlen(str);
152 if (str_len != mem_len)
150static inline bool mem_eql_mem(const char *a_ptr, size_t a_len, const char *b_ptr, size_t b_len) {
151 if (a_len != b_len)
153152 return false;
154 return memcmp(mem, str, mem_len) == 0;
153 return memcmp(a_ptr, b_ptr, a_len) == 0;
154}
155
156static inline bool mem_eql_str(const char *mem, size_t mem_len, const char *str) {
157 return mem_eql_mem(mem, mem_len, str, strlen(str));
155158}
156159
157160static inline bool is_power_of_2(uint64_t x) {
src/zig_llvm.cpp+1-1
......@@ -730,7 +730,7 @@ void ZigLLVMGetNativeTarget(ZigLLVM_ArchType *arch_type, ZigLLVM_SubArchType *su
730730const char *ZigLLVMGetSubArchTypeName(ZigLLVM_SubArchType sub_arch) {
731731 switch (sub_arch) {
732732 case ZigLLVM_NoSubArch:
733 return "(none)";
733 return "";
734734 case ZigLLVM_ARMSubArch_v8_4a:
735735 return "v8_4a";
736736 case ZigLLVM_ARMSubArch_v8_3a:
src/zig_llvm.h+3-2
......@@ -215,7 +215,7 @@ ZIG_EXTERN_C void ZigLLVMParseCommandLineOptions(size_t argc, const char *const
215215
216216
217217// copied from include/llvm/ADT/Triple.h
218
218// synchronize with target.cpp::arch_list
219219enum ZigLLVM_ArchType {
220220 ZigLLVM_UnknownArch,
221221
......@@ -273,6 +273,7 @@ enum ZigLLVM_ArchType {
273273 ZigLLVM_LastArchType = ZigLLVM_renderscript64
274274};
275275
276// synchronize with lists in target.cpp
276277enum ZigLLVM_SubArchType {
277278 ZigLLVM_NoSubArch,
278279
......@@ -404,7 +405,7 @@ ZIG_EXTERN_C const char *ZigLLVMGetArchTypeName(enum ZigLLVM_ArchType arch);
404405ZIG_EXTERN_C const char *ZigLLVMGetSubArchTypeName(enum ZigLLVM_SubArchType sub_arch);
405406ZIG_EXTERN_C const char *ZigLLVMGetVendorTypeName(enum ZigLLVM_VendorType vendor);
406407ZIG_EXTERN_C const char *ZigLLVMGetOSTypeName(enum ZigLLVM_OSType os);
407ZIG_EXTERN_C const char *ZigLLVMGetEnvironmentTypeName(enum ZigLLVM_EnvironmentType env_type);
408ZIG_EXTERN_C const char *ZigLLVMGetEnvironmentTypeName(enum ZigLLVM_EnvironmentType abi);
408409
409410ZIG_EXTERN_C bool ZigLLDLink(enum ZigLLVM_ObjectFormatType oformat, const char **args, size_t arg_count,
410411 void (*append_diagnostic)(void *, const char *, size_t), void *context);
std/build.zig+43-16
......@@ -731,20 +731,40 @@ const Version = struct {
731731const CrossTarget = struct {
732732 arch: builtin.Arch,
733733 os: builtin.Os,
734 environ: builtin.Environ,
734 abi: builtin.Abi,
735735};
736736
737737pub const Target = union(enum) {
738738 Native: void,
739739 Cross: CrossTarget,
740740
741 fn archSubArchName(arch: builtin.Arch) []const u8 {
742 return switch (arch) {
743 builtin.Arch.arm => |sub| @tagName(sub),
744 builtin.Arch.armeb => |sub| @tagName(sub),
745 builtin.Arch.thumb => |sub| @tagName(sub),
746 builtin.Arch.thumbeb => |sub| @tagName(sub),
747 builtin.Arch.aarch64 => |sub| @tagName(sub),
748 builtin.Arch.aarch64_be => |sub| @tagName(sub),
749 builtin.Arch.kalimba => |sub| @tagName(sub),
750 else => "",
751 };
752 }
753
754 pub fn subArchName(self: Target) []const u8 {
755 switch (self) {
756 Target.Native => return archSubArchName(builtin.arch),
757 Target.Cross => |cross| return archSubArchName(cross.arch),
758 }
759 }
760
741761 pub fn oFileExt(self: *const Target) []const u8 {
742 const environ = switch (self.*) {
743 Target.Native => builtin.environ,
744 Target.Cross => |t| t.environ,
762 const abi = switch (self.*) {
763 Target.Native => builtin.abi,
764 Target.Cross => |t| t.abi,
745765 };
746 return switch (environ) {
747 builtin.Environ.msvc => ".obj",
766 return switch (abi) {
767 builtin.Abi.msvc => ".obj",
748768 else => ".o",
749769 };
750770 }
......@@ -978,12 +998,17 @@ pub const LibExeObjStep = struct {
978998 }
979999 }
9801000
981 pub fn setTarget(self: *LibExeObjStep, target_arch: builtin.Arch, target_os: builtin.Os, target_environ: builtin.Environ) void {
1001 pub fn setTarget(
1002 self: *LibExeObjStep,
1003 target_arch: builtin.Arch,
1004 target_os: builtin.Os,
1005 target_abi: builtin.Abi,
1006 ) void {
9821007 self.target = Target{
9831008 .Cross = CrossTarget{
9841009 .arch = target_arch,
9851010 .os = target_os,
986 .environ = target_environ,
1011 .abi = target_abi,
9871012 },
9881013 };
9891014 self.computeOutFileNames();
......@@ -1296,14 +1321,16 @@ pub const LibExeObjStep = struct {
12961321 switch (self.target) {
12971322 Target.Native => {},
12981323 Target.Cross => |cross_target| {
1299 zig_args.append("--target-arch") catch unreachable;
1300 zig_args.append(@tagName(cross_target.arch)) catch unreachable;
1301
1302 zig_args.append("--target-os") catch unreachable;
1303 zig_args.append(@tagName(cross_target.os)) catch unreachable;
1304
1305 zig_args.append("--target-environ") catch unreachable;
1306 zig_args.append(@tagName(cross_target.environ)) catch unreachable;
1324 const triple = builder.fmt(
1325 "{}{}-{}-{}",
1326 @tagName(cross_target.arch),
1327 Target.archSubArchName(cross_target.arch),
1328 @tagName(cross_target.os),
1329 @tagName(cross_target.abi),
1330 );
1331
1332 try zig_args.append("-target");
1333 try zig_args.append(triple);
13071334 },
13081335 }
13091336
std/fmt/index.zig+1-1
......@@ -1118,7 +1118,7 @@ test "fmt.format" {
11181118 const result = try bufPrint(buf1[0..], "f64: {}\n", math.nan_f64);
11191119 testing.expect(mem.eql(u8, result, "f64: nan\n"));
11201120 }
1121 if (builtin.arch != builtin.Arch.armv8) {
1121 if (builtin.arch != builtin.Arch.arm) {
11221122 // negative nan is not defined by IEE 754,
11231123 // and ARM thus normalizes it to positive nan
11241124 var buf1: [32]u8 = undefined;
std/os/linux/index.zig+1-1
......@@ -6,7 +6,7 @@ const vdso = @import("vdso.zig");
66pub use switch (builtin.arch) {
77 builtin.Arch.x86_64 => @import("x86_64.zig"),
88 builtin.Arch.i386 => @import("i386.zig"),
9 builtin.Arch.aarch64v8 => @import("arm64.zig"),
9 builtin.Arch.aarch64 => @import("arm64.zig"),
1010 else => @compileError("unsupported arch"),
1111};
1212pub use @import("errno.zig");
std/special/bootstrap.zig+1-1
......@@ -31,7 +31,7 @@ nakedcc fn _start() noreturn {
3131 : [argc] "=r" (-> [*]usize)
3232 );
3333 },
34 builtin.Arch.aarch64v8 => {
34 builtin.Arch.aarch64, builtin.Arch.aarch64_be => {
3535 argc_ptr = asm ("mov %[argc], sp"
3636 : [argc] "=r" (-> [*]usize)
3737 );
std/special/compiler_rt/index.zig+4-54
......@@ -184,60 +184,10 @@ const is_arm_64 = switch (builtin.arch) {
184184};
185185
186186const is_arm_arch = switch (builtin.arch) {
187 builtin.Arch.armv8_3a,
188 builtin.Arch.armv8_2a,
189 builtin.Arch.armv8_1a,
190 builtin.Arch.armv8,
191 builtin.Arch.armv8r,
192 builtin.Arch.armv8m_baseline,
193 builtin.Arch.armv8m_mainline,
194 builtin.Arch.armv7,
195 builtin.Arch.armv7em,
196 builtin.Arch.armv7m,
197 builtin.Arch.armv7s,
198 builtin.Arch.armv7k,
199 builtin.Arch.armv7ve,
200 builtin.Arch.armv6,
201 builtin.Arch.armv6m,
202 builtin.Arch.armv6k,
203 builtin.Arch.armv6t2,
204 builtin.Arch.armv5,
205 builtin.Arch.armv5te,
206 builtin.Arch.armv4t,
207 builtin.Arch.armebv8_3a,
208 builtin.Arch.armebv8_2a,
209 builtin.Arch.armebv8_1a,
210 builtin.Arch.armebv8,
211 builtin.Arch.armebv8r,
212 builtin.Arch.armebv8m_baseline,
213 builtin.Arch.armebv8m_mainline,
214 builtin.Arch.armebv7,
215 builtin.Arch.armebv7em,
216 builtin.Arch.armebv7m,
217 builtin.Arch.armebv7s,
218 builtin.Arch.armebv7k,
219 builtin.Arch.armebv7ve,
220 builtin.Arch.armebv6,
221 builtin.Arch.armebv6m,
222 builtin.Arch.armebv6k,
223 builtin.Arch.armebv6t2,
224 builtin.Arch.armebv5,
225 builtin.Arch.armebv5te,
226 builtin.Arch.armebv4t,
227 builtin.Arch.aarch64v8_3a,
228 builtin.Arch.aarch64v8_2a,
229 builtin.Arch.aarch64v8_1a,
230 builtin.Arch.aarch64v8,
231 builtin.Arch.aarch64v8r,
232 builtin.Arch.aarch64v8m_baseline,
233 builtin.Arch.aarch64v8m_mainline,
234 builtin.Arch.aarch64_bev8_3a,
235 builtin.Arch.aarch64_bev8_2a,
236 builtin.Arch.aarch64_bev8_1a,
237 builtin.Arch.aarch64_bev8,
238 builtin.Arch.aarch64_bev8r,
239 builtin.Arch.aarch64_bev8m_baseline,
240 builtin.Arch.aarch64_bev8m_mainline,
187 builtin.Arch.arm,
188 builtin.Arch.armeb,
189 builtin.Arch.aarch64,
190 builtin.Arch.aarch64_be,
241191 builtin.Arch.thumb,
242192 builtin.Arch.thumbeb,
243193 => true,
test/tests.zig+5-5
......@@ -24,24 +24,24 @@ const gen_h = @import("gen_h.zig");
2424const TestTarget = struct {
2525 os: builtin.Os,
2626 arch: builtin.Arch,
27 environ: builtin.Environ,
27 abi: builtin.Abi,
2828};
2929
3030const test_targets = []TestTarget{
3131 TestTarget{
3232 .os = builtin.Os.linux,
3333 .arch = builtin.Arch.x86_64,
34 .environ = builtin.Environ.gnu,
34 .abi = builtin.Abi.gnu,
3535 },
3636 TestTarget{
3737 .os = builtin.Os.macosx,
3838 .arch = builtin.Arch.x86_64,
39 .environ = builtin.Environ.unknown,
39 .abi = builtin.Abi.gnu,
4040 },
4141 TestTarget{
4242 .os = builtin.Os.windows,
4343 .arch = builtin.Arch.x86_64,
44 .environ = builtin.Environ.msvc,
44 .abi = builtin.Abi.msvc,
4545 },
4646};
4747
......@@ -189,7 +189,7 @@ pub fn addPkgTests(b: *build.Builder, test_filter: ?[]const u8, root_src: []cons
189189 these_tests.setFilter(test_filter);
190190 these_tests.setBuildMode(mode);
191191 if (!is_native) {
192 these_tests.setTarget(test_target.arch, test_target.os, test_target.environ);
192 these_tests.setTarget(test_target.arch, test_target.os, test_target.abi);
193193 }
194194 if (link_libc) {
195195 these_tests.linkSystemLibrary("c");