20 #include "clang/Config/config.h"
28 #include "llvm/ADT/StringSet.h"
29 #include "llvm/ADT/Twine.h"
30 #include "llvm/Option/ArgList.h"
31 #include "llvm/Support/CodeGen.h"
32 #include "llvm/Support/Path.h"
33 #include "llvm/Support/VirtualFileSystem.h"
34 #include "llvm/TargetParser/RISCVISAInfo.h"
35 #include "llvm/TargetParser/TargetParser.h"
36 #include <system_error>
40 using namespace clang;
57 ArgStringList &CmdArgs) {
58 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
59 StringRef CPUArg(A->getValue());
60 if (CPUArg.equals_insensitive(
"krait"))
61 CmdArgs.push_back(
"-mcpu=cortex-a15");
62 else if (CPUArg.equals_insensitive(
"kryo"))
63 CmdArgs.push_back(
"-mcpu=cortex-a57");
65 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
73 const char *LinkingOutput)
const {
74 const Driver &D = getToolChain().getDriver();
75 ArgStringList CmdArgs;
77 for (
const auto &A : Args) {
85 A->render(Args, CmdArgs);
89 RenderExtraToolArgs(JA, CmdArgs);
92 if (getToolChain().getTriple().isOSDarwin()) {
93 CmdArgs.push_back(
"-arch");
95 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
103 switch (getToolChain().getArch()) {
106 case llvm::Triple::x86:
107 case llvm::Triple::ppc:
108 case llvm::Triple::ppcle:
109 CmdArgs.push_back(
"-m32");
111 case llvm::Triple::x86_64:
112 case llvm::Triple::ppc64:
113 case llvm::Triple::ppc64le:
114 CmdArgs.push_back(
"-m64");
116 case llvm::Triple::sparcel:
117 CmdArgs.push_back(
"-EL");
123 CmdArgs.push_back(
"-o");
126 CmdArgs.push_back(
"-fsyntax-only");
129 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
139 for (
const auto &II : Inputs) {
142 D.
Diag(clang::diag::err_drv_no_linker_llvm_support)
143 << getToolChain().getTripleString();
144 else if (II.getType() == types::TY_AST)
145 D.
Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
146 else if (II.getType() == types::TY_ModuleFile)
147 D.
Diag(diag::err_drv_no_module_support)
148 << getToolChain().getTripleString();
151 CmdArgs.push_back(
"-x");
156 CmdArgs.push_back(II.getFilename());
158 const Arg &A = II.getInputArg();
161 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
162 CmdArgs.push_back(
"-lstdc++");
167 A.render(Args, CmdArgs);
173 if (!customGCCName.empty())
174 GCCName = customGCCName.c_str();
180 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
181 C.addCommand(std::make_unique<Command>(JA, *
this,
183 Exec, CmdArgs, Inputs, Output));
187 const JobAction &JA, ArgStringList &CmdArgs)
const {
188 CmdArgs.push_back(
"-E");
192 ArgStringList &CmdArgs)
const {
193 const Driver &D = getToolChain().getDriver();
197 case types::TY_LLVM_IR:
198 case types::TY_LTO_IR:
199 case types::TY_LLVM_BC:
200 case types::TY_LTO_BC:
201 CmdArgs.push_back(
"-c");
205 case types::TY_Object:
206 CmdArgs.push_back(
"-c");
208 case types::TY_PP_Asm:
209 CmdArgs.push_back(
"-S");
211 case types::TY_Nothing:
212 CmdArgs.push_back(
"-fsyntax-only");
220 ArgStringList &CmdArgs)
const {
224 static const char *
getLDMOption(
const llvm::Triple &
T,
const ArgList &Args) {
225 switch (
T.getArch()) {
226 case llvm::Triple::x86:
230 case llvm::Triple::aarch64:
231 return "aarch64linux";
232 case llvm::Triple::aarch64_be:
233 return "aarch64linuxb";
234 case llvm::Triple::arm:
235 case llvm::Triple::thumb:
236 case llvm::Triple::armeb:
237 case llvm::Triple::thumbeb:
239 :
"armelf_linux_eabi";
240 case llvm::Triple::m68k:
242 case llvm::Triple::ppc:
244 return "elf32ppclinux";
246 case llvm::Triple::ppcle:
248 return "elf32lppclinux";
250 case llvm::Triple::ppc64:
252 case llvm::Triple::ppc64le:
254 case llvm::Triple::riscv32:
255 return "elf32lriscv";
256 case llvm::Triple::riscv64:
257 return "elf64lriscv";
258 case llvm::Triple::sparc:
259 case llvm::Triple::sparcel:
260 return "elf32_sparc";
261 case llvm::Triple::sparcv9:
262 return "elf64_sparc";
263 case llvm::Triple::loongarch32:
264 return "elf32loongarch";
265 case llvm::Triple::loongarch64:
266 return "elf64loongarch";
267 case llvm::Triple::mips:
268 return "elf32btsmip";
269 case llvm::Triple::mipsel:
270 return "elf32ltsmip";
271 case llvm::Triple::mips64:
273 T.getEnvironment() == llvm::Triple::GNUABIN32)
274 return "elf32btsmipn32";
275 return "elf64btsmip";
276 case llvm::Triple::mips64el:
278 T.getEnvironment() == llvm::Triple::GNUABIN32)
279 return "elf32ltsmipn32";
280 return "elf64ltsmip";
281 case llvm::Triple::systemz:
283 case llvm::Triple::x86_64:
285 return "elf32_x86_64";
287 case llvm::Triple::ve:
289 case llvm::Triple::csky:
290 return "cskyelf_linux";
297 bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
298 if (HasStaticPIE && Args.hasArg(options::OPT_no_pie)) {
300 const llvm::opt::OptTable &Opts = D.
getOpts();
301 StringRef StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
302 StringRef NoPIEName = Opts.getOptionName(options::OPT_nopie);
303 D.
Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
309 return Args.hasArg(options::OPT_static) &&
310 !Args.hasArg(options::OPT_static_pie);
315 void tools::gnutools::Linker::constructLLVMARCommand(
318 ArgStringList CmdArgs;
323 CmdArgs.push_back(
"cqL");
325 if (llvm::sys::fs::exists(OutputFilename)) {
326 C.getDriver().Diag(clang::diag::warn_drv_existing_archive_append)
329 CmdArgs.push_back(OutputFilename);
330 for (
const auto &II : Input) {
331 if (II.getType() == types::TY_Tempfilelist) {
333 std::string
FileName(II.getFilename());
334 const char *ArgFile = Args.MakeArgString(
"@" + FileName);
335 CmdArgs.push_back(ArgFile);
339 CmdArgs.push_back(II.getFilename());
343 llvm::sys::path::append(LLVMARPath,
"llvm-ar");
344 const char *Exec =
C.getArgs().MakeArgString(LLVMARPath);
345 C.addCommand(std::make_unique<Command>(
352 const char *LinkingOutput)
const {
353 const Driver &D = getToolChain().getDriver();
356 Args.ClaimAllArgs(options::OPT_g_Group);
358 Args.ClaimAllArgs(options::OPT_emit_llvm);
361 Args.ClaimAllArgs(options::OPT_w);
363 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
366 ArgStringList CmdArgs;
368 CmdArgs.push_back(
"rcsD");
371 for (
const auto &II : Inputs) {
372 if (II.isFilename()) {
373 CmdArgs.push_back(II.getFilename());
380 if (Output.
isFilename() && llvm::sys::fs::exists(OutputFileName)) {
382 D.
Diag(diag::err_drv_unable_to_remove_file) << EC.message();
387 const char *Exec = Args.MakeArgString(getToolChain().GetStaticLibToolPath());
388 C.addCommand(std::make_unique<Command>(JA, *
this,
390 Exec, CmdArgs, Inputs, Output));
397 const char *LinkingOutput)
const {
405 const llvm::Triple &Triple = getToolChain().getEffectiveTriple();
414 const bool HasCRTBeginEndFiles =
419 if (Args.hasArg(options::OPT_fsycl_link_EQ) &&
420 JA.
getType() == types::TY_Archive) {
421 constructLLVMARCommand(C, JA, Output, Inputs, Args);
424 ArgStringList CmdArgs;
427 Args.ClaimAllArgs(options::OPT_g_Group);
429 Args.ClaimAllArgs(options::OPT_emit_llvm);
432 Args.ClaimAllArgs(options::OPT_w);
435 CmdArgs.push_back(Args.MakeArgString(
"--sysroot=" + D.
SysRoot));
437 if (Args.hasArg(options::OPT_s))
438 CmdArgs.push_back(
"-s");
440 if (Triple.isARM() || Triple.isThumb()) {
444 CmdArgs.push_back(IsBigEndian ?
"-EB" :
"-EL");
445 }
else if (Triple.isAArch64()) {
446 CmdArgs.push_back(Arch == llvm::Triple::aarch64_be ?
"-EB" :
"-EL");
451 if (Arch == llvm::Triple::aarch64 && (isAndroid || isOHOSFamily)) {
452 std::string CPU =
getCPUName(D, Args, Triple);
453 if (CPU.empty() || CPU ==
"generic" || CPU ==
"cortex-a53")
454 CmdArgs.push_back(
"--fix-cortex-a53-843419");
459 CmdArgs.push_back(
"--eh-frame-hdr");
462 CmdArgs.push_back(
"-m");
463 CmdArgs.push_back(LDMOption);
465 D.
Diag(diag::err_target_unknown_triple) << Triple.str();
469 if (Triple.isRISCV()) {
470 CmdArgs.push_back(
"-X");
471 if (Args.hasArg(options::OPT_mno_relax))
472 CmdArgs.push_back(
"--no-relax");
475 const bool IsShared = Args.hasArg(options::OPT_shared);
477 CmdArgs.push_back(
"-shared");
480 CmdArgs.push_back(
"-static");
481 CmdArgs.push_back(
"-pie");
482 CmdArgs.push_back(
"--no-dynamic-linker");
483 CmdArgs.push_back(
"-z");
484 CmdArgs.push_back(
"text");
486 CmdArgs.push_back(
"-static");
487 }
else if (!Args.hasArg(options::OPT_r)) {
488 if (Args.hasArg(options::OPT_rdynamic))
489 CmdArgs.push_back(
"-export-dynamic");
491 IsPIE = Args.hasFlag(options::OPT_pie, options::OPT_no_pie,
494 CmdArgs.push_back(
"-pie");
495 CmdArgs.push_back(
"-dynamic-linker");
496 CmdArgs.push_back(Args.MakeArgString(Twine(D.
DyldPrefix) +
501 CmdArgs.push_back(
"-o");
504 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
506 if (!isAndroid && !IsIAMCU) {
507 const char *crt1 =
nullptr;
508 if (!Args.hasArg(options::OPT_shared)) {
509 if (Args.hasArg(options::OPT_pg))
513 else if (IsStaticPIE)
525 CmdArgs.push_back(
"-z");
526 CmdArgs.push_back(
"max-page-size=0x4000000");
531 else if (HasCRTBeginEndFiles) {
541 const char *crtbegin;
542 if (Args.hasArg(options::OPT_shared))
543 crtbegin = isAndroid ?
"crtbegin_so.o" :
"crtbeginS.o";
545 crtbegin = isAndroid ?
"crtbegin_static.o" :
"crtbeginT.o";
546 else if (IsPIE || IsStaticPIE)
547 crtbegin = isAndroid ?
"crtbegin_dynamic.o" :
"crtbeginS.o";
549 crtbegin = isAndroid ?
"crtbegin_dynamic.o" :
"crtbegin.o";
552 CmdArgs.push_back(Args.MakeArgString(
P));
558 if (isAndroid && Args.hasFlag(options::OPT_fandroid_pad_segment,
559 options::OPT_fno_android_pad_segment,
false))
566 if (JA.
getType() == types::TY_Host_Dependencies_Image)
567 CmdArgs.push_back(
"--unresolved-symbols=ignore-all");
569 Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_u});
574 assert(!Inputs.empty() &&
"Must have at least one input.");
576 auto Input = llvm::find_if(
578 if (Input == Inputs.end())
581 Input = Inputs.begin();
587 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
588 CmdArgs.push_back(
"--no-demangle");
602 for (
const auto &II : Inputs) {
606 bool IsAOCXFile =
false;
608 IsAOCXFile = llvm::sys::path::extension(II.getFilename()) ==
".aocx";
610 if (II.getType() == types::TY_Tempfilelist ||
611 (IsAOCXFile && II.getType() == types::TY_Object)) {
613 const char *ArgFile =
614 C.getArgs().MakeArgString(
"@" + StringRef(II.getFilename()));
615 auto CurInput =
InputInfo(types::TY_Object, ArgFile, ArgFile);
616 UpdatedInputs.push_back(CurInput);
618 UpdatedInputs.push_back(II);
627 getToolChain().addProfileRTLibs(Args, CmdArgs);
630 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
633 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
634 !Args.hasArg(options::OPT_static);
635 if (OnlyLibstdcxxStatic)
636 CmdArgs.push_back(
"-Bstatic");
638 if (OnlyLibstdcxxStatic)
639 CmdArgs.push_back(
"-Bdynamic");
641 CmdArgs.push_back(
"-lm");
645 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
654 CmdArgs.push_back(
"-lm");
659 if (Args.hasArg(options::OPT_fsycl, options::OPT_fopenmp_targets_EQ) &&
660 Args.hasFlag(options::OPT_flink_huge_device_code,
661 options::OPT_fno_link_huge_device_code,
false)) {
665 if (C.getDriver().isSaveTempsEnabled()) {
666 llvm::sys::path::replace_extension(Name,
"ld");
667 LKS = C.getArgs().MakeArgString(Name.c_str());
669 llvm::sys::path::replace_extension(Name,
"");
670 Name = C.getDriver().GetTemporaryPath(Name,
"ld");
671 LKS = C.addTempFile(C.getArgs().MakeArgString(Name.c_str()));
675 CmdArgs.push_back(
"-T");
676 CmdArgs.push_back(LKS);
679 if (!C.getArgs().hasArg(options::OPT__HASH_HASH_HASH)) {
681 llvm::raw_fd_ostream ScriptOS(LKS, EC, llvm::sys::fs::OF_None);
684 C.getDriver().Diag(clang::diag::err_unable_to_make_temp)
689 " * This linker script allows huge (>3GB) device code\n"
690 " * sections. It has been auto-generated by the driver.\n"
694 " . = SEGMENT_START(\"offload-device-code\", .);\n"
695 " OFFLOAD_DEVICE_CODE ALIGN(CONSTANT (MAXPAGESIZE)) + (. & "
696 "(CONSTANT (MAXPAGESIZE) - 1)) :\n"
698 " *(__CLANG_OFFLOAD_BUNDLE__*)\n"
701 "INSERT AFTER .bss\n";
707 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_r)) {
708 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
710 CmdArgs.push_back(
"--start-group");
712 if (NeedsSanitizerDeps)
718 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
719 Args.hasArg(options::OPT_pthreads);
722 bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) &&
723 !Args.hasArg(options::OPT_static);
736 if (Args.hasArg(options::OPT_fsycl) &&
737 !Args.hasArg(options::OPT_nolibsycl)) {
738 if (Args.hasArg(options::OPT_fpreview_breaking_changes))
739 CmdArgs.push_back(
"-lsycl-preview");
741 CmdArgs.push_back(
"-lsycl");
742 CmdArgs.push_back(
"-lsycl-devicelib-host");
745 if (Args.hasArg(options::OPT_fintelfpga))
746 CmdArgs.push_back(
"-lOpenCL");
752 if (getToolChain().getTriple().getArch() == llvm::Triple::sparc) {
753 CmdArgs.push_back(
"--push-state");
754 CmdArgs.push_back(
"--as-needed");
755 CmdArgs.push_back(
"-latomic");
756 CmdArgs.push_back(
"--pop-state");
761 if (WantPthread && !isAndroid && !isOHOSFamily)
762 CmdArgs.push_back(
"-lpthread");
764 if (Args.hasArg(options::OPT_fsplit_stack))
765 CmdArgs.push_back(
"--wrap=pthread_create");
767 if (!Args.hasArg(options::OPT_nolibc))
768 CmdArgs.push_back(
"-lc");
772 CmdArgs.push_back(
"-lgloss");
775 CmdArgs.push_back(
"--end-group");
781 CmdArgs.push_back(
"--as-needed");
782 CmdArgs.push_back(
"-lsoftfp");
783 CmdArgs.push_back(
"--no-as-needed");
787 if (!Args.hasArg(options::OPT_nostartfiles) && !IsIAMCU) {
788 if (HasCRTBeginEndFiles) {
799 if (Args.hasArg(options::OPT_shared))
800 crtend = isAndroid ?
"crtend_so.o" :
"crtendS.o";
801 else if (IsPIE || IsStaticPIE)
802 crtend = isAndroid ?
"crtend_android.o" :
"crtendS.o";
804 crtend = isAndroid ?
"crtend_android.o" :
"crtend.o";
807 CmdArgs.push_back(Args.MakeArgString(
P));
814 Args.AddAllArgs(CmdArgs, options::OPT_T);
817 C.addCommand(std::make_unique<Command>(JA, *
this,
819 Exec, CmdArgs, Inputs, Output));
827 const char *LinkingOutput)
const {
828 const auto &D = getToolChain().getDriver();
832 ArgStringList CmdArgs;
834 llvm::Reloc::Model RelocationModel;
837 const char *DefaultAssembler =
"as";
840 if (getToolChain().getTriple().isOSSolaris())
841 DefaultAssembler =
"gas";
842 std::tie(RelocationModel, PICLevel, IsPIE) =
845 if (
const Arg *A = Args.getLastArg(options::OPT_gz, options::OPT_gz_EQ)) {
846 if (A->getOption().getID() == options::OPT_gz) {
847 CmdArgs.push_back(
"--compress-debug-sections");
849 StringRef
Value = A->getValue();
852 Args.MakeArgString(
"--compress-debug-sections=" + Twine(
Value)));
854 D.Diag(diag::err_drv_unsupported_option_argument)
855 << A->getSpelling() <<
Value;
860 switch (getToolChain().getArch()) {
865 case llvm::Triple::x86:
866 CmdArgs.push_back(
"--32");
868 case llvm::Triple::x86_64:
869 if (getToolChain().getTriple().isX32())
870 CmdArgs.push_back(
"--x32");
872 CmdArgs.push_back(
"--64");
874 case llvm::Triple::ppc: {
875 CmdArgs.push_back(
"-a32");
876 CmdArgs.push_back(
"-mppc");
877 CmdArgs.push_back(
"-mbig-endian");
879 getCPUName(D, Args, getToolChain().getTriple())));
882 case llvm::Triple::ppcle: {
883 CmdArgs.push_back(
"-a32");
884 CmdArgs.push_back(
"-mppc");
885 CmdArgs.push_back(
"-mlittle-endian");
887 getCPUName(D, Args, getToolChain().getTriple())));
890 case llvm::Triple::ppc64: {
891 CmdArgs.push_back(
"-a64");
892 CmdArgs.push_back(
"-mppc64");
893 CmdArgs.push_back(
"-mbig-endian");
895 getCPUName(D, Args, getToolChain().getTriple())));
898 case llvm::Triple::ppc64le: {
899 CmdArgs.push_back(
"-a64");
900 CmdArgs.push_back(
"-mppc64");
901 CmdArgs.push_back(
"-mlittle-endian");
903 getCPUName(D, Args, getToolChain().getTriple())));
906 case llvm::Triple::riscv32:
907 case llvm::Triple::riscv64: {
909 CmdArgs.push_back(
"-mabi");
910 CmdArgs.push_back(ABIName.data());
912 CmdArgs.push_back(
"-march");
913 CmdArgs.push_back(MArchName.data());
914 if (!Args.hasFlag(options::OPT_mrelax, options::OPT_mno_relax,
true))
915 Args.addOptOutFlag(CmdArgs, options::OPT_mrelax, options::OPT_mno_relax);
918 case llvm::Triple::sparc:
919 case llvm::Triple::sparcel: {
920 CmdArgs.push_back(
"-32");
921 std::string CPU =
getCPUName(D, Args, getToolChain().getTriple());
927 case llvm::Triple::sparcv9: {
928 CmdArgs.push_back(
"-64");
929 std::string CPU =
getCPUName(D, Args, getToolChain().getTriple());
935 case llvm::Triple::arm:
936 case llvm::Triple::armeb:
937 case llvm::Triple::thumb:
938 case llvm::Triple::thumbeb: {
939 const llvm::Triple &Triple2 = getToolChain().getTriple();
941 switch (Triple2.getSubArch()) {
942 case llvm::Triple::ARMSubArch_v7:
943 CmdArgs.push_back(
"-mfpu=neon");
945 case llvm::Triple::ARMSubArch_v8:
946 CmdArgs.push_back(
"-mfpu=crypto-neon-fp-armv8");
953 case arm::FloatABI::Invalid: llvm_unreachable(
"must have an ABI!");
954 case arm::FloatABI::Soft:
955 CmdArgs.push_back(Args.MakeArgString(
"-mfloat-abi=soft"));
957 case arm::FloatABI::SoftFP:
958 CmdArgs.push_back(Args.MakeArgString(
"-mfloat-abi=softfp"));
960 case arm::FloatABI::Hard:
961 CmdArgs.push_back(Args.MakeArgString(
"-mfloat-abi=hard"));
965 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
968 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
972 if (Arg *A = Args.getLastArgNoClaim(options::OPT_mabi_EQ))
973 A->ignoreTargetSpecific();
976 case llvm::Triple::aarch64:
977 case llvm::Triple::aarch64_be: {
979 getToolChain().getArch() == llvm::Triple::aarch64_be ?
"-EB" :
"-EL");
980 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
986 case llvm::Triple::loongarch64: {
989 CmdArgs.push_back(Args.MakeArgString(
"-mabi=" + ABIName));
992 case llvm::Triple::mips:
993 case llvm::Triple::mipsel:
994 case llvm::Triple::mips64:
995 case llvm::Triple::mips64el: {
1001 CmdArgs.push_back(
"-march");
1002 CmdArgs.push_back(CPUName.data());
1004 CmdArgs.push_back(
"-mabi");
1005 CmdArgs.push_back(ABIName.data());
1009 if (RelocationModel == llvm::Reloc::Static)
1010 CmdArgs.push_back(
"-mno-shared");
1014 if (ABIName !=
"64" && !Args.hasArg(options::OPT_mno_abicalls))
1015 CmdArgs.push_back(
"-call_nonpic");
1017 if (getToolChain().getTriple().isLittleEndian())
1018 CmdArgs.push_back(
"-EL");
1020 CmdArgs.push_back(
"-EB");
1022 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
1023 if (StringRef(A->getValue()) ==
"2008")
1024 CmdArgs.push_back(Args.MakeArgString(
"-mnan=2008"));
1028 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1029 options::OPT_mfp64)) {
1031 A->render(Args, CmdArgs);
1033 Args, getToolChain().getTriple(), CPUName, ABIName,
1035 getToolChain().getTriple())))
1036 CmdArgs.push_back(
"-mfpxx");
1041 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
1042 if (A->getOption().matches(options::OPT_mips16)) {
1044 A->render(Args, CmdArgs);
1047 CmdArgs.push_back(
"-no-mips16");
1051 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
1052 options::OPT_mno_micromips);
1053 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
1054 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
1056 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
1059 if (A->getOption().matches(options::OPT_mmsa))
1060 CmdArgs.push_back(Args.MakeArgString(
"-mmsa"));
1063 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
1064 options::OPT_msoft_float);
1066 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
1067 options::OPT_msingle_float);
1069 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
1070 options::OPT_mno_odd_spreg);
1075 case llvm::Triple::systemz: {
1079 CmdArgs.push_back(Args.MakeArgString(
"-march=" + CPUName));
1082 case llvm::Triple::ve:
1083 DefaultAssembler =
"nas";
1086 for (
const Arg *A : Args.filtered(options::OPT_ffile_prefix_map_EQ,
1087 options::OPT_fdebug_prefix_map_EQ)) {
1088 StringRef Map = A->getValue();
1089 if (!Map.contains(
'='))
1090 D.Diag(diag::err_drv_invalid_argument_to_option)
1091 << Map << A->getOption().getName();
1093 CmdArgs.push_back(Args.MakeArgString(
"--debug-prefix-map"));
1094 CmdArgs.push_back(Args.MakeArgString(Map));
1099 Args.AddAllArgs(CmdArgs, options::OPT_I);
1100 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
1102 CmdArgs.push_back(
"-o");
1105 for (
const auto &II : Inputs)
1106 CmdArgs.push_back(II.getFilename());
1108 if (Arg *A = Args.getLastArg(options::OPT_g_Flag, options::OPT_gN_Group,
1109 options::OPT_gdwarf_2, options::OPT_gdwarf_3,
1110 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
1111 options::OPT_gdwarf))
1112 if (!A->getOption().matches(options::OPT_g0)) {
1113 Args.AddLastArg(CmdArgs, options::OPT_g_Flag);
1116 CmdArgs.push_back(Args.MakeArgString(
"-gdwarf-" + Twine(DwarfVersion)));
1120 Args.MakeArgString(getToolChain().GetProgramPath(DefaultAssembler));
1121 C.addCommand(std::make_unique<Command>(JA, *
this,
1123 Exec, CmdArgs, Inputs, Output));
1128 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
1129 getToolChain().getTriple().isOSLinux())
1136 class FilterNonExistent {
1138 llvm::vfs::FileSystem &VFS;
1141 FilterNonExistent(StringRef
Base, StringRef File, llvm::vfs::FileSystem &VFS)
1143 bool operator()(
const Multilib &M) {
1150 Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1151 options::OPT_mfloat_abi_EQ);
1155 return A->getOption().matches(options::OPT_msoft_float) ||
1156 (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
1157 A->getValue() == StringRef(
"soft"));
1161 return Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb;
1165 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1169 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
1170 return A && A->getOption().matches(options::OPT_mips16);
1174 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
1175 return A && A->getOption().matches(options::OPT_mmicromips);
1179 return Arch == llvm::Triple::msp430;
1183 FilterNonExistent &NonExistent,
1190 auto MArchMicroMips =
1194 .
flag(
"-mips16",
true)
1195 .
flag(
"-mmicromips",
true);
1204 .
flag(
"-msoft-float",
true)
1205 .
flag(
"-mnan=2008",
true);
1216 .includeSuffix(
"/64")
1218 .flag(
"-mabi=n32",
true)
1219 .flag(
"-m32",
true);
1223 .
Either(MArchMips16, MArchMicroMips, MArchDefault)
1225 .
Either(SoftFloat, Nan2008, DefaultFloat)
1228 .
Either(BigEndian, LittleEndian)
1235 std::vector<std::string> Dirs({
"/include"});
1238 "/../../../../mips-linux-gnu/libc/uclibc/usr/include");
1240 Dirs.push_back(
"/../../../../mips-linux-gnu/libc/usr/include");
1253 .includeSuffix(
"/64")
1256 .flag(
"-mabi=n32",
true);
1262 .flag(
"-mabi=n32",
true);
1265 .
Either(M32, M64, MAbiN32)
1272 MultilibSet *Candidates[] = {&CSMipsMultilibs, &DebianMipsMultilibs};
1273 if (CSMipsMultilibs.
size() < DebianMipsMultilibs.
size())
1274 std::iter_swap(Candidates, Candidates + 1);
1276 if (Candidate->select(Flags, Result.SelectedMultilibs)) {
1277 if (Candidate == &DebianMipsMultilibs)
1279 Result.Multilibs = *Candidate;
1288 FilterNonExistent &NonExistent,
1302 .flag(
"-march=mips32r2"),
1304 .flag(
"-march=mips32r6"))
1312 .flag(
"-march=mips32"),
1314 .flag(
"-march=mips32r2"),
1316 .flag(
"-march=mips32r6"))
1321 if (VFS.exists(Path +
"/mips-r6"))
1322 MS = &AndroidMipselMultilibs;
1323 else if (VFS.exists(Path +
"/32"))
1324 MS = &AndroidMips64elMultilibs;
1325 if (MS->
select(Flags, Result.SelectedMultilibs)) {
1326 Result.Multilibs = *MS;
1333 FilterNonExistent &NonExistent,
1342 .flag(
"-march=mips32r2");
1347 .
flag(
"-march=mips32r2");
1350 .
Either(MArchMipsR2, MArchMipselR2)
1355 return std::vector<std::string>(
1356 {
"/../sysroot" + M.
osSuffix() +
"/usr/include"});
1359 if (MuslMipsMultilibs.
select(Flags, Result.SelectedMultilibs)) {
1360 Result.Multilibs = MuslMipsMultilibs;
1367 FilterNonExistent &NonExistent,
1375 .
flag(
"-mmicromips",
true)
1376 .
flag(
"-march=mips32");
1381 .
flag(
"-mmicromips");
1386 .
flag(
"-march=mips64r2");
1391 .
flag(
"-march=mips64r2",
true);
1396 .
flag(
"-mmicromips",
true)
1397 .
flag(
"-march=mips32r2");
1405 .
flag(
"-mabi=n32",
true)
1406 .
flag(
"-m32",
true);
1418 MtiMipsMultilibsV1 =
1420 .
Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1432 .
Either(BigEndian, LittleEndian)
1439 std::vector<std::string> Dirs({
"/include"});
1441 Dirs.push_back(
"/../../../../sysroot/uclibc/usr/include");
1443 Dirs.push_back(
"/../../../../sysroot/usr/include");
1453 .
flag(
"-msoft-float",
true)
1454 .
flag(
"-mnan=2008",
true)
1455 .
flag(
"-muclibc",
true);
1458 .
flag(
"-msoft-float")
1459 .
flag(
"-mnan=2008",
true);
1462 .
flag(
"-msoft-float",
true)
1463 .
flag(
"-mnan=2008",
true)
1464 .
flag(
"-muclibc",
true);
1467 .
flag(
"-msoft-float")
1468 .
flag(
"-mnan=2008",
true)
1469 .
flag(
"-mmicromips",
true);
1472 .
flag(
"-msoft-float",
true)
1474 .
flag(
"-muclibc",
true);
1477 .
flag(
"-msoft-float",
true)
1479 .
flag(
"-muclibc",
true)
1480 .
flag(
"-mmicromips",
true);
1481 auto BeHardNanUclibc =
MultilibBuilder(
"/mips-r2-hard-nan2008-uclibc")
1483 .
flag(
"-msoft-float",
true)
1486 auto ElHardNanUclibc =
MultilibBuilder(
"/mipsel-r2-hard-nan2008-uclibc")
1488 .
flag(
"-msoft-float",
true)
1493 .
flag(
"-msoft-float",
true)
1494 .
flag(
"-mnan=2008",
true)
1498 .
flag(
"-msoft-float",
true)
1499 .
flag(
"-mnan=2008",
true)
1503 .
flag(
"-msoft-float",
true)
1505 .
flag(
"-mmicromips");
1508 .
flag(
"-msoft-float")
1509 .
flag(
"-mnan=2008",
true)
1510 .
flag(
"-mmicromips");
1514 .flag(
"-mabi=n32",
true)
1515 .flag(
"-mabi=n64",
true);
1519 .flag(
"-mabi=n64",
true);
1522 .flag(
"-mabi=n32",
true)
1525 MtiMipsMultilibsV2 =
1527 .
Either({BeHard, BeSoft, ElHard, ElSoft, BeHardNan, ElHardNan,
1528 BeHardNanUclibc, ElHardNanUclibc, BeHardUclibc,
1529 ElHardUclibc, ElMicroHardNan, ElMicroSoft})
1530 .Either(O32, N32, N64)
1534 return std::vector<std::string>({
"/../../../../sysroot" +
1536 "/../usr/include"});
1538 .setFilePathsCallback([](
const Multilib &M) {
1539 return std::vector<std::string>(
1540 {
"/../../../../mips-mti-linux-gnu/lib" + M.
gccSuffix()});
1543 for (
auto *Candidate : {&MtiMipsMultilibsV1, &MtiMipsMultilibsV2}) {
1544 if (Candidate->select(Flags, Result.SelectedMultilibs)) {
1545 Result.Multilibs = *Candidate;
1553 FilterNonExistent &NonExistent,
1560 .
flag(
"-m32",
true);
1567 .
flag(
"-mabi=n32",
true)
1568 .
flag(
"-m32",
true);
1574 .
Maybe(LittleEndian)
1578 return std::vector<std::string>(
1579 {
"/include",
"/../../../../sysroot/usr/include"});
1588 .
flag(
"-msoft-float",
true)
1589 .
flag(
"-mmicromips",
true);
1592 .
flag(
"-msoft-float")
1593 .
flag(
"-mmicromips",
true);
1596 .
flag(
"-msoft-float",
true)
1597 .
flag(
"-mmicromips",
true);
1600 .
flag(
"-msoft-float")
1601 .
flag(
"-mmicromips",
true);
1604 .
flag(
"-msoft-float",
true)
1605 .
flag(
"-mmicromips");
1608 .
flag(
"-msoft-float")
1609 .
flag(
"-mmicromips");
1612 .
flag(
"-msoft-float",
true)
1613 .
flag(
"-mmicromips");
1616 .
flag(
"-msoft-float")
1617 .
flag(
"-mmicromips");
1621 .flag(
"-mabi=n32",
true)
1622 .flag(
"-mabi=n64",
true);
1626 .flag(
"-mabi=n64",
true);
1629 .flag(
"-mabi=n32",
true)
1634 .
Either({BeHard, BeSoft, ElHard, ElSoft, BeMicroHard, BeMicroSoft,
1635 ElMicroHard, ElMicroSoft})
1636 .Either(O32, N32, N64)
1640 return std::vector<std::string>({
"/../../../../sysroot" +
1642 "/../usr/include"});
1644 .setFilePathsCallback([](
const Multilib &M) {
1645 return std::vector<std::string>(
1646 {
"/../../../../mips-img-linux-gnu/lib" + M.
gccSuffix()});
1649 for (
auto *Candidate : {&ImgMultilibsV1, &ImgMultilibsV2}) {
1650 if (Candidate->select(Flags, Result.SelectedMultilibs)) {
1651 Result.Multilibs = *Candidate;
1659 const llvm::Triple &TargetTriple,
1660 StringRef Path,
const ArgList &Args,
1662 FilterNonExistent NonExistent(Path,
"/crtbegin.o", D.
getVFS());
1668 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1676 CPUName ==
"mips32r5" || CPUName ==
"p5600",
1677 "-march=mips32r2", Flags);
1681 CPUName ==
"mips64r5" || CPUName ==
"octeon" ||
1682 CPUName ==
"octeon+",
1683 "-march=mips64r2", Flags);
1696 if (TargetTriple.isAndroid())
1700 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
1701 TargetTriple.getOS() == llvm::Triple::Linux &&
1702 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
1705 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
1706 TargetTriple.getOS() == llvm::Triple::Linux &&
1707 TargetTriple.isGNUEnvironment())
1710 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1711 TargetTriple.getOS() == llvm::Triple::Linux &&
1712 TargetTriple.isGNUEnvironment())
1720 Result.Multilibs.push_back(Default);
1721 Result.Multilibs.FilterOut(NonExistent);
1723 if (Result.Multilibs.select(Flags, Result.SelectedMultilibs)) {
1732 const llvm::Triple &TargetTriple,
1733 StringRef Path,
const ArgList &Args,
1736 FilterNonExistent NonExistent(Path,
"/crtbegin.o", D.
getVFS());
1738 .
flag(
"-march=armv7-a")
1739 .
flag(
"-mthumb",
true);
1741 .
flag(
"-march=armv7-a",
true)
1747 .
flag(
"-march=armv7-a",
true)
1748 .
flag(
"-mthumb",
true);
1751 .
Either(ThumbMultilib, ArmV7Multilib, ArmV7ThumbMultilib,
1757 llvm::StringRef Arch = Args.getLastArgValue(options::OPT_march_EQ);
1758 bool IsArmArch = TargetTriple.getArch() == llvm::Triple::arm;
1759 bool IsThumbArch = TargetTriple.getArch() == llvm::Triple::thumb;
1760 bool IsV7SubArch = TargetTriple.getSubArch() == llvm::Triple::ARMSubArch_v7;
1761 bool IsThumbMode = IsThumbArch ||
1762 Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb,
false) ||
1763 (IsArmArch && llvm::ARM::parseArchISA(Arch) == llvm::ARM::ISAKind::THUMB);
1764 bool IsArmV7Mode = (IsArmArch || IsThumbArch) &&
1765 (llvm::ARM::parseArchVersion(Arch) == 7 ||
1766 (IsArmArch && Arch ==
"" && IsV7SubArch));
1770 if (AndroidArmMultilibs.
select(Flags, Result.SelectedMultilibs))
1771 Result.Multilibs = AndroidArmMultilibs;
1775 const llvm::Triple &TargetTriple,
1776 StringRef Path,
const ArgList &Args,
1778 FilterNonExistent NonExistent(Path,
"/crtbegin.o", D.
getVFS());
1788 Result.Multilibs.push_back(WithoutExceptions.
makeMultilib());
1789 Result.Multilibs.push_back(WithExceptions.
makeMultilib());
1790 Result.Multilibs.FilterOut(NonExistent);
1794 options::OPT_fno_exceptions,
false),
1795 "-exceptions", Flags);
1796 if (Result.Multilibs.select(Flags, Result.SelectedMultilibs))
1803 StringRef Path,
const ArgList &Args,
1805 FilterNonExistent NonExistent(Path,
"/crtbegin.o", D.
getVFS());
1808 std::optional<llvm::StringRef> Res =
1813 auto ARCHName = *Res;
1832 bool isBigEndian =
false;
1833 if (Arg *A = Args.getLastArg(options::OPT_mlittle_endian,
1834 options::OPT_mbig_endian))
1835 isBigEndian = !A->getOption().matches(options::OPT_mlittle_endian);
1857 .
Either({Arch801, Arch802, Arch803, Arch804, Arch805, Arch807,
1858 Arch810, Arch810v, Arch860, Arch860v})
1859 .Either(HardFloat, SoftFpFloat, SoftFloat)
1863 if (CSKYMultilibs.
select(Flags, Result.SelectedMultilibs))
1864 Result.Multilibs = CSKYMultilibs;
1882 if (RISCVMultilibSet.
select(Flags, SelectedMultilibs))
1886 std::vector<MultilibBuilder> NewMultilibs;
1889 llvm::RISCVISAInfo::parseArchString(
1893 if (llvm::errorToBool(ParseResult.takeError()))
1896 auto &ISAInfo = *ParseResult;
1902 for (StringRef Flag : Flags) {
1903 if (Flag.starts_with(
"!march=") || Flag.starts_with(
"-march="))
1906 NewFlags.push_back(Flag.str());
1909 llvm::StringSet<> AllArchExts;
1912 for (
const auto &M : RISCVMultilibSet) {
1917 for (StringRef Flag : M.flags()) {
1919 if (!Flag.consume_front(
"-march=")) {
1920 NewMultilib.
flag(Flag);
1926 llvm::RISCVISAInfo::parseArchString(
1930 if (llvm::errorToBool(MLConfigParseResult.takeError())) {
1936 auto &MLConfigISAInfo = *MLConfigParseResult;
1938 for (
auto &MLConfigArchExt : MLConfigISAInfo->getExtensions()) {
1939 auto ExtName = MLConfigArchExt.first;
1940 NewMultilib.
flag(Twine(
"-", ExtName).str());
1942 if (AllArchExts.insert(ExtName).second) {
1944 Twine(
"-", ExtName).str(), NewFlags);
1949 if (MLConfigISAInfo->getXLen() == 32) {
1950 NewMultilib.
flag(
"-m32");
1951 NewMultilib.
flag(
"-m64",
true);
1953 NewMultilib.
flag(
"-m32",
true);
1954 NewMultilib.
flag(
"-m64");
1959 if (!MLConfigISAInfo->hasExtension(
"a"))
1960 NewMultilib.
flag(
"-a",
true);
1966 NewMultilibs.emplace_back(NewMultilib);
1974 if (NewRISCVMultilibs.
select(NewFlags, SelectedMultilibs))
1975 for (
const Multilib &NewSelectedM : SelectedMultilibs)
1976 for (
const auto &M : RISCVMultilibSet)
1978 if (M.gccSuffix() == NewSelectedM.gccSuffix())
1985 const llvm::Triple &TargetTriple,
1986 StringRef Path,
const ArgList &Args,
1988 FilterNonExistent NonExistent(Path,
"/crtbegin.o", D.
getVFS());
1989 struct RiscvMultilib {
1995 constexpr RiscvMultilib RISCVMultilibSet[] = {
1996 {
"rv32i",
"ilp32"}, {
"rv32im",
"ilp32"}, {
"rv32iac",
"ilp32"},
1997 {
"rv32imac",
"ilp32"}, {
"rv32imafc",
"ilp32f"}, {
"rv64imac",
"lp64"},
1998 {
"rv64imafdc",
"lp64d"}};
2000 std::vector<MultilibBuilder> Ms;
2001 for (
auto Element : RISCVMultilibSet) {
2005 (Twine(Element.march) +
"/" + Twine(Element.mabi)).str())
2006 .
flag(Twine(
"-march=", Element.march).str())
2007 .
flag(Twine(
"-mabi=", Element.mabi).str()));
2015 return std::vector<std::string>(
2017 "/../../../../riscv64-unknown-elf/lib" + M.
gccSuffix(),
2018 "/../../../../riscv32-unknown-elf/lib" + M.
gccSuffix()});
2022 llvm::StringSet<> Added_ABIs;
2025 for (
auto Element : RISCVMultilibSet) {
2027 Twine(
"-march=", Element.march).str().c_str(), Flags);
2028 if (!Added_ABIs.count(Element.mabi)) {
2029 Added_ABIs.insert(Element.mabi);
2031 Twine(
"-mabi=", Element.mabi).str().c_str(), Flags);
2036 Result.SelectedMultilibs))
2037 Result.Multilibs = RISCVMultilibs;
2041 const llvm::Triple &TargetTriple, StringRef Path,
2043 if (TargetTriple.getOS() == llvm::Triple::UnknownOS)
2046 FilterNonExistent NonExistent(Path,
"/crtbegin.o", D.
getVFS());
2061 .
Either({Ilp32, Ilp32f, Ilp32d, Lp64, Lp64f, Lp64d})
2066 bool IsRV64 = TargetTriple.getArch() == llvm::Triple::riscv64;
2078 if (RISCVMultilibs.
select(Flags, Result.SelectedMultilibs))
2079 Result.Multilibs = RISCVMultilibs;
2083 const llvm::Triple &TargetTriple,
2084 StringRef Path,
const ArgList &Args,
2085 bool NeedsBiarchSuffix,
2096 StringRef Suff64 =
"/64";
2098 if (TargetTriple.isOSSolaris()) {
2099 switch (TargetTriple.getArch()) {
2100 case llvm::Triple::x86:
2101 case llvm::Triple::x86_64:
2104 case llvm::Triple::sparc:
2105 case llvm::Triple::sparcv9:
2106 Suff64 =
"/sparcv9";
2115 .includeSuffix(Suff64)
2118 .flag(
"-mx32",
true)
2122 .includeSuffix(
"/32")
2125 .flag(
"-mx32",
true)
2129 .includeSuffix(
"/x32")
2136 .includeSuffix(
"/sparcv8plus")
2142 FilterNonExistent NonExistent(
2143 Path, TargetTriple.isOSIAMCU() ?
"/libgcc.a" :
"/crtbegin.o", D.
getVFS());
2148 const bool IsX32 = TargetTriple.isX32();
2149 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
2151 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32sparc))
2153 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
2155 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
2157 else if (TargetTriple.isArch64Bit() && !NonExistent(Alt32sparc))
2160 if (TargetTriple.isArch32Bit())
2161 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
2163 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
2165 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
2169 DefaultBuilder.
flag(
"-m32")
2171 .
flag(
"-mx32",
true);
2172 else if (Want == WANT64)
2173 DefaultBuilder.
flag(
"-m32",
true)
2175 .
flag(
"-mx32",
true);
2176 else if (Want == WANTX32)
2177 DefaultBuilder.
flag(
"-m32",
true)
2185 Result.Multilibs.push_back(
Default);
2186 Result.Multilibs.push_back(Alt64);
2187 Result.Multilibs.push_back(Alt32);
2188 Result.Multilibs.push_back(Altx32);
2189 Result.Multilibs.push_back(Alt32sparc);
2191 Result.Multilibs.FilterOut(NonExistent);
2198 if (!Result.Multilibs.select(Flags, Result.SelectedMultilibs))
2201 if (Result.SelectedMultilibs.back() == Alt64 ||
2202 Result.SelectedMultilibs.back() == Alt32 ||
2203 Result.SelectedMultilibs.back() == Altx32 ||
2204 Result.SelectedMultilibs.back() == Alt32sparc)
2205 Result.BiarchSibling =
Default;
2217 StringRef RHSPatchSuffix)
const {
2218 if (Major != RHSMajor)
2219 return Major < RHSMajor;
2220 if (Minor != RHSMinor) {
2227 return Minor < RHSMinor;
2229 if (Patch != RHSPatch) {
2238 return Patch < RHSPatch;
2240 if (PatchSuffix != RHSPatchSuffix) {
2242 if (RHSPatchSuffix.empty())
2244 if (PatchSuffix.empty())
2248 return PatchSuffix < RHSPatchSuffix;
2260 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1,
"",
"",
""};
2261 std::pair<StringRef, StringRef>
First = VersionText.split(
'.');
2262 std::pair<StringRef, StringRef> Second =
First.second.split(
'.');
2264 StringRef MajorStr =
First.first;
2265 StringRef MinorStr = Second.first;
2266 StringRef PatchStr = Second.second;
2268 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1,
"",
"",
""};
2284 auto TryParseLastNumber = [&](StringRef Segment,
int &Number,
2285 std::string &OutStr) ->
bool {
2289 if (
size_t EndNumber = Segment.find_first_not_of(
"0123456789")) {
2290 StringRef NumberStr = Segment.slice(0, EndNumber);
2291 if (NumberStr.getAsInteger(10, Number) || Number < 0)
2294 GoodVersion.
PatchSuffix = Segment.substr(EndNumber);
2299 auto TryParseNumber = [](StringRef Segment,
int &Number) ->
bool {
2300 if (Segment.getAsInteger(10, Number) || Number < 0)
2305 if (MinorStr.empty()) {
2307 if (!TryParseLastNumber(MajorStr, GoodVersion.
Major, GoodVersion.
MajorStr))
2312 if (!TryParseNumber(MajorStr, GoodVersion.
Major))
2316 if (PatchStr.empty()) {
2318 if (!TryParseLastNumber(MinorStr, GoodVersion.
Minor, GoodVersion.
MinorStr))
2323 if (!TryParseNumber(MinorStr, GoodVersion.
Minor))
2328 std::string DummyStr;
2329 TryParseLastNumber(PatchStr, GoodVersion.
Patch, DummyStr);
2334 llvm::StringRef SysRoot) {
2335 const Arg *A = Args.getLastArg(clang::driver::options::OPT_gcc_toolchain);
2337 return A->getValue();
2342 if (!SysRoot.empty())
2345 return GCC_INSTALL_PREFIX;
2358 const llvm::Triple &TargetTriple,
const ArgList &Args) {
2359 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
2360 ? TargetTriple.get64BitArchVariant()
2361 : TargetTriple.get32BitArchVariant();
2368 CandidateTripleAliases.push_back(TargetTriple.str());
2369 std::string TripleNoVendor = TargetTriple.getArchName().str() +
"-" +
2370 TargetTriple.getOSAndEnvironmentName().str();
2371 if (TargetTriple.getVendor() == llvm::Triple::UnknownVendor)
2372 CandidateTripleAliases.push_back(TripleNoVendor);
2374 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
2375 CandidateTripleAliases, CandidateBiarchLibDirs,
2376 CandidateBiarchTripleAliases);
2380 Args.getLastArg(clang::driver::options::OPT_gcc_install_dir_EQ);
2381 A && A->getValue()[0]) {
2382 StringRef InstallDir = A->getValue();
2383 if (!ScanGCCForMultilibs(TargetTriple, Args, InstallDir,
false)) {
2384 D.
Diag(diag::err_drv_invalid_gcc_install_dir) << InstallDir;
2386 (void)InstallDir.consume_back(
"/");
2387 StringRef VersionText = llvm::sys::path::filename(InstallDir);
2388 StringRef TripleText =
2389 llvm::sys::path::filename(llvm::sys::path::parent_path(InstallDir));
2391 Version = GCCVersion::Parse(VersionText);
2392 GCCTriple.setTriple(TripleText);
2393 GCCInstallPath = std::string(InstallDir);
2394 GCCParentLibPath = GCCInstallPath +
"/../../..";
2403 Args.getLastArg(clang::driver::options::OPT_gcc_triple_EQ)) {
2404 StringRef GCCTriple = A->getValue();
2405 CandidateTripleAliases.clear();
2406 CandidateTripleAliases.push_back(GCCTriple);
2412 if (GCCToolchainDir !=
"") {
2413 if (GCCToolchainDir.back() ==
'/')
2414 GCCToolchainDir = GCCToolchainDir.drop_back();
2416 Prefixes.push_back(std::string(GCCToolchainDir));
2420 Prefixes.push_back(D.
SysRoot);
2421 AddDefaultGCCPrefixes(TargetTriple, Prefixes, D.
SysRoot);
2425 Prefixes.push_back(D.
Dir +
"/..");
2431 AddDefaultGCCPrefixes(TargetTriple, Prefixes, D.
SysRoot);
2443 GentooTestTriples.push_back(TargetTriple.str());
2444 GentooTestTriples.append(CandidateTripleAliases.begin(),
2445 CandidateTripleAliases.end());
2446 if (ScanGentooConfigs(TargetTriple, Args, GentooTestTriples,
2447 CandidateBiarchTripleAliases))
2453 const GCCVersion VersionZero = GCCVersion::Parse(
"0.0.0");
2454 Version = VersionZero;
2455 for (
const std::string &Prefix : Prefixes) {
2457 if (!VFS.exists(Prefix))
2459 for (StringRef Suffix : CandidateLibDirs) {
2460 const std::string LibDir = concat(Prefix, Suffix);
2461 if (!VFS.exists(LibDir))
2464 bool GCCDirExists = VFS.exists(LibDir +
"/gcc");
2465 bool GCCCrossDirExists = VFS.exists(LibDir +
"/gcc-cross");
2466 for (StringRef Candidate : CandidateTripleAliases)
2467 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
false,
2468 GCCDirExists, GCCCrossDirExists);
2470 for (StringRef Suffix : CandidateBiarchLibDirs) {
2471 const std::string LibDir = Prefix + Suffix.str();
2472 if (!VFS.exists(LibDir))
2474 bool GCCDirExists = VFS.exists(LibDir +
"/gcc");
2475 bool GCCCrossDirExists = VFS.exists(LibDir +
"/gcc-cross");
2476 for (StringRef Candidate : CandidateBiarchTripleAliases)
2477 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
true,
2478 GCCDirExists, GCCCrossDirExists);
2482 if (Version > VersionZero)
2488 for (
const auto &InstallPath : CandidateGCCInstallPaths)
2489 OS <<
"Found candidate GCC installation: " << InstallPath <<
"\n";
2491 if (!GCCInstallPath.empty())
2492 OS <<
"Selected GCC installation: " << GCCInstallPath <<
"\n";
2494 for (
const auto &
Multilib : Multilibs)
2495 OS <<
"Candidate multilib: " <<
Multilib <<
"\n";
2497 if (Multilibs.size() != 0 || !SelectedMultilib.
isDefault())
2498 OS <<
"Selected multilib: " << SelectedMultilib <<
"\n";
2502 if (BiarchSibling) {
2509 void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
2511 StringRef SysRoot) {
2513 if (TargetTriple.isOSHaiku()) {
2514 Prefixes.push_back(concat(SysRoot,
"/boot/system/develop/tools"));
2518 if (TargetTriple.isOSSolaris()) {
2526 std::string PrefixDir = concat(SysRoot,
"/usr/gcc");
2528 for (llvm::vfs::directory_iterator LI = D.
getVFS().dir_begin(PrefixDir, EC),
2530 !EC && LI !=
LE; LI = LI.increment(EC)) {
2531 StringRef VersionText = llvm::sys::path::filename(LI->path());
2532 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2535 if (CandidateVersion.Major == -1 || CandidateVersion.isOlderThan(4, 1, 1))
2538 std::string CandidatePrefix = PrefixDir +
"/" + VersionText.str();
2539 std::string CandidateLibPath = CandidatePrefix +
"/lib/gcc";
2540 if (!D.
getVFS().exists(CandidateLibPath))
2543 SolarisPrefixes.emplace_back(
2544 std::make_pair(CandidateVersion, CandidatePrefix));
2547 std::sort(SolarisPrefixes.rbegin(), SolarisPrefixes.rend());
2548 for (
auto p : SolarisPrefixes)
2549 Prefixes.emplace_back(p.second);
2555 if (SysRoot.empty() && TargetTriple.getOS() == llvm::Triple::Linux &&
2556 D.
getVFS().exists(
"/opt/rh")) {
2559 Prefixes.push_back(
"/opt/rh/gcc-toolset-12/root/usr");
2560 Prefixes.push_back(
"/opt/rh/gcc-toolset-11/root/usr");
2561 Prefixes.push_back(
"/opt/rh/gcc-toolset-10/root/usr");
2562 Prefixes.push_back(
"/opt/rh/devtoolset-12/root/usr");
2563 Prefixes.push_back(
"/opt/rh/devtoolset-11/root/usr");
2564 Prefixes.push_back(
"/opt/rh/devtoolset-10/root/usr");
2565 Prefixes.push_back(
"/opt/rh/devtoolset-9/root/usr");
2566 Prefixes.push_back(
"/opt/rh/devtoolset-8/root/usr");
2567 Prefixes.push_back(
"/opt/rh/devtoolset-7/root/usr");
2568 Prefixes.push_back(
"/opt/rh/devtoolset-6/root/usr");
2569 Prefixes.push_back(
"/opt/rh/devtoolset-4/root/usr");
2570 Prefixes.push_back(
"/opt/rh/devtoolset-3/root/usr");
2571 Prefixes.push_back(
"/opt/rh/devtoolset-2/root/usr");
2575 Prefixes.push_back(concat(SysRoot,
"/usr"));
2578 void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
2579 const llvm::Triple &TargetTriple,
const llvm::Triple &BiarchTriple,
2593 static const char *
const AArch64LibDirs[] = {
"/lib64",
"/lib"};
2594 static const char *
const AArch64Triples[] = {
2595 "aarch64-none-linux-gnu",
"aarch64-linux-gnu",
"aarch64-redhat-linux",
2596 "aarch64-suse-linux"};
2597 static const char *
const AArch64beLibDirs[] = {
"/lib"};
2598 static const char *
const AArch64beTriples[] = {
"aarch64_be-none-linux-gnu",
2599 "aarch64_be-linux-gnu"};
2601 static const char *
const ARMLibDirs[] = {
"/lib"};
2602 static const char *
const ARMTriples[] = {
"arm-linux-gnueabi"};
2603 static const char *
const ARMHFTriples[] = {
"arm-linux-gnueabihf",
2604 "armv7hl-redhat-linux-gnueabi",
2605 "armv6hl-suse-linux-gnueabi",
2606 "armv7hl-suse-linux-gnueabi"};
2607 static const char *
const ARMebLibDirs[] = {
"/lib"};
2608 static const char *
const ARMebTriples[] = {
"armeb-linux-gnueabi"};
2609 static const char *
const ARMebHFTriples[] = {
2610 "armeb-linux-gnueabihf",
"armebv7hl-redhat-linux-gnueabi"};
2612 static const char *
const AVRLibDirs[] = {
"/lib"};
2613 static const char *
const AVRTriples[] = {
"avr"};
2615 static const char *
const CSKYLibDirs[] = {
"/lib"};
2616 static const char *
const CSKYTriples[] = {
2617 "csky-linux-gnuabiv2",
"csky-linux-uclibcabiv2",
"csky-elf-noneabiv2"};
2619 static const char *
const X86_64LibDirs[] = {
"/lib64",
"/lib"};
2620 static const char *
const X86_64Triples[] = {
2621 "x86_64-linux-gnu",
"x86_64-unknown-linux-gnu",
2622 "x86_64-pc-linux-gnu",
"x86_64-redhat-linux6E",
2623 "x86_64-redhat-linux",
"x86_64-suse-linux",
2624 "x86_64-manbo-linux-gnu",
"x86_64-linux-gnu",
2625 "x86_64-slackware-linux",
"x86_64-unknown-linux",
2626 "x86_64-amazon-linux"};
2627 static const char *
const X32Triples[] = {
"x86_64-linux-gnux32",
2628 "x86_64-pc-linux-gnux32"};
2629 static const char *
const X32LibDirs[] = {
"/libx32",
"/lib"};
2630 static const char *
const X86LibDirs[] = {
"/lib32",
"/lib"};
2631 static const char *
const X86Triples[] = {
2632 "i586-linux-gnu",
"i686-linux-gnu",
"i686-pc-linux-gnu",
2633 "i386-redhat-linux6E",
"i686-redhat-linux",
"i386-redhat-linux",
2634 "i586-suse-linux",
"i686-montavista-linux",
2637 static const char *
const LoongArch64LibDirs[] = {
"/lib64",
"/lib"};
2638 static const char *
const LoongArch64Triples[] = {
2639 "loongarch64-linux-gnu",
"loongarch64-unknown-linux-gnu"};
2641 static const char *
const M68kLibDirs[] = {
"/lib"};
2642 static const char *
const M68kTriples[] = {
2643 "m68k-linux-gnu",
"m68k-unknown-linux-gnu",
"m68k-suse-linux"};
2645 static const char *
const MIPSLibDirs[] = {
"/libo32",
"/lib"};
2646 static const char *
const MIPSTriples[] = {
2647 "mips-linux-gnu",
"mips-mti-linux",
"mips-mti-linux-gnu",
2648 "mips-img-linux-gnu",
"mipsisa32r6-linux-gnu"};
2649 static const char *
const MIPSELLibDirs[] = {
"/libo32",
"/lib"};
2650 static const char *
const MIPSELTriples[] = {
2651 "mipsel-linux-gnu",
"mips-img-linux-gnu",
"mipsisa32r6el-linux-gnu"};
2653 static const char *
const MIPS64LibDirs[] = {
"/lib64",
"/lib"};
2654 static const char *
const MIPS64Triples[] = {
2655 "mips64-linux-gnu",
"mips-mti-linux-gnu",
2656 "mips-img-linux-gnu",
"mips64-linux-gnuabi64",
2657 "mipsisa64r6-linux-gnu",
"mipsisa64r6-linux-gnuabi64"};
2658 static const char *
const MIPS64ELLibDirs[] = {
"/lib64",
"/lib"};
2659 static const char *
const MIPS64ELTriples[] = {
2660 "mips64el-linux-gnu",
"mips-mti-linux-gnu",
2661 "mips-img-linux-gnu",
"mips64el-linux-gnuabi64",
2662 "mipsisa64r6el-linux-gnu",
"mipsisa64r6el-linux-gnuabi64"};
2664 static const char *
const MIPSN32LibDirs[] = {
"/lib32"};
2665 static const char *
const MIPSN32Triples[] = {
"mips64-linux-gnuabin32",
2666 "mipsisa64r6-linux-gnuabin32"};
2667 static const char *
const MIPSN32ELLibDirs[] = {
"/lib32"};
2668 static const char *
const MIPSN32ELTriples[] = {
2669 "mips64el-linux-gnuabin32",
"mipsisa64r6el-linux-gnuabin32"};
2671 static const char *
const MSP430LibDirs[] = {
"/lib"};
2672 static const char *
const MSP430Triples[] = {
"msp430-elf"};
2674 static const char *
const PPCLibDirs[] = {
"/lib32",
"/lib"};
2675 static const char *
const PPCTriples[] = {
2676 "powerpc-linux-gnu",
"powerpc-unknown-linux-gnu",
"powerpc-linux-gnuspe",
2679 "powerpc64-suse-linux",
"powerpc-montavista-linuxspe"};
2680 static const char *
const PPCLELibDirs[] = {
"/lib32",
"/lib"};
2681 static const char *
const PPCLETriples[] = {
"powerpcle-linux-gnu",
2682 "powerpcle-unknown-linux-gnu",
2683 "powerpcle-linux-musl"};
2685 static const char *
const PPC64LibDirs[] = {
"/lib64",
"/lib"};
2686 static const char *
const PPC64Triples[] = {
2687 "powerpc64-linux-gnu",
"powerpc64-unknown-linux-gnu",
2688 "powerpc64-suse-linux",
"ppc64-redhat-linux"};
2689 static const char *
const PPC64LELibDirs[] = {
"/lib64",
"/lib"};
2690 static const char *
const PPC64LETriples[] = {
2691 "powerpc64le-linux-gnu",
"powerpc64le-unknown-linux-gnu",
2692 "powerpc64le-none-linux-gnu",
"powerpc64le-suse-linux",
2693 "ppc64le-redhat-linux"};
2695 static const char *
const RISCV32LibDirs[] = {
"/lib32",
"/lib"};
2696 static const char *
const RISCV32Triples[] = {
"riscv32-unknown-linux-gnu",
2697 "riscv32-linux-gnu",
2698 "riscv32-unknown-elf"};
2699 static const char *
const RISCV64LibDirs[] = {
"/lib64",
"/lib"};
2700 static const char *
const RISCV64Triples[] = {
"riscv64-unknown-linux-gnu",
2701 "riscv64-linux-gnu",
2702 "riscv64-unknown-elf"};
2704 static const char *
const SPARCv8LibDirs[] = {
"/lib32",
"/lib"};
2705 static const char *
const SPARCv8Triples[] = {
"sparc-linux-gnu",
2706 "sparcv8-linux-gnu"};
2707 static const char *
const SPARCv9LibDirs[] = {
"/lib64",
"/lib"};
2708 static const char *
const SPARCv9Triples[] = {
"sparc64-linux-gnu",
2709 "sparcv9-linux-gnu"};
2711 static const char *
const SystemZLibDirs[] = {
"/lib64",
"/lib"};
2712 static const char *
const SystemZTriples[] = {
2713 "s390x-linux-gnu",
"s390x-unknown-linux-gnu",
"s390x-ibm-linux-gnu",
2714 "s390x-suse-linux",
"s390x-redhat-linux"};
2720 if (TargetTriple.isOSSolaris()) {
2721 static const char *
const SolarisLibDirs[] = {
"/lib"};
2722 static const char *
const SolarisSparcV8Triples[] = {
2723 "sparc-sun-solaris2.11"};
2724 static const char *
const SolarisSparcV9Triples[] = {
2725 "sparcv9-sun-solaris2.11"};
2726 static const char *
const SolarisX86Triples[] = {
"i386-pc-solaris2.11"};
2727 static const char *
const SolarisX86_64Triples[] = {
"x86_64-pc-solaris2.11"};
2728 LibDirs.append(begin(SolarisLibDirs), end(SolarisLibDirs));
2729 BiarchLibDirs.append(begin(SolarisLibDirs), end(SolarisLibDirs));
2730 switch (TargetTriple.getArch()) {
2731 case llvm::Triple::x86:
2732 TripleAliases.append(begin(SolarisX86Triples), end(SolarisX86Triples));
2733 BiarchTripleAliases.append(begin(SolarisX86_64Triples),
2734 end(SolarisX86_64Triples));
2736 case llvm::Triple::x86_64:
2737 TripleAliases.append(begin(SolarisX86_64Triples),
2738 end(SolarisX86_64Triples));
2739 BiarchTripleAliases.append(begin(SolarisX86Triples),
2740 end(SolarisX86Triples));
2742 case llvm::Triple::sparc:
2743 TripleAliases.append(begin(SolarisSparcV8Triples),
2744 end(SolarisSparcV8Triples));
2745 BiarchTripleAliases.append(begin(SolarisSparcV9Triples),
2746 end(SolarisSparcV9Triples));
2748 case llvm::Triple::sparcv9:
2749 TripleAliases.append(begin(SolarisSparcV9Triples),
2750 end(SolarisSparcV9Triples));
2751 BiarchTripleAliases.append(begin(SolarisSparcV8Triples),
2752 end(SolarisSparcV8Triples));
2761 if (TargetTriple.isAndroid()) {
2762 static const char *
const AArch64AndroidTriples[] = {
2763 "aarch64-linux-android"};
2764 static const char *
const ARMAndroidTriples[] = {
"arm-linux-androideabi"};
2765 static const char *
const X86AndroidTriples[] = {
"i686-linux-android"};
2766 static const char *
const X86_64AndroidTriples[] = {
"x86_64-linux-android"};
2768 switch (TargetTriple.getArch()) {
2769 case llvm::Triple::aarch64:
2770 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
2771 TripleAliases.append(begin(AArch64AndroidTriples),
2772 end(AArch64AndroidTriples));
2774 case llvm::Triple::arm:
2775 case llvm::Triple::thumb:
2776 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
2777 TripleAliases.append(begin(ARMAndroidTriples), end(ARMAndroidTriples));
2779 case llvm::Triple::x86_64:
2780 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
2781 TripleAliases.append(begin(X86_64AndroidTriples),
2782 end(X86_64AndroidTriples));
2783 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
2784 BiarchTripleAliases.append(begin(X86AndroidTriples),
2785 end(X86AndroidTriples));
2787 case llvm::Triple::x86:
2788 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
2789 TripleAliases.append(begin(X86AndroidTriples), end(X86AndroidTriples));
2790 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
2791 BiarchTripleAliases.append(begin(X86_64AndroidTriples),
2792 end(X86_64AndroidTriples));
2801 if (TargetTriple.isOSHurd()) {
2802 switch (TargetTriple.getArch()) {
2803 case llvm::Triple::x86_64:
2804 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
2805 TripleAliases.push_back(
"x86_64-gnu");
2807 case llvm::Triple::x86:
2808 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
2809 TripleAliases.push_back(
"i686-gnu");
2818 switch (TargetTriple.getArch()) {
2819 case llvm::Triple::aarch64:
2820 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
2821 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
2822 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
2823 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
2825 case llvm::Triple::aarch64_be:
2826 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
2827 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
2828 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
2829 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
2831 case llvm::Triple::arm:
2832 case llvm::Triple::thumb:
2833 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
2834 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF ||
2835 TargetTriple.getEnvironment() == llvm::Triple::MuslEABIHF ||
2836 TargetTriple.getEnvironment() == llvm::Triple::EABIHF) {
2837 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
2839 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
2842 case llvm::Triple::armeb:
2843 case llvm::Triple::thumbeb:
2844 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
2845 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF ||
2846 TargetTriple.getEnvironment() == llvm::Triple::MuslEABIHF ||
2847 TargetTriple.getEnvironment() == llvm::Triple::EABIHF) {
2848 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
2850 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
2853 case llvm::Triple::avr:
2854 LibDirs.append(begin(AVRLibDirs), end(AVRLibDirs));
2855 TripleAliases.append(begin(AVRTriples), end(AVRTriples));
2857 case llvm::Triple::csky:
2858 LibDirs.append(begin(CSKYLibDirs), end(CSKYLibDirs));
2859 TripleAliases.append(begin(CSKYTriples), end(CSKYTriples));
2861 case llvm::Triple::x86_64:
2862 if (TargetTriple.isX32()) {
2863 LibDirs.append(begin(X32LibDirs), end(X32LibDirs));
2864 TripleAliases.append(begin(X32Triples), end(X32Triples));
2865 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
2866 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
2868 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
2869 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
2870 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
2871 BiarchTripleAliases.append(begin(X32Triples), end(X32Triples));
2873 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
2874 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
2876 case llvm::Triple::x86:
2877 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
2880 if (!TargetTriple.isOSIAMCU()) {
2881 TripleAliases.append(begin(X86Triples), end(X86Triples));
2882 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
2883 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
2884 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
2885 BiarchTripleAliases.append(begin(X32Triples), end(X32Triples));
2889 case llvm::Triple::loongarch64:
2890 LibDirs.append(begin(LoongArch64LibDirs), end(LoongArch64LibDirs));
2891 TripleAliases.append(begin(LoongArch64Triples), end(LoongArch64Triples));
2893 case llvm::Triple::m68k:
2894 LibDirs.append(begin(M68kLibDirs), end(M68kLibDirs));
2895 TripleAliases.append(begin(M68kTriples), end(M68kTriples));
2897 case llvm::Triple::mips:
2898 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
2899 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
2900 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
2901 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
2902 BiarchLibDirs.append(begin(MIPSN32LibDirs), end(MIPSN32LibDirs));
2903 BiarchTripleAliases.append(begin(MIPSN32Triples), end(MIPSN32Triples));
2905 case llvm::Triple::mipsel:
2906 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
2907 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
2908 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
2909 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
2910 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
2911 BiarchLibDirs.append(begin(MIPSN32ELLibDirs), end(MIPSN32ELLibDirs));
2912 BiarchTripleAliases.append(begin(MIPSN32ELTriples), end(MIPSN32ELTriples));
2914 case llvm::Triple::mips64:
2915 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
2916 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
2917 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
2918 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
2919 BiarchLibDirs.append(begin(MIPSN32LibDirs), end(MIPSN32LibDirs));
2920 BiarchTripleAliases.append(begin(MIPSN32Triples), end(MIPSN32Triples));
2922 case llvm::Triple::mips64el:
2923 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
2924 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
2925 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
2926 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
2927 BiarchLibDirs.append(begin(MIPSN32ELLibDirs), end(MIPSN32ELLibDirs));
2928 BiarchTripleAliases.append(begin(MIPSN32ELTriples), end(MIPSN32ELTriples));
2929 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
2931 case llvm::Triple::msp430:
2932 LibDirs.append(begin(MSP430LibDirs), end(MSP430LibDirs));
2933 TripleAliases.append(begin(MSP430Triples), end(MSP430Triples));
2935 case llvm::Triple::ppc:
2936 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
2937 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
2938 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
2939 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
2941 case llvm::Triple::ppcle:
2942 LibDirs.append(begin(PPCLELibDirs), end(PPCLELibDirs));
2943 TripleAliases.append(begin(PPCLETriples), end(PPCLETriples));
2944 BiarchLibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
2945 BiarchTripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
2947 case llvm::Triple::ppc64:
2948 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
2949 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
2950 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
2951 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
2953 case llvm::Triple::ppc64le:
2954 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
2955 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
2956 BiarchLibDirs.append(begin(PPCLELibDirs), end(PPCLELibDirs));
2957 BiarchTripleAliases.append(begin(PPCLETriples), end(PPCLETriples));
2959 case llvm::Triple::riscv32:
2960 LibDirs.append(begin(RISCV32LibDirs), end(RISCV32LibDirs));
2961 TripleAliases.append(begin(RISCV32Triples), end(RISCV32Triples));
2962 BiarchLibDirs.append(begin(RISCV64LibDirs), end(RISCV64LibDirs));
2963 BiarchTripleAliases.append(begin(RISCV64Triples), end(RISCV64Triples));
2965 case llvm::Triple::riscv64:
2966 LibDirs.append(begin(RISCV64LibDirs), end(RISCV64LibDirs));
2967 TripleAliases.append(begin(RISCV64Triples), end(RISCV64Triples));
2968 BiarchLibDirs.append(begin(RISCV32LibDirs), end(RISCV32LibDirs));
2969 BiarchTripleAliases.append(begin(RISCV32Triples), end(RISCV32Triples));
2971 case llvm::Triple::sparc:
2972 case llvm::Triple::sparcel:
2973 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
2974 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
2975 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
2976 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
2978 case llvm::Triple::sparcv9:
2979 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
2980 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
2981 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
2982 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
2984 case llvm::Triple::systemz:
2985 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
2986 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
2995 if (TargetTriple.str() != BiarchTriple.str())
2996 BiarchTripleAliases.push_back(BiarchTriple.str());
2999 bool Generic_GCC::GCCInstallationDetector::ScanGCCForMultilibs(
3000 const llvm::Triple &TargetTriple,
const ArgList &Args,
3001 StringRef Path,
bool NeedsBiarchSuffix) {
3002 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
3011 }
else if (TargetTriple.isCSKY()) {
3013 }
else if (TargetTriple.isMIPS()) {
3016 }
else if (TargetTriple.isRISCV()) {
3020 }
else if (TargetArch == llvm::Triple::avr) {
3023 NeedsBiarchSuffix, Detected)) {
3030 : Detected.SelectedMultilibs.back();
3036 void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
3037 const llvm::Triple &TargetTriple,
const ArgList &Args,
3038 const std::string &LibDir, StringRef CandidateTriple,
3039 bool NeedsBiarchSuffix,
bool GCCDirExists,
bool GCCCrossDirExists) {
3042 struct GCCLibSuffix {
3044 std::string LibSuffix;
3047 StringRef ReversePath;
3052 {
"gcc/" + CandidateTriple.str(),
"../..", GCCDirExists},
3055 {
"gcc-cross/" + CandidateTriple.str(),
"../..", GCCCrossDirExists},
3061 {CandidateTriple.str(),
"..",
3062 TargetTriple.getVendor() == llvm::Triple::Freescale ||
3063 TargetTriple.getVendor() == llvm::Triple::OpenEmbedded}};
3069 StringRef LibSuffix = Suffix.LibSuffix;
3071 for (llvm::vfs::directory_iterator
3072 LI = D.
getVFS().dir_begin(LibDir +
"/" + LibSuffix, EC),
3074 !EC && LI !=
LE; LI = LI.increment(EC)) {
3075 StringRef VersionText = llvm::sys::path::filename(LI->path());
3076 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
3077 if (CandidateVersion.Major != -1)
3078 if (!CandidateGCCInstallPaths.insert(std::string(LI->path())).second)
3080 if (CandidateVersion.isOlderThan(4, 1, 1))
3082 if (CandidateVersion <= Version)
3085 if (!ScanGCCForMultilibs(TargetTriple, Args, LI->path(),
3089 Version = CandidateVersion;
3090 GCCTriple.setTriple(CandidateTriple);
3094 GCCInstallPath = (LibDir +
"/" + LibSuffix +
"/" + VersionText).str();
3095 GCCParentLibPath = (GCCInstallPath +
"/../" + Suffix.ReversePath).str();
3101 bool Generic_GCC::GCCInstallationDetector::ScanGentooConfigs(
3102 const llvm::Triple &TargetTriple,
const ArgList &Args,
3108 for (StringRef CandidateTriple : CandidateTriples) {
3109 if (ScanGentooGccConfig(TargetTriple, Args, CandidateTriple))
3113 for (StringRef CandidateTriple : CandidateBiarchTriples) {
3114 if (ScanGentooGccConfig(TargetTriple, Args, CandidateTriple,
true))
3120 bool Generic_GCC::GCCInstallationDetector::ScanGentooGccConfig(
3121 const llvm::Triple &TargetTriple,
const ArgList &Args,
3122 StringRef CandidateTriple,
bool NeedsBiarchSuffix) {
3123 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
File =
3124 D.
getVFS().getBufferForFile(concat(D.
SysRoot, GentooConfigDir,
3125 "/config-" + CandidateTriple.str()));
3128 File.get()->getBuffer().split(Lines,
"\n");
3129 for (StringRef Line : Lines) {
3132 if (!Line.consume_front(
"CURRENT="))
3135 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> ConfigFile =
3136 D.
getVFS().getBufferForFile(
3137 concat(D.
SysRoot, GentooConfigDir,
"/" + Line));
3138 std::pair<StringRef, StringRef> ActiveVersion = Line.rsplit(
'-');
3151 ConfigFile.get()->getBuffer().split(ConfigLines,
"\n");
3152 for (StringRef ConfLine : ConfigLines) {
3153 ConfLine = ConfLine.trim();
3154 if (ConfLine.consume_front(
"LDPATH=")) {
3156 ConfLine.consume_back(
"\"");
3157 ConfLine.consume_front(
"\"");
3159 ConfLine.split(GentooScanPaths,
':', -1,
false);
3164 std::string basePath =
"/usr/lib/gcc/" + ActiveVersion.first.str() +
"/"
3165 + ActiveVersion.second.str();
3166 GentooScanPaths.push_back(StringRef(basePath));
3169 for (
const auto &GentooScanPath : GentooScanPaths) {
3170 std::string GentooPath = concat(D.
SysRoot, GentooScanPath);
3171 if (D.
getVFS().exists(GentooPath +
"/crtbegin.o")) {
3172 if (!ScanGCCForMultilibs(TargetTriple, Args, GentooPath,
3176 Version = GCCVersion::Parse(ActiveVersion.second);
3177 GCCInstallPath = GentooPath;
3178 GCCParentLibPath = GentooPath + std::string(
"/../../..");
3179 GCCTriple.setTriple(ActiveVersion.first);
3191 const ArgList &Args)
3192 :
ToolChain(D, Triple, Args), GCCInstallation(D),
3193 CudaInstallation(D, Triple, Args), RocmInstallation(D, Triple, Args) {
3204 return Preprocess.get();
3208 return Compile.get();
3230 case llvm::Triple::aarch64:
3231 case llvm::Triple::aarch64_be:
3232 case llvm::Triple::ppc:
3233 case llvm::Triple::ppcle:
3234 case llvm::Triple::ppc64:
3235 case llvm::Triple::ppc64le:
3236 case llvm::Triple::riscv32:
3237 case llvm::Triple::riscv64:
3238 case llvm::Triple::x86:
3239 case llvm::Triple::x86_64:
3248 case llvm::Triple::x86_64:
3250 case llvm::Triple::mips64:
3251 case llvm::Triple::mips64el:
3268 case llvm::Triple::nvptx:
3269 case llvm::Triple::nvptx64:
3270 case llvm::Triple::xcore:
3293 const std::string &SysRoot,
3294 const std::string &OSLibDir,
3295 const std::string &MultiarchTriple,
3301 const std::string &LibPath =
3340 LibPath +
"/../" + GCCTriple.str() +
"/lib/../" + OSLibDir +
3353 if (StringRef(LibPath).starts_with(SysRoot))
3359 const std::string &SysRoot,
3360 const std::string &OSLibDir,
3363 const std::string &LibPath =
3374 ArgStringList &CC1Args)
const {
3382 Twine(LibPath) +
"/../" + GCCTriple.str() +
"/include");
3393 ArgStringList &CC1Args)
const {
3394 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdincxx,
3395 options::OPT_nostdlibinc))
3411 llvm::opt::ArgStringList &CC1Args)
const {
3414 if (SysRoot.empty())
3415 SysRoot = llvm::sys::path::get_separator();
3417 auto AddIncludePath = [&](StringRef Path,
bool TargetDirRequired =
false) {
3419 if (Version.empty())
3423 bool TargetDirExists =
false;
3425 if (TargetIncludeDir) {
3427 llvm::sys::path::append(TargetDir,
"c++", Version);
3428 if (D.
getVFS().exists(TargetDir)) {
3430 TargetDirExists =
true;
3433 if (TargetDirRequired && !TargetDirExists)
3438 llvm::sys::path::append(GenericDir,
"c++", Version);
3447 llvm::sys::path::append(DriverIncludeDir,
"..",
"include");
3448 if (AddIncludePath(DriverIncludeDir,
3455 llvm::sys::path::append(UsrLocalIncludeDir,
"usr",
"local",
"include");
3456 if (AddIncludePath(UsrLocalIncludeDir))
3459 llvm::sys::path::append(UsrIncludeDir,
"usr",
"include");
3460 if (AddIncludePath(UsrIncludeDir))
3465 Twine IncludeSuffix,
3466 const llvm::opt::ArgList &DriverArgs,
3467 llvm::opt::ArgStringList &CC1Args,
3468 bool DetectDebian)
const {
3469 if (!
getVFS().exists(IncludeDir))
3475 std::string Dir = IncludeDir.str();
3477 llvm::sys::path::parent_path(llvm::sys::path::parent_path(Dir));
3479 (Include +
"/" + Triple + Dir.substr(Include.size()) + IncludeSuffix)
3481 if (DetectDebian && !
getVFS().exists(Path))
3490 else if (!Triple.empty())
3492 IncludeDir +
"/" + Triple + IncludeSuffix);
3499 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3500 StringRef DebianMultiarch)
const {
3514 LibDir.str() +
"/../" + TripleStr +
"/include/c++/" + Version.
Text,
3522 Version.
Text +
"/include/c++/",
3530 DriverArgs, CC1Args,
true))
3541 const std::string LibStdCXXIncludePathCandidates[] = {
3544 InstallDir.str() +
"/include/g++-v" + Version.
Text,
3545 InstallDir.str() +
"/include/g++-v" + Version.
MajorStr +
"." +
3547 InstallDir.str() +
"/include/g++-v" + Version.
MajorStr,
3550 for (
const auto &IncludePath : LibStdCXXIncludePathCandidates) {
3560 llvm::opt::ArgStringList &CC1Args)
const {
3567 llvm::opt::DerivedArgList *
3576 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
3581 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_shared));
3582 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_fPIC));
3586 for (
auto *A : Args) {
3591 case options::OPT_shared:
3592 case options::OPT_dynamic:
3593 case options::OPT_static:
3594 case options::OPT_fPIC:
3595 case options::OPT_fno_PIC:
3596 case options::OPT_fpic:
3597 case options::OPT_fno_pic:
3598 case options::OPT_fPIE:
3599 case options::OPT_fno_PIE:
3600 case options::OPT_fpie:
3601 case options::OPT_fno_pie:
3610 void Generic_ELF::anchor() {}
3613 ArgStringList &CC1Args,
3615 if (!DriverArgs.hasFlag(options::OPT_fuse_init_array,
3616 options::OPT_fno_use_init_array,
true))
3617 CC1Args.push_back(
"-fno-use-init-array");
static constexpr CPUSuffix Suffixes[]
static void findCSKYMultilibs(const Driver &D, const llvm::Triple &TargetTriple, StringRef Path, const ArgList &Args, DetectedMultilibs &Result)
static void findAndroidArmMultilibs(const Driver &D, const llvm::Triple &TargetTriple, StringRef Path, const ArgList &Args, DetectedMultilibs &Result)
static void findRISCVMultilibs(const Driver &D, const llvm::Triple &TargetTriple, StringRef Path, const ArgList &Args, DetectedMultilibs &Result)
static bool isArmOrThumbArch(llvm::Triple::ArchType Arch)
static void normalizeCPUNamesForAssembler(const ArgList &Args, ArgStringList &CmdArgs)
static bool findBiarchMultilibs(const Driver &D, const llvm::Triple &TargetTriple, StringRef Path, const ArgList &Args, bool NeedsBiarchSuffix, DetectedMultilibs &Result)
static bool isMips16(const ArgList &Args)
static llvm::StringRef getGCCToolchainDir(const ArgList &Args, llvm::StringRef SysRoot)
static bool findMSP430Multilibs(const Driver &D, const llvm::Triple &TargetTriple, StringRef Path, const ArgList &Args, DetectedMultilibs &Result)
static bool getStatic(const ArgList &Args)
static bool selectRISCVMultilib(const MultilibSet &RISCVMultilibSet, StringRef Arch, const Multilib::flags_list &Flags, llvm::SmallVectorImpl< Multilib > &SelectedMultilibs)
Extend the multi-lib re-use selection mechanism for RISC-V.
static bool findMipsCsMultilibs(const Multilib::flags_list &Flags, FilterNonExistent &NonExistent, DetectedMultilibs &Result)
static bool findMipsMtiMultilibs(const Multilib::flags_list &Flags, FilterNonExistent &NonExistent, DetectedMultilibs &Result)
static bool isMipsEL(llvm::Triple::ArchType Arch)
static bool findMipsMuslMultilibs(const Multilib::flags_list &Flags, FilterNonExistent &NonExistent, DetectedMultilibs &Result)
static void findRISCVBareMetalMultilibs(const Driver &D, const llvm::Triple &TargetTriple, StringRef Path, const ArgList &Args, DetectedMultilibs &Result)
static bool findMipsAndroidMultilibs(llvm::vfs::FileSystem &VFS, StringRef Path, const Multilib::flags_list &Flags, FilterNonExistent &NonExistent, DetectedMultilibs &Result)
static bool isMSP430(llvm::Triple::ArchType Arch)
static bool isSoftFloatABI(const ArgList &Args)
static bool findMipsImgMultilibs(const Multilib::flags_list &Flags, FilterNonExistent &NonExistent, DetectedMultilibs &Result)
static const char * getLDMOption(const llvm::Triple &T, const ArgList &Args)
static bool getStaticPIE(const ArgList &Args, const ToolChain &TC)
static bool forwardToGCC(const Option &O)
static bool isMicroMips(const ArgList &Args)
types::ID getType() const
bool isHostOffloading(unsigned int OKind) const
Check if this action have any offload kinds.
bool isDeviceOffloading(OffloadKind OKind) const
bool isOffloading(OffloadKind OKind) const
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::string SysRoot
sysroot, if present
const std::string & getCCCGenericGCCName() const
Name to use when invoking gcc/g++.
llvm::vfs::FileSystem & getVFS() const
std::string DyldPrefix
Dynamic loader prefix, if present.
DiagnosticBuilder Diag(unsigned DiagID) const
LTOKind getLTOMode(bool IsOffload=false) const
Get the specific kind of LTO being performed.
const llvm::opt::OptTable & getOpts() const
bool isUsingLTO(bool IsOffload=false) const
Returns true if we are performing any kind of LTO.
std::string Dir
The path the driver executable was in, as invoked from the command line.
bool IsFlangMode() const
Whether the driver should invoke flang for fortran inputs.
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
This corresponds to a single GCC multilib, or a segment of one controlled by a command line flag.
MultilibBuilder & flag(StringRef Flag, bool Disallow=false)
Add a flag to the flags list Flag must be a flag accepted by the driver.
const std::string & osSuffix() const
Get the detected os path suffix for the multi-arch target variant.
Multilib makeMultilib() const
const std::string & gccSuffix() const
Get the detected GCC installation path suffix for the multi-arch target variant.
This class can be used to create a MultilibSet, and contains helper functions to add combinations of ...
MultilibSetBuilder & Maybe(const MultilibBuilder &M)
Add an optional Multilib segment.
MultilibSetBuilder & FilterOut(const char *Regex)
Filter out those Multilibs whose gccSuffix matches the given expression.
MultilibSetBuilder & Either(const MultilibBuilder &M1, const MultilibBuilder &M2)
Add a set of mutually incompatible Multilib segments.
MultilibSet makeMultilibSet() const
See also MultilibSetBuilder for combining multilibs into a set.
const IncludeDirsFunc & includeDirsCallback() const
MultilibSet & FilterOut(FilterCallback F)
Filter out some subset of the Multilibs using a user defined callback.
bool select(const Multilib::flags_list &Flags, llvm::SmallVectorImpl< Multilib > &) const
Select compatible variants,.
const IncludeDirsFunc & filePathsCallback() const
MultilibSet & setIncludeDirsCallback(IncludeDirsFunc F)
MultilibSet & setFilePathsCallback(IncludeDirsFunc F)
This corresponds to a single GCC Multilib, or a segment of one controlled by a command line flag.
const std::string & gccSuffix() const
Get the detected GCC installation path suffix for the multi-arch target variant.
std::vector< std::string > flags_list
const std::string & osSuffix() const
Get the detected os path suffix for the multi-arch target variant.
bool isDefault() const
Check whether the default is selected.
const std::string & includeSuffix() const
Get the include directory suffix.
bool isLLVMIR(ID Id)
Is this LLVM IR.
const char * getTypeName(ID Id)
getTypeName - Return the name of the type for Id.
bool canTypeBeUserSpecified(ID Id)
canTypeBeUserSpecified - Can this type be specified on the command line (by the type name); this is u...
bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple, StringRef Path, const llvm::opt::ArgList &Args, DetectedMultilibs &Result)
bool LE(InterpState &S, CodePtr OpPC)
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T
MultilibSet Multilibs
The set of multilibs that the detected installation supports.
std::optional< Multilib > BiarchSibling
On Biarch systems, this corresponds to the default multilib when targeting the non-default multilib.
llvm::SmallVector< Multilib > SelectedMultilibs
The multilibs appropriate for the given flags.
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileCurCP()