;
25llvm::StringRef Arch = Triple.getArchName();
26 returnllvm::ARM::parseArchVersion(Arch);
31llvm::StringRef Arch = Triple.getArchName();
32 returnllvm::ARM::parseArchProfile(Arch) == llvm::ARM::ProfileKind::M;
40 if(Arg *A = Args.getLastArg(options::OPT_mlittle_endian,
41options::OPT_mbig_endian)) {
42 return!A->getOption().matches(options::OPT_mlittle_endian);
45 returnTriple.getArch() == llvm::Triple::armeb ||
46Triple.getArch() == llvm::Triple::thumbeb;
51llvm::StringRef Arch = Triple.getArchName();
52 returnllvm::ARM::parseArchProfile(Arch) == llvm::ARM::ProfileKind::A;
57 auto arch= Triple.getArch();
58 if(
arch!= llvm::Triple::arm &&
arch!= llvm::Triple::thumb &&
59 arch!= llvm::Triple::armeb &&
arch!= llvm::Triple::thumbeb)
62 if(Triple.getVendor() != llvm::Triple::UnknownVendor)
65 if(Triple.getOS() != llvm::Triple::UnknownOS)
68 if(Triple.getEnvironment() != llvm::Triple::EABI &&
69Triple.getEnvironment() != llvm::Triple::EABIHF)
77llvm::StringRef &CPU,
boolFromAs) {
78 if(
constArg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ))
80 if(
constArg *A = Args.getLastArg(options::OPT_march_EQ))
86Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
89 for(StringRef
Value: A->getValues()) {
90 if(
Value.starts_with(
"-mcpu="))
91CPU =
Value.substr(6);
92 if(
Value.starts_with(
"-march="))
93Arch =
Value.substr(7);
101 constArgList &Args, StringRef HWDiv,
102std::vector<StringRef> &Features) {
103uint64_t HWDivID = llvm::ARM::parseHWDiv(HWDiv);
104 if(!llvm::ARM::getHWDivFeatures(HWDivID, Features))
105 D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
110 constArgList &Args, StringRef FPU,
111std::vector<StringRef> &Features) {
112llvm::ARM::FPUKind FPUKind = llvm::ARM::parseFPU(FPU);
113 if(!llvm::ARM::getFPUFeatures(FPUKind, Features))
114 D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
120llvm::ARM::ArchKind ArchKind,
121std::vector<StringRef> &Features,
122llvm::ARM::FPUKind &ArgFPUKind) {
124text.split(
Split, StringRef(
"+"), -1,
false);
126 for(StringRef Feature :
Split) {
127 if(!appendArchExtFeatures(CPU, ArchKind, Feature, Features, ArgFPUKind))
134std::vector<StringRef> &Features) {
135CPU = CPU.split(
"+").first;
136 if(CPU !=
"generic") {
137llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU);
138uint64_t Extension = llvm::ARM::getDefaultExtensions(CPU, ArchKind);
139llvm::ARM::getExtensionFeatures(Extension, Features);
147llvm::StringRef ArchName, llvm::StringRef CPUName,
148std::vector<StringRef> &Features,
149 constllvm::Triple &Triple,
150llvm::ARM::FPUKind &ArgFPUKind) {
151std::pair<StringRef, StringRef>
Split= ArchName.split(
"+");
154llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(MArch);
155 if(ArchKind == llvm::ARM::ArchKind::INVALID ||
156(
Split.second.size() &&
159 D.Diag(clang::diag::err_drv_unsupported_option_argument)
160<< A->getSpelling() << A->getValue();
165llvm::StringRef CPUName, llvm::StringRef ArchName,
166std::vector<StringRef> &Features,
167 constllvm::Triple &Triple,
168llvm::ARM::FPUKind &ArgFPUKind) {
169std::pair<StringRef, StringRef>
Split= CPUName.split(
"+");
172llvm::ARM::ArchKind ArchKind =
174 if(ArchKind == llvm::ARM::ArchKind::INVALID ||
176Features, ArgFPUKind)))
177 D.Diag(clang::diag::err_drv_unsupported_option_argument)
178<< A->getSpelling() << A->getValue();
188Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
189options::OPT_mfloat_abi_EQ);
190 if(A && (A->getOption().matches(options::OPT_mhard_float) ||
191(A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
192A->getValue() == StringRef(
"hard"))))
193 D.Diag(clang::diag::warn_drv_no_floating_point_registers)
194<< A->getAsString(Args);
200 return T.getEnvironment() == llvm::Triple::EABI ||
201 T.getEnvironment() == llvm::Triple::EABIHF ||
210llvm::ARM::ArchKind AK = llvm::ARM::parseArch(Triple.getArchName());
211 returnTriple.isARM() || AK == llvm::ARM::ArchKind::ARMV6T2 ||
212(Ver >= 7 && AK != llvm::ARM::ArchKind::ARMV8MBaseline);
217 constllvm::Triple &Triple,
boolForAS) {
218 if(Arg *A = Args.getLastArg(options::OPT_mtp_mode_EQ)) {
220llvm::StringSwitch<arm::ReadTPMode>(A->getValue())
221.Case(
"cp15", ReadTPMode::TPIDRURO)
222.Case(
"tpidrurw", ReadTPMode::TPIDRURW)
223.Case(
"tpidruro", ReadTPMode::TPIDRURO)
224.Case(
"tpidrprw", ReadTPMode::TPIDRPRW)
225.Case(
"soft", ReadTPMode::Soft)
226.Default(ReadTPMode::Invalid);
227 if((ThreadPointer == ReadTPMode::TPIDRURW ||
228ThreadPointer == ReadTPMode::TPIDRURO ||
229ThreadPointer == ReadTPMode::TPIDRPRW) &&
230!isHardTPSupported(Triple) && !ForAS) {
231 D.Diag(diag::err_target_unsupported_tp_hard) << Triple.getArchName();
232 returnReadTPMode::Invalid;
234 if(ThreadPointer != ReadTPMode::Invalid)
235 returnThreadPointer;
236 if(StringRef(A->getValue()).empty())
237 D.Diag(diag::err_drv_missing_arg_mtp) << A->getAsString(Args);
239 D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args);
240 returnReadTPMode::Invalid;
242 returnReadTPMode::Soft;
246 types::IDInputType, llvm::Triple &Triple) {
247StringRef MCPU, MArch;
248 if(
constArg *A = Args.getLastArg(options::OPT_mcpu_EQ))
249MCPU = A->getValue();
250 if(
constArg *A = Args.getLastArg(options::OPT_march_EQ))
251MArch = A->getValue();
253std::string CPU = Triple.isOSBinFormatMachO()
258 boolIsBigEndian = Triple.getArch() == llvm::Triple::armeb ||
259Triple.getArch() == llvm::Triple::thumbeb;
262 if(Arg *A = Args.getLastArg(options::OPT_mlittle_endian,
263options::OPT_mbig_endian)) {
264IsBigEndian = !A->getOption().matches(options::OPT_mlittle_endian);
266std::string ArchName = IsBigEndian ?
"armeb":
"arm";
270llvm::ARM::parseArchProfile(Suffix) == llvm::ARM::ProfileKind::M;
271 boolThumbDefault = IsMProfile ||
273(llvm::ARM::parseArchVersion(Suffix) == 7 &&
274Triple.isOSBinFormatMachO()) ||
276Triple.isOSWindows();
280 boolARMModeRequested =
281!Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault);
282 if(IsMProfile && ARMModeRequested) {
284 D.Diag(diag::err_cpu_unsupported_isa) << CPU <<
"ARM";
286 D.Diag(diag::err_arch_unsupported_isa)
293 boolIsThumb =
false;
294 if(InputType != types::TY_PP_Asm)
296Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault);
301llvm::StringRef WaMArch, WaMCPU;
302 for(
const auto*A :
303Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
304 for(StringRef
Value: A->getValues()) {
306 if(
Value==
"-mthumb")
308 else if(
Value.starts_with(
"-march="))
309WaMArch =
Value.substr(7);
310 else if(
Value.starts_with(
"-mcpu="))
311WaMCPU =
Value.substr(6);
315 if(WaMCPU.size() || WaMArch.size()) {
325 if(IsThumb || IsMProfile || Triple.isOSWindows()) {
327ArchName =
"thumbeb";
331Triple.setArchName(ArchName + Suffix.str());
335llvm::Triple &Triple) {
336 if(Triple.isOSLiteOS()) {
337Triple.setEnvironment(llvm::Triple::OpenHOS);
344 switch(Triple.getEnvironment()) {
345 casellvm::Triple::GNUEABI:
346 casellvm::Triple::GNUEABIHF:
347Triple.setEnvironment(isHardFloat ? llvm::Triple::GNUEABIHF
348: llvm::Triple::GNUEABI);
350 casellvm::Triple::GNUEABIT64:
351 casellvm::Triple::GNUEABIHFT64:
352Triple.setEnvironment(isHardFloat ? llvm::Triple::GNUEABIHFT64
353: llvm::Triple::GNUEABIT64);
355 casellvm::Triple::EABI:
356 casellvm::Triple::EABIHF:
357Triple.setEnvironment(isHardFloat ? llvm::Triple::EABIHF
358: llvm::Triple::EABI);
360 casellvm::Triple::MuslEABI:
361 casellvm::Triple::MuslEABIHF:
362Triple.setEnvironment(isHardFloat ? llvm::Triple::MuslEABIHF
363: llvm::Triple::MuslEABI);
365 casellvm::Triple::OpenHOS:
369 if(DefaultABI != arm::FloatABI::Invalid &&
370isHardFloat != (DefaultABI == arm::FloatABI::Hard)) {
372Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
373options::OPT_mfloat_abi_EQ);
374assert(ABIArg &&
"Non-default float abi expected to be from arg");
375 D.Diag(diag::err_drv_unsupported_opt_for_target)
376<< ABIArg->getAsString(Args) << Triple.getTriple();
389 switch(Triple.getOS()) {
390 casellvm::Triple::Darwin:
391 casellvm::Triple::MacOSX:
392 casellvm::Triple::IOS:
393 casellvm::Triple::TvOS:
394 casellvm::Triple::DriverKit:
395 casellvm::Triple::XROS:
397 if(Triple.isWatchABI())
398 returnFloatABI::Hard;
400 return(SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
402 casellvm::Triple::WatchOS:
403 returnFloatABI::Hard;
406 casellvm::Triple::Win32:
410 returnFloatABI::Soft;
411 returnFloatABI::Hard;
413 casellvm::Triple::NetBSD:
414 switch(Triple.getEnvironment()) {
415 casellvm::Triple::EABIHF:
416 casellvm::Triple::GNUEABIHF:
417 returnFloatABI::Hard;
419 returnFloatABI::Soft;
423 casellvm::Triple::FreeBSD:
424 switch(Triple.getEnvironment()) {
425 casellvm::Triple::GNUEABIHF:
426 returnFloatABI::Hard;
429 returnFloatABI::Soft;
433 casellvm::Triple::Haiku:
434 casellvm::Triple::OpenBSD:
435 returnFloatABI::SoftFP;
438 if(Triple.isOHOSFamily())
439 returnFloatABI::Soft;
440 switch(Triple.getEnvironment()) {
441 casellvm::Triple::GNUEABIHF:
442 casellvm::Triple::GNUEABIHFT64:
443 casellvm::Triple::MuslEABIHF:
444 casellvm::Triple::EABIHF:
445 returnFloatABI::Hard;
446 casellvm::Triple::Android:
447 casellvm::Triple::GNUEABI:
448 casellvm::Triple::GNUEABIT64:
449 casellvm::Triple::MuslEABI:
450 casellvm::Triple::EABI:
452 returnFloatABI::SoftFP;
454 returnFloatABI::Invalid;
457 returnFloatABI::Invalid;
463 constArgList &Args) {
466Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
467options::OPT_mfloat_abi_EQ)) {
468 if(A->getOption().matches(options::OPT_msoft_float)) {
469ABI = FloatABI::Soft;
470}
else if(A->getOption().matches(options::OPT_mhard_float)) {
471ABI = FloatABI::Hard;
473ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
474.Case(
"soft", FloatABI::Soft)
475.Case(
"softfp", FloatABI::SoftFP)
476.Case(
"hard", FloatABI::Hard)
477.Default(FloatABI::Invalid);
478 if(ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
479 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
480ABI = FloatABI::Soft;
486 if(ABI == FloatABI::Invalid)
489 if(ABI == FloatABI::Invalid) {
491 if(Triple.isOSBinFormatMachO() &&
492Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em)
493ABI = FloatABI::Hard;
495ABI = FloatABI::Soft;
497 if(Triple.getOS() != llvm::Triple::UnknownOS ||
498!Triple.isOSBinFormatMachO())
499 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) <<
"soft";
502assert(ABI != FloatABI::Invalid &&
"must select an ABI");
507 autoMVE = llvm::find(llvm::reverse(F),
"+mve");
508 autoNoMVE = llvm::find(llvm::reverse(F),
"-mve");
509 returnMVE != F.rend() &&
510(NoMVE == F.rend() || std::distance(MVE, NoMVE) > 0);
514 constllvm::Triple &Triple,
516std::vector<StringRef> &Features,
517 boolForAS,
boolForMultilib) {
519Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
521std::optional<std::pair<const Arg *, StringRef>> WaCPU, WaFPU, WaHDiv, WaArch;
528std::vector<StringRef> ExtensionFeatures;
544 if(ABI == arm::FloatABI::Soft)
545Features.push_back(
"+soft-float");
548 if(ABI != arm::FloatABI::Hard)
549Features.push_back(
"+soft-float-abi");
554Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
557 for(StringRef
Value: A->getValues()) {
558 if(
Value.starts_with(
"-mfpu=")) {
559WaFPU = std::make_pair(A,
Value.substr(6));
560}
else if(
Value.starts_with(
"-mcpu=")) {
561WaCPU = std::make_pair(A,
Value.substr(6));
562}
else if(
Value.starts_with(
"-mhwdiv=")) {
563WaHDiv = std::make_pair(A,
Value.substr(8));
564}
else if(
Value.starts_with(
"-march=")) {
565WaArch = std::make_pair(A,
Value.substr(7));
573 if(Arg *A = Args.getLastArgNoClaim(options::OPT_mabi_EQ))
574A->ignoreTargetSpecific();
577 if(
getReadTPMode(
D, Args, Triple, ForAS) == ReadTPMode::TPIDRURW)
578Features.push_back(
"+read-tp-tpidrurw");
579 if(
getReadTPMode(
D, Args, Triple, ForAS) == ReadTPMode::TPIDRURO)
580Features.push_back(
"+read-tp-tpidruro");
581 if(
getReadTPMode(
D, Args, Triple, ForAS) == ReadTPMode::TPIDRPRW)
582Features.push_back(
"+read-tp-tpidrprw");
584 constArg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
585 constArg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
588llvm::ARM::FPUKind ArchArgFPUKind = llvm::ARM::FK_INVALID;
589llvm::ARM::FPUKind CPUArgFPUKind = llvm::ARM::FK_INVALID;
594 D.Diag(clang::diag::warn_drv_unused_argument)
595<< CPUArg->getAsString(Args);
596CPUName = WaCPU->second;
597CPUArg = WaCPU->first;
599CPUName = CPUArg->getValue();
604 D.Diag(clang::diag::warn_drv_unused_argument)
605<< ArchArg->getAsString(Args);
606ArchName = WaArch->second;
609ExtensionFeatures, Triple, ArchArgFPUKind);
612}
else if(ArchArg) {
613ArchName = ArchArg->getValue();
615Triple, ArchArgFPUKind);
619 if(CPUName ==
"native") {
620 for(
auto&F : llvm::sys::getHostCPUFeatures())
622Args.MakeArgString((F.second ?
"+":
"-") + F.first()));
623}
else if(!CPUName.empty()) {
633Triple, CPUArgFPUKind);
637(void)Args.getLastArg(options::OPT_mtune_EQ);
640llvm::ARM::FPUKind FPUKind = llvm::ARM::FK_INVALID;
641 constArg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
644 D.Diag(clang::diag::warn_drv_unused_argument)
645<< FPUArg->getAsString(Args);
650 const char*AndroidFPU =
"neon";
651FPUKind = llvm::ARM::parseFPU(AndroidFPU);
652 if(!llvm::ARM::getFPUFeatures(FPUKind, Features))
653 D.Diag(clang::diag::err_drv_clang_unsupported)
654<< std::string(
"-mfpu=") + AndroidFPU;
655}
else if(ArchArgFPUKind != llvm::ARM::FK_INVALID ||
656CPUArgFPUKind != llvm::ARM::FK_INVALID) {
658CPUArgFPUKind != llvm::ARM::FK_INVALID ? CPUArgFPUKind : ArchArgFPUKind;
659(void)llvm::ARM::getFPUFeatures(FPUKind, Features);
664 if(CPU !=
"generic")
666llvm::ARM::ArchKind ArchKind =
668FPUKind = llvm::ARM::getDefaultFPU(CPU, ArchKind);
669(void)llvm::ARM::getFPUFeatures(FPUKind, Features);
671 if(
Generic&& (Triple.isOSWindows() || Triple.isOSDarwin()) &&
673FPUKind = llvm::ARM::parseFPU(
"neon");
674(void)llvm::ARM::getFPUFeatures(FPUKind, Features);
681Features.insert(std::end(Features),
682std::begin(ExtensionFeatures), std::end(ExtensionFeatures));
685 constArg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
688 D.Diag(clang::diag::warn_drv_unused_argument)
689<< HDivArg->getAsString(Args);
698 const autoItRNoFullFP16 = std::find(Features.rbegin(), Features.rend(),
"-fullfp16");
699 const autoItRFP16FML = std::find(Features.rbegin(), Features.rend(),
"+fp16fml");
700 if(Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_4a) {
701 const autoItRFullFP16 = std::find(Features.rbegin(), Features.rend(),
"+fullfp16");
702 if(ItRFullFP16 < ItRNoFullFP16 && ItRFullFP16 < ItRFP16FML) {
705 if(std::find(Features.rbegin(), ItRFullFP16,
"-fp16fml") == ItRFullFP16)
706Features.push_back(
"+fp16fml");
709 gotofp16_fml_fallthrough;
712fp16_fml_fallthrough:
715 if(ItRNoFullFP16 < ItRFP16FML)
716Features.push_back(
"-fp16fml");
717 else if(ItRNoFullFP16 > ItRFP16FML)
718Features.push_back(
"+fullfp16");
725 boolHasFPRegs =
true;
726 if(ABI == arm::FloatABI::Soft) {
727llvm::ARM::getFPUFeatures(llvm::ARM::FK_NONE, Features);
731Features.insert(Features.end(),
732{
"-dotprod",
"-fp16fml",
"-bf16",
"-mve",
"-mve.fp"});
734FPUKind = llvm::ARM::FK_NONE;
735}
else if(FPUKind == llvm::ARM::FK_NONE ||
736ArchArgFPUKind == llvm::ARM::FK_NONE ||
737CPUArgFPUKind == llvm::ARM::FK_NONE) {
742Features.insert(Features.end(),
743{
"-dotprod",
"-fp16fml",
"-bf16",
"-mve.fp"});
745FPUKind = llvm::ARM::FK_NONE;
748Features.emplace_back(
"-fpregs");
751 if(Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
752 if(A->getOption().matches(options::OPT_mcrc))
753Features.push_back(
"+crc");
755Features.push_back(
"-crc");
764 if(FPUKind == llvm::ARM::FK_FPV5_D16 || FPUKind == llvm::ARM::FK_FPV5_SP_D16)
765Features.push_back(
"-mve.fp");
775 boolHasSHA2 =
false;
776 boolHasAES =
false;
777 const autoItCrypto =
778llvm::find_if(llvm::reverse(Features), [](
constStringRef F) {
779 returnF.contains(
"crypto");
782llvm::find_if(llvm::reverse(Features), [](
constStringRef F) {
783 returnF.contains(
"crypto") || F.contains(
"sha2");
786llvm::find_if(llvm::reverse(Features), [](
constStringRef F) {
787 returnF.contains(
"crypto") || F.contains(
"aes");
789 const boolFoundSHA2 = ItSHA2 != Features.rend();
790 const boolFoundAES = ItAES != Features.rend();
792HasSHA2 = ItSHA2->take_front() ==
"+";
794HasAES = ItAES->take_front() ==
"+";
795 if(ItCrypto != Features.rend()) {
796 if(HasSHA2 && HasAES)
797Features.push_back(
"+crypto");
799Features.push_back(
"-crypto");
801Features.push_back(
"+sha2");
803Features.push_back(
"-sha2");
805Features.push_back(
"+aes");
807Features.push_back(
"-aes");
810 if(HasSHA2 || HasAES) {
813llvm::ARM::ProfileKind ArchProfile =
814llvm::ARM::parseArchProfile(ArchSuffix);
815 if(!((llvm::ARM::parseArchVersion(ArchSuffix) >= 8) &&
816(ArchProfile == llvm::ARM::ProfileKind::A ||
817ArchProfile == llvm::ARM::ProfileKind::R))) {
819 D.Diag(clang::diag::warn_target_unsupported_extension)
821<< llvm::ARM::getArchName(llvm::ARM::parseArch(ArchSuffix));
823 D.Diag(clang::diag::warn_target_unsupported_extension)
825<< llvm::ARM::getArchName(llvm::ARM::parseArch(ArchSuffix));
831 if(!Args.hasArg(options::OPT_fno_integrated_as)) {
832Features.push_back(
"-sha2");
833Features.push_back(
"-aes");
839 if(Arg *A = Args.getLastArg(options::OPT_mframe_chain)) {
840StringRef FrameChainOption = A->getValue();
841 if(FrameChainOption.starts_with(
"aapcs"))
842Features.push_back(
"+aapcs-frame-chain");
846 if(Args.getLastArg(options::OPT_mcmse))
847Features.push_back(
"+8msecext");
849 if(Arg *A = Args.getLastArg(options::OPT_mfix_cmse_cve_2021_35465,
850options::OPT_mno_fix_cmse_cve_2021_35465)) {
851 if(!Args.getLastArg(options::OPT_mcmse))
852 D.Diag(diag::err_opt_not_valid_without_opt)
853<< A->getOption().getName() <<
"-mcmse";
855 if(A->getOption().matches(options::OPT_mfix_cmse_cve_2021_35465))
856Features.push_back(
"+fix-cmse-cve-2021-35465");
858Features.push_back(
"-fix-cmse-cve-2021-35465");
862 if(Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a57_aes_1742098,
863options::OPT_mno_fix_cortex_a57_aes_1742098)) {
864 if(A->getOption().matches(options::OPT_mfix_cortex_a57_aes_1742098)) {
865Features.push_back(
"+fix-cortex-a57-aes-1742098");
867Features.push_back(
"-fix-cortex-a57-aes-1742098");
874 if(Arg *A = Args.getLastArg(options::OPT_mlong_calls,
875options::OPT_mno_long_calls)) {
876 if(A->getOption().matches(options::OPT_mlong_calls))
877Features.push_back(
"+long-calls");
878}
else if(KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
879!Triple.isWatchOS() && !Triple.isXROS()) {
880Features.push_back(
"+long-calls");
887 if(!ForAS && !ForMultilib) {
890 if(Arg *A = Args.getLastArg(options::OPT_mexecute_only, options::OPT_mno_execute_only)) {
891 if(A->getOption().matches(options::OPT_mexecute_only)) {
893llvm::ARM::parseArch(Triple.getArchName()) != llvm::ARM::ArchKind::ARMV6T2 &&
894llvm::ARM::parseArch(Triple.getArchName()) != llvm::ARM::ArchKind::ARMV6M)
895 D.Diag(diag::err_target_unsupported_execute_only) << Triple.getArchName();
896 else if(llvm::ARM::parseArch(Triple.getArchName()) == llvm::ARM::ArchKind::ARMV6M) {
897 if(Arg *PIArg = Args.getLastArg(options::OPT_fropi, options::OPT_frwpi,
898options::OPT_fpic, options::OPT_fpie,
899options::OPT_fPIC, options::OPT_fPIE))
900 D.Diag(diag::err_opt_not_valid_with_opt_on_target)
901<< A->getAsString(Args) << PIArg->getAsString(Args) << Triple.getArchName();
902}
else if(Arg *B = Args.getLastArg(options::OPT_mno_movt))
903 D.Diag(diag::err_opt_not_valid_with_opt)
904<< A->getAsString(Args) << B->getAsString(Args);
905Features.push_back(
"+execute-only");
910 if(Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
911options::OPT_munaligned_access,
912options::OPT_mstrict_align,
913options::OPT_mno_strict_align)) {
916A->getOption().matches(options::OPT_mno_unaligned_access) ||
917A->getOption().matches(options::OPT_mstrict_align)) {
918Features.push_back(
"+strict-align");
921 if(Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
922 D.Diag(diag::err_target_unsupported_unaligned) <<
"v6m";
925 else if(Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
926 D.Diag(diag::err_target_unsupported_unaligned) <<
"v8m.base";
943 if(Triple.isOSDarwin() || Triple.isOSNetBSD()) {
944 if(VersionNum < 6 ||
945Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
946Features.push_back(
"+strict-align");
947}
else if(Triple.getVendor() == llvm::Triple::Apple &&
948Triple.isOSBinFormatMachO()) {
950Features.push_back(
"+strict-align");
951}
else if(VersionNum < 7 ||
952Triple.getSubArch() ==
953llvm::Triple::SubArchType::ARMSubArch_v6m ||
954Triple.getSubArch() ==
955llvm::Triple::SubArchType::ARMSubArch_v8m_baseline) {
956Features.push_back(
"+strict-align");
963 if(Args.hasArg(options::OPT_ffixed_r9))
964Features.push_back(
"+reserve-r9");
967 if(KernelOrKext || Args.hasArg(options::OPT_mno_movt))
968Features.push_back(
"+no-movt");
970 if(Args.hasArg(options::OPT_mno_neg_immediates))
971Features.push_back(
"+no-neg-immediates");
974 if(Arg *A = Args.getLastArg(options::OPT_mharden_sls_EQ)) {
975StringRef
Scope= A->getValue();
976 boolEnableRetBr =
false;
977 boolEnableBlr =
false;
978 boolDisableComdat =
false;
979 if(
Scope!=
"none") {
981 Scope.split(Opts,
",");
982 for(
autoOpt : Opts) {
989 if(Opt ==
"retbr") {
997 if(Opt ==
"comdat") {
998DisableComdat =
false;
1001 if(Opt ==
"nocomdat") {
1002DisableComdat =
true;
1005 D.Diag(diag::err_drv_unsupported_option_argument)
1006<< A->getSpelling() <<
Scope;
1011 if(EnableRetBr || EnableBlr)
1013 D.Diag(diag::err_sls_hardening_arm_not_supported)
1014<<
Scope<< A->getAsString(Args);
1017Features.push_back(
"+harden-sls-retbr");
1019Features.push_back(
"+harden-sls-blr");
1020 if(DisableComdat) {
1021Features.push_back(
"+harden-sls-nocomdat");
1025 if(Args.getLastArg(options::OPT_mno_bti_at_return_twice))
1026Features.push_back(
"+no-bti-at-return-twice");
1033std::string
arm::getARMArch(StringRef Arch,
constllvm::Triple &Triple) {
1036MArch = std::string(Arch);
1038MArch = std::string(Triple.getArchName());
1039MArch = StringRef(MArch).split(
"+").first.lower();
1042 if(MArch ==
"native") {
1043std::string CPU = std::string(llvm::sys::getHostCPUName());
1044 if(CPU !=
"generic") {
1052MArch = std::string(
"arm") + Suffix.str();
1061std::string MArch =
getARMArch(Arch, Triple);
1069 returnllvm::ARM::getARMCPUForArch(Triple, MArch);
1074 constllvm::Triple &Triple) {
1078std::string MCPU = StringRef(CPU).split(
"+").first.lower();
1080 if(MCPU ==
"native")
1081 returnstd::string(llvm::sys::getHostCPUName());
1094 constllvm::Triple &Triple) {
1095llvm::ARM::ArchKind ArchKind;
1096 if(CPU ==
"generic"|| CPU.empty()) {
1098ArchKind = llvm::ARM::parseArch(ARMArch);
1099 if(ArchKind == llvm::ARM::ArchKind::INVALID)
1103llvm::ARM::parseCPUArch(llvm::ARM::getARMCPUForArch(Triple, ARMArch));
1107ArchKind = (Arch ==
"armv7k"|| Arch ==
"thumbv7k")
1108? llvm::ARM::ArchKind::ARMV7K
1109: llvm::ARM::parseCPUArch(CPU);
1118 constllvm::Triple &Triple) {
1119llvm::ARM::ArchKind ArchKind = getLLVMArchKindForARM(CPU, Arch, Triple);
1120 if(ArchKind == llvm::ARM::ArchKind::INVALID)
1122 returnllvm::ARM::getSubArch(ArchKind);
1126 constllvm::Triple &Triple) {
1127 if(Args.hasArg(options::OPT_r))
1133CmdArgs.push_back(
"--be8");
Scope - A scope is a transient data structure that is used while parsing the program.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T
@ Generic
not a target-specific vector type
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4