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 auto addIfExists = [
this](
path_list &List,
const std::string &Path) {
118 const Driver &D, StringRef Fallback) {
119 std::optional<std::string> MultilibPath =
123 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> MB =
124 D.getVFS().getBufferForFile(*MultilibPath);
129 llvm::ErrorOr<MultilibSet> ErrorOrMultilibSet =
131 if (ErrorOrMultilibSet.getError())
134 Multilibs = std::move(ErrorOrMultilibSet.get());
143 for (StringRef Define : CustomFlagMacroDefines)
147 D.Diag(clang::diag::warn_drv_missing_multilib) << llvm::join(Flags,
" ");
149 raw_svector_ostream OS(
Data);
152 OS <<
"\n" << llvm::join(M.flags(),
" ");
153 D.Diag(clang::diag::note_drv_available_multilibs) << OS.str();
157 D.Diag(clang::diag::err_drv_multilib_custom_error)
158 << M.getErrorMessage();
166 StringRef YAMLBase = llvm::sys::path::parent_path(*MultilibPath);
168 size_t FileInsertPos = 0;
169 size_t LibInsertPos = 0;
174 llvm::sys::path::append(FilePath, M.gccSuffix());
176 std::string(FilePath));
180 llvm::sys::path::append(LibPath, M.gccSuffix());
182 std::string(LibPath));
190std::optional<std::string>
192 StringRef FallbackDir) {
193 if (Arg *A = Args.getLastArg(options::OPT_multi_lib_config)) {
195 if (!D.getVFS().exists(MultilibPath)) {
196 D.Diag(clang::diag::err_drv_no_such_file) << MultilibPath.str();
199 return std::string(MultilibPath);
203 if (!FallbackDir.empty())
204 MultilibPath = FallbackDir;
205 else if (std::optional<std::string> StdlibDir =
getStdlibPath())
206 MultilibPath = *StdlibDir;
209 llvm::sys::path::append(MultilibPath,
"multilib.yaml");
210 if (!D.getVFS().exists(MultilibPath))
212 return std::string(MultilibPath);
216 Triple.setEnvironment(Env);
217 if (EffectiveTriple != llvm::Triple())
218 EffectiveTriple.setEnvironment(Env);
228 return Args.hasFlag(options::OPT_fintegrated_as,
229 options::OPT_fno_integrated_as,
237 "(Non-)integrated backend set incorrectly!");
239 bool IBackend = Args.hasFlag(options::OPT_fintegrated_objemitter,
240 options::OPT_fno_integrated_objemitter,
248 DiagID = clang::diag::err_drv_unsupported_opt_for_target;
250 DiagID = clang::diag::warn_drv_unsupported_opt_for_target;
251 Arg *A = Args.getLastArg(options::OPT_fno_integrated_objemitter);
253 D.Diag(DiagID) << A->getAsString(Args) << Triple.getTriple();
254 A = Args.getLastArg(options::OPT_fintegrated_objemitter);
256 D.Diag(DiagID) << A->getAsString(Args) << Triple.getTriple();
262 return ENABLE_X86_RELAX_RELOCATIONS;
266 return PPC_LINUX_DEFAULT_IEEELONGDOUBLE &&
getTriple().isOSLinux();
270 const llvm::opt::ArgList &Args) {
271 for (
const Arg *MultilibFlagArg :
272 Args.filtered(options::OPT_fmultilib_flag)) {
273 List.push_back(MultilibFlagArg->getAsString(Args));
274 MultilibFlagArg->claim();
279 const llvm::Triple &Triple,
280 const llvm::opt::ArgList &Args,
282 std::vector<StringRef> Features;
287 llvm::DenseSet<StringRef> FeatureSet(UnifiedFeatures.begin(),
288 UnifiedFeatures.end());
289 std::vector<std::string> MArch;
290 for (
const auto &Ext : AArch64::Extensions)
291 if (!Ext.UserVisibleName.empty())
292 if (FeatureSet.contains(Ext.PosTargetFeature))
293 MArch.push_back(Ext.UserVisibleName.str());
294 for (
const auto &Ext : AArch64::Extensions)
295 if (!Ext.UserVisibleName.empty())
296 if (FeatureSet.contains(Ext.NegTargetFeature))
297 MArch.push_back((
"no" + Ext.UserVisibleName).str());
299 for (
const auto &ArchInfo : AArch64::ArchInfos)
300 if (FeatureSet.contains(ArchInfo->ArchFeature))
301 ArchName = ArchInfo->Name;
302 if (!ArchName.empty()) {
303 MArch.insert(MArch.begin(), (
"-march=" + ArchName).str());
304 Result.push_back(llvm::join(MArch,
"+"));
307 const Arg *BranchProtectionArg =
308 Args.getLastArgNoClaim(options::OPT_mbranch_protection_EQ);
309 if (BranchProtectionArg) {
310 Result.push_back(BranchProtectionArg->getAsString(Args));
313 if (FeatureSet.contains(
"+strict-align"))
314 Result.push_back(
"-mno-unaligned-access");
316 Result.push_back(
"-munaligned-access");
318 if (Arg *Endian = Args.getLastArg(options::OPT_mbig_endian,
319 options::OPT_mlittle_endian)) {
320 if (Endian->getOption().matches(options::OPT_mbig_endian))
321 Result.push_back(Endian->getAsString(Args));
324 const Arg *ABIArg = Args.getLastArgNoClaim(options::OPT_mabi_EQ);
326 Result.push_back(ABIArg->getAsString(Args));
329 if (
const Arg *A = Args.getLastArg(options::OPT_O_Group);
330 A && A->getOption().matches(options::OPT_O)) {
331 switch (A->getValue()[0]) {
343 llvm::Reloc::Model RelocationModel,
344 const llvm::opt::ArgList &Args,
346 std::vector<StringRef> Features;
348 D, Triple, Args, Features,
false ,
true );
350 llvm::DenseSet<StringRef> FeatureSet(UnifiedFeatures.begin(),
351 UnifiedFeatures.end());
352 std::vector<std::string> MArch;
353 for (
const auto &Ext : ARM::ARCHExtNames)
354 if (!Ext.Name.empty())
355 if (FeatureSet.contains(Ext.Feature))
356 MArch.push_back(Ext.Name.str());
357 for (
const auto &Ext : ARM::ARCHExtNames)
358 if (!Ext.Name.empty())
359 if (FeatureSet.contains(Ext.NegFeature))
360 MArch.push_back((
"no" + Ext.Name).str());
361 MArch.insert(MArch.begin(), (
"-march=" + Triple.getArchName()).str());
362 Result.push_back(llvm::join(MArch,
"+"));
365#define ARM_FPU(NAME, KIND, VERSION, NEON_SUPPORT, RESTRICTION) \
366 case llvm::ARM::KIND: \
367 Result.push_back("-mfpu=" NAME); \
369#include "llvm/TargetParser/ARMTargetParser.def"
371 llvm_unreachable(
"Invalid FPUKind");
375 case arm::FloatABI::Soft:
376 Result.push_back(
"-mfloat-abi=soft");
378 case arm::FloatABI::SoftFP:
379 Result.push_back(
"-mfloat-abi=softfp");
381 case arm::FloatABI::Hard:
382 Result.push_back(
"-mfloat-abi=hard");
384 case arm::FloatABI::Invalid:
385 llvm_unreachable(
"Invalid float ABI");
388 if (RelocationModel == llvm::Reloc::ROPI ||
389 RelocationModel == llvm::Reloc::ROPI_RWPI)
390 Result.push_back(
"-fropi");
392 Result.push_back(
"-fno-ropi");
394 if (RelocationModel == llvm::Reloc::RWPI ||
395 RelocationModel == llvm::Reloc::ROPI_RWPI)
396 Result.push_back(
"-frwpi");
398 Result.push_back(
"-fno-rwpi");
400 const Arg *BranchProtectionArg =
401 Args.getLastArgNoClaim(options::OPT_mbranch_protection_EQ);
402 if (BranchProtectionArg) {
403 Result.push_back(BranchProtectionArg->getAsString(Args));
406 if (FeatureSet.contains(
"+strict-align"))
407 Result.push_back(
"-mno-unaligned-access");
409 Result.push_back(
"-munaligned-access");
411 if (Arg *Endian = Args.getLastArg(options::OPT_mbig_endian,
412 options::OPT_mlittle_endian)) {
413 if (Endian->getOption().matches(options::OPT_mbig_endian))
414 Result.push_back(Endian->getAsString(Args));
417 if (
const Arg *A = Args.getLastArg(options::OPT_O_Group);
418 A && A->getOption().matches(options::OPT_O)) {
419 switch (A->getValue()[0]) {
431 const llvm::opt::ArgList &Args,
433 bool hasShadowCallStack) {
436 auto ISAInfo = llvm::RISCVISAInfo::parseArchString(
438 if (!llvm::errorToBool(ISAInfo.takeError()))
439 Result.push_back(
"-march=" + (*ISAInfo)->toString());
443 if (hasShadowCallStack)
444 Result.push_back(
"-fsanitize=shadow-call-stack");
446 Result.push_back(
"-fno-sanitize=shadow-call-stack");
453 std::vector<std::string>
Result;
455 Result.push_back(
"--target=" + Triple.str());
461 llvm::Reloc::Model RelocationModel;
466 std::tie(RelocationModel, PICLevel, IsPIE) =
ParsePICArgs(*
this, Args);
469 switch (Triple.getArch()) {
470 case llvm::Triple::aarch64:
471 case llvm::Triple::aarch64_32:
472 case llvm::Triple::aarch64_be:
475 case llvm::Triple::arm:
476 case llvm::Triple::armeb:
477 case llvm::Triple::thumb:
478 case llvm::Triple::thumbeb:
481 case llvm::Triple::riscv32:
482 case llvm::Triple::riscv64:
483 case llvm::Triple::riscv32be:
484 case llvm::Triple::riscv64be:
497 Result.push_back(
"-fno-rtti");
499 Result.push_back(
"-frtti");
502 Result.push_back(
"-fno-exceptions");
504 Result.push_back(
"-fexceptions");
506 if (RelocationModel == llvm::Reloc::PIC_)
507 Result.push_back(IsPIE ? (PICLevel > 1 ?
"-fPIE" :
"-fpie")
508 : (PICLevel > 1 ?
"-fPIC" :
"-fpic"));
510 Result.push_back(
"-fno-pic");
523 !SanitizerArgsChecked,
525 BoundArchSanitizerArgsChecked.insert(BoundArch).second,
526 BoundArch, DeviceOffloadKind);
528 SanitizerArgsChecked =
true;
533 XRayArgs XRayArguments(*
this, JobArgs);
534 return XRayArguments;
541 const char *ModeFlag;
550 static const DriverSuffix DriverSuffixes[] = {
552 {
"clang++",
"--driver-mode=g++"},
553 {
"clang-c++",
"--driver-mode=g++"},
554 {
"clang-cc",
nullptr},
555 {
"clang-cpp",
"--driver-mode=cpp"},
556 {
"clang-g++",
"--driver-mode=g++"},
557 {
"clang-gcc",
nullptr},
558 {
"clang-cl",
"--driver-mode=cl"},
560 {
"cpp",
"--driver-mode=cpp"},
561 {
"cl",
"--driver-mode=cl"},
562 {
"++",
"--driver-mode=g++"},
563 {
"flang",
"--driver-mode=flang"},
566 {
"flang-new",
"--driver-mode=flang"},
567 {
"clang-dxc",
"--driver-mode=dxc"},
570 for (
const auto &DS : DriverSuffixes) {
571 StringRef Suffix(DS.Suffix);
572 if (ProgName.ends_with(Suffix)) {
573 Pos = ProgName.size() - Suffix.size();
583 std::string ProgName = std::string(llvm::sys::path::filename(Argv0));
584 if (is_style_windows(llvm::sys::path::Style::native)) {
586 std::transform(ProgName.begin(), ProgName.end(), ProgName.begin(),
602 if (!DS && ProgName.ends_with(
".exe")) {
605 ProgName = ProgName.drop_back(StringRef(
".exe").size());
612 ProgName = ProgName.rtrim(
"0123456789.");
619 ProgName = ProgName.slice(0, ProgName.rfind(
'-'));
632 size_t SuffixEnd = SuffixPos + strlen(DS->Suffix);
634 size_t LastComponent = ProgName.rfind(
'-', SuffixPos);
635 if (LastComponent == std::string::npos)
637 std::string ModeSuffix = ProgName.substr(LastComponent + 1,
638 SuffixEnd - LastComponent - 1);
641 StringRef Prefix(ProgName);
642 Prefix = Prefix.slice(0, LastComponent);
643 std::string IgnoredError;
645 llvm::Triple Triple(Prefix);
646 bool IsRegistered = llvm::TargetRegistry::lookupTarget(Triple, IgnoredError);
655 switch (Triple.getArch()) {
656 case llvm::Triple::aarch64: {
661 case llvm::Triple::aarch64_32:
663 case llvm::Triple::ppc:
665 case llvm::Triple::ppcle:
667 case llvm::Triple::ppc64:
669 case llvm::Triple::ppc64le:
672 return Triple.getArchName();
685Tool *ToolChain::getClang()
const {
691Tool *ToolChain::getFlang()
const {
702 llvm_unreachable(
"Linking is not supported by this toolchain");
706 llvm_unreachable(
"Creating static lib is not supported by this toolchain");
709Tool *ToolChain::getAssemble()
const {
712 return Assemble.get();
715Tool *ToolChain::getClangAs()
const {
718 return Assemble.get();
721Tool *ToolChain::getLink()
const {
727Tool *ToolChain::getStaticLibTool()
const {
730 return StaticLibTool.get();
733Tool *ToolChain::getIfsMerge()
const {
735 IfsMerge.reset(
new tools::ifstool::Merger(*
this));
736 return IfsMerge.get();
739Tool *ToolChain::getOffloadBundler()
const {
741 OffloadBundler.reset(
new tools::OffloadBundler(*
this));
742 return OffloadBundler.get();
745Tool *ToolChain::getOffloadPackager()
const {
746 if (!OffloadPackager)
747 OffloadPackager.reset(
new tools::OffloadPackager(*
this));
748 return OffloadPackager.get();
751Tool *ToolChain::getLinkerWrapper()
const {
753 LinkerWrapper.reset(
new tools::LinkerWrapper(*
this, getLink()));
754 return LinkerWrapper.get();
760 return getAssemble();
763 return getIfsMerge();
769 return getStaticLibTool();
780 llvm_unreachable(
"Invalid tool kind.");
793 return getOffloadBundler();
796 return getOffloadPackager();
798 return getLinkerWrapper();
801 llvm_unreachable(
"Invalid tool kind.");
805 const ArgList &Args) {
806 const llvm::Triple &Triple = TC.
getTriple();
807 bool IsWindows = Triple.isOSWindows();
810 return Triple.getArchName();
812 if (TC.
getArch() == llvm::Triple::arm || TC.
getArch() == llvm::Triple::armeb)
818 if (TC.
getArch() == llvm::Triple::x86 && Triple.isAndroid())
821 if (TC.
getArch() == llvm::Triple::x86_64 && Triple.isX32())
824 return llvm::Triple::getArchTypeName(TC.
getArch());
828 if (Triple.isOSDarwin())
831 switch (Triple.getOS()) {
832 case llvm::Triple::FreeBSD:
834 case llvm::Triple::NetBSD:
836 case llvm::Triple::OpenBSD:
838 case llvm::Triple::Solaris:
840 case llvm::Triple::AIX:
842 case llvm::Triple::Serenity:
856 }
else if (Triple.isOSUnknown()) {
857 llvm::sys::path::append(Path,
"lib");
861 return std::string(Path);
868 return llvm::sys::path::filename(CRTAbsolutePath).str();
874 bool IsFortran)
const {
876 bool IsITANMSVCWindows =
877 TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment();
884 Suffix = IsITANMSVCWindows ?
".obj" :
".o";
887 Suffix = IsITANMSVCWindows ?
".lib" :
".a";
890 if (TT.isOSWindows())
891 Suffix = TT.isOSCygMing() ?
".dll.a" :
".lib";
892 else if (TT.isOSAIX())
899 std::string ArchAndEnv;
902 const char *Env = TT.isAndroid() ?
"-android" :
"";
903 ArchAndEnv = (
"-" +
Arch + Env).str();
906 std::string LibName = IsFortran ?
"flang_rt." :
"clang_rt.";
907 return (Prefix + Twine(LibName) + Component + ArchAndEnv + Suffix).str();
914 Args, Component,
Type,
false, IsFortran);
918 llvm::sys::path::append(P, CRTBasename);
920 return std::string(P);
927 !IsFortran, IsFortran);
929 llvm::sys::path::append(OldPath, CRTBasename);
930 if (Path.empty() ||
getVFS().exists(OldPath))
931 return std::string(OldPath);
936 return std::string(Path);
942 bool isFortran)
const {
948 llvm::opt::ArgStringList &CmdArgs)
const {
953 if (!
getTriple().isKnownWindowsMSVCEnvironment()) {
955 F128LibName.consume_front_insensitive(
"lib");
956 if (!F128LibName.empty()) {
958 CmdArgs.push_back(
"-lflang_rt.quadmath");
961 CmdArgs.push_back(Args.MakeArgString(
"-l" + F128LibName));
970 CmdArgs.push_back(
"-lexecinfo");
974 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
975 options::OPT_fno_openmp,
false)) {
980 !
getTriple().isKnownWindowsMSVCEnvironment()) {
982 CmdArgs.push_back(
"-lcompiler_rt");
984 CmdArgs.push_back(
"-latomic");
990 ArgStringList &CmdArgs)
const {
991 auto AddLibSearchPathIfExists = [&](
const Twine &Path) {
993 if (!llvm::sys::fs::is_directory(Path))
996 if (
getTriple().isKnownWindowsMSVCEnvironment())
997 CmdArgs.push_back(Args.MakeArgString(
"-libpath:" + Path));
999 CmdArgs.push_back(Args.MakeArgString(
"-L" + Path));
1012 llvm::sys::path::parent_path(
getDriver().Dir);
1013 llvm::sys::path::append(DefaultLibPath,
"lib");
1014 AddLibSearchPathIfExists(DefaultLibPath);
1018 llvm::opt::ArgStringList &CmdArgs)
const {
1021 if (Args.hasFlag(options::OPT_static_libflangrt,
1022 options::OPT_shared_libflangrt,
getTriple().isOSAIX()))
1026 CmdArgs.push_back(
"-lflang_rt.runtime");
1034std::optional<std::string>
1035ToolChain::getFallbackAndroidTargetPath(StringRef BaseDir)
const {
1036 llvm::Triple TripleWithoutLevel(
getTriple());
1037 TripleWithoutLevel.setEnvironmentName(
"android");
1038 const std::string &TripleWithoutLevelStr = TripleWithoutLevel.str();
1039 unsigned TripleVersion =
getTriple().getEnvironmentVersion().getMajor();
1040 unsigned BestVersion = 0;
1043 bool UsingUnversionedDir =
false;
1045 for (llvm::vfs::directory_iterator LI =
getVFS().dir_begin(BaseDir, EC), LE;
1046 !EC && LI != LE; LI = LI.increment(EC)) {
1047 StringRef DirName = llvm::sys::path::filename(LI->path());
1048 StringRef DirNameSuffix = DirName;
1049 if (DirNameSuffix.consume_front(TripleWithoutLevelStr)) {
1050 if (DirNameSuffix.empty() && TripleDir.empty()) {
1051 TripleDir = DirName;
1052 UsingUnversionedDir =
true;
1055 if (!DirNameSuffix.getAsInteger(10, Version) && Version > BestVersion &&
1056 Version < TripleVersion) {
1057 BestVersion = Version;
1058 TripleDir = DirName;
1059 UsingUnversionedDir =
false;
1065 if (TripleDir.empty())
1068 SmallString<128> P(BaseDir);
1069 llvm::sys::path::append(P, TripleDir);
1070 if (UsingUnversionedDir)
1071 D.Diag(diag::warn_android_unversioned_fallback) << P <<
getTripleString();
1072 return std::string(P);
1076 return (Triple.hasEnvironment()
1077 ? llvm::Triple(Triple.getArchName(), Triple.getVendorName(),
1078 llvm::Triple::getOSTypeName(Triple.getOS()),
1079 llvm::Triple::getEnvironmentTypeName(
1080 Triple.getEnvironment()))
1081 : llvm::Triple(Triple.getArchName(), Triple.getVendorName(),
1082 llvm::Triple::getOSTypeName(Triple.getOS())));
1085std::optional<std::string>
1087 auto getPathForTriple =
1088 [&](
const llvm::Triple &Triple) -> std::optional<std::string> {
1090 llvm::sys::path::append(P, Triple.str());
1092 return std::string(P);
1097 if (
auto Path = getPathForTriple(T))
1101 llvm::Triple AIXTriple;
1102 if (T.getEnvironment() == Triple::UnknownEnvironment) {
1104 AIXTriple = llvm::Triple(T.getArchName(), T.getVendorName(),
1105 llvm::Triple::getOSTypeName(T.getOS()));
1110 if (
auto Path = getPathForTriple(AIXTriple))
1115 (!T.getOSVersion().empty() || !T.getEnvironmentVersion().empty())) {
1118 if (
auto Path = getPathForTriple(TripleWithoutVersion))
1137 if (T.getArch() == Triple::arm && !T.isArmMClass()) {
1138 llvm::Triple ArmTriple = T;
1139 ArmTriple.setArch(Triple::arm);
1140 if (
auto Path = getPathForTriple(ArmTriple))
1145 return getFallbackAndroidTargetPath(BaseDir);
1152 llvm::sys::path::append(P,
"finclude",
"flang");
1158 llvm::sys::path::append(P,
"lib");
1162 if (Triple.isOSDarwin())
1165 llvm::sys::path::append(P, Triple.str());
1166 return std::string(P);
1171 llvm::sys::path::append(P,
"..",
"lib");
1177 llvm::sys::path::append(P,
"..",
"include");
1186 llvm::sys::path::append(Path,
"lib");
1188 llvm::sys::path::append(Path, S);
1189 Paths.push_back(std::string(Path));
1198 if (Args.hasArg(options::OPT_noprofilelib))
1201 return Args.hasArg(options::OPT_fprofile_generate) ||
1202 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
1203 Args.hasArg(options::OPT_fcs_profile_generate) ||
1204 Args.hasArg(options::OPT_fcs_profile_generate_EQ) ||
1205 Args.hasArg(options::OPT_fprofile_instr_generate) ||
1206 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
1207 Args.hasArg(options::OPT_fcreate_profile) ||
1208 Args.hasArg(options::OPT_fprofile_generate_cold_function_coverage) ||
1209 Args.hasArg(options::OPT_fprofile_generate_cold_function_coverage_EQ);
1213 return Args.hasArg(options::OPT_coverage) ||
1214 Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
1219 if (D.IsFlangMode() &&
getDriver().ShouldUseFlangCompiler(JA))
return getFlang();
1220 if (
getDriver().ShouldUseClangCompiler(JA))
return getClang();
1224 return getClangAs();
1229 return D.GetFilePath(Name, *
this);
1233 return D.GetProgramPath(Name, *
this);
1238 *LinkerIsLLD =
false;
1242 const Arg* A = Args.getLastArg(options::OPT_fuse_ld_EQ);
1250 if (
const Arg *A = Args.getLastArg(options::OPT_ld_path_EQ)) {
1251 std::string Path(A->getValue());
1252 if (!Path.empty()) {
1253 if (llvm::sys::path::parent_path(Path).empty())
1255 if (llvm::sys::fs::can_execute(Path)) {
1257 *LinkerIsLLD = UseLinker ==
"lld";
1258 return std::string(Path);
1261 getDriver().
Diag(diag::err_drv_invalid_linker_name) << A->getAsString(Args);
1266 if (UseLinker.empty() || UseLinker ==
"ld") {
1268 if (llvm::sys::path::is_absolute(DefaultLinker))
1269 return std::string(DefaultLinker);
1278 if (UseLinker.contains(
'/'))
1281 if (llvm::sys::path::is_absolute(UseLinker)) {
1284 if (llvm::sys::fs::can_execute(UseLinker))
1285 return std::string(UseLinker);
1288 if (Triple.isOSDarwin())
1289 LinkerName.append(
"ld64.");
1291 LinkerName.append(
"ld.");
1292 LinkerName.append(UseLinker);
1295 if (llvm::sys::fs::can_execute(LinkerPath)) {
1297 *LinkerIsLLD = UseLinker ==
"lld";
1303 getDriver().
Diag(diag::err_drv_invalid_linker_name) << A->getAsString(Args);
1310 if (Triple.isOSDarwin())
1321 if (D.IsFlangMode() &&
id == types::TY_PP_Fortran)
1322 id = types::TY_Fortran;
1332 llvm::Triple HostTriple(LLVM_HOST_TRIPLE);
1333 switch (HostTriple.getArch()) {
1336 case llvm::Triple::arm:
1337 case llvm::Triple::armeb:
1338 case llvm::Triple::thumb:
1339 case llvm::Triple::thumbeb:
1340 return getArch() != llvm::Triple::arm &&
getArch() != llvm::Triple::thumb &&
1341 getArch() != llvm::Triple::armeb &&
getArch() != llvm::Triple::thumbeb;
1343 return HostTriple.getArch() !=
getArch();
1352llvm::ExceptionHandling
1354 return llvm::ExceptionHandling::None;
1358 if (Model ==
"single") {
1360 return Triple.getArch() == llvm::Triple::arm ||
1361 Triple.getArch() == llvm::Triple::armeb ||
1362 Triple.getArch() == llvm::Triple::thumb ||
1363 Triple.getArch() == llvm::Triple::thumbeb || Triple.isWasm();
1364 }
else if (Model ==
"posix")
1371 StringRef BoundArch,
1377 case llvm::Triple::x86_64: {
1379 if (!Triple.isOSBinFormatMachO())
1382 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1385 StringRef MArch = A->getValue();
1386 if (MArch ==
"x86_64h")
1387 Triple.setArchName(MArch);
1389 return Triple.getTriple();
1391 case llvm::Triple::aarch64: {
1393 if (!Triple.isOSBinFormatMachO())
1394 return Triple.getTriple();
1396 if (Triple.isArm64e())
1397 return Triple.getTriple();
1402 Triple.setArchName(
"arm64");
1403 return Triple.getTriple();
1405 case llvm::Triple::aarch64_32:
1407 case llvm::Triple::amdgcn: {
1410 return Triple.getTriple();
1412 case llvm::Triple::arm:
1413 case llvm::Triple::armeb:
1414 case llvm::Triple::thumb:
1415 case llvm::Triple::thumbeb: {
1419 return Triple.getTriple();
1425 StringRef BoundArch,
1435 ArgStringList &CC1Args)
const {
1440 const ArgList &DriverArgs, ArgStringList &CC1Args,
1444 ArgStringList &CC1ASArgs)
const {}
1449 llvm::opt::ArgStringList &CmdArgs)
const {
1457 const ArgList &Args)
const {
1459 return *runtimeLibType;
1461 const Arg* A = Args.getLastArg(options::OPT_rtlib_EQ);
1462 StringRef LibName = A ? A->getValue() : CLANG_DEFAULT_RTLIB;
1465 if (LibName ==
"compiler-rt")
1467 else if (LibName ==
"libgcc")
1469 else if (LibName ==
"platform")
1474 << A->getAsString(Args);
1479 return *runtimeLibType;
1483 const ArgList &Args)
const {
1485 return *unwindLibType;
1487 const Arg *A = Args.getLastArg(options::OPT_unwindlib_EQ);
1488 StringRef LibName = A ? A->getValue() : CLANG_DEFAULT_UNWINDLIB;
1490 if (LibName ==
"none")
1492 else if (LibName ==
"platform" || LibName ==
"") {
1502 }
else if (LibName ==
"libunwind") {
1506 }
else if (LibName ==
"libgcc")
1511 << A->getAsString(Args);
1516 return *unwindLibType;
1521 return *cxxStdlibType;
1523 const Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
1524 StringRef LibName = A ? A->getValue() : CLANG_DEFAULT_CXX_STDLIB;
1527 if (LibName ==
"libc++")
1529 else if (LibName ==
"libstdc++")
1531 else if (LibName ==
"platform")
1536 << A->getAsString(Args);
1541 return *cxxStdlibType;
1546 return *cStdlibType;
1548 const Arg *A = Args.getLastArg(options::OPT_cstdlib_EQ);
1549 StringRef LibName = A ? A->getValue() :
"system";
1551 if (LibName ==
"newlib")
1553 else if (LibName ==
"picolibc")
1555 else if (LibName ==
"llvm-libc")
1557 else if (LibName ==
"system")
1562 << A->getAsString(Args);
1566 return *cStdlibType;
1571 llvm::opt::ArgStringList &CC1Args,
1572 const Twine &Path) {
1573 CC1Args.push_back(
"-internal-iframework");
1574 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1586 ArgStringList &CC1Args,
1587 const Twine &Path) {
1588 CC1Args.push_back(
"-internal-externc-isystem");
1589 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1593 ArgStringList &CC1Args,
1594 const Twine &Path) {
1595 if (llvm::sys::fs::exists(Path))
1601 ArgStringList &CC1Args,
1602 const Twine &Path) {
1603 CC1Args.push_back(
"-internal-isystem");
1604 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1609 ArgStringList &CC1Args,
1611 for (
const auto &Path : Paths) {
1612 CC1Args.push_back(
"-internal-iframework");
1613 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1619 ArgStringList &CC1Args,
1621 for (
const auto &Path : Paths) {
1622 CC1Args.push_back(
"-internal-isystem");
1623 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1628 const Twine &
C,
const Twine &D) {
1630 llvm::sys::path::append(
Result, llvm::sys::path::Style::posix, A, B,
C, D);
1631 return std::string(
Result);
1637 std::string MaxVersionString;
1639 llvm::sys::path::append(Path,
"c++");
1640 for (llvm::vfs::directory_iterator LI =
getVFS().dir_begin(Path, EC), LE;
1641 !EC && LI != LE; LI = LI.increment(EC)) {
1642 StringRef VersionText = llvm::sys::path::filename(LI->path());
1644 if (VersionText[0] ==
'v' &&
1645 !VersionText.substr(1).getAsInteger(10, Version)) {
1646 if (Version > MaxVersion) {
1647 MaxVersion = Version;
1648 MaxVersionString = std::string(VersionText);
1654 return MaxVersionString;
1658 ArgStringList &CC1Args)
const {
1668 DriverArgs.AddAllArgs(CC1Args, options::OPT_stdlib_EQ);
1672 const llvm::opt::ArgList &DriverArgs,
1673 llvm::opt::ArgStringList &CC1Args)
const {
1674 DriverArgs.ClaimAllArgs(options::OPT_stdlibxx_isystem);
1683 if (!DriverArgs.hasArg(options::OPT_nostdincxx))
1684 for (
const auto &P :
1685 DriverArgs.getAllArgValues(options::OPT_stdlibxx_isystem))
1691 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
1692 options::OPT_nostdlibxx);
1696 ArgStringList &CmdArgs)
const {
1697 assert(!Args.hasArg(options::OPT_nostdlibxx) &&
1698 "should not have called this");
1703 CmdArgs.push_back(
"-lc++");
1704 if (Args.hasArg(options::OPT_fexperimental_library))
1705 CmdArgs.push_back(
"-lc++experimental");
1709 CmdArgs.push_back(
"-lstdc++");
1715 ArgStringList &CmdArgs)
const {
1717 if(LibPath.length() > 0)
1718 CmdArgs.push_back(Args.MakeArgString(StringRef(
"-L") + LibPath));
1722 ArgStringList &CmdArgs)
const {
1723 CmdArgs.push_back(
"-lcc_kext");
1727 std::string &Path)
const {
1731 bool Default = !Args.hasArgNoClaim(options::OPT_shared);
1737 Arg *A = Args.getLastArg(
1738 options::OPT_ffast_math, options::OPT_fno_fast_math,
1739 options::OPT_funsafe_math_optimizations,
1740 options::OPT_fno_unsafe_math_optimizations, options::OPT_ffp_model_EQ);
1742 if (!A || A->getOption().getID() == options::OPT_fno_fast_math ||
1743 A->getOption().getID() == options::OPT_fno_unsafe_math_optimizations)
1745 if (A && A->getOption().getID() == options::OPT_ffp_model_EQ) {
1746 StringRef Model = A->getValue();
1747 if (Model !=
"fast" && Model !=
"aggressive")
1754 if (!Args.hasFlag(options::OPT_mdaz_ftz, options::OPT_mno_daz_ftz,
Default))
1759 return (Path !=
"crtfastmath.o");
1763 ArgStringList &CmdArgs)
const {
1766 CmdArgs.push_back(Args.MakeArgString(Path));
1786 (SanitizerKind::CFI & ~SanitizerKind::CFIICall) |
1787 SanitizerKind::CFICastStrict | SanitizerKind::FloatDivideByZero |
1788 SanitizerKind::KCFI | SanitizerKind::UnsignedIntegerOverflow |
1789 SanitizerKind::UnsignedShiftBase | SanitizerKind::ImplicitConversion |
1790 SanitizerKind::Nullability | SanitizerKind::LocalBounds |
1791 SanitizerKind::AllocToken;
1799 Res |= SanitizerKind::CFIICall;
1802 Res |= SanitizerKind::ShadowCallStack;
1804 Res |= SanitizerKind::MemTag;
1806 Res |= SanitizerKind::KernelAddress;
1811 ArgStringList &CC1Args)
const {}
1814 ArgStringList &CC1Args)
const {}
1817 ArgStringList &CC1Args)
const {}
1826 ArgStringList &CC1Args)
const {}
1830 return VersionTuple(Version);
1832 if (Version < 10000)
1833 return VersionTuple(Version / 100, Version % 100);
1835 unsigned Build = 0, Factor = 1;
1836 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
1837 Build = Build + (Version % 10) * Factor;
1838 return VersionTuple(Version / 100, Version % 100, Build);
1843 const llvm::opt::ArgList &Args)
const {
1844 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
1845 const Arg *MSCompatibilityVersion =
1846 Args.getLastArg(options::OPT_fms_compatibility_version);
1848 if (MSCVersion && MSCompatibilityVersion) {
1850 D->Diag(diag::err_drv_argument_not_allowed_with)
1851 << MSCVersion->getAsString(Args)
1852 << MSCompatibilityVersion->getAsString(Args);
1853 return VersionTuple();
1856 if (MSCompatibilityVersion) {
1858 if (MSVT.tryParse(MSCompatibilityVersion->getValue())) {
1860 D->Diag(diag::err_drv_invalid_value)
1861 << MSCompatibilityVersion->getAsString(Args)
1862 << MSCompatibilityVersion->getValue();
1869 unsigned Version = 0;
1870 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version)) {
1872 D->Diag(diag::err_drv_invalid_value)
1873 << MSCVersion->getAsString(Args) << MSCVersion->getValue();
1879 return VersionTuple();
1883 const llvm::opt::DerivedArgList &Args,
bool SameTripleAsHost,
1885 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
1887 bool Modified =
false;
1890 for (
auto *A : Args) {
1895 if (A->getOption().matches(options::OPT_m_Group)) {
1902 if (SameTripleAsHost ||
1903 A->getOption().matches(options::OPT_mcode_object_version_EQ) ||
1904 A->getOption().matches(options::OPT_mlinker_version_EQ))
1913 bool XOpenMPTargetNoTriple =
1914 A->getOption().matches(options::OPT_Xopenmp_target);
1916 if (A->getOption().matches(options::OPT_Xopenmp_target_EQ)) {
1921 Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
1924 }
else if (XOpenMPTargetNoTriple) {
1926 Index = Args.getBaseArgs().MakeIndex(A->getValue(0));
1934 std::unique_ptr<Arg> XOpenMPTargetArg(Opts.ParseOneArg(Args, Index));
1935 if (!XOpenMPTargetArg || Index > Prev + 1) {
1936 if (!A->isClaimed()) {
1937 getDriver().
Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
1938 << A->getAsString(Args);
1942 if (XOpenMPTargetNoTriple && XOpenMPTargetArg &&
1943 Args.getAllArgValues(options::OPT_offload_targets_EQ).size() != 1) {
1944 getDriver().
Diag(diag::err_drv_Xopenmp_target_missing_triple);
1947 XOpenMPTargetArg->setBaseArg(A);
1948 A = XOpenMPTargetArg.release();
1949 AllocatedArgs.push_back(A);
1965 const llvm::opt::DerivedArgList &Args, llvm::opt::Arg *&A,
1966 llvm::opt::DerivedArgList *DAL,
1969 unsigned ValuePos = 1;
1970 if (A->getOption().matches(options::OPT_Xarch_device) ||
1971 A->getOption().matches(options::OPT_Xarch_host))
1974 const InputArgList &BaseArgs = Args.getBaseArgs();
1975 unsigned Index = BaseArgs.MakeIndex(A->getValue(ValuePos));
1976 unsigned Prev = Index;
1977 std::unique_ptr<llvm::opt::Arg> XarchArg(Opts.ParseOneArg(
1987 if (!XarchArg || Index > Prev + 1) {
1988 getDriver().
Diag(diag::err_drv_invalid_Xarch_argument_with_args)
1989 << A->getAsString(Args);
1995 "invalid Xarch argument: '%0', not all driver "
1996 "options can be forwared via Xarch argument");
1997 Diags.Report(DiagID) << A->getAsString(Args);
2001 XarchArg->setBaseArg(A);
2002 A = XarchArg.release();
2010 for (
const char *
Value : A->getValues()) {
2011 auto Opt = Opts.getOption(options::OPT_Zlinker_input);
2012 unsigned Index = BaseArgs.MakeIndex(Opt.getName(),
Value);
2014 new Arg(Opt, BaseArgs.MakeArgString(Opt.getPrefix() + Opt.getName()),
2015 Index, BaseArgs.getArgString(Index + 1), A);
2017 DAL->append(NewArg);
2019 DAL->AddSynthesizedArg(NewArg);
2021 AllocatedArgs->push_back(NewArg);
2026 DAL->AddSynthesizedArg(A);
2028 AllocatedArgs->push_back(A);
2033 StringRef XArchVal) {
2034 llvm::Triple ParsedTriple(XArchVal);
2035 return TT.getArch() == ParsedTriple.getArch() &&
2036 TT.getSubArch() == ParsedTriple.getSubArch();
2040 const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
2043 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
2044 bool Modified =
false;
2047 for (Arg *A : Args) {
2048 bool NeedTrans =
false;
2050 if (A->getOption().matches(options::OPT_Xarch_device)) {
2051 NeedTrans = IsDevice;
2053 }
else if (A->getOption().matches(options::OPT_Xarch_host)) {
2054 NeedTrans = !IsDevice;
2056 }
else if (A->getOption().matches(options::OPT_Xarch__)) {
2057 StringRef Val = A->getValue();
2059 (!BoundArch.empty() && Val == BoundArch) ||
2063 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.
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.
@ 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...