@zigc/lib 0.16.0-test.1 → 0.17.0-dev.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +19 -0
- package/c/math.zig +135 -35
- package/c/stropts.zig +17 -0
- package/c.zig +1 -0
- package/compiler/aro/aro/Attribute/names.zig +604 -589
- package/compiler/aro/aro/Attribute.zig +202 -116
- package/compiler/aro/aro/Builtins/common.zig +874 -863
- package/compiler/aro/aro/Builtins/eval.zig +15 -7
- package/compiler/aro/aro/Builtins.zig +0 -1
- package/compiler/aro/aro/CodeGen.zig +3 -1
- package/compiler/aro/aro/Compilation.zig +120 -97
- package/compiler/aro/aro/Diagnostics.zig +21 -17
- package/compiler/aro/aro/Driver/GCCDetector.zig +635 -0
- package/compiler/aro/aro/Driver.zig +124 -50
- package/compiler/aro/aro/LangOpts.zig +12 -2
- package/compiler/aro/aro/Parser/Diagnostic.zig +79 -19
- package/compiler/aro/aro/Parser.zig +336 -142
- package/compiler/aro/aro/Preprocessor/Diagnostic.zig +21 -0
- package/compiler/aro/aro/Preprocessor.zig +127 -56
- package/compiler/aro/aro/Target.zig +17 -12
- package/compiler/aro/aro/Tokenizer.zig +31 -14
- package/compiler/aro/aro/Toolchain.zig +4 -7
- package/compiler/aro/aro/Tree.zig +178 -148
- package/compiler/aro/aro/TypeStore.zig +82 -24
- package/compiler/aro/aro/Value.zig +13 -17
- package/compiler/aro/aro/features.zig +1 -0
- package/compiler/aro/aro/pragmas/once.zig +0 -1
- package/compiler/aro/aro/record_layout.zig +3 -3
- package/compiler/aro/assembly_backend/x86_64.zig +3 -4
- package/compiler/aro/backend/Assembly.zig +1 -2
- package/compiler/aro/backend/Interner.zig +2 -2
- package/compiler/aro/backend/Ir.zig +100 -92
- package/compiler/aro/include/ptrcheck.h +49 -0
- package/compiler/aro/main.zig +26 -10
- package/compiler/build_runner.zig +1 -0
- package/compiler/objdump.zig +93 -0
- package/compiler/reduce.zig +5 -1
- package/compiler/resinator/compile.zig +2 -2
- package/compiler/resinator/main.zig +7 -1
- package/compiler/resinator/preprocess.zig +1 -3
- package/compiler/std-docs.zig +8 -1
- package/compiler/test_runner.zig +193 -61
- package/compiler/translate-c/MacroTranslator.zig +80 -11
- package/compiler/translate-c/PatternList.zig +1 -9
- package/compiler/translate-c/Scope.zig +43 -6
- package/compiler/translate-c/Translator.zig +364 -126
- package/compiler/translate-c/ast.zig +19 -11
- package/compiler/translate-c/main.zig +75 -16
- package/compiler_rt/cos.zig +141 -52
- package/compiler_rt/limb64.zig +266 -0
- package/compiler_rt/long_double.zig +37 -0
- package/compiler_rt/mulo.zig +6 -1
- package/compiler_rt/rem_pio2l.zig +173 -0
- package/compiler_rt/sin.zig +140 -55
- package/compiler_rt/sincos.zig +279 -72
- package/compiler_rt/tan.zig +118 -47
- package/compiler_rt/trig.zig +256 -6
- package/compiler_rt.zig +2 -0
- package/fuzzer.zig +855 -307
- package/libc/musl/src/math/pow.c +343 -0
- package/package.json +1 -1
- package/std/Build/Fuzz.zig +6 -19
- package/std/Build/Module.zig +1 -1
- package/std/Build/Step/CheckObject.zig +3 -3
- package/std/Build/Step/Compile.zig +18 -0
- package/std/Build/Step/ConfigHeader.zig +49 -33
- package/std/Build/Step/InstallArtifact.zig +18 -0
- package/std/Build/Step/Run.zig +536 -87
- package/std/Build/Step/TranslateC.zig +0 -6
- package/std/Build/Step.zig +8 -15
- package/std/Build/WebServer.zig +29 -17
- package/std/Build/abi.zig +47 -11
- package/std/Build.zig +17 -14
- package/std/Io/Dispatch.zig +2 -0
- package/std/Io/File/Reader.zig +3 -1
- package/std/Io/File.zig +1 -0
- package/std/Io/Kqueue.zig +2 -2
- package/std/Io/Threaded.zig +181 -143
- package/std/Io/Uring.zig +2 -1
- package/std/Io.zig +970 -2
- package/std/Target.zig +3 -2
- package/std/Thread.zig +8 -3
- package/std/array_hash_map.zig +96 -555
- package/std/array_list.zig +22 -31
- package/std/bit_set.zig +22 -6
- package/std/builtin/assembly.zig +68 -0
- package/std/c.zig +17 -17
- package/std/compress/flate/Compress.zig +3 -3
- package/std/crypto/Certificate/Bundle.zig +15 -1
- package/std/crypto/codecs/asn1.zig +33 -18
- package/std/crypto/codecs/base64_hex_ct.zig +14 -4
- package/std/debug/Dwarf.zig +29 -9
- package/std/debug/Info.zig +4 -0
- package/std/debug/MachOFile.zig +46 -8
- package/std/debug/Pdb.zig +539 -36
- package/std/debug/SelfInfo/Elf.zig +19 -18
- package/std/debug/SelfInfo/MachO.zig +18 -7
- package/std/debug/SelfInfo/Windows.zig +138 -36
- package/std/debug.zig +179 -65
- package/std/enums.zig +25 -19
- package/std/heap/ArenaAllocator.zig +145 -154
- package/std/heap/debug_allocator.zig +7 -7
- package/std/http/Client.zig +10 -6
- package/std/http.zig +11 -9
- package/std/json/Stringify.zig +3 -3
- package/std/json/dynamic.zig +4 -4
- package/std/math/big/int.zig +16 -17
- package/std/mem/Allocator.zig +4 -5
- package/std/mem.zig +48 -0
- package/std/os/emscripten.zig +2 -18
- package/std/os/linux/arc.zig +144 -0
- package/std/os/linux.zig +21 -4
- package/std/os/windows.zig +2 -2
- package/std/pdb.zig +143 -4
- package/std/posix.zig +6 -12
- package/std/priority_dequeue.zig +13 -12
- package/std/priority_queue.zig +5 -4
- package/std/process/Child.zig +1 -1
- package/std/process/Environ.zig +1 -1
- package/std/start.zig +17 -4
- package/std/std.zig +19 -6
- package/std/testing/FailingAllocator.zig +4 -4
- package/std/testing/Smith.zig +37 -2
- package/std/zig/Ast/Render.zig +186 -458
- package/std/zig/Ast.zig +0 -4
- package/std/zig/AstGen.zig +44 -7
- package/std/zig/AstSmith.zig +2602 -0
- package/std/zig/Client.zig +8 -3
- package/std/zig/Parse.zig +83 -74
- package/std/zig/Server.zig +26 -0
- package/std/zig/Zir.zig +17 -0
- package/std/zig/c_translation/helpers.zig +14 -9
- package/std/zig/llvm/Builder.zig +107 -48
- package/std/zig/system.zig +20 -4
- package/std/zig/tokenizer.zig +2 -1
- package/std/zig.zig +6 -0
- package/compiler/aro/aro/Driver/Filesystem.zig +0 -241
- package/libc/mingw/complex/cabs.c +0 -48
- package/libc/mingw/complex/cabsf.c +0 -48
- package/libc/mingw/complex/cacos.c +0 -50
- package/libc/mingw/complex/cacosf.c +0 -50
- package/libc/mingw/complex/carg.c +0 -48
- package/libc/mingw/complex/cargf.c +0 -48
- package/libc/mingw/complex/casin.c +0 -50
- package/libc/mingw/complex/casinf.c +0 -50
- package/libc/mingw/complex/catan.c +0 -50
- package/libc/mingw/complex/catanf.c +0 -50
- package/libc/mingw/complex/ccos.c +0 -50
- package/libc/mingw/complex/ccosf.c +0 -50
- package/libc/mingw/complex/cexp.c +0 -48
- package/libc/mingw/complex/cexpf.c +0 -48
- package/libc/mingw/complex/cimag.c +0 -48
- package/libc/mingw/complex/cimagf.c +0 -48
- package/libc/mingw/complex/clog.c +0 -48
- package/libc/mingw/complex/clog10.c +0 -49
- package/libc/mingw/complex/clog10f.c +0 -49
- package/libc/mingw/complex/clogf.c +0 -48
- package/libc/mingw/complex/conj.c +0 -48
- package/libc/mingw/complex/conjf.c +0 -48
- package/libc/mingw/complex/cpow.c +0 -48
- package/libc/mingw/complex/cpowf.c +0 -48
- package/libc/mingw/complex/cproj.c +0 -48
- package/libc/mingw/complex/cprojf.c +0 -48
- package/libc/mingw/complex/creal.c +0 -48
- package/libc/mingw/complex/crealf.c +0 -48
- package/libc/mingw/complex/csin.c +0 -50
- package/libc/mingw/complex/csinf.c +0 -50
- package/libc/mingw/complex/csqrt.c +0 -48
- package/libc/mingw/complex/csqrtf.c +0 -48
- package/libc/mingw/complex/ctan.c +0 -50
- package/libc/mingw/complex/ctanf.c +0 -50
- package/libc/mingw/math/arm/s_rint.c +0 -86
- package/libc/mingw/math/arm/s_rintf.c +0 -51
- package/libc/mingw/math/arm/sincos.S +0 -30
- package/libc/mingw/math/arm-common/sincosl.c +0 -13
- package/libc/mingw/math/arm64/rint.c +0 -12
- package/libc/mingw/math/arm64/rintf.c +0 -12
- package/libc/mingw/math/arm64/sincos.S +0 -32
- package/libc/mingw/math/bsd_private_base.h +0 -148
- package/libc/mingw/math/frexpf.c +0 -13
- package/libc/mingw/math/frexpl.c +0 -71
- package/libc/mingw/math/x86/acosf.c +0 -29
- package/libc/mingw/math/x86/atanf.c +0 -23
- package/libc/mingw/math/x86/atanl.c +0 -18
- package/libc/mingw/math/x86/cos.def.h +0 -65
- package/libc/mingw/math/x86/cosl.c +0 -46
- package/libc/mingw/math/x86/cosl_internal.S +0 -55
- package/libc/mingw/math/x86/ldexp.c +0 -23
- package/libc/mingw/math/x86/scalbn.S +0 -41
- package/libc/mingw/math/x86/scalbnf.S +0 -40
- package/libc/mingw/math/x86/sin.def.h +0 -65
- package/libc/mingw/math/x86/sinl.c +0 -46
- package/libc/mingw/math/x86/sinl_internal.S +0 -58
- package/libc/mingw/math/x86/tanl.S +0 -62
- package/libc/mingw/misc/btowc.c +0 -28
- package/libc/mingw/misc/wcstof.c +0 -66
- package/libc/mingw/misc/wcstoimax.c +0 -132
- package/libc/mingw/misc/wcstoumax.c +0 -126
- package/libc/mingw/misc/wctob.c +0 -29
- package/libc/mingw/misc/winbs_uint64.c +0 -6
- package/libc/mingw/misc/winbs_ulong.c +0 -6
- package/libc/mingw/misc/winbs_ushort.c +0 -6
- package/libc/mingw/stdio/_Exit.c +0 -10
- package/libc/mingw/stdio/_findfirst64i32.c +0 -21
- package/libc/mingw/stdio/_findnext64i32.c +0 -21
- package/libc/mingw/stdio/_fstat64i32.c +0 -37
- package/libc/mingw/stdio/_stat64i32.c +0 -37
- package/libc/mingw/stdio/_wfindfirst64i32.c +0 -21
- package/libc/mingw/stdio/_wfindnext64i32.c +0 -21
- package/libc/mingw/stdio/_wstat64i32.c +0 -37
- package/libc/musl/src/legacy/isastream.c +0 -7
- package/libc/musl/src/legacy/valloc.c +0 -8
- package/libc/musl/src/math/__cosl.c +0 -96
- package/libc/musl/src/math/__sinl.c +0 -78
- package/libc/musl/src/math/__tanl.c +0 -143
- package/libc/musl/src/math/aarch64/lrint.c +0 -10
- package/libc/musl/src/math/aarch64/lrintf.c +0 -10
- package/libc/musl/src/math/aarch64/rintf.c +0 -7
- package/libc/musl/src/math/cosl.c +0 -39
- package/libc/musl/src/math/fdim.c +0 -10
- package/libc/musl/src/math/finite.c +0 -7
- package/libc/musl/src/math/finitef.c +0 -7
- package/libc/musl/src/math/frexp.c +0 -23
- package/libc/musl/src/math/frexpf.c +0 -23
- package/libc/musl/src/math/frexpl.c +0 -29
- package/libc/musl/src/math/i386/lrint.c +0 -8
- package/libc/musl/src/math/i386/lrintf.c +0 -8
- package/libc/musl/src/math/i386/rintf.c +0 -7
- package/libc/musl/src/math/lrint.c +0 -72
- package/libc/musl/src/math/lrintf.c +0 -8
- package/libc/musl/src/math/powerpc64/lrint.c +0 -16
- package/libc/musl/src/math/powerpc64/lrintf.c +0 -16
- package/libc/musl/src/math/rintf.c +0 -30
- package/libc/musl/src/math/s390x/rintf.c +0 -15
- package/libc/musl/src/math/sincosl.c +0 -60
- package/libc/musl/src/math/sinl.c +0 -41
- package/libc/musl/src/math/tanl.c +0 -29
- package/libc/musl/src/math/x32/lrint.s +0 -5
- package/libc/musl/src/math/x32/lrintf.s +0 -5
- package/libc/musl/src/math/x86_64/lrint.c +0 -8
- package/libc/musl/src/math/x86_64/lrintf.c +0 -8
- package/libc/wasi/libc-bottom-half/sources/reallocarray.c +0 -14
|
@@ -0,0 +1,635 @@
|
|
|
1
|
+
const std = @import("std");
|
|
2
|
+
|
|
3
|
+
const system_defaults = @import("system_defaults");
|
|
4
|
+
|
|
5
|
+
const GCCVersion = @import("GCCVersion.zig");
|
|
6
|
+
const Multilib = @import("Multilib.zig");
|
|
7
|
+
const Target = @import("../Target.zig");
|
|
8
|
+
const Toolchain = @import("../Toolchain.zig");
|
|
9
|
+
|
|
10
|
+
const GCCDetector = @This();
|
|
11
|
+
|
|
12
|
+
is_valid: bool = false,
|
|
13
|
+
install_path: []const u8 = "",
|
|
14
|
+
parent_lib_path: []const u8 = "",
|
|
15
|
+
version: GCCVersion = .{},
|
|
16
|
+
gcc_triple: []const u8 = "",
|
|
17
|
+
selected: Multilib = .{},
|
|
18
|
+
biarch_sibling: ?Multilib = null,
|
|
19
|
+
|
|
20
|
+
pub fn deinit(self: *GCCDetector) void {
|
|
21
|
+
if (!self.is_valid) return;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
pub fn appendToolPath(self: *const GCCDetector, tc: *Toolchain) !void {
|
|
25
|
+
if (!self.is_valid) return;
|
|
26
|
+
return tc.addPathFromComponents(&.{
|
|
27
|
+
self.parent_lib_path,
|
|
28
|
+
"..",
|
|
29
|
+
self.gcc_triple,
|
|
30
|
+
"bin",
|
|
31
|
+
}, .program);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
fn addDefaultGCCPrefixes(prefixes: *std.ArrayList([]const u8), tc: *const Toolchain) !void {
|
|
35
|
+
const sysroot = tc.getSysroot();
|
|
36
|
+
const target = tc.getTarget();
|
|
37
|
+
if (sysroot.len == 0 and target.os.tag == .linux and tc.exists("/opt/rh")) {
|
|
38
|
+
prefixes.appendAssumeCapacity("/opt/rh/gcc-toolset-12/root/usr");
|
|
39
|
+
prefixes.appendAssumeCapacity("/opt/rh/gcc-toolset-11/root/usr");
|
|
40
|
+
prefixes.appendAssumeCapacity("/opt/rh/gcc-toolset-10/root/usr");
|
|
41
|
+
prefixes.appendAssumeCapacity("/opt/rh/devtoolset-12/root/usr");
|
|
42
|
+
prefixes.appendAssumeCapacity("/opt/rh/devtoolset-11/root/usr");
|
|
43
|
+
prefixes.appendAssumeCapacity("/opt/rh/devtoolset-10/root/usr");
|
|
44
|
+
prefixes.appendAssumeCapacity("/opt/rh/devtoolset-9/root/usr");
|
|
45
|
+
prefixes.appendAssumeCapacity("/opt/rh/devtoolset-8/root/usr");
|
|
46
|
+
prefixes.appendAssumeCapacity("/opt/rh/devtoolset-7/root/usr");
|
|
47
|
+
prefixes.appendAssumeCapacity("/opt/rh/devtoolset-6/root/usr");
|
|
48
|
+
prefixes.appendAssumeCapacity("/opt/rh/devtoolset-4/root/usr");
|
|
49
|
+
prefixes.appendAssumeCapacity("/opt/rh/devtoolset-3/root/usr");
|
|
50
|
+
prefixes.appendAssumeCapacity("/opt/rh/devtoolset-2/root/usr");
|
|
51
|
+
}
|
|
52
|
+
if (sysroot.len == 0) {
|
|
53
|
+
prefixes.appendAssumeCapacity("/usr");
|
|
54
|
+
} else {
|
|
55
|
+
var usr_path = try tc.driver.comp.arena.alloc(u8, 4 + sysroot.len);
|
|
56
|
+
@memcpy(usr_path[0..4], "/usr");
|
|
57
|
+
@memcpy(usr_path[4..], sysroot);
|
|
58
|
+
prefixes.appendAssumeCapacity(usr_path);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
fn collectLibDirsAndTriples(
|
|
63
|
+
tc: *Toolchain,
|
|
64
|
+
lib_dirs: *std.ArrayList([]const u8),
|
|
65
|
+
triple_aliases: *std.ArrayList([]const u8),
|
|
66
|
+
biarch_libdirs: *std.ArrayList([]const u8),
|
|
67
|
+
biarch_triple_aliases: *std.ArrayList([]const u8),
|
|
68
|
+
) !void {
|
|
69
|
+
const AArch64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
|
|
70
|
+
const AArch64Triples: [4][]const u8 = .{ "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-redhat-linux", "aarch64-suse-linux" };
|
|
71
|
+
const AArch64beLibDirs: [1][]const u8 = .{"/lib"};
|
|
72
|
+
const AArch64beTriples: [2][]const u8 = .{ "aarch64_be-none-linux-gnu", "aarch64_be-linux-gnu" };
|
|
73
|
+
|
|
74
|
+
const ARMLibDirs: [1][]const u8 = .{"/lib"};
|
|
75
|
+
const ARMTriples: [1][]const u8 = .{"arm-linux-gnueabi"};
|
|
76
|
+
const ARMHFTriples: [4][]const u8 = .{ "arm-linux-gnueabihf", "armv7hl-redhat-linux-gnueabi", "armv6hl-suse-linux-gnueabi", "armv7hl-suse-linux-gnueabi" };
|
|
77
|
+
|
|
78
|
+
const ARMebLibDirs: [1][]const u8 = .{"/lib"};
|
|
79
|
+
const ARMebTriples: [1][]const u8 = .{"armeb-linux-gnueabi"};
|
|
80
|
+
const ARMebHFTriples: [2][]const u8 = .{ "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi" };
|
|
81
|
+
|
|
82
|
+
const AVRLibDirs: [1][]const u8 = .{"/lib"};
|
|
83
|
+
const AVRTriples: [1][]const u8 = .{"avr"};
|
|
84
|
+
|
|
85
|
+
const CSKYLibDirs: [1][]const u8 = .{"/lib"};
|
|
86
|
+
const CSKYTriples: [3][]const u8 = .{ "csky-linux-gnuabiv2", "csky-linux-uclibcabiv2", "csky-elf-noneabiv2" };
|
|
87
|
+
|
|
88
|
+
const X86_64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
|
|
89
|
+
const X86_64Triples: [11][]const u8 = .{
|
|
90
|
+
"x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
|
|
91
|
+
"x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
|
|
92
|
+
"x86_64-redhat-linux", "x86_64-suse-linux",
|
|
93
|
+
"x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
|
|
94
|
+
"x86_64-slackware-linux", "x86_64-unknown-linux",
|
|
95
|
+
"x86_64-amazon-linux",
|
|
96
|
+
};
|
|
97
|
+
const X32Triples: [2][]const u8 = .{ "x86_64-linux-gnux32", "x86_64-pc-linux-gnux32" };
|
|
98
|
+
const X32LibDirs: [2][]const u8 = .{ "/libx32", "/lib" };
|
|
99
|
+
const X86LibDirs: [2][]const u8 = .{ "/lib32", "/lib" };
|
|
100
|
+
const X86Triples: [9][]const u8 = .{
|
|
101
|
+
"i586-linux-gnu", "i686-linux-gnu", "i686-pc-linux-gnu",
|
|
102
|
+
"i386-redhat-linux6E", "i686-redhat-linux", "i386-redhat-linux",
|
|
103
|
+
"i586-suse-linux", "i686-montavista-linux", "i686-gnu",
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const LoongArch64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
|
|
107
|
+
const LoongArch64Triples: [2][]const u8 = .{ "loongarch64-linux-gnu", "loongarch64-unknown-linux-gnu" };
|
|
108
|
+
|
|
109
|
+
const M68kLibDirs: [1][]const u8 = .{"/lib"};
|
|
110
|
+
const M68kTriples: [3][]const u8 = .{ "m68k-linux-gnu", "m68k-unknown-linux-gnu", "m68k-suse-linux" };
|
|
111
|
+
|
|
112
|
+
const MIPSLibDirs: [2][]const u8 = .{ "/libo32", "/lib" };
|
|
113
|
+
const MIPSTriples: [5][]const u8 = .{
|
|
114
|
+
"mips-linux-gnu", "mips-mti-linux",
|
|
115
|
+
"mips-mti-linux-gnu", "mips-img-linux-gnu",
|
|
116
|
+
"mipsisa32r6-linux-gnu",
|
|
117
|
+
};
|
|
118
|
+
const MIPSELLibDirs: [2][]const u8 = .{ "/libo32", "/lib" };
|
|
119
|
+
const MIPSELTriples: [3][]const u8 = .{ "mipsel-linux-gnu", "mips-img-linux-gnu", "mipsisa32r6el-linux-gnu" };
|
|
120
|
+
|
|
121
|
+
const MIPS64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
|
|
122
|
+
const MIPS64Triples: [6][]const u8 = .{
|
|
123
|
+
"mips64-linux-gnu", "mips-mti-linux-gnu",
|
|
124
|
+
"mips-img-linux-gnu", "mips64-linux-gnuabi64",
|
|
125
|
+
"mipsisa64r6-linux-gnu", "mipsisa64r6-linux-gnuabi64",
|
|
126
|
+
};
|
|
127
|
+
const MIPS64ELLibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
|
|
128
|
+
const MIPS64ELTriples: [6][]const u8 = .{
|
|
129
|
+
"mips64el-linux-gnu", "mips-mti-linux-gnu",
|
|
130
|
+
"mips-img-linux-gnu", "mips64el-linux-gnuabi64",
|
|
131
|
+
"mipsisa64r6el-linux-gnu", "mipsisa64r6el-linux-gnuabi64",
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
const MIPSN32LibDirs: [1][]const u8 = .{"/lib32"};
|
|
135
|
+
const MIPSN32Triples: [2][]const u8 = .{ "mips64-linux-gnuabin32", "mipsisa64r6-linux-gnuabin32" };
|
|
136
|
+
const MIPSN32ELLibDirs: [1][]const u8 = .{"/lib32"};
|
|
137
|
+
const MIPSN32ELTriples: [2][]const u8 = .{ "mips64el-linux-gnuabin32", "mipsisa64r6el-linux-gnuabin32" };
|
|
138
|
+
|
|
139
|
+
const MSP430LibDirs: [1][]const u8 = .{"/lib"};
|
|
140
|
+
const MSP430Triples: [1][]const u8 = .{"msp430-elf"};
|
|
141
|
+
|
|
142
|
+
const PPCLibDirs: [2][]const u8 = .{ "/lib32", "/lib" };
|
|
143
|
+
const PPCTriples: [5][]const u8 = .{
|
|
144
|
+
"powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
|
|
145
|
+
// On 32-bit PowerPC systems running SUSE Linux, gcc is configured as a
|
|
146
|
+
// 64-bit compiler which defaults to "-m32", hence "powerpc64-suse-linux".
|
|
147
|
+
"powerpc64-suse-linux", "powerpc-montavista-linuxspe",
|
|
148
|
+
};
|
|
149
|
+
const PPCLELibDirs: [2][]const u8 = .{ "/lib32", "/lib" };
|
|
150
|
+
const PPCLETriples: [3][]const u8 = .{ "powerpcle-linux-gnu", "powerpcle-unknown-linux-gnu", "powerpcle-linux-musl" };
|
|
151
|
+
|
|
152
|
+
const PPC64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
|
|
153
|
+
const PPC64Triples: [4][]const u8 = .{
|
|
154
|
+
"powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
|
|
155
|
+
"powerpc64-suse-linux", "ppc64-redhat-linux",
|
|
156
|
+
};
|
|
157
|
+
const PPC64LELibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
|
|
158
|
+
const PPC64LETriples: [5][]const u8 = .{
|
|
159
|
+
"powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
|
|
160
|
+
"powerpc64le-none-linux-gnu", "powerpc64le-suse-linux",
|
|
161
|
+
"ppc64le-redhat-linux",
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
const RISCV32LibDirs: [2][]const u8 = .{ "/lib32", "/lib" };
|
|
165
|
+
const RISCV32Triples: [3][]const u8 = .{ "riscv32-unknown-linux-gnu", "riscv32-linux-gnu", "riscv32-unknown-elf" };
|
|
166
|
+
const RISCV64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
|
|
167
|
+
const RISCV64Triples: [3][]const u8 = .{
|
|
168
|
+
"riscv64-unknown-linux-gnu",
|
|
169
|
+
"riscv64-linux-gnu",
|
|
170
|
+
"riscv64-unknown-elf",
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const SPARCv8LibDirs: [2][]const u8 = .{ "/lib32", "/lib" };
|
|
174
|
+
const SPARCv8Triples: [2][]const u8 = .{ "sparc-linux-gnu", "sparcv8-linux-gnu" };
|
|
175
|
+
const SPARCv9LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
|
|
176
|
+
const SPARCv9Triples: [2][]const u8 = .{ "sparc64-linux-gnu", "sparcv9-linux-gnu" };
|
|
177
|
+
|
|
178
|
+
const SystemZLibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
|
|
179
|
+
const SystemZTriples: [5][]const u8 = .{
|
|
180
|
+
"s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
|
|
181
|
+
"s390x-suse-linux", "s390x-redhat-linux",
|
|
182
|
+
};
|
|
183
|
+
const target = tc.getTarget();
|
|
184
|
+
if (target.os.tag == .illumos) {
|
|
185
|
+
// TODO
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
if (target.abi.isAndroid()) {
|
|
189
|
+
const AArch64AndroidTriples: [1][]const u8 = .{"aarch64-linux-android"};
|
|
190
|
+
const ARMAndroidTriples: [1][]const u8 = .{"arm-linux-androideabi"};
|
|
191
|
+
const MIPSELAndroidTriples: [1][]const u8 = .{"mipsel-linux-android"};
|
|
192
|
+
const MIPS64ELAndroidTriples: [1][]const u8 = .{"mips64el-linux-android"};
|
|
193
|
+
const X86AndroidTriples: [1][]const u8 = .{"i686-linux-android"};
|
|
194
|
+
const X86_64AndroidTriples: [1][]const u8 = .{"x86_64-linux-android"};
|
|
195
|
+
|
|
196
|
+
switch (target.cpu.arch) {
|
|
197
|
+
.aarch64 => {
|
|
198
|
+
lib_dirs.appendSliceAssumeCapacity(&AArch64LibDirs);
|
|
199
|
+
triple_aliases.appendSliceAssumeCapacity(&AArch64AndroidTriples);
|
|
200
|
+
},
|
|
201
|
+
.arm,
|
|
202
|
+
.thumb,
|
|
203
|
+
=> {
|
|
204
|
+
lib_dirs.appendSliceAssumeCapacity(&ARMLibDirs);
|
|
205
|
+
triple_aliases.appendSliceAssumeCapacity(&ARMAndroidTriples);
|
|
206
|
+
},
|
|
207
|
+
.mipsel => {
|
|
208
|
+
lib_dirs.appendSliceAssumeCapacity(&MIPSELLibDirs);
|
|
209
|
+
triple_aliases.appendSliceAssumeCapacity(&MIPSELAndroidTriples);
|
|
210
|
+
biarch_libdirs.appendSliceAssumeCapacity(&MIPS64ELLibDirs);
|
|
211
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&MIPS64ELAndroidTriples);
|
|
212
|
+
},
|
|
213
|
+
.mips64el => {
|
|
214
|
+
lib_dirs.appendSliceAssumeCapacity(&MIPS64ELLibDirs);
|
|
215
|
+
triple_aliases.appendSliceAssumeCapacity(&MIPS64ELAndroidTriples);
|
|
216
|
+
biarch_libdirs.appendSliceAssumeCapacity(&MIPSELLibDirs);
|
|
217
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSELAndroidTriples);
|
|
218
|
+
},
|
|
219
|
+
.x86_64 => {
|
|
220
|
+
lib_dirs.appendSliceAssumeCapacity(&X86_64LibDirs);
|
|
221
|
+
triple_aliases.appendSliceAssumeCapacity(&X86_64AndroidTriples);
|
|
222
|
+
biarch_libdirs.appendSliceAssumeCapacity(&X86LibDirs);
|
|
223
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&X86AndroidTriples);
|
|
224
|
+
},
|
|
225
|
+
.x86 => {
|
|
226
|
+
lib_dirs.appendSliceAssumeCapacity(&X86LibDirs);
|
|
227
|
+
triple_aliases.appendSliceAssumeCapacity(&X86AndroidTriples);
|
|
228
|
+
biarch_libdirs.appendSliceAssumeCapacity(&X86_64LibDirs);
|
|
229
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&X86_64AndroidTriples);
|
|
230
|
+
},
|
|
231
|
+
else => {},
|
|
232
|
+
}
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
switch (target.cpu.arch) {
|
|
236
|
+
.aarch64 => {
|
|
237
|
+
lib_dirs.appendSliceAssumeCapacity(&AArch64LibDirs);
|
|
238
|
+
triple_aliases.appendSliceAssumeCapacity(&AArch64Triples);
|
|
239
|
+
biarch_libdirs.appendSliceAssumeCapacity(&AArch64LibDirs);
|
|
240
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&AArch64Triples);
|
|
241
|
+
},
|
|
242
|
+
.aarch64_be => {
|
|
243
|
+
lib_dirs.appendSliceAssumeCapacity(&AArch64beLibDirs);
|
|
244
|
+
triple_aliases.appendSliceAssumeCapacity(&AArch64beTriples);
|
|
245
|
+
biarch_libdirs.appendSliceAssumeCapacity(&AArch64beLibDirs);
|
|
246
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&AArch64beTriples);
|
|
247
|
+
},
|
|
248
|
+
.arm, .thumb => {
|
|
249
|
+
lib_dirs.appendSliceAssumeCapacity(&ARMLibDirs);
|
|
250
|
+
if (target.abi == .gnueabihf) {
|
|
251
|
+
triple_aliases.appendSliceAssumeCapacity(&ARMHFTriples);
|
|
252
|
+
} else {
|
|
253
|
+
triple_aliases.appendSliceAssumeCapacity(&ARMTriples);
|
|
254
|
+
}
|
|
255
|
+
},
|
|
256
|
+
.armeb, .thumbeb => {
|
|
257
|
+
lib_dirs.appendSliceAssumeCapacity(&ARMebLibDirs);
|
|
258
|
+
if (target.abi == .gnueabihf) {
|
|
259
|
+
triple_aliases.appendSliceAssumeCapacity(&ARMebHFTriples);
|
|
260
|
+
} else {
|
|
261
|
+
triple_aliases.appendSliceAssumeCapacity(&ARMebTriples);
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
.avr => {
|
|
265
|
+
lib_dirs.appendSliceAssumeCapacity(&AVRLibDirs);
|
|
266
|
+
triple_aliases.appendSliceAssumeCapacity(&AVRTriples);
|
|
267
|
+
},
|
|
268
|
+
.csky => {
|
|
269
|
+
lib_dirs.appendSliceAssumeCapacity(&CSKYLibDirs);
|
|
270
|
+
triple_aliases.appendSliceAssumeCapacity(&CSKYTriples);
|
|
271
|
+
},
|
|
272
|
+
.x86_64 => {
|
|
273
|
+
if (target.abi == .gnux32 or target.abi == .muslx32) {
|
|
274
|
+
lib_dirs.appendSliceAssumeCapacity(&X32LibDirs);
|
|
275
|
+
triple_aliases.appendSliceAssumeCapacity(&X32Triples);
|
|
276
|
+
biarch_libdirs.appendSliceAssumeCapacity(&X86_64LibDirs);
|
|
277
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&X86_64Triples);
|
|
278
|
+
} else {
|
|
279
|
+
lib_dirs.appendSliceAssumeCapacity(&X86_64LibDirs);
|
|
280
|
+
triple_aliases.appendSliceAssumeCapacity(&X86_64Triples);
|
|
281
|
+
biarch_libdirs.appendSliceAssumeCapacity(&X32LibDirs);
|
|
282
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&X32Triples);
|
|
283
|
+
}
|
|
284
|
+
biarch_libdirs.appendSliceAssumeCapacity(&X86LibDirs);
|
|
285
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&X86Triples);
|
|
286
|
+
},
|
|
287
|
+
.x86 => {
|
|
288
|
+
lib_dirs.appendSliceAssumeCapacity(&X86LibDirs);
|
|
289
|
+
},
|
|
290
|
+
.loongarch64 => {
|
|
291
|
+
lib_dirs.appendSliceAssumeCapacity(&LoongArch64LibDirs);
|
|
292
|
+
triple_aliases.appendSliceAssumeCapacity(&LoongArch64Triples);
|
|
293
|
+
},
|
|
294
|
+
.m68k => {
|
|
295
|
+
lib_dirs.appendSliceAssumeCapacity(&M68kLibDirs);
|
|
296
|
+
triple_aliases.appendSliceAssumeCapacity(&M68kTriples);
|
|
297
|
+
},
|
|
298
|
+
.mips => {
|
|
299
|
+
lib_dirs.appendSliceAssumeCapacity(&MIPSLibDirs);
|
|
300
|
+
triple_aliases.appendSliceAssumeCapacity(&MIPSTriples);
|
|
301
|
+
biarch_libdirs.appendSliceAssumeCapacity(&MIPS64LibDirs);
|
|
302
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&MIPS64Triples);
|
|
303
|
+
biarch_libdirs.appendSliceAssumeCapacity(&MIPSN32LibDirs);
|
|
304
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSN32Triples);
|
|
305
|
+
},
|
|
306
|
+
.mipsel => {
|
|
307
|
+
lib_dirs.appendSliceAssumeCapacity(&MIPSELLibDirs);
|
|
308
|
+
triple_aliases.appendSliceAssumeCapacity(&MIPSELTriples);
|
|
309
|
+
triple_aliases.appendSliceAssumeCapacity(&MIPSTriples);
|
|
310
|
+
biarch_libdirs.appendSliceAssumeCapacity(&MIPS64ELLibDirs);
|
|
311
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&MIPS64ELTriples);
|
|
312
|
+
biarch_libdirs.appendSliceAssumeCapacity(&MIPSN32ELLibDirs);
|
|
313
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSN32ELTriples);
|
|
314
|
+
},
|
|
315
|
+
.mips64 => {
|
|
316
|
+
lib_dirs.appendSliceAssumeCapacity(&MIPS64LibDirs);
|
|
317
|
+
triple_aliases.appendSliceAssumeCapacity(&MIPS64Triples);
|
|
318
|
+
biarch_libdirs.appendSliceAssumeCapacity(&MIPSLibDirs);
|
|
319
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSTriples);
|
|
320
|
+
biarch_libdirs.appendSliceAssumeCapacity(&MIPSN32LibDirs);
|
|
321
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSN32Triples);
|
|
322
|
+
},
|
|
323
|
+
.mips64el => {
|
|
324
|
+
lib_dirs.appendSliceAssumeCapacity(&MIPS64ELLibDirs);
|
|
325
|
+
triple_aliases.appendSliceAssumeCapacity(&MIPS64ELTriples);
|
|
326
|
+
biarch_libdirs.appendSliceAssumeCapacity(&MIPSELLibDirs);
|
|
327
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSELTriples);
|
|
328
|
+
biarch_libdirs.appendSliceAssumeCapacity(&MIPSN32ELLibDirs);
|
|
329
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSN32ELTriples);
|
|
330
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSTriples);
|
|
331
|
+
},
|
|
332
|
+
.msp430 => {
|
|
333
|
+
lib_dirs.appendSliceAssumeCapacity(&MSP430LibDirs);
|
|
334
|
+
triple_aliases.appendSliceAssumeCapacity(&MSP430Triples);
|
|
335
|
+
},
|
|
336
|
+
.powerpc => {
|
|
337
|
+
lib_dirs.appendSliceAssumeCapacity(&PPCLibDirs);
|
|
338
|
+
triple_aliases.appendSliceAssumeCapacity(&PPCTriples);
|
|
339
|
+
biarch_libdirs.appendSliceAssumeCapacity(&PPC64LibDirs);
|
|
340
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&PPC64Triples);
|
|
341
|
+
},
|
|
342
|
+
.powerpcle => {
|
|
343
|
+
lib_dirs.appendSliceAssumeCapacity(&PPCLELibDirs);
|
|
344
|
+
triple_aliases.appendSliceAssumeCapacity(&PPCLETriples);
|
|
345
|
+
biarch_libdirs.appendSliceAssumeCapacity(&PPC64LELibDirs);
|
|
346
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&PPC64LETriples);
|
|
347
|
+
},
|
|
348
|
+
.powerpc64 => {
|
|
349
|
+
lib_dirs.appendSliceAssumeCapacity(&PPC64LibDirs);
|
|
350
|
+
triple_aliases.appendSliceAssumeCapacity(&PPC64Triples);
|
|
351
|
+
biarch_libdirs.appendSliceAssumeCapacity(&PPCLibDirs);
|
|
352
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&PPCTriples);
|
|
353
|
+
},
|
|
354
|
+
.powerpc64le => {
|
|
355
|
+
lib_dirs.appendSliceAssumeCapacity(&PPC64LELibDirs);
|
|
356
|
+
triple_aliases.appendSliceAssumeCapacity(&PPC64LETriples);
|
|
357
|
+
biarch_libdirs.appendSliceAssumeCapacity(&PPCLELibDirs);
|
|
358
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&PPCLETriples);
|
|
359
|
+
},
|
|
360
|
+
.riscv32 => {
|
|
361
|
+
lib_dirs.appendSliceAssumeCapacity(&RISCV32LibDirs);
|
|
362
|
+
triple_aliases.appendSliceAssumeCapacity(&RISCV32Triples);
|
|
363
|
+
biarch_libdirs.appendSliceAssumeCapacity(&RISCV64LibDirs);
|
|
364
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&RISCV64Triples);
|
|
365
|
+
},
|
|
366
|
+
.riscv64 => {
|
|
367
|
+
lib_dirs.appendSliceAssumeCapacity(&RISCV64LibDirs);
|
|
368
|
+
triple_aliases.appendSliceAssumeCapacity(&RISCV64Triples);
|
|
369
|
+
biarch_libdirs.appendSliceAssumeCapacity(&RISCV32LibDirs);
|
|
370
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&RISCV32Triples);
|
|
371
|
+
},
|
|
372
|
+
.sparc => {
|
|
373
|
+
lib_dirs.appendSliceAssumeCapacity(&SPARCv8LibDirs);
|
|
374
|
+
triple_aliases.appendSliceAssumeCapacity(&SPARCv8Triples);
|
|
375
|
+
biarch_libdirs.appendSliceAssumeCapacity(&SPARCv9LibDirs);
|
|
376
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&SPARCv9Triples);
|
|
377
|
+
},
|
|
378
|
+
.sparc64 => {
|
|
379
|
+
lib_dirs.appendSliceAssumeCapacity(&SPARCv9LibDirs);
|
|
380
|
+
triple_aliases.appendSliceAssumeCapacity(&SPARCv9Triples);
|
|
381
|
+
biarch_libdirs.appendSliceAssumeCapacity(&SPARCv8LibDirs);
|
|
382
|
+
biarch_triple_aliases.appendSliceAssumeCapacity(&SPARCv8Triples);
|
|
383
|
+
},
|
|
384
|
+
.s390x => {
|
|
385
|
+
lib_dirs.appendSliceAssumeCapacity(&SystemZLibDirs);
|
|
386
|
+
triple_aliases.appendSliceAssumeCapacity(&SystemZTriples);
|
|
387
|
+
},
|
|
388
|
+
else => {},
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
pub fn discover(self: *GCCDetector, tc: *Toolchain) !void {
|
|
393
|
+
var path_buf: [std.fs.max_path_bytes]u8 = undefined;
|
|
394
|
+
var fib = std.heap.FixedBufferAllocator.init(&path_buf);
|
|
395
|
+
|
|
396
|
+
const target = tc.getTarget();
|
|
397
|
+
const biarch_variant_target = if (target.ptrBitWidth() == 32)
|
|
398
|
+
target.get64BitArchVariant()
|
|
399
|
+
else
|
|
400
|
+
target.get32BitArchVariant();
|
|
401
|
+
|
|
402
|
+
var candidate_lib_dirs_buffer: [16][]const u8 = undefined;
|
|
403
|
+
var candidate_lib_dirs = std.ArrayList([]const u8).initBuffer(&candidate_lib_dirs_buffer);
|
|
404
|
+
|
|
405
|
+
var candidate_triple_aliases_buffer: [16][]const u8 = undefined;
|
|
406
|
+
var candidate_triple_aliases = std.ArrayList([]const u8).initBuffer(&candidate_triple_aliases_buffer);
|
|
407
|
+
|
|
408
|
+
var candidate_biarch_lib_dirs_buffer: [16][]const u8 = undefined;
|
|
409
|
+
var candidate_biarch_lib_dirs = std.ArrayList([]const u8).initBuffer(&candidate_biarch_lib_dirs_buffer);
|
|
410
|
+
|
|
411
|
+
var candidate_biarch_triple_aliases_buffer: [20][]const u8 = undefined;
|
|
412
|
+
var candidate_biarch_triple_aliases = std.ArrayList([]const u8).initBuffer(&candidate_biarch_triple_aliases_buffer);
|
|
413
|
+
|
|
414
|
+
try collectLibDirsAndTriples(
|
|
415
|
+
tc,
|
|
416
|
+
&candidate_lib_dirs,
|
|
417
|
+
&candidate_triple_aliases,
|
|
418
|
+
&candidate_biarch_lib_dirs,
|
|
419
|
+
&candidate_biarch_triple_aliases,
|
|
420
|
+
);
|
|
421
|
+
|
|
422
|
+
var target_buf: [64]u8 = undefined;
|
|
423
|
+
const triple_str = target.toLLVMTriple(&target_buf);
|
|
424
|
+
candidate_triple_aliases.appendAssumeCapacity(triple_str);
|
|
425
|
+
|
|
426
|
+
// Also include the multiarch variant if it's different.
|
|
427
|
+
var biarch_buf: [64]u8 = undefined;
|
|
428
|
+
if (biarch_variant_target) |*biarch_target| {
|
|
429
|
+
const biarch_triple_str = biarch_target.toLLVMTriple(&biarch_buf);
|
|
430
|
+
if (!std.mem.eql(u8, biarch_triple_str, triple_str)) {
|
|
431
|
+
candidate_triple_aliases.appendAssumeCapacity(biarch_triple_str);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
var prefixes_buf: [16][]const u8 = undefined;
|
|
436
|
+
var prefixes = std.ArrayList([]const u8).initBuffer(&prefixes_buf);
|
|
437
|
+
const gcc_toolchain_dir = gccToolchainDir(tc);
|
|
438
|
+
if (gcc_toolchain_dir.len != 0) {
|
|
439
|
+
const adjusted = if (gcc_toolchain_dir[gcc_toolchain_dir.len - 1] == '/')
|
|
440
|
+
gcc_toolchain_dir[0 .. gcc_toolchain_dir.len - 1]
|
|
441
|
+
else
|
|
442
|
+
gcc_toolchain_dir;
|
|
443
|
+
prefixes.appendAssumeCapacity(adjusted);
|
|
444
|
+
} else {
|
|
445
|
+
const sysroot = tc.getSysroot();
|
|
446
|
+
if (sysroot.len > 0) {
|
|
447
|
+
prefixes.appendAssumeCapacity(sysroot);
|
|
448
|
+
try addDefaultGCCPrefixes(&prefixes, tc);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
if (sysroot.len == 0) {
|
|
452
|
+
try addDefaultGCCPrefixes(&prefixes, tc);
|
|
453
|
+
}
|
|
454
|
+
// TODO: Special-case handling for Gentoo
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
const v0 = GCCVersion.parse("0.0.0");
|
|
458
|
+
for (prefixes.items) |prefix| {
|
|
459
|
+
if (!tc.exists(prefix)) continue;
|
|
460
|
+
|
|
461
|
+
for (candidate_lib_dirs.items) |suffix| {
|
|
462
|
+
defer fib.reset();
|
|
463
|
+
const lib_dir = std.fs.path.join(fib.allocator(), &.{ prefix, suffix }) catch continue;
|
|
464
|
+
if (!tc.exists(lib_dir)) continue;
|
|
465
|
+
|
|
466
|
+
const gcc_dir_exists = tc.joinedExists(&.{ lib_dir, "/gcc" });
|
|
467
|
+
const gcc_cross_dir_exists = tc.joinedExists(&.{ lib_dir, "/gcc-cross" });
|
|
468
|
+
|
|
469
|
+
try self.scanLibDirForGCCTriple(tc, target, lib_dir, triple_str, false, gcc_dir_exists, gcc_cross_dir_exists);
|
|
470
|
+
for (candidate_triple_aliases.items) |candidate| {
|
|
471
|
+
try self.scanLibDirForGCCTriple(tc, target, lib_dir, candidate, false, gcc_dir_exists, gcc_cross_dir_exists);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
for (candidate_biarch_lib_dirs.items) |suffix| {
|
|
475
|
+
const lib_dir = std.fs.path.join(fib.allocator(), &.{ prefix, suffix }) catch continue;
|
|
476
|
+
if (!tc.exists(lib_dir)) continue;
|
|
477
|
+
|
|
478
|
+
const gcc_dir_exists = tc.joinedExists(&.{ lib_dir, "/gcc" });
|
|
479
|
+
const gcc_cross_dir_exists = tc.joinedExists(&.{ lib_dir, "/gcc-cross" });
|
|
480
|
+
for (candidate_biarch_triple_aliases.items) |candidate| {
|
|
481
|
+
try self.scanLibDirForGCCTriple(tc, target, lib_dir, candidate, true, gcc_dir_exists, gcc_cross_dir_exists);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
if (self.version.order(v0) == .gt) break;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
fn findBiarchMultilibs(
|
|
489
|
+
tc: *const Toolchain,
|
|
490
|
+
result: *Multilib.Detected,
|
|
491
|
+
target: *const Target,
|
|
492
|
+
path: [2][]const u8,
|
|
493
|
+
needs_biarch_suffix: bool,
|
|
494
|
+
) !bool {
|
|
495
|
+
const suff64 = if (target.os.tag == .illumos) switch (target.cpu.arch) {
|
|
496
|
+
.x86, .x86_64 => "/amd64",
|
|
497
|
+
.sparc => "/sparcv9",
|
|
498
|
+
else => "/64",
|
|
499
|
+
} else "/64";
|
|
500
|
+
|
|
501
|
+
const alt_64 = Multilib.init(suff64, suff64, &.{ "-m32", "+m64", "-mx32" });
|
|
502
|
+
const alt_32 = Multilib.init("/32", "/32", &.{ "+m32", "-m64", "-mx32" });
|
|
503
|
+
const alt_x32 = Multilib.init("/x32", "/x32", &.{ "-m32", "-m64", "+mx32" });
|
|
504
|
+
|
|
505
|
+
const multilib_filter = Multilib.Filter{
|
|
506
|
+
.base = path,
|
|
507
|
+
.file = "crtbegin.o",
|
|
508
|
+
};
|
|
509
|
+
|
|
510
|
+
const Want = enum {
|
|
511
|
+
want32,
|
|
512
|
+
want64,
|
|
513
|
+
wantx32,
|
|
514
|
+
};
|
|
515
|
+
const is_x32 = target.abi == .gnux32 or target.abi == .muslx32;
|
|
516
|
+
const target_ptr_width = target.ptrBitWidth();
|
|
517
|
+
const want: Want = if (target_ptr_width == 32 and multilib_filter.exists(alt_32, tc))
|
|
518
|
+
.want64
|
|
519
|
+
else if (target_ptr_width == 64 and is_x32 and multilib_filter.exists(alt_x32, tc))
|
|
520
|
+
.want64
|
|
521
|
+
else if (target_ptr_width == 64 and !is_x32 and multilib_filter.exists(alt_64, tc))
|
|
522
|
+
.want32
|
|
523
|
+
else if (target_ptr_width == 32)
|
|
524
|
+
if (needs_biarch_suffix) .want64 else .want32
|
|
525
|
+
else if (is_x32)
|
|
526
|
+
if (needs_biarch_suffix) .want64 else .wantx32
|
|
527
|
+
else if (needs_biarch_suffix) .want32 else .want64;
|
|
528
|
+
|
|
529
|
+
const default = switch (want) {
|
|
530
|
+
.want32 => Multilib.init("", "", &.{ "+m32", "-m64", "-mx32" }),
|
|
531
|
+
.want64 => Multilib.init("", "", &.{ "-m32", "+m64", "-mx32" }),
|
|
532
|
+
.wantx32 => Multilib.init("", "", &.{ "-m32", "-m64", "+mx32" }),
|
|
533
|
+
};
|
|
534
|
+
result.multilib_buf[result.multilib_count..][0..4].* = .{
|
|
535
|
+
default,
|
|
536
|
+
alt_64,
|
|
537
|
+
alt_32,
|
|
538
|
+
alt_x32,
|
|
539
|
+
};
|
|
540
|
+
result.multilib_count += 4;
|
|
541
|
+
|
|
542
|
+
result.filter(multilib_filter, tc);
|
|
543
|
+
return result.select(&.{
|
|
544
|
+
if (target_ptr_width == 64 and !is_x32) "+m64" else "-m64",
|
|
545
|
+
if (target_ptr_width == 32) "+m32" else "-m32",
|
|
546
|
+
if (target_ptr_width == 64 and is_x32) "+mx32" else "-mx32",
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
fn scanGCCForMultilibs(
|
|
551
|
+
self: *GCCDetector,
|
|
552
|
+
tc: *const Toolchain,
|
|
553
|
+
target: *const Target,
|
|
554
|
+
path: [2][]const u8,
|
|
555
|
+
needs_biarch_suffix: bool,
|
|
556
|
+
) !bool {
|
|
557
|
+
var detected: Multilib.Detected = .{};
|
|
558
|
+
if (target.cpu.arch == .csky) {
|
|
559
|
+
// TODO
|
|
560
|
+
} else if (target.cpu.arch.isMIPS()) {
|
|
561
|
+
// TODO
|
|
562
|
+
} else if (target.cpu.arch.isRISCV()) {
|
|
563
|
+
// TODO
|
|
564
|
+
} else if (target.cpu.arch == .msp430) {
|
|
565
|
+
// TODO
|
|
566
|
+
} else if (target.cpu.arch == .avr) {
|
|
567
|
+
// No multilibs
|
|
568
|
+
} else if (!try findBiarchMultilibs(tc, &detected, target, path, needs_biarch_suffix)) {
|
|
569
|
+
return false;
|
|
570
|
+
}
|
|
571
|
+
self.selected = detected.selected;
|
|
572
|
+
self.biarch_sibling = detected.biarch_sibling;
|
|
573
|
+
return true;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
fn scanLibDirForGCCTriple(
|
|
577
|
+
self: *GCCDetector,
|
|
578
|
+
tc: *const Toolchain,
|
|
579
|
+
target: *const Target,
|
|
580
|
+
lib_dir: []const u8,
|
|
581
|
+
candidate_triple: []const u8,
|
|
582
|
+
needs_biarch_suffix: bool,
|
|
583
|
+
gcc_dir_exists: bool,
|
|
584
|
+
gcc_cross_dir_exists: bool,
|
|
585
|
+
) !void {
|
|
586
|
+
var path_buf: [std.fs.max_path_bytes]u8 = undefined;
|
|
587
|
+
var fib = std.heap.FixedBufferAllocator.init(&path_buf);
|
|
588
|
+
const comp = tc.driver.comp;
|
|
589
|
+
const arena = comp.arena;
|
|
590
|
+
const io = comp.io;
|
|
591
|
+
for (0..2) |i| {
|
|
592
|
+
if (i == 0 and !gcc_dir_exists) continue;
|
|
593
|
+
if (i == 1 and !gcc_cross_dir_exists) continue;
|
|
594
|
+
defer fib.reset();
|
|
595
|
+
|
|
596
|
+
const base: []const u8 = if (i == 0) "gcc" else "gcc-cross";
|
|
597
|
+
var lib_suffix_buf: [64]u8 = undefined;
|
|
598
|
+
var suffix_buf_fib = std.heap.FixedBufferAllocator.init(&lib_suffix_buf);
|
|
599
|
+
const lib_suffix = std.fs.path.join(suffix_buf_fib.allocator(), &.{ base, candidate_triple }) catch continue;
|
|
600
|
+
|
|
601
|
+
const dir_name = std.fs.path.join(fib.allocator(), &.{ lib_dir, lib_suffix }) catch continue;
|
|
602
|
+
var parent_dir = comp.cwd.openDir(io, dir_name, .{ .access_sub_paths = false, .iterate = true }) catch continue;
|
|
603
|
+
defer parent_dir.close(io);
|
|
604
|
+
|
|
605
|
+
var it = parent_dir.iterate();
|
|
606
|
+
while (it.next(io) catch continue) |entry| {
|
|
607
|
+
if (entry.kind != .directory) continue;
|
|
608
|
+
|
|
609
|
+
const version_text = entry.name;
|
|
610
|
+
const candidate_version = GCCVersion.parse(version_text);
|
|
611
|
+
if (candidate_version.major != -1) {
|
|
612
|
+
// TODO: cache path so we're not repeatedly scanning
|
|
613
|
+
}
|
|
614
|
+
if (candidate_version.isLessThan(4, 1, 1, "")) continue;
|
|
615
|
+
switch (candidate_version.order(self.version)) {
|
|
616
|
+
.lt, .eq => continue,
|
|
617
|
+
.gt => {},
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
if (!try self.scanGCCForMultilibs(tc, target, .{ dir_name, version_text }, needs_biarch_suffix)) continue;
|
|
621
|
+
|
|
622
|
+
self.version = candidate_version;
|
|
623
|
+
self.gcc_triple = try arena.dupe(u8, candidate_triple);
|
|
624
|
+
self.install_path = try std.fs.path.join(arena, &.{ lib_dir, lib_suffix, version_text });
|
|
625
|
+
self.parent_lib_path = try std.fs.path.join(arena, &.{ self.install_path, "..", "..", ".." });
|
|
626
|
+
self.is_valid = true;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
fn gccToolchainDir(tc: *const Toolchain) []const u8 {
|
|
632
|
+
const sysroot = tc.getSysroot();
|
|
633
|
+
if (sysroot.len != 0) return "";
|
|
634
|
+
return system_defaults.gcc_install_prefix;
|
|
635
|
+
}
|