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)
329 Triple.isGNUEnvironment() ?
"llvm.arm.gnu.eabi.mcount" :
"\01mcount";
331 SoftFloatABI = llvm::is_contained(Opts.FeaturesAsWritten,
"+soft-float-abi");
343 if (Name ==
"apcs-gnu" || Name ==
"aapcs16") {
344 setABIAPCS(Name ==
"aapcs16");
347 if (Name ==
"aapcs" || Name ==
"aapcs-vfp" || Name ==
"aapcs-linux") {
355 llvm::ARM::ArchKind CPUArch = llvm::ARM::parseCPUArch(
Arch);
356 if (CPUArch == llvm::ARM::ArchKind::INVALID)
357 CPUArch = llvm::ARM::parseArch(
getTriple().getArchName());
359 if (CPUArch == llvm::ARM::ArchKind::INVALID)
362 StringRef ArchFeature = llvm::ARM::getArchName(CPUArch);
364 llvm::Triple(ArchFeature,
getTriple().getVendorName(),
367 StringRef SubArch = llvm::ARM::getSubArch(CPUArch);
368 llvm::ARM::ProfileKind Profile = llvm::ARM::parseArchProfile(SubArch);
369 return a.isArmT32() && (Profile == llvm::ARM::ProfileKind::M);
375 StringRef &Err)
const {
376 llvm::ARM::ParsedBranchProtection PBP;
377 if (!llvm::ARM::parseBranchProtection(Spec, PBP, Err,
getTriple()))
384 llvm::StringSwitch<LangOptions::SignReturnAddressScopeKind>(PBP.Scope)
390 if (PBP.Key ==
"b_key")
402 const std::vector<std::string> &FeaturesVec)
const {
404 std::string ArchFeature;
405 std::vector<StringRef> TargetFeatures;
406 llvm::ARM::ArchKind
Arch = llvm::ARM::parseArch(
getTriple().getArchName());
410 llvm::ARM::ArchKind CPUArch = llvm::ARM::parseCPUArch(CPU);
411 if (CPUArch == llvm::ARM::ArchKind::INVALID)
413 if (CPUArch != llvm::ARM::ArchKind::INVALID) {
414 ArchFeature = (
"+" + llvm::ARM::getArchName(CPUArch)).str();
415 TargetFeatures.push_back(ArchFeature);
421 for (llvm::ARM::ArchKind I = llvm::ARM::convertV9toV8(CPUArch);
422 I != llvm::ARM::ArchKind::INVALID; --I)
423 Features[llvm::ARM::getSubArch(I)] =
true;
424 if (CPUArch > llvm::ARM::ArchKind::ARMV8A &&
425 CPUArch <= llvm::ARM::ArchKind::ARMV9_3A)
426 for (llvm::ARM::ArchKind I = CPUArch; I != llvm::ARM::ArchKind::INVALID;
428 Features[llvm::ARM::getSubArch(I)] =
true;
432 llvm::ARM::FPUKind FPUKind = llvm::ARM::getDefaultFPU(CPU,
Arch);
433 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
436 uint64_t Extensions = llvm::ARM::getDefaultExtensions(CPU,
Arch);
437 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
439 for (
auto Feature : TargetFeatures)
441 Features[
Feature.drop_front(1)] =
true;
446 Features[
"thumb-mode"] =
true;
448 Features[
"thumb-mode"] =
false;
452 std::vector<std::string> UpdatedFeaturesVec;
453 for (
const auto &
Feature : FeaturesVec) {
456 if (
Feature ==
"+soft-float-abi")
459 StringRef FixedFeature;
461 FixedFeature =
"-thumb-mode";
463 FixedFeature =
"+thumb-mode";
466 UpdatedFeaturesVec.push_back(FixedFeature.str());
494 FPRegsDisabled =
false;
498 for (
const auto &
Feature : Features) {
499 if (
Feature ==
"+soft-float") {
515 HW_FP |= HW_FP_SP | HW_FP_HP;
518 }
else if (
Feature ==
"+fp-armv8sp" ||
Feature ==
"+fp-armv8d16sp" ||
521 HW_FP |= HW_FP_SP | HW_FP_HP;
524 }
else if (
Feature ==
"+neon") {
527 }
else if (
Feature ==
"+hwdiv") {
529 }
else if (
Feature ==
"+hwdiv-arm") {
531 }
else if (
Feature ==
"+crc") {
533 }
else if (
Feature ==
"+crypto") {
535 }
else if (
Feature ==
"+sha2") {
537 }
else if (
Feature ==
"+aes") {
539 }
else if (
Feature ==
"+dsp") {
541 }
else if (
Feature ==
"+fp64") {
543 }
else if (
Feature ==
"+8msecext") {
544 if (CPUProfile !=
"M" || ArchVersion != 8) {
545 Diags.
Report(diag::err_target_unsupported_mcmse) << CPU;
548 }
else if (
Feature ==
"+strict-align") {
550 }
else if (
Feature ==
"+fp16") {
552 }
else if (
Feature ==
"+fullfp16") {
554 }
else if (
Feature ==
"+dotprod") {
556 }
else if (
Feature ==
"+mve") {
558 }
else if (
Feature ==
"+mve.fp") {
561 MVE |= MVE_INT | MVE_FP;
562 HW_FP |= HW_FP_SP | HW_FP_HP;
563 }
else if (
Feature ==
"+i8mm") {
565 }
else if (
Feature.size() == strlen(
"+cdecp0") &&
Feature >=
"+cdecp0" &&
567 unsigned Coproc =
Feature.back() -
'0';
569 }
else if (
Feature ==
"+bf16") {
571 }
else if (
Feature ==
"-fpregs") {
572 FPRegsDisabled =
true;
573 }
else if (
Feature ==
"+pacbti") {
576 }
else if (
Feature ==
"+fullbf16") {
578 }
else if (
Feature ==
"+execute-only") {
585 switch (ArchVersion) {
587 if (ArchProfile == llvm::ARM::ProfileKind::M)
589 else if (ArchKind == llvm::ARM::ArchKind::ARMV6K ||
590 ArchKind == llvm::ARM::ArchKind::ARMV6KZ)
597 if (ArchProfile == llvm::ARM::ProfileKind::M)
603 assert(ArchProfile != llvm::ARM::ProfileKind::M &&
604 "No Armv9-M architectures defined");
608 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
609 Diags.
Report(diag::err_target_unsupported_fpmath) <<
"neon";
613 if (FPMath == FP_Neon)
614 Features.push_back(
"+neonfp");
615 else if (FPMath == FP_VFP)
616 Features.push_back(
"-neonfp");
622 return llvm::StringSwitch<bool>(
Feature)
624 .Case(
"aarch32",
true)
625 .Case(
"softfloat", SoftFloat)
626 .Case(
"thumb", isThumb())
627 .Case(
"neon", (FPU & NeonFPU) && !SoftFloat)
628 .Case(
"vfp", FPU && !SoftFloat)
629 .Case(
"hwdiv", HWDiv & HWDivThumb)
630 .Case(
"hwdiv-arm", HWDiv & HWDivARM)
631 .Case(
"mve", hasMVE())
641 return Name ==
"generic" ||
642 llvm::ARM::parseCPUArch(Name) != llvm::ARM::ArchKind::INVALID;
646 llvm::ARM::fillValidCPUArchList(Values);
650 if (Name !=
"generic")
651 setArchInfo(llvm::ARM::parseCPUArch(Name));
653 if (ArchKind == llvm::ARM::ArchKind::INVALID)
661 if (Name ==
"neon") {
664 }
else if (Name ==
"vfp" || Name ==
"vfp2" || Name ==
"vfp3" ||
674 Builder.defineMacro(
"__ARM_FEATURE_QRDMX",
"1");
686 Builder.defineMacro(
"__ARM_FEATURE_COMPLEX",
"1");
693 Builder.defineMacro(
"__arm");
694 Builder.defineMacro(
"__arm__");
696 if (
getTriple().getOS() == llvm::Triple::UnknownOS &&
697 (
getTriple().getEnvironment() == llvm::Triple::EABI ||
698 getTriple().getEnvironment() == llvm::Triple::EABIHF) &&
700 Builder.defineMacro(
"_GNU_SOURCE");
704 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
709 Builder.defineMacro(
"__ARM_ARCH_7K__",
"2");
711 if (!CPUAttr.empty())
712 Builder.defineMacro(
"__ARM_ARCH_" + CPUAttr +
"__");
716 Builder.defineMacro(
"__ARM_ARCH", Twine(ArchVersion));
718 if (ArchVersion >= 8) {
723 Builder.defineMacro(
"__ARM_FEATURE_CRYPTO",
"1");
725 Builder.defineMacro(
"__ARM_FEATURE_SHA2",
"1");
727 Builder.defineMacro(
"__ARM_FEATURE_AES",
"1");
730 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
732 Builder.defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
734 Builder.defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
740 if (CPUProfile.empty() || ArchProfile != llvm::ARM::ProfileKind::M)
741 Builder.defineMacro(
"__ARM_ARCH_ISA_ARM",
"1");
747 if (supportsThumb2())
748 Builder.defineMacro(
"__ARM_ARCH_ISA_THUMB",
"2");
749 else if (supportsThumb())
750 Builder.defineMacro(
"__ARM_ARCH_ISA_THUMB",
"1");
754 Builder.defineMacro(
"__ARM_32BIT_STATE",
"1");
759 if (!CPUProfile.empty())
760 Builder.defineMacro(
"__ARM_ARCH_PROFILE",
"'" + CPUProfile +
"'");
764 Builder.defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
768 Builder.defineMacro(
"__ARM_FEATURE_LDREX",
"0x" + Twine::utohexstr(LDREX));
771 if (ArchVersion == 5 || (ArchVersion == 6 && CPUProfile !=
"M") ||
773 Builder.defineMacro(
"__ARM_FEATURE_CLZ",
"1");
777 Builder.defineMacro(
"__ARM_FP",
"0x" + Twine::utohexstr(HW_FP));
780 Builder.defineMacro(
"__ARM_ACLE",
"200");
783 Builder.defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
784 Builder.defineMacro(
"__ARM_FP16_ARGS",
"1");
787 if (ArchVersion >= 7 && (FPU & VFP4FPU))
788 Builder.defineMacro(
"__ARM_FEATURE_FMA",
"1");
795 if (5 <= ArchVersion && ArchVersion <= 8 && !
getTriple().isOSWindows())
796 Builder.defineMacro(
"__THUMB_INTERWORK__");
798 if (ABI ==
"aapcs" || ABI ==
"aapcs-linux" || ABI ==
"aapcs-vfp") {
802 Builder.defineMacro(
"__ARM_EABI__");
803 Builder.defineMacro(
"__ARM_PCS",
"1");
806 if ((!SoftFloat && !SoftFloatABI) || ABI ==
"aapcs-vfp" || ABI ==
"aapcs16")
807 Builder.defineMacro(
"__ARM_PCS_VFP",
"1");
809 if (SoftFloat || (SoftFloatABI && !FPU))
810 Builder.defineMacro(
"__SOFTFP__");
814 Builder.defineMacro(
"__ARM_ROPI",
"1");
816 Builder.defineMacro(
"__ARM_RWPI",
"1");
819 uint64_t FeatureCoprocBF = 0;
823 case llvm::ARM::ArchKind::ARMV4:
824 case llvm::ARM::ArchKind::ARMV4T:
826 FeatureCoprocBF = isThumb() ? 0 : FEATURE_COPROC_B1;
828 case llvm::ARM::ArchKind::ARMV5T:
829 FeatureCoprocBF = isThumb() ? 0 : FEATURE_COPROC_B1 | FEATURE_COPROC_B2;
831 case llvm::ARM::ArchKind::ARMV5TE:
832 case llvm::ARM::ArchKind::ARMV5TEJ:
835 FEATURE_COPROC_B1 | FEATURE_COPROC_B2 | FEATURE_COPROC_B3;
837 case llvm::ARM::ArchKind::ARMV6:
838 case llvm::ARM::ArchKind::ARMV6K:
839 case llvm::ARM::ArchKind::ARMV6KZ:
840 case llvm::ARM::ArchKind::ARMV6T2:
841 if (!isThumb() || ArchKind == llvm::ARM::ArchKind::ARMV6T2)
842 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 |
843 FEATURE_COPROC_B3 | FEATURE_COPROC_B4;
845 case llvm::ARM::ArchKind::ARMV7A:
846 case llvm::ARM::ArchKind::ARMV7R:
847 case llvm::ARM::ArchKind::ARMV7M:
848 case llvm::ARM::ArchKind::ARMV7S:
849 case llvm::ARM::ArchKind::ARMV7EM:
850 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 |
851 FEATURE_COPROC_B3 | FEATURE_COPROC_B4;
853 case llvm::ARM::ArchKind::ARMV8A:
854 case llvm::ARM::ArchKind::ARMV8R:
855 case llvm::ARM::ArchKind::ARMV8_1A:
856 case llvm::ARM::ArchKind::ARMV8_2A:
857 case llvm::ARM::ArchKind::ARMV8_3A:
858 case llvm::ARM::ArchKind::ARMV8_4A:
859 case llvm::ARM::ArchKind::ARMV8_5A:
860 case llvm::ARM::ArchKind::ARMV8_6A:
861 case llvm::ARM::ArchKind::ARMV8_7A:
862 case llvm::ARM::ArchKind::ARMV8_8A:
863 case llvm::ARM::ArchKind::ARMV8_9A:
864 case llvm::ARM::ArchKind::ARMV9A:
865 case llvm::ARM::ArchKind::ARMV9_1A:
866 case llvm::ARM::ArchKind::ARMV9_2A:
867 case llvm::ARM::ArchKind::ARMV9_3A:
868 case llvm::ARM::ArchKind::ARMV9_4A:
869 case llvm::ARM::ArchKind::ARMV9_5A:
870 case llvm::ARM::ArchKind::ARMV9_6A:
871 case llvm::ARM::ArchKind::ARMV9_7A:
873 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B3;
875 case llvm::ARM::ArchKind::ARMV8MMainline:
876 case llvm::ARM::ArchKind::ARMV8_1MMainline:
877 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 |
878 FEATURE_COPROC_B3 | FEATURE_COPROC_B4;
881 Builder.defineMacro(
"__ARM_FEATURE_COPROC",
882 "0x" + Twine::utohexstr(FeatureCoprocBF));
884 if (ArchKind == llvm::ARM::ArchKind::XSCALE)
885 Builder.defineMacro(
"__XSCALE__");
888 Builder.defineMacro(
"__THUMBEL__");
889 Builder.defineMacro(
"__thumb__");
890 if (supportsThumb2())
891 Builder.defineMacro(
"__thumb2__");
895 if ((CPUProfile !=
"M" && ArchVersion >= 6) || (CPUProfile ==
"M" && DSP))
896 Builder.defineMacro(
"__ARM_FEATURE_SIMD32",
"1");
899 if (((HWDiv & HWDivThumb) && isThumb()) ||
900 ((HWDiv & HWDivARM) && !isThumb())) {
901 Builder.defineMacro(
"__ARM_FEATURE_IDIV",
"1");
902 Builder.defineMacro(
"__ARM_ARCH_EXT_IDIV__",
"1");
906 Builder.defineMacro(
"__APCS_32__");
911 Builder.defineMacro(
"__VFP_FP__");
913 if (FPUModeIsVFP((FPUMode)FPU)) {
915 Builder.defineMacro(
"__ARM_VFPV2__");
917 Builder.defineMacro(
"__ARM_VFPV3__");
919 Builder.defineMacro(
"__ARM_VFPV4__");
921 Builder.defineMacro(
"__ARM_FPV5__");
928 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
929 Builder.defineMacro(
"__ARM_NEON",
"1");
930 Builder.defineMacro(
"__ARM_NEON__");
933 Builder.defineMacro(
"__ARM_NEON_FP",
934 "0x" + Twine::utohexstr(HW_FP & ~HW_FP_DP));
938 Builder.defineMacro(
"__ARM_FEATURE_MVE", hasMVEFloat() ?
"3" :
"1");
942 Builder.defineMacro(
"__ARM_FEATURE_CDE",
"1");
943 Builder.defineMacro(
"__ARM_FEATURE_CDE_COPROC",
947 Builder.defineMacro(
"__ARM_SIZEOF_WCHAR_T",
948 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
950 Builder.defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
953 if (ArchVersion == 8 && ArchProfile == llvm::ARM::ProfileKind::M)
954 Builder.defineMacro(
"__ARM_FEATURE_CMSE", Opts.Cmse ?
"3" :
"1");
956 if (ArchVersion >= 6 && CPUAttr !=
"6M" && CPUAttr !=
"8M_BASE") {
957 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
958 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
959 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
960 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
965 Builder.defineMacro(
"__ARM_FEATURE_DSP",
"1");
970 if ((ArchVersion == 6 && CPUProfile !=
"M") || ArchVersion > 6) {
971 Builder.defineMacro(
"__ARM_FEATURE_SAT",
"1");
977 Builder.defineMacro(
"__ARM_FEATURE_QBIT",
"1");
979 if (Opts.UnsafeFPMath)
980 Builder.defineMacro(
"__ARM_FP_FAST",
"1");
984 Builder.defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
988 Builder.defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
992 Builder.defineMacro(
"__ARM_FEATURE_DOTPROD",
"1");
995 Builder.defineMacro(
"__ARM_FEATURE_MATMUL_INT8",
"1");
998 Builder.defineMacro(
"__ARM_FEATURE_PAUTH",
"1");
1001 Builder.defineMacro(
"__ARM_FEATURE_BTI",
"1");
1004 Builder.defineMacro(
"__ARM_FEATURE_BF16",
"1");
1005 Builder.defineMacro(
"__ARM_FEATURE_BF16_VECTOR_ARITHMETIC",
"1");
1006 Builder.defineMacro(
"__ARM_BF16_FORMAT_ALTERNATIVE",
"1");
1009 if (Opts.BranchTargetEnforcement)
1010 Builder.defineMacro(
"__ARM_FEATURE_BTI_DEFAULT",
"1");
1016 Builder.defineMacro(
"__ARM_FEATURE_PAC_DEFAULT", Twine(
Value));
1022 case llvm::ARM::ArchKind::ARMV8_1A:
1025 case llvm::ARM::ArchKind::ARMV8_2A:
1028 case llvm::ARM::ArchKind::ARMV8_3A:
1029 case llvm::ARM::ArchKind::ARMV8_4A:
1030 case llvm::ARM::ArchKind::ARMV8_5A:
1031 case llvm::ARM::ArchKind::ARMV8_6A:
1032 case llvm::ARM::ArchKind::ARMV8_7A:
1033 case llvm::ARM::ArchKind::ARMV8_8A:
1034 case llvm::ARM::ArchKind::ARMV8_9A:
1035 case llvm::ARM::ArchKind::ARMV9A:
1036 case llvm::ARM::ArchKind::ARMV9_1A:
1037 case llvm::ARM::ArchKind::ARMV9_2A:
1038 case llvm::ARM::ArchKind::ARMV9_3A:
1039 case llvm::ARM::ArchKind::ARMV9_4A:
1040 case llvm::ARM::ArchKind::ARMV9_5A:
1041 case llvm::ARM::ArchKind::ARMV9_6A:
1042 case llvm::ARM::ArchKind::ARMV9_7A:
1064#define GET_NEON_BUILTIN_STR_TABLE
1065#include "clang/Basic/arm_neon.inc"
1066#undef GET_NEON_BUILTIN_STR_TABLE
1068static constexpr std::array<Builtin::Info, NumNeonBuiltins>
BuiltinInfos = {
1069#define GET_NEON_BUILTIN_INFOS
1070#include "clang/Basic/arm_neon.inc"
1071#undef GET_NEON_BUILTIN_INFOS
1075#define GET_NEON_BUILTIN_STR_TABLE
1076#include "clang/Basic/arm_fp16.inc"
1077#undef GET_NEON_BUILTIN_STR_TABLE
1079static constexpr std::array<Builtin::Info, NumFp16Builtins>
BuiltinInfos = {
1080#define GET_NEON_BUILTIN_INFOS
1081#include "clang/Basic/arm_fp16.inc"
1082#undef GET_NEON_BUILTIN_INFOS
1090#define GET_MVE_BUILTIN_STR_TABLE
1091#include "clang/Basic/arm_mve_builtins.inc"
1092#undef GET_MVE_BUILTIN_STR_TABLE
1094static constexpr std::array<Builtin::Info, NumMVEBuiltins>
BuiltinInfos = {
1095#define GET_MVE_BUILTIN_INFOS
1096#include "clang/Basic/arm_mve_builtins.inc"
1097#undef GET_MVE_BUILTIN_INFOS
1102#define GET_CDE_BUILTIN_STR_TABLE
1103#include "clang/Basic/arm_cde_builtins.inc"
1104#undef GET_CDE_BUILTIN_STR_TABLE
1106static constexpr std::array<Builtin::Info, NumCDEBuiltins>
BuiltinInfos = {
1107#define GET_CDE_BUILTIN_INFOS
1108#include "clang/Basic/arm_cde_builtins.inc"
1109#undef GET_CDE_BUILTIN_INFOS
1117#define GET_BUILTIN_STR_TABLE
1118#include "clang/Basic/BuiltinsARM.inc"
1119#undef GET_BUILTIN_STR_TABLE
1122#define GET_BUILTIN_INFOS
1123#include "clang/Basic/BuiltinsARM.inc"
1124#undef GET_BUILTIN_INFOS
1128#define GET_BUILTIN_PREFIXED_INFOS
1129#include "clang/Basic/BuiltinsARM.inc"
1130#undef GET_BUILTIN_PREFIXED_INFOS
1139llvm::SmallVector<Builtin::InfosShard>
1145 {&MVE::BuiltinStrings, MVE::BuiltinInfos,
"__builtin_arm_mve_"},
1146 {&CDE::BuiltinStrings, CDE::BuiltinInfos,
"__builtin_arm_cde_"},
1160const char *
const ARMTargetInfo::GCCRegNames[] = {
1162 "r0",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
"r8",
"r9",
"r10",
"r11",
1163 "r12",
"sp",
"lr",
"pc",
1166 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
1167 "s12",
"s13",
"s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
1168 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
1171 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
"d8",
"d9",
"d10",
"d11",
1172 "d12",
"d13",
"d14",
"d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
1173 "d23",
"d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
1176 "q0",
"q1",
"q2",
"q3",
"q4",
"q5",
"q6",
"q7",
"q8",
"q9",
"q10",
"q11",
1177 "q12",
"q13",
"q14",
"q15"};
1184 {{
"a1"},
"r0"}, {{
"a2"},
"r1"}, {{
"a3"},
"r2"}, {{
"a4"},
"r3"},
1185 {{
"v1"},
"r4"}, {{
"v2"},
"r5"}, {{
"v3"},
"r6"}, {{
"v4"},
"r7"},
1186 {{
"v5"},
"r8"}, {{
"v6",
"rfp"},
"r9"}, {{
"sl"},
"r10"}, {{
"fp"},
"r11"},
1187 {{
"ip"},
"r12"}, {{
"r13"},
"sp"}, {{
"r14"},
"lr"}, {{
"r15"},
"pc"},
1221 if (CPUAttr ==
"6T2" || ArchVersion >= 7) {
1228 if (!supportsThumb2())
1240 if (isThumb() && !supportsThumb2())
1247 if (!supportsThumb2())
1262 if (!supportsThumb2())
1274 if (isThumb() && !supportsThumb2())
1285 if (isThumb() && !supportsThumb2()) {
1292 if (isThumb() && !supportsThumb2()) {
1335 switch (*Constraint) {
1338 R = std::string(
"^") + std::string(Constraint, 2);
1342 R = std::string(
"r");
1345 return std::string(1, *Constraint);
1351 StringRef Constraint,
char Modifier,
unsigned Size,
1352 std::string &SuggestedModifier)
const {
1353 bool isOutput = (Constraint[0] ==
'=');
1354 bool isInOut = (Constraint[0] ==
'+');
1357 Constraint = Constraint.ltrim(
"=+&");
1359 switch (Constraint[0]) {
1365 return (isInOut || isOutput || Size <= 64);
1410 Builder.defineMacro(
"__ARMEL__");
1420 Builder.defineMacro(
"__ARMEB__");
1421 Builder.defineMacro(
"__ARM_BIG_ENDIAN");
1433 Builder.defineMacro(
"_M_ARM_NT",
"1");
1434 Builder.defineMacro(
"_M_ARMT",
"_M_ARM");
1435 Builder.defineMacro(
"_M_THUMB",
"_M_ARM");
1437 assert((Triple.getArch() == llvm::Triple::arm ||
1438 Triple.getArch() == llvm::Triple::thumb) &&
1439 "invalid architecture for Windows ARM target info");
1440 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
1441 Builder.defineMacro(
"_M_ARM", Triple.getArchName().substr(Offset));
1445 Builder.defineMacro(
"_M_ARM_FP",
"31");
1477 TheCXXABI.set(TargetCXXABI::GenericARM);
1484 if (Opts.MSVCCompat)
1504 TheCXXABI.set(TargetCXXABI::GenericARM);
1510 Builder.defineMacro(
"_ARM_");
1525 Builder.defineMacro(
"_ARM_");
1526 Builder.defineMacro(
"__CYGWIN__");
1527 Builder.defineMacro(
"__CYGWIN32__");
1530 Builder.defineMacro(
"_GNU_SOURCE");
1538 const llvm::Triple &Triple,
1547 if (Triple.isWatchABI()) {
1549 TheCXXABI.set(TargetCXXABI::WatchOS);
1552 UseSignedCharForObjCBool = false;
1558 const llvm::Triple &Triple,
Defines the Diagnostic-related interfaces.
static constexpr int NumFp16Builtins
static constexpr int NumNeonBuiltins
static constexpr int NumARMBuiltins
static constexpr int NumMVEBuiltins
static constexpr int NumCDEBuiltins
static constexpr Builtin::Info PrefixedBuiltinInfos[]
static constexpr Builtin::Info BuiltinInfos[]
static constexpr unsigned NumBuiltins
Defines enum values for all the target-independent builtin functions.
static StringRef getTriple(const Command &Job)
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.
bool setCPU(StringRef Name) override
Target the specified CPU.
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 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 Builtin::Info BuiltinInfos[]
static constexpr Builtin::Info PrefixedBuiltinInfos[]
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)
Top level wrappers for InstallAPI frontend operations.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
const FunctionProtoType * T
CallingConv
CallingConv - Specifies the calling convention that a function uses.
The info used to represent each builtin.
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