18#include "llvm/ADT/APSInt.h"
19#include "llvm/ADT/ArrayRef.h"
20#include "llvm/ADT/StringExtras.h"
21#include "llvm/ADT/StringSwitch.h"
22#include "llvm/TargetParser/AArch64TargetParser.h"
23#include "llvm/TargetParser/ARMTargetParserCommon.h"
30#define BUILTIN(ID, TYPE, ATTRS) \
31 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
32#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
33 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
34#include "clang/Basic/BuiltinsNEON.def"
36#define BUILTIN(ID, TYPE, ATTRS) \
37 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
38#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
39 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
40#include "clang/Basic/BuiltinsSVE.def"
42#define BUILTIN(ID, TYPE, ATTRS) \
43 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
44#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
45 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
46#include "clang/Basic/BuiltinsSME.def"
48#define BUILTIN(ID, TYPE, ATTRS) \
49 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
50#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
51 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, LANG},
52#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
53 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
54#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
55 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::HEADER, LANGS},
56#include "clang/Basic/BuiltinsAArch64.def"
60 if (*ArchInfo == llvm::AArch64::ARMV8R) {
70 }
else if (ArchInfo->Version.getMajor() == 8) {
71 if (ArchInfo->Version.getMinor() >= 7u) {
74 if (ArchInfo->Version.getMinor() >= 6u) {
78 if (ArchInfo->Version.getMinor() >= 5u) {
79 HasAlternativeNZCV =
true;
86 if (ArchInfo->Version.getMinor() >= 4u) {
91 if (ArchInfo->Version.getMinor() >= 3u) {
95 if (ArchInfo->Version.getMinor() >= 2u) {
98 if (ArchInfo->Version.getMinor() >= 1u) {
103 }
else if (ArchInfo->Version.getMajor() == 9) {
104 if (ArchInfo->Version.getMinor() >= 2u) {
107 if (ArchInfo->Version.getMinor() >= 1u) {
114 HasAlternativeNZCV =
true;
152 if (Triple.isArch64Bit())
196 if (Triple.getOS() == llvm::Triple::Linux)
198 else if (Triple.getOS() == llvm::Triple::UnknownOS)
200 Opts.
EABIVersion == llvm::EABI::GNU ?
"\01_mcount" :
"mcount";
206 if (Name !=
"aapcs" && Name !=
"aapcs-soft" && Name !=
"darwinpcs")
214 if (
hasFeature(
"fp") && ABI ==
"aapcs-soft") {
217 Diags.
Report(diag::err_target_unsupported_abi_with_fpu) << ABI;
225 StringRef &Err)
const {
226 llvm::ARM::ParsedBranchProtection PBP;
227 if (!llvm::ARM::parseBranchProtection(Spec, PBP, Err))
231 llvm::StringSwitch<LangOptions::SignReturnAddressScopeKind>(PBP.Scope)
236 if (PBP.Key ==
"a_key")
248 return Name ==
"generic" || llvm::AArch64::parseCpu(Name);
257 llvm::AArch64::fillValidCPUArchList(Values);
262 Builder.defineMacro(
"__ARM_FEATURE_QRDMX",
"1");
273 Builder.defineMacro(
"__ARM_FEATURE_COMPLEX",
"1");
274 Builder.defineMacro(
"__ARM_FEATURE_JCVT",
"1");
287 Builder.defineMacro(
"__ARM_FEATURE_FRINT",
"1");
288 Builder.defineMacro(
"__ARM_FEATURE_BTI",
"1");
363 Builder.defineMacro(
"__amd64__");
364 Builder.defineMacro(
"__amd64");
365 Builder.defineMacro(
"__x86_64");
366 Builder.defineMacro(
"__x86_64__");
367 Builder.defineMacro(
"__arm64ec__");
369 Builder.defineMacro(
"__aarch64__");
373 Builder.defineMacro(
"__GCC_ASM_FLAG_OUTPUTS__");
376 if (CodeModel ==
"default")
378 for (
char &
c : CodeModel)
380 Builder.defineMacro(
"__AARCH64_CMODEL_" + CodeModel +
"__");
383 Builder.defineMacro(
"__ARM_ACLE",
"200");
384 Builder.defineMacro(
"__ARM_ARCH",
385 std::to_string(ArchInfo->Version.getMajor()));
386 Builder.defineMacro(
"__ARM_ARCH_PROFILE",
387 std::string(
"'") + (
char)ArchInfo->Profile +
"'");
389 Builder.defineMacro(
"__ARM_64BIT_STATE",
"1");
390 Builder.defineMacro(
"__ARM_PCS_AAPCS64",
"1");
391 Builder.defineMacro(
"__ARM_ARCH_ISA_A64",
"1");
393 Builder.defineMacro(
"__ARM_FEATURE_CLZ",
"1");
394 Builder.defineMacro(
"__ARM_FEATURE_FMA",
"1");
395 Builder.defineMacro(
"__ARM_FEATURE_LDREX",
"0xF");
396 Builder.defineMacro(
"__ARM_FEATURE_IDIV",
"1");
397 Builder.defineMacro(
"__ARM_FEATURE_DIV");
398 Builder.defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
399 Builder.defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
401 Builder.defineMacro(
"__ARM_ALIGN_MAX_STACK_PWR",
"4");
405 Builder.defineMacro(
"__ARM_STATE_ZA",
"1");
406 Builder.defineMacro(
"__ARM_STATE_ZT0",
"1");
410 Builder.defineMacro(
"__ARM_FP",
"0xE");
414 Builder.defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
415 Builder.defineMacro(
"__ARM_FP16_ARGS",
"1");
417 if (Opts.UnsafeFPMath)
418 Builder.defineMacro(
"__ARM_FP_FAST",
"1");
420 Builder.defineMacro(
"__ARM_SIZEOF_WCHAR_T",
421 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
423 Builder.defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
425 if (FPU & NeonMode) {
426 Builder.defineMacro(
"__ARM_NEON",
"1");
428 Builder.defineMacro(
"__ARM_NEON_FP",
"0xE");
432 Builder.defineMacro(
"__ARM_FEATURE_SVE",
"1");
434 if ((FPU & NeonMode) && (FPU & SveMode))
435 Builder.defineMacro(
"__ARM_NEON_SVE_BRIDGE",
"1");
438 Builder.defineMacro(
"__ARM_FEATURE_SVE2",
"1");
440 if (HasSVE2 && HasSVE2AES)
441 Builder.defineMacro(
"__ARM_FEATURE_SVE2_AES",
"1");
443 if (HasSVE2 && HasSVE2BitPerm)
444 Builder.defineMacro(
"__ARM_FEATURE_SVE2_BITPERM",
"1");
446 if (HasSVE2 && HasSVE2SHA3)
447 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SHA3",
"1");
449 if (HasSVE2 && HasSVE2SM4)
450 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SM4",
"1");
453 Builder.defineMacro(
"__ARM_FEATURE_SME");
454 Builder.defineMacro(
"__ARM_FEATURE_LOCALLY_STREAMING",
"1");
458 Builder.defineMacro(
"__ARM_FEATURE_SME");
459 Builder.defineMacro(
"__ARM_FEATURE_SME2");
460 Builder.defineMacro(
"__ARM_FEATURE_LOCALLY_STREAMING",
"1");
464 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
467 Builder.defineMacro(
"__ARM_FEATURE_RCPC",
"3");
469 Builder.defineMacro(
"__ARM_FEATURE_RCPC",
"1");
472 Builder.defineMacro(
"__HAVE_FUNCTION_MULTI_VERSIONING",
"1");
476 if (HasAES && HasSHA2)
477 Builder.defineMacro(
"__ARM_FEATURE_CRYPTO",
"1");
480 Builder.defineMacro(
"__ARM_FEATURE_AES",
"1");
483 Builder.defineMacro(
"__ARM_FEATURE_SHA2",
"1");
486 Builder.defineMacro(
"__ARM_FEATURE_SHA3",
"1");
487 Builder.defineMacro(
"__ARM_FEATURE_SHA512",
"1");
491 Builder.defineMacro(
"__ARM_FEATURE_SM3",
"1");
492 Builder.defineMacro(
"__ARM_FEATURE_SM4",
"1");
496 Builder.defineMacro(
"__ARM_FEATURE_PAUTH",
"1");
499 Builder.defineMacro(
"__ARM_FEATURE_PAUTH_LR",
"1");
502 Builder.defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
504 if ((FPU & NeonMode) && HasFullFP16)
505 Builder.defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
507 Builder.defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
510 Builder.defineMacro(
"__ARM_FEATURE_DOTPROD",
"1");
513 Builder.defineMacro(
"__ARM_FEATURE_MEMORY_TAGGING",
"1");
516 Builder.defineMacro(
"__ARM_FEATURE_TME",
"1");
519 Builder.defineMacro(
"__ARM_FEATURE_MATMUL_INT8",
"1");
522 Builder.defineMacro(
"__ARM_FEATURE_ATOMICS",
"1");
525 Builder.defineMacro(
"__ARM_FEATURE_BF16",
"1");
526 Builder.defineMacro(
"__ARM_FEATURE_BF16_VECTOR_ARITHMETIC",
"1");
527 Builder.defineMacro(
"__ARM_BF16_FORMAT_ALTERNATIVE",
"1");
528 Builder.defineMacro(
"__ARM_FEATURE_BF16_SCALAR_ARITHMETIC",
"1");
531 if ((FPU & SveMode) && HasBFloat16) {
532 Builder.defineMacro(
"__ARM_FEATURE_SVE_BF16",
"1");
535 if ((FPU & SveMode) && HasMatmulFP64)
536 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP64",
"1");
538 if ((FPU & SveMode) && HasMatmulFP32)
539 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP32",
"1");
541 if ((FPU & SveMode) && HasMatMul)
542 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_INT8",
"1");
544 if ((FPU & NeonMode) && HasFP16FML)
545 Builder.defineMacro(
"__ARM_FEATURE_FP16_FML",
"1");
563 if (Opts.BranchProtectionPAuthLR)
566 Builder.defineMacro(
"__ARM_FEATURE_PAC_DEFAULT", std::to_string(
Value));
569 if (Opts.BranchTargetEnforcement)
570 Builder.defineMacro(
"__ARM_FEATURE_BTI_DEFAULT",
"1");
572 if (Opts.GuardedControlStack)
573 Builder.defineMacro(
"__ARM_FEATURE_GCS_DEFAULT",
"1");
576 Builder.defineMacro(
"__ARM_FEATURE_LS64",
"1");
579 Builder.defineMacro(
"__ARM_FEATURE_RNG",
"1");
582 Builder.defineMacro(
"__ARM_FEATURE_MOPS",
"1");
585 Builder.defineMacro(
"__ARM_FEATURE_SYSREG128",
"1");
588 Builder.defineMacro(
"__ARM_FEATURE_GCS",
"1");
590 if (*ArchInfo == llvm::AArch64::ARMV8_1A)
592 else if (*ArchInfo == llvm::AArch64::ARMV8_2A)
594 else if (*ArchInfo == llvm::AArch64::ARMV8_3A)
596 else if (*ArchInfo == llvm::AArch64::ARMV8_4A)
598 else if (*ArchInfo == llvm::AArch64::ARMV8_5A)
600 else if (*ArchInfo == llvm::AArch64::ARMV8_6A)
602 else if (*ArchInfo == llvm::AArch64::ARMV8_7A)
604 else if (*ArchInfo == llvm::AArch64::ARMV8_8A)
606 else if (*ArchInfo == llvm::AArch64::ARMV8_9A)
608 else if (*ArchInfo == llvm::AArch64::ARMV9A)
610 else if (*ArchInfo == llvm::AArch64::ARMV9_1A)
612 else if (*ArchInfo == llvm::AArch64::ARMV9_2A)
614 else if (*ArchInfo == llvm::AArch64::ARMV9_3A)
616 else if (*ArchInfo == llvm::AArch64::ARMV9_4A)
618 else if (*ArchInfo == llvm::AArch64::ARMV9_5A)
622 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
623 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
624 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
625 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
626 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
629 Builder.defineMacro(
"__FP_FAST_FMA",
"1");
630 Builder.defineMacro(
"__FP_FAST_FMAF",
"1");
634 Builder.defineMacro(
"__ARM_FEATURE_SVE_VECTOR_OPERATORS",
"2");
636 if (Opts.VScaleMin && Opts.VScaleMin == Opts.VScaleMax) {
637 Builder.defineMacro(
"__ARM_FEATURE_SVE_BITS", Twine(Opts.VScaleMin * 128));
646std::optional<std::pair<unsigned, unsigned>>
648 if (LangOpts.VScaleMin || LangOpts.VScaleMax)
649 return std::pair<unsigned, unsigned>(
650 LangOpts.VScaleMin ? LangOpts.VScaleMin : 1, LangOpts.VScaleMax);
653 return std::pair<unsigned, unsigned>(1, 16);
659 if (Name ==
"default")
661 if (
auto Ext = llvm::AArch64::parseArchExtension(Name))
662 return Ext->FmvPriority;
668 return llvm::AArch64::ExtensionInfo::MaxFMVPriority;
672 if (
auto Ext = llvm::AArch64::parseArchExtension(Name))
673 return !Ext->DependentFeatures.empty();
678 if (
auto Ext = llvm::AArch64::parseArchExtension(Name))
679 return Ext->DependentFeatures;
686 FeatureStr.split(Features,
"+");
687 for (
auto &Feature : Features)
688 if (!llvm::AArch64::parseArchExtension(Feature.trim()).has_value())
694 return llvm::StringSwitch<bool>(Feature)
695 .Cases(
"aarch64",
"arm64",
"arm",
true)
697 .Case(
"fp", FPU & FPUMode)
698 .Cases(
"neon",
"simd", FPU & NeonMode)
699 .Case(
"jscvt", HasJSCVT)
700 .Case(
"fcma", HasFCMA)
701 .Case(
"rng", HasRandGen)
702 .Case(
"flagm", HasFlagM)
703 .Case(
"flagm2", HasAlternativeNZCV)
704 .Case(
"fp16fml", HasFP16FML)
705 .Case(
"dotprod", HasDotProd)
710 .Case(
"sha2", HasSHA2)
711 .Case(
"sha3", HasSHA3)
712 .Cases(
"aes",
"pmull", HasAES)
713 .Cases(
"fp16",
"fullfp16", HasFullFP16)
715 .Case(
"dpb", HasCCPP)
716 .Case(
"dpb2", HasCCDP)
717 .Case(
"rcpc", HasRCPC)
718 .Case(
"frintts", HasFRInt3264)
719 .Case(
"i8mm", HasMatMul)
720 .Case(
"bf16", HasBFloat16)
721 .Case(
"sve", FPU & SveMode)
722 .Case(
"sve-bf16", FPU & SveMode && HasBFloat16)
723 .Case(
"sve-i8mm", FPU & SveMode && HasMatMul)
724 .Case(
"f32mm", FPU & SveMode && HasMatmulFP32)
725 .Case(
"f64mm", FPU & SveMode && HasMatmulFP64)
726 .Case(
"sve2", FPU & SveMode && HasSVE2)
727 .Case(
"sve2-pmull128", FPU & SveMode && HasSVE2AES)
728 .Case(
"sve2-bitperm", FPU & SveMode && HasSVE2BitPerm)
729 .Case(
"sve2-sha3", FPU & SveMode && HasSVE2SHA3)
730 .Case(
"sve2-sm4", FPU & SveMode && HasSVE2SM4)
732 .Case(
"sme2", HasSME2)
733 .Case(
"sme-f64f64", HasSMEF64F64)
734 .Case(
"sme-i16i64", HasSMEI16I64)
735 .Case(
"sme-fa64", HasSMEFA64)
736 .Cases(
"memtag",
"memtag2", HasMTE)
738 .Case(
"predres", HasPredRes)
739 .Cases(
"ssbs",
"ssbs2", HasSSBS)
741 .Cases(
"ls64",
"ls64_v",
"ls64_accdata", HasLS64)
742 .Case(
"wfxt", HasWFxT)
743 .Case(
"rcpc3", HasRCPC3)
748 StringRef Name,
bool Enabled)
const {
749 Features[Name] = Enabled;
752 const std::optional<llvm::AArch64::ArchInfo> ArchInfo =
753 llvm::AArch64::ArchInfo::findBySubArch(Name);
762 for (
const auto *OtherArch : llvm::AArch64::ArchInfos)
763 if (ArchInfo->implies(*OtherArch))
764 Features[OtherArch->getSubArch()] =
true;
767 std::vector<StringRef> CPUFeats;
768 if (llvm::AArch64::getExtensionFeatures(ArchInfo->DefaultExts, CPUFeats)) {
769 for (
auto F : CPUFeats) {
770 assert(F[0] ==
'+' &&
"Expected + in target feature!");
771 Features[F.drop_front(1)] =
true;
778 for (
const auto &Feature : Features) {
779 if (Feature ==
"-fp-armv8")
781 if (Feature ==
"-neon")
783 if (Feature ==
"-sve")
786 if (Feature ==
"+neon" || Feature ==
"+fp-armv8")
788 if (Feature ==
"+jscvt") {
792 if (Feature ==
"+fcma") {
797 if (Feature ==
"+sve") {
802 if (Feature ==
"+sve2") {
808 if (Feature ==
"+sve2-aes") {
815 if (Feature ==
"+sve2-sha3") {
822 if (Feature ==
"+sve2-sm4") {
829 if (Feature ==
"+sve2-bitperm") {
834 HasSVE2BitPerm =
true;
836 if (Feature ==
"+f32mm") {
840 HasMatmulFP32 =
true;
842 if (Feature ==
"+f64mm") {
846 HasMatmulFP64 =
true;
848 if (Feature ==
"+sme") {
853 if (Feature ==
"+sme2") {
859 if (Feature ==
"+sme-f64f64") {
865 if (Feature ==
"+sme-i16i64") {
871 if (Feature ==
"+sme-fa64") {
878 if (Feature ==
"+sb")
880 if (Feature ==
"+predres")
882 if (Feature ==
"+ssbs")
884 if (Feature ==
"+bti")
886 if (Feature ==
"+wfxt")
888 if (Feature ==
"-fmv")
890 if (Feature ==
"+crc")
892 if (Feature ==
"+rcpc")
894 if (Feature ==
"+aes") {
898 if (Feature ==
"+sha2") {
902 if (Feature ==
"+sha3") {
907 if (Feature ==
"+rdm") {
911 if (Feature ==
"+dit")
913 if (Feature ==
"+cccp")
915 if (Feature ==
"+ccdp") {
919 if (Feature ==
"+fptoint")
921 if (Feature ==
"+sm4") {
925 if (Feature ==
"+strict-align")
929 if (Feature ==
"+v8a" && ArchInfo->Version < llvm::AArch64::ARMV8A.Version)
930 ArchInfo = &llvm::AArch64::ARMV8A;
931 if (Feature ==
"+v8.1a" &&
932 ArchInfo->Version < llvm::AArch64::ARMV8_1A.Version)
933 ArchInfo = &llvm::AArch64::ARMV8_1A;
934 if (Feature ==
"+v8.2a" &&
935 ArchInfo->Version < llvm::AArch64::ARMV8_2A.Version)
936 ArchInfo = &llvm::AArch64::ARMV8_2A;
937 if (Feature ==
"+v8.3a" &&
938 ArchInfo->Version < llvm::AArch64::ARMV8_3A.Version)
939 ArchInfo = &llvm::AArch64::ARMV8_3A;
940 if (Feature ==
"+v8.4a" &&
941 ArchInfo->Version < llvm::AArch64::ARMV8_4A.Version)
942 ArchInfo = &llvm::AArch64::ARMV8_4A;
943 if (Feature ==
"+v8.5a" &&
944 ArchInfo->Version < llvm::AArch64::ARMV8_5A.Version)
945 ArchInfo = &llvm::AArch64::ARMV8_5A;
946 if (Feature ==
"+v8.6a" &&
947 ArchInfo->Version < llvm::AArch64::ARMV8_6A.Version)
948 ArchInfo = &llvm::AArch64::ARMV8_6A;
949 if (Feature ==
"+v8.7a" &&
950 ArchInfo->Version < llvm::AArch64::ARMV8_7A.Version)
951 ArchInfo = &llvm::AArch64::ARMV8_7A;
952 if (Feature ==
"+v8.8a" &&
953 ArchInfo->Version < llvm::AArch64::ARMV8_8A.Version)
954 ArchInfo = &llvm::AArch64::ARMV8_8A;
955 if (Feature ==
"+v8.9a" &&
956 ArchInfo->Version < llvm::AArch64::ARMV8_9A.Version)
957 ArchInfo = &llvm::AArch64::ARMV8_9A;
958 if (Feature ==
"+v9a" && ArchInfo->Version < llvm::AArch64::ARMV9A.Version)
959 ArchInfo = &llvm::AArch64::ARMV9A;
960 if (Feature ==
"+v9.1a" &&
961 ArchInfo->Version < llvm::AArch64::ARMV9_1A.Version)
962 ArchInfo = &llvm::AArch64::ARMV9_1A;
963 if (Feature ==
"+v9.2a" &&
964 ArchInfo->Version < llvm::AArch64::ARMV9_2A.Version)
965 ArchInfo = &llvm::AArch64::ARMV9_2A;
966 if (Feature ==
"+v9.3a" &&
967 ArchInfo->Version < llvm::AArch64::ARMV9_3A.Version)
968 ArchInfo = &llvm::AArch64::ARMV9_3A;
969 if (Feature ==
"+v9.4a" &&
970 ArchInfo->Version < llvm::AArch64::ARMV9_4A.Version)
971 ArchInfo = &llvm::AArch64::ARMV9_4A;
972 if (Feature ==
"+v9.5a" &&
973 ArchInfo->Version < llvm::AArch64::ARMV9_5A.Version)
974 ArchInfo = &llvm::AArch64::ARMV9_5A;
975 if (Feature ==
"+v8r")
976 ArchInfo = &llvm::AArch64::ARMV8R;
977 if (Feature ==
"+fullfp16") {
981 if (Feature ==
"+dotprod") {
985 if (Feature ==
"+fp16fml") {
990 if (Feature ==
"+mte")
992 if (Feature ==
"+tme")
994 if (Feature ==
"+pauth")
996 if (Feature ==
"+i8mm")
998 if (Feature ==
"+bf16")
1000 if (Feature ==
"+lse")
1002 if (Feature ==
"+ls64")
1004 if (Feature ==
"+rand")
1006 if (Feature ==
"+flagm")
1008 if (Feature ==
"+altnzcv") {
1010 HasAlternativeNZCV =
true;
1012 if (Feature ==
"+mops")
1014 if (Feature ==
"+d128")
1016 if (Feature ==
"+gcs")
1018 if (Feature ==
"+rcpc3")
1020 if (Feature ==
"+pauth-lr") {
1029 for (
const auto &Feature : Features) {
1030 if (Feature ==
"-d128")
1054 const std::vector<std::string> &FeaturesVec)
const {
1055 std::vector<std::string> UpdatedFeaturesVec;
1057 std::optional<llvm::AArch64::CpuInfo> CpuInfo = llvm::AArch64::parseCpu(CPU);
1059 auto Exts = CpuInfo->getImpliedExtensions();
1060 std::vector<StringRef> CPUFeats;
1061 llvm::AArch64::getExtensionFeatures(Exts, CPUFeats);
1062 for (
auto F : CPUFeats) {
1063 assert((F[0] ==
'+' || F[0] ==
'-') &&
"Expected +/- in target feature!");
1064 UpdatedFeaturesVec.push_back(F.str());
1072 for (
const auto &Feature : FeaturesVec)
1073 if (((Feature[0] ==
'?' || Feature[0] ==
'+')) &&
1075 StringRef DepFeatures =
1078 DepFeatures.split(AttrFeatures,
",");
1079 for (
auto F : AttrFeatures)
1080 UpdatedFeaturesVec.push_back(F.str());
1082 for (
const auto &Feature : FeaturesVec)
1083 if (Feature[0] !=
'?') {
1084 std::string UpdatedFeature = Feature;
1085 if (Feature[0] ==
'+') {
1086 std::optional<llvm::AArch64::ExtensionInfo> Extension =
1087 llvm::AArch64::parseArchExtension(Feature.substr(1));
1089 UpdatedFeature = Extension->Feature.str();
1091 UpdatedFeaturesVec.push_back(UpdatedFeature);
1105 if (Features ==
"default")
1108 Features.split(AttrFeatures,
",");
1109 bool FoundArch =
false;
1111 auto SplitAndAddFeatures = [](StringRef FeatString,
1112 std::vector<std::string> &Features) {
1114 FeatString.split(SplitFeatures, StringRef(
"+"), -1,
false);
1115 for (StringRef Feature : SplitFeatures) {
1116 StringRef FeatureName = llvm::AArch64::getArchExtFeature(Feature);
1117 if (!FeatureName.empty())
1118 Features.push_back(FeatureName.str());
1122 if (Feature.starts_with(
"no"))
1123 Features.push_back(
"-" + Feature.drop_front(2).str());
1125 Features.push_back(
"+" + Feature.str());
1129 for (
auto &Feature : AttrFeatures) {
1130 Feature = Feature.trim();
1131 if (Feature.starts_with(
"fpmath="))
1134 if (Feature.starts_with(
"branch-protection=")) {
1135 Ret.BranchProtection = Feature.split(
'=').second.trim();
1139 if (Feature.starts_with(
"arch=")) {
1141 Ret.Duplicate =
"arch=";
1143 std::pair<StringRef, StringRef> Split =
1144 Feature.split(
"=").second.trim().split(
"+");
1145 const llvm::AArch64::ArchInfo *AI = llvm::AArch64::parseArch(Split.first);
1151 Ret.Features.push_back(AI->ArchFeature.str());
1153 SplitAndAddFeatures(Split.second, Ret.Features);
1154 }
else if (Feature.starts_with(
"cpu=")) {
1155 if (!Ret.CPU.empty())
1156 Ret.Duplicate =
"cpu=";
1160 std::pair<StringRef, StringRef> Split =
1161 Feature.split(
"=").second.trim().split(
"+");
1162 Ret.CPU = Split.first;
1163 SplitAndAddFeatures(Split.second, Ret.Features);
1165 }
else if (Feature.starts_with(
"tune=")) {
1166 if (!Ret.Tune.empty())
1167 Ret.Duplicate =
"tune=";
1169 Ret.Tune = Feature.split(
"=").second.trim();
1170 }
else if (Feature.starts_with(
"+")) {
1171 SplitAndAddFeatures(Feature, Ret.Features);
1172 }
else if (Feature.starts_with(
"no-")) {
1173 StringRef FeatureName =
1174 llvm::AArch64::getArchExtFeature(Feature.split(
"-").second);
1175 if (!FeatureName.empty())
1176 Ret.Features.push_back(
"-" + FeatureName.drop_front(1).str());
1178 Ret.Features.push_back(
"-" + Feature.split(
"-").second.str());
1183 StringRef FeatureName = llvm::AArch64::getArchExtFeature(Feature);
1184 if (!FeatureName.empty())
1185 Ret.Features.push_back(FeatureName.str());
1187 Ret.Features.push_back(
"+" + Feature.str());
1221const char *
const AArch64TargetInfo::GCCRegNames[] = {
1225 "w0",
"w1",
"w2",
"w3",
"w4",
"w5",
"w6",
"w7",
"w8",
"w9",
"w10",
"w11",
1226 "w12",
"w13",
"w14",
"w15",
"w16",
"w17",
"w18",
"w19",
"w20",
"w21",
"w22",
1227 "w23",
"w24",
"w25",
"w26",
"w27",
"w28",
"w29",
"w30",
"wsp",
1230 "x0",
"x1",
"x2",
"x3",
"x4",
"x5",
"x6",
"x7",
"x8",
"x9",
"x10",
"x11",
1231 "x12",
"x13",
"x14",
"x15",
"x16",
"x17",
"x18",
"x19",
"x20",
"x21",
"x22",
1232 "x23",
"x24",
"x25",
"x26",
"x27",
"x28",
"fp",
"lr",
"sp",
1235 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
1236 "s12",
"s13",
"s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
1237 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
1240 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
"d8",
"d9",
"d10",
"d11",
1241 "d12",
"d13",
"d14",
"d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
1242 "d23",
"d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
1245 "v0",
"v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
"v9",
"v10",
"v11",
1246 "v12",
"v13",
"v14",
"v15",
"v16",
"v17",
"v18",
"v19",
"v20",
"v21",
"v22",
1247 "v23",
"v24",
"v25",
"v26",
"v27",
"v28",
"v29",
"v30",
"v31",
1250 "z0",
"z1",
"z2",
"z3",
"z4",
"z5",
"z6",
"z7",
"z8",
"z9",
"z10",
1251 "z11",
"z12",
"z13",
"z14",
"z15",
"z16",
"z17",
"z18",
"z19",
"z20",
"z21",
1252 "z22",
"z23",
"z24",
"z25",
"z26",
"z27",
"z28",
"z29",
"z30",
"z31",
1255 "p0",
"p1",
"p2",
"p3",
"p4",
"p5",
"p6",
"p7",
"p8",
"p9",
"p10",
1256 "p11",
"p12",
"p13",
"p14",
"p15",
1259 "pn0",
"pn1",
"pn2",
"pn3",
"pn4",
"pn5",
"pn6",
"pn7",
"pn8",
1260 "pn9",
"pn10",
"pn11",
"pn12",
"pn13",
"pn14",
"pn15",
1305 {{
"r29",
"x29"},
"fp"},
1306 {{
"r30",
"x30"},
"lr"},
1317 constexpr unsigned len = 5;
1318 auto RV = llvm::StringSwitch<unsigned>(Name)
1342 switch (*Constraint) {
1344 R = std::string(
"@3") + std::string(Constraint, 3);
1349 std::string Converted =
"{" + std::string(Constraint, Len) +
"}";
1350 Constraint += Len - 1;
1353 return std::string(1, *Constraint);
1385 if (Name[1] ==
'p' &&
1386 (Name[2] ==
'l' || Name[2] ==
'a' || Name[2] ==
'h')) {
1392 if (Name[1] ==
'c' && (Name[2] ==
'i' || Name[2] ==
'j')) {
1427 StringRef Constraint,
char Modifier,
unsigned Size,
1428 std::string &SuggestedModifier)
const {
1430 Constraint = Constraint.ltrim(
"=+&");
1432 switch (Constraint[0]) {
1452 SuggestedModifier =
"w";
1470 const llvm::APSInt &value)
const {
1471 return 0 <= value && value <= 3;
1480void AArch64leTargetInfo::setDataLayout() {
1487 resetDataLayout(
"e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
1492 Builder.defineMacro(
"__AARCH64EL__");
1502 Builder.defineMacro(
"__AARCH64EB__");
1503 Builder.defineMacro(
"__AARCH_BIG_ENDIAN");
1504 Builder.defineMacro(
"__ARM_BIG_ENDIAN");
1508void AArch64beTargetInfo::setDataLayout() {
1509 assert(!
getTriple().isOSBinFormatMachO());
1510 resetDataLayout(
"E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
1519 IntWidth = IntAlign = 32;
1520 LongWidth = LongAlign = 32;
1521 DoubleAlign = LongLongAlign = 64;
1522 LongDoubleWidth = LongDoubleAlign = 64;
1523 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
1524 IntMaxType = SignedLongLong;
1525 Int64Type = SignedLongLong;
1526 SizeType = UnsignedLongLong;
1527 PtrDiffType = SignedLongLong;
1528 IntPtrType = SignedLongLong;
1532 resetDataLayout(Triple.isOSBinFormatMachO()
1533 ?
"e-m:o-i64:64-i128:128-n32:64-S128"
1534 :
"e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128",
1535 Triple.isOSBinFormatMachO() ?
"_" :
"");
1547 if (getTriple().isWindowsArm64EC())
1563 return CCCR_Warning;
1570 TheCXXABI.set(TargetCXXABI::Microsoft);
1576 if (getTriple().isWindowsArm64EC()) {
1577 Builder.defineMacro(
"_M_X64",
"100");
1578 Builder.defineMacro(
"_M_AMD64",
"100");
1579 Builder.defineMacro(
"_M_ARM64EC",
"1");
1581 Builder.defineMacro(
"_M_ARM64",
"1");
1587 return CCK_MicrosoftWin64;
1591 bool HasNonWeakDef)
const {
1593 WindowsARM64TargetInfo::getMinGlobalAlign(TypeSize, HasNonWeakDef);
1599 if (TypeSize >= 512) {
1600 Align = std::max(Align, 128u);
1601 }
else if (TypeSize >= 64) {
1602 Align = std::max(Align, 64u);
1603 }
else if (TypeSize >= 16) {
1604 Align = std::max(Align, 32u);
1612 TheCXXABI.set(TargetCXXABI::GenericAArch64);
1618 Int64Type = SignedLongLong;
1619 if (getTriple().isArch32Bit())
1620 IntMaxType = SignedLongLong;
1622 WCharType = SignedInt;
1623 UseSignedCharForObjCBool =
false;
1625 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
1626 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
1628 UseZeroLengthBitfieldAlignment =
false;
1630 if (getTriple().isArch32Bit()) {
1631 UseBitFieldTypeAlignment =
false;
1632 ZeroLengthBitfieldBoundary = 32;
1633 UseZeroLengthBitfieldAlignment =
true;
1634 TheCXXABI.set(TargetCXXABI::WatchOS);
1636 TheCXXABI.set(TargetCXXABI::AppleARM64);
1640 const llvm::Triple &Triple,
1642 Builder.defineMacro(
"__AARCH64_SIMD__");
1643 if (Triple.isArch32Bit())
1644 Builder.defineMacro(
"__ARM64_ARCH_8_32__");
1646 Builder.defineMacro(
"__ARM64_ARCH_8__");
1647 Builder.defineMacro(
"__ARM_NEON__");
1648 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
1649 Builder.defineMacro(
"__arm64",
"1");
1650 Builder.defineMacro(
"__arm64__",
"1");
1652 if (Triple.isArm64e())
1653 Builder.defineMacro(
"__arm64e__",
"1");
1668 Triple.getEnvironmentName()),
1675 Builder.defineMacro(
"__RENDERSCRIPT__");
Defines the Diagnostic-related interfaces.
static unsigned matchAsmCCConstraint(const char *Name)
static constexpr Builtin::Info BuiltinInfo[]
static constexpr Builtin::Info BuiltinInfo[]
Defines the clang::LangOptions interface.
Enumerates target-specific builtins in their own namespaces within namespace clang.
__device__ __2f16 float c
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,.
@ BKey
Return address signing uses APIB key.
@ 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 isSignReturnAddressWithAKey() const
Check if return address signing uses AKey.
bool hasSignReturnAddress() const
Check if return address signing is enabled.
bool isSignReturnAddressScopeAll() const
Check if leaf functions are also signed.
Exposes information about the current target.
TargetOptions & getTargetOpts() const
Retrieve the target options.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
unsigned HasAArch64SVETypes
void resetDataLayout(StringRef DL, const char *UserLabelPrefix="")
BuiltinVaListKind
The different kinds of __builtin_va_list types defined by the target implementation.
@ AArch64ABIBuiltinVaList
__builtin_va_list as defined by the AArch64 ABI http://infocenter.arm.com/help/topic/com....
@ CharPtrBuiltinVaList
typedef char* __builtin_va_list;
unsigned IsRenderScriptTarget
unsigned HasUnalignedAccess
unsigned char MaxAtomicPromoteWidth
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 ...
virtual std::string convertConstraint(const char *&Constraint) const
unsigned char MaxAtomicInlineWidth
unsigned HasBuiltinMSVaList
Options for controlling the target.
llvm::EABI EABIVersion
The EABI version to use.
void getTargetDefinesARMV95A(const LangOptions &Opts, MacroBuilder &Builder) const
unsigned multiVersionSortPriority(StringRef Name) const override
std::string_view getClobbers() const override
Returns a string of target-specific clobbers, in LLVM format.
bool hasFeature(StringRef Feature) const override
Determine whether the given target has the given feature.
std::string convertConstraint(const char *&Constraint) const override
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
bool hasBFloat16Type() const override
Determine whether the _BFloat16 type is supported on this target.
ParsedTargetAttr parseTargetAttr(StringRef Str) const override
AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
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 ...
unsigned multiVersionFeatureCost() const override
ArrayRef< const char * > getGCCRegNames() const override
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
Perform initialization based on the user configured set of features (e.g., +sse4).
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
void setFeatureEnabled(llvm::StringMap< bool > &Features, StringRef Name, bool Enabled) const override
Enable or disable a specific target feature; the feature name must be valid.
void getTargetDefinesARMV89A(const LangOptions &Opts, MacroBuilder &Builder) const
void getTargetDefinesARMV92A(const LangOptions &Opts, MacroBuilder &Builder) const
StringRef getFeatureDependencies(StringRef Name) const override
For given feature return dependent ones.
bool validateTarget(DiagnosticsEngine &Diags) const override
Check the target is valid after it is fully initialized.
void getTargetDefinesARMV93A(const LangOptions &Opts, MacroBuilder &Builder) const
bool setABI(const std::string &Name) override
Use the specified ABI.
void getTargetDefinesARMV84A(const LangOptions &Opts, MacroBuilder &Builder) const
bool isValidCPUName(StringRef Name) const override
Determine whether this TargetInfo supports the given CPU name.
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
StringRef getABI() const override
Get the ABI currently in use.
bool hasInt128Type() const override
Determine whether the __int128 type is supported on this target.
void getTargetDefinesARMV88A(const LangOptions &Opts, MacroBuilder &Builder) const
bool validateBranchProtection(StringRef Spec, StringRef Arch, BranchProtectionInfo &BPI, StringRef &Err) const override
Determine if this TargetInfo supports the given branch protection specification.
void getTargetDefinesARMV87A(const LangOptions &Opts, MacroBuilder &Builder) const
void getTargetDefinesARMV9A(const LangOptions &Opts, MacroBuilder &Builder) const
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
void getTargetDefinesARMV91A(const LangOptions &Opts, MacroBuilder &Builder) const
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
int getEHDataRegisterNumber(unsigned RegNo) const override
Return the register number that __builtin_eh_return_regno would return with the specified argument.
void getTargetDefinesARMV81A(const LangOptions &Opts, MacroBuilder &Builder) const
ArrayRef< Builtin::Info > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
void getTargetDefinesARMV86A(const LangOptions &Opts, MacroBuilder &Builder) const
bool setCPU(const std::string &Name) override
Target the specified CPU.
std::optional< std::pair< unsigned, unsigned > > getVScaleRange(const LangOptions &LangOpts) const override
Returns target-specific min and max values VScale_Range.
void getTargetDefinesARMV94A(const LangOptions &Opts, MacroBuilder &Builder) const
bool validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size, std::string &SuggestedModifier) const override
bool isCLZForZeroUndef() const override
The __builtin_clz* and __builtin_ctz* built-in functions are specified to have undefined results for ...
void getTargetDefinesARMV82A(const LangOptions &Opts, MacroBuilder &Builder) const
void getTargetDefinesARMV83A(const LangOptions &Opts, MacroBuilder &Builder) const
bool validateCpuSupports(StringRef FeatureStr) const override
bool validatePointerAuthKey(const llvm::APSInt &value) const override
Determine whether the given pointer-authentication key is valid.
bool validateAsmConstraint(const char *&Name, TargetInfo::ConstraintInfo &Info) const override
bool doesFeatureAffectCodeGen(StringRef Name) const override
Returns true if feature has an impact on target code generation.
void getTargetDefinesARMV85A(const LangOptions &Opts, MacroBuilder &Builder) const
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
BuiltinVaListKind getBuiltinVaListKind() const override
unsigned getMinGlobalAlign(uint64_t TypeSize, bool HasNonWeakDef) const override
MicrosoftARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
TargetInfo::CallingConvKind getCallingConvKind(bool ClangABICompat4) const override
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
MinGWARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
RenderScript64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
BuiltinVaListKind getBuiltinVaListKind() const override
WindowsARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void setDataLayout() override
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Defines the clang::TargetInfo interface.
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.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Diagnostic wrappers for TextAPI types for error reporting.
Contains information gathered from parsing the contents of TargetAttr.
LangOptions::SignReturnAddressScopeKind SignReturnAddr
LangOptions::SignReturnAddressKeyKind SignKey
bool BranchProtectionPAuthLR
bool BranchTargetEnforcement
unsigned UseZeroLengthBitfieldAlignment
Whether zero length bitfields (e.g., int : 0;) force alignment of the next bitfield.
unsigned short SuitableAlign
unsigned char PointerWidth
const llvm::fltSemantics * LongDoubleFormat
unsigned UseBitFieldTypeAlignment
Control whether the alignment of bit-field types is respected when laying out structures.
unsigned char PointerAlign
unsigned char BFloat16Width
unsigned char LongDoubleAlign
unsigned char LongDoubleWidth
unsigned char BFloat16Align
const llvm::fltSemantics * BFloat16Format