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