15 #include "clang/Config/config.h"
20 #include "llvm/Option/ArgList.h"
21 #include "llvm/ProfileData/InstrProf.h"
22 #include "llvm/Support/Path.h"
23 #include "llvm/Support/ScopedPrinter.h"
24 #include "llvm/Support/VirtualFileSystem.h"
25 #include <system_error>
29 using namespace clang;
41 const llvm::Triple &TargetTriple,
42 StringRef SysRoot)
const {
43 llvm::Triple::EnvironmentType TargetEnvironment =
44 TargetTriple.getEnvironment();
45 bool IsAndroid = TargetTriple.isAndroid();
46 bool IsMipsR6 = TargetTriple.getSubArch() == llvm::Triple::MipsSubArch_r6;
47 bool IsMipsN32Abi = TargetTriple.getEnvironment() == llvm::Triple::GNUABIN32;
51 switch (TargetTriple.getArch()) {
59 case llvm::Triple::arm:
60 case llvm::Triple::thumb:
62 return "arm-linux-androideabi";
63 if (TargetEnvironment == llvm::Triple::GNUEABIHF)
64 return "arm-linux-gnueabihf";
65 return "arm-linux-gnueabi";
66 case llvm::Triple::armeb:
67 case llvm::Triple::thumbeb:
68 if (TargetEnvironment == llvm::Triple::GNUEABIHF)
69 return "armeb-linux-gnueabihf";
70 return "armeb-linux-gnueabi";
71 case llvm::Triple::x86:
73 return "i686-linux-android";
74 return "i386-linux-gnu";
75 case llvm::Triple::x86_64:
77 return "x86_64-linux-android";
78 if (TargetEnvironment == llvm::Triple::GNUX32)
79 return "x86_64-linux-gnux32";
80 return "x86_64-linux-gnu";
81 case llvm::Triple::aarch64:
83 return "aarch64-linux-android";
84 return "aarch64-linux-gnu";
85 case llvm::Triple::aarch64_be:
86 return "aarch64_be-linux-gnu";
88 case llvm::Triple::m68k:
89 return "m68k-linux-gnu";
91 case llvm::Triple::mips:
92 return IsMipsR6 ?
"mipsisa32r6-linux-gnu" :
"mips-linux-gnu";
93 case llvm::Triple::mipsel:
95 return "mipsel-linux-android";
96 return IsMipsR6 ?
"mipsisa32r6el-linux-gnu" :
"mipsel-linux-gnu";
97 case llvm::Triple::mips64: {
99 "-linux-" + (IsMipsN32Abi ?
"gnuabin32" :
"gnuabi64");
100 if (D.
getVFS().exists(SysRoot +
"/lib/" + MT))
102 if (D.
getVFS().exists(SysRoot +
"/lib/mips64-linux-gnu"))
103 return "mips64-linux-gnu";
106 case llvm::Triple::mips64el: {
108 return "mips64el-linux-android";
110 "-linux-" + (IsMipsN32Abi ?
"gnuabin32" :
"gnuabi64");
111 if (D.
getVFS().exists(SysRoot +
"/lib/" + MT))
113 if (D.
getVFS().exists(SysRoot +
"/lib/mips64el-linux-gnu"))
114 return "mips64el-linux-gnu";
117 case llvm::Triple::ppc:
118 if (D.
getVFS().exists(SysRoot +
"/lib/powerpc-linux-gnuspe"))
119 return "powerpc-linux-gnuspe";
120 return "powerpc-linux-gnu";
121 case llvm::Triple::ppcle:
122 return "powerpcle-linux-gnu";
123 case llvm::Triple::ppc64:
124 return "powerpc64-linux-gnu";
125 case llvm::Triple::ppc64le:
126 return "powerpc64le-linux-gnu";
127 case llvm::Triple::sparc:
128 return "sparc-linux-gnu";
129 case llvm::Triple::sparcv9:
130 return "sparc64-linux-gnu";
131 case llvm::Triple::systemz:
132 return "s390x-linux-gnu";
134 return TargetTriple.str();
137 static StringRef
getOSLibDir(
const llvm::Triple &Triple,
const ArgList &Args) {
138 if (Triple.isMIPS()) {
139 if (Triple.isAndroid()) {
143 if (CPUName ==
"mips32r6")
145 if (CPUName ==
"mips32r2")
153 return Triple.isArch32Bit() ?
"lib" :
"lib64";
165 if (Triple.getArch() == llvm::Triple::x86 || Triple.isPPC32() ||
166 Triple.getArch() == llvm::Triple::sparc)
169 if (Triple.getArch() == llvm::Triple::x86_64 && Triple.isX32())
172 if (Triple.getArch() == llvm::Triple::riscv32)
175 return Triple.isArch32Bit() ?
"lib" :
"lib64";
183 llvm::Triple::ArchType Arch = Triple.getArch();
197 Triple.isAndroid()) {
204 if ((Triple.isARM() || Triple.isAArch64()) && Triple.isAndroid()) {
206 ExtraOpts.push_back(
"max-page-size=4096");
217 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
220 const bool IsAndroid = Triple.isAndroid();
221 const bool IsMips = Triple.isMIPS();
222 const bool IsHexagon = Arch == llvm::Triple::hexagon;
223 const bool IsRISCV = Triple.isRISCV();
224 const bool IsCSKY = Triple.isCSKY();
229 if ((IsMips || IsCSKY) && !SysRoot.empty())
230 ExtraOpts.push_back(
"--sysroot=" + SysRoot);
238 if (!IsMips && !IsHexagon) {
241 (IsAndroid && !Triple.isAndroidVersionLT(23)))
247 (IsAndroid && Triple.isAndroidVersionLT(23)))
248 ExtraOpts.push_back(
"--hash-style=both");
251 #ifdef ENABLE_LINKER_BUILD_ID
256 ExtraOpts.push_back(
"--enable-new-dtags");
270 if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel) {
286 SysRoot +
"/usr/lib/" + MultiarchTriple +
"/" +
287 llvm::to_string(Triple.getEnvironmentVersion().getMajor()),
295 if (Triple.getVendor() == llvm::Triple::OpenEmbedded &&
296 Triple.isArch64Bit())
303 addPathIfExists(D, SysRoot +
"/usr/" + OSLibDir +
"/" + ABIName, Paths);
311 if (StringRef(D.
Dir).startswith(SysRoot) &&
312 D.
getVFS().exists(D.
Dir +
"/../lib/libc++.so"))
357 std::string AndroidSysRootPath = (ClangDir +
"/../sysroot").str();
358 if (
getVFS().exists(AndroidSysRootPath))
359 return AndroidSysRootPath;
372 if (
getVFS().exists(Path))
392 if (
getVFS().exists(Path))
397 if (
getVFS().exists(Path))
404 const llvm::Triple::ArchType Arch =
getArch();
405 const llvm::Triple &Triple =
getTriple();
409 if (Triple.isAndroid())
410 return Triple.isArch64Bit() ?
"/system/bin/linker64" :
"/system/bin/linker";
412 if (Triple.isMusl()) {
417 case llvm::Triple::arm:
418 case llvm::Triple::thumb:
422 case llvm::Triple::armeb:
423 case llvm::Triple::thumbeb:
427 case llvm::Triple::x86:
430 case llvm::Triple::x86_64:
431 ArchName = Triple.isX32() ?
"x32" : Triple.getArchName().str();
434 ArchName = Triple.getArchName().str();
437 (Triple.getEnvironment() == llvm::Triple::MuslEABIHF ||
440 if (Arch == llvm::Triple::ppc &&
441 Triple.getSubArch() == llvm::Triple::PPCSubArch_spe)
442 ArchName =
"powerpc-sf";
444 return "/lib/ld-musl-" + ArchName +
".so.1";
452 llvm_unreachable(
"unsupported architecture");
454 case llvm::Triple::aarch64:
456 Loader =
"ld-linux-aarch64.so.1";
458 case llvm::Triple::aarch64_be:
460 Loader =
"ld-linux-aarch64_be.so.1";
462 case llvm::Triple::arm:
463 case llvm::Triple::thumb:
464 case llvm::Triple::armeb:
465 case llvm::Triple::thumbeb: {
467 Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
471 Loader = HF ?
"ld-linux-armhf.so.3" :
"ld-linux.so.3";
474 case llvm::Triple::m68k:
478 case llvm::Triple::mips:
479 case llvm::Triple::mipsel:
480 case llvm::Triple::mips64:
481 case llvm::Triple::mips64el: {
487 Loader = IsNaN2008 ?
"ld-uClibc-mipsn8.so.0" :
"ld-uClibc.so.0";
488 else if (!Triple.hasEnvironment() &&
489 Triple.getVendor() == llvm::Triple::VendorType::MipsTechnologies)
491 Triple.isLittleEndian() ?
"ld-musl-mipsel.so.1" :
"ld-musl-mips.so.1";
493 Loader = IsNaN2008 ?
"ld-linux-mipsn8.so.1" :
"ld.so.1";
497 case llvm::Triple::ppc:
501 case llvm::Triple::ppcle:
505 case llvm::Triple::ppc64:
510 case llvm::Triple::ppc64le:
515 case llvm::Triple::riscv32: {
518 Loader = (
"ld-linux-riscv32-" + ABIName +
".so.1").str();
521 case llvm::Triple::riscv64: {
524 Loader = (
"ld-linux-riscv64-" + ABIName +
".so.1").str();
527 case llvm::Triple::sparc:
528 case llvm::Triple::sparcel:
530 Loader =
"ld-linux.so.2";
532 case llvm::Triple::sparcv9:
534 Loader =
"ld-linux.so.2";
536 case llvm::Triple::systemz:
538 Loader =
"ld64.so.1";
540 case llvm::Triple::x86:
542 Loader =
"ld-linux.so.2";
544 case llvm::Triple::x86_64: {
545 bool X32 = Triple.isX32();
547 LibDir = X32 ?
"libx32" :
"lib64";
548 Loader = X32 ?
"ld-linux-x32.so.2" :
"ld-linux-x86-64.so.2";
551 case llvm::Triple::ve:
552 return "/opt/nec/ve/lib/ld-linux-ve.so.1";
553 case llvm::Triple::csky: {
561 (Triple.getVendor() == llvm::Triple::UnknownVendor ||
562 Triple.getVendor() == llvm::Triple::PC))
563 return "/usr/" + Triple.str() +
"/lib/" + Loader;
564 return "/" + LibDir +
"/" + Loader;
568 ArgStringList &CC1Args)
const {
572 if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
580 llvm::sys::path::append(ResourceDirInclude,
"include");
581 if (!DriverArgs.hasArg(options::OPT_nobuiltininc) &&
582 (!
getTriple().isMusl() || DriverArgs.hasArg(options::OPT_nostdlibinc)))
585 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
594 StringRef CIncludeDirs(C_INCLUDE_DIRS);
595 if (CIncludeDirs !=
"") {
597 CIncludeDirs.split(dirs,
":");
598 for (StringRef dir : dirs) {
600 llvm::sys::path::is_absolute(dir) ?
"" : StringRef(SysRoot);
609 if (!MultiarchIncludeDir.empty() &&
610 D.
getVFS().exists(SysRoot +
"/usr/include/" + MultiarchIncludeDir))
612 SysRoot +
"/usr/include/" + MultiarchIncludeDir);
624 if (!DriverArgs.hasArg(options::OPT_nobuiltininc) &&
getTriple().isMusl())
629 llvm::opt::ArgStringList &CC1Args)
const {
637 StringRef DebianMultiarch =
651 const std::string LibStdCXXIncludePathCandidates[] = {
653 LibDir.str() +
"/../" + TripleStr.str() +
"/include/c++/" + Version.
Text,
656 LibDir.str() +
"/../include/c++",
659 LibDir.str() +
"/../include/g++",
662 for (
const auto &IncludePath : LibStdCXXIncludePathCandidates) {
670 ArgStringList &CC1Args)
const {
675 ArgStringList &CC1Args)
const {
680 ArgStringList &CmdArgs)
const {
685 CmdArgs.push_back(
"-lamdhip64");
689 ArgStringList &CC1Args)
const {
691 CC1Args.push_back(
"-isystem");
692 CC1Args.push_back(DriverArgs.MakeArgString(
699 return CLANG_DEFAULT_PIE_ON_LINUX ||
getTriple().isAndroid() ||
706 assert(
getTriple().isAArch64() &&
"expected AArch64 target!");
723 const bool IsX86 =
getTriple().getArch() == llvm::Triple::x86;
724 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
725 const bool IsMIPS =
getTriple().isMIPS32();
726 const bool IsMIPS64 =
getTriple().isMIPS64();
727 const bool IsPowerPC64 =
getTriple().getArch() == llvm::Triple::ppc64 ||
728 getTriple().getArch() == llvm::Triple::ppc64le;
729 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64 ||
730 getTriple().getArch() == llvm::Triple::aarch64_be;
731 const bool IsArmArch =
getTriple().getArch() == llvm::Triple::arm ||
732 getTriple().getArch() == llvm::Triple::thumb ||
733 getTriple().getArch() == llvm::Triple::armeb ||
734 getTriple().getArch() == llvm::Triple::thumbeb;
735 const bool IsRISCV64 =
getTriple().getArch() == llvm::Triple::riscv64;
736 const bool IsSystemZ =
getTriple().getArch() == llvm::Triple::systemz;
737 const bool IsHexagon =
getTriple().getArch() == llvm::Triple::hexagon;
739 Res |= SanitizerKind::Address;
740 Res |= SanitizerKind::PointerCompare;
741 Res |= SanitizerKind::PointerSubtract;
742 Res |= SanitizerKind::Fuzzer;
743 Res |= SanitizerKind::FuzzerNoLink;
744 Res |= SanitizerKind::KernelAddress;
745 Res |= SanitizerKind::Memory;
746 Res |= SanitizerKind::Vptr;
747 Res |= SanitizerKind::SafeStack;
748 if (IsX86_64 || IsMIPS64 || IsAArch64)
749 Res |= SanitizerKind::DataFlow;
750 if (IsX86_64 || IsMIPS64 || IsAArch64 || IsX86 || IsArmArch || IsPowerPC64 ||
751 IsRISCV64 || IsSystemZ || IsHexagon)
752 Res |= SanitizerKind::Leak;
753 if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64 || IsSystemZ)
754 Res |= SanitizerKind::Thread;
756 Res |= SanitizerKind::KernelMemory;
757 if (IsX86 || IsX86_64)
758 Res |= SanitizerKind::Function;
759 if (IsX86_64 || IsMIPS64 || IsAArch64 || IsX86 || IsMIPS || IsArmArch ||
760 IsPowerPC64 || IsHexagon)
761 Res |= SanitizerKind::Scudo;
762 if (IsX86_64 || IsAArch64) {
763 Res |= SanitizerKind::HWAddress;
764 Res |= SanitizerKind::KernelHWAddress;
770 llvm::opt::ArgStringList &CmdArgs)
const {
774 CmdArgs.push_back(Args.MakeArgString(
775 Twine(
"-u", llvm::getInstrProfRuntimeHookVarName())));
782 const llvm::fltSemantics *FPType)
const {
784 case llvm::Triple::x86:
785 case llvm::Triple::x86_64: {
788 if (!DriverArgs.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
790 return llvm::DenormalMode::getPreserveSign();
791 return llvm::DenormalMode::getIEEE();
794 return llvm::DenormalMode::getIEEE();
800 CmdArgs.push_back(Opt.c_str());