18#include "clang/Config/config.h"
27#include "llvm/ADT/SmallString.h"
28#include "llvm/ADT/StringExtras.h"
29#include "llvm/ADT/StringRef.h"
30#include "llvm/ADT/Twine.h"
31#include "llvm/Config/llvm-config.h"
32#include "llvm/MC/MCTargetOptions.h"
33#include "llvm/MC/TargetRegistry.h"
34#include "llvm/Option/Arg.h"
35#include "llvm/Option/ArgList.h"
36#include "llvm/Option/OptTable.h"
37#include "llvm/Option/Option.h"
38#include "llvm/Support/ErrorHandling.h"
39#include "llvm/Support/FileSystem.h"
40#include "llvm/Support/FileUtilities.h"
41#include "llvm/Support/Path.h"
42#include "llvm/Support/Process.h"
43#include "llvm/Support/VersionTuple.h"
44#include "llvm/Support/VirtualFileSystem.h"
45#include "llvm/TargetParser/AArch64TargetParser.h"
46#include "llvm/TargetParser/RISCVISAInfo.h"
47#include "llvm/TargetParser/TargetParser.h"
48#include "llvm/TargetParser/Triple.h"
61 return Args.getLastArg(options::OPT_mkernel, options::OPT_fapple_kext,
62 options::OPT_fno_rtti, options::OPT_frtti);
66 const llvm::Triple &Triple,
67 const Arg *CachedRTTIArg) {
70 if (CachedRTTIArg->getOption().matches(options::OPT_frtti))
77 bool NoRTTI = Triple.isPS() || Triple.isDriverKit();
82 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
94 auto addIfExists = [
this](
path_list &List,
const std::string &Path) {
108 Triple.setEnvironment(Env);
109 if (EffectiveTriple != llvm::Triple())
110 EffectiveTriple.setEnvironment(Env);
120 return Args.hasFlag(options::OPT_fintegrated_as,
121 options::OPT_fno_integrated_as,
129 "(Non-)integrated backend set incorrectly!");
131 bool IBackend = Args.hasFlag(options::OPT_fintegrated_objemitter,
132 options::OPT_fno_integrated_objemitter,
140 DiagID = clang::diag::err_drv_unsupported_opt_for_target;
142 DiagID = clang::diag::warn_drv_unsupported_opt_for_target;
143 Arg *A = Args.getLastArg(options::OPT_fno_integrated_objemitter);
145 D.Diag(DiagID) << A->getAsString(Args) << Triple.getTriple();
146 A = Args.getLastArg(options::OPT_fintegrated_objemitter);
148 D.Diag(DiagID) << A->getAsString(Args) << Triple.getTriple();
154 return ENABLE_X86_RELAX_RELOCATIONS;
158 return PPC_LINUX_DEFAULT_IEEELONGDOUBLE &&
getTriple().isOSLinux();
162 const llvm::opt::ArgList &Args) {
163 for (
const Arg *MultilibFlagArg :
164 Args.filtered(options::OPT_fmultilib_flag)) {
165 List.push_back(MultilibFlagArg->getAsString(Args));
166 MultilibFlagArg->claim();
171 const llvm::Triple &Triple,
172 const llvm::opt::ArgList &Args,
174 std::vector<StringRef> Features;
179 llvm::DenseSet<StringRef> FeatureSet(UnifiedFeatures.begin(),
180 UnifiedFeatures.end());
181 std::vector<std::string> MArch;
182 for (
const auto &Ext : AArch64::Extensions)
183 if (!Ext.UserVisibleName.empty())
184 if (FeatureSet.contains(Ext.PosTargetFeature))
185 MArch.push_back(Ext.UserVisibleName.str());
186 for (
const auto &Ext : AArch64::Extensions)
187 if (!Ext.UserVisibleName.empty())
188 if (FeatureSet.contains(Ext.NegTargetFeature))
189 MArch.push_back((
"no" + Ext.UserVisibleName).str());
191 for (
const auto &ArchInfo : AArch64::ArchInfos)
192 if (FeatureSet.contains(ArchInfo->ArchFeature))
193 ArchName = ArchInfo->Name;
194 if (!ArchName.empty()) {
195 MArch.insert(MArch.begin(), (
"-march=" + ArchName).str());
196 Result.push_back(llvm::join(MArch,
"+"));
199 const Arg *BranchProtectionArg =
200 Args.getLastArgNoClaim(options::OPT_mbranch_protection_EQ);
201 if (BranchProtectionArg) {
202 Result.push_back(BranchProtectionArg->getAsString(Args));
205 if (FeatureSet.contains(
"+strict-align"))
206 Result.push_back(
"-mno-unaligned-access");
208 Result.push_back(
"-munaligned-access");
210 if (Arg *Endian = Args.getLastArg(options::OPT_mbig_endian,
211 options::OPT_mlittle_endian)) {
212 if (Endian->getOption().matches(options::OPT_mbig_endian))
213 Result.push_back(Endian->getAsString(Args));
216 const Arg *ABIArg = Args.getLastArgNoClaim(options::OPT_mabi_EQ);
218 Result.push_back(ABIArg->getAsString(Args));
221 if (
const Arg *A = Args.getLastArg(options::OPT_O_Group);
222 A && A->getOption().matches(options::OPT_O)) {
223 switch (A->getValue()[0]) {
225 Result.push_back(
"-Os");
228 Result.push_back(
"-Oz");
235 llvm::Reloc::Model RelocationModel,
236 const llvm::opt::ArgList &Args,
238 std::vector<StringRef> Features;
240 D, Triple, Args, Features,
false ,
true );
242 llvm::DenseSet<StringRef> FeatureSet(UnifiedFeatures.begin(),
243 UnifiedFeatures.end());
244 std::vector<std::string> MArch;
245 for (
const auto &Ext : ARM::ARCHExtNames)
246 if (!Ext.Name.empty())
247 if (FeatureSet.contains(Ext.Feature))
248 MArch.push_back(Ext.Name.str());
249 for (
const auto &Ext : ARM::ARCHExtNames)
250 if (!Ext.Name.empty())
251 if (FeatureSet.contains(Ext.NegFeature))
252 MArch.push_back((
"no" + Ext.Name).str());
253 MArch.insert(MArch.begin(), (
"-march=" + Triple.getArchName()).str());
254 Result.push_back(llvm::join(MArch,
"+"));
257#define ARM_FPU(NAME, KIND, VERSION, NEON_SUPPORT, RESTRICTION) \
258 case llvm::ARM::KIND: \
259 Result.push_back("-mfpu=" NAME); \
261#include "llvm/TargetParser/ARMTargetParser.def"
263 llvm_unreachable(
"Invalid FPUKind");
267 case arm::FloatABI::Soft:
268 Result.push_back(
"-mfloat-abi=soft");
270 case arm::FloatABI::SoftFP:
271 Result.push_back(
"-mfloat-abi=softfp");
273 case arm::FloatABI::Hard:
274 Result.push_back(
"-mfloat-abi=hard");
276 case arm::FloatABI::Invalid:
277 llvm_unreachable(
"Invalid float ABI");
280 if (RelocationModel == llvm::Reloc::ROPI ||
281 RelocationModel == llvm::Reloc::ROPI_RWPI)
282 Result.push_back(
"-fropi");
284 Result.push_back(
"-fno-ropi");
286 if (RelocationModel == llvm::Reloc::RWPI ||
287 RelocationModel == llvm::Reloc::ROPI_RWPI)
288 Result.push_back(
"-frwpi");
290 Result.push_back(
"-fno-rwpi");
292 const Arg *BranchProtectionArg =
293 Args.getLastArgNoClaim(options::OPT_mbranch_protection_EQ);
294 if (BranchProtectionArg) {
295 Result.push_back(BranchProtectionArg->getAsString(Args));
298 if (FeatureSet.contains(
"+strict-align"))
299 Result.push_back(
"-mno-unaligned-access");
301 Result.push_back(
"-munaligned-access");
303 if (Arg *Endian = Args.getLastArg(options::OPT_mbig_endian,
304 options::OPT_mlittle_endian)) {
305 if (Endian->getOption().matches(options::OPT_mbig_endian))
306 Result.push_back(Endian->getAsString(Args));
309 if (
const Arg *A = Args.getLastArg(options::OPT_O_Group);
310 A && A->getOption().matches(options::OPT_O)) {
311 switch (A->getValue()[0]) {
313 Result.push_back(
"-Os");
316 Result.push_back(
"-Oz");
323 const llvm::opt::ArgList &Args,
325 bool hasShadowCallStack) {
328 auto ISAInfo = llvm::RISCVISAInfo::parseArchString(
330 if (!llvm::errorToBool(ISAInfo.takeError()))
331 Result.push_back(
"-march=" + (*ISAInfo)->toString());
335 if (hasShadowCallStack)
336 Result.push_back(
"-fsanitize=shadow-call-stack");
338 Result.push_back(
"-fno-sanitize=shadow-call-stack");
345 std::vector<std::string>
Result;
347 Result.push_back(
"--target=" + Triple.str());
353 llvm::Reloc::Model RelocationModel;
358 std::tie(RelocationModel, PICLevel, IsPIE) =
ParsePICArgs(*
this, Args);
361 switch (Triple.getArch()) {
362 case llvm::Triple::aarch64:
363 case llvm::Triple::aarch64_32:
364 case llvm::Triple::aarch64_be:
367 case llvm::Triple::arm:
368 case llvm::Triple::armeb:
369 case llvm::Triple::thumb:
370 case llvm::Triple::thumbeb:
373 case llvm::Triple::riscv32:
374 case llvm::Triple::riscv64:
375 case llvm::Triple::riscv32be:
376 case llvm::Triple::riscv64be:
389 Result.push_back(
"-fno-rtti");
391 Result.push_back(
"-frtti");
394 Result.push_back(
"-fno-exceptions");
396 Result.push_back(
"-fexceptions");
398 if (RelocationModel == llvm::Reloc::PIC_)
399 Result.push_back(IsPIE ? (PICLevel > 1 ?
"-fPIE" :
"-fpie")
400 : (PICLevel > 1 ?
"-fPIC" :
"-fpic"));
402 Result.push_back(
"-fno-pic");
412 SanitizerArgs SanArgs(*
this, JobArgs, !SanitizerArgsChecked);
413 SanitizerArgsChecked =
true;
418 XRayArgs XRayArguments(*
this, JobArgs);
419 return XRayArguments;
426 const char *ModeFlag;
435 static const DriverSuffix DriverSuffixes[] = {
437 {
"clang++",
"--driver-mode=g++"},
438 {
"clang-c++",
"--driver-mode=g++"},
439 {
"clang-cc",
nullptr},
440 {
"clang-cpp",
"--driver-mode=cpp"},
441 {
"clang-g++",
"--driver-mode=g++"},
442 {
"clang-gcc",
nullptr},
443 {
"clang-cl",
"--driver-mode=cl"},
445 {
"cpp",
"--driver-mode=cpp"},
446 {
"cl",
"--driver-mode=cl"},
447 {
"++",
"--driver-mode=g++"},
448 {
"flang",
"--driver-mode=flang"},
451 {
"flang-new",
"--driver-mode=flang"},
452 {
"clang-dxc",
"--driver-mode=dxc"},
455 for (
const auto &DS : DriverSuffixes) {
456 StringRef Suffix(DS.Suffix);
457 if (ProgName.ends_with(Suffix)) {
458 Pos = ProgName.size() - Suffix.size();
468 std::string ProgName = std::string(llvm::sys::path::filename(Argv0));
469 if (is_style_windows(llvm::sys::path::Style::native)) {
471 std::transform(ProgName.begin(), ProgName.end(), ProgName.begin(),
487 if (!DS && ProgName.ends_with(
".exe")) {
490 ProgName = ProgName.drop_back(StringRef(
".exe").size());
497 ProgName = ProgName.rtrim(
"0123456789.");
504 ProgName = ProgName.slice(0, ProgName.rfind(
'-'));
517 size_t SuffixEnd = SuffixPos + strlen(DS->Suffix);
519 size_t LastComponent = ProgName.rfind(
'-', SuffixPos);
520 if (LastComponent == std::string::npos)
522 std::string ModeSuffix = ProgName.substr(LastComponent + 1,
523 SuffixEnd - LastComponent - 1);
526 StringRef Prefix(ProgName);
527 Prefix = Prefix.slice(0, LastComponent);
528 std::string IgnoredError;
530 llvm::Triple Triple(Prefix);
531 bool IsRegistered = llvm::TargetRegistry::lookupTarget(Triple, IgnoredError);
540 switch (Triple.getArch()) {
541 case llvm::Triple::aarch64: {
546 case llvm::Triple::aarch64_32:
548 case llvm::Triple::ppc:
550 case llvm::Triple::ppcle:
552 case llvm::Triple::ppc64:
554 case llvm::Triple::ppc64le:
557 return Triple.getArchName();
570Tool *ToolChain::getClang()
const {
576Tool *ToolChain::getFlang()
const {
587 llvm_unreachable(
"Linking is not supported by this toolchain");
591 llvm_unreachable(
"Creating static lib is not supported by this toolchain");
594Tool *ToolChain::getAssemble()
const {
597 return Assemble.get();
600Tool *ToolChain::getClangAs()
const {
603 return Assemble.get();
606Tool *ToolChain::getLink()
const {
612Tool *ToolChain::getStaticLibTool()
const {
615 return StaticLibTool.get();
618Tool *ToolChain::getIfsMerge()
const {
620 IfsMerge.reset(
new tools::ifstool::Merger(*
this));
621 return IfsMerge.get();
624Tool *ToolChain::getOffloadBundler()
const {
626 OffloadBundler.reset(
new tools::OffloadBundler(*
this));
627 return OffloadBundler.get();
630Tool *ToolChain::getOffloadPackager()
const {
631 if (!OffloadPackager)
632 OffloadPackager.reset(
new tools::OffloadPackager(*
this));
633 return OffloadPackager.get();
636Tool *ToolChain::getLinkerWrapper()
const {
638 LinkerWrapper.reset(
new tools::LinkerWrapper(*
this, getLink()));
639 return LinkerWrapper.get();
645 return getAssemble();
648 return getIfsMerge();
654 return getStaticLibTool();
665 llvm_unreachable(
"Invalid tool kind.");
678 return getOffloadBundler();
681 return getOffloadPackager();
683 return getLinkerWrapper();
686 llvm_unreachable(
"Invalid tool kind.");
690 const ArgList &Args) {
691 const llvm::Triple &Triple = TC.
getTriple();
692 bool IsWindows = Triple.isOSWindows();
695 return Triple.getArchName();
697 if (TC.
getArch() == llvm::Triple::arm || TC.
getArch() == llvm::Triple::armeb)
703 if (TC.
getArch() == llvm::Triple::x86 && Triple.isAndroid())
706 if (TC.
getArch() == llvm::Triple::x86_64 && Triple.isX32())
709 return llvm::Triple::getArchTypeName(TC.
getArch());
713 if (Triple.isOSDarwin())
716 switch (Triple.getOS()) {
717 case llvm::Triple::FreeBSD:
719 case llvm::Triple::NetBSD:
721 case llvm::Triple::OpenBSD:
723 case llvm::Triple::Solaris:
725 case llvm::Triple::AIX:
739 }
else if (Triple.isOSUnknown()) {
740 llvm::sys::path::append(Path,
"lib");
744 return std::string(Path);
751 return llvm::sys::path::filename(CRTAbsolutePath).str();
757 bool IsFortran)
const {
759 bool IsITANMSVCWindows =
760 TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment();
767 Suffix = IsITANMSVCWindows ?
".obj" :
".o";
770 Suffix = IsITANMSVCWindows ?
".lib" :
".a";
773 if (TT.isOSWindows())
774 Suffix = TT.isOSCygMing() ?
".dll.a" :
".lib";
775 else if (TT.isOSAIX())
782 std::string ArchAndEnv;
785 const char *Env = TT.isAndroid() ?
"-android" :
"";
786 ArchAndEnv = (
"-" +
Arch + Env).str();
789 std::string LibName = IsFortran ?
"flang_rt." :
"clang_rt.";
790 return (Prefix + Twine(LibName) + Component + ArchAndEnv + Suffix).str();
797 Args, Component,
Type,
false, IsFortran);
801 llvm::sys::path::append(P, CRTBasename);
803 return std::string(P);
810 !IsFortran, IsFortran);
812 llvm::sys::path::append(OldPath, CRTBasename);
813 if (Path.empty() ||
getVFS().exists(OldPath))
814 return std::string(OldPath);
819 return std::string(Path);
825 bool isFortran)
const {
831 llvm::opt::ArgStringList &CmdArgs)
const {
836 if (!
getTriple().isKnownWindowsMSVCEnvironment()) {
838 F128LibName.consume_front_insensitive(
"lib");
839 if (!F128LibName.empty()) {
841 CmdArgs.push_back(
"-lflang_rt.quadmath");
844 CmdArgs.push_back(Args.MakeArgString(
"-l" + F128LibName));
853 CmdArgs.push_back(
"-lexecinfo");
857 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
858 options::OPT_fno_openmp,
false)) {
863 !
getTriple().isKnownWindowsMSVCEnvironment()) {
864 CmdArgs.push_back(
"-latomic");
870 ArgStringList &CmdArgs)
const {
871 auto AddLibSearchPathIfExists = [&](
const Twine &Path) {
873 if (!llvm::sys::fs::is_directory(Path))
876 if (
getTriple().isKnownWindowsMSVCEnvironment())
877 CmdArgs.push_back(Args.MakeArgString(
"-libpath:" + Path));
879 CmdArgs.push_back(Args.MakeArgString(
"-L" + Path));
892 llvm::sys::path::parent_path(
getDriver().Dir);
893 llvm::sys::path::append(DefaultLibPath,
"lib");
894 AddLibSearchPathIfExists(DefaultLibPath);
898 llvm::opt::ArgStringList &CmdArgs)
const {
901 if (Args.hasFlag(options::OPT_static_libflangrt,
902 options::OPT_shared_libflangrt,
getTriple().isOSAIX()))
906 CmdArgs.push_back(
"-lflang_rt.runtime");
914std::optional<std::string>
915ToolChain::getFallbackAndroidTargetPath(StringRef BaseDir)
const {
916 llvm::Triple TripleWithoutLevel(
getTriple());
917 TripleWithoutLevel.setEnvironmentName(
"android");
918 const std::string &TripleWithoutLevelStr = TripleWithoutLevel.str();
919 unsigned TripleVersion =
getTriple().getEnvironmentVersion().getMajor();
920 unsigned BestVersion = 0;
923 bool UsingUnversionedDir =
false;
925 for (llvm::vfs::directory_iterator LI =
getVFS().dir_begin(BaseDir, EC), LE;
926 !EC && LI != LE; LI = LI.increment(EC)) {
927 StringRef DirName = llvm::sys::path::filename(LI->path());
928 StringRef DirNameSuffix = DirName;
929 if (DirNameSuffix.consume_front(TripleWithoutLevelStr)) {
930 if (DirNameSuffix.empty() && TripleDir.empty()) {
932 UsingUnversionedDir =
true;
935 if (!DirNameSuffix.getAsInteger(10, Version) && Version > BestVersion &&
936 Version < TripleVersion) {
937 BestVersion = Version;
939 UsingUnversionedDir =
false;
945 if (TripleDir.empty())
948 SmallString<128> P(BaseDir);
949 llvm::sys::path::append(P, TripleDir);
950 if (UsingUnversionedDir)
951 D.Diag(diag::warn_android_unversioned_fallback) << P <<
getTripleString();
952 return std::string(P);
956 return (Triple.hasEnvironment()
957 ? llvm::Triple(Triple.getArchName(), Triple.getVendorName(),
958 llvm::Triple::getOSTypeName(Triple.getOS()),
959 llvm::Triple::getEnvironmentTypeName(
960 Triple.getEnvironment()))
961 : llvm::Triple(Triple.getArchName(), Triple.getVendorName(),
962 llvm::Triple::getOSTypeName(Triple.getOS())));
965std::optional<std::string>
967 auto getPathForTriple =
968 [&](
const llvm::Triple &Triple) -> std::optional<std::string> {
970 llvm::sys::path::append(P, Triple.str());
972 return std::string(P);
977 if (
auto Path = getPathForTriple(T))
981 llvm::Triple AIXTriple;
982 if (T.getEnvironment() == Triple::UnknownEnvironment) {
984 AIXTriple = llvm::Triple(T.getArchName(), T.getVendorName(),
985 llvm::Triple::getOSTypeName(T.getOS()));
990 if (
auto Path = getPathForTriple(AIXTriple))
995 (!T.getOSVersion().empty() || !T.getEnvironmentVersion().empty())) {
998 if (
auto Path = getPathForTriple(TripleWithoutVersion))
1017 if (T.getArch() == Triple::arm && !T.isArmMClass()) {
1018 llvm::Triple ArmTriple = T;
1019 ArmTriple.setArch(Triple::arm);
1020 if (
auto Path = getPathForTriple(ArmTriple))
1025 return getFallbackAndroidTargetPath(BaseDir);
1032 llvm::sys::path::append(P,
"lib");
1036 if (Triple.isOSDarwin())
1039 llvm::sys::path::append(P, Triple.str());
1040 return std::string(P);
1045 llvm::sys::path::append(P,
"..",
"lib");
1051 llvm::sys::path::append(P,
"..",
"include");
1060 llvm::sys::path::append(Path,
"lib");
1062 llvm::sys::path::append(Path, S);
1063 Paths.push_back(std::string(Path));
1072 if (Args.hasArg(options::OPT_noprofilelib))
1075 return Args.hasArg(options::OPT_fprofile_generate) ||
1076 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
1077 Args.hasArg(options::OPT_fcs_profile_generate) ||
1078 Args.hasArg(options::OPT_fcs_profile_generate_EQ) ||
1079 Args.hasArg(options::OPT_fprofile_instr_generate) ||
1080 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
1081 Args.hasArg(options::OPT_fcreate_profile) ||
1082 Args.hasArg(options::OPT_fprofile_generate_cold_function_coverage) ||
1083 Args.hasArg(options::OPT_fprofile_generate_cold_function_coverage_EQ);
1087 return Args.hasArg(options::OPT_coverage) ||
1088 Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
1093 if (D.IsFlangMode() &&
getDriver().ShouldUseFlangCompiler(JA))
return getFlang();
1094 if (
getDriver().ShouldUseClangCompiler(JA))
return getClang();
1098 return getClangAs();
1103 return D.GetFilePath(Name, *
this);
1107 return D.GetProgramPath(Name, *
this);
1112 *LinkerIsLLD =
false;
1116 const Arg* A = Args.getLastArg(options::OPT_fuse_ld_EQ);
1124 if (
const Arg *A = Args.getLastArg(options::OPT_ld_path_EQ)) {
1125 std::string Path(A->getValue());
1126 if (!Path.empty()) {
1127 if (llvm::sys::path::parent_path(Path).empty())
1129 if (llvm::sys::fs::can_execute(Path)) {
1131 *LinkerIsLLD = UseLinker ==
"lld";
1132 return std::string(Path);
1135 getDriver().
Diag(diag::err_drv_invalid_linker_name) << A->getAsString(Args);
1140 if (UseLinker.empty() || UseLinker ==
"ld") {
1142 if (llvm::sys::path::is_absolute(DefaultLinker))
1143 return std::string(DefaultLinker);
1152 if (UseLinker.contains(
'/'))
1155 if (llvm::sys::path::is_absolute(UseLinker)) {
1158 if (llvm::sys::fs::can_execute(UseLinker))
1159 return std::string(UseLinker);
1162 if (Triple.isOSDarwin())
1163 LinkerName.append(
"ld64.");
1165 LinkerName.append(
"ld.");
1166 LinkerName.append(UseLinker);
1169 if (llvm::sys::fs::can_execute(LinkerPath)) {
1171 *LinkerIsLLD = UseLinker ==
"lld";
1177 getDriver().
Diag(diag::err_drv_invalid_linker_name) << A->getAsString(Args);
1184 if (Triple.isOSDarwin())
1195 if (D.IsFlangMode() &&
id == types::TY_PP_Fortran)
1196 id = types::TY_Fortran;
1206 llvm::Triple HostTriple(LLVM_HOST_TRIPLE);
1207 switch (HostTriple.getArch()) {
1210 case llvm::Triple::arm:
1211 case llvm::Triple::armeb:
1212 case llvm::Triple::thumb:
1213 case llvm::Triple::thumbeb:
1214 return getArch() != llvm::Triple::arm &&
getArch() != llvm::Triple::thumb &&
1215 getArch() != llvm::Triple::armeb &&
getArch() != llvm::Triple::thumbeb;
1217 return HostTriple.getArch() !=
getArch();
1226llvm::ExceptionHandling
1228 return llvm::ExceptionHandling::None;
1232 if (Model ==
"single") {
1234 return Triple.getArch() == llvm::Triple::arm ||
1235 Triple.getArch() == llvm::Triple::armeb ||
1236 Triple.getArch() == llvm::Triple::thumb ||
1237 Triple.getArch() == llvm::Triple::thumbeb || Triple.isWasm();
1238 }
else if (Model ==
"posix")
1250 case llvm::Triple::x86_64: {
1252 if (!Triple.isOSBinFormatMachO())
1255 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1258 StringRef MArch = A->getValue();
1259 if (MArch ==
"x86_64h")
1260 Triple.setArchName(MArch);
1262 return Triple.getTriple();
1264 case llvm::Triple::aarch64: {
1266 if (!Triple.isOSBinFormatMachO())
1267 return Triple.getTriple();
1269 if (Triple.isArm64e())
1270 return Triple.getTriple();
1275 Triple.setArchName(
"arm64");
1276 return Triple.getTriple();
1278 case llvm::Triple::aarch64_32:
1280 case llvm::Triple::amdgcn: {
1282 if (Args.getLastArgValue(options::OPT_mcpu_EQ) ==
"amdgcnspirv")
1283 Triple.setArch(llvm::Triple::ArchType::spirv64);
1284 return Triple.getTriple();
1286 case llvm::Triple::arm:
1287 case llvm::Triple::armeb:
1288 case llvm::Triple::thumb:
1289 case llvm::Triple::thumbeb: {
1293 return Triple.getTriple();
1308 ArgStringList &CC1Args)
const {
1313 const ArgList &DriverArgs, ArgStringList &CC1Args,
1317 ArgStringList &CC1ASArgs)
const {}
1322 llvm::opt::ArgStringList &CmdArgs)
const {
1330 const ArgList &Args)
const {
1332 return *runtimeLibType;
1334 const Arg* A = Args.getLastArg(options::OPT_rtlib_EQ);
1335 StringRef LibName = A ? A->getValue() : CLANG_DEFAULT_RTLIB;
1338 if (LibName ==
"compiler-rt")
1340 else if (LibName ==
"libgcc")
1342 else if (LibName ==
"platform")
1347 << A->getAsString(Args);
1352 return *runtimeLibType;
1356 const ArgList &Args)
const {
1358 return *unwindLibType;
1360 const Arg *A = Args.getLastArg(options::OPT_unwindlib_EQ);
1361 StringRef LibName = A ? A->getValue() : CLANG_DEFAULT_UNWINDLIB;
1363 if (LibName ==
"none")
1365 else if (LibName ==
"platform" || LibName ==
"") {
1374 }
else if (LibName ==
"libunwind") {
1378 }
else if (LibName ==
"libgcc")
1383 << A->getAsString(Args);
1388 return *unwindLibType;
1393 return *cxxStdlibType;
1395 const Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
1396 StringRef LibName = A ? A->getValue() : CLANG_DEFAULT_CXX_STDLIB;
1399 if (LibName ==
"libc++")
1401 else if (LibName ==
"libstdc++")
1403 else if (LibName ==
"platform")
1408 << A->getAsString(Args);
1413 return *cxxStdlibType;
1418 return *cStdlibType;
1420 const Arg *A = Args.getLastArg(options::OPT_cstdlib_EQ);
1421 StringRef LibName = A ? A->getValue() :
"system";
1423 if (LibName ==
"newlib")
1425 else if (LibName ==
"picolibc")
1427 else if (LibName ==
"llvm-libc")
1429 else if (LibName ==
"system")
1434 << A->getAsString(Args);
1438 return *cStdlibType;
1443 llvm::opt::ArgStringList &CC1Args,
1444 const Twine &Path) {
1445 CC1Args.push_back(
"-internal-iframework");
1446 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1458 ArgStringList &CC1Args,
1459 const Twine &Path) {
1460 CC1Args.push_back(
"-internal-externc-isystem");
1461 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1465 ArgStringList &CC1Args,
1466 const Twine &Path) {
1467 if (llvm::sys::fs::exists(Path))
1473 ArgStringList &CC1Args,
1474 const Twine &Path) {
1475 CC1Args.push_back(
"-internal-isystem");
1476 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1481 ArgStringList &CC1Args,
1483 for (
const auto &Path : Paths) {
1484 CC1Args.push_back(
"-internal-iframework");
1485 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1491 ArgStringList &CC1Args,
1493 for (
const auto &Path : Paths) {
1494 CC1Args.push_back(
"-internal-isystem");
1495 CC1Args.push_back(DriverArgs.MakeArgString(Path));
1500 const Twine &
C,
const Twine &D) {
1502 llvm::sys::path::append(
Result, llvm::sys::path::Style::posix, A, B,
C, D);
1503 return std::string(
Result);
1509 std::string MaxVersionString;
1511 llvm::sys::path::append(Path,
"c++");
1512 for (llvm::vfs::directory_iterator LI =
getVFS().dir_begin(Path, EC), LE;
1513 !EC && LI != LE; LI = LI.increment(EC)) {
1514 StringRef VersionText = llvm::sys::path::filename(LI->path());
1516 if (VersionText[0] ==
'v' &&
1517 !VersionText.substr(1).getAsInteger(10, Version)) {
1518 if (Version > MaxVersion) {
1519 MaxVersion = Version;
1520 MaxVersionString = std::string(VersionText);
1526 return MaxVersionString;
1530 ArgStringList &CC1Args)
const {
1540 DriverArgs.AddAllArgs(CC1Args, options::OPT_stdlib_EQ);
1544 const llvm::opt::ArgList &DriverArgs,
1545 llvm::opt::ArgStringList &CC1Args)
const {
1546 DriverArgs.ClaimAllArgs(options::OPT_stdlibxx_isystem);
1555 if (!DriverArgs.hasArg(options::OPT_nostdincxx))
1556 for (
const auto &P :
1557 DriverArgs.getAllArgValues(options::OPT_stdlibxx_isystem))
1563 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
1564 options::OPT_nostdlibxx);
1568 ArgStringList &CmdArgs)
const {
1569 assert(!Args.hasArg(options::OPT_nostdlibxx) &&
1570 "should not have called this");
1575 CmdArgs.push_back(
"-lc++");
1576 if (Args.hasArg(options::OPT_fexperimental_library))
1577 CmdArgs.push_back(
"-lc++experimental");
1581 CmdArgs.push_back(
"-lstdc++");
1587 ArgStringList &CmdArgs)
const {
1589 if(LibPath.length() > 0)
1590 CmdArgs.push_back(Args.MakeArgString(StringRef(
"-L") + LibPath));
1594 ArgStringList &CmdArgs)
const {
1595 CmdArgs.push_back(
"-lcc_kext");
1599 std::string &Path)
const {
1603 bool Default = !Args.hasArgNoClaim(options::OPT_shared);
1609 Arg *A = Args.getLastArg(
1610 options::OPT_ffast_math, options::OPT_fno_fast_math,
1611 options::OPT_funsafe_math_optimizations,
1612 options::OPT_fno_unsafe_math_optimizations, options::OPT_ffp_model_EQ);
1614 if (!A || A->getOption().getID() == options::OPT_fno_fast_math ||
1615 A->getOption().getID() == options::OPT_fno_unsafe_math_optimizations)
1617 if (A && A->getOption().getID() == options::OPT_ffp_model_EQ) {
1618 StringRef Model = A->getValue();
1619 if (Model !=
"fast" && Model !=
"aggressive")
1626 if (!Args.hasFlag(options::OPT_mdaz_ftz, options::OPT_mno_daz_ftz,
Default))
1631 return (Path !=
"crtfastmath.o");
1635 ArgStringList &CmdArgs)
const {
1638 CmdArgs.push_back(Args.MakeArgString(Path));
1656 (SanitizerKind::CFI & ~SanitizerKind::CFIICall) |
1657 SanitizerKind::CFICastStrict | SanitizerKind::FloatDivideByZero |
1658 SanitizerKind::KCFI | SanitizerKind::UnsignedIntegerOverflow |
1659 SanitizerKind::UnsignedShiftBase | SanitizerKind::ImplicitConversion |
1660 SanitizerKind::Nullability | SanitizerKind::LocalBounds |
1661 SanitizerKind::AllocToken;
1668 Res |= SanitizerKind::CFIICall;
1671 Res |= SanitizerKind::ShadowCallStack;
1673 Res |= SanitizerKind::MemTag;
1675 Res |= SanitizerKind::KernelAddress;
1680 ArgStringList &CC1Args)
const {}
1683 ArgStringList &CC1Args)
const {}
1686 ArgStringList &CC1Args)
const {}
1695 ArgStringList &CC1Args)
const {}
1699 return VersionTuple(Version);
1701 if (Version < 10000)
1702 return VersionTuple(Version / 100, Version % 100);
1704 unsigned Build = 0, Factor = 1;
1705 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
1706 Build = Build + (Version % 10) * Factor;
1707 return VersionTuple(Version / 100, Version % 100, Build);
1712 const llvm::opt::ArgList &Args)
const {
1713 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
1714 const Arg *MSCompatibilityVersion =
1715 Args.getLastArg(options::OPT_fms_compatibility_version);
1717 if (MSCVersion && MSCompatibilityVersion) {
1719 D->Diag(diag::err_drv_argument_not_allowed_with)
1720 << MSCVersion->getAsString(Args)
1721 << MSCompatibilityVersion->getAsString(Args);
1722 return VersionTuple();
1725 if (MSCompatibilityVersion) {
1727 if (MSVT.tryParse(MSCompatibilityVersion->getValue())) {
1729 D->Diag(diag::err_drv_invalid_value)
1730 << MSCompatibilityVersion->getAsString(Args)
1731 << MSCompatibilityVersion->getValue();
1738 unsigned Version = 0;
1739 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version)) {
1741 D->Diag(diag::err_drv_invalid_value)
1742 << MSCVersion->getAsString(Args) << MSCVersion->getValue();
1748 return VersionTuple();
1752 const llvm::opt::DerivedArgList &Args,
bool SameTripleAsHost,
1754 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
1756 bool Modified =
false;
1759 for (
auto *A : Args) {
1764 if (A->getOption().matches(options::OPT_m_Group)) {
1771 if (SameTripleAsHost ||
1772 A->getOption().matches(options::OPT_mcode_object_version_EQ) ||
1773 A->getOption().matches(options::OPT_mlinker_version_EQ))
1782 bool XOpenMPTargetNoTriple =
1783 A->getOption().matches(options::OPT_Xopenmp_target);
1785 if (A->getOption().matches(options::OPT_Xopenmp_target_EQ)) {
1790 Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
1793 }
else if (XOpenMPTargetNoTriple) {
1795 Index = Args.getBaseArgs().MakeIndex(A->getValue(0));
1803 std::unique_ptr<Arg> XOpenMPTargetArg(Opts.ParseOneArg(Args, Index));
1804 if (!XOpenMPTargetArg || Index > Prev + 1) {
1805 if (!A->isClaimed()) {
1806 getDriver().
Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
1807 << A->getAsString(Args);
1811 if (XOpenMPTargetNoTriple && XOpenMPTargetArg &&
1812 Args.getAllArgValues(options::OPT_offload_targets_EQ).size() != 1) {
1813 getDriver().
Diag(diag::err_drv_Xopenmp_target_missing_triple);
1816 XOpenMPTargetArg->setBaseArg(A);
1817 A = XOpenMPTargetArg.release();
1818 AllocatedArgs.push_back(A);
1834 const llvm::opt::DerivedArgList &Args, llvm::opt::Arg *&A,
1835 llvm::opt::DerivedArgList *DAL,
1838 unsigned ValuePos = 1;
1839 if (A->getOption().matches(options::OPT_Xarch_device) ||
1840 A->getOption().matches(options::OPT_Xarch_host))
1843 const InputArgList &BaseArgs = Args.getBaseArgs();
1844 unsigned Index = BaseArgs.MakeIndex(A->getValue(ValuePos));
1845 unsigned Prev = Index;
1846 std::unique_ptr<llvm::opt::Arg> XarchArg(Opts.ParseOneArg(
1856 if (!XarchArg || Index > Prev + 1) {
1857 getDriver().
Diag(diag::err_drv_invalid_Xarch_argument_with_args)
1858 << A->getAsString(Args);
1864 "invalid Xarch argument: '%0', not all driver "
1865 "options can be forwared via Xarch argument");
1866 Diags.Report(DiagID) << A->getAsString(Args);
1870 XarchArg->setBaseArg(A);
1871 A = XarchArg.release();
1879 for (
const char *
Value : A->getValues()) {
1880 auto Opt = Opts.getOption(options::OPT_Zlinker_input);
1881 unsigned Index = BaseArgs.MakeIndex(Opt.getName(),
Value);
1883 new Arg(Opt, BaseArgs.MakeArgString(Opt.getPrefix() + Opt.getName()),
1884 Index, BaseArgs.getArgString(Index + 1), A);
1886 DAL->append(NewArg);
1888 DAL->AddSynthesizedArg(NewArg);
1890 AllocatedArgs->push_back(NewArg);
1895 DAL->AddSynthesizedArg(A);
1897 AllocatedArgs->push_back(A);
1901 const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
1904 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
1905 bool Modified =
false;
1908 for (Arg *A : Args) {
1909 bool NeedTrans =
false;
1911 if (A->getOption().matches(options::OPT_Xarch_device)) {
1912 NeedTrans = IsDevice;
1914 }
else if (A->getOption().matches(options::OPT_Xarch_host)) {
1915 NeedTrans = !IsDevice;
1917 }
else if (A->getOption().matches(options::OPT_Xarch__)) {
1919 (!BoundArch.empty() && A->getValue() == BoundArch);
1922 if (NeedTrans ||
Skip)
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.
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...