17#include "llvm/ADT/StringRef.h"
18#include "llvm/ADT/StringSwitch.h"
19#include "llvm/TargetParser/ARMTargetParser.h"
24void ARMTargetInfo::setABIAAPCS() {
33 bool IsNetBSD =
T.isOSNetBSD();
34 bool IsOpenBSD =
T.isOSOpenBSD();
35 if (!
T.isOSWindows() && !IsNetBSD && !IsOpenBSD)
47void ARMTargetInfo::setABIAPCS(
bool IsAAPCS16) {
73void ARMTargetInfo::setArchInfo() {
74 StringRef ArchName =
getTriple().getArchName();
76 ArchISA = llvm::ARM::parseArchISA(ArchName);
77 CPU = std::string(llvm::ARM::getDefaultCPU(ArchName));
78 llvm::ARM::ArchKind AK = llvm::ARM::parseArch(ArchName);
79 if (AK != llvm::ARM::ArchKind::INVALID)
81 setArchInfo(ArchKind);
84void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) {
89 SubArch = llvm::ARM::getSubArch(ArchKind);
90 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
91 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
94 CPUAttr = getCPUAttr();
95 CPUProfile = getCPUProfile();
98void ARMTargetInfo::setAtomic() {
99 if (ArchProfile == llvm::ARM::ProfileKind::M) {
103 if (ArchVersion >= 7)
116 if (
getTriple().getOS() == llvm::Triple::Linux || ArchVersion >= 6)
121bool ARMTargetInfo::hasMVE()
const {
122 return ArchKind == llvm::ARM::ArchKind::ARMV8_1MMainline && MVE != 0;
125bool ARMTargetInfo::hasMVEFloat()
const {
126 return hasMVE() && (MVE & MVE_FP);
131bool ARMTargetInfo::isThumb()
const {
132 return ArchISA == llvm::ARM::ISAKind::THUMB;
135bool ARMTargetInfo::supportsThumb()
const {
136 return CPUAttr.count(
'T') || ArchVersion >= 6;
139bool ARMTargetInfo::supportsThumb2()
const {
140 return CPUAttr ==
"6T2" || (ArchVersion >= 7 && CPUAttr !=
"8M_BASE");
143StringRef ARMTargetInfo::getCPUAttr()
const {
148 return llvm::ARM::getCPUAttr(ArchKind);
149 case llvm::ARM::ArchKind::ARMV6M:
151 case llvm::ARM::ArchKind::ARMV7S:
153 case llvm::ARM::ArchKind::ARMV7A:
155 case llvm::ARM::ArchKind::ARMV7R:
157 case llvm::ARM::ArchKind::ARMV7M:
159 case llvm::ARM::ArchKind::ARMV7EM:
161 case llvm::ARM::ArchKind::ARMV7VE:
163 case llvm::ARM::ArchKind::ARMV8A:
165 case llvm::ARM::ArchKind::ARMV8_1A:
167 case llvm::ARM::ArchKind::ARMV8_2A:
169 case llvm::ARM::ArchKind::ARMV8_3A:
171 case llvm::ARM::ArchKind::ARMV8_4A:
173 case llvm::ARM::ArchKind::ARMV8_5A:
175 case llvm::ARM::ArchKind::ARMV8_6A:
177 case llvm::ARM::ArchKind::ARMV8_7A:
179 case llvm::ARM::ArchKind::ARMV8_8A:
181 case llvm::ARM::ArchKind::ARMV8_9A:
183 case llvm::ARM::ArchKind::ARMV9A:
185 case llvm::ARM::ArchKind::ARMV9_1A:
187 case llvm::ARM::ArchKind::ARMV9_2A:
189 case llvm::ARM::ArchKind::ARMV9_3A:
191 case llvm::ARM::ArchKind::ARMV9_4A:
193 case llvm::ARM::ArchKind::ARMV9_5A:
195 case llvm::ARM::ArchKind::ARMV9_6A:
197 case llvm::ARM::ArchKind::ARMV9_7A:
199 case llvm::ARM::ArchKind::ARMV8MBaseline:
201 case llvm::ARM::ArchKind::ARMV8MMainline:
203 case llvm::ARM::ArchKind::ARMV8R:
205 case llvm::ARM::ArchKind::ARMV8_1MMainline:
210StringRef ARMTargetInfo::getCPUProfile()
const {
211 switch (ArchProfile) {
212 case llvm::ARM::ProfileKind::A:
214 case llvm::ARM::ProfileKind::R:
216 case llvm::ARM::ProfileKind::M:
225 :
TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(
true), LDREX(0),
227 bool IsFreeBSD = Triple.isOSFreeBSD();
228 bool IsFuchsia = Triple.isOSFuchsia();
229 bool IsOpenBSD = Triple.isOSOpenBSD();
230 bool IsNetBSD = Triple.isOSNetBSD();
231 bool IsHaiku = Triple.isOSHaiku();
232 bool IsOHOS = Triple.isOHOSFamily();
238 (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD ||
243 SizeType = (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD ||
249 if ((Triple.isOSDarwin() || Triple.isOSBinFormatMachO()) &&
250 !Triple.isWatchABI())
263 if (Triple.isOSBinFormatMachO()) {
266 if (Triple.getEnvironment() == llvm::Triple::EABI ||
267 Triple.getOS() == llvm::Triple::UnknownOS ||
268 ArchProfile == llvm::ARM::ProfileKind::M) {
270 }
else if (Triple.isWatchABI()) {
275 }
else if (Triple.isOSWindows()) {
280 switch (Triple.getEnvironment()) {
281 case llvm::Triple::Android:
282 case llvm::Triple::GNUEABI:
283 case llvm::Triple::GNUEABIT64:
284 case llvm::Triple::GNUEABIHF:
285 case llvm::Triple::GNUEABIHFT64:
286 case llvm::Triple::MuslEABI:
287 case llvm::Triple::MuslEABIHF:
288 case llvm::Triple::OpenHOS:
289 setABI(
"aapcs-linux");
291 case llvm::Triple::EABIHF:
292 case llvm::Triple::EABI:
295 case llvm::Triple::GNU:
301 else if (IsFreeBSD || IsFuchsia || IsOpenBSD || IsHaiku || IsOHOS)
302 setABI(
"aapcs-linux");
310 TheCXXABI.set(TargetCXXABI::GenericARM);
317 if (IsAAPCS && !Triple.isAndroid())
318 DefaultAlignForAttributeAligned = MaxVectorAlign = 64;
324 UseZeroLengthBitfieldAlignment =
true;
326 if (Triple.getOS() == llvm::Triple::Linux ||
327 Triple.getOS() == llvm::Triple::UnknownOS)
328 this->MCountName = Opts.EABIVersion == llvm::EABI::GNU
329 ?
"llvm.arm.gnu.eabi.mcount"
332 SoftFloatABI = llvm::is_contained(Opts.FeaturesAsWritten,
"+soft-float-abi");
344 if (Name ==
"apcs-gnu" || Name ==
"aapcs16") {
345 setABIAPCS(Name ==
"aapcs16");
348 if (Name ==
"aapcs" || Name ==
"aapcs-vfp" || Name ==
"aapcs-linux") {
356 llvm::ARM::ArchKind CPUArch = llvm::ARM::parseCPUArch(
Arch);
357 if (CPUArch == llvm::ARM::ArchKind::INVALID)
358 CPUArch = llvm::ARM::parseArch(
getTriple().getArchName());
360 if (CPUArch == llvm::ARM::ArchKind::INVALID)
363 StringRef ArchFeature = llvm::ARM::getArchName(CPUArch);
365 llvm::Triple(ArchFeature,
getTriple().getVendorName(),
368 StringRef SubArch = llvm::ARM::getSubArch(CPUArch);
369 llvm::ARM::ProfileKind Profile = llvm::ARM::parseArchProfile(SubArch);
370 return a.isArmT32() && (Profile == llvm::ARM::ProfileKind::M);
376 StringRef &Err)
const {
377 llvm::ARM::ParsedBranchProtection PBP;
378 if (!llvm::ARM::parseBranchProtection(Spec, PBP, Err))
385 llvm::StringSwitch<LangOptions::SignReturnAddressScopeKind>(PBP.Scope)
391 if (PBP.Key ==
"b_key")
403 const std::vector<std::string> &FeaturesVec)
const {
405 std::string ArchFeature;
406 std::vector<StringRef> TargetFeatures;
407 llvm::ARM::ArchKind
Arch = llvm::ARM::parseArch(
getTriple().getArchName());
411 llvm::ARM::ArchKind CPUArch = llvm::ARM::parseCPUArch(CPU);
412 if (CPUArch == llvm::ARM::ArchKind::INVALID)
414 if (CPUArch != llvm::ARM::ArchKind::INVALID) {
415 ArchFeature = (
"+" + llvm::ARM::getArchName(CPUArch)).str();
416 TargetFeatures.push_back(ArchFeature);
422 for (llvm::ARM::ArchKind I = llvm::ARM::convertV9toV8(CPUArch);
423 I != llvm::ARM::ArchKind::INVALID; --I)
424 Features[llvm::ARM::getSubArch(I)] =
true;
425 if (CPUArch > llvm::ARM::ArchKind::ARMV8A &&
426 CPUArch <= llvm::ARM::ArchKind::ARMV9_3A)
427 for (llvm::ARM::ArchKind I = CPUArch; I != llvm::ARM::ArchKind::INVALID;
429 Features[llvm::ARM::getSubArch(I)] =
true;
433 llvm::ARM::FPUKind FPUKind = llvm::ARM::getDefaultFPU(CPU,
Arch);
434 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
437 uint64_t Extensions = llvm::ARM::getDefaultExtensions(CPU,
Arch);
438 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
440 for (
auto Feature : TargetFeatures)
442 Features[
Feature.drop_front(1)] =
true;
447 Features[
"thumb-mode"] =
true;
449 Features[
"thumb-mode"] =
false;
453 std::vector<std::string> UpdatedFeaturesVec;
454 for (
const auto &
Feature : FeaturesVec) {
457 if (
Feature ==
"+soft-float-abi")
460 StringRef FixedFeature;
462 FixedFeature =
"-thumb-mode";
464 FixedFeature =
"+thumb-mode";
467 UpdatedFeaturesVec.push_back(FixedFeature.str());
495 FPRegsDisabled =
false;
499 for (
const auto &
Feature : Features) {
500 if (
Feature ==
"+soft-float") {
516 HW_FP |= HW_FP_SP | HW_FP_HP;
519 }
else if (
Feature ==
"+fp-armv8sp" ||
Feature ==
"+fp-armv8d16sp" ||
522 HW_FP |= HW_FP_SP | HW_FP_HP;
525 }
else if (
Feature ==
"+neon") {
528 }
else if (
Feature ==
"+hwdiv") {
530 }
else if (
Feature ==
"+hwdiv-arm") {
532 }
else if (
Feature ==
"+crc") {
534 }
else if (
Feature ==
"+crypto") {
536 }
else if (
Feature ==
"+sha2") {
538 }
else if (
Feature ==
"+aes") {
540 }
else if (
Feature ==
"+dsp") {
542 }
else if (
Feature ==
"+fp64") {
544 }
else if (
Feature ==
"+8msecext") {
545 if (CPUProfile !=
"M" || ArchVersion != 8) {
546 Diags.
Report(diag::err_target_unsupported_mcmse) << CPU;
549 }
else if (
Feature ==
"+strict-align") {
551 }
else if (
Feature ==
"+fp16") {
553 }
else if (
Feature ==
"+fullfp16") {
555 }
else if (
Feature ==
"+dotprod") {
557 }
else if (
Feature ==
"+mve") {
559 }
else if (
Feature ==
"+mve.fp") {
562 MVE |= MVE_INT | MVE_FP;
563 HW_FP |= HW_FP_SP | HW_FP_HP;
564 }
else if (
Feature ==
"+i8mm") {
566 }
else if (
Feature.size() == strlen(
"+cdecp0") &&
Feature >=
"+cdecp0" &&
568 unsigned Coproc =
Feature.back() -
'0';
570 }
else if (
Feature ==
"+bf16") {
572 }
else if (
Feature ==
"-fpregs") {
573 FPRegsDisabled =
true;
574 }
else if (
Feature ==
"+pacbti") {
577 }
else if (
Feature ==
"+fullbf16") {
579 }
else if (
Feature ==
"+execute-only") {
586 switch (ArchVersion) {
588 if (ArchProfile == llvm::ARM::ProfileKind::M)
590 else if (ArchKind == llvm::ARM::ArchKind::ARMV6K ||
591 ArchKind == llvm::ARM::ArchKind::ARMV6KZ)
598 if (ArchProfile == llvm::ARM::ProfileKind::M)
604 assert(ArchProfile != llvm::ARM::ProfileKind::M &&
605 "No Armv9-M architectures defined");
609 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
610 Diags.
Report(diag::err_target_unsupported_fpmath) <<
"neon";
614 if (FPMath == FP_Neon)
615 Features.push_back(
"+neonfp");
616 else if (FPMath == FP_VFP)
617 Features.push_back(
"-neonfp");
623 return llvm::StringSwitch<bool>(
Feature)
625 .Case(
"aarch32",
true)
626 .Case(
"softfloat", SoftFloat)
627 .Case(
"thumb", isThumb())
628 .Case(
"neon", (FPU & NeonFPU) && !SoftFloat)
629 .Case(
"vfp", FPU && !SoftFloat)
630 .Case(
"hwdiv", HWDiv & HWDivThumb)
631 .Case(
"hwdiv-arm", HWDiv & HWDivARM)
632 .Case(
"mve", hasMVE())
642 return Name ==
"generic" ||
643 llvm::ARM::parseCPUArch(Name) != llvm::ARM::ArchKind::INVALID;
647 llvm::ARM::fillValidCPUArchList(Values);
651 if (Name !=
"generic")
652 setArchInfo(llvm::ARM::parseCPUArch(Name));
654 if (ArchKind == llvm::ARM::ArchKind::INVALID)
662 if (Name ==
"neon") {
665 }
else if (Name ==
"vfp" || Name ==
"vfp2" || Name ==
"vfp3" ||
675 Builder.defineMacro(
"__ARM_FEATURE_QRDMX",
"1");
687 Builder.defineMacro(
"__ARM_FEATURE_COMPLEX",
"1");
694 Builder.defineMacro(
"__arm");
695 Builder.defineMacro(
"__arm__");
697 if (
getTriple().getOS() == llvm::Triple::UnknownOS &&
698 (
getTriple().getEnvironment() == llvm::Triple::EABI ||
699 getTriple().getEnvironment() == llvm::Triple::EABIHF) &&
701 Builder.defineMacro(
"_GNU_SOURCE");
705 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
710 Builder.defineMacro(
"__ARM_ARCH_7K__",
"2");
712 if (!CPUAttr.empty())
713 Builder.defineMacro(
"__ARM_ARCH_" + CPUAttr +
"__");
717 Builder.defineMacro(
"__ARM_ARCH", Twine(ArchVersion));
719 if (ArchVersion >= 8) {
724 Builder.defineMacro(
"__ARM_FEATURE_CRYPTO",
"1");
726 Builder.defineMacro(
"__ARM_FEATURE_SHA2",
"1");
728 Builder.defineMacro(
"__ARM_FEATURE_AES",
"1");
731 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
733 Builder.defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
735 Builder.defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
741 if (CPUProfile.empty() || ArchProfile != llvm::ARM::ProfileKind::M)
742 Builder.defineMacro(
"__ARM_ARCH_ISA_ARM",
"1");
748 if (supportsThumb2())
749 Builder.defineMacro(
"__ARM_ARCH_ISA_THUMB",
"2");
750 else if (supportsThumb())
751 Builder.defineMacro(
"__ARM_ARCH_ISA_THUMB",
"1");
755 Builder.defineMacro(
"__ARM_32BIT_STATE",
"1");
760 if (!CPUProfile.empty())
761 Builder.defineMacro(
"__ARM_ARCH_PROFILE",
"'" + CPUProfile +
"'");
765 Builder.defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
769 Builder.defineMacro(
"__ARM_FEATURE_LDREX",
"0x" + Twine::utohexstr(LDREX));
772 if (ArchVersion == 5 || (ArchVersion == 6 && CPUProfile !=
"M") ||
774 Builder.defineMacro(
"__ARM_FEATURE_CLZ",
"1");
778 Builder.defineMacro(
"__ARM_FP",
"0x" + Twine::utohexstr(HW_FP));
781 Builder.defineMacro(
"__ARM_ACLE",
"200");
784 Builder.defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
785 Builder.defineMacro(
"__ARM_FP16_ARGS",
"1");
788 if (ArchVersion >= 7 && (FPU & VFP4FPU))
789 Builder.defineMacro(
"__ARM_FEATURE_FMA",
"1");
796 if (5 <= ArchVersion && ArchVersion <= 8 && !
getTriple().isOSWindows())
797 Builder.defineMacro(
"__THUMB_INTERWORK__");
799 if (ABI ==
"aapcs" || ABI ==
"aapcs-linux" || ABI ==
"aapcs-vfp") {
803 Builder.defineMacro(
"__ARM_EABI__");
804 Builder.defineMacro(
"__ARM_PCS",
"1");
807 if ((!SoftFloat && !SoftFloatABI) || ABI ==
"aapcs-vfp" || ABI ==
"aapcs16")
808 Builder.defineMacro(
"__ARM_PCS_VFP",
"1");
810 if (SoftFloat || (SoftFloatABI && !FPU))
811 Builder.defineMacro(
"__SOFTFP__");
815 Builder.defineMacro(
"__ARM_ROPI",
"1");
817 Builder.defineMacro(
"__ARM_RWPI",
"1");
820 uint64_t FeatureCoprocBF = 0;
824 case llvm::ARM::ArchKind::ARMV4:
825 case llvm::ARM::ArchKind::ARMV4T:
827 FeatureCoprocBF = isThumb() ? 0 : FEATURE_COPROC_B1;
829 case llvm::ARM::ArchKind::ARMV5T:
830 FeatureCoprocBF = isThumb() ? 0 : FEATURE_COPROC_B1 | FEATURE_COPROC_B2;
832 case llvm::ARM::ArchKind::ARMV5TE:
833 case llvm::ARM::ArchKind::ARMV5TEJ:
836 FEATURE_COPROC_B1 | FEATURE_COPROC_B2 | FEATURE_COPROC_B3;
838 case llvm::ARM::ArchKind::ARMV6:
839 case llvm::ARM::ArchKind::ARMV6K:
840 case llvm::ARM::ArchKind::ARMV6KZ:
841 case llvm::ARM::ArchKind::ARMV6T2:
842 if (!isThumb() || ArchKind == llvm::ARM::ArchKind::ARMV6T2)
843 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 |
844 FEATURE_COPROC_B3 | FEATURE_COPROC_B4;
846 case llvm::ARM::ArchKind::ARMV7A:
847 case llvm::ARM::ArchKind::ARMV7R:
848 case llvm::ARM::ArchKind::ARMV7M:
849 case llvm::ARM::ArchKind::ARMV7S:
850 case llvm::ARM::ArchKind::ARMV7EM:
851 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 |
852 FEATURE_COPROC_B3 | FEATURE_COPROC_B4;
854 case llvm::ARM::ArchKind::ARMV8A:
855 case llvm::ARM::ArchKind::ARMV8R:
856 case llvm::ARM::ArchKind::ARMV8_1A:
857 case llvm::ARM::ArchKind::ARMV8_2A:
858 case llvm::ARM::ArchKind::ARMV8_3A:
859 case llvm::ARM::ArchKind::ARMV8_4A:
860 case llvm::ARM::ArchKind::ARMV8_5A:
861 case llvm::ARM::ArchKind::ARMV8_6A:
862 case llvm::ARM::ArchKind::ARMV8_7A:
863 case llvm::ARM::ArchKind::ARMV8_8A:
864 case llvm::ARM::ArchKind::ARMV8_9A:
865 case llvm::ARM::ArchKind::ARMV9A:
866 case llvm::ARM::ArchKind::ARMV9_1A:
867 case llvm::ARM::ArchKind::ARMV9_2A:
868 case llvm::ARM::ArchKind::ARMV9_3A:
869 case llvm::ARM::ArchKind::ARMV9_4A:
870 case llvm::ARM::ArchKind::ARMV9_5A:
871 case llvm::ARM::ArchKind::ARMV9_6A:
872 case llvm::ARM::ArchKind::ARMV9_7A:
874 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B3;
876 case llvm::ARM::ArchKind::ARMV8MMainline:
877 case llvm::ARM::ArchKind::ARMV8_1MMainline:
878 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 |
879 FEATURE_COPROC_B3 | FEATURE_COPROC_B4;
882 Builder.defineMacro(
"__ARM_FEATURE_COPROC",
883 "0x" + Twine::utohexstr(FeatureCoprocBF));
885 if (ArchKind == llvm::ARM::ArchKind::XSCALE)
886 Builder.defineMacro(
"__XSCALE__");
889 Builder.defineMacro(
"__THUMBEL__");
890 Builder.defineMacro(
"__thumb__");
891 if (supportsThumb2())
892 Builder.defineMacro(
"__thumb2__");
896 if ((CPUProfile !=
"M" && ArchVersion >= 6) || (CPUProfile ==
"M" && DSP))
897 Builder.defineMacro(
"__ARM_FEATURE_SIMD32",
"1");
900 if (((HWDiv & HWDivThumb) && isThumb()) ||
901 ((HWDiv & HWDivARM) && !isThumb())) {
902 Builder.defineMacro(
"__ARM_FEATURE_IDIV",
"1");
903 Builder.defineMacro(
"__ARM_ARCH_EXT_IDIV__",
"1");
907 Builder.defineMacro(
"__APCS_32__");
912 Builder.defineMacro(
"__VFP_FP__");
914 if (FPUModeIsVFP((FPUMode)FPU)) {
916 Builder.defineMacro(
"__ARM_VFPV2__");
918 Builder.defineMacro(
"__ARM_VFPV3__");
920 Builder.defineMacro(
"__ARM_VFPV4__");
922 Builder.defineMacro(
"__ARM_FPV5__");
929 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
930 Builder.defineMacro(
"__ARM_NEON",
"1");
931 Builder.defineMacro(
"__ARM_NEON__");
934 Builder.defineMacro(
"__ARM_NEON_FP",
935 "0x" + Twine::utohexstr(HW_FP & ~HW_FP_DP));
939 Builder.defineMacro(
"__ARM_FEATURE_MVE", hasMVEFloat() ?
"3" :
"1");
943 Builder.defineMacro(
"__ARM_FEATURE_CDE",
"1");
944 Builder.defineMacro(
"__ARM_FEATURE_CDE_COPROC",
948 Builder.defineMacro(
"__ARM_SIZEOF_WCHAR_T",
949 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
951 Builder.defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
954 if (ArchVersion == 8 && ArchProfile == llvm::ARM::ProfileKind::M)
955 Builder.defineMacro(
"__ARM_FEATURE_CMSE", Opts.Cmse ?
"3" :
"1");
957 if (ArchVersion >= 6 && CPUAttr !=
"6M" && CPUAttr !=
"8M_BASE") {
958 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
959 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
960 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
961 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
966 Builder.defineMacro(
"__ARM_FEATURE_DSP",
"1");
971 if ((ArchVersion == 6 && CPUProfile !=
"M") || ArchVersion > 6) {
972 Builder.defineMacro(
"__ARM_FEATURE_SAT",
"1");
978 Builder.defineMacro(
"__ARM_FEATURE_QBIT",
"1");
980 if (Opts.UnsafeFPMath)
981 Builder.defineMacro(
"__ARM_FP_FAST",
"1");
985 Builder.defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
989 Builder.defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
993 Builder.defineMacro(
"__ARM_FEATURE_DOTPROD",
"1");
996 Builder.defineMacro(
"__ARM_FEATURE_MATMUL_INT8",
"1");
999 Builder.defineMacro(
"__ARM_FEATURE_PAUTH",
"1");
1002 Builder.defineMacro(
"__ARM_FEATURE_BTI",
"1");
1005 Builder.defineMacro(
"__ARM_FEATURE_BF16",
"1");
1006 Builder.defineMacro(
"__ARM_FEATURE_BF16_VECTOR_ARITHMETIC",
"1");
1007 Builder.defineMacro(
"__ARM_BF16_FORMAT_ALTERNATIVE",
"1");
1010 if (Opts.BranchTargetEnforcement)
1011 Builder.defineMacro(
"__ARM_FEATURE_BTI_DEFAULT",
"1");
1017 Builder.defineMacro(
"__ARM_FEATURE_PAC_DEFAULT", Twine(
Value));
1023 case llvm::ARM::ArchKind::ARMV8_1A:
1026 case llvm::ARM::ArchKind::ARMV8_2A:
1029 case llvm::ARM::ArchKind::ARMV8_3A:
1030 case llvm::ARM::ArchKind::ARMV8_4A:
1031 case llvm::ARM::ArchKind::ARMV8_5A:
1032 case llvm::ARM::ArchKind::ARMV8_6A:
1033 case llvm::ARM::ArchKind::ARMV8_7A:
1034 case llvm::ARM::ArchKind::ARMV8_8A:
1035 case llvm::ARM::ArchKind::ARMV8_9A:
1036 case llvm::ARM::ArchKind::ARMV9A:
1037 case llvm::ARM::ArchKind::ARMV9_1A:
1038 case llvm::ARM::ArchKind::ARMV9_2A:
1039 case llvm::ARM::ArchKind::ARMV9_3A:
1040 case llvm::ARM::ArchKind::ARMV9_4A:
1041 case llvm::ARM::ArchKind::ARMV9_5A:
1042 case llvm::ARM::ArchKind::ARMV9_6A:
1043 case llvm::ARM::ArchKind::ARMV9_7A:
1065#define GET_NEON_BUILTIN_STR_TABLE
1066#include "clang/Basic/arm_neon.inc"
1067#undef GET_NEON_BUILTIN_STR_TABLE
1069static constexpr std::array<Builtin::Info, NumNeonBuiltins>
BuiltinInfos = {
1070#define GET_NEON_BUILTIN_INFOS
1071#include "clang/Basic/arm_neon.inc"
1072#undef GET_NEON_BUILTIN_INFOS
1076#define GET_NEON_BUILTIN_STR_TABLE
1077#include "clang/Basic/arm_fp16.inc"
1078#undef GET_NEON_BUILTIN_STR_TABLE
1080static constexpr std::array<Builtin::Info, NumFp16Builtins>
BuiltinInfos = {
1081#define GET_NEON_BUILTIN_INFOS
1082#include "clang/Basic/arm_fp16.inc"
1083#undef GET_NEON_BUILTIN_INFOS
1091#define GET_MVE_BUILTIN_STR_TABLE
1092#include "clang/Basic/arm_mve_builtins.inc"
1093#undef GET_MVE_BUILTIN_STR_TABLE
1095static constexpr std::array<Builtin::Info, NumMVEBuiltins>
BuiltinInfos = {
1096#define GET_MVE_BUILTIN_INFOS
1097#include "clang/Basic/arm_mve_builtins.inc"
1098#undef GET_MVE_BUILTIN_INFOS
1103#define GET_CDE_BUILTIN_STR_TABLE
1104#include "clang/Basic/arm_cde_builtins.inc"
1105#undef GET_CDE_BUILTIN_STR_TABLE
1107static constexpr std::array<Builtin::Info, NumCDEBuiltins>
BuiltinInfos = {
1108#define GET_CDE_BUILTIN_INFOS
1109#include "clang/Basic/arm_cde_builtins.inc"
1110#undef GET_CDE_BUILTIN_INFOS
1117#define BUILTIN CLANG_BUILTIN_STR_TABLE
1118#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
1119#define TARGET_HEADER_BUILTIN CLANG_TARGET_HEADER_BUILTIN_STR_TABLE
1120#include "clang/Basic/BuiltinsARM.def"
1124#define BUILTIN CLANG_BUILTIN_ENTRY
1125#define LANGBUILTIN CLANG_LANGBUILTIN_ENTRY
1126#define LIBBUILTIN CLANG_LIBBUILTIN_ENTRY
1127#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
1128#define TARGET_HEADER_BUILTIN CLANG_TARGET_HEADER_BUILTIN_ENTRY
1129#include "clang/Basic/BuiltinsARM.def"
1132llvm::SmallVector<Builtin::InfosShard>
1138 {&MVE::BuiltinStrings, MVE::BuiltinInfos,
"__builtin_arm_mve_"},
1139 {&CDE::BuiltinStrings, CDE::BuiltinInfos,
"__builtin_arm_cde_"},
1152const char *
const ARMTargetInfo::GCCRegNames[] = {
1154 "r0",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
"r8",
"r9",
"r10",
"r11",
1155 "r12",
"sp",
"lr",
"pc",
1158 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
1159 "s12",
"s13",
"s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
1160 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
1163 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
"d8",
"d9",
"d10",
"d11",
1164 "d12",
"d13",
"d14",
"d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
1165 "d23",
"d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
1168 "q0",
"q1",
"q2",
"q3",
"q4",
"q5",
"q6",
"q7",
"q8",
"q9",
"q10",
"q11",
1169 "q12",
"q13",
"q14",
"q15"};
1176 {{
"a1"},
"r0"}, {{
"a2"},
"r1"}, {{
"a3"},
"r2"}, {{
"a4"},
"r3"},
1177 {{
"v1"},
"r4"}, {{
"v2"},
"r5"}, {{
"v3"},
"r6"}, {{
"v4"},
"r7"},
1178 {{
"v5"},
"r8"}, {{
"v6",
"rfp"},
"r9"}, {{
"sl"},
"r10"}, {{
"fp"},
"r11"},
1179 {{
"ip"},
"r12"}, {{
"r13"},
"sp"}, {{
"r14"},
"lr"}, {{
"r15"},
"pc"},
1213 if (CPUAttr ==
"6T2" || ArchVersion >= 7) {
1220 if (!supportsThumb2())
1232 if (isThumb() && !supportsThumb2())
1239 if (!supportsThumb2())
1254 if (!supportsThumb2())
1266 if (isThumb() && !supportsThumb2())
1277 if (isThumb() && !supportsThumb2()) {
1284 if (isThumb() && !supportsThumb2()) {
1327 switch (*Constraint) {
1330 R = std::string(
"^") + std::string(Constraint, 2);
1334 R = std::string(
"r");
1337 return std::string(1, *Constraint);
1343 StringRef Constraint,
char Modifier,
unsigned Size,
1344 std::string &SuggestedModifier)
const {
1345 bool isOutput = (Constraint[0] ==
'=');
1346 bool isInOut = (Constraint[0] ==
'+');
1349 Constraint = Constraint.ltrim(
"=+&");
1351 switch (Constraint[0]) {
1357 return (isInOut || isOutput || Size <= 64);
1402 Builder.defineMacro(
"__ARMEL__");
1412 Builder.defineMacro(
"__ARMEB__");
1413 Builder.defineMacro(
"__ARM_BIG_ENDIAN");
1425 Builder.defineMacro(
"_M_ARM_NT",
"1");
1426 Builder.defineMacro(
"_M_ARMT",
"_M_ARM");
1427 Builder.defineMacro(
"_M_THUMB",
"_M_ARM");
1429 assert((Triple.getArch() == llvm::Triple::arm ||
1430 Triple.getArch() == llvm::Triple::thumb) &&
1431 "invalid architecture for Windows ARM target info");
1432 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
1433 Builder.defineMacro(
"_M_ARM", Triple.getArchName().substr(Offset));
1437 Builder.defineMacro(
"_M_ARM_FP",
"31");
1469 TheCXXABI.set(TargetCXXABI::GenericARM);
1476 if (Opts.MSVCCompat)
1496 TheCXXABI.set(TargetCXXABI::GenericARM);
1502 Builder.defineMacro(
"_ARM_");
1517 Builder.defineMacro(
"_ARM_");
1518 Builder.defineMacro(
"__CYGWIN__");
1519 Builder.defineMacro(
"__CYGWIN32__");
1522 Builder.defineMacro(
"_GNU_SOURCE");
1530 const llvm::Triple &Triple,
1539 if (Triple.isWatchABI()) {
1541 TheCXXABI.set(TargetCXXABI::WatchOS);
1544 UseSignedCharForObjCBool = false;
1550 const llvm::Triple &Triple,
Defines the Diagnostic-related interfaces.
static constexpr int NumFp16Builtins
static constexpr int NumNeonBuiltins
static constexpr llvm::StringTable BuiltinStrings
static constexpr int NumARMBuiltins
static constexpr int NumMVEBuiltins
static constexpr int NumCDEBuiltins
static constexpr Builtin::Info BuiltinInfos[]
static constexpr unsigned NumBuiltins
Defines enum values for all the target-independent builtin functions.
#define CLANG_BUILTIN_STR_TABLE_START
Enumerates target-specific builtins in their own namespaces within namespace clang.
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
@ None
No signing for any function.
@ NonLeaf
Sign the return address of functions that spill LR.
@ All
Sign the return address of all functions,.
@ AKey
Return address signing uses APIA key.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool hasSignReturnAddress() const
Check if return address signing is enabled.
bool isSignReturnAddressScopeAll() const
Check if leaf functions are also signed.
LangOptions::SignReturnAddressScopeKind SignReturnAddr
LangOptions::SignReturnAddressKeyKind SignKey
bool BranchProtectionPAuthLR
bool BranchTargetEnforcement
TargetInfo(const llvm::Triple &T)
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
BuiltinVaListKind
The different kinds of __builtin_va_list types defined by the target implementation.
@ AAPCSABIBuiltinVaList
__builtin_va_list as defined by ARM AAPCS ABI http://infocenter.arm.com
@ CharPtrBuiltinVaList
typedef char* __builtin_va_list;
@ VoidPtrBuiltinVaList
typedef void* __builtin_va_list;
@ ARM_LDREX_W
half (16-bit)
@ ARM_LDREX_H
byte (8-bit)
@ ARM_LDREX_D
word (32-bit)
VersionTuple PlatformMinVersion
virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const =0
===-— Other target property query methods -----------------------—===//
unsigned HasUnalignedAccess
unsigned char MaxAtomicPromoteWidth
uint32_t getARMCDECoprocMask() const
For ARM targets returns a mask defining which coprocessors are configured as Custom Datapath.
void resetDataLayout()
Set the data layout based on current triple and ABI.
unsigned HasAlignMac68kSupport
virtual bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const
Initialize the map with the default set of target features for the CPU this should include all legal ...
unsigned char MaxAtomicInlineWidth
unsigned ARMCDECoprocMask
Options for controlling the target.
std::string_view getClobbers() const override
Returns a string of target-specific clobbers, in LLVM format.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
llvm::SmallVector< Builtin::InfosShard > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
void getTargetDefinesARMV83A(const LangOptions &Opts, MacroBuilder &Builder) const
bool isValidCPUName(StringRef Name) const override
Determine whether this TargetInfo supports the given CPU name.
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeaturesVec) const override
Initialize the map with the default set of target features for the CPU this should include all legal ...
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
Perform initialization based on the user configured set of features (e.g., +sse4).
bool setABI(const std::string &Name) override
Use the specified ABI.
StringRef getABI() const override
Get the ABI currently in use.
bool setCPU(const std::string &Name) override
Target the specified CPU.
bool hasFeature(StringRef Feature) const override
Determine whether the given target has the given feature.
bool validateBranchProtection(StringRef Spec, StringRef Arch, BranchProtectionInfo &BPI, const LangOptions &LO, StringRef &Err) const override
Determine if this TargetInfo supports the given branch protection specification.
void getTargetDefinesARMV81A(const LangOptions &Opts, MacroBuilder &Builder) const
bool validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size, std::string &SuggestedModifier) const override
ArrayRef< const char * > getGCCRegNames() const override
bool setFPMath(StringRef Name) override
Use the specified unit for FP math.
std::string convertConstraint(const char *&Constraint) const override
bool validateAsmConstraint(const char *&Name, TargetInfo::ConstraintInfo &Info) const override
void getTargetDefinesARMV82A(const LangOptions &Opts, MacroBuilder &Builder) const
ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
bool hasSjLjLowering() const override
Controls if __builtin_longjmp / __builtin_setjmp can be lowered to llvm.eh.sjlj.longjmp / llvm....
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
int getEHDataRegisterNumber(unsigned RegNo) const override
Return the register number that __builtin_eh_return_regno would return with the specified argument.
bool hasBFloat16Type() const override
Determine whether the _BFloat16 type is supported on this target.
bool isCLZForZeroUndef() const override
The __builtin_clz* and __builtin_ctz* built-in functions are specified to have undefined results for ...
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
bool isBranchProtectionSupportedArch(StringRef Arch) const override
Determine if the Architecture in this TargetInfo supports branch protection.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
AppleMachOARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
AppleMachOTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
MicrosoftARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
void getVisualStudioDefines(const LangOptions &Opts, MacroBuilder &Builder) const
WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
static constexpr std::array< Info, N > MakeInfos(std::array< Info, N > Infos)
A constexpr function to construct an infos array from X-macros.
static constexpr std::array< Builtin::Info, NumFp16Builtins > BuiltinInfos
static constexpr std::array< Builtin::Info, NumNeonBuiltins > BuiltinInfos
void getAppleMachODefines(MacroBuilder &Builder, const LangOptions &Opts, const llvm::Triple &Triple)
LLVM_LIBRARY_VISIBILITY void DefineStd(clang::MacroBuilder &Builder, llvm::StringRef MacroName, const clang::LangOptions &Opts)
Define a macro name and standard variants.
void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts, const llvm::Triple &Triple, StringRef &PlatformName, VersionTuple &PlatformMinVersion)
The JSON file list parser is used to communicate input to InstallAPI.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
const FunctionProtoType * T
CallingConv
CallingConv - Specifies the calling convention that a function uses.
void setRequiresImmediate(int Min, int Max)
unsigned short SuitableAlign
unsigned ZeroLengthBitfieldBoundary
If non-zero, specifies a fixed alignment value for bitfields that follow zero length bitfield,...
unsigned char LongLongAlign
unsigned UseBitFieldTypeAlignment
Control whether the alignment of bit-field types is respected when laying out structures.
unsigned char BFloat16Width
unsigned char LongDoubleAlign
unsigned char BFloat16Align
unsigned char DoubleAlign
const llvm::fltSemantics * BFloat16Format