19#include "clang/Config/config.h"
28#include "llvm/ADT/SmallString.h"
29#include "llvm/ADT/StringExtras.h"
30#include "llvm/ADT/StringRef.h"
31#include "llvm/ADT/Twine.h"
32#include "llvm/Config/llvm-config.h"
33#include "llvm/MC/MCTargetOptions.h"
34#include "llvm/MC/TargetRegistry.h"
35#include "llvm/Option/Arg.h"
36#include "llvm/Option/ArgList.h"
37#include "llvm/Option/OptTable.h"
38#include "llvm/Option/Option.h"
39#include "llvm/Support/ErrorHandling.h"
40#include "llvm/Support/FileSystem.h"
41#include "llvm/Support/FileUtilities.h"
42#include "llvm/Support/MemoryBuffer.h"
43#include "llvm/Support/Path.h"
44#include "llvm/Support/Process.h"
45#include "llvm/Support/VersionTuple.h"
46#include "llvm/Support/VirtualFileSystem.h"
47#include "llvm/TargetParser/AArch64TargetParser.h"
48#include "llvm/TargetParser/RISCVISAInfo.h"
49#include "llvm/TargetParser/TargetParser.h"
50#include "llvm/TargetParser/Triple.h"
63 return Args.getLastArg(options::OPT_mkernel, options::OPT_fapple_kext,
64 options::OPT_fno_rtti, options::OPT_frtti);
68 const llvm::Triple &Triple,
69 const Arg *CachedRTTIArg) {
72 if (CachedRTTIArg->getOption().matches(options::OPT_frtti))
79 bool NoRTTI = Triple.isPS() || Triple.isDriverKit();
84 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
96 assert(T.str() == T.normalize() &&
"triple should be normalized");
97 auto addIfExists = [
this](
path_list &List,
const std::string &Path) {
119 const Driver &D, StringRef Fallback) {
120 std::optional<std::string> MultilibPath =
124 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> MB =
125 D.getVFS().getBufferForFile(*MultilibPath);
130 llvm::ErrorOr<MultilibSet> ErrorOrMultilibSet =
132 if (ErrorOrMultilibSet.getError())
135 Multilibs = std::move(ErrorOrMultilibSet.get());
144 for (StringRef Define : CustomFlagMacroDefines)
148 D.Diag(clang::diag::warn_drv_missing_multilib) << llvm::join(Flags,
" ");
150 raw_svector_ostream OS(
Data);
153 OS <<
"\n" << llvm::join(M.flags(),
" ");
154 D.Diag(clang::diag::note_drv_available_multilibs) << OS.str();
158 D.Diag(clang::diag::err_drv_multilib_custom_error)
159 << M.getErrorMessage();
167 StringRef YAMLBase = llvm::sys::path::parent_path(*MultilibPath);
169 size_t FileInsertPos = 0;
170 size_t LibInsertPos = 0;
175 llvm::sys::path::append(FilePath, M.gccSuffix());
177 std::string(FilePath));
181 llvm::sys::path::append(LibPath, M.gccSuffix());
183 std::string(LibPath));
191std::optional<std::string>
193 StringRef FallbackDir) {
194 if (Arg *A = Args.getLastArg(options::OPT_multi_lib_config)) {
196 if (!D.getVFS().exists(MultilibPath)) {
197 D.Diag(clang::diag::err_drv_no_such_file) << MultilibPath.str();
200 return std::string(MultilibPath);
204 if (!FallbackDir.empty())
205 MultilibPath = FallbackDir;
206 else if (std::optional<std::string> StdlibDir =
getStdlibPath())
207 MultilibPath = *StdlibDir;
210 llvm::sys::path::append(MultilibPath,
"multilib.yaml");
211 if (!D.getVFS().exists(MultilibPath))
213 return std::string(MultilibPath);
217 Triple.setEnvironment(Env);
218 if (EffectiveTriple != llvm::Triple())
219 EffectiveTriple.setEnvironment(Env);
229 return Args.hasFlag(options::OPT_fintegrated_as,
230 options::OPT_fno_integrated_as,
238 "(Non-)integrated backend set incorrectly!");
240 bool IBackend = Args.hasFlag(options::OPT_fintegrated_objemitter,
241 options::OPT_fno_integrated_objemitter,
249 DiagID = clang::diag::err_drv_unsupported_opt_for_target;
251 DiagID = clang::diag::warn_drv_unsupported_opt_for_target;
252 Arg *A = Args.getLastArg(options::OPT_fno_integrated_objemitter);
254 D.Diag(DiagID) << A->getAsString(Args) << Triple.getTriple();
255 A = Args.getLastArg(options::OPT_fintegrated_objemitter);
257 D.Diag(DiagID) << A->getAsString(Args) << Triple.getTriple();
263 return ENABLE_X86_RELAX_RELOCATIONS;
267 return PPC_LINUX_DEFAULT_IEEELONGDOUBLE &&
getTriple().isOSLinux();
271 const llvm::opt::ArgList &Args) {
272 for (
const Arg *MultilibFlagArg :
273 Args.filtered(options::OPT_fmultilib_flag)) {
274 List.push_back(MultilibFlagArg->getAsString(Args));
275 MultilibFlagArg->claim();
280 const llvm::Triple &Triple,
281 const llvm::opt::ArgList &Args,
283 std::vector<StringRef> Features;
288 llvm::DenseSet<StringRef> FeatureSet(UnifiedFeatures.begin(),
289 UnifiedFeatures.end());
290 std::vector<std::string> MArch;
291 for (
const auto &Ext : AArch64::Extensions)
292 if (!Ext.UserVisibleName.empty())
293 if (FeatureSet.contains(Ext.PosTargetFeature))
294 MArch.push_back(Ext.UserVisibleName.str());
295 for (
const auto &Ext : AArch64::Extensions)
296 if (!Ext.UserVisibleName.empty())
297 if (FeatureSet.contains(Ext.NegTargetFeature))
298 MArch.push_back((
"no" + Ext.UserVisibleName).str());
300 for (
const auto &ArchInfo : AArch64::ArchInfos)
301 if (FeatureSet.contains(ArchInfo->ArchFeature))
302 ArchName = ArchInfo->Name;
303 if (!ArchName.empty()) {
304 MArch.insert(MArch.begin(), (
"-march=" + ArchName).str());
305 Result.push_back(llvm::join(MArch,
"+"));
308 const Arg *BranchProtectionArg =
309 Args.getLastArgNoClaim(options::OPT_mbranch_protection_EQ);
310 if (BranchProtectionArg) {
311 Result.push_back(BranchProtectionArg->getAsString(Args));
314 if (FeatureSet.contains(
"+strict-align"))
315 Result.push_back(
"-mno-unaligned-access");
317 Result.push_back(
"-munaligned-access");
319 if (Arg *Endian = Args.getLastArg(options::OPT_mbig_endian,
320 options::OPT_mlittle_endian)) {
321 if (Endian->getOption().matches(options::OPT_mbig_endian))
322 Result.push_back(Endian->getAsString(Args));
325 const Arg *ABIArg = Args.getLastArgNoClaim(options::OPT_mabi_EQ);
327 Result.push_back(ABIArg->getAsString(Args));
330 if (
const Arg *A = Args.getLastArg(options::OPT_O_Group);
331 A && A->getOption().matches(options::OPT_O)) {
332 switch (A->getValue()[0]) {
344 llvm::Reloc::Model RelocationModel,
345 const llvm::opt::ArgList &Args,
347 std::vector<StringRef> Features;
349 D, Triple, Args, Features,
false ,
true );
351 llvm::DenseSet<StringRef> FeatureSet(UnifiedFeatures.begin(),
352 UnifiedFeatures.end());
353 std::vector<std::string> MArch;
354 for (
const auto &Ext : ARM::ARCHExtNames)
355 if (!Ext.Name.empty())
356 if (FeatureSet.contains(Ext.Feature))
357 MArch.push_back(Ext.Name.str());
358 for (
const auto &Ext : ARM::ARCHExtNames)
359 if (!Ext.Name.empty())
360 if (FeatureSet.contains(Ext.NegFeature))
361 MArch.push_back((
"no" + Ext.Name).str());
362 MArch.insert(MArch.begin(), (
"-march=" + Triple.getArchName()).str());
363 Result.push_back(llvm::join(MArch,
"+"));
366#define ARM_FPU(NAME, KIND, VERSION, NEON_SUPPORT, RESTRICTION) \
367 case llvm::ARM::KIND: \
368 Result.push_back("-mfpu=" NAME); \
370#include "llvm/TargetParser/ARMTargetParser.def"
372 llvm_unreachable(
"Invalid FPUKind");
376 case arm::FloatABI::Soft:
377 Result.push_back(
"-mfloat-abi=soft");
379 case arm::FloatABI::SoftFP:
380 Result.push_back(
"-mfloat-abi=softfp");
382 case arm::FloatABI::Hard:
383 Result.push_back(
"-mfloat-abi=hard");
385 case arm::FloatABI::Invalid:
386 llvm_unreachable(
"Invalid float ABI");
389 if (RelocationModel == llvm::Reloc::ROPI ||
390 RelocationModel == llvm::Reloc::ROPI_RWPI)
391 Result.push_back(
"-fropi");
393 Result.push_back(
"-fno-ropi");
395 if (RelocationModel == llvm::Reloc::RWPI ||
396 RelocationModel == llvm::Reloc::ROPI_RWPI)
397 Result.push_back(
"-frwpi");
399 Result.push_back(
"-fno-rwpi");
401 const Arg *BranchProtectionArg =
402 Args.getLastArgNoClaim(options::OPT_mbranch_protection_EQ);
403 if (BranchProtectionArg) {
404 Result.push_back(BranchProtectionArg->getAsString(Args));
407 if (FeatureSet.contains(
"+strict-align"))
408 Result.push_back(
"-mno-unaligned-access");
410 Result.push_back(
"-munaligned-access");
412 if (Arg *Endian = Args.getLastArg(options::OPT_mbig_endian,
413 options::OPT_mlittle_endian)) {
414 if (Endian->getOption().matches(options::OPT_mbig_endian))
415 Result.push_back(Endian->getAsString(Args));
418 if (
const Arg *A = Args.getLastArg(options::OPT_O_Group);
419 A && A->getOption().matches(options::OPT_O)) {
420 switch (A->getValue()[0]) {
432 const llvm::opt::ArgList &Args,
434 bool hasShadowCallStack) {
437 auto ISAInfo = llvm::RISCVISAInfo::parseArchString(
439 if (!llvm::errorToBool(ISAInfo.takeError()))
440 Result.push_back(
"-march=" + (*ISAInfo)->toString());
444 if (hasShadowCallStack)
445 Result.push_back(
"-fsanitize=shadow-call-stack");
447 Result.push_back(
"-fno-sanitize=shadow-call-stack");
454 std::vector<std::string>
Result;
456 Result.push_back(
"--target=" + Triple.str());
462 llvm::Reloc::Model RelocationModel;
467 std::tie(RelocationModel, PICLevel, IsPIE) =
ParsePICArgs(*
this, Args);
470 switch (Triple.getArch()) {
471 case llvm::Triple::aarch64:
472 case llvm::Triple::aarch64_32:
473 case llvm::Triple::aarch64_be:
476 case llvm::Triple::arm:
477 case llvm::Triple::armeb:
478 case llvm::Triple::thumb:
479 case llvm::Triple::thumbeb:
482 case llvm::Triple::riscv32:
483 case llvm::Triple::riscv64:
484 case llvm::Triple::riscv32be:
485 case llvm::Triple::riscv64be:
498 Result.push_back(
"-fno-rtti");
500 Result.push_back(
"-frtti");
503 Result.push_back(
"-fno-exceptions");
505 Result.push_back(
"-fexceptions");
507 if (RelocationModel == llvm::Reloc::PIC_)
508 Result.push_back(IsPIE ? (PICLevel > 1 ?
"-fPIE" :
"-fpie")
509 : (PICLevel > 1 ?
"-fPIC" :
"-fpic"));
511 Result.push_back(
"-fno-pic");
526 bool DiagnoseBoundArchErrors =
527 BoundArchSanitizerArgsChecked.insert(BoundArch).second;
528 if (!BoundArch.empty() &&
getTriple().isGPU() &&
529 !JobArgs.hasFlag(options::OPT_fgpu_sanitize,
530 options::OPT_fno_gpu_sanitize,
true)) {
531 DiagnoseBoundArchErrors =
false;
535 !SanitizerArgsChecked,
536 DiagnoseBoundArchErrors, BoundArch, DeviceOffloadKind);
538 SanitizerArgsChecked =
true;
543 XRayArgs XRayArguments(*
this, JobArgs);
544 return XRayArguments;
551 const char *ModeFlag;
560 static const DriverSuffix DriverSuffixes[] = {
562 {
"clang++",
"--driver-mode=g++"},
563 {
"clang-c++",
"--driver-mode=g++"},
564 {
"clang-cc",
nullptr},
565 {
"clang-cpp",
"--driver-mode=cpp"},
566 {
"clang-g++",
"--driver-mode=g++"},
567 {
"clang-gcc",
nullptr},
568 {
"clang-cl",
"--driver-mode=cl"},
570 {
"cpp",
"--driver-mode=cpp"},
571 {
"cl",
"--driver-mode=cl"},
572 {
"++",
"--driver-mode=g++"},
573 {
"flang",
"--driver-mode=flang"},
576 {
"flang-new",
"--driver-mode=flang"},
577 {
"clang-dxc",
"--driver-mode=dxc"},
580 for (
const auto &DS : DriverSuffixes) {
581 StringRef Suffix(DS.Suffix);
582 if (ProgName.ends_with(Suffix)) {
583 Pos = ProgName.size() - Suffix.size();
593 std::string ProgName = std::string(llvm::sys::path::filename(Argv0));
594 if (is_style_windows(llvm::sys::path::Style::native)) {
596 std::transform(ProgName.begin(), ProgName.end(), ProgName.begin(),
612 if (!DS && ProgName.ends_with(
".exe")) {
615 ProgName = ProgName.drop_back(StringRef(
".exe").size());
622 ProgName = ProgName.rtrim(
"0123456789.");
629 ProgName = ProgName.slice(0, ProgName.rfind(
'-'));
642 size_t SuffixEnd = SuffixPos + strlen(DS->Suffix);
644 size_t LastComponent = ProgName.rfind(
'-', SuffixPos);
645 if (LastComponent == std::string::npos)
647 std::string ModeSuffix = ProgName.substr(LastComponent + 1,
648 SuffixEnd - LastComponent - 1);
651 StringRef Prefix(ProgName);
652 Prefix = Prefix.slice(0, LastComponent);
653 std::string IgnoredError;
655 llvm::Triple Triple(Prefix);
656 bool IsRegistered = llvm::TargetRegistry::lookupTarget(Triple, IgnoredError);
665 switch (Triple.getArch()) {
666 case llvm::Triple::aarch64: {
671 case llvm::Triple::aarch64_32:
673 case llvm::Triple::ppc:
675 case llvm::Triple::ppcle:
677 case llvm::Triple::ppc64:
679 case llvm::Triple::ppc64le:
682 return Triple.getArchName();
695Tool *ToolChain::getClang()
const {
701Tool *ToolChain::getFlang()
const {
712 llvm_unreachable(
"Linking is not supported by this toolchain");
716 llvm_unreachable(
"Creating static lib is not supported by this toolchain");
719Tool *ToolChain::getAssemble()
const {
722 return Assemble.get();
725Tool *ToolChain::getClangAs()
const {
728 return Assemble.get();
731Tool *ToolChain::getLink()
const {
737Tool *ToolChain::getStaticLibTool()
const {
740 return StaticLibTool.get();
743Tool *ToolChain::getIfsMerge()
const {
745 IfsMerge.reset(
new tools::ifstool::Merger(*
this));
746 return IfsMerge.get();
749Tool *ToolChain::getOffloadBundler()
const {
751 OffloadBundler.reset(
new tools::OffloadBundler(*
this));
752 return OffloadBundler.get();
755Tool *ToolChain::getOffloadPackager()
const {
756 if (!OffloadPackager)
757 OffloadPackager.reset(
new tools::OffloadPackager(*
this));
758 return OffloadPackager.get();
761Tool *ToolChain::getLinkerWrapper()
const {
763 LinkerWrapper.reset(
new tools::LinkerWrapper(*
this, getLink()));
764 return LinkerWrapper.get();
770 return getAssemble();
773 return getIfsMerge();
779 return getStaticLibTool();
790 llvm_unreachable(
"Invalid tool kind.");
803 return getOffloadBundler();
806 return getOffloadPackager();
808 return getLinkerWrapper();
811 llvm_unreachable(
"Invalid tool kind.");
815 const ArgList &Args) {
816 const llvm::Triple &Triple = TC.
getTriple();
817 bool IsWindows = Triple.isOSWindows();
820 return Triple.getArchName();
822 if (TC.
getArch() == llvm::Triple::arm || TC.
getArch() == llvm::Triple::armeb)
828 if (TC.
getArch() == llvm::Triple::x86 && Triple.isAndroid())
831 if (TC.
getArch() == llvm::Triple::x86_64 && Triple.isX32())
834 return llvm::Triple::getArchTypeName(TC.
getArch());
838 if (Triple.isOSDarwin())
841 switch (Triple.getOS()) {
842 case llvm::Triple::FreeBSD:
844 case llvm::Triple::NetBSD:
846 case llvm::Triple::OpenBSD:
848 case llvm::Triple::Solaris:
850 case llvm::Triple::AIX:
852 case llvm::Triple::Serenity:
866 }
else if (Triple.isOSUnknown()) {
867 llvm::sys::path::append(Path,
"lib");
871 return std::string(Path);
878 return llvm::sys::path::filename(CRTAbsolutePath).str();
884 bool IsFortran)
const {
886 bool IsITANMSVCWindows =
887 TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment();
894 Suffix = IsITANMSVCWindows ?
".obj" :
".o";
897 Suffix = IsITANMSVCWindows ?
".lib" :
".a";
900 if (TT.isOSWindows())
901 Suffix = TT.isOSCygMing() ?
".dll.a" :
".lib";
902 else if (TT.isOSAIX())
909 std::string ArchAndEnv;
912 const char *Env = TT.isAndroid() ?
"-android" :
"";
913 ArchAndEnv = (
"-" +
Arch + Env).str();
916 std::string LibName = IsFortran ?
"flang_rt." :
"clang_rt.";
917 return (Prefix + Twine(LibName) + Component + ArchAndEnv + Suffix).str();
924 Args, Component,
Type,
false, IsFortran);
928 llvm::sys::path::append(P, CRTBasename);
930 return std::string(P);
937 !IsFortran, IsFortran);
939 llvm::sys::path::append(OldPath, CRTBasename);
940 if (Path.empty() ||
getVFS().exists(OldPath))
941 return std::string(OldPath);
946 return std::string(Path);
952 bool isFortran)
const {
958 llvm::opt::ArgStringList &CmdArgs)
const {
963 if (!
getTriple().isKnownWindowsMSVCEnvironment()) {
965 F128LibName.consume_front_insensitive(
"lib");
966 if (!F128LibName.empty()) {
968 CmdArgs.push_back(
"-lflang_rt.quadmath");
971 CmdArgs.push_back(Args.MakeArgString(
"-l" + F128LibName));
980 CmdArgs.push_back(
"-lexecinfo");
984 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
985 options::OPT_fno_openmp,
false)) {
990 !
getTriple().isKnownWindowsMSVCEnvironment()) {
992 CmdArgs.push_back(
"-lcompiler_rt");
994 CmdArgs.push_back(
"-latomic");
1000 ArgStringList &CmdArgs)
const {
1001 auto AddLibSearchPathIfExists = [&](
const Twine &Path) {
1003 if (!llvm::sys::fs::is_directory(Path))
1006 if (
getTriple().isKnownWindowsMSVCEnvironment())
1007 CmdArgs.push_back(Args.MakeArgString(
"-libpath:" + Path));
1009 CmdArgs.push_back(Args.MakeArgString(
"-L" + Path));
1022 llvm::sys::path::parent_path(
getDriver().Dir);
1023 llvm::sys::path::append(DefaultLibPath,
"lib");
1024 AddLibSearchPathIfExists(DefaultLibPath);
1028 llvm::opt::ArgStringList &CmdArgs)
const {
1031 if (Args.hasFlag(options::OPT_static_libflangrt,
1032 options::OPT_shared_libflangrt,
getTriple().isOSAIX()))
1036 CmdArgs.push_back(
"-lflang_rt.runtime");
1044std::optional<std::string>
1045ToolChain::getFallbackAndroidTargetPath(StringRef BaseDir)
const {
1046 llvm::Triple TripleWithoutLevel(
getTriple());
1047 TripleWithoutLevel.setEnvironmentName(
"android");
1048 const std::string &TripleWithoutLevelStr = TripleWithoutLevel.str();
1049 unsigned TripleVersion =
getTriple().getEnvironmentVersion().getMajor();
1050 unsigned BestVersion = 0;
1053 bool UsingUnversionedDir =
false;
1055 for (llvm::vfs::directory_iterator LI =
getVFS().dir_begin(BaseDir, EC), LE;
1056 !EC && LI != LE; LI = LI.increment(EC)) {
1057 StringRef DirName = llvm::sys::path::filename(LI->path());
1058 StringRef DirNameSuffix = DirName;
1059 if (DirNameSuffix.consume_front(TripleWithoutLevelStr)) {
1060 if (DirNameSuffix.empty() && TripleDir.empty()) {
1061 TripleDir = DirName;
1062 UsingUnversionedDir =
true;
1065 if (!DirNameSuffix.getAsInteger(10, Version) && Version > BestVersion &&
1066 Version < TripleVersion) {
1067 BestVersion = Version;
1068 TripleDir = DirName;
1069 UsingUnversionedDir =
false;
1075 if (TripleDir.empty())
1078 SmallString<128> P(BaseDir);
1079 llvm::sys::path::append(P, TripleDir);
1080 if (UsingUnversionedDir)
1081 D.Diag(diag::warn_android_unversioned_fallback) << P <<
getTripleString();
1082 return std::string(P);
1086 return (Triple.hasEnvironment()
1087 ? llvm::Triple(Triple.getArchName(), Triple.getVendorName(),
1088 llvm::Triple::getOSTypeName(Triple.getOS()),
1089 llvm::Triple::getEnvironmentTypeName(
1090 Triple.getEnvironment()))
1091 : llvm::Triple(Triple.getArchName(), Triple.getVendorName(),
1092 llvm::Triple::getOSTypeName(Triple.getOS())));
1095std::optional<std::string>
1097 auto getPathForTriple =
1098 [&](
const llvm::Triple &Triple) -> std::optional<std::string> {
1100 llvm::sys::path::append(P, Triple.str());
1102 return std::string(P);
1107 if (
auto Path = getPathForTriple(T))
1111 llvm::Triple AIXTriple;
1112 if (T.getEnvironment() == Triple::UnknownEnvironment) {
1114 AIXTriple = llvm::Triple(T.getArchName(), T.getVendorName(),
1115 llvm::Triple::getOSTypeName(T.getOS()));
1120 if (
auto Path = getPathForTriple(AIXTriple))
1125 (!T.getOSVersion().empty() || !T.getEnvironmentVersion().empty())) {
1128 if (
auto Path = getPathForTriple(TripleWithoutVersion))
1147 if (T.getArch() == Triple::arm && !T.isArmMClass()) {
1148 llvm::Triple ArmTriple = T;
1149 ArmTriple.setArch(Triple::arm);
1150 if (
auto Path = getPathForTriple(ArmTriple))
1155 return getFallbackAndroidTargetPath(BaseDir);
1162 llvm::sys::path::append(P,
"finclude",
"flang");
1168 llvm::sys::path::append(P,
"lib");
1172 if (Triple.isOSDarwin())
1175 llvm::sys::path::append(P, Triple.str());
1176 return std::string(P);
1181 llvm::sys::path::append(P,
"..",
"lib");
1187 llvm::sys::path::append(P,
"..",
"include");
1196 llvm::sys::path::append(Path,
"lib");
1198 llvm::sys::path::append(Path, S);
1199 Paths.push_back(std::string(Path));
1208 if (Args.hasArg(options::OPT_noprofilelib))
1211 return Args.hasArg(options::OPT_fprofile_generate) ||
1212 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
1213 Args.hasArg(options::OPT_fcs_profile_generate) ||
1214 Args.hasArg(options::OPT_fcs_profile_generate_EQ) ||
1215 Args.hasArg(options::OPT_fprofile_instr_generate) ||
1216 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
1217 Args.hasArg(options::OPT_fcreate_profile) ||
1218 Args.hasArg(options::OPT_fprofile_generate_cold_function_coverage) ||
1219 Args.hasArg(options::OPT_fprofile_generate_cold_function_coverage_EQ);
1223 return Args.hasArg(options::OPT_coverage) ||
1224 Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
1229 if (D.IsFlangMode() &&
getDriver().ShouldUseFlangCompiler(JA))
return getFlang();
1230 if (
getDriver().ShouldUseClangCompiler(JA))
return getClang();
1234 return getClangAs();
1239 return D.GetFilePath(Name, *
this);
1243 return D.GetProgramPath(Name, *
this);
1248 *LinkerIsLLD =
false;
1252 const Arg* A = Args.getLastArg(options::OPT_fuse_ld_EQ);
1260 if (
const Arg *A = Args.getLastArg(options::OPT_ld_path_EQ)) {
1261 std::string Path(A->getValue());
1262 if (!Path.empty()) {
1263 if (llvm::sys::path::parent_path(Path).empty())
1265 if (llvm::sys::fs::can_execute(Path)) {
1267 *LinkerIsLLD = UseLinker ==
"lld";
1268 return std::string(Path);
1271 getDriver().
Diag(diag::err_drv_invalid_linker_name) << A->getAsString(Args);
1276 if (UseLinker.empty() || UseLinker ==
"ld") {
1278 if (llvm::sys::path::is_absolute(DefaultLinker))
1279 return std::string(DefaultLinker);
1288 if (UseLinker.contains(
'/'))
1291 if (llvm::sys::path::is_absolute(UseLinker)) {
1294 if (llvm::sys::fs::can_execute(UseLinker))
1295 return std::string(UseLinker);
1298 if (Triple.isOSDarwin())
1299 LinkerName.append(
"ld64.");
1301 LinkerName.append(
"ld.");
1302 LinkerName.append(UseLinker);
1305 if (llvm::sys::fs::can_execute(LinkerPath)) {
1307 *LinkerIsLLD = UseLinker ==
"lld";
1313 getDriver().
Diag(diag::err_drv_invalid_linker_name) << A->getAsString(Args);
1320 if (Triple.isOSDarwin())
1331 if (D.IsFlangMode() &&
id == types::TY_PP_Fortran)
1332 id = types::TY_Fortran;
1349 llvm::opt::OptSpecifier OptEq,
1350 llvm::opt::OptSpecifier OptNeg) {
1351 if (!Args.hasFlag(OptEq, OptNeg,
false))
1354 const Arg *A = Args.getLastArg(OptEq);
1355 StringRef LTOName = A->getValue();
1357 return llvm::StringSwitch<LTOKind>(LTOName)
1367 auto OptEq = IsOffload ? options::OPT_foffload_lto_EQ : options::OPT_flto_EQ;
1368 auto OptNeg = IsOffload ? options::OPT_fno_offload_lto : options::OPT_fno_lto;
1372 if (IsOffload && Args.hasFlag(options::OPT_fopenmp_target_jit,
1373 options::OPT_fno_openmp_target_jit,
false)) {
1374 if (Arg *A = Args.getLastArg(OptEq, OptNeg))
1377 << A->getSpelling() <<
"-fopenmp-target-jit";
1381 if (!Args.hasArg(OptEq, OptNeg))
1387 const Arg *A = Args.getLastArg(OptEq);
1389 << A->getSpelling() << A->getValue();
1396 llvm::Triple HostTriple(LLVM_HOST_TRIPLE);
1397 switch (HostTriple.getArch()) {
1400 case llvm::Triple::arm:
1401 case llvm::Triple::armeb:
1402 case llvm::Triple::thumb:
1403 case llvm::Triple::thumbeb:
1404 return getArch() != llvm::Triple::arm &&
getArch() != llvm::Triple::thumb &&
1405 getArch() != llvm::Triple::armeb &&
getArch() != llvm::Triple::thumbeb;
1407 return HostTriple.getArch() !=
getArch();
1416llvm::ExceptionHandling
1418 return llvm::ExceptionHandling::None;
1422 if (Model ==
"single") {
1424 return Triple.getArch() == llvm::Triple::arm ||
1425 Triple.getArch() == llvm::Triple::armeb ||
1426 Triple.getArch() == llvm::Triple::thumb ||
1427 Triple.getArch() == llvm::Triple::thumbeb || Triple.isWasm();
1428 }
else if (Model ==
"posix")
1435 StringRef BoundArch,
1441 case llvm::Triple::x86_64: {
1443 if (!Triple.isOSBinFormatMachO())
1446 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1449 StringRef MArch = A->getValue();
1450 if (MArch ==
"x86_64h")
1451 Triple.setArchName(MArch);
1453 return Triple.getTriple();
1455 case llvm::Triple::aarch64: {
1457 if (!Triple.isOSBinFormatMachO())
1458 return Triple.getTriple();
1460 if (Triple.isArm64e())
1461 return Triple.getTriple();
1466 Triple.setArchName(
"arm64");
1467 return Triple.getTriple();
1469 case llvm::Triple::aarch64_32:
1471 case llvm::Triple::amdgcn: {
1474 return Triple.getTriple();
1476 case llvm::Triple::arm:
1477 case llvm::Triple::armeb:
1478 case llvm::Triple::thumb:
1479 case llvm::Triple::thumbeb: {
1483 return Triple.getTriple();
1489 StringRef BoundArch,
1499 ArgStringList &CC1Args)
const {
1504 const ArgList &DriverArgs, ArgStringList &CC1Args, StringRef BoundArch,
1508 ArgStringList &CC1ASArgs)
const {}
1513 llvm::opt::ArgStringList &CmdArgs)
const {
1521 const ArgList &Args)
const {
1523 return *runtimeLibType;
1525 const Arg* A = Args.getLastArg(options::OPT_rtlib_EQ);
1526 StringRef LibName = A ? A->getValue() : CLANG_DEFAULT_RTLIB;
1529 if (LibName ==
"compiler-rt")
1531 else if (LibName ==
"libgcc")
1533 else if (LibName ==
"platform")
1538 << A->getAsString(Args);
1543 return *runtimeLibType;
1547 const ArgList &Args)
const {
1549 return *unwindLibType;
1551 const Arg *A = Args.getLastArg(options::OPT_unwindlib_EQ);
1552 StringRef LibName = A ? A->getValue() : CLANG_DEFAULT_UNWINDLIB;
1554 if (LibName ==
"none")
1556 else if (LibName ==
"platform" || LibName ==
"") {
1566 }
else if (LibName ==
"libunwind") {
1570 }
else if (LibName ==
"libgcc")
1575 << A->getAsString(Args);
1580 return *unwindLibType;
1585 return *cxxStdlibType;
1587 const Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
1588 StringRef LibName = A ? A->getValue() : CLANG_DEFAULT_CXX_STDLIB;
1591 if (LibName ==
"libc++")
1593 else if (LibName ==
"libstdc++")
1595 else if (LibName ==
"platform")
1600 << A->getAsString(Args);
1605 return *cxxStdlibType;
1610 return *cStdlibType;
1612 const Arg *A = Args.getLastArg(options::OPT_cstdlib_EQ);
1613 StringRef LibName = A ? A->getValue() :
"system";
1615 if (LibName ==
"newlib")
1617 else if (LibName ==
"picolibc")
1619 else if (LibName ==
"llvm-libc")
1621 else if (LibName ==
"system")
1626 << A->getAsString(Args);
1630 return *cStdlibType;
1635 llvm::opt::ArgStringList &CC1Args,
1636 const Twine &Path) {
1637 CC1Args.push_back(
"-internal-iframework");
1638 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1650 ArgStringList &CC1Args,
1651 const Twine &Path) {
1652 CC1Args.push_back(
"-internal-externc-isystem");
1653 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1657 ArgStringList &CC1Args,
1658 const Twine &Path) {
1659 if (llvm::sys::fs::exists(Path))
1665 ArgStringList &CC1Args,
1666 const Twine &Path) {
1667 CC1Args.push_back(
"-internal-isystem");
1668 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1673 ArgStringList &CC1Args,
1675 for (
const auto &Path : Paths) {
1676 CC1Args.push_back(
"-internal-iframework");
1677 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1683 ArgStringList &CC1Args,
1685 for (
const auto &Path : Paths) {
1686 CC1Args.push_back(
"-internal-isystem");
1687 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1692 const Twine &
C,
const Twine &D) {
1694 llvm::sys::path::append(
Result, llvm::sys::path::Style::posix, A, B,
C, D);
1695 return std::string(
Result);
1701 std::string MaxVersionString;
1703 llvm::sys::path::append(Path,
"c++");
1704 for (llvm::vfs::directory_iterator LI =
getVFS().dir_begin(Path, EC), LE;
1705 !EC && LI != LE; LI = LI.increment(EC)) {
1706 StringRef VersionText = llvm::sys::path::filename(LI->path());
1708 if (VersionText[0] ==
'v' &&
1709 !VersionText.substr(1).getAsInteger(10, Version)) {
1710 if (Version > MaxVersion) {
1711 MaxVersion = Version;
1712 MaxVersionString = std::string(VersionText);
1718 return MaxVersionString;
1722 ArgStringList &CC1Args)
const {
1732 DriverArgs.AddAllArgs(CC1Args, options::OPT_stdlib_EQ);
1736 const llvm::opt::ArgList &DriverArgs,
1737 llvm::opt::ArgStringList &CC1Args)
const {
1738 DriverArgs.ClaimAllArgs(options::OPT_stdlibxx_isystem);
1747 if (!DriverArgs.hasArg(options::OPT_nostdincxx))
1748 for (
const auto &P :
1749 DriverArgs.getAllArgValues(options::OPT_stdlibxx_isystem))
1755 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
1756 options::OPT_nostdlibxx);
1760 ArgStringList &CmdArgs)
const {
1761 assert(!Args.hasArg(options::OPT_nostdlibxx) &&
1762 "should not have called this");
1767 CmdArgs.push_back(
"-lc++");
1768 if (Args.hasArg(options::OPT_fexperimental_library))
1769 CmdArgs.push_back(
"-lc++experimental");
1773 CmdArgs.push_back(
"-lstdc++");
1779 ArgStringList &CmdArgs)
const {
1781 if(LibPath.length() > 0)
1782 CmdArgs.push_back(Args.MakeArgString(StringRef(
"-L") + LibPath));
1786 ArgStringList &CmdArgs)
const {
1787 CmdArgs.push_back(
"-lcc_kext");
1791 std::string &Path)
const {
1795 bool Default = !Args.hasArgNoClaim(options::OPT_shared);
1801 Arg *A = Args.getLastArg(
1802 options::OPT_ffast_math, options::OPT_fno_fast_math,
1803 options::OPT_funsafe_math_optimizations,
1804 options::OPT_fno_unsafe_math_optimizations, options::OPT_ffp_model_EQ);
1806 if (!A || A->getOption().getID() == options::OPT_fno_fast_math ||
1807 A->getOption().getID() == options::OPT_fno_unsafe_math_optimizations)
1809 if (A && A->getOption().getID() == options::OPT_ffp_model_EQ) {
1810 StringRef Model = A->getValue();
1811 if (Model !=
"fast" && Model !=
"aggressive")
1818 if (!Args.hasFlag(options::OPT_mdaz_ftz, options::OPT_mno_daz_ftz,
Default))
1823 return (Path !=
"crtfastmath.o");
1827 ArgStringList &CmdArgs)
const {
1830 CmdArgs.push_back(Args.MakeArgString(Path));
1850 (SanitizerKind::CFI & ~SanitizerKind::CFIICall) |
1851 SanitizerKind::CFICastStrict | SanitizerKind::FloatDivideByZero |
1852 SanitizerKind::KCFI | SanitizerKind::UnsignedIntegerOverflow |
1853 SanitizerKind::UnsignedShiftBase | SanitizerKind::ImplicitConversion |
1854 SanitizerKind::Nullability | SanitizerKind::LocalBounds |
1855 SanitizerKind::AllocToken;
1863 Res |= SanitizerKind::CFIICall;
1866 Res |= SanitizerKind::ShadowCallStack;
1868 Res |= SanitizerKind::MemTag;
1870 Res |= SanitizerKind::KernelAddress;
1875 ArgStringList &CC1Args)
const {}
1878 ArgStringList &CC1Args)
const {}
1881 ArgStringList &CC1Args)
const {}
1890 ArgStringList &CC1Args)
const {}
1894 return VersionTuple(Version);
1896 if (Version < 10000)
1897 return VersionTuple(Version / 100, Version % 100);
1899 unsigned Build = 0, Factor = 1;
1900 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
1901 Build = Build + (Version % 10) * Factor;
1902 return VersionTuple(Version / 100, Version % 100, Build);
1907 const llvm::opt::ArgList &Args)
const {
1908 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
1909 const Arg *MSCompatibilityVersion =
1910 Args.getLastArg(options::OPT_fms_compatibility_version);
1912 if (MSCVersion && MSCompatibilityVersion) {
1914 D->Diag(diag::err_drv_argument_not_allowed_with)
1915 << MSCVersion->getAsString(Args)
1916 << MSCompatibilityVersion->getAsString(Args);
1917 return VersionTuple();
1920 if (MSCompatibilityVersion) {
1922 if (MSVT.tryParse(MSCompatibilityVersion->getValue())) {
1924 D->Diag(diag::err_drv_invalid_value)
1925 << MSCompatibilityVersion->getAsString(Args)
1926 << MSCompatibilityVersion->getValue();
1933 unsigned Version = 0;
1934 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version)) {
1936 D->Diag(diag::err_drv_invalid_value)
1937 << MSCVersion->getAsString(Args) << MSCVersion->getValue();
1943 return VersionTuple();
1947 const llvm::opt::DerivedArgList &Args,
bool SameTripleAsHost,
1949 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
1951 bool Modified =
false;
1954 for (
auto *A : Args) {
1959 if (A->getOption().matches(options::OPT_m_Group)) {
1966 if (SameTripleAsHost ||
1967 A->getOption().matches(options::OPT_mcode_object_version_EQ) ||
1968 A->getOption().matches(options::OPT_mlinker_version_EQ))
1977 bool XOpenMPTargetNoTriple =
1978 A->getOption().matches(options::OPT_Xopenmp_target);
1980 if (A->getOption().matches(options::OPT_Xopenmp_target_EQ)) {
1985 Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
1988 }
else if (XOpenMPTargetNoTriple) {
1990 Index = Args.getBaseArgs().MakeIndex(A->getValue(0));
1998 std::unique_ptr<Arg> XOpenMPTargetArg(Opts.ParseOneArg(Args, Index));
1999 if (!XOpenMPTargetArg || Index > Prev + 1) {
2000 if (!A->isClaimed()) {
2001 getDriver().
Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
2002 << A->getAsString(Args);
2006 if (XOpenMPTargetNoTriple && XOpenMPTargetArg &&
2007 Args.getAllArgValues(options::OPT_offload_targets_EQ).size() != 1) {
2008 getDriver().
Diag(diag::err_drv_Xopenmp_target_missing_triple);
2011 XOpenMPTargetArg->setBaseArg(A);
2012 A = XOpenMPTargetArg.release();
2013 AllocatedArgs.push_back(A);
2029 const llvm::opt::DerivedArgList &Args, llvm::opt::Arg *&A,
2030 llvm::opt::DerivedArgList *DAL,
2033 unsigned ValuePos = 1;
2034 if (A->getOption().matches(options::OPT_Xarch_device) ||
2035 A->getOption().matches(options::OPT_Xarch_host))
2038 const InputArgList &BaseArgs = Args.getBaseArgs();
2039 unsigned Index = BaseArgs.MakeIndex(A->getValue(ValuePos));
2040 unsigned Prev = Index;
2041 std::unique_ptr<llvm::opt::Arg> XarchArg(Opts.ParseOneArg(
2051 if (!XarchArg || Index > Prev + 1) {
2052 getDriver().
Diag(diag::err_drv_invalid_Xarch_argument_with_args)
2053 << A->getAsString(Args);
2059 "invalid Xarch argument: '%0', not all driver "
2060 "options can be forwared via Xarch argument");
2061 Diags.Report(DiagID) << A->getAsString(Args);
2065 XarchArg->setBaseArg(A);
2066 A = XarchArg.release();
2074 for (
const char *
Value : A->getValues()) {
2075 auto Opt = Opts.getOption(options::OPT_Zlinker_input);
2076 unsigned Index = BaseArgs.MakeIndex(Opt.getName(),
Value);
2078 new Arg(Opt, BaseArgs.MakeArgString(Opt.getPrefix() + Opt.getName()),
2079 Index, BaseArgs.getArgString(Index + 1), A);
2081 DAL->append(NewArg);
2083 DAL->AddSynthesizedArg(NewArg);
2085 AllocatedArgs->push_back(NewArg);
2090 DAL->AddSynthesizedArg(A);
2092 AllocatedArgs->push_back(A);
2097 StringRef XArchVal) {
2098 llvm::Triple ParsedTriple(XArchVal);
2099 return TT.getArch() == ParsedTriple.getArch() &&
2100 TT.getSubArch() == ParsedTriple.getSubArch();
2104 const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
2107 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
2108 bool Modified =
false;
2111 for (Arg *A : Args) {
2112 bool NeedTrans =
false;
2114 if (A->getOption().matches(options::OPT_Xarch_device)) {
2115 NeedTrans = IsDevice;
2117 }
else if (A->getOption().matches(options::OPT_Xarch_host)) {
2118 NeedTrans = !IsDevice;
2120 }
else if (A->getOption().matches(options::OPT_Xarch__)) {
2121 StringRef Val = A->getValue();
2123 (!BoundArch.empty() && Val == BoundArch) ||
2127 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
@ OffloadUnbundlingJobClass
@ BinaryTranslatorJobClass
@ OffloadBundlingJobClass
@ VerifyDebugInfoJobClass
@ OffloadPackagerJobClass
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)
The JSON file list parser is used to communicate input to InstallAPI.
@ Link
'link' clause, allowed on 'declare' construct.
@ Default
Set to the current date and time.
@ Result
The result type of a method or function.
Diagnostic wrappers for TextAPI types for error reporting.
Helper structure used to pass information extracted from clang executable name such as i686-linux-and...