xref: /freebsd-src/contrib/llvm-project/clang/lib/Driver/ToolChains/Gnu.cpp (revision 5e801ac66d24704442eba426ed13c3effb8a34e7)
1 //===--- Gnu.cpp - Gnu Tool and ToolChain Implementations -------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "Gnu.h"
10 #include "Arch/ARM.h"
11 #include "Arch/Mips.h"
12 #include "Arch/PPC.h"
13 #include "Arch/RISCV.h"
14 #include "Arch/Sparc.h"
15 #include "Arch/SystemZ.h"
16 #include "CommonArgs.h"
17 #include "Linux.h"
18 #include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
19 #include "clang/Driver/Compilation.h"
20 #include "clang/Driver/Driver.h"
21 #include "clang/Driver/DriverDiagnostic.h"
22 #include "clang/Driver/Options.h"
23 #include "clang/Driver/Tool.h"
24 #include "clang/Driver/ToolChain.h"
25 #include "llvm/Option/ArgList.h"
26 #include "llvm/Support/CodeGen.h"
27 #include "llvm/Support/Path.h"
28 #include "llvm/Support/TargetParser.h"
29 #include "llvm/Support/VirtualFileSystem.h"
30 #include <system_error>
31 
32 using namespace clang::driver;
33 using namespace clang::driver::toolchains;
34 using namespace clang;
35 using namespace llvm::opt;
36 
37 using tools::addMultilibFlag;
38 using tools::addPathIfExists;
39 
40 static bool forwardToGCC(const Option &O) {
41   // LinkerInput options have been forwarded. Don't duplicate.
42   if (O.hasFlag(options::LinkerInput))
43     return false;
44   return O.matches(options::OPT_Link_Group) || O.hasFlag(options::LinkOption);
45 }
46 
47 // Switch CPU names not recognized by GNU assembler to a close CPU that it does
48 // recognize, instead of a lower march from being picked in the absence of a cpu
49 // flag.
50 static void normalizeCPUNamesForAssembler(const ArgList &Args,
51                                           ArgStringList &CmdArgs) {
52   if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
53     StringRef CPUArg(A->getValue());
54     if (CPUArg.equals_insensitive("krait"))
55       CmdArgs.push_back("-mcpu=cortex-a15");
56     else if (CPUArg.equals_insensitive("kryo"))
57       CmdArgs.push_back("-mcpu=cortex-a57");
58     else
59       Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
60   }
61 }
62 
63 void tools::gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
64                                       const InputInfo &Output,
65                                       const InputInfoList &Inputs,
66                                       const ArgList &Args,
67                                       const char *LinkingOutput) const {
68   const Driver &D = getToolChain().getDriver();
69   ArgStringList CmdArgs;
70 
71   for (const auto &A : Args) {
72     if (forwardToGCC(A->getOption())) {
73       // It is unfortunate that we have to claim here, as this means
74       // we will basically never report anything interesting for
75       // platforms using a generic gcc, even if we are just using gcc
76       // to get to the assembler.
77       A->claim();
78 
79       A->render(Args, CmdArgs);
80     }
81   }
82 
83   RenderExtraToolArgs(JA, CmdArgs);
84 
85   // If using a driver driver, force the arch.
86   if (getToolChain().getTriple().isOSDarwin()) {
87     CmdArgs.push_back("-arch");
88     CmdArgs.push_back(
89         Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
90   }
91 
92   // Try to force gcc to match the tool chain we want, if we recognize
93   // the arch.
94   //
95   // FIXME: The triple class should directly provide the information we want
96   // here.
97   switch (getToolChain().getArch()) {
98   default:
99     break;
100   case llvm::Triple::x86:
101   case llvm::Triple::ppc:
102   case llvm::Triple::ppcle:
103     CmdArgs.push_back("-m32");
104     break;
105   case llvm::Triple::x86_64:
106   case llvm::Triple::ppc64:
107   case llvm::Triple::ppc64le:
108     CmdArgs.push_back("-m64");
109     break;
110   case llvm::Triple::sparcel:
111     CmdArgs.push_back("-EL");
112     break;
113   }
114 
115   if (Output.isFilename()) {
116     CmdArgs.push_back("-o");
117     CmdArgs.push_back(Output.getFilename());
118   } else {
119     assert(Output.isNothing() && "Unexpected output");
120     CmdArgs.push_back("-fsyntax-only");
121   }
122 
123   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
124 
125   // Only pass -x if gcc will understand it; otherwise hope gcc
126   // understands the suffix correctly. The main use case this would go
127   // wrong in is for linker inputs if they happened to have an odd
128   // suffix; really the only way to get this to happen is a command
129   // like '-x foobar a.c' which will treat a.c like a linker input.
130   //
131   // FIXME: For the linker case specifically, can we safely convert
132   // inputs into '-Wl,' options?
133   for (const auto &II : Inputs) {
134     // Don't try to pass LLVM or AST inputs to a generic gcc.
135     if (types::isLLVMIR(II.getType()))
136       D.Diag(clang::diag::err_drv_no_linker_llvm_support)
137           << getToolChain().getTripleString();
138     else if (II.getType() == types::TY_AST)
139       D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
140     else if (II.getType() == types::TY_ModuleFile)
141       D.Diag(diag::err_drv_no_module_support)
142           << getToolChain().getTripleString();
143 
144     if (types::canTypeBeUserSpecified(II.getType())) {
145       CmdArgs.push_back("-x");
146       CmdArgs.push_back(types::getTypeName(II.getType()));
147     }
148 
149     if (II.isFilename())
150       CmdArgs.push_back(II.getFilename());
151     else {
152       const Arg &A = II.getInputArg();
153 
154       // Reverse translate some rewritten options.
155       if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
156         CmdArgs.push_back("-lstdc++");
157         continue;
158       }
159 
160       // Don't render as input, we need gcc to do the translations.
161       A.render(Args, CmdArgs);
162     }
163   }
164 
165   const std::string &customGCCName = D.getCCCGenericGCCName();
166   const char *GCCName;
167   if (!customGCCName.empty())
168     GCCName = customGCCName.c_str();
169   else if (D.CCCIsCXX()) {
170     GCCName = "g++";
171   } else
172     GCCName = "gcc";
173 
174   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
175   C.addCommand(std::make_unique<Command>(JA, *this,
176                                          ResponseFileSupport::AtFileCurCP(),
177                                          Exec, CmdArgs, Inputs, Output));
178 }
179 
180 void tools::gcc::Preprocessor::RenderExtraToolArgs(
181     const JobAction &JA, ArgStringList &CmdArgs) const {
182   CmdArgs.push_back("-E");
183 }
184 
185 void tools::gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
186                                                ArgStringList &CmdArgs) const {
187   const Driver &D = getToolChain().getDriver();
188 
189   switch (JA.getType()) {
190   // If -flto, etc. are present then make sure not to force assembly output.
191   case types::TY_LLVM_IR:
192   case types::TY_LTO_IR:
193   case types::TY_LLVM_BC:
194   case types::TY_LTO_BC:
195     CmdArgs.push_back("-c");
196     break;
197   // We assume we've got an "integrated" assembler in that gcc will produce an
198   // object file itself.
199   case types::TY_Object:
200     CmdArgs.push_back("-c");
201     break;
202   case types::TY_PP_Asm:
203     CmdArgs.push_back("-S");
204     break;
205   case types::TY_Nothing:
206     CmdArgs.push_back("-fsyntax-only");
207     break;
208   default:
209     D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
210   }
211 }
212 
213 void tools::gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
214                                              ArgStringList &CmdArgs) const {
215   // The types are (hopefully) good enough.
216 }
217 
218 // On Arm the endianness of the output file is determined by the target and
219 // can be overridden by the pseudo-target flags '-mlittle-endian'/'-EL' and
220 // '-mbig-endian'/'-EB'. Unlike other targets the flag does not result in a
221 // normalized triple so we must handle the flag here.
222 static bool isArmBigEndian(const llvm::Triple &Triple,
223                            const ArgList &Args) {
224   bool IsBigEndian = false;
225   switch (Triple.getArch()) {
226   case llvm::Triple::armeb:
227   case llvm::Triple::thumbeb:
228     IsBigEndian = true;
229     LLVM_FALLTHROUGH;
230   case llvm::Triple::arm:
231   case llvm::Triple::thumb:
232     if (Arg *A = Args.getLastArg(options::OPT_mlittle_endian,
233                                options::OPT_mbig_endian))
234       IsBigEndian = !A->getOption().matches(options::OPT_mlittle_endian);
235     break;
236   default:
237     break;
238   }
239   return IsBigEndian;
240 }
241 
242 static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
243   switch (T.getArch()) {
244   case llvm::Triple::x86:
245     if (T.isOSIAMCU())
246       return "elf_iamcu";
247     return "elf_i386";
248   case llvm::Triple::aarch64:
249     return "aarch64linux";
250   case llvm::Triple::aarch64_be:
251     return "aarch64linuxb";
252   case llvm::Triple::arm:
253   case llvm::Triple::thumb:
254   case llvm::Triple::armeb:
255   case llvm::Triple::thumbeb:
256     return isArmBigEndian(T, Args) ? "armelfb_linux_eabi" : "armelf_linux_eabi";
257   case llvm::Triple::m68k:
258     return "m68kelf";
259   case llvm::Triple::ppc:
260     if (T.isOSLinux())
261       return "elf32ppclinux";
262     return "elf32ppc";
263   case llvm::Triple::ppcle:
264     if (T.isOSLinux())
265       return "elf32lppclinux";
266     return "elf32lppc";
267   case llvm::Triple::ppc64:
268     return "elf64ppc";
269   case llvm::Triple::ppc64le:
270     return "elf64lppc";
271   case llvm::Triple::riscv32:
272     return "elf32lriscv";
273   case llvm::Triple::riscv64:
274     return "elf64lriscv";
275   case llvm::Triple::sparc:
276   case llvm::Triple::sparcel:
277     return "elf32_sparc";
278   case llvm::Triple::sparcv9:
279     return "elf64_sparc";
280   case llvm::Triple::mips:
281     return "elf32btsmip";
282   case llvm::Triple::mipsel:
283     return "elf32ltsmip";
284   case llvm::Triple::mips64:
285     if (tools::mips::hasMipsAbiArg(Args, "n32") ||
286         T.getEnvironment() == llvm::Triple::GNUABIN32)
287       return "elf32btsmipn32";
288     return "elf64btsmip";
289   case llvm::Triple::mips64el:
290     if (tools::mips::hasMipsAbiArg(Args, "n32") ||
291         T.getEnvironment() == llvm::Triple::GNUABIN32)
292       return "elf32ltsmipn32";
293     return "elf64ltsmip";
294   case llvm::Triple::systemz:
295     return "elf64_s390";
296   case llvm::Triple::x86_64:
297     if (T.isX32())
298       return "elf32_x86_64";
299     return "elf_x86_64";
300   case llvm::Triple::ve:
301     return "elf64ve";
302   default:
303     return nullptr;
304   }
305 }
306 
307 static bool getPIE(const ArgList &Args, const ToolChain &TC) {
308   if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_static) ||
309       Args.hasArg(options::OPT_r) || Args.hasArg(options::OPT_static_pie))
310     return false;
311 
312   Arg *A = Args.getLastArg(options::OPT_pie, options::OPT_no_pie,
313                            options::OPT_nopie);
314   if (!A)
315     return TC.isPIEDefault(Args);
316   return A->getOption().matches(options::OPT_pie);
317 }
318 
319 static bool getStaticPIE(const ArgList &Args, const ToolChain &TC) {
320   bool HasStaticPIE = Args.hasArg(options::OPT_static_pie);
321   // -no-pie is an alias for -nopie. So, handling -nopie takes care of
322   // -no-pie as well.
323   if (HasStaticPIE && Args.hasArg(options::OPT_nopie)) {
324     const Driver &D = TC.getDriver();
325     const llvm::opt::OptTable &Opts = D.getOpts();
326     const char *StaticPIEName = Opts.getOptionName(options::OPT_static_pie);
327     const char *NoPIEName = Opts.getOptionName(options::OPT_nopie);
328     D.Diag(diag::err_drv_cannot_mix_options) << StaticPIEName << NoPIEName;
329   }
330   return HasStaticPIE;
331 }
332 
333 static bool getStatic(const ArgList &Args) {
334   return Args.hasArg(options::OPT_static) &&
335       !Args.hasArg(options::OPT_static_pie);
336 }
337 
338 void tools::gnutools::StaticLibTool::ConstructJob(
339     Compilation &C, const JobAction &JA, const InputInfo &Output,
340     const InputInfoList &Inputs, const ArgList &Args,
341     const char *LinkingOutput) const {
342   const Driver &D = getToolChain().getDriver();
343 
344   // Silence warning for "clang -g foo.o -o foo"
345   Args.ClaimAllArgs(options::OPT_g_Group);
346   // and "clang -emit-llvm foo.o -o foo"
347   Args.ClaimAllArgs(options::OPT_emit_llvm);
348   // and for "clang -w foo.o -o foo". Other warning options are already
349   // handled somewhere else.
350   Args.ClaimAllArgs(options::OPT_w);
351   // Silence warnings when linking C code with a C++ '-stdlib' argument.
352   Args.ClaimAllArgs(options::OPT_stdlib_EQ);
353 
354   // ar tool command "llvm-ar <options> <output_file> <input_files>".
355   ArgStringList CmdArgs;
356   // Create and insert file members with a deterministic index.
357   CmdArgs.push_back("rcsD");
358   CmdArgs.push_back(Output.getFilename());
359 
360   for (const auto &II : Inputs) {
361     if (II.isFilename()) {
362        CmdArgs.push_back(II.getFilename());
363     }
364   }
365 
366   // Delete old output archive file if it already exists before generating a new
367   // archive file.
368   auto OutputFileName = Output.getFilename();
369   if (Output.isFilename() && llvm::sys::fs::exists(OutputFileName)) {
370     if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) {
371       D.Diag(diag::err_drv_unable_to_remove_file) << EC.message();
372       return;
373     }
374   }
375 
376   const char *Exec = Args.MakeArgString(getToolChain().GetStaticLibToolPath());
377   C.addCommand(std::make_unique<Command>(JA, *this,
378                                          ResponseFileSupport::AtFileCurCP(),
379                                          Exec, CmdArgs, Inputs, Output));
380 }
381 
382 void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
383                                            const InputInfo &Output,
384                                            const InputInfoList &Inputs,
385                                            const ArgList &Args,
386                                            const char *LinkingOutput) const {
387   // FIXME: The Linker class constructor takes a ToolChain and not a
388   // Generic_ELF, so the static_cast might return a reference to a invalid
389   // instance (see PR45061). Ideally, the Linker constructor needs to take a
390   // Generic_ELF instead.
391   const toolchains::Generic_ELF &ToolChain =
392       static_cast<const toolchains::Generic_ELF &>(getToolChain());
393   const Driver &D = ToolChain.getDriver();
394 
395   const llvm::Triple &Triple = getToolChain().getEffectiveTriple();
396 
397   const llvm::Triple::ArchType Arch = ToolChain.getArch();
398   const bool isAndroid = ToolChain.getTriple().isAndroid();
399   const bool IsIAMCU = ToolChain.getTriple().isOSIAMCU();
400   const bool IsVE = ToolChain.getTriple().isVE();
401   const bool IsPIE = getPIE(Args, ToolChain);
402   const bool IsStaticPIE = getStaticPIE(Args, ToolChain);
403   const bool IsStatic = getStatic(Args);
404   const bool HasCRTBeginEndFiles =
405       ToolChain.getTriple().hasEnvironment() ||
406       (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
407 
408   ArgStringList CmdArgs;
409 
410   // Silence warning for "clang -g foo.o -o foo"
411   Args.ClaimAllArgs(options::OPT_g_Group);
412   // and "clang -emit-llvm foo.o -o foo"
413   Args.ClaimAllArgs(options::OPT_emit_llvm);
414   // and for "clang -w foo.o -o foo". Other warning options are already
415   // handled somewhere else.
416   Args.ClaimAllArgs(options::OPT_w);
417 
418   if (!D.SysRoot.empty())
419     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
420 
421   if (IsPIE)
422     CmdArgs.push_back("-pie");
423 
424   if (IsStaticPIE) {
425     CmdArgs.push_back("-static");
426     CmdArgs.push_back("-pie");
427     CmdArgs.push_back("--no-dynamic-linker");
428     CmdArgs.push_back("-z");
429     CmdArgs.push_back("text");
430   }
431 
432   if (Args.hasArg(options::OPT_rdynamic))
433     CmdArgs.push_back("-export-dynamic");
434 
435   if (Args.hasArg(options::OPT_s))
436     CmdArgs.push_back("-s");
437 
438   if (Triple.isARM() || Triple.isThumb() || Triple.isAArch64()) {
439     bool IsBigEndian = isArmBigEndian(Triple, Args);
440     if (IsBigEndian)
441       arm::appendBE8LinkFlag(Args, CmdArgs, Triple);
442     IsBigEndian = IsBigEndian || Arch == llvm::Triple::aarch64_be;
443     CmdArgs.push_back(IsBigEndian ? "-EB" : "-EL");
444   }
445 
446   // Most Android ARM64 targets should enable the linker fix for erratum
447   // 843419. Only non-Cortex-A53 devices are allowed to skip this flag.
448   if (Arch == llvm::Triple::aarch64 && isAndroid) {
449     std::string CPU = getCPUName(D, Args, Triple);
450     if (CPU.empty() || CPU == "generic" || CPU == "cortex-a53")
451       CmdArgs.push_back("--fix-cortex-a53-843419");
452   }
453 
454   // Android does not allow shared text relocations. Emit a warning if the
455   // user's code contains any.
456   if (isAndroid)
457       CmdArgs.push_back("--warn-shared-textrel");
458 
459   ToolChain.addExtraOpts(CmdArgs);
460 
461   CmdArgs.push_back("--eh-frame-hdr");
462 
463   if (const char *LDMOption = getLDMOption(ToolChain.getTriple(), Args)) {
464     CmdArgs.push_back("-m");
465     CmdArgs.push_back(LDMOption);
466   } else {
467     D.Diag(diag::err_target_unknown_triple) << Triple.str();
468     return;
469   }
470 
471   if (Args.hasArg(options::OPT_shared))
472     CmdArgs.push_back("-shared");
473 
474   if (IsStatic) {
475     CmdArgs.push_back("-static");
476   } else {
477     if (Args.hasArg(options::OPT_rdynamic))
478       CmdArgs.push_back("-export-dynamic");
479 
480     if (!Args.hasArg(options::OPT_shared) && !IsStaticPIE) {
481       CmdArgs.push_back("-dynamic-linker");
482       CmdArgs.push_back(Args.MakeArgString(Twine(D.DyldPrefix) +
483                                            ToolChain.getDynamicLinker(Args)));
484     }
485   }
486 
487   CmdArgs.push_back("-o");
488   CmdArgs.push_back(Output.getFilename());
489 
490   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
491     if (!isAndroid && !IsIAMCU) {
492       const char *crt1 = nullptr;
493       if (!Args.hasArg(options::OPT_shared)) {
494         if (Args.hasArg(options::OPT_pg))
495           crt1 = "gcrt1.o";
496         else if (IsPIE)
497           crt1 = "Scrt1.o";
498         else if (IsStaticPIE)
499           crt1 = "rcrt1.o";
500         else
501           crt1 = "crt1.o";
502       }
503       if (crt1)
504         CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
505 
506       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
507     }
508 
509     if (IsVE) {
510       CmdArgs.push_back("-z");
511       CmdArgs.push_back("max-page-size=0x4000000");
512     }
513 
514     if (IsIAMCU)
515       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
516     else if (HasCRTBeginEndFiles) {
517       std::string P;
518       if (ToolChain.GetRuntimeLibType(Args) == ToolChain::RLT_CompilerRT &&
519           !isAndroid) {
520         std::string crtbegin = ToolChain.getCompilerRT(Args, "crtbegin",
521                                                        ToolChain::FT_Object);
522         if (ToolChain.getVFS().exists(crtbegin))
523           P = crtbegin;
524       }
525       if (P.empty()) {
526         const char *crtbegin;
527         if (Args.hasArg(options::OPT_shared))
528           crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
529         else if (IsStatic)
530           crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
531         else if (IsPIE || IsStaticPIE)
532           crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
533         else
534           crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
535         P = ToolChain.GetFilePath(crtbegin);
536       }
537       CmdArgs.push_back(Args.MakeArgString(P));
538     }
539 
540     // Add crtfastmath.o if available and fast math is enabled.
541     ToolChain.addFastMathRuntimeIfAvailable(Args, CmdArgs);
542   }
543 
544   Args.AddAllArgs(CmdArgs, options::OPT_L);
545   Args.AddAllArgs(CmdArgs, options::OPT_u);
546 
547   ToolChain.AddFilePathLibArgs(Args, CmdArgs);
548 
549   if (D.isUsingLTO()) {
550     assert(!Inputs.empty() && "Must have at least one input.");
551     addLTOOptions(ToolChain, Args, CmdArgs, Output, Inputs[0],
552                   D.getLTOMode() == LTOK_Thin);
553   }
554 
555   if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
556     CmdArgs.push_back("--no-demangle");
557 
558   bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
559   bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs);
560   addLinkerCompressDebugSectionsOption(ToolChain, Args, CmdArgs);
561   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
562   // The profile runtime also needs access to system libraries.
563   getToolChain().addProfileRTLibs(Args, CmdArgs);
564 
565   if (D.CCCIsCXX() &&
566       !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
567     if (ToolChain.ShouldLinkCXXStdlib(Args)) {
568       bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
569                                  !Args.hasArg(options::OPT_static);
570       if (OnlyLibstdcxxStatic)
571         CmdArgs.push_back("-Bstatic");
572       ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
573       if (OnlyLibstdcxxStatic)
574         CmdArgs.push_back("-Bdynamic");
575     }
576     CmdArgs.push_back("-lm");
577   }
578   // Silence warnings when linking C code with a C++ '-stdlib' argument.
579   Args.ClaimAllArgs(options::OPT_stdlib_EQ);
580 
581   if (!Args.hasArg(options::OPT_nostdlib)) {
582     if (!Args.hasArg(options::OPT_nodefaultlibs)) {
583       if (IsStatic || IsStaticPIE)
584         CmdArgs.push_back("--start-group");
585 
586       if (NeedsSanitizerDeps)
587         linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
588 
589       if (NeedsXRayDeps)
590         linkXRayRuntimeDeps(ToolChain, CmdArgs);
591 
592       bool WantPthread = Args.hasArg(options::OPT_pthread) ||
593                          Args.hasArg(options::OPT_pthreads);
594 
595       // Use the static OpenMP runtime with -static-openmp
596       bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) &&
597                           !Args.hasArg(options::OPT_static);
598 
599       // FIXME: Only pass GompNeedsRT = true for platforms with libgomp that
600       // require librt. Most modern Linux platforms do, but some may not.
601       if (addOpenMPRuntime(CmdArgs, ToolChain, Args, StaticOpenMP,
602                            JA.isHostOffloading(Action::OFK_OpenMP),
603                            /* GompNeedsRT= */ true))
604         // OpenMP runtimes implies pthreads when using the GNU toolchain.
605         // FIXME: Does this really make sense for all GNU toolchains?
606         WantPthread = true;
607 
608       AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
609 
610       if (WantPthread && !isAndroid)
611         CmdArgs.push_back("-lpthread");
612 
613       if (Args.hasArg(options::OPT_fsplit_stack))
614         CmdArgs.push_back("--wrap=pthread_create");
615 
616       if (!Args.hasArg(options::OPT_nolibc))
617         CmdArgs.push_back("-lc");
618 
619       // Add IAMCU specific libs, if needed.
620       if (IsIAMCU)
621         CmdArgs.push_back("-lgloss");
622 
623       if (IsStatic || IsStaticPIE)
624         CmdArgs.push_back("--end-group");
625       else
626         AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
627 
628       // Add IAMCU specific libs (outside the group), if needed.
629       if (IsIAMCU) {
630         CmdArgs.push_back("--as-needed");
631         CmdArgs.push_back("-lsoftfp");
632         CmdArgs.push_back("--no-as-needed");
633       }
634     }
635 
636     if (!Args.hasArg(options::OPT_nostartfiles) && !IsIAMCU) {
637       if (HasCRTBeginEndFiles) {
638         std::string P;
639         if (ToolChain.GetRuntimeLibType(Args) == ToolChain::RLT_CompilerRT &&
640             !isAndroid) {
641           std::string crtend = ToolChain.getCompilerRT(Args, "crtend",
642                                                        ToolChain::FT_Object);
643           if (ToolChain.getVFS().exists(crtend))
644             P = crtend;
645         }
646         if (P.empty()) {
647           const char *crtend;
648           if (Args.hasArg(options::OPT_shared))
649             crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
650           else if (IsPIE || IsStaticPIE)
651             crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
652           else
653             crtend = isAndroid ? "crtend_android.o" : "crtend.o";
654           P = ToolChain.GetFilePath(crtend);
655         }
656         CmdArgs.push_back(Args.MakeArgString(P));
657       }
658       if (!isAndroid)
659         CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
660     }
661   }
662 
663   Args.AddAllArgs(CmdArgs, options::OPT_T);
664 
665   const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
666   C.addCommand(std::make_unique<Command>(JA, *this,
667                                          ResponseFileSupport::AtFileCurCP(),
668                                          Exec, CmdArgs, Inputs, Output));
669 }
670 
671 void tools::gnutools::Assembler::ConstructJob(Compilation &C,
672                                               const JobAction &JA,
673                                               const InputInfo &Output,
674                                               const InputInfoList &Inputs,
675                                               const ArgList &Args,
676                                               const char *LinkingOutput) const {
677   const auto &D = getToolChain().getDriver();
678 
679   claimNoWarnArgs(Args);
680 
681   ArgStringList CmdArgs;
682 
683   llvm::Reloc::Model RelocationModel;
684   unsigned PICLevel;
685   bool IsPIE;
686   const char *DefaultAssembler = "as";
687   std::tie(RelocationModel, PICLevel, IsPIE) =
688       ParsePICArgs(getToolChain(), Args);
689 
690   if (const Arg *A = Args.getLastArg(options::OPT_gz, options::OPT_gz_EQ)) {
691     if (A->getOption().getID() == options::OPT_gz) {
692       CmdArgs.push_back("--compress-debug-sections");
693     } else {
694       StringRef Value = A->getValue();
695       if (Value == "none" || Value == "zlib" || Value == "zlib-gnu") {
696         CmdArgs.push_back(
697             Args.MakeArgString("--compress-debug-sections=" + Twine(Value)));
698       } else {
699         D.Diag(diag::err_drv_unsupported_option_argument)
700             << A->getOption().getName() << Value;
701       }
702     }
703   }
704 
705   switch (getToolChain().getArch()) {
706   default:
707     break;
708   // Add --32/--64 to make sure we get the format we want.
709   // This is incomplete
710   case llvm::Triple::x86:
711     CmdArgs.push_back("--32");
712     break;
713   case llvm::Triple::x86_64:
714     if (getToolChain().getTriple().isX32())
715       CmdArgs.push_back("--x32");
716     else
717       CmdArgs.push_back("--64");
718     break;
719   case llvm::Triple::ppc: {
720     CmdArgs.push_back("-a32");
721     CmdArgs.push_back("-mppc");
722     CmdArgs.push_back("-mbig-endian");
723     CmdArgs.push_back(ppc::getPPCAsmModeForCPU(
724         getCPUName(D, Args, getToolChain().getTriple())));
725     break;
726   }
727   case llvm::Triple::ppcle: {
728     CmdArgs.push_back("-a32");
729     CmdArgs.push_back("-mppc");
730     CmdArgs.push_back("-mlittle-endian");
731     CmdArgs.push_back(ppc::getPPCAsmModeForCPU(
732         getCPUName(D, Args, getToolChain().getTriple())));
733     break;
734   }
735   case llvm::Triple::ppc64: {
736     CmdArgs.push_back("-a64");
737     CmdArgs.push_back("-mppc64");
738     CmdArgs.push_back("-mbig-endian");
739     CmdArgs.push_back(ppc::getPPCAsmModeForCPU(
740         getCPUName(D, Args, getToolChain().getTriple())));
741     break;
742   }
743   case llvm::Triple::ppc64le: {
744     CmdArgs.push_back("-a64");
745     CmdArgs.push_back("-mppc64");
746     CmdArgs.push_back("-mlittle-endian");
747     CmdArgs.push_back(ppc::getPPCAsmModeForCPU(
748         getCPUName(D, Args, getToolChain().getTriple())));
749     break;
750   }
751   case llvm::Triple::riscv32:
752   case llvm::Triple::riscv64: {
753     StringRef ABIName = riscv::getRISCVABI(Args, getToolChain().getTriple());
754     CmdArgs.push_back("-mabi");
755     CmdArgs.push_back(ABIName.data());
756     StringRef MArchName = riscv::getRISCVArch(Args, getToolChain().getTriple());
757     CmdArgs.push_back("-march");
758     CmdArgs.push_back(MArchName.data());
759     break;
760   }
761   case llvm::Triple::sparc:
762   case llvm::Triple::sparcel: {
763     CmdArgs.push_back("-32");
764     std::string CPU = getCPUName(D, Args, getToolChain().getTriple());
765     CmdArgs.push_back(
766         sparc::getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
767     AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
768     break;
769   }
770   case llvm::Triple::sparcv9: {
771     CmdArgs.push_back("-64");
772     std::string CPU = getCPUName(D, Args, getToolChain().getTriple());
773     CmdArgs.push_back(
774         sparc::getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
775     AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
776     break;
777   }
778   case llvm::Triple::arm:
779   case llvm::Triple::armeb:
780   case llvm::Triple::thumb:
781   case llvm::Triple::thumbeb: {
782     const llvm::Triple &Triple2 = getToolChain().getTriple();
783     CmdArgs.push_back(isArmBigEndian(Triple2, Args) ? "-EB" : "-EL");
784     switch (Triple2.getSubArch()) {
785     case llvm::Triple::ARMSubArch_v7:
786       CmdArgs.push_back("-mfpu=neon");
787       break;
788     case llvm::Triple::ARMSubArch_v8:
789       CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
790       break;
791     default:
792       break;
793     }
794 
795     switch (arm::getARMFloatABI(getToolChain(), Args)) {
796     case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
797     case arm::FloatABI::Soft:
798       CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
799       break;
800     case arm::FloatABI::SoftFP:
801       CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
802       break;
803     case arm::FloatABI::Hard:
804       CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
805       break;
806     }
807 
808     Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
809     normalizeCPUNamesForAssembler(Args, CmdArgs);
810 
811     Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
812     break;
813   }
814   case llvm::Triple::aarch64:
815   case llvm::Triple::aarch64_be: {
816     CmdArgs.push_back(
817         getToolChain().getArch() == llvm::Triple::aarch64_be ? "-EB" : "-EL");
818     Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
819     normalizeCPUNamesForAssembler(Args, CmdArgs);
820 
821     break;
822   }
823   case llvm::Triple::mips:
824   case llvm::Triple::mipsel:
825   case llvm::Triple::mips64:
826   case llvm::Triple::mips64el: {
827     StringRef CPUName;
828     StringRef ABIName;
829     mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
830     ABIName = mips::getGnuCompatibleMipsABIName(ABIName);
831 
832     CmdArgs.push_back("-march");
833     CmdArgs.push_back(CPUName.data());
834 
835     CmdArgs.push_back("-mabi");
836     CmdArgs.push_back(ABIName.data());
837 
838     // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
839     // or -mshared (not implemented) is in effect.
840     if (RelocationModel == llvm::Reloc::Static)
841       CmdArgs.push_back("-mno-shared");
842 
843     // LLVM doesn't support -mplt yet and acts as if it is always given.
844     // However, -mplt has no effect with the N64 ABI.
845     if (ABIName != "64" && !Args.hasArg(options::OPT_mno_abicalls))
846       CmdArgs.push_back("-call_nonpic");
847 
848     if (getToolChain().getTriple().isLittleEndian())
849       CmdArgs.push_back("-EL");
850     else
851       CmdArgs.push_back("-EB");
852 
853     if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
854       if (StringRef(A->getValue()) == "2008")
855         CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
856     }
857 
858     // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
859     if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
860                                  options::OPT_mfp64)) {
861       A->claim();
862       A->render(Args, CmdArgs);
863     } else if (mips::shouldUseFPXX(
864                    Args, getToolChain().getTriple(), CPUName, ABIName,
865                    mips::getMipsFloatABI(getToolChain().getDriver(), Args,
866                                          getToolChain().getTriple())))
867       CmdArgs.push_back("-mfpxx");
868 
869     // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
870     // -mno-mips16 is actually -no-mips16.
871     if (Arg *A =
872             Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
873       if (A->getOption().matches(options::OPT_mips16)) {
874         A->claim();
875         A->render(Args, CmdArgs);
876       } else {
877         A->claim();
878         CmdArgs.push_back("-no-mips16");
879       }
880     }
881 
882     Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
883                     options::OPT_mno_micromips);
884     Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
885     Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
886 
887     if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
888       // Do not use AddLastArg because not all versions of MIPS assembler
889       // support -mmsa / -mno-msa options.
890       if (A->getOption().matches(options::OPT_mmsa))
891         CmdArgs.push_back(Args.MakeArgString("-mmsa"));
892     }
893 
894     Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
895                     options::OPT_msoft_float);
896 
897     Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
898                     options::OPT_msingle_float);
899 
900     Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
901                     options::OPT_mno_odd_spreg);
902 
903     AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
904     break;
905   }
906   case llvm::Triple::systemz: {
907     // Always pass an -march option, since our default of z10 is later
908     // than the GNU assembler's default.
909     std::string CPUName = systemz::getSystemZTargetCPU(Args);
910     CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
911     break;
912   }
913   case llvm::Triple::ve:
914     DefaultAssembler = "nas";
915   }
916 
917   for (const Arg *A : Args.filtered(options::OPT_ffile_prefix_map_EQ,
918                                     options::OPT_fdebug_prefix_map_EQ)) {
919     StringRef Map = A->getValue();
920     if (!Map.contains('='))
921       D.Diag(diag::err_drv_invalid_argument_to_option)
922           << Map << A->getOption().getName();
923     else {
924       CmdArgs.push_back(Args.MakeArgString("--debug-prefix-map"));
925       CmdArgs.push_back(Args.MakeArgString(Map));
926     }
927     A->claim();
928   }
929 
930   Args.AddAllArgs(CmdArgs, options::OPT_I);
931   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
932 
933   CmdArgs.push_back("-o");
934   CmdArgs.push_back(Output.getFilename());
935 
936   for (const auto &II : Inputs)
937     CmdArgs.push_back(II.getFilename());
938 
939   const char *Exec =
940       Args.MakeArgString(getToolChain().GetProgramPath(DefaultAssembler));
941   C.addCommand(std::make_unique<Command>(JA, *this,
942                                          ResponseFileSupport::AtFileCurCP(),
943                                          Exec, CmdArgs, Inputs, Output));
944 
945   // Handle the debug info splitting at object creation time if we're
946   // creating an object.
947   // TODO: Currently only works on linux with newer objcopy.
948   if (Args.hasArg(options::OPT_gsplit_dwarf) &&
949       getToolChain().getTriple().isOSLinux())
950     SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
951                    SplitDebugName(JA, Args, Inputs[0], Output));
952 }
953 
954 namespace {
955 // Filter to remove Multilibs that don't exist as a suffix to Path
956 class FilterNonExistent {
957   StringRef Base, File;
958   llvm::vfs::FileSystem &VFS;
959 
960 public:
961   FilterNonExistent(StringRef Base, StringRef File, llvm::vfs::FileSystem &VFS)
962       : Base(Base), File(File), VFS(VFS) {}
963   bool operator()(const Multilib &M) {
964     return !VFS.exists(Base + M.gccSuffix() + File);
965   }
966 };
967 } // end anonymous namespace
968 
969 static bool isSoftFloatABI(const ArgList &Args) {
970   Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
971                            options::OPT_mfloat_abi_EQ);
972   if (!A)
973     return false;
974 
975   return A->getOption().matches(options::OPT_msoft_float) ||
976          (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
977           A->getValue() == StringRef("soft"));
978 }
979 
980 static bool isArmOrThumbArch(llvm::Triple::ArchType Arch) {
981   return Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb;
982 }
983 
984 static bool isMipsEL(llvm::Triple::ArchType Arch) {
985   return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
986 }
987 
988 static bool isMips16(const ArgList &Args) {
989   Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
990   return A && A->getOption().matches(options::OPT_mips16);
991 }
992 
993 static bool isMicroMips(const ArgList &Args) {
994   Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
995   return A && A->getOption().matches(options::OPT_mmicromips);
996 }
997 
998 static bool isMSP430(llvm::Triple::ArchType Arch) {
999   return Arch == llvm::Triple::msp430;
1000 }
1001 
1002 static Multilib makeMultilib(StringRef commonSuffix) {
1003   return Multilib(commonSuffix, commonSuffix, commonSuffix);
1004 }
1005 
1006 static bool findMipsCsMultilibs(const Multilib::flags_list &Flags,
1007                                 FilterNonExistent &NonExistent,
1008                                 DetectedMultilibs &Result) {
1009   // Check for Code Sourcery toolchain multilibs
1010   MultilibSet CSMipsMultilibs;
1011   {
1012     auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
1013 
1014     auto MArchMicroMips =
1015         makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
1016 
1017     auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
1018 
1019     auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
1020 
1021     auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
1022 
1023     auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
1024 
1025     auto DefaultFloat =
1026         makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
1027 
1028     auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
1029 
1030     auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
1031 
1032     // Note that this one's osSuffix is ""
1033     auto MAbi64 = makeMultilib("")
1034                       .gccSuffix("/64")
1035                       .includeSuffix("/64")
1036                       .flag("+mabi=n64")
1037                       .flag("-mabi=n32")
1038                       .flag("-m32");
1039 
1040     CSMipsMultilibs =
1041         MultilibSet()
1042             .Either(MArchMips16, MArchMicroMips, MArchDefault)
1043             .Maybe(UCLibc)
1044             .Either(SoftFloat, Nan2008, DefaultFloat)
1045             .FilterOut("/micromips/nan2008")
1046             .FilterOut("/mips16/nan2008")
1047             .Either(BigEndian, LittleEndian)
1048             .Maybe(MAbi64)
1049             .FilterOut("/mips16.*/64")
1050             .FilterOut("/micromips.*/64")
1051             .FilterOut(NonExistent)
1052             .setIncludeDirsCallback([](const Multilib &M) {
1053               std::vector<std::string> Dirs({"/include"});
1054               if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1055                 Dirs.push_back(
1056                     "/../../../../mips-linux-gnu/libc/uclibc/usr/include");
1057               else
1058                 Dirs.push_back("/../../../../mips-linux-gnu/libc/usr/include");
1059               return Dirs;
1060             });
1061   }
1062 
1063   MultilibSet DebianMipsMultilibs;
1064   {
1065     Multilib MAbiN32 =
1066         Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
1067 
1068     Multilib M64 = Multilib()
1069                        .gccSuffix("/64")
1070                        .includeSuffix("/64")
1071                        .flag("+m64")
1072                        .flag("-m32")
1073                        .flag("-mabi=n32");
1074 
1075     Multilib M32 =
1076         Multilib().gccSuffix("/32").flag("-m64").flag("+m32").flag("-mabi=n32");
1077 
1078     DebianMipsMultilibs =
1079         MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
1080   }
1081 
1082   // Sort candidates. Toolchain that best meets the directories tree goes first.
1083   // Then select the first toolchains matches command line flags.
1084   MultilibSet *Candidates[] = {&CSMipsMultilibs, &DebianMipsMultilibs};
1085   if (CSMipsMultilibs.size() < DebianMipsMultilibs.size())
1086     std::iter_swap(Candidates, Candidates + 1);
1087   for (const MultilibSet *Candidate : Candidates) {
1088     if (Candidate->select(Flags, Result.SelectedMultilib)) {
1089       if (Candidate == &DebianMipsMultilibs)
1090         Result.BiarchSibling = Multilib();
1091       Result.Multilibs = *Candidate;
1092       return true;
1093     }
1094   }
1095   return false;
1096 }
1097 
1098 static bool findMipsAndroidMultilibs(llvm::vfs::FileSystem &VFS, StringRef Path,
1099                                      const Multilib::flags_list &Flags,
1100                                      FilterNonExistent &NonExistent,
1101                                      DetectedMultilibs &Result) {
1102 
1103   MultilibSet AndroidMipsMultilibs =
1104       MultilibSet()
1105           .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1106           .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1107           .FilterOut(NonExistent);
1108 
1109   MultilibSet AndroidMipselMultilibs =
1110       MultilibSet()
1111           .Either(Multilib().flag("+march=mips32"),
1112                   Multilib("/mips-r2", "", "/mips-r2").flag("+march=mips32r2"),
1113                   Multilib("/mips-r6", "", "/mips-r6").flag("+march=mips32r6"))
1114           .FilterOut(NonExistent);
1115 
1116   MultilibSet AndroidMips64elMultilibs =
1117       MultilibSet()
1118           .Either(
1119               Multilib().flag("+march=mips64r6"),
1120               Multilib("/32/mips-r1", "", "/mips-r1").flag("+march=mips32"),
1121               Multilib("/32/mips-r2", "", "/mips-r2").flag("+march=mips32r2"),
1122               Multilib("/32/mips-r6", "", "/mips-r6").flag("+march=mips32r6"))
1123           .FilterOut(NonExistent);
1124 
1125   MultilibSet *MS = &AndroidMipsMultilibs;
1126   if (VFS.exists(Path + "/mips-r6"))
1127     MS = &AndroidMipselMultilibs;
1128   else if (VFS.exists(Path + "/32"))
1129     MS = &AndroidMips64elMultilibs;
1130   if (MS->select(Flags, Result.SelectedMultilib)) {
1131     Result.Multilibs = *MS;
1132     return true;
1133   }
1134   return false;
1135 }
1136 
1137 static bool findMipsMuslMultilibs(const Multilib::flags_list &Flags,
1138                                   FilterNonExistent &NonExistent,
1139                                   DetectedMultilibs &Result) {
1140   // Musl toolchain multilibs
1141   MultilibSet MuslMipsMultilibs;
1142   {
1143     auto MArchMipsR2 = makeMultilib("")
1144                            .osSuffix("/mips-r2-hard-musl")
1145                            .flag("+EB")
1146                            .flag("-EL")
1147                            .flag("+march=mips32r2");
1148 
1149     auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
1150                              .flag("-EB")
1151                              .flag("+EL")
1152                              .flag("+march=mips32r2");
1153 
1154     MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
1155 
1156     // Specify the callback that computes the include directories.
1157     MuslMipsMultilibs.setIncludeDirsCallback([](const Multilib &M) {
1158       return std::vector<std::string>(
1159           {"/../sysroot" + M.osSuffix() + "/usr/include"});
1160     });
1161   }
1162   if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
1163     Result.Multilibs = MuslMipsMultilibs;
1164     return true;
1165   }
1166   return false;
1167 }
1168 
1169 static bool findMipsMtiMultilibs(const Multilib::flags_list &Flags,
1170                                  FilterNonExistent &NonExistent,
1171                                  DetectedMultilibs &Result) {
1172   // CodeScape MTI toolchain v1.2 and early.
1173   MultilibSet MtiMipsMultilibsV1;
1174   {
1175     auto MArchMips32 = makeMultilib("/mips32")
1176                            .flag("+m32")
1177                            .flag("-m64")
1178                            .flag("-mmicromips")
1179                            .flag("+march=mips32");
1180 
1181     auto MArchMicroMips = makeMultilib("/micromips")
1182                               .flag("+m32")
1183                               .flag("-m64")
1184                               .flag("+mmicromips");
1185 
1186     auto MArchMips64r2 = makeMultilib("/mips64r2")
1187                              .flag("-m32")
1188                              .flag("+m64")
1189                              .flag("+march=mips64r2");
1190 
1191     auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1192         "-march=mips64r2");
1193 
1194     auto MArchDefault = makeMultilib("")
1195                             .flag("+m32")
1196                             .flag("-m64")
1197                             .flag("-mmicromips")
1198                             .flag("+march=mips32r2");
1199 
1200     auto Mips16 = makeMultilib("/mips16").flag("+mips16");
1201 
1202     auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
1203 
1204     auto MAbi64 =
1205         makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
1206 
1207     auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
1208 
1209     auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
1210 
1211     auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
1212 
1213     auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
1214 
1215     MtiMipsMultilibsV1 =
1216         MultilibSet()
1217             .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1218                     MArchDefault)
1219             .Maybe(UCLibc)
1220             .Maybe(Mips16)
1221             .FilterOut("/mips64/mips16")
1222             .FilterOut("/mips64r2/mips16")
1223             .FilterOut("/micromips/mips16")
1224             .Maybe(MAbi64)
1225             .FilterOut("/micromips/64")
1226             .FilterOut("/mips32/64")
1227             .FilterOut("^/64")
1228             .FilterOut("/mips16/64")
1229             .Either(BigEndian, LittleEndian)
1230             .Maybe(SoftFloat)
1231             .Maybe(Nan2008)
1232             .FilterOut(".*sof/nan2008")
1233             .FilterOut(NonExistent)
1234             .setIncludeDirsCallback([](const Multilib &M) {
1235               std::vector<std::string> Dirs({"/include"});
1236               if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1237                 Dirs.push_back("/../../../../sysroot/uclibc/usr/include");
1238               else
1239                 Dirs.push_back("/../../../../sysroot/usr/include");
1240               return Dirs;
1241             });
1242   }
1243 
1244   // CodeScape IMG toolchain starting from v1.3.
1245   MultilibSet MtiMipsMultilibsV2;
1246   {
1247     auto BeHard = makeMultilib("/mips-r2-hard")
1248                       .flag("+EB")
1249                       .flag("-msoft-float")
1250                       .flag("-mnan=2008")
1251                       .flag("-muclibc");
1252     auto BeSoft = makeMultilib("/mips-r2-soft")
1253                       .flag("+EB")
1254                       .flag("+msoft-float")
1255                       .flag("-mnan=2008");
1256     auto ElHard = makeMultilib("/mipsel-r2-hard")
1257                       .flag("+EL")
1258                       .flag("-msoft-float")
1259                       .flag("-mnan=2008")
1260                       .flag("-muclibc");
1261     auto ElSoft = makeMultilib("/mipsel-r2-soft")
1262                       .flag("+EL")
1263                       .flag("+msoft-float")
1264                       .flag("-mnan=2008")
1265                       .flag("-mmicromips");
1266     auto BeHardNan = makeMultilib("/mips-r2-hard-nan2008")
1267                          .flag("+EB")
1268                          .flag("-msoft-float")
1269                          .flag("+mnan=2008")
1270                          .flag("-muclibc");
1271     auto ElHardNan = makeMultilib("/mipsel-r2-hard-nan2008")
1272                          .flag("+EL")
1273                          .flag("-msoft-float")
1274                          .flag("+mnan=2008")
1275                          .flag("-muclibc")
1276                          .flag("-mmicromips");
1277     auto BeHardNanUclibc = makeMultilib("/mips-r2-hard-nan2008-uclibc")
1278                                .flag("+EB")
1279                                .flag("-msoft-float")
1280                                .flag("+mnan=2008")
1281                                .flag("+muclibc");
1282     auto ElHardNanUclibc = makeMultilib("/mipsel-r2-hard-nan2008-uclibc")
1283                                .flag("+EL")
1284                                .flag("-msoft-float")
1285                                .flag("+mnan=2008")
1286                                .flag("+muclibc");
1287     auto BeHardUclibc = makeMultilib("/mips-r2-hard-uclibc")
1288                             .flag("+EB")
1289                             .flag("-msoft-float")
1290                             .flag("-mnan=2008")
1291                             .flag("+muclibc");
1292     auto ElHardUclibc = makeMultilib("/mipsel-r2-hard-uclibc")
1293                             .flag("+EL")
1294                             .flag("-msoft-float")
1295                             .flag("-mnan=2008")
1296                             .flag("+muclibc");
1297     auto ElMicroHardNan = makeMultilib("/micromipsel-r2-hard-nan2008")
1298                               .flag("+EL")
1299                               .flag("-msoft-float")
1300                               .flag("+mnan=2008")
1301                               .flag("+mmicromips");
1302     auto ElMicroSoft = makeMultilib("/micromipsel-r2-soft")
1303                            .flag("+EL")
1304                            .flag("+msoft-float")
1305                            .flag("-mnan=2008")
1306                            .flag("+mmicromips");
1307 
1308     auto O32 =
1309         makeMultilib("/lib").osSuffix("").flag("-mabi=n32").flag("-mabi=n64");
1310     auto N32 =
1311         makeMultilib("/lib32").osSuffix("").flag("+mabi=n32").flag("-mabi=n64");
1312     auto N64 =
1313         makeMultilib("/lib64").osSuffix("").flag("-mabi=n32").flag("+mabi=n64");
1314 
1315     MtiMipsMultilibsV2 =
1316         MultilibSet()
1317             .Either({BeHard, BeSoft, ElHard, ElSoft, BeHardNan, ElHardNan,
1318                      BeHardNanUclibc, ElHardNanUclibc, BeHardUclibc,
1319                      ElHardUclibc, ElMicroHardNan, ElMicroSoft})
1320             .Either(O32, N32, N64)
1321             .FilterOut(NonExistent)
1322             .setIncludeDirsCallback([](const Multilib &M) {
1323               return std::vector<std::string>({"/../../../../sysroot" +
1324                                                M.includeSuffix() +
1325                                                "/../usr/include"});
1326             })
1327             .setFilePathsCallback([](const Multilib &M) {
1328               return std::vector<std::string>(
1329                   {"/../../../../mips-mti-linux-gnu/lib" + M.gccSuffix()});
1330             });
1331   }
1332   for (auto Candidate : {&MtiMipsMultilibsV1, &MtiMipsMultilibsV2}) {
1333     if (Candidate->select(Flags, Result.SelectedMultilib)) {
1334       Result.Multilibs = *Candidate;
1335       return true;
1336     }
1337   }
1338   return false;
1339 }
1340 
1341 static bool findMipsImgMultilibs(const Multilib::flags_list &Flags,
1342                                  FilterNonExistent &NonExistent,
1343                                  DetectedMultilibs &Result) {
1344   // CodeScape IMG toolchain v1.2 and early.
1345   MultilibSet ImgMultilibsV1;
1346   {
1347     auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
1348 
1349     auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
1350 
1351     auto MAbi64 =
1352         makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
1353 
1354     ImgMultilibsV1 =
1355         MultilibSet()
1356             .Maybe(Mips64r6)
1357             .Maybe(MAbi64)
1358             .Maybe(LittleEndian)
1359             .FilterOut(NonExistent)
1360             .setIncludeDirsCallback([](const Multilib &M) {
1361               return std::vector<std::string>(
1362                   {"/include", "/../../../../sysroot/usr/include"});
1363             });
1364   }
1365 
1366   // CodeScape IMG toolchain starting from v1.3.
1367   MultilibSet ImgMultilibsV2;
1368   {
1369     auto BeHard = makeMultilib("/mips-r6-hard")
1370                       .flag("+EB")
1371                       .flag("-msoft-float")
1372                       .flag("-mmicromips");
1373     auto BeSoft = makeMultilib("/mips-r6-soft")
1374                       .flag("+EB")
1375                       .flag("+msoft-float")
1376                       .flag("-mmicromips");
1377     auto ElHard = makeMultilib("/mipsel-r6-hard")
1378                       .flag("+EL")
1379                       .flag("-msoft-float")
1380                       .flag("-mmicromips");
1381     auto ElSoft = makeMultilib("/mipsel-r6-soft")
1382                       .flag("+EL")
1383                       .flag("+msoft-float")
1384                       .flag("-mmicromips");
1385     auto BeMicroHard = makeMultilib("/micromips-r6-hard")
1386                            .flag("+EB")
1387                            .flag("-msoft-float")
1388                            .flag("+mmicromips");
1389     auto BeMicroSoft = makeMultilib("/micromips-r6-soft")
1390                            .flag("+EB")
1391                            .flag("+msoft-float")
1392                            .flag("+mmicromips");
1393     auto ElMicroHard = makeMultilib("/micromipsel-r6-hard")
1394                            .flag("+EL")
1395                            .flag("-msoft-float")
1396                            .flag("+mmicromips");
1397     auto ElMicroSoft = makeMultilib("/micromipsel-r6-soft")
1398                            .flag("+EL")
1399                            .flag("+msoft-float")
1400                            .flag("+mmicromips");
1401 
1402     auto O32 =
1403         makeMultilib("/lib").osSuffix("").flag("-mabi=n32").flag("-mabi=n64");
1404     auto N32 =
1405         makeMultilib("/lib32").osSuffix("").flag("+mabi=n32").flag("-mabi=n64");
1406     auto N64 =
1407         makeMultilib("/lib64").osSuffix("").flag("-mabi=n32").flag("+mabi=n64");
1408 
1409     ImgMultilibsV2 =
1410         MultilibSet()
1411             .Either({BeHard, BeSoft, ElHard, ElSoft, BeMicroHard, BeMicroSoft,
1412                      ElMicroHard, ElMicroSoft})
1413             .Either(O32, N32, N64)
1414             .FilterOut(NonExistent)
1415             .setIncludeDirsCallback([](const Multilib &M) {
1416               return std::vector<std::string>({"/../../../../sysroot" +
1417                                                M.includeSuffix() +
1418                                                "/../usr/include"});
1419             })
1420             .setFilePathsCallback([](const Multilib &M) {
1421               return std::vector<std::string>(
1422                   {"/../../../../mips-img-linux-gnu/lib" + M.gccSuffix()});
1423             });
1424   }
1425   for (auto Candidate : {&ImgMultilibsV1, &ImgMultilibsV2}) {
1426     if (Candidate->select(Flags, Result.SelectedMultilib)) {
1427       Result.Multilibs = *Candidate;
1428       return true;
1429     }
1430   }
1431   return false;
1432 }
1433 
1434 bool clang::driver::findMIPSMultilibs(const Driver &D,
1435                                       const llvm::Triple &TargetTriple,
1436                                       StringRef Path, const ArgList &Args,
1437                                       DetectedMultilibs &Result) {
1438   FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
1439 
1440   StringRef CPUName;
1441   StringRef ABIName;
1442   tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
1443 
1444   llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1445 
1446   Multilib::flags_list Flags;
1447   addMultilibFlag(TargetTriple.isMIPS32(), "m32", Flags);
1448   addMultilibFlag(TargetTriple.isMIPS64(), "m64", Flags);
1449   addMultilibFlag(isMips16(Args), "mips16", Flags);
1450   addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
1451   addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
1452                       CPUName == "mips32r5" || CPUName == "p5600",
1453                   "march=mips32r2", Flags);
1454   addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
1455   addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
1456   addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
1457                       CPUName == "mips64r5" || CPUName == "octeon" ||
1458                       CPUName == "octeon+",
1459                   "march=mips64r2", Flags);
1460   addMultilibFlag(CPUName == "mips64r6", "march=mips64r6", Flags);
1461   addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
1462   addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
1463   addMultilibFlag(tools::mips::isNaN2008(D, Args, TargetTriple), "mnan=2008",
1464                   Flags);
1465   addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
1466   addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
1467   addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
1468   addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
1469   addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
1470   addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
1471 
1472   if (TargetTriple.isAndroid())
1473     return findMipsAndroidMultilibs(D.getVFS(), Path, Flags, NonExistent,
1474                                     Result);
1475 
1476   if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
1477       TargetTriple.getOS() == llvm::Triple::Linux &&
1478       TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
1479     return findMipsMuslMultilibs(Flags, NonExistent, Result);
1480 
1481   if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
1482       TargetTriple.getOS() == llvm::Triple::Linux &&
1483       TargetTriple.isGNUEnvironment())
1484     return findMipsMtiMultilibs(Flags, NonExistent, Result);
1485 
1486   if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1487       TargetTriple.getOS() == llvm::Triple::Linux &&
1488       TargetTriple.isGNUEnvironment())
1489     return findMipsImgMultilibs(Flags, NonExistent, Result);
1490 
1491   if (findMipsCsMultilibs(Flags, NonExistent, Result))
1492     return true;
1493 
1494   // Fallback to the regular toolchain-tree structure.
1495   Multilib Default;
1496   Result.Multilibs.push_back(Default);
1497   Result.Multilibs.FilterOut(NonExistent);
1498 
1499   if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
1500     Result.BiarchSibling = Multilib();
1501     return true;
1502   }
1503 
1504   return false;
1505 }
1506 
1507 static void findAndroidArmMultilibs(const Driver &D,
1508                                     const llvm::Triple &TargetTriple,
1509                                     StringRef Path, const ArgList &Args,
1510                                     DetectedMultilibs &Result) {
1511   // Find multilibs with subdirectories like armv7-a, thumb, armv7-a/thumb.
1512   FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
1513   Multilib ArmV7Multilib = makeMultilib("/armv7-a")
1514                                .flag("+march=armv7-a")
1515                                .flag("-mthumb");
1516   Multilib ThumbMultilib = makeMultilib("/thumb")
1517                                .flag("-march=armv7-a")
1518                                .flag("+mthumb");
1519   Multilib ArmV7ThumbMultilib = makeMultilib("/armv7-a/thumb")
1520                                .flag("+march=armv7-a")
1521                                .flag("+mthumb");
1522   Multilib DefaultMultilib = makeMultilib("")
1523                                .flag("-march=armv7-a")
1524                                .flag("-mthumb");
1525   MultilibSet AndroidArmMultilibs =
1526       MultilibSet()
1527           .Either(ThumbMultilib, ArmV7Multilib,
1528                   ArmV7ThumbMultilib, DefaultMultilib)
1529           .FilterOut(NonExistent);
1530 
1531   Multilib::flags_list Flags;
1532   llvm::StringRef Arch = Args.getLastArgValue(options::OPT_march_EQ);
1533   bool IsArmArch = TargetTriple.getArch() == llvm::Triple::arm;
1534   bool IsThumbArch = TargetTriple.getArch() == llvm::Triple::thumb;
1535   bool IsV7SubArch = TargetTriple.getSubArch() == llvm::Triple::ARMSubArch_v7;
1536   bool IsThumbMode = IsThumbArch ||
1537       Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, false) ||
1538       (IsArmArch && llvm::ARM::parseArchISA(Arch) == llvm::ARM::ISAKind::THUMB);
1539   bool IsArmV7Mode = (IsArmArch || IsThumbArch) &&
1540       (llvm::ARM::parseArchVersion(Arch) == 7 ||
1541        (IsArmArch && Arch == "" && IsV7SubArch));
1542   addMultilibFlag(IsArmV7Mode, "march=armv7-a", Flags);
1543   addMultilibFlag(IsThumbMode, "mthumb", Flags);
1544 
1545   if (AndroidArmMultilibs.select(Flags, Result.SelectedMultilib))
1546     Result.Multilibs = AndroidArmMultilibs;
1547 }
1548 
1549 static bool findMSP430Multilibs(const Driver &D,
1550                                 const llvm::Triple &TargetTriple,
1551                                 StringRef Path, const ArgList &Args,
1552                                 DetectedMultilibs &Result) {
1553   FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
1554   Multilib WithoutExceptions = makeMultilib("/430").flag("-exceptions");
1555   Multilib WithExceptions = makeMultilib("/430/exceptions").flag("+exceptions");
1556 
1557   // FIXME: when clang starts to support msp430x ISA additional logic
1558   // to select between multilib must be implemented
1559   // Multilib MSP430xMultilib = makeMultilib("/large");
1560 
1561   Result.Multilibs.push_back(WithoutExceptions);
1562   Result.Multilibs.push_back(WithExceptions);
1563   Result.Multilibs.FilterOut(NonExistent);
1564 
1565   Multilib::flags_list Flags;
1566   addMultilibFlag(Args.hasFlag(options::OPT_fexceptions,
1567                                options::OPT_fno_exceptions, false),
1568                   "exceptions", Flags);
1569   if (Result.Multilibs.select(Flags, Result.SelectedMultilib))
1570     return true;
1571 
1572   return false;
1573 }
1574 
1575 static void findRISCVBareMetalMultilibs(const Driver &D,
1576                                         const llvm::Triple &TargetTriple,
1577                                         StringRef Path, const ArgList &Args,
1578                                         DetectedMultilibs &Result) {
1579   FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
1580   struct RiscvMultilib {
1581     StringRef march;
1582     StringRef mabi;
1583   };
1584   // currently only support the set of multilibs like riscv-gnu-toolchain does.
1585   // TODO: support MULTILIB_REUSE
1586   constexpr RiscvMultilib RISCVMultilibSet[] = {
1587       {"rv32i", "ilp32"},     {"rv32im", "ilp32"},     {"rv32iac", "ilp32"},
1588       {"rv32imac", "ilp32"},  {"rv32imafc", "ilp32f"}, {"rv64imac", "lp64"},
1589       {"rv64imafdc", "lp64d"}};
1590 
1591   std::vector<Multilib> Ms;
1592   for (auto Element : RISCVMultilibSet) {
1593     // multilib path rule is ${march}/${mabi}
1594     Ms.emplace_back(
1595         makeMultilib((Twine(Element.march) + "/" + Twine(Element.mabi)).str())
1596             .flag(Twine("+march=", Element.march).str())
1597             .flag(Twine("+mabi=", Element.mabi).str()));
1598   }
1599   MultilibSet RISCVMultilibs =
1600       MultilibSet()
1601           .Either(ArrayRef<Multilib>(Ms))
1602           .FilterOut(NonExistent)
1603           .setFilePathsCallback([](const Multilib &M) {
1604             return std::vector<std::string>(
1605                 {M.gccSuffix(),
1606                  "/../../../../riscv64-unknown-elf/lib" + M.gccSuffix(),
1607                  "/../../../../riscv32-unknown-elf/lib" + M.gccSuffix()});
1608           });
1609 
1610 
1611   Multilib::flags_list Flags;
1612   llvm::StringSet<> Added_ABIs;
1613   StringRef ABIName = tools::riscv::getRISCVABI(Args, TargetTriple);
1614   StringRef MArch = tools::riscv::getRISCVArch(Args, TargetTriple);
1615   for (auto Element : RISCVMultilibSet) {
1616     addMultilibFlag(MArch == Element.march,
1617                     Twine("march=", Element.march).str().c_str(), Flags);
1618     if (!Added_ABIs.count(Element.mabi)) {
1619       Added_ABIs.insert(Element.mabi);
1620       addMultilibFlag(ABIName == Element.mabi,
1621                       Twine("mabi=", Element.mabi).str().c_str(), Flags);
1622     }
1623   }
1624 
1625   if (RISCVMultilibs.select(Flags, Result.SelectedMultilib))
1626     Result.Multilibs = RISCVMultilibs;
1627 }
1628 
1629 static void findRISCVMultilibs(const Driver &D,
1630                                const llvm::Triple &TargetTriple, StringRef Path,
1631                                const ArgList &Args, DetectedMultilibs &Result) {
1632   if (TargetTriple.getOS() == llvm::Triple::UnknownOS)
1633     return findRISCVBareMetalMultilibs(D, TargetTriple, Path, Args, Result);
1634 
1635   FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
1636   Multilib Ilp32 = makeMultilib("lib32/ilp32").flag("+m32").flag("+mabi=ilp32");
1637   Multilib Ilp32f =
1638       makeMultilib("lib32/ilp32f").flag("+m32").flag("+mabi=ilp32f");
1639   Multilib Ilp32d =
1640       makeMultilib("lib32/ilp32d").flag("+m32").flag("+mabi=ilp32d");
1641   Multilib Lp64 = makeMultilib("lib64/lp64").flag("+m64").flag("+mabi=lp64");
1642   Multilib Lp64f = makeMultilib("lib64/lp64f").flag("+m64").flag("+mabi=lp64f");
1643   Multilib Lp64d = makeMultilib("lib64/lp64d").flag("+m64").flag("+mabi=lp64d");
1644   MultilibSet RISCVMultilibs =
1645       MultilibSet()
1646           .Either({Ilp32, Ilp32f, Ilp32d, Lp64, Lp64f, Lp64d})
1647           .FilterOut(NonExistent);
1648 
1649   Multilib::flags_list Flags;
1650   bool IsRV64 = TargetTriple.getArch() == llvm::Triple::riscv64;
1651   StringRef ABIName = tools::riscv::getRISCVABI(Args, TargetTriple);
1652 
1653   addMultilibFlag(!IsRV64, "m32", Flags);
1654   addMultilibFlag(IsRV64, "m64", Flags);
1655   addMultilibFlag(ABIName == "ilp32", "mabi=ilp32", Flags);
1656   addMultilibFlag(ABIName == "ilp32f", "mabi=ilp32f", Flags);
1657   addMultilibFlag(ABIName == "ilp32d", "mabi=ilp32d", Flags);
1658   addMultilibFlag(ABIName == "lp64", "mabi=lp64", Flags);
1659   addMultilibFlag(ABIName == "lp64f", "mabi=lp64f", Flags);
1660   addMultilibFlag(ABIName == "lp64d", "mabi=lp64d", Flags);
1661 
1662   if (RISCVMultilibs.select(Flags, Result.SelectedMultilib))
1663     Result.Multilibs = RISCVMultilibs;
1664 }
1665 
1666 static bool findBiarchMultilibs(const Driver &D,
1667                                 const llvm::Triple &TargetTriple,
1668                                 StringRef Path, const ArgList &Args,
1669                                 bool NeedsBiarchSuffix,
1670                                 DetectedMultilibs &Result) {
1671   Multilib Default;
1672 
1673   // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
1674   // in what would normally be GCCInstallPath and put the 64-bit
1675   // libs in a subdirectory named 64. The simple logic we follow is that
1676   // *if* there is a subdirectory of the right name with crtbegin.o in it,
1677   // we use that. If not, and if not a biarch triple alias, we look for
1678   // crtbegin.o without the subdirectory.
1679 
1680   StringRef Suff64 = "/64";
1681   // Solaris uses platform-specific suffixes instead of /64.
1682   if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1683     switch (TargetTriple.getArch()) {
1684     case llvm::Triple::x86:
1685     case llvm::Triple::x86_64:
1686       Suff64 = "/amd64";
1687       break;
1688     case llvm::Triple::sparc:
1689     case llvm::Triple::sparcv9:
1690       Suff64 = "/sparcv9";
1691       break;
1692     default:
1693       break;
1694     }
1695   }
1696 
1697   Multilib Alt64 = Multilib()
1698                        .gccSuffix(Suff64)
1699                        .includeSuffix(Suff64)
1700                        .flag("-m32")
1701                        .flag("+m64")
1702                        .flag("-mx32");
1703   Multilib Alt32 = Multilib()
1704                        .gccSuffix("/32")
1705                        .includeSuffix("/32")
1706                        .flag("+m32")
1707                        .flag("-m64")
1708                        .flag("-mx32");
1709   Multilib Altx32 = Multilib()
1710                         .gccSuffix("/x32")
1711                         .includeSuffix("/x32")
1712                         .flag("-m32")
1713                         .flag("-m64")
1714                         .flag("+mx32");
1715 
1716   // GCC toolchain for IAMCU doesn't have crtbegin.o, so look for libgcc.a.
1717   FilterNonExistent NonExistent(
1718       Path, TargetTriple.isOSIAMCU() ? "/libgcc.a" : "/crtbegin.o", D.getVFS());
1719 
1720   // Determine default multilib from: 32, 64, x32
1721   // Also handle cases such as 64 on 32, 32 on 64, etc.
1722   enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
1723   const bool IsX32 = TargetTriple.isX32();
1724   if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
1725     Want = WANT64;
1726   else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
1727     Want = WANT64;
1728   else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
1729     Want = WANT32;
1730   else {
1731     if (TargetTriple.isArch32Bit())
1732       Want = NeedsBiarchSuffix ? WANT64 : WANT32;
1733     else if (IsX32)
1734       Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
1735     else
1736       Want = NeedsBiarchSuffix ? WANT32 : WANT64;
1737   }
1738 
1739   if (Want == WANT32)
1740     Default.flag("+m32").flag("-m64").flag("-mx32");
1741   else if (Want == WANT64)
1742     Default.flag("-m32").flag("+m64").flag("-mx32");
1743   else if (Want == WANTX32)
1744     Default.flag("-m32").flag("-m64").flag("+mx32");
1745   else
1746     return false;
1747 
1748   Result.Multilibs.push_back(Default);
1749   Result.Multilibs.push_back(Alt64);
1750   Result.Multilibs.push_back(Alt32);
1751   Result.Multilibs.push_back(Altx32);
1752 
1753   Result.Multilibs.FilterOut(NonExistent);
1754 
1755   Multilib::flags_list Flags;
1756   addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
1757   addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
1758   addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
1759 
1760   if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
1761     return false;
1762 
1763   if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
1764       Result.SelectedMultilib == Altx32)
1765     Result.BiarchSibling = Default;
1766 
1767   return true;
1768 }
1769 
1770 /// Generic_GCC - A tool chain using the 'gcc' command to perform
1771 /// all subcommands; this relies on gcc translating the majority of
1772 /// command line options.
1773 
1774 /// Less-than for GCCVersion, implementing a Strict Weak Ordering.
1775 bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1776                                           int RHSPatch,
1777                                           StringRef RHSPatchSuffix) const {
1778   if (Major != RHSMajor)
1779     return Major < RHSMajor;
1780   if (Minor != RHSMinor)
1781     return Minor < RHSMinor;
1782   if (Patch != RHSPatch) {
1783     // Note that versions without a specified patch sort higher than those with
1784     // a patch.
1785     if (RHSPatch == -1)
1786       return true;
1787     if (Patch == -1)
1788       return false;
1789 
1790     // Otherwise just sort on the patch itself.
1791     return Patch < RHSPatch;
1792   }
1793   if (PatchSuffix != RHSPatchSuffix) {
1794     // Sort empty suffixes higher.
1795     if (RHSPatchSuffix.empty())
1796       return true;
1797     if (PatchSuffix.empty())
1798       return false;
1799 
1800     // Provide a lexicographic sort to make this a total ordering.
1801     return PatchSuffix < RHSPatchSuffix;
1802   }
1803 
1804   // The versions are equal.
1805   return false;
1806 }
1807 
1808 /// Parse a GCCVersion object out of a string of text.
1809 ///
1810 /// This is the primary means of forming GCCVersion objects.
1811 /*static*/
1812 Generic_GCC::GCCVersion Generic_GCC::GCCVersion::Parse(StringRef VersionText) {
1813   const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1814   std::pair<StringRef, StringRef> First = VersionText.split('.');
1815   std::pair<StringRef, StringRef> Second = First.second.split('.');
1816 
1817   GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1818   if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
1819     return BadVersion;
1820   GoodVersion.MajorStr = First.first.str();
1821   if (First.second.empty())
1822     return GoodVersion;
1823   StringRef MinorStr = Second.first;
1824   if (Second.second.empty()) {
1825     if (size_t EndNumber = MinorStr.find_first_not_of("0123456789")) {
1826       GoodVersion.PatchSuffix = std::string(MinorStr.substr(EndNumber));
1827       MinorStr = MinorStr.slice(0, EndNumber);
1828     }
1829   }
1830   if (MinorStr.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
1831     return BadVersion;
1832   GoodVersion.MinorStr = MinorStr.str();
1833 
1834   // First look for a number prefix and parse that if present. Otherwise just
1835   // stash the entire patch string in the suffix, and leave the number
1836   // unspecified. This covers versions strings such as:
1837   //   5        (handled above)
1838   //   4.4
1839   //   4.4-patched
1840   //   4.4.0
1841   //   4.4.x
1842   //   4.4.2-rc4
1843   //   4.4.x-patched
1844   // And retains any patch number it finds.
1845   StringRef PatchText = Second.second;
1846   if (!PatchText.empty()) {
1847     if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
1848       // Try to parse the number and any suffix.
1849       if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1850           GoodVersion.Patch < 0)
1851         return BadVersion;
1852       GoodVersion.PatchSuffix = std::string(PatchText.substr(EndNumber));
1853     }
1854   }
1855 
1856   return GoodVersion;
1857 }
1858 
1859 static llvm::StringRef getGCCToolchainDir(const ArgList &Args,
1860                                           llvm::StringRef SysRoot) {
1861   const Arg *A = Args.getLastArg(clang::driver::options::OPT_gcc_toolchain);
1862   if (A)
1863     return A->getValue();
1864 
1865   // If we have a SysRoot, ignore GCC_INSTALL_PREFIX.
1866   // GCC_INSTALL_PREFIX specifies the gcc installation for the default
1867   // sysroot and is likely not valid with a different sysroot.
1868   if (!SysRoot.empty())
1869     return "";
1870 
1871   return GCC_INSTALL_PREFIX;
1872 }
1873 
1874 /// Initialize a GCCInstallationDetector from the driver.
1875 ///
1876 /// This performs all of the autodetection and sets up the various paths.
1877 /// Once constructed, a GCCInstallationDetector is essentially immutable.
1878 ///
1879 /// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1880 /// should instead pull the target out of the driver. This is currently
1881 /// necessary because the driver doesn't store the final version of the target
1882 /// triple.
1883 void Generic_GCC::GCCInstallationDetector::init(
1884     const llvm::Triple &TargetTriple, const ArgList &Args,
1885     ArrayRef<std::string> ExtraTripleAliases) {
1886   llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1887                                          ? TargetTriple.get64BitArchVariant()
1888                                          : TargetTriple.get32BitArchVariant();
1889   // The library directories which may contain GCC installations.
1890   SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
1891   // The compatible GCC triples for this particular architecture.
1892   SmallVector<StringRef, 16> CandidateTripleAliases;
1893   SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
1894   CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1895                            CandidateTripleAliases, CandidateBiarchLibDirs,
1896                            CandidateBiarchTripleAliases);
1897 
1898   // Compute the set of prefixes for our search.
1899   SmallVector<std::string, 8> Prefixes;
1900   StringRef GCCToolchainDir = getGCCToolchainDir(Args, D.SysRoot);
1901   if (GCCToolchainDir != "") {
1902     if (GCCToolchainDir.back() == '/')
1903       GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
1904 
1905     Prefixes.push_back(std::string(GCCToolchainDir));
1906   } else {
1907     // If we have a SysRoot, try that first.
1908     if (!D.SysRoot.empty()) {
1909       Prefixes.push_back(D.SysRoot);
1910       AddDefaultGCCPrefixes(TargetTriple, Prefixes, D.SysRoot);
1911     }
1912 
1913     // Then look for gcc installed alongside clang.
1914     Prefixes.push_back(D.InstalledDir + "/..");
1915 
1916     // Next, look for prefix(es) that correspond to distribution-supplied gcc
1917     // installations.
1918     if (D.SysRoot.empty()) {
1919       // Typically /usr.
1920       AddDefaultGCCPrefixes(TargetTriple, Prefixes, D.SysRoot);
1921     }
1922 
1923     // Try to respect gcc-config on Gentoo if --gcc-toolchain is not provided.
1924     // This avoids accidentally enforcing the system GCC version when using a
1925     // custom toolchain.
1926     SmallVector<StringRef, 16> GentooTestTriples;
1927     // Try to match an exact triple as target triple first.
1928     // e.g. crossdev -S x86_64-gentoo-linux-gnu will install gcc libs for
1929     // x86_64-gentoo-linux-gnu. But "clang -target x86_64-gentoo-linux-gnu"
1930     // may pick the libraries for x86_64-pc-linux-gnu even when exact matching
1931     // triple x86_64-gentoo-linux-gnu is present.
1932     GentooTestTriples.push_back(TargetTriple.str());
1933     // Check rest of triples.
1934     GentooTestTriples.append(ExtraTripleAliases.begin(),
1935                              ExtraTripleAliases.end());
1936     GentooTestTriples.append(CandidateTripleAliases.begin(),
1937                              CandidateTripleAliases.end());
1938     if (ScanGentooConfigs(TargetTriple, Args, GentooTestTriples,
1939                           CandidateBiarchTripleAliases))
1940       return;
1941   }
1942 
1943   // Loop over the various components which exist and select the best GCC
1944   // installation available. GCC installs are ranked by version number.
1945   const GCCVersion VersionZero = GCCVersion::Parse("0.0.0");
1946   Version = VersionZero;
1947   for (const std::string &Prefix : Prefixes) {
1948     auto &VFS = D.getVFS();
1949     if (!VFS.exists(Prefix))
1950       continue;
1951     for (StringRef Suffix : CandidateLibDirs) {
1952       const std::string LibDir = Prefix + Suffix.str();
1953       if (!VFS.exists(LibDir))
1954         continue;
1955       // Maybe filter out <libdir>/gcc and <libdir>/gcc-cross.
1956       bool GCCDirExists = VFS.exists(LibDir + "/gcc");
1957       bool GCCCrossDirExists = VFS.exists(LibDir + "/gcc-cross");
1958       // Try to match the exact target triple first.
1959       ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, TargetTriple.str(),
1960                              false, GCCDirExists, GCCCrossDirExists);
1961       // Try rest of possible triples.
1962       for (StringRef Candidate : ExtraTripleAliases) // Try these first.
1963         ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate, false,
1964                                GCCDirExists, GCCCrossDirExists);
1965       for (StringRef Candidate : CandidateTripleAliases)
1966         ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate, false,
1967                                GCCDirExists, GCCCrossDirExists);
1968     }
1969     for (StringRef Suffix : CandidateBiarchLibDirs) {
1970       const std::string LibDir = Prefix + Suffix.str();
1971       if (!VFS.exists(LibDir))
1972         continue;
1973       bool GCCDirExists = VFS.exists(LibDir + "/gcc");
1974       bool GCCCrossDirExists = VFS.exists(LibDir + "/gcc-cross");
1975       for (StringRef Candidate : CandidateBiarchTripleAliases)
1976         ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate, true,
1977                                GCCDirExists, GCCCrossDirExists);
1978     }
1979 
1980     // Skip other prefixes once a GCC installation is found.
1981     if (Version > VersionZero)
1982       break;
1983   }
1984 }
1985 
1986 void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
1987   for (const auto &InstallPath : CandidateGCCInstallPaths)
1988     OS << "Found candidate GCC installation: " << InstallPath << "\n";
1989 
1990   if (!GCCInstallPath.empty())
1991     OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1992 
1993   for (const auto &Multilib : Multilibs)
1994     OS << "Candidate multilib: " << Multilib << "\n";
1995 
1996   if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1997     OS << "Selected multilib: " << SelectedMultilib << "\n";
1998 }
1999 
2000 bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
2001   if (BiarchSibling.hasValue()) {
2002     M = BiarchSibling.getValue();
2003     return true;
2004   }
2005   return false;
2006 }
2007 
2008 void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
2009     const llvm::Triple &TargetTriple, SmallVectorImpl<std::string> &Prefixes,
2010     StringRef SysRoot) {
2011   if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2012     // Solaris is a special case.
2013     // The GCC installation is under
2014     //   /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/
2015     // so we need to find those /usr/gcc/*/lib/gcc libdirs and go with
2016     // /usr/gcc/<version> as a prefix.
2017 
2018     std::string PrefixDir = SysRoot.str() + "/usr/gcc";
2019     std::error_code EC;
2020     for (llvm::vfs::directory_iterator LI = D.getVFS().dir_begin(PrefixDir, EC),
2021                                        LE;
2022          !EC && LI != LE; LI = LI.increment(EC)) {
2023       StringRef VersionText = llvm::sys::path::filename(LI->path());
2024       GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2025 
2026       // Filter out obviously bad entries.
2027       if (CandidateVersion.Major == -1 || CandidateVersion.isOlderThan(4, 1, 1))
2028         continue;
2029 
2030       std::string CandidatePrefix = PrefixDir + "/" + VersionText.str();
2031       std::string CandidateLibPath = CandidatePrefix + "/lib/gcc";
2032       if (!D.getVFS().exists(CandidateLibPath))
2033         continue;
2034 
2035       Prefixes.push_back(CandidatePrefix);
2036     }
2037     return;
2038   }
2039 
2040   // Non-Solaris is much simpler - most systems just go with "/usr".
2041   if (SysRoot.empty() && TargetTriple.getOS() == llvm::Triple::Linux) {
2042     // Yet, still look for RHEL/CentOS devtoolsets and gcc-toolsets.
2043     Prefixes.push_back("/opt/rh/gcc-toolset-10/root/usr");
2044     Prefixes.push_back("/opt/rh/devtoolset-10/root/usr");
2045     Prefixes.push_back("/opt/rh/devtoolset-9/root/usr");
2046     Prefixes.push_back("/opt/rh/devtoolset-8/root/usr");
2047     Prefixes.push_back("/opt/rh/devtoolset-7/root/usr");
2048     Prefixes.push_back("/opt/rh/devtoolset-6/root/usr");
2049     Prefixes.push_back("/opt/rh/devtoolset-4/root/usr");
2050     Prefixes.push_back("/opt/rh/devtoolset-3/root/usr");
2051     Prefixes.push_back("/opt/rh/devtoolset-2/root/usr");
2052   }
2053   Prefixes.push_back(SysRoot.str() + "/usr");
2054 }
2055 
2056 /*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
2057     const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
2058     SmallVectorImpl<StringRef> &LibDirs,
2059     SmallVectorImpl<StringRef> &TripleAliases,
2060     SmallVectorImpl<StringRef> &BiarchLibDirs,
2061     SmallVectorImpl<StringRef> &BiarchTripleAliases) {
2062   // Declare a bunch of static data sets that we'll select between below. These
2063   // are specifically designed to always refer to string literals to avoid any
2064   // lifetime or initialization issues.
2065   //
2066   // The *Triples variables hard code some triples so that, for example,
2067   // --target=aarch64 (incomplete triple) can detect lib/aarch64-linux-gnu.
2068   // They are not needed when the user has correct LLVM_DEFAULT_TARGET_TRIPLE
2069   // and always uses the full --target (e.g. --target=aarch64-linux-gnu).  The
2070   // lists should shrink over time. Please don't add more elements to *Triples.
2071   static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
2072   static const char *const AArch64Triples[] = {
2073       "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-redhat-linux",
2074       "aarch64-suse-linux"};
2075   static const char *const AArch64beLibDirs[] = {"/lib"};
2076   static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
2077                                                  "aarch64_be-linux-gnu"};
2078 
2079   static const char *const ARMLibDirs[] = {"/lib"};
2080   static const char *const ARMTriples[] = {"arm-linux-gnueabi"};
2081   static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
2082                                              "armv7hl-redhat-linux-gnueabi",
2083                                              "armv6hl-suse-linux-gnueabi",
2084                                              "armv7hl-suse-linux-gnueabi"};
2085   static const char *const ARMebLibDirs[] = {"/lib"};
2086   static const char *const ARMebTriples[] = {"armeb-linux-gnueabi"};
2087   static const char *const ARMebHFTriples[] = {
2088       "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
2089 
2090   static const char *const AVRLibDirs[] = {"/lib"};
2091   static const char *const AVRTriples[] = {"avr"};
2092 
2093   static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
2094   static const char *const X86_64Triples[] = {
2095       "x86_64-linux-gnu",       "x86_64-unknown-linux-gnu",
2096       "x86_64-pc-linux-gnu",    "x86_64-redhat-linux6E",
2097       "x86_64-redhat-linux",    "x86_64-suse-linux",
2098       "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
2099       "x86_64-slackware-linux", "x86_64-unknown-linux",
2100       "x86_64-amazon-linux"};
2101   static const char *const X32Triples[] = {"x86_64-linux-gnux32",
2102                                            "x86_64-pc-linux-gnux32"};
2103   static const char *const X32LibDirs[] = {"/libx32", "/lib"};
2104   static const char *const X86LibDirs[] = {"/lib32", "/lib"};
2105   static const char *const X86Triples[] = {
2106       "i586-linux-gnu",      "i686-linux-gnu",        "i686-pc-linux-gnu",
2107       "i386-redhat-linux6E", "i686-redhat-linux",     "i386-redhat-linux",
2108       "i586-suse-linux",     "i686-montavista-linux", "i686-gnu",
2109   };
2110 
2111   static const char *const M68kLibDirs[] = {"/lib"};
2112   static const char *const M68kTriples[] = {
2113       "m68k-linux-gnu", "m68k-unknown-linux-gnu", "m68k-suse-linux"};
2114 
2115   static const char *const MIPSLibDirs[] = {"/libo32", "/lib"};
2116   static const char *const MIPSTriples[] = {
2117       "mips-linux-gnu", "mips-mti-linux", "mips-mti-linux-gnu",
2118       "mips-img-linux-gnu", "mipsisa32r6-linux-gnu"};
2119   static const char *const MIPSELLibDirs[] = {"/libo32", "/lib"};
2120   static const char *const MIPSELTriples[] = {
2121       "mipsel-linux-gnu", "mips-img-linux-gnu", "mipsisa32r6el-linux-gnu"};
2122 
2123   static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
2124   static const char *const MIPS64Triples[] = {
2125       "mips64-linux-gnu",      "mips-mti-linux-gnu",
2126       "mips-img-linux-gnu",    "mips64-linux-gnuabi64",
2127       "mipsisa64r6-linux-gnu", "mipsisa64r6-linux-gnuabi64"};
2128   static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
2129   static const char *const MIPS64ELTriples[] = {
2130       "mips64el-linux-gnu",      "mips-mti-linux-gnu",
2131       "mips-img-linux-gnu",      "mips64el-linux-gnuabi64",
2132       "mipsisa64r6el-linux-gnu", "mipsisa64r6el-linux-gnuabi64"};
2133 
2134   static const char *const MIPSN32LibDirs[] = {"/lib32"};
2135   static const char *const MIPSN32Triples[] = {"mips64-linux-gnuabin32",
2136                                                "mipsisa64r6-linux-gnuabin32"};
2137   static const char *const MIPSN32ELLibDirs[] = {"/lib32"};
2138   static const char *const MIPSN32ELTriples[] = {
2139       "mips64el-linux-gnuabin32", "mipsisa64r6el-linux-gnuabin32"};
2140 
2141   static const char *const MSP430LibDirs[] = {"/lib"};
2142   static const char *const MSP430Triples[] = {"msp430-elf"};
2143 
2144   static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
2145   static const char *const PPCTriples[] = {
2146       "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
2147       // On 32-bit PowerPC systems running SUSE Linux, gcc is configured as a
2148       // 64-bit compiler which defaults to "-m32", hence "powerpc64-suse-linux".
2149       "powerpc64-suse-linux", "powerpc-montavista-linuxspe"};
2150   static const char *const PPCLELibDirs[] = {"/lib32", "/lib"};
2151   static const char *const PPCLETriples[] = {"powerpcle-linux-gnu",
2152                                              "powerpcle-unknown-linux-gnu",
2153                                              "powerpcle-linux-musl"};
2154 
2155   static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
2156   static const char *const PPC64Triples[] = {
2157       "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
2158       "powerpc64-suse-linux", "ppc64-redhat-linux"};
2159   static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
2160   static const char *const PPC64LETriples[] = {
2161       "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
2162       "powerpc64le-none-linux-gnu", "powerpc64le-suse-linux",
2163       "ppc64le-redhat-linux"};
2164 
2165   static const char *const RISCV32LibDirs[] = {"/lib32", "/lib"};
2166   static const char *const RISCV32Triples[] = {"riscv32-unknown-linux-gnu",
2167                                                "riscv32-linux-gnu",
2168                                                "riscv32-unknown-elf"};
2169   static const char *const RISCV64LibDirs[] = {"/lib64", "/lib"};
2170   static const char *const RISCV64Triples[] = {"riscv64-unknown-linux-gnu",
2171                                                "riscv64-linux-gnu",
2172                                                "riscv64-unknown-elf"};
2173 
2174   static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
2175   static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
2176                                                "sparcv8-linux-gnu"};
2177   static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
2178   static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
2179                                                "sparcv9-linux-gnu"};
2180 
2181   static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
2182   static const char *const SystemZTriples[] = {
2183       "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
2184       "s390x-suse-linux", "s390x-redhat-linux"};
2185 
2186 
2187   using std::begin;
2188   using std::end;
2189 
2190   if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2191     static const char *const SolarisLibDirs[] = {"/lib"};
2192     static const char *const SolarisSparcV8Triples[] = {
2193         "sparc-sun-solaris2.11", "sparc-sun-solaris2.12"};
2194     static const char *const SolarisSparcV9Triples[] = {
2195         "sparcv9-sun-solaris2.11", "sparcv9-sun-solaris2.12"};
2196     static const char *const SolarisX86Triples[] = {"i386-pc-solaris2.11",
2197                                                     "i386-pc-solaris2.12"};
2198     static const char *const SolarisX86_64Triples[] = {"x86_64-pc-solaris2.11",
2199                                                        "x86_64-pc-solaris2.12"};
2200     LibDirs.append(begin(SolarisLibDirs), end(SolarisLibDirs));
2201     BiarchLibDirs.append(begin(SolarisLibDirs), end(SolarisLibDirs));
2202     switch (TargetTriple.getArch()) {
2203     case llvm::Triple::x86:
2204       TripleAliases.append(begin(SolarisX86Triples), end(SolarisX86Triples));
2205       BiarchTripleAliases.append(begin(SolarisX86_64Triples),
2206                                  end(SolarisX86_64Triples));
2207       break;
2208     case llvm::Triple::x86_64:
2209       TripleAliases.append(begin(SolarisX86_64Triples),
2210                            end(SolarisX86_64Triples));
2211       BiarchTripleAliases.append(begin(SolarisX86Triples),
2212                                  end(SolarisX86Triples));
2213       break;
2214     case llvm::Triple::sparc:
2215       TripleAliases.append(begin(SolarisSparcV8Triples),
2216                            end(SolarisSparcV8Triples));
2217       BiarchTripleAliases.append(begin(SolarisSparcV9Triples),
2218                                  end(SolarisSparcV9Triples));
2219       break;
2220     case llvm::Triple::sparcv9:
2221       TripleAliases.append(begin(SolarisSparcV9Triples),
2222                            end(SolarisSparcV9Triples));
2223       BiarchTripleAliases.append(begin(SolarisSparcV8Triples),
2224                                  end(SolarisSparcV8Triples));
2225       break;
2226     default:
2227       break;
2228     }
2229     return;
2230   }
2231 
2232   // Android targets should not use GNU/Linux tools or libraries.
2233   if (TargetTriple.isAndroid()) {
2234     static const char *const AArch64AndroidTriples[] = {
2235         "aarch64-linux-android"};
2236     static const char *const ARMAndroidTriples[] = {"arm-linux-androideabi"};
2237     static const char *const MIPSELAndroidTriples[] = {"mipsel-linux-android"};
2238     static const char *const MIPS64ELAndroidTriples[] = {
2239         "mips64el-linux-android"};
2240     static const char *const X86AndroidTriples[] = {"i686-linux-android"};
2241     static const char *const X86_64AndroidTriples[] = {"x86_64-linux-android"};
2242 
2243     switch (TargetTriple.getArch()) {
2244     case llvm::Triple::aarch64:
2245       LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
2246       TripleAliases.append(begin(AArch64AndroidTriples),
2247                            end(AArch64AndroidTriples));
2248       break;
2249     case llvm::Triple::arm:
2250     case llvm::Triple::thumb:
2251       LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
2252       TripleAliases.append(begin(ARMAndroidTriples), end(ARMAndroidTriples));
2253       break;
2254     case llvm::Triple::mipsel:
2255       LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
2256       TripleAliases.append(begin(MIPSELAndroidTriples),
2257                            end(MIPSELAndroidTriples));
2258       BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
2259       BiarchTripleAliases.append(begin(MIPS64ELAndroidTriples),
2260                                  end(MIPS64ELAndroidTriples));
2261       break;
2262     case llvm::Triple::mips64el:
2263       LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
2264       TripleAliases.append(begin(MIPS64ELAndroidTriples),
2265                            end(MIPS64ELAndroidTriples));
2266       BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
2267       BiarchTripleAliases.append(begin(MIPSELAndroidTriples),
2268                                  end(MIPSELAndroidTriples));
2269       break;
2270     case llvm::Triple::x86_64:
2271       LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
2272       TripleAliases.append(begin(X86_64AndroidTriples),
2273                            end(X86_64AndroidTriples));
2274       BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
2275       BiarchTripleAliases.append(begin(X86AndroidTriples),
2276                                  end(X86AndroidTriples));
2277       break;
2278     case llvm::Triple::x86:
2279       LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
2280       TripleAliases.append(begin(X86AndroidTriples), end(X86AndroidTriples));
2281       BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
2282       BiarchTripleAliases.append(begin(X86_64AndroidTriples),
2283                                  end(X86_64AndroidTriples));
2284       break;
2285     default:
2286       break;
2287     }
2288 
2289     return;
2290   }
2291 
2292   switch (TargetTriple.getArch()) {
2293   case llvm::Triple::aarch64:
2294     LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
2295     TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
2296     BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
2297     BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
2298     break;
2299   case llvm::Triple::aarch64_be:
2300     LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
2301     TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
2302     BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
2303     BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
2304     break;
2305   case llvm::Triple::arm:
2306   case llvm::Triple::thumb:
2307     LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
2308     if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
2309       TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
2310     } else {
2311       TripleAliases.append(begin(ARMTriples), end(ARMTriples));
2312     }
2313     break;
2314   case llvm::Triple::armeb:
2315   case llvm::Triple::thumbeb:
2316     LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
2317     if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
2318       TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
2319     } else {
2320       TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
2321     }
2322     break;
2323   case llvm::Triple::avr:
2324     LibDirs.append(begin(AVRLibDirs), end(AVRLibDirs));
2325     TripleAliases.append(begin(AVRTriples), end(AVRTriples));
2326     break;
2327   case llvm::Triple::x86_64:
2328     if (TargetTriple.isX32()) {
2329       LibDirs.append(begin(X32LibDirs), end(X32LibDirs));
2330       TripleAliases.append(begin(X32Triples), end(X32Triples));
2331       BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
2332       BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
2333     } else {
2334       LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
2335       TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
2336       BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
2337       BiarchTripleAliases.append(begin(X32Triples), end(X32Triples));
2338     }
2339     BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
2340     BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
2341     break;
2342   case llvm::Triple::x86:
2343     LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
2344     // MCU toolchain is 32 bit only and its triple alias is TargetTriple
2345     // itself, which will be appended below.
2346     if (!TargetTriple.isOSIAMCU()) {
2347       TripleAliases.append(begin(X86Triples), end(X86Triples));
2348       BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
2349       BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
2350       BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
2351       BiarchTripleAliases.append(begin(X32Triples), end(X32Triples));
2352     }
2353     break;
2354   case llvm::Triple::m68k:
2355     LibDirs.append(begin(M68kLibDirs), end(M68kLibDirs));
2356     TripleAliases.append(begin(M68kTriples), end(M68kTriples));
2357     break;
2358   case llvm::Triple::mips:
2359     LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
2360     TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
2361     BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
2362     BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
2363     BiarchLibDirs.append(begin(MIPSN32LibDirs), end(MIPSN32LibDirs));
2364     BiarchTripleAliases.append(begin(MIPSN32Triples), end(MIPSN32Triples));
2365     break;
2366   case llvm::Triple::mipsel:
2367     LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
2368     TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
2369     TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
2370     BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
2371     BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
2372     BiarchLibDirs.append(begin(MIPSN32ELLibDirs), end(MIPSN32ELLibDirs));
2373     BiarchTripleAliases.append(begin(MIPSN32ELTriples), end(MIPSN32ELTriples));
2374     break;
2375   case llvm::Triple::mips64:
2376     LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
2377     TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
2378     BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
2379     BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
2380     BiarchLibDirs.append(begin(MIPSN32LibDirs), end(MIPSN32LibDirs));
2381     BiarchTripleAliases.append(begin(MIPSN32Triples), end(MIPSN32Triples));
2382     break;
2383   case llvm::Triple::mips64el:
2384     LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
2385     TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
2386     BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
2387     BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
2388     BiarchLibDirs.append(begin(MIPSN32ELLibDirs), end(MIPSN32ELLibDirs));
2389     BiarchTripleAliases.append(begin(MIPSN32ELTriples), end(MIPSN32ELTriples));
2390     BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
2391     break;
2392   case llvm::Triple::msp430:
2393     LibDirs.append(begin(MSP430LibDirs), end(MSP430LibDirs));
2394     TripleAliases.append(begin(MSP430Triples), end(MSP430Triples));
2395     break;
2396   case llvm::Triple::ppc:
2397     LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
2398     TripleAliases.append(begin(PPCTriples), end(PPCTriples));
2399     BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
2400     BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
2401     break;
2402   case llvm::Triple::ppcle:
2403     LibDirs.append(begin(PPCLELibDirs), end(PPCLELibDirs));
2404     TripleAliases.append(begin(PPCLETriples), end(PPCLETriples));
2405     BiarchLibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
2406     BiarchTripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
2407     break;
2408   case llvm::Triple::ppc64:
2409     LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
2410     TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
2411     BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
2412     BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
2413     break;
2414   case llvm::Triple::ppc64le:
2415     LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
2416     TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
2417     BiarchLibDirs.append(begin(PPCLELibDirs), end(PPCLELibDirs));
2418     BiarchTripleAliases.append(begin(PPCLETriples), end(PPCLETriples));
2419     break;
2420   case llvm::Triple::riscv32:
2421     LibDirs.append(begin(RISCV32LibDirs), end(RISCV32LibDirs));
2422     TripleAliases.append(begin(RISCV32Triples), end(RISCV32Triples));
2423     BiarchLibDirs.append(begin(RISCV64LibDirs), end(RISCV64LibDirs));
2424     BiarchTripleAliases.append(begin(RISCV64Triples), end(RISCV64Triples));
2425     break;
2426   case llvm::Triple::riscv64:
2427     LibDirs.append(begin(RISCV64LibDirs), end(RISCV64LibDirs));
2428     TripleAliases.append(begin(RISCV64Triples), end(RISCV64Triples));
2429     BiarchLibDirs.append(begin(RISCV32LibDirs), end(RISCV32LibDirs));
2430     BiarchTripleAliases.append(begin(RISCV32Triples), end(RISCV32Triples));
2431     break;
2432   case llvm::Triple::sparc:
2433   case llvm::Triple::sparcel:
2434     LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
2435     TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
2436     BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
2437     BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
2438     break;
2439   case llvm::Triple::sparcv9:
2440     LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
2441     TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
2442     BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
2443     BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
2444     break;
2445   case llvm::Triple::systemz:
2446     LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
2447     TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
2448     break;
2449   default:
2450     // By default, just rely on the standard lib directories and the original
2451     // triple.
2452     break;
2453   }
2454 
2455   // Always append the drivers target triple to the end, in case it doesn't
2456   // match any of our aliases.
2457   TripleAliases.push_back(TargetTriple.str());
2458 
2459   // Also include the multiarch variant if it's different.
2460   if (TargetTriple.str() != BiarchTriple.str())
2461     BiarchTripleAliases.push_back(BiarchTriple.str());
2462 }
2463 
2464 bool Generic_GCC::GCCInstallationDetector::ScanGCCForMultilibs(
2465     const llvm::Triple &TargetTriple, const ArgList &Args,
2466     StringRef Path, bool NeedsBiarchSuffix) {
2467   llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2468   DetectedMultilibs Detected;
2469 
2470   // Android standalone toolchain could have multilibs for ARM and Thumb.
2471   // Debian mips multilibs behave more like the rest of the biarch ones,
2472   // so handle them there
2473   if (isArmOrThumbArch(TargetArch) && TargetTriple.isAndroid()) {
2474     // It should also work without multilibs in a simplified toolchain.
2475     findAndroidArmMultilibs(D, TargetTriple, Path, Args, Detected);
2476   } else if (TargetTriple.isMIPS()) {
2477     if (!findMIPSMultilibs(D, TargetTriple, Path, Args, Detected))
2478       return false;
2479   } else if (TargetTriple.isRISCV()) {
2480     findRISCVMultilibs(D, TargetTriple, Path, Args, Detected);
2481   } else if (isMSP430(TargetArch)) {
2482     findMSP430Multilibs(D, TargetTriple, Path, Args, Detected);
2483   } else if (TargetArch == llvm::Triple::avr) {
2484     // AVR has no multilibs.
2485   } else if (!findBiarchMultilibs(D, TargetTriple, Path, Args,
2486                                   NeedsBiarchSuffix, Detected)) {
2487     return false;
2488   }
2489 
2490   Multilibs = Detected.Multilibs;
2491   SelectedMultilib = Detected.SelectedMultilib;
2492   BiarchSibling = Detected.BiarchSibling;
2493 
2494   return true;
2495 }
2496 
2497 void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
2498     const llvm::Triple &TargetTriple, const ArgList &Args,
2499     const std::string &LibDir, StringRef CandidateTriple,
2500     bool NeedsBiarchSuffix, bool GCCDirExists, bool GCCCrossDirExists) {
2501   // Locations relative to the system lib directory where GCC's triple-specific
2502   // directories might reside.
2503   struct GCCLibSuffix {
2504     // Path from system lib directory to GCC triple-specific directory.
2505     std::string LibSuffix;
2506     // Path from GCC triple-specific directory back to system lib directory.
2507     // This is one '..' component per component in LibSuffix.
2508     StringRef ReversePath;
2509     // Whether this library suffix is relevant for the triple.
2510     bool Active;
2511   } Suffixes[] = {
2512       // This is the normal place.
2513       {"gcc/" + CandidateTriple.str(), "../..", GCCDirExists},
2514 
2515       // Debian puts cross-compilers in gcc-cross.
2516       {"gcc-cross/" + CandidateTriple.str(), "../..", GCCCrossDirExists},
2517 
2518       // The Freescale PPC SDK has the gcc libraries in
2519       // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well. Only do
2520       // this on Freescale triples, though, since some systems put a *lot* of
2521       // files in that location, not just GCC installation data.
2522       {CandidateTriple.str(), "..",
2523        TargetTriple.getVendor() == llvm::Triple::Freescale ||
2524            TargetTriple.getVendor() == llvm::Triple::OpenEmbedded}};
2525 
2526   for (auto &Suffix : Suffixes) {
2527     if (!Suffix.Active)
2528       continue;
2529 
2530     StringRef LibSuffix = Suffix.LibSuffix;
2531     std::error_code EC;
2532     for (llvm::vfs::directory_iterator
2533              LI = D.getVFS().dir_begin(LibDir + "/" + LibSuffix, EC),
2534              LE;
2535          !EC && LI != LE; LI = LI.increment(EC)) {
2536       StringRef VersionText = llvm::sys::path::filename(LI->path());
2537       GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2538       if (CandidateVersion.Major != -1) // Filter obviously bad entries.
2539         if (!CandidateGCCInstallPaths.insert(std::string(LI->path())).second)
2540           continue; // Saw this path before; no need to look at it again.
2541       if (CandidateVersion.isOlderThan(4, 1, 1))
2542         continue;
2543       if (CandidateVersion <= Version)
2544         continue;
2545 
2546       if (!ScanGCCForMultilibs(TargetTriple, Args, LI->path(),
2547                                NeedsBiarchSuffix))
2548         continue;
2549 
2550       Version = CandidateVersion;
2551       GCCTriple.setTriple(CandidateTriple);
2552       // FIXME: We hack together the directory name here instead of
2553       // using LI to ensure stable path separators across Windows and
2554       // Linux.
2555       GCCInstallPath = (LibDir + "/" + LibSuffix + "/" + VersionText).str();
2556       GCCParentLibPath = (GCCInstallPath + "/../" + Suffix.ReversePath).str();
2557       IsValid = true;
2558     }
2559   }
2560 }
2561 
2562 bool Generic_GCC::GCCInstallationDetector::ScanGentooConfigs(
2563     const llvm::Triple &TargetTriple, const ArgList &Args,
2564     const SmallVectorImpl<StringRef> &CandidateTriples,
2565     const SmallVectorImpl<StringRef> &CandidateBiarchTriples) {
2566   if (!D.getVFS().exists(D.SysRoot + GentooConfigDir))
2567     return false;
2568 
2569   for (StringRef CandidateTriple : CandidateTriples) {
2570     if (ScanGentooGccConfig(TargetTriple, Args, CandidateTriple))
2571       return true;
2572   }
2573 
2574   for (StringRef CandidateTriple : CandidateBiarchTriples) {
2575     if (ScanGentooGccConfig(TargetTriple, Args, CandidateTriple, true))
2576       return true;
2577   }
2578   return false;
2579 }
2580 
2581 bool Generic_GCC::GCCInstallationDetector::ScanGentooGccConfig(
2582     const llvm::Triple &TargetTriple, const ArgList &Args,
2583     StringRef CandidateTriple, bool NeedsBiarchSuffix) {
2584   llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
2585       D.getVFS().getBufferForFile(D.SysRoot + GentooConfigDir + "/config-" +
2586                                   CandidateTriple.str());
2587   if (File) {
2588     SmallVector<StringRef, 2> Lines;
2589     File.get()->getBuffer().split(Lines, "\n");
2590     for (StringRef Line : Lines) {
2591       Line = Line.trim();
2592       // CURRENT=triple-version
2593       if (!Line.consume_front("CURRENT="))
2594         continue;
2595       // Process the config file pointed to by CURRENT.
2596       llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> ConfigFile =
2597           D.getVFS().getBufferForFile(D.SysRoot + GentooConfigDir + "/" +
2598                                       Line.str());
2599       std::pair<StringRef, StringRef> ActiveVersion = Line.rsplit('-');
2600       // List of paths to scan for libraries.
2601       SmallVector<StringRef, 4> GentooScanPaths;
2602       // Scan the Config file to find installed GCC libraries path.
2603       // Typical content of the GCC config file:
2604       // LDPATH="/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.x:/usr/lib/gcc/
2605       // (continued from previous line) x86_64-pc-linux-gnu/4.9.x/32"
2606       // MANPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/4.9.x/man"
2607       // INFOPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/4.9.x/info"
2608       // STDCXX_INCDIR="/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.x/include/g++-v4"
2609       // We are looking for the paths listed in LDPATH=... .
2610       if (ConfigFile) {
2611         SmallVector<StringRef, 2> ConfigLines;
2612         ConfigFile.get()->getBuffer().split(ConfigLines, "\n");
2613         for (StringRef ConfLine : ConfigLines) {
2614           ConfLine = ConfLine.trim();
2615           if (ConfLine.consume_front("LDPATH=")) {
2616             // Drop '"' from front and back if present.
2617             ConfLine.consume_back("\"");
2618             ConfLine.consume_front("\"");
2619             // Get all paths sperated by ':'
2620             ConfLine.split(GentooScanPaths, ':', -1, /*AllowEmpty*/ false);
2621           }
2622         }
2623       }
2624       // Test the path based on the version in /etc/env.d/gcc/config-{tuple}.
2625       std::string basePath = "/usr/lib/gcc/" + ActiveVersion.first.str() + "/"
2626           + ActiveVersion.second.str();
2627       GentooScanPaths.push_back(StringRef(basePath));
2628 
2629       // Scan all paths for GCC libraries.
2630       for (const auto &GentooScanPath : GentooScanPaths) {
2631         std::string GentooPath = D.SysRoot + std::string(GentooScanPath);
2632         if (D.getVFS().exists(GentooPath + "/crtbegin.o")) {
2633           if (!ScanGCCForMultilibs(TargetTriple, Args, GentooPath,
2634                                    NeedsBiarchSuffix))
2635             continue;
2636 
2637           Version = GCCVersion::Parse(ActiveVersion.second);
2638           GCCInstallPath = GentooPath;
2639           GCCParentLibPath = GentooPath + std::string("/../../..");
2640           GCCTriple.setTriple(ActiveVersion.first);
2641           IsValid = true;
2642           return true;
2643         }
2644       }
2645     }
2646   }
2647 
2648   return false;
2649 }
2650 
2651 Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
2652                          const ArgList &Args)
2653     : ToolChain(D, Triple, Args), GCCInstallation(D),
2654       CudaInstallation(D, Triple, Args), RocmInstallation(D, Triple, Args) {
2655   getProgramPaths().push_back(getDriver().getInstalledDir());
2656   if (getDriver().getInstalledDir() != getDriver().Dir)
2657     getProgramPaths().push_back(getDriver().Dir);
2658 }
2659 
2660 Generic_GCC::~Generic_GCC() {}
2661 
2662 Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
2663   switch (AC) {
2664   case Action::PreprocessJobClass:
2665     if (!Preprocess)
2666       Preprocess.reset(new clang::driver::tools::gcc::Preprocessor(*this));
2667     return Preprocess.get();
2668   case Action::CompileJobClass:
2669     if (!Compile)
2670       Compile.reset(new tools::gcc::Compiler(*this));
2671     return Compile.get();
2672   default:
2673     return ToolChain::getTool(AC);
2674   }
2675 }
2676 
2677 Tool *Generic_GCC::buildAssembler() const {
2678   return new tools::gnutools::Assembler(*this);
2679 }
2680 
2681 Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
2682 
2683 void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2684   // Print the information about how we detected the GCC installation.
2685   GCCInstallation.print(OS);
2686   CudaInstallation.print(OS);
2687   RocmInstallation.print(OS);
2688 }
2689 
2690 bool Generic_GCC::IsUnwindTablesDefault(const ArgList &Args) const {
2691   switch (getArch()) {
2692   case llvm::Triple::aarch64:
2693   case llvm::Triple::ppc:
2694   case llvm::Triple::ppcle:
2695   case llvm::Triple::ppc64:
2696   case llvm::Triple::ppc64le:
2697   case llvm::Triple::x86:
2698   case llvm::Triple::x86_64:
2699     return true;
2700   default:
2701     return false;
2702   }
2703 }
2704 
2705 bool Generic_GCC::isPICDefault() const {
2706   switch (getArch()) {
2707   case llvm::Triple::x86_64:
2708     return getTriple().isOSWindows();
2709   case llvm::Triple::mips64:
2710   case llvm::Triple::mips64el:
2711     return true;
2712   default:
2713     return false;
2714   }
2715 }
2716 
2717 bool Generic_GCC::isPIEDefault(const llvm::opt::ArgList &Args) const {
2718   return false;
2719 }
2720 
2721 bool Generic_GCC::isPICDefaultForced() const {
2722   return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2723 }
2724 
2725 bool Generic_GCC::IsIntegratedAssemblerDefault() const {
2726   switch (getTriple().getArch()) {
2727   case llvm::Triple::x86:
2728   case llvm::Triple::x86_64:
2729   case llvm::Triple::aarch64:
2730   case llvm::Triple::aarch64_be:
2731   case llvm::Triple::arm:
2732   case llvm::Triple::armeb:
2733   case llvm::Triple::avr:
2734   case llvm::Triple::bpfel:
2735   case llvm::Triple::bpfeb:
2736   case llvm::Triple::thumb:
2737   case llvm::Triple::thumbeb:
2738   case llvm::Triple::ppc:
2739   case llvm::Triple::ppcle:
2740   case llvm::Triple::ppc64:
2741   case llvm::Triple::ppc64le:
2742   case llvm::Triple::riscv32:
2743   case llvm::Triple::riscv64:
2744   case llvm::Triple::systemz:
2745   case llvm::Triple::mips:
2746   case llvm::Triple::mipsel:
2747   case llvm::Triple::mips64:
2748   case llvm::Triple::mips64el:
2749   case llvm::Triple::msp430:
2750   case llvm::Triple::m68k:
2751     return true;
2752   case llvm::Triple::sparc:
2753   case llvm::Triple::sparcel:
2754   case llvm::Triple::sparcv9:
2755     if (getTriple().isOSFreeBSD() || getTriple().isOSOpenBSD() ||
2756         getTriple().isOSSolaris())
2757       return true;
2758     return false;
2759   default:
2760     return false;
2761   }
2762 }
2763 
2764 void Generic_GCC::PushPPaths(ToolChain::path_list &PPaths) {
2765   // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
2766   // least) put various tools in a triple-prefixed directory off of the parent
2767   // of the GCC installation. We use the GCC triple here to ensure that we end
2768   // up with tools that support the same amount of cross compiling as the
2769   // detected GCC installation. For example, if we find a GCC installation
2770   // targeting x86_64, but it is a bi-arch GCC installation, it can also be
2771   // used to target i386.
2772   if (GCCInstallation.isValid()) {
2773     PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
2774                            GCCInstallation.getTriple().str() + "/bin")
2775                          .str());
2776   }
2777 }
2778 
2779 void Generic_GCC::AddMultilibPaths(const Driver &D,
2780                                    const std::string &SysRoot,
2781                                    const std::string &OSLibDir,
2782                                    const std::string &MultiarchTriple,
2783                                    path_list &Paths) {
2784   // Add the multilib suffixed paths where they are available.
2785   if (GCCInstallation.isValid()) {
2786     const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
2787     const std::string &LibPath =
2788         std::string(GCCInstallation.getParentLibPath());
2789 
2790     // Sourcery CodeBench MIPS toolchain holds some libraries under
2791     // a biarch-like suffix of the GCC installation.
2792     if (const auto &PathsCallback = Multilibs.filePathsCallback())
2793       for (const auto &Path : PathsCallback(SelectedMultilib))
2794         addPathIfExists(D, GCCInstallation.getInstallPath() + Path, Paths);
2795 
2796     // Add lib/gcc/$triple/$version, with an optional /multilib suffix.
2797     addPathIfExists(
2798         D, GCCInstallation.getInstallPath() + SelectedMultilib.gccSuffix(),
2799         Paths);
2800 
2801     // GCC cross compiling toolchains will install target libraries which ship
2802     // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
2803     // any part of the GCC installation in
2804     // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
2805     // debatable, but is the reality today. We need to search this tree even
2806     // when we have a sysroot somewhere else. It is the responsibility of
2807     // whomever is doing the cross build targeting a sysroot using a GCC
2808     // installation that is *not* within the system root to ensure two things:
2809     //
2810     //  1) Any DSOs that are linked in from this tree or from the install path
2811     //     above must be present on the system root and found via an
2812     //     appropriate rpath.
2813     //  2) There must not be libraries installed into
2814     //     <prefix>/<triple>/<libdir> unless they should be preferred over
2815     //     those within the system root.
2816     //
2817     // Note that this matches the GCC behavior. See the below comment for where
2818     // Clang diverges from GCC's behavior.
2819     addPathIfExists(D,
2820                     LibPath + "/../" + GCCTriple.str() + "/lib/../" + OSLibDir +
2821                         SelectedMultilib.osSuffix(),
2822                     Paths);
2823 
2824     // If the GCC installation we found is inside of the sysroot, we want to
2825     // prefer libraries installed in the parent prefix of the GCC installation.
2826     // It is important to *not* use these paths when the GCC installation is
2827     // outside of the system root as that can pick up unintended libraries.
2828     // This usually happens when there is an external cross compiler on the
2829     // host system, and a more minimal sysroot available that is the target of
2830     // the cross. Note that GCC does include some of these directories in some
2831     // configurations but this seems somewhere between questionable and simply
2832     // a bug.
2833     if (StringRef(LibPath).startswith(SysRoot))
2834       addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
2835   }
2836 }
2837 
2838 void Generic_GCC::AddMultiarchPaths(const Driver &D,
2839                                     const std::string &SysRoot,
2840                                     const std::string &OSLibDir,
2841                                     path_list &Paths) {
2842   if (GCCInstallation.isValid()) {
2843     const std::string &LibPath =
2844         std::string(GCCInstallation.getParentLibPath());
2845     const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
2846     const Multilib &Multilib = GCCInstallation.getMultilib();
2847     addPathIfExists(
2848         D, LibPath + "/../" + GCCTriple.str() + "/lib" + Multilib.osSuffix(),
2849                     Paths);
2850   }
2851 }
2852 
2853 void Generic_GCC::AddMultilibIncludeArgs(const ArgList &DriverArgs,
2854                                          ArgStringList &CC1Args) const {
2855   // Add include directories specific to the selected multilib set and multilib.
2856   if (!GCCInstallation.isValid())
2857     return;
2858   // gcc TOOL_INCLUDE_DIR.
2859   const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
2860   std::string LibPath(GCCInstallation.getParentLibPath());
2861   addSystemInclude(DriverArgs, CC1Args,
2862                    Twine(LibPath) + "/../" + GCCTriple.str() + "/include");
2863 
2864   const auto &Callback = Multilibs.includeDirsCallback();
2865   if (Callback) {
2866     for (const auto &Path : Callback(GCCInstallation.getMultilib()))
2867       addExternCSystemIncludeIfExists(DriverArgs, CC1Args,
2868                                       GCCInstallation.getInstallPath() + Path);
2869   }
2870 }
2871 
2872 void Generic_GCC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2873                                                ArgStringList &CC1Args) const {
2874   if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdincxx,
2875                         options::OPT_nostdlibinc))
2876     return;
2877 
2878   switch (GetCXXStdlibType(DriverArgs)) {
2879   case ToolChain::CST_Libcxx:
2880     addLibCxxIncludePaths(DriverArgs, CC1Args);
2881     break;
2882 
2883   case ToolChain::CST_Libstdcxx:
2884     addLibStdCxxIncludePaths(DriverArgs, CC1Args);
2885     break;
2886   }
2887 }
2888 
2889 void
2890 Generic_GCC::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
2891                                    llvm::opt::ArgStringList &CC1Args) const {
2892   const Driver &D = getDriver();
2893   std::string SysRoot = computeSysRoot();
2894   std::string Target = getTripleString();
2895 
2896   auto AddIncludePath = [&](std::string Path) {
2897     std::string Version = detectLibcxxVersion(Path);
2898     if (Version.empty())
2899       return false;
2900 
2901     // First add the per-target include path if it exists.
2902     std::string TargetDir = Path + "/" + Target + "/c++/" + Version;
2903     if (D.getVFS().exists(TargetDir))
2904       addSystemInclude(DriverArgs, CC1Args, TargetDir);
2905 
2906     // Second add the generic one.
2907     addSystemInclude(DriverArgs, CC1Args, Path + "/c++/" + Version);
2908     return true;
2909   };
2910 
2911   // Android never uses the libc++ headers installed alongside the toolchain,
2912   // which are generally incompatible with the NDK libraries anyway.
2913   if (!getTriple().isAndroid())
2914     if (AddIncludePath(getDriver().Dir + "/../include"))
2915       return;
2916   // If this is a development, non-installed, clang, libcxx will
2917   // not be found at ../include/c++ but it likely to be found at
2918   // one of the following two locations:
2919   if (AddIncludePath(SysRoot + "/usr/local/include"))
2920     return;
2921   if (AddIncludePath(SysRoot + "/usr/include"))
2922     return;
2923 }
2924 
2925 bool Generic_GCC::addLibStdCXXIncludePaths(Twine IncludeDir, StringRef Triple,
2926                                            Twine IncludeSuffix,
2927                                            const llvm::opt::ArgList &DriverArgs,
2928                                            llvm::opt::ArgStringList &CC1Args,
2929                                            bool DetectDebian) const {
2930   if (!getVFS().exists(IncludeDir))
2931     return false;
2932 
2933   // Debian native gcc uses g++-multiarch-incdir.diff which uses
2934   // include/x86_64-linux-gnu/c++/10$IncludeSuffix instead of
2935   // include/c++/10/x86_64-linux-gnu$IncludeSuffix.
2936   std::string Dir = IncludeDir.str();
2937   StringRef Include =
2938       llvm::sys::path::parent_path(llvm::sys::path::parent_path(Dir));
2939   std::string Path =
2940       (Include + "/" + Triple + Dir.substr(Include.size()) + IncludeSuffix)
2941           .str();
2942   if (DetectDebian && !getVFS().exists(Path))
2943     return false;
2944 
2945   // GPLUSPLUS_INCLUDE_DIR
2946   addSystemInclude(DriverArgs, CC1Args, IncludeDir);
2947   // GPLUSPLUS_TOOL_INCLUDE_DIR. If Triple is not empty, add a target-dependent
2948   // include directory.
2949   if (DetectDebian)
2950     addSystemInclude(DriverArgs, CC1Args, Path);
2951   else if (!Triple.empty())
2952     addSystemInclude(DriverArgs, CC1Args,
2953                      IncludeDir + "/" + Triple + IncludeSuffix);
2954   // GPLUSPLUS_BACKWARD_INCLUDE_DIR
2955   addSystemInclude(DriverArgs, CC1Args, IncludeDir + "/backward");
2956   return true;
2957 }
2958 
2959 bool Generic_GCC::addGCCLibStdCxxIncludePaths(
2960     const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
2961     StringRef DebianMultiarch) const {
2962   assert(GCCInstallation.isValid());
2963 
2964   // By default, look for the C++ headers in an include directory adjacent to
2965   // the lib directory of the GCC installation. Note that this is expect to be
2966   // equivalent to '/usr/include/c++/X.Y' in almost all cases.
2967   StringRef LibDir = GCCInstallation.getParentLibPath();
2968   StringRef InstallDir = GCCInstallation.getInstallPath();
2969   StringRef TripleStr = GCCInstallation.getTriple().str();
2970   const Multilib &Multilib = GCCInstallation.getMultilib();
2971   const GCCVersion &Version = GCCInstallation.getVersion();
2972 
2973   // Try /../$triple/include/c++/$version (gcc --print-multiarch is not empty).
2974   if (addLibStdCXXIncludePaths(
2975           LibDir.str() + "/../" + TripleStr + "/include/c++/" + Version.Text,
2976           TripleStr, Multilib.includeSuffix(), DriverArgs, CC1Args))
2977     return true;
2978 
2979   // Detect Debian g++-multiarch-incdir.diff.
2980   if (addLibStdCXXIncludePaths(LibDir.str() + "/../include/c++/" + Version.Text,
2981                                DebianMultiarch, Multilib.includeSuffix(),
2982                                DriverArgs, CC1Args, /*Debian=*/true))
2983     return true;
2984 
2985   // Try /../include/c++/$version (gcc --print-multiarch is empty).
2986   if (addLibStdCXXIncludePaths(LibDir.str() + "/../include/c++/" + Version.Text,
2987                                TripleStr, Multilib.includeSuffix(), DriverArgs,
2988                                CC1Args))
2989     return true;
2990 
2991   // Otherwise, fall back on a bunch of options which don't use multiarch
2992   // layouts for simplicity.
2993   const std::string LibStdCXXIncludePathCandidates[] = {
2994       // Gentoo is weird and places its headers inside the GCC install,
2995       // so if the first attempt to find the headers fails, try these patterns.
2996       InstallDir.str() + "/include/g++-v" + Version.Text,
2997       InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
2998           Version.MinorStr,
2999       InstallDir.str() + "/include/g++-v" + Version.MajorStr,
3000   };
3001 
3002   for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
3003     if (addLibStdCXXIncludePaths(IncludePath, TripleStr,
3004                                  Multilib.includeSuffix(), DriverArgs, CC1Args))
3005       return true;
3006   }
3007   return false;
3008 }
3009 
3010 void
3011 Generic_GCC::addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
3012                                       llvm::opt::ArgStringList &CC1Args) const {
3013   if (GCCInstallation.isValid()) {
3014     addGCCLibStdCxxIncludePaths(DriverArgs, CC1Args,
3015                                 GCCInstallation.getTriple().str());
3016   }
3017 }
3018 
3019 llvm::opt::DerivedArgList *
3020 Generic_GCC::TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef,
3021                            Action::OffloadKind DeviceOffloadKind) const {
3022 
3023   // If this tool chain is used for an OpenMP offloading device we have to make
3024   // sure we always generate a shared library regardless of the commands the
3025   // user passed to the host. This is required because the runtime library
3026   // is required to load the device image dynamically at run time.
3027   if (DeviceOffloadKind == Action::OFK_OpenMP) {
3028     DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
3029     const OptTable &Opts = getDriver().getOpts();
3030 
3031     // Request the shared library. Given that these options are decided
3032     // implicitly, they do not refer to any base argument.
3033     DAL->AddFlagArg(/*BaseArg=*/nullptr, Opts.getOption(options::OPT_shared));
3034     DAL->AddFlagArg(/*BaseArg=*/nullptr, Opts.getOption(options::OPT_fPIC));
3035 
3036     // Filter all the arguments we don't care passing to the offloading
3037     // toolchain as they can mess up with the creation of a shared library.
3038     for (auto *A : Args) {
3039       switch ((options::ID)A->getOption().getID()) {
3040       default:
3041         DAL->append(A);
3042         break;
3043       case options::OPT_shared:
3044       case options::OPT_dynamic:
3045       case options::OPT_static:
3046       case options::OPT_fPIC:
3047       case options::OPT_fno_PIC:
3048       case options::OPT_fpic:
3049       case options::OPT_fno_pic:
3050       case options::OPT_fPIE:
3051       case options::OPT_fno_PIE:
3052       case options::OPT_fpie:
3053       case options::OPT_fno_pie:
3054         break;
3055       }
3056     }
3057     return DAL;
3058   }
3059   return nullptr;
3060 }
3061 
3062 void Generic_ELF::anchor() {}
3063 
3064 void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
3065                                         ArgStringList &CC1Args,
3066                                         Action::OffloadKind) const {
3067   if (!DriverArgs.hasFlag(options::OPT_fuse_init_array,
3068                           options::OPT_fno_use_init_array, true))
3069     CC1Args.push_back("-fno-use-init-array");
3070 }
3071