20#include "clang/Config/config.h"
29#include "llvm/ADT/SmallString.h"
30#include "llvm/ADT/StringExtras.h"
31#include "llvm/ADT/StringRef.h"
32#include "llvm/ADT/Twine.h"
33#include "llvm/Config/llvm-config.h"
34#include "llvm/MC/MCTargetOptions.h"
35#include "llvm/MC/TargetRegistry.h"
36#include "llvm/Option/Arg.h"
37#include "llvm/Option/ArgList.h"
38#include "llvm/Option/OptTable.h"
39#include "llvm/Option/Option.h"
40#include "llvm/Support/ErrorHandling.h"
41#include "llvm/Support/FileSystem.h"
42#include "llvm/Support/FileUtilities.h"
43#include "llvm/Support/MemoryBuffer.h"
44#include "llvm/Support/Path.h"
45#include "llvm/Support/Process.h"
46#include "llvm/Support/VersionTuple.h"
47#include "llvm/Support/VirtualFileSystem.h"
48#include "llvm/TargetParser/AArch64TargetParser.h"
49#include "llvm/TargetParser/AMDGPUTargetParser.h"
50#include "llvm/TargetParser/RISCVISAInfo.h"
51#include "llvm/TargetParser/TargetParser.h"
52#include "llvm/TargetParser/Triple.h"
65 return Args.getLastArg(options::OPT_mkernel, options::OPT_fapple_kext,
66 options::OPT_fno_rtti, options::OPT_frtti);
70 const llvm::Triple &Triple,
71 const Arg *CachedRTTIArg) {
74 if (CachedRTTIArg->getOption().matches(options::OPT_frtti))
81 bool NoRTTI = Triple.isPS() || Triple.isDriverKit();
86 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
98 assert(
T.str() ==
T.normalize() &&
"triple should be normalized");
99 auto addIfExists = [
this](
path_list &List,
const std::string &Path) {
100 if (
getVFS().exists(Path))
101 List.push_back(Path);
121 const Driver &D, StringRef Fallback) {
122 std::optional<std::string> MultilibPath =
126 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> MB =
127 D.getVFS().getBufferForFile(*MultilibPath);
132 llvm::ErrorOr<MultilibSet> ErrorOrMultilibSet =
134 if (ErrorOrMultilibSet.getError())
137 Multilibs = std::move(ErrorOrMultilibSet.get());
146 for (StringRef Define : CustomFlagMacroDefines)
150 D.Diag(clang::diag::warn_drv_missing_multilib) << llvm::join(Flags,
" ");
152 raw_svector_ostream OS(
Data);
155 OS <<
"\n" << llvm::join(M.flags(),
" ");
156 D.Diag(clang::diag::note_drv_available_multilibs) << OS.str();
160 D.Diag(clang::diag::err_drv_multilib_custom_error)
161 << M.getErrorMessage();
169 StringRef YAMLBase = llvm::sys::path::parent_path(*MultilibPath);
171 size_t FileInsertPos = 0;
172 size_t LibInsertPos = 0;
177 llvm::sys::path::append(FilePath, M.gccSuffix());
179 std::string(FilePath));
183 llvm::sys::path::append(LibPath, M.gccSuffix());
185 std::string(LibPath));
193std::optional<std::string>
195 StringRef FallbackDir) {
196 if (Arg *A = Args.getLastArg(options::OPT_multi_lib_config)) {
198 if (!D.getVFS().exists(MultilibPath)) {
199 D.Diag(clang::diag::err_drv_no_such_file) << MultilibPath.str();
202 return std::string(MultilibPath);
206 if (!FallbackDir.empty())
207 MultilibPath = FallbackDir;
208 else if (std::optional<std::string> StdlibDir =
getStdlibPath())
209 MultilibPath = *StdlibDir;
212 llvm::sys::path::append(MultilibPath,
"multilib.yaml");
213 if (!D.getVFS().exists(MultilibPath))
215 return std::string(MultilibPath);
219 Triple.setEnvironment(Env);
220 if (EffectiveTriple != llvm::Triple())
221 EffectiveTriple.setEnvironment(Env);
231 return Args.hasFlag(options::OPT_fintegrated_as,
232 options::OPT_fno_integrated_as,
240 "(Non-)integrated backend set incorrectly!");
242 bool IBackend = Args.hasFlag(options::OPT_fintegrated_objemitter,
243 options::OPT_fno_integrated_objemitter,
251 DiagID = clang::diag::err_drv_unsupported_opt_for_target;
253 DiagID = clang::diag::warn_drv_unsupported_opt_for_target;
254 Arg *A = Args.getLastArg(options::OPT_fno_integrated_objemitter);
256 D.Diag(DiagID) << A->getAsString(Args) << Triple.getTriple();
257 A = Args.getLastArg(options::OPT_fintegrated_objemitter);
259 D.Diag(DiagID) << A->getAsString(Args) << Triple.getTriple();
265 return ENABLE_X86_RELAX_RELOCATIONS;
269 return PPC_LINUX_DEFAULT_IEEELONGDOUBLE &&
getTriple().isOSLinux();
273 const llvm::opt::ArgList &Args) {
274 for (
const Arg *MultilibFlagArg :
275 Args.filtered(options::OPT_fmultilib_flag)) {
276 List.push_back(MultilibFlagArg->getAsString(Args));
277 MultilibFlagArg->claim();
282 const llvm::Triple &Triple,
283 const llvm::opt::ArgList &Args,
285 std::vector<StringRef> Features;
290 llvm::DenseSet<StringRef> FeatureSet(UnifiedFeatures.begin(),
291 UnifiedFeatures.end());
292 std::vector<std::string> MArch;
293 for (
const auto &Ext : AArch64::Extensions)
294 if (Ext.UserVisibleName.value())
295 if (FeatureSet.contains(AArch64::StrTab[Ext.PosTargetFeature]))
296 MArch.push_back(AArch64::StrTab[Ext.UserVisibleName].str());
297 for (
const auto &Ext : AArch64::Extensions)
298 if (Ext.UserVisibleName.value())
299 if (FeatureSet.contains(AArch64::StrTab[Ext.NegTargetFeature]))
300 MArch.push_back((
"no" + AArch64::StrTab[Ext.UserVisibleName]).str());
302 for (
const auto &ArchInfo : AArch64::ArchInfos)
303 if (FeatureSet.contains(AArch64::StrTab[ArchInfo.ArchFeature]))
304 ArchName = AArch64::StrTab[ArchInfo.Name];
305 if (!ArchName.empty()) {
306 MArch.insert(MArch.begin(), (
"-march=" + ArchName).str());
307 Result.push_back(llvm::join(MArch,
"+"));
310 const Arg *BranchProtectionArg =
311 Args.getLastArgNoClaim(options::OPT_mbranch_protection_EQ);
312 if (BranchProtectionArg) {
313 Result.push_back(BranchProtectionArg->getAsString(Args));
316 if (FeatureSet.contains(
"+strict-align"))
317 Result.push_back(
"-mno-unaligned-access");
319 Result.push_back(
"-munaligned-access");
321 if (Arg *Endian = Args.getLastArg(options::OPT_mbig_endian,
322 options::OPT_mlittle_endian)) {
323 if (Endian->getOption().matches(options::OPT_mbig_endian))
324 Result.push_back(Endian->getAsString(Args));
327 const Arg *ABIArg = Args.getLastArgNoClaim(options::OPT_mabi_EQ);
329 Result.push_back(ABIArg->getAsString(Args));
332 if (
const Arg *A = Args.getLastArg(options::OPT_O_Group);
333 A && A->getOption().matches(options::OPT_O)) {
334 switch (A->getValue()[0]) {
346 llvm::Reloc::Model RelocationModel,
347 const llvm::opt::ArgList &Args,
349 std::vector<StringRef> Features;
351 D, Triple, Args, Features,
false ,
true );
353 llvm::DenseSet<StringRef> FeatureSet(UnifiedFeatures.begin(),
354 UnifiedFeatures.end());
355 std::vector<std::string> MArch;
356 for (
const auto &Ext : ARM::ARCHExtNames)
357 if (!Ext.Name.empty())
358 if (FeatureSet.contains(Ext.Feature))
359 MArch.push_back(Ext.Name.str());
360 for (
const auto &Ext : ARM::ARCHExtNames)
361 if (!Ext.Name.empty())
362 if (FeatureSet.contains(Ext.NegFeature))
363 MArch.push_back((
"no" + Ext.Name).str());
364 MArch.insert(MArch.begin(), (
"-march=" + Triple.getArchName()).str());
365 Result.push_back(llvm::join(MArch,
"+"));
368#define ARM_FPU(NAME, KIND, VERSION, NEON_SUPPORT, RESTRICTION) \
369 case llvm::ARM::KIND: \
370 Result.push_back("-mfpu=" NAME); \
372#include "llvm/TargetParser/ARMTargetParser.def"
374 llvm_unreachable(
"Invalid FPUKind");
378 case arm::FloatABI::Soft:
379 Result.push_back(
"-mfloat-abi=soft");
381 case arm::FloatABI::SoftFP:
382 Result.push_back(
"-mfloat-abi=softfp");
384 case arm::FloatABI::Hard:
385 Result.push_back(
"-mfloat-abi=hard");
387 case arm::FloatABI::Invalid:
388 llvm_unreachable(
"Invalid float ABI");
391 if (RelocationModel == llvm::Reloc::ROPI ||
392 RelocationModel == llvm::Reloc::ROPI_RWPI)
393 Result.push_back(
"-fropi");
395 Result.push_back(
"-fno-ropi");
397 if (RelocationModel == llvm::Reloc::RWPI ||
398 RelocationModel == llvm::Reloc::ROPI_RWPI)
399 Result.push_back(
"-frwpi");
401 Result.push_back(
"-fno-rwpi");
403 const Arg *BranchProtectionArg =
404 Args.getLastArgNoClaim(options::OPT_mbranch_protection_EQ);
405 if (BranchProtectionArg) {
406 Result.push_back(BranchProtectionArg->getAsString(Args));
409 if (FeatureSet.contains(
"+strict-align"))
410 Result.push_back(
"-mno-unaligned-access");
412 Result.push_back(
"-munaligned-access");
414 if (Arg *Endian = Args.getLastArg(options::OPT_mbig_endian,
415 options::OPT_mlittle_endian)) {
416 if (Endian->getOption().matches(options::OPT_mbig_endian))
417 Result.push_back(Endian->getAsString(Args));
420 if (
const Arg *A = Args.getLastArg(options::OPT_O_Group);
421 A && A->getOption().matches(options::OPT_O)) {
422 switch (A->getValue()[0]) {
434 const llvm::opt::ArgList &Args,
436 bool hasShadowCallStack) {
439 auto ISAInfo = llvm::RISCVISAInfo::parseArchString(
441 if (!llvm::errorToBool(ISAInfo.takeError()))
442 Result.push_back(
"-march=" + (*ISAInfo)->toString());
446 if (hasShadowCallStack)
447 Result.push_back(
"-fsanitize=shadow-call-stack");
449 Result.push_back(
"-fno-sanitize=shadow-call-stack");
451 const Arg *CFProtectionArg =
452 Args.getLastArgNoClaim(options::OPT_fcf_protection_EQ);
453 StringRef CFProtectionVal =
454 CFProtectionArg ? CFProtectionArg->getValue() :
"none";
455 Result.push_back((
"-fcf-protection=" + CFProtectionVal).str());
457 if (CFProtectionVal ==
"branch" || CFProtectionVal ==
"full") {
458 if (
const Arg *SchemeArg =
459 Args.getLastArgNoClaim(options::OPT_mcf_branch_label_scheme_EQ))
460 Result.push_back(SchemeArg->getAsString(Args));
468 std::vector<std::string>
Result;
470 Result.push_back(
"--target=" + Triple.str());
476 llvm::Reloc::Model RelocationModel;
481 std::tie(RelocationModel, PICLevel, IsPIE) =
ParsePICArgs(*
this, Args);
484 switch (Triple.getArch()) {
485 case llvm::Triple::aarch64:
486 case llvm::Triple::aarch64_32:
487 case llvm::Triple::aarch64_be:
490 case llvm::Triple::arm:
491 case llvm::Triple::armeb:
492 case llvm::Triple::thumb:
493 case llvm::Triple::thumbeb:
496 case llvm::Triple::riscv32:
497 case llvm::Triple::riscv64:
498 case llvm::Triple::riscv32be:
499 case llvm::Triple::riscv64be:
509 if (Arg *CStdLibArg = Args.getLastArg(options::OPT_cstdlib_EQ))
510 Result.push_back(std::string(CStdLibArg->getOption().getPrefixedName()) +
511 CStdLibArg->getValue());
516 Result.push_back(
"-fno-rtti");
518 Result.push_back(
"-frtti");
521 Result.push_back(
"-fno-exceptions");
523 Result.push_back(
"-fexceptions");
525 if (RelocationModel == llvm::Reloc::PIC_)
526 Result.push_back(IsPIE ? (PICLevel > 1 ?
"-fPIE" :
"-fpie")
527 : (PICLevel > 1 ?
"-fPIC" :
"-fpic"));
529 Result.push_back(
"-fno-pic");
543 bool DiagnoseBoundArchErrors =
544 BoundArchSanitizerArgsChecked.insert(BA.
ArchName).second;
546 !JobArgs.hasFlag(options::OPT_fgpu_sanitize,
547 options::OPT_fno_gpu_sanitize,
true)) {
548 DiagnoseBoundArchErrors =
false;
552 !SanitizerArgsChecked,
553 DiagnoseBoundArchErrors, BA, DeviceOffloadKind);
555 SanitizerArgsChecked =
true;
560 XRayArgs XRayArguments(*
this, JobArgs);
561 return XRayArguments;
568 const char *ModeFlag;
577 static const DriverSuffix DriverSuffixes[] = {
579 {
"clang++",
"--driver-mode=g++"},
580 {
"clang-c++",
"--driver-mode=g++"},
581 {
"clang-cc",
nullptr},
582 {
"clang-cpp",
"--driver-mode=cpp"},
583 {
"clang-g++",
"--driver-mode=g++"},
584 {
"clang-gcc",
nullptr},
585 {
"clang-cl",
"--driver-mode=cl"},
587 {
"cpp",
"--driver-mode=cpp"},
588 {
"cl",
"--driver-mode=cl"},
589 {
"++",
"--driver-mode=g++"},
590 {
"flang",
"--driver-mode=flang"},
593 {
"flang-new",
"--driver-mode=flang"},
594 {
"clang-dxc",
"--driver-mode=dxc"},
597 for (
const auto &DS : DriverSuffixes) {
598 StringRef Suffix(DS.Suffix);
599 if (ProgName.ends_with(Suffix)) {
600 Pos = ProgName.size() - Suffix.size();
610 std::string ProgName = std::string(llvm::sys::path::filename(Argv0));
611 if (is_style_windows(llvm::sys::path::Style::native)) {
613 std::transform(ProgName.begin(), ProgName.end(), ProgName.begin(),
629 if (!DS && ProgName.ends_with(
".exe")) {
632 ProgName = ProgName.drop_back(StringRef(
".exe").size());
639 ProgName = ProgName.rtrim(
"0123456789.");
646 ProgName = ProgName.slice(0, ProgName.rfind(
'-'));
659 size_t SuffixEnd = SuffixPos + strlen(DS->Suffix);
661 size_t LastComponent = ProgName.rfind(
'-', SuffixPos);
662 if (LastComponent == std::string::npos)
664 std::string ModeSuffix = ProgName.substr(LastComponent + 1,
665 SuffixEnd - LastComponent - 1);
668 StringRef Prefix(ProgName);
669 Prefix = Prefix.slice(0, LastComponent);
670 std::string IgnoredError;
672 llvm::Triple Triple(Prefix);
673 bool IsRegistered = llvm::TargetRegistry::lookupTarget(Triple, IgnoredError);
682 switch (Triple.getArch()) {
683 case llvm::Triple::aarch64: {
688 case llvm::Triple::aarch64_32:
690 case llvm::Triple::ppc:
692 case llvm::Triple::ppcle:
694 case llvm::Triple::ppc64:
696 case llvm::Triple::ppc64le:
699 return Triple.getArchName();
712Tool *ToolChain::getClang()
const {
718Tool *ToolChain::getFlang()
const {
729 llvm_unreachable(
"Linking is not supported by this toolchain");
733 llvm_unreachable(
"Creating static lib is not supported by this toolchain");
736Tool *ToolChain::getAssemble()
const {
739 return Assemble.get();
742Tool *ToolChain::getClangAs()
const {
745 return Assemble.get();
748Tool *ToolChain::getLink()
const {
754Tool *ToolChain::getStaticLibTool()
const {
757 return StaticLibTool.get();
760Tool *ToolChain::getIfsMerge()
const {
762 IfsMerge.reset(
new tools::ifstool::Merger(*
this));
763 return IfsMerge.get();
766Tool *ToolChain::getOffloadBundler()
const {
768 OffloadBundler.reset(
new tools::OffloadBundler(*
this));
769 return OffloadBundler.get();
772Tool *ToolChain::getOffloadPackager()
const {
773 if (!OffloadPackager)
774 OffloadPackager.reset(
new tools::OffloadPackager(*
this));
775 return OffloadPackager.get();
778Tool *ToolChain::getLinkerWrapper()
const {
780 LinkerWrapper.reset(
new tools::LinkerWrapper(*
this, getLink()));
781 return LinkerWrapper.get();
787 return getAssemble();
790 return getIfsMerge();
796 return getStaticLibTool();
807 llvm_unreachable(
"Invalid tool kind.");
819 return getOffloadBundler();
822 return getOffloadPackager();
824 return getLinkerWrapper();
827 llvm_unreachable(
"Invalid tool kind.");
831 const ArgList &Args) {
832 const llvm::Triple &Triple = TC.
getTriple();
833 bool IsWindows = Triple.isOSWindows();
836 return Triple.getArchName();
838 if (TC.
getArch() == llvm::Triple::arm || TC.
getArch() == llvm::Triple::armeb)
844 if (TC.
getArch() == llvm::Triple::x86 && Triple.isAndroid())
847 if (TC.
getArch() == llvm::Triple::x86_64 && Triple.isX32())
850 return llvm::Triple::getArchTypeName(TC.
getArch());
854 if (Triple.isOSDarwin())
856 if (Triple.isWindowsCygwinEnvironment())
859 switch (Triple.getOS()) {
860 case llvm::Triple::FreeBSD:
862 case llvm::Triple::NetBSD:
864 case llvm::Triple::OpenBSD:
866 case llvm::Triple::Solaris:
868 case llvm::Triple::AIX:
870 case llvm::Triple::Serenity:
884 }
else if (Triple.isOSUnknown()) {
885 llvm::sys::path::append(Path,
"lib");
889 return std::string(Path);
896 return llvm::sys::path::filename(CRTAbsolutePath).str();
902 bool IsFortran)
const {
904 bool IsITANMSVCWindows =
905 TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment();
912 Suffix = IsITANMSVCWindows ?
".obj" :
".o";
915 Suffix = IsITANMSVCWindows ?
".lib" :
".a";
918 if (TT.isOSWindows())
919 Suffix = TT.isOSCygMing() ?
".dll.a" :
".lib";
920 else if (TT.isOSAIX())
927 std::string ArchAndEnv;
930 const char *Env = TT.isAndroid() ?
"-android" :
"";
931 ArchAndEnv = (
"-" +
Arch + Env).str();
934 std::string LibName = IsFortran ?
"flang_rt." :
"clang_rt.";
935 return (Prefix + Twine(LibName) + Component + ArchAndEnv + Suffix).str();
942 Args, Component,
Type,
false, IsFortran);
946 llvm::sys::path::append(P, CRTBasename);
948 return std::string(P);
955 !IsFortran, IsFortran);
957 llvm::sys::path::append(OldPath, CRTBasename);
958 if (Path.empty() ||
getVFS().exists(OldPath))
959 return std::string(OldPath);
964 return std::string(Path);
970 bool isFortran)
const {
976 llvm::opt::ArgStringList &CmdArgs)
const {
981 if (!
getTriple().isKnownWindowsMSVCEnvironment()) {
983 F128LibName.consume_front_insensitive(
"lib");
984 if (!F128LibName.empty()) {
986 CmdArgs.push_back(
"-lflang_rt.quadmath");
989 CmdArgs.push_back(Args.MakeArgString(
"-l" + F128LibName));
998 CmdArgs.push_back(
"-lexecinfo");
1002 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1003 options::OPT_fno_openmp,
false)) {
1008 !
getTriple().isKnownWindowsMSVCEnvironment()) {
1010 CmdArgs.push_back(
"-lcompiler_rt");
1012 CmdArgs.push_back(
"-latomic");
1018 ArgStringList &CmdArgs)
const {
1019 auto AddLibSearchPathIfExists = [&](
const Twine &Path) {
1021 if (!llvm::sys::fs::is_directory(Path))
1024 if (
getTriple().isKnownWindowsMSVCEnvironment())
1025 CmdArgs.push_back(Args.MakeArgString(
"-libpath:" + Path));
1027 CmdArgs.push_back(Args.MakeArgString(
"-L" + Path));
1040 llvm::sys::path::parent_path(
getDriver().Dir);
1041 llvm::sys::path::append(DefaultLibPath,
"lib");
1042 AddLibSearchPathIfExists(DefaultLibPath);
1046 llvm::opt::ArgStringList &CmdArgs)
const {
1049 if (Args.hasFlag(options::OPT_static_libflangrt,
1050 options::OPT_shared_libflangrt,
getTriple().isOSAIX()))
1054 CmdArgs.push_back(
"-lflang_rt.runtime");
1060std::optional<std::string>
1061ToolChain::getFallbackAndroidTargetPath(StringRef BaseDir)
const {
1062 llvm::Triple TripleWithoutLevel(
getTriple());
1063 TripleWithoutLevel.setEnvironmentName(
"android");
1064 const std::string &TripleWithoutLevelStr = TripleWithoutLevel.str();
1065 unsigned TripleVersion =
getTriple().getEnvironmentVersion().getMajor();
1066 unsigned BestVersion = 0;
1069 bool UsingUnversionedDir =
false;
1071 for (llvm::vfs::directory_iterator LI =
getVFS().dir_begin(BaseDir, EC), LE;
1072 !EC && LI != LE; LI = LI.increment(EC)) {
1073 StringRef DirName = llvm::sys::path::filename(LI->path());
1074 StringRef DirNameSuffix = DirName;
1075 if (DirNameSuffix.consume_front(TripleWithoutLevelStr)) {
1076 if (DirNameSuffix.empty() && TripleDir.empty()) {
1077 TripleDir = DirName;
1078 UsingUnversionedDir =
true;
1081 if (!DirNameSuffix.getAsInteger(10, Version) && Version > BestVersion &&
1082 Version < TripleVersion) {
1083 BestVersion = Version;
1084 TripleDir = DirName;
1085 UsingUnversionedDir =
false;
1091 if (TripleDir.empty())
1094 SmallString<128> P(BaseDir);
1095 llvm::sys::path::append(P, TripleDir);
1096 if (UsingUnversionedDir)
1097 D.Diag(diag::warn_android_unversioned_fallback) << P <<
getTripleString();
1098 return std::string(P);
1102 return (Triple.hasEnvironment()
1103 ? llvm::Triple(Triple.getArchName(), Triple.getVendorName(),
1104 llvm::Triple::getOSTypeName(Triple.getOS()),
1105 llvm::Triple::getEnvironmentTypeName(
1106 Triple.getEnvironment()))
1107 : llvm::Triple(Triple.getArchName(), Triple.getVendorName(),
1108 llvm::Triple::getOSTypeName(Triple.getOS())));
1111std::optional<std::string>
1113 auto getPathForTriple =
1114 [&](
const llvm::Triple &Triple) -> std::optional<std::string> {
1116 llvm::sys::path::append(P, Triple.str());
1118 return std::string(P);
1123 if (
auto Path = getPathForTriple(
T))
1129 llvm::Triple AMDGPUTriple =
T;
1130 AMDGPUTriple.setArch(Triple::amdgpu);
1131 if (
auto Path = getPathForTriple(AMDGPUTriple))
1135 AMDGPUTriple.setArchName(
"amdgcn");
1136 if (
auto Path = getPathForTriple(AMDGPUTriple))
1143 llvm::Triple SPIRVTriple(
1144 T.normalize(llvm::Triple::CanonicalForm::THREE_IDENT));
1145 if (
auto Path = getPathForTriple(SPIRVTriple))
1150 llvm::Triple AIXTriple;
1151 if (
T.getEnvironment() == Triple::UnknownEnvironment) {
1153 AIXTriple = llvm::Triple(
T.getArchName(),
T.getVendorName(),
1154 llvm::Triple::getOSTypeName(
T.getOS()));
1159 if (
auto Path = getPathForTriple(AIXTriple))
1164 (!
T.getOSVersion().empty() || !
T.getEnvironmentVersion().empty())) {
1167 if (
auto Path = getPathForTriple(TripleWithoutVersion))
1186 if (
T.getArch() == Triple::arm && !
T.isArmMClass()) {
1187 llvm::Triple ArmTriple =
T;
1188 ArmTriple.setArch(Triple::arm);
1189 if (
auto Path = getPathForTriple(ArmTriple))
1194 return getFallbackAndroidTargetPath(BaseDir);
1201 llvm::sys::path::append(P,
"finclude",
"flang");
1207 llvm::sys::path::append(P,
"lib");
1211 if (Triple.isOSDarwin())
1214 llvm::sys::path::append(P, Triple.str());
1215 return std::string(P);
1220 llvm::sys::path::append(P,
"..",
"lib");
1226 llvm::sys::path::append(P,
"..",
"include");
1235 llvm::sys::path::append(Path,
"lib");
1237 llvm::sys::path::append(Path, S);
1238 Paths.push_back(std::string(Path));
1250 for (StringRef ArchName : {
"amdgpu",
"amdgcn"}) {
1253 Canon.setArchName(ArchName);
1254 AddPath({Canon.str()});
1263 if (Args.hasArg(options::OPT_noprofilelib))
1266 return Args.hasArg(options::OPT_fprofile_generate) ||
1267 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
1268 Args.hasArg(options::OPT_fcs_profile_generate) ||
1269 Args.hasArg(options::OPT_fcs_profile_generate_EQ) ||
1270 Args.hasArg(options::OPT_fprofile_instr_generate) ||
1271 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
1272 Args.hasArg(options::OPT_fcreate_profile) ||
1273 Args.hasArg(options::OPT_fprofile_generate_cold_function_coverage) ||
1274 Args.hasArg(options::OPT_fprofile_generate_cold_function_coverage_EQ);
1278 return Args.hasArg(options::OPT_coverage) ||
1279 Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
1284 if (D.IsFlangMode() &&
getDriver().ShouldUseFlangCompiler(JA))
return getFlang();
1285 if (
getDriver().ShouldUseClangCompiler(JA))
return getClang();
1289 return getClangAs();
1294 return D.GetFilePath(Name, *
this);
1297std::optional<std::string>
1299 std::string Path = D.GetFilePath(Name, *
this);
1301 return std::nullopt;
1306 return D.GetProgramPath(Name, *
this);
1311 *LinkerIsLLD =
false;
1315 const Arg* A = Args.getLastArg(options::OPT_fuse_ld_EQ);
1323 if (
const Arg *A = Args.getLastArg(options::OPT_ld_path_EQ)) {
1324 std::string Path(A->getValue());
1325 if (!Path.empty()) {
1326 if (llvm::sys::path::parent_path(Path).empty())
1328 if (llvm::sys::fs::can_execute(Path)) {
1330 *LinkerIsLLD = UseLinker ==
"lld";
1331 return std::string(Path);
1334 getDriver().
Diag(diag::err_drv_invalid_linker_name) << A->getAsString(Args);
1339 if (UseLinker.empty() || UseLinker ==
"ld") {
1341 if (llvm::sys::path::is_absolute(DefaultLinker))
1342 return std::string(DefaultLinker);
1351 if (UseLinker.contains(
'/'))
1354 if (llvm::sys::path::is_absolute(UseLinker)) {
1357 if (llvm::sys::fs::can_execute(UseLinker))
1358 return std::string(UseLinker);
1361 if (Triple.isOSDarwin())
1362 LinkerName.append(
"ld64.");
1364 LinkerName.append(
"ld.");
1365 LinkerName.append(UseLinker);
1368 if (llvm::sys::fs::can_execute(LinkerPath)) {
1370 *LinkerIsLLD = UseLinker ==
"lld";
1376 getDriver().
Diag(diag::err_drv_invalid_linker_name) << A->getAsString(Args);
1383 if (Triple.isOSDarwin())
1394 if (D.IsFlangMode() &&
id == types::TY_PP_Fortran)
1395 id = types::TY_Fortran;
1412 llvm::opt::OptSpecifier OptEq,
1413 llvm::opt::OptSpecifier OptNeg) {
1414 if (!Args.hasFlag(OptEq, OptNeg,
false))
1417 const Arg *A = Args.getLastArg(OptEq);
1418 StringRef LTOName = A->getValue();
1420 return llvm::StringSwitch<LTOKind>(LTOName)
1430 auto OptEq = IsOffload ? options::OPT_foffload_lto_EQ : options::OPT_flto_EQ;
1431 auto OptNeg = IsOffload ? options::OPT_fno_offload_lto : options::OPT_fno_lto;
1435 if (IsOffload && Args.hasFlag(options::OPT_fopenmp_target_jit,
1436 options::OPT_fno_openmp_target_jit,
false)) {
1437 if (Arg *A = Args.getLastArg(OptEq, OptNeg))
1440 << A->getSpelling() <<
"-fopenmp-target-jit";
1444 if (!Args.hasArg(OptEq, OptNeg))
1450 const Arg *A = Args.getLastArg(OptEq);
1452 << A->getSpelling() << A->getValue();
1459 llvm::Triple HostTriple(LLVM_HOST_TRIPLE);
1460 switch (HostTriple.getArch()) {
1463 case llvm::Triple::arm:
1464 case llvm::Triple::armeb:
1465 case llvm::Triple::thumb:
1466 case llvm::Triple::thumbeb:
1467 return getArch() != llvm::Triple::arm &&
getArch() != llvm::Triple::thumb &&
1468 getArch() != llvm::Triple::armeb &&
getArch() != llvm::Triple::thumbeb;
1470 return HostTriple.getArch() !=
getArch();
1479llvm::ExceptionHandling
1481 return llvm::ExceptionHandling::Default;
1485 if (Model ==
"single") {
1487 return Triple.getArch() == llvm::Triple::arm ||
1488 Triple.getArch() == llvm::Triple::armeb ||
1489 Triple.getArch() == llvm::Triple::thumb ||
1490 Triple.getArch() == llvm::Triple::thumbeb || Triple.isWasm();
1491 }
else if (Model ==
"posix")
1503 case llvm::Triple::x86_64: {
1505 if (!Triple.isOSBinFormatMachO())
1508 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1511 StringRef MArch = A->getValue();
1512 if (MArch ==
"x86_64h")
1513 Triple.setArchName(MArch);
1515 return Triple.getTriple();
1517 case llvm::Triple::aarch64: {
1519 if (!Triple.isOSBinFormatMachO())
1520 return Triple.getTriple();
1522 if (Triple.isArm64e())
1523 return Triple.getTriple();
1528 Triple.setArchName(
"arm64");
1529 return Triple.getTriple();
1531 case llvm::Triple::aarch64_32:
1533 case llvm::Triple::amdgpu: {
1537 return Triple.getTriple();
1539 case llvm::Triple::arm:
1540 case llvm::Triple::armeb:
1541 case llvm::Triple::thumb:
1542 case llvm::Triple::thumbeb: {
1547 return Triple.getTriple();
1563 ArgStringList &CC1Args)
const {
1568 const ArgList &DriverArgs, ArgStringList &CC1Args,
BoundArch BA,
1572 ArgStringList &CC1ASArgs)
const {}
1577 llvm::opt::ArgStringList &CmdArgs)
const {
1585 const ArgList &Args)
const {
1587 return *runtimeLibType;
1589 const Arg* A = Args.getLastArg(options::OPT_rtlib_EQ);
1590 StringRef LibName = A ? A->getValue() : CLANG_DEFAULT_RTLIB;
1593 if (LibName ==
"compiler-rt")
1595 else if (LibName ==
"libgcc")
1597 else if (LibName ==
"platform")
1602 << A->getAsString(Args);
1607 return *runtimeLibType;
1611 const ArgList &Args)
const {
1613 return *unwindLibType;
1615 const Arg *A = Args.getLastArg(options::OPT_unwindlib_EQ);
1616 StringRef LibName = A ? A->getValue() : CLANG_DEFAULT_UNWINDLIB;
1618 if (LibName ==
"none")
1620 else if (LibName ==
"platform" || LibName ==
"") {
1630 }
else if (LibName ==
"libunwind") {
1634 }
else if (LibName ==
"libgcc")
1639 << A->getAsString(Args);
1644 return *unwindLibType;
1649 return *cxxStdlibType;
1651 const Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
1652 StringRef LibName = A ? A->getValue() : CLANG_DEFAULT_CXX_STDLIB;
1655 if (LibName ==
"libc++")
1657 else if (LibName ==
"libstdc++")
1659 else if (LibName ==
"platform")
1664 << A->getAsString(Args);
1669 return *cxxStdlibType;
1679 llvm_unreachable(
"unknown C++ standard library type");
1684 return *cStdlibType;
1686 const Arg *A = Args.getLastArg(options::OPT_cstdlib_EQ);
1687 StringRef LibName = A ? A->getValue() :
"system";
1689 if (LibName ==
"newlib")
1691 else if (LibName ==
"picolibc")
1693 else if (LibName ==
"llvm-libc")
1695 else if (LibName ==
"system")
1700 << A->getAsString(Args);
1704 return *cStdlibType;
1709 llvm::opt::ArgStringList &CC1Args,
1710 const Twine &Path) {
1711 CC1Args.push_back(
"-internal-iframework");
1712 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1724 ArgStringList &CC1Args,
1725 const Twine &Path) {
1726 CC1Args.push_back(
"-internal-externc-isystem");
1727 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1731 ArgStringList &CC1Args,
1732 const Twine &Path) {
1733 if (llvm::sys::fs::exists(Path))
1739 ArgStringList &CC1Args,
1740 const Twine &Path) {
1741 CC1Args.push_back(
"-internal-isystem");
1742 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1747 ArgStringList &CC1Args,
1749 for (
const auto &Path : Paths) {
1750 CC1Args.push_back(
"-internal-iframework");
1751 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1757 ArgStringList &CC1Args,
1759 for (
const auto &Path : Paths) {
1760 CC1Args.push_back(
"-internal-isystem");
1761 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1766 const Twine &
C,
const Twine &D) {
1768 llvm::sys::path::append(
Result, llvm::sys::path::Style::posix, A, B,
C, D);
1769 return std::string(
Result);
1775 std::string MaxVersionString;
1777 llvm::sys::path::append(Path,
"c++");
1778 for (llvm::vfs::directory_iterator LI =
getVFS().dir_begin(Path, EC), LE;
1779 !EC && LI != LE; LI = LI.increment(EC)) {
1780 StringRef VersionText = llvm::sys::path::filename(LI->path());
1782 if (VersionText[0] ==
'v' &&
1783 !VersionText.substr(1).getAsInteger(10, Version)) {
1784 if (Version > MaxVersion) {
1785 MaxVersion = Version;
1786 MaxVersionString = std::string(VersionText);
1792 return MaxVersionString;
1796 ArgStringList &CC1Args)
const {
1806 DriverArgs.AddAllArgs(CC1Args, options::OPT_stdlib_EQ);
1810 const llvm::opt::ArgList &DriverArgs,
1811 llvm::opt::ArgStringList &CC1Args)
const {
1812 DriverArgs.ClaimAllArgs(options::OPT_stdlibxx_isystem);
1821 if (!DriverArgs.hasArg(options::OPT_nostdincxx))
1822 for (
const auto &P :
1823 DriverArgs.getAllArgValues(options::OPT_stdlibxx_isystem))
1829 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
1830 options::OPT_nostdlibxx);
1834 ArgStringList &CmdArgs)
const {
1835 assert(!Args.hasArg(options::OPT_nostdlibxx) &&
1836 "should not have called this");
1841 CmdArgs.push_back(
"-lc++");
1842 if (Args.hasArg(options::OPT_fexperimental_library))
1843 CmdArgs.push_back(
"-lc++experimental");
1847 CmdArgs.push_back(
"-lstdc++");
1853 ArgStringList &CmdArgs)
const {
1855 if(LibPath.length() > 0)
1856 CmdArgs.push_back(Args.MakeArgString(StringRef(
"-L") + LibPath));
1860 ArgStringList &CmdArgs)
const {
1861 CmdArgs.push_back(
"-lcc_kext");
1865 std::string &Path)
const {
1869 bool Default = !Args.hasArgNoClaim(options::OPT_shared);
1875 Arg *A = Args.getLastArg(
1876 options::OPT_ffast_math, options::OPT_fno_fast_math,
1877 options::OPT_funsafe_math_optimizations,
1878 options::OPT_fno_unsafe_math_optimizations, options::OPT_ffp_model_EQ);
1880 if (!A || A->getOption().getID() == options::OPT_fno_fast_math ||
1881 A->getOption().getID() == options::OPT_fno_unsafe_math_optimizations)
1883 if (A && A->getOption().getID() == options::OPT_ffp_model_EQ) {
1884 StringRef Model = A->getValue();
1885 if (Model !=
"fast" && Model !=
"aggressive")
1892 if (!Args.hasFlag(options::OPT_mdaz_ftz, options::OPT_mno_daz_ftz,
Default))
1897 return (Path !=
"crtfastmath.o");
1901 ArgStringList &CmdArgs)
const {
1904 CmdArgs.push_back(Args.MakeArgString(Path));
1924 (SanitizerKind::CFI & ~SanitizerKind::CFIICall) |
1925 SanitizerKind::CFICastStrict | SanitizerKind::FloatDivideByZero |
1926 SanitizerKind::KCFI | SanitizerKind::UnsignedIntegerOverflow |
1927 SanitizerKind::UnsignedShiftBase | SanitizerKind::ImplicitConversion |
1928 SanitizerKind::Nullability | SanitizerKind::LocalBounds |
1929 SanitizerKind::AllocToken;
1937 Res |= SanitizerKind::CFIICall;
1940 Res |= SanitizerKind::ShadowCallStack;
1942 Res |= SanitizerKind::MemTag;
1944 Res |= SanitizerKind::KernelAddress;
1949 ArgStringList &CC1Args)
const {}
1952 ArgStringList &CC1Args)
const {}
1955 ArgStringList &CC1Args)
const {}
1964 ArgStringList &CC1Args)
const {}
1968 return VersionTuple(Version);
1970 if (Version < 10000)
1971 return VersionTuple(Version / 100, Version % 100);
1973 unsigned Build = 0, Factor = 1;
1974 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
1975 Build = Build + (Version % 10) * Factor;
1976 return VersionTuple(Version / 100, Version % 100, Build);
1981 const llvm::opt::ArgList &Args)
const {
1982 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
1983 const Arg *MSCompatibilityVersion =
1984 Args.getLastArg(options::OPT_fms_compatibility_version);
1986 if (MSCVersion && MSCompatibilityVersion) {
1988 D->Diag(diag::err_drv_argument_not_allowed_with)
1989 << MSCVersion->getAsString(Args)
1990 << MSCompatibilityVersion->getAsString(Args);
1991 return VersionTuple();
1994 if (MSCompatibilityVersion) {
1996 if (MSVT.tryParse(MSCompatibilityVersion->getValue())) {
1998 D->Diag(diag::err_drv_invalid_value)
1999 << MSCompatibilityVersion->getAsString(Args)
2000 << MSCompatibilityVersion->getValue();
2007 unsigned Version = 0;
2008 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version)) {
2010 D->Diag(diag::err_drv_invalid_value)
2011 << MSCVersion->getAsString(Args) << MSCVersion->getValue();
2017 return VersionTuple();
2021 const llvm::opt::DerivedArgList &Args,
const llvm::Triple &HostTriple,
2023 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
2025 bool Modified =
false;
2026 bool SameTripleAsHost =
getTriple() == HostTriple;
2029 for (
auto *A : Args) {
2034 if (A->getOption().matches(options::OPT_m_Group)) {
2041 if (SameTripleAsHost ||
2042 A->getOption().matches(options::OPT_mcode_object_version_EQ) ||
2043 A->getOption().matches(options::OPT_mlinker_version_EQ))
2052 bool XOpenMPTargetNoTriple =
2053 A->getOption().matches(options::OPT_Xopenmp_target);
2055 if (A->getOption().matches(options::OPT_Xopenmp_target_EQ)) {
2060 Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
2063 }
else if (XOpenMPTargetNoTriple) {
2065 Index = Args.getBaseArgs().MakeIndex(A->getValue(0));
2073 std::unique_ptr<Arg> XOpenMPTargetArg(Opts.ParseOneArg(Args, Index));
2074 if (!XOpenMPTargetArg || Index > Prev + 1) {
2075 if (!A->isClaimed()) {
2076 getDriver().
Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
2077 << A->getAsString(Args);
2081 if (XOpenMPTargetNoTriple && XOpenMPTargetArg &&
2082 Args.getAllArgValues(options::OPT_offload_targets_EQ).size() != 1) {
2083 getDriver().
Diag(diag::err_drv_Xopenmp_target_missing_triple);
2086 XOpenMPTargetArg->setBaseArg(A);
2087 A = XOpenMPTargetArg.release();
2088 if (A->getOption().matches(options::OPT_D) &&
2089 (
getDriver().IsCLMode() || HostTriple.isWindowsMSVCEnvironment()))
2092 AllocatedArgs.push_back(A);
2099 if (!
getDriver().IsCLMode() && HostTriple.isWindowsMSVCEnvironment()) {
2100 DerivedArgList *Translated =
2116 const llvm::opt::DerivedArgList &Args, llvm::opt::Arg *&A,
2117 llvm::opt::DerivedArgList *DAL,
2120 unsigned ValuePos = 1;
2121 if (A->getOption().matches(options::OPT_Xarch_device) ||
2122 A->getOption().matches(options::OPT_Xarch_host))
2125 const InputArgList &BaseArgs = Args.getBaseArgs();
2126 unsigned Index = BaseArgs.MakeIndex(A->getValue(ValuePos));
2127 unsigned Prev = Index;
2128 std::unique_ptr<llvm::opt::Arg> XarchArg(Opts.ParseOneArg(
2138 if (!XarchArg || Index > Prev + 1) {
2139 getDriver().
Diag(diag::err_drv_invalid_Xarch_argument_with_args)
2140 << A->getAsString(Args);
2146 "invalid Xarch argument: '%0', not all driver "
2147 "options can be forwared via Xarch argument");
2148 Diags.Report(DiagID) << A->getAsString(Args);
2152 XarchArg->setBaseArg(A);
2153 A = XarchArg.release();
2161 for (
const char *
Value : A->getValues()) {
2162 auto Opt = Opts.getOption(options::OPT_Zlinker_input);
2163 unsigned Index = BaseArgs.MakeIndex(Opt.getName(),
Value);
2165 new Arg(Opt, BaseArgs.MakeArgString(Opt.getPrefix() + Opt.getName()),
2166 Index, BaseArgs.getArgString(Index + 1), A);
2168 DAL->append(NewArg);
2170 DAL->AddSynthesizedArg(NewArg);
2172 AllocatedArgs->push_back(NewArg);
2177 DAL->AddSynthesizedArg(A);
2179 AllocatedArgs->push_back(A);
2182 if (A->getOption().matches(options::OPT_D) &&
2184 llvm::Triple(llvm::Triple::normalize(
getDriver().getTargetTriple()))
2185 .isWindowsMSVCEnvironment()))
2192 StringRef XArchVal) {
2193 llvm::Triple ParsedTriple(XArchVal);
2197 if (TT.isAMDGCN() && ParsedTriple.isAMDGCN())
2198 return llvm::AMDGPU::isSubArchCompatible(TT, ParsedTriple);
2200 return TT.getArch() == ParsedTriple.getArch() &&
2201 TT.getSubArch() == ParsedTriple.getSubArch();
2205 const llvm::opt::DerivedArgList &Args,
BoundArch BA,
2208 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
2209 bool Modified =
false;
2212 for (Arg *A : Args) {
2213 bool NeedTrans =
false;
2215 if (A->getOption().matches(options::OPT_Xarch_device)) {
2216 NeedTrans = IsDevice;
2218 }
else if (A->getOption().matches(options::OPT_Xarch_host)) {
2219 NeedTrans = !IsDevice;
2221 }
else if (A->getOption().matches(options::OPT_Xarch__)) {
2222 StringRef Val = A->getValue();
2227 if (NeedTrans ||
Skip)
Result
Implement __builtin_bit_cast and related operations.
Defines types useful for describing an Objective-C runtime.
Defines the clang::SanitizerKind enum.
unsigned getCustomDiagID(Level L, const char(&FormatString)[N])
Return an ID for a diagnostic with the specified format string and level.
The basic abstraction for the target Objective-C runtime.
@ GNUstep
'gnustep' is the modern non-fragile GNUstep runtime.
@ GCC
'gcc' is the Objective-C runtime shipped with GCC, implementing a fragile Objective-C ABI
The base class of the type hierarchy.
ActionClass getKind() const
@ BinaryTranslatorJobClass
@ OffloadBundlingJobClass
@ VerifyDebugInfoJobClass
@ OffloadPackagerJobClass
static llvm::opt::DerivedArgList * translateArgs(const llvm::opt::DerivedArgList &Args, const llvm::Triple &HostTriple, const llvm::opt::DerivedArgList &Owner)
Translate a filtered list that may contain new clang-cl options, replacing earlier /O expansions.
static const char * translateMacroDefinition(const char *Value, const llvm::opt::ArgList &Args)
Normalize MSVC's '#' macro separator, also used by Clang targeting MSVC and by arguments parsed after...
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
DiagnosticsEngine & getDiags() const
OpenMPRuntimeKind getOpenMPRuntime(const llvm::opt::ArgList &Args) const
Compute the desired OpenMP runtime from the flags provided.
DiagnosticBuilder Diag(unsigned DiagID) const
StringRef getFlangF128MathLibrary() const
const llvm::opt::OptTable & getOpts() const
llvm::vfs::FileSystem & getVFS() const
@ OMPRT_OMP
The LLVM OpenMP runtime.
StringRef getPreferredLinker() const
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
static llvm::ErrorOr< MultilibSet > parseYaml(llvm::MemoryBufferRef, llvm::SourceMgr::DiagHandlerTy=nullptr, void *DiagHandlerCtxt=nullptr)
This corresponds to a single GCC Multilib, or a segment of one controlled by a command line flag.
std::vector< std::string > flags_list
ID lookupTypeForExtension(llvm::StringRef Ext)
lookupTypeForExtension - Lookup the type to use for the file extension Ext.
LTOKind
Describes the kind of LTO mode selected via -f(no-)?lto(=.*)? options.
bool isOptimizationLevelFast(const llvm::opt::ArgList &Args)
Top level wrappers for InstallAPI frontend operations.
@ Link
'link' clause, allowed on 'declare' construct.
@ Default
Set to the current date and time.
@ Result
The result type of a method or function.
const FunctionProtoType * T
Diagnostic wrappers for TextAPI types for error reporting.
Represents a bound architecture for offload / multiple architecture compilation.
Helper structure used to pass information extracted from clang executable name such as i686-linux-and...