13 #include "llvm/ADT/StringSwitch.h"
14 #include "llvm/Option/ArgList.h"
15 #include "llvm/Support/ARMTargetParser.h"
16 #include "llvm/Support/TargetParser.h"
17 #include "llvm/Support/Host.h"
21 using namespace clang;
26 llvm::StringRef Arch = Triple.getArchName();
27 return llvm::ARM::parseArchVersion(Arch);
32 llvm::StringRef Arch = Triple.getArchName();
33 return llvm::ARM::parseArchProfile(Arch) == llvm::ARM::ProfileKind::M;
38 llvm::StringRef Arch = Triple.getArchName();
39 return llvm::ARM::parseArchProfile(Arch) == llvm::ARM::ProfileKind::A;
44 llvm::StringRef &CPU,
bool FromAs) {
45 if (
const Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ))
47 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
53 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
56 for (StringRef
Value : A->getValues()) {
57 if (
Value.startswith(
"-mcpu="))
58 CPU =
Value.substr(6);
59 if (
Value.startswith(
"-march="))
60 Arch =
Value.substr(7);
68 const ArgList &Args, StringRef HWDiv,
69 std::vector<StringRef> &Features) {
70 uint64_t HWDivID = llvm::ARM::parseHWDiv(HWDiv);
71 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
72 D.
Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
77 const ArgList &Args, StringRef FPU,
78 std::vector<StringRef> &Features) {
79 unsigned FPUID = llvm::ARM::parseFPU(FPU);
80 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
81 D.
Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
87 llvm::ARM::ArchKind ArchKind,
88 std::vector<StringRef> &Features,
91 text.split(
Split, StringRef(
"+"), -1,
false);
93 for (StringRef Feature :
Split) {
94 if (!appendArchExtFeatures(CPU, ArchKind, Feature, Features, ArgFPUID))
101 std::vector<StringRef> &Features) {
102 CPU = CPU.split(
"+").first;
103 if (CPU !=
"generic") {
104 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU);
105 uint64_t Extension = llvm::ARM::getDefaultExtensions(CPU, ArchKind);
106 llvm::ARM::getExtensionFeatures(Extension, Features);
114 llvm::StringRef ArchName, llvm::StringRef CPUName,
115 std::vector<StringRef> &Features,
116 const llvm::Triple &Triple,
unsigned &ArgFPUID) {
117 std::pair<StringRef, StringRef>
Split = ArchName.split(
"+");
120 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(MArch);
121 if (ArchKind == llvm::ARM::ArchKind::INVALID ||
123 ArchKind, Features, ArgFPUID)))
124 D.
Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
129 llvm::StringRef CPUName, llvm::StringRef ArchName,
130 std::vector<StringRef> &Features,
131 const llvm::Triple &Triple,
unsigned &ArgFPUID) {
132 std::pair<StringRef, StringRef>
Split = CPUName.split(
"+");
135 llvm::ARM::ArchKind ArchKind =
137 if (ArchKind == llvm::ARM::ArchKind::INVALID ||
138 (
Split.second.size() &&
140 D.
Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
146 return T.getEnvironment() == llvm::Triple::EABI ||
147 T.getEnvironment() == llvm::Triple::EABIHF ||
156 llvm::ARM::ArchKind AK = llvm::ARM::parseArch(Triple.getArchName());
157 return Triple.isARM() || AK == llvm::ARM::ArchKind::ARMV6T2 ||
158 (Ver >= 7 && AK != llvm::ARM::ArchKind::ARMV8MBaseline);
163 const llvm::Triple &Triple,
bool ForAS) {
164 if (Arg *A = Args.getLastArg(options::OPT_mtp_mode_EQ)) {
166 llvm::StringSwitch<arm::ReadTPMode>(A->getValue())
167 .Case(
"cp15", ReadTPMode::Cp15)
168 .Case(
"soft", ReadTPMode::Soft)
172 D.
Diag(diag::err_target_unsupported_tp_hard) << Triple.getArchName();
176 return ThreadPointer;
177 if (StringRef(A->getValue()).empty())
178 D.
Diag(diag::err_drv_missing_arg_mtp) << A->getAsString(Args);
180 D.
Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args);
183 return ReadTPMode::Soft;
187 types::ID InputType, llvm::Triple &Triple) {
188 StringRef MCPU, MArch;
189 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
190 MCPU = A->getValue();
191 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
192 MArch = A->getValue();
199 bool IsBigEndian = Triple.getArch() == llvm::Triple::armeb ||
200 Triple.getArch() == llvm::Triple::thumbeb;
203 if (Arg *A = Args.getLastArg(options::OPT_mlittle_endian,
204 options::OPT_mbig_endian)) {
205 IsBigEndian = !A->getOption().matches(options::OPT_mlittle_endian);
207 std::string ArchName = IsBigEndian ?
"armeb" :
"arm";
211 llvm::ARM::parseArchProfile(Suffix) == llvm::ARM::ProfileKind::M;
212 bool ThumbDefault = IsMProfile ||
214 (llvm::ARM::parseArchVersion(Suffix) == 7 &&
215 Triple.isOSBinFormatMachO()) ||
217 Triple.isOSWindows();
221 bool ARMModeRequested =
222 !Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault);
223 if (IsMProfile && ARMModeRequested) {
225 D.
Diag(diag::err_cpu_unsupported_isa) << CPU <<
"ARM";
227 D.
Diag(diag::err_arch_unsupported_isa)
234 bool IsThumb =
false;
235 if (InputType != types::TY_PP_Asm)
237 Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault);
242 llvm::StringRef WaMArch, WaMCPU;
244 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
245 for (StringRef
Value : A->getValues()) {
247 if (
Value ==
"-mthumb")
249 else if (
Value.startswith(
"-march="))
250 WaMArch =
Value.substr(7);
251 else if (
Value.startswith(
"-mcpu="))
252 WaMCPU =
Value.substr(6);
256 if (WaMCPU.size() || WaMArch.size()) {
266 if (IsThumb || IsMProfile || Triple.isOSWindows()) {
268 ArchName =
"thumbeb";
272 Triple.setArchName(ArchName + Suffix.str());
276 llvm::Triple &Triple) {
280 switch (Triple.getEnvironment()) {
281 case llvm::Triple::GNUEABI:
282 case llvm::Triple::GNUEABIHF:
283 Triple.setEnvironment(isHardFloat ? llvm::Triple::GNUEABIHF
284 : llvm::Triple::GNUEABI);
286 case llvm::Triple::EABI:
287 case llvm::Triple::EABIHF:
288 Triple.setEnvironment(isHardFloat ? llvm::Triple::EABIHF
289 : llvm::Triple::EABI);
291 case llvm::Triple::MuslEABI:
292 case llvm::Triple::MuslEABIHF:
293 Triple.setEnvironment(isHardFloat ? llvm::Triple::MuslEABIHF
294 : llvm::Triple::MuslEABI);
301 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
302 options::OPT_mfloat_abi_EQ);
303 assert(ABIArg &&
"Non-default float abi expected to be from arg");
304 D.
Diag(diag::err_drv_unsupported_opt_for_target)
305 << ABIArg->getAsString(Args) << Triple.getTriple();
318 switch (Triple.getOS()) {
319 case llvm::Triple::Darwin:
320 case llvm::Triple::MacOSX:
321 case llvm::Triple::IOS:
322 case llvm::Triple::TvOS:
323 case llvm::Triple::DriverKit:
325 if (Triple.isWatchABI())
326 return FloatABI::Hard;
328 return (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
330 case llvm::Triple::WatchOS:
331 return FloatABI::Hard;
334 case llvm::Triple::Win32:
338 return FloatABI::Soft;
339 return FloatABI::Hard;
341 case llvm::Triple::NetBSD:
342 switch (Triple.getEnvironment()) {
343 case llvm::Triple::EABIHF:
344 case llvm::Triple::GNUEABIHF:
345 return FloatABI::Hard;
347 return FloatABI::Soft;
351 case llvm::Triple::FreeBSD:
352 switch (Triple.getEnvironment()) {
353 case llvm::Triple::GNUEABIHF:
354 return FloatABI::Hard;
357 return FloatABI::Soft;
361 case llvm::Triple::OpenBSD:
362 return FloatABI::SoftFP;
365 switch (Triple.getEnvironment()) {
366 case llvm::Triple::GNUEABIHF:
367 case llvm::Triple::MuslEABIHF:
368 case llvm::Triple::EABIHF:
369 return FloatABI::Hard;
370 case llvm::Triple::GNUEABI:
371 case llvm::Triple::MuslEABI:
372 case llvm::Triple::EABI:
374 return FloatABI::SoftFP;
375 case llvm::Triple::Android:
376 return (SubArch >= 7) ? FloatABI::SoftFP : FloatABI::Soft;
387 const ArgList &Args) {
390 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
391 options::OPT_mfloat_abi_EQ)) {
392 if (A->getOption().matches(options::OPT_msoft_float)) {
393 ABI = FloatABI::Soft;
394 }
else if (A->getOption().matches(options::OPT_mhard_float)) {
395 ABI = FloatABI::Hard;
397 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
398 .Case(
"soft", FloatABI::Soft)
399 .Case(
"softfp", FloatABI::SoftFP)
400 .Case(
"hard", FloatABI::Hard)
403 D.
Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
404 ABI = FloatABI::Soft;
415 if (Triple.isOSBinFormatMachO() &&
416 Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em)
417 ABI = FloatABI::Hard;
419 ABI = FloatABI::Soft;
421 if (Triple.getOS() != llvm::Triple::UnknownOS ||
422 !Triple.isOSBinFormatMachO())
423 D.
Diag(diag::warn_drv_assuming_mfloat_abi_is) <<
"soft";
431 auto MVE = llvm::find(llvm::reverse(F),
"+mve");
432 auto NoMVE = llvm::find(llvm::reverse(F),
"-mve");
433 return MVE != F.rend() &&
439 std::vector<StringRef> &Features,
bool ForAS) {
441 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
451 std::vector<StringRef> ExtensionFeatures;
468 Features.push_back(
"+soft-float");
472 Features.push_back(
"+soft-float-abi");
477 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
480 for (StringRef
Value : A->getValues()) {
481 if (
Value.startswith(
"-mfpu=")) {
482 WaFPU = std::make_pair(A,
Value.substr(6));
483 }
else if (
Value.startswith(
"-mcpu=")) {
484 WaCPU = std::make_pair(A,
Value.substr(6));
485 }
else if (
Value.startswith(
"-mhwdiv=")) {
486 WaHDiv = std::make_pair(A,
Value.substr(8));
487 }
else if (
Value.startswith(
"-march=")) {
488 WaArch = std::make_pair(A,
Value.substr(7));
494 if (
getReadTPMode(D, Args, Triple, ForAS) == ReadTPMode::Cp15)
495 Features.push_back(
"+read-tp-hard");
497 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
498 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
501 unsigned ArchArgFPUID = llvm::ARM::FK_INVALID;
502 unsigned CPUArgFPUID = llvm::ARM::FK_INVALID;
507 D.
Diag(clang::diag::warn_drv_unused_argument)
508 << CPUArg->getAsString(Args);
509 CPUName = WaCPU->second;
510 CPUArg = WaCPU->first;
512 CPUName = CPUArg->getValue();
517 D.
Diag(clang::diag::warn_drv_unused_argument)
518 << ArchArg->getAsString(Args);
519 ArchName = WaArch->second;
522 ExtensionFeatures, Triple, ArchArgFPUID);
525 }
else if (ArchArg) {
526 ArchName = ArchArg->getValue();
528 Triple, ArchArgFPUID);
532 if (CPUName ==
"native") {
533 llvm::StringMap<bool> HostFeatures;
534 if (llvm::sys::getHostCPUFeatures(HostFeatures))
535 for (
auto &F : HostFeatures)
537 Args.MakeArgString((F.second ?
"+" :
"-") + F.first()));
538 }
else if (!CPUName.empty()) {
548 Triple, CPUArgFPUID);
550 unsigned FPUID = llvm::ARM::FK_INVALID;
551 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
554 D.
Diag(clang::diag::warn_drv_unused_argument)
555 << FPUArg->getAsString(Args);
560 const char *AndroidFPU =
"neon";
561 FPUID = llvm::ARM::parseFPU(AndroidFPU);
562 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
563 D.
Diag(clang::diag::err_drv_clang_unsupported)
568 llvm::ARM::ArchKind ArchKind =
570 FPUID = llvm::ARM::getDefaultFPU(CPU, ArchKind);
571 (void)llvm::ARM::getFPUFeatures(FPUID, Features);
578 Features.insert(std::end(Features),
579 std::begin(ExtensionFeatures), std::end(ExtensionFeatures));
582 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
585 D.
Diag(clang::diag::warn_drv_unused_argument)
586 << HDivArg->getAsString(Args);
595 const auto ItRNoFullFP16 = std::find(Features.rbegin(), Features.rend(),
"-fullfp16");
596 const auto ItRFP16FML = std::find(Features.rbegin(), Features.rend(),
"+fp16fml");
597 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_4a) {
598 const auto ItRFullFP16 = std::find(Features.rbegin(), Features.rend(),
"+fullfp16");
599 if (ItRFullFP16 < ItRNoFullFP16 && ItRFullFP16 < ItRFP16FML) {
602 if (std::find(Features.rbegin(), ItRFullFP16,
"-fp16fml") == ItRFullFP16)
603 Features.push_back(
"+fp16fml");
606 goto fp16_fml_fallthrough;
609 fp16_fml_fallthrough:
612 if (ItRNoFullFP16 < ItRFP16FML)
613 Features.push_back(
"-fp16fml");
614 else if (ItRNoFullFP16 > ItRFP16FML)
615 Features.push_back(
"+fullfp16");
623 llvm::ARM::getFPUFeatures(llvm::ARM::FK_NONE, Features);
627 Features.insert(Features.end(), {
"-dotprod",
"-fp16fml",
"-bf16",
"-mve",
628 "-mve.fp",
"-fpregs"});
629 }
else if (FPUID == llvm::ARM::FK_NONE ||
630 ArchArgFPUID == llvm::ARM::FK_NONE ||
631 CPUArgFPUID == llvm::ARM::FK_NONE) {
636 Features.insert(Features.end(),
637 {
"-dotprod",
"-fp16fml",
"-bf16",
"-mve.fp"});
639 Features.emplace_back(
"-fpregs");
643 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
644 if (A->getOption().matches(options::OPT_mcrc))
645 Features.push_back(
"+crc");
647 Features.push_back(
"-crc");
658 bool HasSHA2 =
false;
660 const auto ItCrypto =
661 llvm::find_if(llvm::reverse(Features), [](
const StringRef F) {
662 return F.contains(
"crypto");
665 llvm::find_if(llvm::reverse(Features), [](
const StringRef F) {
666 return F.contains(
"crypto") || F.contains(
"sha2");
669 llvm::find_if(llvm::reverse(Features), [](
const StringRef F) {
670 return F.contains(
"crypto") || F.contains(
"aes");
672 const bool FoundSHA2 = ItSHA2 != Features.rend();
673 const bool FoundAES = ItAES != Features.rend();
675 HasSHA2 = ItSHA2->take_front() ==
"+";
677 HasAES = ItAES->take_front() ==
"+";
678 if (ItCrypto != Features.rend()) {
679 if (HasSHA2 && HasAES)
680 Features.push_back(
"+crypto");
682 Features.push_back(
"-crypto");
684 Features.push_back(
"+sha2");
686 Features.push_back(
"-sha2");
688 Features.push_back(
"+aes");
690 Features.push_back(
"-aes");
693 if (HasSHA2 || HasAES) {
696 llvm::ARM::ProfileKind ArchProfile =
697 llvm::ARM::parseArchProfile(ArchSuffix);
698 if (!((llvm::ARM::parseArchVersion(ArchSuffix) >= 8) &&
699 (ArchProfile == llvm::ARM::ProfileKind::A ||
700 ArchProfile == llvm::ARM::ProfileKind::R))) {
702 D.
Diag(clang::diag::warn_target_unsupported_extension)
704 << llvm::ARM::getArchName(llvm::ARM::parseArch(ArchSuffix));
706 D.
Diag(clang::diag::warn_target_unsupported_extension)
708 << llvm::ARM::getArchName(llvm::ARM::parseArch(ArchSuffix));
714 if (!Args.hasArg(options::OPT_fno_integrated_as)) {
715 Features.push_back(
"-sha2");
716 Features.push_back(
"-aes");
722 if (Args.getLastArg(options::OPT_mcmse))
723 Features.push_back(
"+8msecext");
725 if (Arg *A = Args.getLastArg(options::OPT_mfix_cmse_cve_2021_35465,
726 options::OPT_mno_fix_cmse_cve_2021_35465)) {
727 if (!Args.getLastArg(options::OPT_mcmse))
728 D.
Diag(diag::err_opt_not_valid_without_opt)
729 << A->getOption().getName() <<
"-mcmse";
731 if (A->getOption().matches(options::OPT_mfix_cmse_cve_2021_35465))
732 Features.push_back(
"+fix-cmse-cve-2021-35465");
734 Features.push_back(
"-fix-cmse-cve-2021-35465");
738 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a57_aes_1742098,
739 options::OPT_mno_fix_cortex_a57_aes_1742098)) {
740 if (A->getOption().matches(options::OPT_mfix_cortex_a57_aes_1742098)) {
741 Features.push_back(
"+fix-cortex-a57-aes-1742098");
743 Features.push_back(
"-fix-cortex-a57-aes-1742098");
750 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
751 options::OPT_mno_long_calls)) {
752 if (A->getOption().matches(options::OPT_mlong_calls))
753 Features.push_back(
"+long-calls");
754 }
else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
755 !Triple.isWatchOS()) {
756 Features.push_back(
"+long-calls");
764 if (Arg *A = Args.getLastArg(options::OPT_mexecute_only, options::OPT_mno_execute_only)) {
765 if (A->getOption().matches(options::OPT_mexecute_only)) {
767 llvm::ARM::parseArch(Triple.getArchName()) != llvm::ARM::ArchKind::ARMV6T2)
768 D.
Diag(diag::err_target_unsupported_execute_only) << Triple.getArchName();
769 else if (Arg *B = Args.getLastArg(options::OPT_mno_movt))
770 D.
Diag(diag::err_opt_not_valid_with_opt) << A->getAsString(Args) << B->getAsString(Args);
774 else if (Arg *B = Args.getLastArg(options::OPT_mlong_calls, options::OPT_mno_long_calls)) {
775 if (B->getOption().matches(options::OPT_mlong_calls))
776 D.
Diag(diag::err_opt_not_valid_with_opt) << A->getAsString(Args) << B->getAsString(Args);
778 Features.push_back(
"+execute-only");
785 Features.push_back(
"+strict-align");
786 }
else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
787 options::OPT_munaligned_access)) {
788 if (A->getOption().matches(options::OPT_munaligned_access)) {
790 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
791 D.
Diag(diag::err_target_unsupported_unaligned) <<
"v6m";
794 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
795 D.
Diag(diag::err_target_unsupported_unaligned) <<
"v8m.base";
797 Features.push_back(
"+strict-align");
814 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
815 if (VersionNum < 6 ||
816 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
817 Features.push_back(
"+strict-align");
818 }
else if (Triple.isOSLinux() || Triple.isOSNaCl() ||
819 Triple.isOSWindows()) {
821 Features.push_back(
"+strict-align");
823 Features.push_back(
"+strict-align");
829 if (Args.hasArg(options::OPT_ffixed_r9))
830 Features.push_back(
"+reserve-r9");
833 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
834 Features.push_back(
"+no-movt");
836 if (Args.hasArg(options::OPT_mno_neg_immediates))
837 Features.push_back(
"+no-neg-immediates");
840 if (Arg *A = Args.getLastArg(options::OPT_mharden_sls_EQ)) {
841 StringRef
Scope = A->getValue();
842 bool EnableRetBr =
false;
843 bool EnableBlr =
false;
844 bool DisableComdat =
false;
845 if (
Scope !=
"none") {
847 Scope.split(Opts,
",");
848 for (
auto Opt : Opts) {
855 if (Opt ==
"retbr") {
863 if (Opt ==
"comdat") {
864 DisableComdat =
false;
867 if (Opt ==
"nocomdat") {
868 DisableComdat =
true;
871 D.
Diag(diag::err_invalid_sls_hardening)
872 <<
Scope << A->getAsString(Args);
877 if (EnableRetBr || EnableBlr)
879 D.
Diag(diag::err_sls_hardening_arm_not_supported)
880 <<
Scope << A->getAsString(Args);
883 Features.push_back(
"+harden-sls-retbr");
885 Features.push_back(
"+harden-sls-blr");
887 Features.push_back(
"+harden-sls-nocomdat");
891 if (Args.getLastArg(options::OPT_mno_bti_at_return_twice))
892 Features.push_back(
"+no-bti-at-return-twice");
901 MArch = StringRef(MArch).split(
"+").first.lower();
904 if (MArch ==
"native") {
906 if (CPU !=
"generic") {
931 return Triple.getARMCPUForArch(MArch);
936 const llvm::Triple &Triple) {
940 std::string MCPU = StringRef(CPU).split(
"+").first.lower();
942 if (MCPU ==
"native")
956 const llvm::Triple &Triple) {
957 llvm::ARM::ArchKind ArchKind;
958 if (CPU ==
"generic" || CPU.empty()) {
960 ArchKind = llvm::ARM::parseArch(ARMArch);
961 if (ArchKind == llvm::ARM::ArchKind::INVALID)
964 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
968 ArchKind = (Arch ==
"armv7k" || Arch ==
"thumbv7k")
969 ? llvm::ARM::ArchKind::ARMV7K
970 : llvm::ARM::parseCPUArch(CPU);
979 const llvm::Triple &Triple) {
981 if (ArchKind == llvm::ARM::ArchKind::INVALID)
983 return llvm::ARM::getSubArch(ArchKind);
987 const llvm::Triple &Triple) {
988 if (Args.hasArg(options::OPT_r))
994 CmdArgs.push_back(
"--be8");