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::ARMV9_8A:
201 case llvm::ARM::ArchKind::ARMV8MBaseline:
203 case llvm::ARM::ArchKind::ARMV8MMainline:
205 case llvm::ARM::ArchKind::ARMV8R:
207 case llvm::ARM::ArchKind::ARMV8_1MMainline:
212StringRef ARMTargetInfo::getCPUProfile()
const {
213 switch (ArchProfile) {
214 case llvm::ARM::ProfileKind::A:
216 case llvm::ARM::ProfileKind::R:
218 case llvm::ARM::ProfileKind::M:
227 :
TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(
true), LDREX(0),
229 bool IsFreeBSD = Triple.isOSFreeBSD();
230 bool IsFuchsia = Triple.isOSFuchsia();
231 bool IsOpenBSD = Triple.isOSOpenBSD();
232 bool IsNetBSD = Triple.isOSNetBSD();
233 bool IsHaiku = Triple.isOSHaiku();
234 bool IsOHOS = Triple.isOHOSFamily();
240 (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD ||
245 SizeType = (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD ||
251 if ((Triple.isOSDarwin() || Triple.isOSBinFormatMachO()) &&
252 !Triple.isWatchABI())
265 if (Triple.isOSBinFormatMachO()) {
268 if (Triple.getEnvironment() == llvm::Triple::EABI ||
269 Triple.getOS() == llvm::Triple::UnknownOS ||
270 ArchProfile == llvm::ARM::ProfileKind::M) {
272 }
else if (Triple.isWatchABI()) {
277 }
else if (Triple.isOSWindows()) {
282 switch (Triple.getEnvironment()) {
283 case llvm::Triple::Android:
284 case llvm::Triple::GNUEABI:
285 case llvm::Triple::GNUEABIT64:
286 case llvm::Triple::GNUEABIHF:
287 case llvm::Triple::GNUEABIHFT64:
288 case llvm::Triple::MuslEABI:
289 case llvm::Triple::MuslEABIHF:
290 case llvm::Triple::OpenHOS:
291 setABI(
"aapcs-linux");
293 case llvm::Triple::EABIHF:
294 case llvm::Triple::EABI:
297 case llvm::Triple::GNU:
303 else if (IsFreeBSD || IsFuchsia || IsOpenBSD || IsHaiku || IsOHOS)
304 setABI(
"aapcs-linux");
312 TheCXXABI.set(TargetCXXABI::GenericARM);
319 if (IsAAPCS && !Triple.isAndroid())
320 DefaultAlignForAttributeAligned = MaxVectorAlign = 64;
326 UseZeroLengthBitfieldAlignment =
true;
328 if (Triple.getOS() == llvm::Triple::Linux ||
329 Triple.getOS() == llvm::Triple::UnknownOS)
331 Triple.isGNUEnvironment() ?
"llvm.arm.gnu.eabi.mcount" :
"\01mcount";
333 SoftFloatABI = llvm::is_contained(Opts.FeaturesAsWritten,
"+soft-float-abi");
345 if (Name ==
"apcs-gnu" || Name ==
"aapcs16") {
346 setABIAPCS(Name ==
"aapcs16");
349 if (Name ==
"aapcs" || Name ==
"aapcs-vfp" || Name ==
"aapcs-linux") {
357 llvm::ARM::ArchKind CPUArch = llvm::ARM::parseCPUArch(
Arch);
358 if (CPUArch == llvm::ARM::ArchKind::INVALID)
359 CPUArch = llvm::ARM::parseArch(
getTriple().getArchName());
361 if (CPUArch == llvm::ARM::ArchKind::INVALID)
364 StringRef ArchFeature = llvm::ARM::getArchName(CPUArch);
366 llvm::Triple(ArchFeature,
getTriple().getVendorName(),
369 StringRef SubArch = llvm::ARM::getSubArch(CPUArch);
370 llvm::ARM::ProfileKind Profile = llvm::ARM::parseArchProfile(SubArch);
371 return a.isArmT32() && (Profile == llvm::ARM::ProfileKind::M);
377 StringRef &Err)
const {
378 llvm::ARM::ParsedBranchProtection PBP;
379 if (!llvm::ARM::parseBranchProtection(
Attr.BranchProtection, PBP, Err,
388 llvm::StringSwitch<LangOptions::SignReturnAddressScopeKind>(PBP.Scope)
394 if (PBP.Key ==
"b_key")
406 const std::vector<std::string> &FeaturesVec)
const {
408 std::string ArchFeature;
409 std::vector<StringRef> TargetFeatures;
410 llvm::ARM::ArchKind
Arch = llvm::ARM::parseArch(
getTriple().getArchName());
414 llvm::ARM::ArchKind CPUArch = llvm::ARM::parseCPUArch(CPU);
415 if (CPUArch == llvm::ARM::ArchKind::INVALID)
417 if (CPUArch != llvm::ARM::ArchKind::INVALID) {
418 ArchFeature = (
"+" + llvm::ARM::getArchName(CPUArch)).str();
419 TargetFeatures.push_back(ArchFeature);
425 for (llvm::ARM::ArchKind I = llvm::ARM::convertV9toV8(CPUArch);
426 I != llvm::ARM::ArchKind::INVALID; --I)
427 Features[llvm::ARM::getSubArch(I)] =
true;
428 if (CPUArch > llvm::ARM::ArchKind::ARMV8A &&
429 CPUArch <= llvm::ARM::ArchKind::ARMV9_3A)
430 for (llvm::ARM::ArchKind I = CPUArch; I != llvm::ARM::ArchKind::INVALID;
432 Features[llvm::ARM::getSubArch(I)] =
true;
436 llvm::ARM::FPUKind FPUKind = llvm::ARM::getDefaultFPU(CPU,
Arch);
437 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
440 uint64_t Extensions = llvm::ARM::getDefaultExtensions(CPU,
Arch);
441 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
443 for (
auto Feature : TargetFeatures)
445 Features[
Feature.drop_front(1)] =
true;
450 Features[
"thumb-mode"] =
true;
452 Features[
"thumb-mode"] =
false;
456 std::vector<std::string> UpdatedFeaturesVec;
457 for (
const auto &
Feature : FeaturesVec) {
460 if (
Feature ==
"+soft-float-abi")
463 StringRef FixedFeature;
465 FixedFeature =
"-thumb-mode";
467 FixedFeature =
"+thumb-mode";
470 UpdatedFeaturesVec.push_back(FixedFeature.str());
498 FPRegsDisabled =
false;
502 for (
const auto &
Feature : Features) {
503 if (
Feature ==
"+soft-float") {
519 HW_FP |= HW_FP_SP | HW_FP_HP;
522 }
else if (
Feature ==
"+fp-armv8sp" ||
Feature ==
"+fp-armv8d16sp" ||
525 HW_FP |= HW_FP_SP | HW_FP_HP;
528 }
else if (
Feature ==
"+neon") {
531 }
else if (
Feature ==
"+hwdiv") {
533 }
else if (
Feature ==
"+hwdiv-arm") {
535 }
else if (
Feature ==
"+crc") {
537 }
else if (
Feature ==
"+crypto") {
539 }
else if (
Feature ==
"+sha2") {
541 }
else if (
Feature ==
"+aes") {
543 }
else if (
Feature ==
"+dsp") {
545 }
else if (
Feature ==
"+fp64") {
547 }
else if (
Feature ==
"+8msecext") {
548 if (CPUProfile !=
"M" || ArchVersion != 8) {
549 Diags.
Report(diag::err_target_unsupported_mcmse) << CPU;
552 }
else if (
Feature ==
"+strict-align") {
554 }
else if (
Feature ==
"+fp16") {
556 }
else if (
Feature ==
"+fullfp16") {
558 }
else if (
Feature ==
"+dotprod") {
560 }
else if (
Feature ==
"+mve") {
562 }
else if (
Feature ==
"+mve.fp") {
565 MVE |= MVE_INT | MVE_FP;
566 HW_FP |= HW_FP_SP | HW_FP_HP;
567 }
else if (
Feature ==
"+i8mm") {
569 }
else if (
Feature.size() == strlen(
"+cdecp0") &&
Feature >=
"+cdecp0" &&
571 unsigned Coproc =
Feature.back() -
'0';
573 }
else if (
Feature ==
"+bf16") {
575 }
else if (
Feature ==
"-fpregs") {
576 FPRegsDisabled =
true;
577 }
else if (
Feature ==
"+pacbti") {
580 }
else if (
Feature ==
"+fullbf16") {
582 }
else if (
Feature ==
"+execute-only") {
589 switch (ArchVersion) {
591 if (ArchProfile == llvm::ARM::ProfileKind::M)
593 else if (ArchKind == llvm::ARM::ArchKind::ARMV6K ||
594 ArchKind == llvm::ARM::ArchKind::ARMV6KZ)
601 if (ArchProfile == llvm::ARM::ProfileKind::M)
607 assert(ArchProfile != llvm::ARM::ProfileKind::M &&
608 "No Armv9-M architectures defined");
612 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
613 Diags.
Report(diag::err_target_unsupported_fpmath) <<
"neon";
617 if (FPMath == FP_Neon)
618 Features.push_back(
"+neonfp");
619 else if (FPMath == FP_VFP)
620 Features.push_back(
"-neonfp");
626 return llvm::StringSwitch<bool>(
Feature)
628 .Case(
"aarch32",
true)
629 .Case(
"softfloat", SoftFloat)
630 .Case(
"thumb", isThumb())
631 .Case(
"neon", (FPU & NeonFPU) && !SoftFloat)
632 .Case(
"vfp", FPU && !SoftFloat)
633 .Case(
"hwdiv", HWDiv & HWDivThumb)
634 .Case(
"hwdiv-arm", HWDiv & HWDivARM)
635 .Case(
"mve", hasMVE())
645 return Name ==
"generic" ||
646 llvm::ARM::parseCPUArch(Name) != llvm::ARM::ArchKind::INVALID;
650 llvm::ARM::fillValidCPUArchList(Values);
654 if (Name !=
"generic")
655 setArchInfo(llvm::ARM::parseCPUArch(Name));
657 if (ArchKind == llvm::ARM::ArchKind::INVALID)
665 if (Name ==
"neon") {
668 }
else if (Name ==
"vfp" || Name ==
"vfp2" || Name ==
"vfp3" ||
678 Builder.defineMacro(
"__ARM_FEATURE_QRDMX",
"1");
690 Builder.defineMacro(
"__ARM_FEATURE_COMPLEX",
"1");
697 Builder.defineMacro(
"__arm");
698 Builder.defineMacro(
"__arm__");
700 if (
getTriple().getOS() == llvm::Triple::UnknownOS &&
701 (
getTriple().getEnvironment() == llvm::Triple::EABI ||
702 getTriple().getEnvironment() == llvm::Triple::EABIHF) &&
704 Builder.defineMacro(
"_GNU_SOURCE");
708 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
713 Builder.defineMacro(
"__ARM_ARCH_7K__",
"2");
715 if (!CPUAttr.empty())
716 Builder.defineMacro(
"__ARM_ARCH_" + CPUAttr +
"__");
720 Builder.defineMacro(
"__ARM_ARCH", Twine(ArchVersion));
722 if (ArchVersion >= 8) {
727 Builder.defineMacro(
"__ARM_FEATURE_CRYPTO",
"1");
729 Builder.defineMacro(
"__ARM_FEATURE_SHA2",
"1");
731 Builder.defineMacro(
"__ARM_FEATURE_AES",
"1");
734 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
736 Builder.defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
738 Builder.defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
744 if (CPUProfile.empty() || ArchProfile != llvm::ARM::ProfileKind::M)
745 Builder.defineMacro(
"__ARM_ARCH_ISA_ARM",
"1");
751 if (supportsThumb2())
752 Builder.defineMacro(
"__ARM_ARCH_ISA_THUMB",
"2");
753 else if (supportsThumb())
754 Builder.defineMacro(
"__ARM_ARCH_ISA_THUMB",
"1");
758 Builder.defineMacro(
"__ARM_32BIT_STATE",
"1");
763 if (!CPUProfile.empty())
764 Builder.defineMacro(
"__ARM_ARCH_PROFILE",
"'" + CPUProfile +
"'");
768 Builder.defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
772 Builder.defineMacro(
"__ARM_FEATURE_LDREX",
"0x" + Twine::utohexstr(LDREX));
775 if (ArchVersion == 5 || (ArchVersion == 6 && CPUProfile !=
"M") ||
777 Builder.defineMacro(
"__ARM_FEATURE_CLZ",
"1");
781 Builder.defineMacro(
"__ARM_FP",
"0x" + Twine::utohexstr(HW_FP));
784 Builder.defineMacro(
"__ARM_ACLE",
"200");
787 Builder.defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
788 Builder.defineMacro(
"__ARM_FP16_ARGS",
"1");
791 if (ArchVersion >= 7 && (FPU & VFP4FPU))
792 Builder.defineMacro(
"__ARM_FEATURE_FMA",
"1");
799 if (5 <= ArchVersion && ArchVersion <= 8 && !
getTriple().isOSWindows())
800 Builder.defineMacro(
"__THUMB_INTERWORK__");
802 if (ABI ==
"aapcs" || ABI ==
"aapcs-linux" || ABI ==
"aapcs-vfp") {
806 Builder.defineMacro(
"__ARM_EABI__");
807 Builder.defineMacro(
"__ARM_PCS",
"1");
810 if ((!SoftFloat && !SoftFloatABI) || ABI ==
"aapcs-vfp" || ABI ==
"aapcs16")
811 Builder.defineMacro(
"__ARM_PCS_VFP",
"1");
813 if (SoftFloat || (SoftFloatABI && !FPU))
814 Builder.defineMacro(
"__SOFTFP__");
818 Builder.defineMacro(
"__ARM_ROPI",
"1");
820 Builder.defineMacro(
"__ARM_RWPI",
"1");
823 uint64_t FeatureCoprocBF = 0;
827 case llvm::ARM::ArchKind::ARMV4:
828 case llvm::ARM::ArchKind::ARMV4T:
830 FeatureCoprocBF = isThumb() ? 0 : FEATURE_COPROC_B1;
832 case llvm::ARM::ArchKind::ARMV5T:
833 FeatureCoprocBF = isThumb() ? 0 : FEATURE_COPROC_B1 | FEATURE_COPROC_B2;
835 case llvm::ARM::ArchKind::ARMV5TE:
836 case llvm::ARM::ArchKind::ARMV5TEJ:
839 FEATURE_COPROC_B1 | FEATURE_COPROC_B2 | FEATURE_COPROC_B3;
841 case llvm::ARM::ArchKind::ARMV6:
842 case llvm::ARM::ArchKind::ARMV6K:
843 case llvm::ARM::ArchKind::ARMV6KZ:
844 case llvm::ARM::ArchKind::ARMV6T2:
845 if (!isThumb() || ArchKind == llvm::ARM::ArchKind::ARMV6T2)
846 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 |
847 FEATURE_COPROC_B3 | FEATURE_COPROC_B4;
849 case llvm::ARM::ArchKind::ARMV7A:
850 case llvm::ARM::ArchKind::ARMV7R:
851 case llvm::ARM::ArchKind::ARMV7M:
852 case llvm::ARM::ArchKind::ARMV7S:
853 case llvm::ARM::ArchKind::ARMV7EM:
854 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 |
855 FEATURE_COPROC_B3 | FEATURE_COPROC_B4;
857 case llvm::ARM::ArchKind::ARMV8A:
858 case llvm::ARM::ArchKind::ARMV8R:
859 case llvm::ARM::ArchKind::ARMV8_1A:
860 case llvm::ARM::ArchKind::ARMV8_2A:
861 case llvm::ARM::ArchKind::ARMV8_3A:
862 case llvm::ARM::ArchKind::ARMV8_4A:
863 case llvm::ARM::ArchKind::ARMV8_5A:
864 case llvm::ARM::ArchKind::ARMV8_6A:
865 case llvm::ARM::ArchKind::ARMV8_7A:
866 case llvm::ARM::ArchKind::ARMV8_8A:
867 case llvm::ARM::ArchKind::ARMV8_9A:
868 case llvm::ARM::ArchKind::ARMV9A:
869 case llvm::ARM::ArchKind::ARMV9_1A:
870 case llvm::ARM::ArchKind::ARMV9_2A:
871 case llvm::ARM::ArchKind::ARMV9_3A:
872 case llvm::ARM::ArchKind::ARMV9_4A:
873 case llvm::ARM::ArchKind::ARMV9_5A:
874 case llvm::ARM::ArchKind::ARMV9_6A:
875 case llvm::ARM::ArchKind::ARMV9_7A:
876 case llvm::ARM::ArchKind::ARMV9_8A:
878 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B3;
880 case llvm::ARM::ArchKind::ARMV8MMainline:
881 case llvm::ARM::ArchKind::ARMV8_1MMainline:
882 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 |
883 FEATURE_COPROC_B3 | FEATURE_COPROC_B4;
886 Builder.defineMacro(
"__ARM_FEATURE_COPROC",
887 "0x" + Twine::utohexstr(FeatureCoprocBF));
889 if (ArchKind == llvm::ARM::ArchKind::XSCALE)
890 Builder.defineMacro(
"__XSCALE__");
893 Builder.defineMacro(
"__THUMBEL__");
894 Builder.defineMacro(
"__thumb__");
895 if (supportsThumb2())
896 Builder.defineMacro(
"__thumb2__");
900 if ((CPUProfile !=
"M" && ArchVersion >= 6) || (CPUProfile ==
"M" && DSP))
901 Builder.defineMacro(
"__ARM_FEATURE_SIMD32",
"1");
904 if (((HWDiv & HWDivThumb) && isThumb()) ||
905 ((HWDiv & HWDivARM) && !isThumb())) {
906 Builder.defineMacro(
"__ARM_FEATURE_IDIV",
"1");
907 Builder.defineMacro(
"__ARM_ARCH_EXT_IDIV__",
"1");
911 Builder.defineMacro(
"__APCS_32__");
916 Builder.defineMacro(
"__VFP_FP__");
918 if (FPUModeIsVFP((FPUMode)FPU)) {
920 Builder.defineMacro(
"__ARM_VFPV2__");
922 Builder.defineMacro(
"__ARM_VFPV3__");
924 Builder.defineMacro(
"__ARM_VFPV4__");
926 Builder.defineMacro(
"__ARM_FPV5__");
933 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
934 Builder.defineMacro(
"__ARM_NEON",
"1");
935 Builder.defineMacro(
"__ARM_NEON__");
938 Builder.defineMacro(
"__ARM_NEON_FP",
939 "0x" + Twine::utohexstr(HW_FP & ~HW_FP_DP));
943 Builder.defineMacro(
"__ARM_FEATURE_MVE", hasMVEFloat() ?
"3" :
"1");
947 Builder.defineMacro(
"__ARM_FEATURE_CDE",
"1");
948 Builder.defineMacro(
"__ARM_FEATURE_CDE_COPROC",
952 Builder.defineMacro(
"__ARM_SIZEOF_WCHAR_T",
953 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
955 Builder.defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
958 if (ArchVersion == 8 && ArchProfile == llvm::ARM::ProfileKind::M)
959 Builder.defineMacro(
"__ARM_FEATURE_CMSE", Opts.Cmse ?
"3" :
"1");
961 if (ArchVersion >= 6 && CPUAttr !=
"6M" && CPUAttr !=
"8M_BASE") {
962 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
963 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
964 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
965 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
970 Builder.defineMacro(
"__ARM_FEATURE_DSP",
"1");
975 if ((ArchVersion == 6 && CPUProfile !=
"M") || ArchVersion > 6) {
976 Builder.defineMacro(
"__ARM_FEATURE_SAT",
"1");
982 Builder.defineMacro(
"__ARM_FEATURE_QBIT",
"1");
984 if (Opts.UnsafeFPMath)
985 Builder.defineMacro(
"__ARM_FP_FAST",
"1");
989 Builder.defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
993 Builder.defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
997 Builder.defineMacro(
"__ARM_FEATURE_DOTPROD",
"1");
1000 Builder.defineMacro(
"__ARM_FEATURE_MATMUL_INT8",
"1");
1003 Builder.defineMacro(
"__ARM_FEATURE_PAUTH",
"1");
1006 Builder.defineMacro(
"__ARM_FEATURE_BTI",
"1");
1009 Builder.defineMacro(
"__ARM_FEATURE_BF16",
"1");
1010 Builder.defineMacro(
"__ARM_FEATURE_BF16_VECTOR_ARITHMETIC",
"1");
1011 Builder.defineMacro(
"__ARM_BF16_FORMAT_ALTERNATIVE",
"1");
1014 if (Opts.BranchTargetEnforcement)
1015 Builder.defineMacro(
"__ARM_FEATURE_BTI_DEFAULT",
"1");
1021 Builder.defineMacro(
"__ARM_FEATURE_PAC_DEFAULT", Twine(
Value));
1027 case llvm::ARM::ArchKind::ARMV8_1A:
1030 case llvm::ARM::ArchKind::ARMV8_2A:
1033 case llvm::ARM::ArchKind::ARMV8_3A:
1034 case llvm::ARM::ArchKind::ARMV8_4A:
1035 case llvm::ARM::ArchKind::ARMV8_5A:
1036 case llvm::ARM::ArchKind::ARMV8_6A:
1037 case llvm::ARM::ArchKind::ARMV8_7A:
1038 case llvm::ARM::ArchKind::ARMV8_8A:
1039 case llvm::ARM::ArchKind::ARMV8_9A:
1040 case llvm::ARM::ArchKind::ARMV9A:
1041 case llvm::ARM::ArchKind::ARMV9_1A:
1042 case llvm::ARM::ArchKind::ARMV9_2A:
1043 case llvm::ARM::ArchKind::ARMV9_3A:
1044 case llvm::ARM::ArchKind::ARMV9_4A:
1045 case llvm::ARM::ArchKind::ARMV9_5A:
1046 case llvm::ARM::ArchKind::ARMV9_6A:
1047 case llvm::ARM::ArchKind::ARMV9_7A:
1048 case llvm::ARM::ArchKind::ARMV9_8A:
1070#define GET_NEON_BUILTIN_STR_TABLE
1071#include "clang/Basic/arm_neon.inc"
1072#undef GET_NEON_BUILTIN_STR_TABLE
1074static constexpr std::array<Builtin::Info, NumNeonBuiltins>
BuiltinInfos = {
1075#define GET_NEON_BUILTIN_INFOS
1076#include "clang/Basic/arm_neon.inc"
1077#undef GET_NEON_BUILTIN_INFOS
1081#define GET_NEON_BUILTIN_STR_TABLE
1082#include "clang/Basic/arm_fp16.inc"
1083#undef GET_NEON_BUILTIN_STR_TABLE
1085static constexpr std::array<Builtin::Info, NumFp16Builtins>
BuiltinInfos = {
1086#define GET_NEON_BUILTIN_INFOS
1087#include "clang/Basic/arm_fp16.inc"
1088#undef GET_NEON_BUILTIN_INFOS
1096#define GET_MVE_BUILTIN_STR_TABLE
1097#include "clang/Basic/arm_mve_builtins.inc"
1098#undef GET_MVE_BUILTIN_STR_TABLE
1100static constexpr std::array<Builtin::Info, NumMVEBuiltins>
BuiltinInfos = {
1101#define GET_MVE_BUILTIN_INFOS
1102#include "clang/Basic/arm_mve_builtins.inc"
1103#undef GET_MVE_BUILTIN_INFOS
1108#define GET_CDE_BUILTIN_STR_TABLE
1109#include "clang/Basic/arm_cde_builtins.inc"
1110#undef GET_CDE_BUILTIN_STR_TABLE
1112static constexpr std::array<Builtin::Info, NumCDEBuiltins>
BuiltinInfos = {
1113#define GET_CDE_BUILTIN_INFOS
1114#include "clang/Basic/arm_cde_builtins.inc"
1115#undef GET_CDE_BUILTIN_INFOS
1123#define GET_BUILTIN_STR_TABLE
1124#include "clang/Basic/BuiltinsARM.inc"
1125#undef GET_BUILTIN_STR_TABLE
1128#define GET_BUILTIN_INFOS
1129#include "clang/Basic/BuiltinsARM.inc"
1130#undef GET_BUILTIN_INFOS
1134#define GET_BUILTIN_PREFIXED_INFOS
1135#include "clang/Basic/BuiltinsARM.inc"
1136#undef GET_BUILTIN_PREFIXED_INFOS
1145llvm::SmallVector<Builtin::InfosShard>
1151 {&MVE::BuiltinStrings, MVE::BuiltinInfos,
"__builtin_arm_mve_"},
1152 {&CDE::BuiltinStrings, CDE::BuiltinInfos,
"__builtin_arm_cde_"},
1166const char *
const ARMTargetInfo::GCCRegNames[] = {
1168 "r0",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
"r8",
"r9",
"r10",
"r11",
1169 "r12",
"sp",
"lr",
"pc",
1172 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
1173 "s12",
"s13",
"s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
1174 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
1177 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
"d8",
"d9",
"d10",
"d11",
1178 "d12",
"d13",
"d14",
"d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
1179 "d23",
"d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
1182 "q0",
"q1",
"q2",
"q3",
"q4",
"q5",
"q6",
"q7",
"q8",
"q9",
"q10",
"q11",
1183 "q12",
"q13",
"q14",
"q15"};
1190 {{
"a1"},
"r0"}, {{
"a2"},
"r1"}, {{
"a3"},
"r2"}, {{
"a4"},
"r3"},
1191 {{
"v1"},
"r4"}, {{
"v2"},
"r5"}, {{
"v3"},
"r6"}, {{
"v4"},
"r7"},
1192 {{
"v5"},
"r8"}, {{
"v6",
"rfp"},
"r9"}, {{
"sl"},
"r10"}, {{
"fp"},
"r11"},
1193 {{
"ip"},
"r12"}, {{
"r13"},
"sp"}, {{
"r14"},
"lr"}, {{
"r15"},
"pc"},
1227 if (CPUAttr ==
"6T2" || ArchVersion >= 7) {
1234 if (!supportsThumb2())
1246 if (isThumb() && !supportsThumb2())
1253 if (!supportsThumb2())
1268 if (!supportsThumb2())
1280 if (isThumb() && !supportsThumb2())
1291 if (isThumb() && !supportsThumb2()) {
1298 if (isThumb() && !supportsThumb2()) {
1341 switch (*Constraint) {
1344 R = std::string(
"^") + std::string(Constraint, 2);
1348 R = std::string(
"r");
1351 return std::string(1, *Constraint);
1357 StringRef Constraint,
char Modifier,
unsigned Size,
1358 std::string &SuggestedModifier)
const {
1359 bool isOutput = (Constraint[0] ==
'=');
1360 bool isInOut = (Constraint[0] ==
'+');
1363 Constraint = Constraint.ltrim(
"=+&");
1365 switch (Constraint[0]) {
1371 return (isInOut || isOutput || Size <= 64);
1416 Builder.defineMacro(
"__ARMEL__");
1426 Builder.defineMacro(
"__ARMEB__");
1427 Builder.defineMacro(
"__ARM_BIG_ENDIAN");
1439 Builder.defineMacro(
"_M_ARM_NT",
"1");
1440 Builder.defineMacro(
"_M_ARMT",
"_M_ARM");
1441 Builder.defineMacro(
"_M_THUMB",
"_M_ARM");
1443 assert((Triple.getArch() == llvm::Triple::arm ||
1444 Triple.getArch() == llvm::Triple::thumb) &&
1445 "invalid architecture for Windows ARM target info");
1446 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
1447 Builder.defineMacro(
"_M_ARM", Triple.getArchName().substr(Offset));
1451 Builder.defineMacro(
"_M_ARM_FP",
"31");
1483 TheCXXABI.set(TargetCXXABI::GenericARM);
1490 if (Opts.MSVCCompat)
1510 TheCXXABI.set(TargetCXXABI::GenericARM);
1516 Builder.defineMacro(
"_ARM_");
1531 Builder.defineMacro(
"_ARM_");
1532 Builder.defineMacro(
"__CYGWIN__");
1533 Builder.defineMacro(
"__CYGWIN32__");
1536 Builder.defineMacro(
"_GNU_SOURCE");
1544 const llvm::Triple &Triple,
1553 if (Triple.isWatchABI()) {
1555 TheCXXABI.set(TargetCXXABI::WatchOS);
1558 UseSignedCharForObjCBool = false;
1564 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.
Attr - This represents one attribute.
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
TargetOptions & getTargetOpts() const
Retrieve the target options.
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 CPU
If given, the name of the target CPU to generate code for.
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...
bool validateBranchProtection(const ParsedTargetAttr &Attr, BranchProtectionInfo &BPI, const LangOptions &LO, StringRef &Err) const override
Determines whether this TargetInfo supports the given branch protection specification.
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.
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.
Contains information gathered from parsing the contents of TargetAttr.
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