17#include "llvm/ADT/ArrayRef.h"
18#include "llvm/ADT/StringExtras.h"
19#include "llvm/ADT/StringSwitch.h"
20#include "llvm/TargetParser/AArch64TargetParser.h"
21#include "llvm/TargetParser/ARMTargetParserCommon.h"
28#define BUILTIN(ID, TYPE, ATTRS) \
29 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
30#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
31 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
32#include "clang/Basic/BuiltinsNEON.def"
34#define BUILTIN(ID, TYPE, ATTRS) \
35 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
36#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
37 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
38#include "clang/Basic/BuiltinsSVE.def"
40#define BUILTIN(ID, TYPE, ATTRS) \
41 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
42#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
43 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
44#include "clang/Basic/BuiltinsSME.def"
46#define BUILTIN(ID, TYPE, ATTRS) \
47 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
48#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
49 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, LANG},
50#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
51 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
52#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
53 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::HEADER, LANGS},
54#include "clang/Basic/BuiltinsAArch64.def"
58 if (*ArchInfo == llvm::AArch64::ARMV8R) {
68 }
else if (ArchInfo->Version.getMajor() == 8) {
69 if (ArchInfo->Version.getMinor() >= 7u) {
72 if (ArchInfo->Version.getMinor() >= 6u) {
76 if (ArchInfo->Version.getMinor() >= 5u) {
77 HasAlternativeNZCV =
true;
84 if (ArchInfo->Version.getMinor() >= 4u) {
89 if (ArchInfo->Version.getMinor() >= 3u) {
93 if (ArchInfo->Version.getMinor() >= 2u) {
96 if (ArchInfo->Version.getMinor() >= 1u) {
101 }
else if (ArchInfo->Version.getMajor() == 9) {
102 if (ArchInfo->Version.getMinor() >= 2u) {
105 if (ArchInfo->Version.getMinor() >= 1u) {
112 HasAlternativeNZCV =
true;
150 if (Triple.isArch64Bit())
192 if (Triple.getOS() == llvm::Triple::Linux)
194 else if (Triple.getOS() == llvm::Triple::UnknownOS)
196 Opts.
EABIVersion == llvm::EABI::GNU ?
"\01_mcount" :
"mcount";
202 if (Name !=
"aapcs" && Name !=
"darwinpcs")
211 StringRef &Err)
const {
212 llvm::ARM::ParsedBranchProtection PBP;
213 if (!llvm::ARM::parseBranchProtection(Spec, PBP, Err))
217 llvm::StringSwitch<LangOptions::SignReturnAddressScopeKind>(PBP.Scope)
222 if (PBP.Key ==
"a_key")
232 return Name ==
"generic" || llvm::AArch64::parseCpu(Name);
241 llvm::AArch64::fillValidCPUArchList(Values);
246 Builder.defineMacro(
"__ARM_FEATURE_QRDMX",
"1");
257 Builder.defineMacro(
"__ARM_FEATURE_COMPLEX",
"1");
258 Builder.defineMacro(
"__ARM_FEATURE_JCVT",
"1");
259 Builder.defineMacro(
"__ARM_FEATURE_PAUTH",
"1");
272 Builder.defineMacro(
"__ARM_FEATURE_FRINT",
"1");
273 Builder.defineMacro(
"__ARM_FEATURE_BTI",
"1");
339 Builder.defineMacro(
"__aarch64__");
341 Builder.defineMacro(
"__GCC_ASM_FLAG_OUTPUTS__");
344 if (CodeModel ==
"default")
346 for (
char &
c : CodeModel)
348 Builder.defineMacro(
"__AARCH64_CMODEL_" + CodeModel +
"__");
351 Builder.defineMacro(
"__ARM_ACLE",
"200");
352 Builder.defineMacro(
"__ARM_ARCH",
353 std::to_string(ArchInfo->Version.getMajor()));
354 Builder.defineMacro(
"__ARM_ARCH_PROFILE",
355 std::string(
"'") + (
char)ArchInfo->Profile +
"'");
357 Builder.defineMacro(
"__ARM_64BIT_STATE",
"1");
358 Builder.defineMacro(
"__ARM_PCS_AAPCS64",
"1");
359 Builder.defineMacro(
"__ARM_ARCH_ISA_A64",
"1");
361 Builder.defineMacro(
"__ARM_FEATURE_CLZ",
"1");
362 Builder.defineMacro(
"__ARM_FEATURE_FMA",
"1");
363 Builder.defineMacro(
"__ARM_FEATURE_LDREX",
"0xF");
364 Builder.defineMacro(
"__ARM_FEATURE_IDIV",
"1");
365 Builder.defineMacro(
"__ARM_FEATURE_DIV");
366 Builder.defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
367 Builder.defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
369 Builder.defineMacro(
"__ARM_ALIGN_MAX_STACK_PWR",
"4");
373 Builder.defineMacro(
"__ARM_FP",
"0xE");
377 Builder.defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
378 Builder.defineMacro(
"__ARM_FP16_ARGS",
"1");
380 if (Opts.UnsafeFPMath)
381 Builder.defineMacro(
"__ARM_FP_FAST",
"1");
383 Builder.defineMacro(
"__ARM_SIZEOF_WCHAR_T",
384 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
386 Builder.defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
388 if (FPU & NeonMode) {
389 Builder.defineMacro(
"__ARM_NEON",
"1");
391 Builder.defineMacro(
"__ARM_NEON_FP",
"0xE");
395 Builder.defineMacro(
"__ARM_FEATURE_SVE",
"1");
397 if ((FPU & NeonMode) && (FPU & SveMode))
398 Builder.defineMacro(
"__ARM_NEON_SVE_BRIDGE",
"1");
401 Builder.defineMacro(
"__ARM_FEATURE_SVE2",
"1");
403 if (HasSVE2 && HasSVE2AES)
404 Builder.defineMacro(
"__ARM_FEATURE_SVE2_AES",
"1");
406 if (HasSVE2 && HasSVE2BitPerm)
407 Builder.defineMacro(
"__ARM_FEATURE_SVE2_BITPERM",
"1");
409 if (HasSVE2 && HasSVE2SHA3)
410 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SHA3",
"1");
412 if (HasSVE2 && HasSVE2SM4)
413 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SM4",
"1");
416 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
419 Builder.defineMacro(
"__ARM_FEATURE_RCPC",
"1");
422 Builder.defineMacro(
"__HAVE_FUNCTION_MULTI_VERSIONING",
"1");
426 if (HasAES && HasSHA2)
427 Builder.defineMacro(
"__ARM_FEATURE_CRYPTO",
"1");
430 Builder.defineMacro(
"__ARM_FEATURE_AES",
"1");
433 Builder.defineMacro(
"__ARM_FEATURE_SHA2",
"1");
436 Builder.defineMacro(
"__ARM_FEATURE_SHA3",
"1");
437 Builder.defineMacro(
"__ARM_FEATURE_SHA512",
"1");
441 Builder.defineMacro(
"__ARM_FEATURE_SM3",
"1");
442 Builder.defineMacro(
"__ARM_FEATURE_SM4",
"1");
446 Builder.defineMacro(
"__ARM_FEATURE_PAUTH",
"1");
449 Builder.defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
451 if ((FPU & NeonMode) && HasFullFP16)
452 Builder.defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
454 Builder.defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
457 Builder.defineMacro(
"__ARM_FEATURE_DOTPROD",
"1");
460 Builder.defineMacro(
"__ARM_FEATURE_MEMORY_TAGGING",
"1");
463 Builder.defineMacro(
"__ARM_FEATURE_TME",
"1");
466 Builder.defineMacro(
"__ARM_FEATURE_MATMUL_INT8",
"1");
469 Builder.defineMacro(
"__ARM_FEATURE_ATOMICS",
"1");
472 Builder.defineMacro(
"__ARM_FEATURE_BF16",
"1");
473 Builder.defineMacro(
"__ARM_FEATURE_BF16_VECTOR_ARITHMETIC",
"1");
474 Builder.defineMacro(
"__ARM_BF16_FORMAT_ALTERNATIVE",
"1");
475 Builder.defineMacro(
"__ARM_FEATURE_BF16_SCALAR_ARITHMETIC",
"1");
478 if ((FPU & SveMode) && HasBFloat16) {
479 Builder.defineMacro(
"__ARM_FEATURE_SVE_BF16",
"1");
482 if ((FPU & SveMode) && HasMatmulFP64)
483 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP64",
"1");
485 if ((FPU & SveMode) && HasMatmulFP32)
486 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP32",
"1");
488 if ((FPU & SveMode) && HasMatMul)
489 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_INT8",
"1");
491 if ((FPU & NeonMode) && HasFP16FML)
492 Builder.defineMacro(
"__ARM_FEATURE_FP16_FML",
"1");
509 Builder.defineMacro(
"__ARM_FEATURE_PAC_DEFAULT", std::to_string(
Value));
512 if (Opts.BranchTargetEnforcement)
513 Builder.defineMacro(
"__ARM_FEATURE_BTI_DEFAULT",
"1");
516 Builder.defineMacro(
"__ARM_FEATURE_LS64",
"1");
519 Builder.defineMacro(
"__ARM_FEATURE_RNG",
"1");
522 Builder.defineMacro(
"__ARM_FEATURE_MOPS",
"1");
525 Builder.defineMacro(
"__ARM_FEATURE_SYSREG128",
"1");
527 if (*ArchInfo == llvm::AArch64::ARMV8_1A)
529 else if (*ArchInfo == llvm::AArch64::ARMV8_2A)
531 else if (*ArchInfo == llvm::AArch64::ARMV8_3A)
533 else if (*ArchInfo == llvm::AArch64::ARMV8_4A)
535 else if (*ArchInfo == llvm::AArch64::ARMV8_5A)
537 else if (*ArchInfo == llvm::AArch64::ARMV8_6A)
539 else if (*ArchInfo == llvm::AArch64::ARMV8_7A)
541 else if (*ArchInfo == llvm::AArch64::ARMV8_8A)
543 else if (*ArchInfo == llvm::AArch64::ARMV8_9A)
545 else if (*ArchInfo == llvm::AArch64::ARMV9A)
547 else if (*ArchInfo == llvm::AArch64::ARMV9_1A)
549 else if (*ArchInfo == llvm::AArch64::ARMV9_2A)
551 else if (*ArchInfo == llvm::AArch64::ARMV9_3A)
553 else if (*ArchInfo == llvm::AArch64::ARMV9_4A)
557 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
558 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
559 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
560 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
563 Builder.defineMacro(
"__FP_FAST_FMA",
"1");
564 Builder.defineMacro(
"__FP_FAST_FMAF",
"1");
568 Builder.defineMacro(
"__ARM_FEATURE_SVE_VECTOR_OPERATORS",
"2");
570 if (Opts.VScaleMin && Opts.VScaleMin == Opts.VScaleMax) {
571 Builder.defineMacro(
"__ARM_FEATURE_SVE_BITS", Twine(Opts.VScaleMin * 128));
580std::optional<std::pair<unsigned, unsigned>>
582 if (LangOpts.VScaleMin || LangOpts.VScaleMax)
583 return std::pair<unsigned, unsigned>(
584 LangOpts.VScaleMin ? LangOpts.VScaleMin : 1, LangOpts.VScaleMax);
587 return std::pair<unsigned, unsigned>(1, 16);
593 if (Name ==
"default")
595 for (
const auto &E : llvm::AArch64::Extensions)
597 return E.FmvPriority;
603 return llvm::AArch64::ExtensionInfo::MaxFMVPriority;
607 auto F = llvm::find_if(llvm::AArch64::Extensions, [&](
const auto &E) {
608 return Name == E.Name && !E.DependentFeatures.empty();
610 return F != std::end(llvm::AArch64::Extensions);
614 auto F = llvm::find_if(llvm::AArch64::Extensions,
615 [&](
const auto &E) {
return Name == E.Name; });
616 return F != std::end(llvm::AArch64::Extensions) ? F->DependentFeatures
621 for (
const auto &E : llvm::AArch64::Extensions)
622 if (FeatureStr == E.Name)
628 return llvm::StringSwitch<bool>(Feature)
629 .Cases(
"aarch64",
"arm64",
"arm",
true)
631 .Cases(
"neon",
"fp",
"simd", FPU & NeonMode)
632 .Case(
"jscvt", HasJSCVT)
633 .Case(
"fcma", HasFCMA)
634 .Case(
"rng", HasRandGen)
635 .Case(
"flagm", HasFlagM)
636 .Case(
"flagm2", HasAlternativeNZCV)
637 .Case(
"fp16fml", HasFP16FML)
638 .Case(
"dotprod", HasDotProd)
643 .Case(
"sha2", HasSHA2)
644 .Case(
"sha3", HasSHA3)
645 .Cases(
"aes",
"pmull", HasAES)
646 .Cases(
"fp16",
"fullfp16", HasFullFP16)
648 .Case(
"dpb", HasCCPP)
649 .Case(
"dpb2", HasCCDP)
650 .Case(
"rcpc", HasRCPC)
651 .Case(
"frintts", HasFRInt3264)
652 .Case(
"i8mm", HasMatMul)
653 .Case(
"bf16", HasBFloat16)
654 .Case(
"sve", FPU & SveMode)
655 .Case(
"sve-bf16", FPU & SveMode && HasBFloat16)
656 .Case(
"sve-i8mm", FPU & SveMode && HasMatMul)
657 .Case(
"f32mm", FPU & SveMode && HasMatmulFP32)
658 .Case(
"f64mm", FPU & SveMode && HasMatmulFP64)
659 .Case(
"sve2", FPU & SveMode && HasSVE2)
660 .Case(
"sve2-pmull128", FPU & SveMode && HasSVE2AES)
661 .Case(
"sve2-bitperm", FPU & SveMode && HasSVE2BitPerm)
662 .Case(
"sve2-sha3", FPU & SveMode && HasSVE2SHA3)
663 .Case(
"sve2-sm4", FPU & SveMode && HasSVE2SM4)
665 .Case(
"sme-f64f64", HasSMEF64F64)
666 .Case(
"sme-i16i64", HasSMEI16I64)
667 .Cases(
"memtag",
"memtag2", HasMTE)
669 .Case(
"predres", HasPredRes)
670 .Cases(
"ssbs",
"ssbs2", HasSSBS)
672 .Cases(
"ls64",
"ls64_v",
"ls64_accdata", HasLS64)
673 .Case(
"wfxt", HasWFxT)
678 StringRef Name,
bool Enabled)
const {
679 Features[Name] = Enabled;
682 const std::optional<llvm::AArch64::ArchInfo> ArchInfo =
683 llvm::AArch64::ArchInfo::findBySubArch(Name);
692 for (
const auto *OtherArch : llvm::AArch64::ArchInfos)
693 if (ArchInfo->implies(*OtherArch))
694 Features[OtherArch->getSubArch()] =
true;
697 std::vector<StringRef> CPUFeats;
698 if (llvm::AArch64::getExtensionFeatures(ArchInfo->DefaultExts, CPUFeats)) {
699 for (
auto F : CPUFeats) {
700 assert(F[0] ==
'+' &&
"Expected + in target feature!");
701 Features[F.drop_front(1)] =
true;
708 for (
const auto &Feature : Features) {
709 if (Feature ==
"-fp-armv8")
711 if (Feature ==
"-neon")
713 if (Feature ==
"-sve")
716 if (Feature ==
"+neon" || Feature ==
"+fp-armv8")
718 if (Feature ==
"+jscvt") {
722 if (Feature ==
"+fcma") {
727 if (Feature ==
"+sve") {
732 if (Feature ==
"+sve2") {
738 if (Feature ==
"+sve2-aes") {
745 if (Feature ==
"+sve2-sha3") {
752 if (Feature ==
"+sve2-sm4") {
759 if (Feature ==
"+sve2-bitperm") {
764 HasSVE2BitPerm =
true;
766 if (Feature ==
"+f32mm") {
770 HasMatmulFP32 =
true;
772 if (Feature ==
"+f64mm") {
776 HasMatmulFP64 =
true;
778 if (Feature ==
"+sme") {
783 if (Feature ==
"+sme-f64f64") {
789 if (Feature ==
"+sme-i16i64") {
795 if (Feature ==
"+sb")
797 if (Feature ==
"+predres")
799 if (Feature ==
"+ssbs")
801 if (Feature ==
"+bti")
803 if (Feature ==
"+wfxt")
805 if (Feature ==
"-fmv")
807 if (Feature ==
"+crc")
809 if (Feature ==
"+rcpc")
811 if (Feature ==
"+aes") {
815 if (Feature ==
"+sha2") {
819 if (Feature ==
"+sha3") {
824 if (Feature ==
"+rdm") {
828 if (Feature ==
"+dit")
830 if (Feature ==
"+cccp")
832 if (Feature ==
"+ccdp") {
836 if (Feature ==
"+fptoint")
838 if (Feature ==
"+sm4") {
842 if (Feature ==
"+strict-align")
843 HasUnaligned =
false;
845 if (Feature ==
"+v8a" && ArchInfo->Version < llvm::AArch64::ARMV8A.Version)
846 ArchInfo = &llvm::AArch64::ARMV8A;
847 if (Feature ==
"+v8.1a" &&
848 ArchInfo->Version < llvm::AArch64::ARMV8_1A.Version)
849 ArchInfo = &llvm::AArch64::ARMV8_1A;
850 if (Feature ==
"+v8.2a" &&
851 ArchInfo->Version < llvm::AArch64::ARMV8_2A.Version)
852 ArchInfo = &llvm::AArch64::ARMV8_2A;
853 if (Feature ==
"+v8.3a" &&
854 ArchInfo->Version < llvm::AArch64::ARMV8_3A.Version)
855 ArchInfo = &llvm::AArch64::ARMV8_3A;
856 if (Feature ==
"+v8.4a" &&
857 ArchInfo->Version < llvm::AArch64::ARMV8_4A.Version)
858 ArchInfo = &llvm::AArch64::ARMV8_4A;
859 if (Feature ==
"+v8.5a" &&
860 ArchInfo->Version < llvm::AArch64::ARMV8_5A.Version)
861 ArchInfo = &llvm::AArch64::ARMV8_5A;
862 if (Feature ==
"+v8.6a" &&
863 ArchInfo->Version < llvm::AArch64::ARMV8_6A.Version)
864 ArchInfo = &llvm::AArch64::ARMV8_6A;
865 if (Feature ==
"+v8.7a" &&
866 ArchInfo->Version < llvm::AArch64::ARMV8_7A.Version)
867 ArchInfo = &llvm::AArch64::ARMV8_7A;
868 if (Feature ==
"+v8.8a" &&
869 ArchInfo->Version < llvm::AArch64::ARMV8_8A.Version)
870 ArchInfo = &llvm::AArch64::ARMV8_8A;
871 if (Feature ==
"+v8.9a" &&
872 ArchInfo->Version < llvm::AArch64::ARMV8_9A.Version)
873 ArchInfo = &llvm::AArch64::ARMV8_9A;
874 if (Feature ==
"+v9a" && ArchInfo->Version < llvm::AArch64::ARMV9A.Version)
875 ArchInfo = &llvm::AArch64::ARMV9A;
876 if (Feature ==
"+v9.1a" &&
877 ArchInfo->Version < llvm::AArch64::ARMV9_1A.Version)
878 ArchInfo = &llvm::AArch64::ARMV9_1A;
879 if (Feature ==
"+v9.2a" &&
880 ArchInfo->Version < llvm::AArch64::ARMV9_2A.Version)
881 ArchInfo = &llvm::AArch64::ARMV9_2A;
882 if (Feature ==
"+v9.3a" &&
883 ArchInfo->Version < llvm::AArch64::ARMV9_3A.Version)
884 ArchInfo = &llvm::AArch64::ARMV9_3A;
885 if (Feature ==
"+v9.4a" &&
886 ArchInfo->Version < llvm::AArch64::ARMV9_4A.Version)
887 ArchInfo = &llvm::AArch64::ARMV9_4A;
888 if (Feature ==
"+v8r")
889 ArchInfo = &llvm::AArch64::ARMV8R;
890 if (Feature ==
"+fullfp16") {
894 if (Feature ==
"+dotprod") {
898 if (Feature ==
"+fp16fml") {
903 if (Feature ==
"+mte")
905 if (Feature ==
"+tme")
907 if (Feature ==
"+pauth")
909 if (Feature ==
"+i8mm")
911 if (Feature ==
"+bf16")
913 if (Feature ==
"+lse")
915 if (Feature ==
"+ls64")
917 if (Feature ==
"+rand")
919 if (Feature ==
"+flagm")
921 if (Feature ==
"+altnzcv") {
923 HasAlternativeNZCV =
true;
925 if (Feature ==
"+mops")
927 if (Feature ==
"+d128")
929 if (Feature ==
"+gcs")
936 for (
const auto &Feature : Features) {
937 if (Feature ==
"-d128")
961 const std::vector<std::string> &FeaturesVec)
const {
962 std::vector<std::string> UpdatedFeaturesVec;
964 std::optional<llvm::AArch64::CpuInfo> CpuInfo = llvm::AArch64::parseCpu(CPU);
966 uint64_t Exts = CpuInfo->getImpliedExtensions();
967 std::vector<StringRef> CPUFeats;
968 llvm::AArch64::getExtensionFeatures(Exts, CPUFeats);
969 for (
auto F : CPUFeats) {
970 assert((F[0] ==
'+' || F[0] ==
'-') &&
"Expected +/- in target feature!");
971 UpdatedFeaturesVec.push_back(F.str());
979 for (
const auto &Feature : FeaturesVec)
980 if (((Feature[0] ==
'?' || Feature[0] ==
'+')) &&
982 StringRef DepFeatures =
985 DepFeatures.split(AttrFeatures,
",");
986 for (
auto F : AttrFeatures)
987 UpdatedFeaturesVec.push_back(F.str());
989 for (
const auto &Feature : FeaturesVec)
990 if (Feature[0] !=
'?') {
991 std::string UpdatedFeature = Feature;
992 if (Feature[0] ==
'+') {
993 std::optional<llvm::AArch64::ExtensionInfo> Extension =
994 llvm::AArch64::parseArchExtension(Feature.substr(1));
996 UpdatedFeature = Extension->Feature.str();
998 UpdatedFeaturesVec.push_back(UpdatedFeature);
1012 if (Features ==
"default")
1015 Features.split(AttrFeatures,
",");
1016 bool FoundArch =
false;
1018 auto SplitAndAddFeatures = [](StringRef FeatString,
1019 std::vector<std::string> &Features) {
1021 FeatString.split(SplitFeatures, StringRef(
"+"), -1,
false);
1022 for (StringRef Feature : SplitFeatures) {
1023 StringRef FeatureName = llvm::AArch64::getArchExtFeature(Feature);
1024 if (!FeatureName.empty())
1025 Features.push_back(FeatureName.str());
1029 if (Feature.startswith(
"no"))
1030 Features.push_back(
"-" + Feature.drop_front(2).str());
1032 Features.push_back(
"+" + Feature.str());
1036 for (
auto &Feature : AttrFeatures) {
1037 Feature = Feature.trim();
1038 if (Feature.startswith(
"fpmath="))
1041 if (Feature.startswith(
"branch-protection=")) {
1042 Ret.BranchProtection = Feature.split(
'=').second.trim();
1046 if (Feature.startswith(
"arch=")) {
1048 Ret.Duplicate =
"arch=";
1050 std::pair<StringRef, StringRef> Split =
1051 Feature.split(
"=").second.trim().split(
"+");
1052 const std::optional<llvm::AArch64::ArchInfo> AI =
1053 llvm::AArch64::parseArch(Split.first);
1059 Ret.Features.push_back(AI->ArchFeature.str());
1061 SplitAndAddFeatures(Split.second, Ret.Features);
1062 }
else if (Feature.startswith(
"cpu=")) {
1063 if (!Ret.CPU.empty())
1064 Ret.Duplicate =
"cpu=";
1068 std::pair<StringRef, StringRef> Split =
1069 Feature.split(
"=").second.trim().split(
"+");
1070 Ret.CPU = Split.first;
1071 SplitAndAddFeatures(Split.second, Ret.Features);
1073 }
else if (Feature.startswith(
"tune=")) {
1074 if (!Ret.Tune.empty())
1075 Ret.Duplicate =
"tune=";
1077 Ret.Tune = Feature.split(
"=").second.trim();
1078 }
else if (Feature.startswith(
"+")) {
1079 SplitAndAddFeatures(Feature, Ret.Features);
1080 }
else if (Feature.startswith(
"no-")) {
1081 StringRef FeatureName =
1082 llvm::AArch64::getArchExtFeature(Feature.split(
"-").second);
1083 if (!FeatureName.empty())
1084 Ret.Features.push_back(
"-" + FeatureName.drop_front(1).str());
1086 Ret.Features.push_back(
"-" + Feature.split(
"-").second.str());
1091 StringRef FeatureName = llvm::AArch64::getArchExtFeature(Feature);
1092 if (!FeatureName.empty())
1093 Ret.Features.push_back(FeatureName.str());
1095 Ret.Features.push_back(
"+" + Feature.str());
1129const char *
const AArch64TargetInfo::GCCRegNames[] = {
1131 "w0",
"w1",
"w2",
"w3",
"w4",
"w5",
"w6",
"w7",
"w8",
"w9",
"w10",
"w11",
1132 "w12",
"w13",
"w14",
"w15",
"w16",
"w17",
"w18",
"w19",
"w20",
"w21",
"w22",
1133 "w23",
"w24",
"w25",
"w26",
"w27",
"w28",
"w29",
"w30",
"wsp",
1136 "x0",
"x1",
"x2",
"x3",
"x4",
"x5",
"x6",
"x7",
"x8",
"x9",
"x10",
"x11",
1137 "x12",
"x13",
"x14",
"x15",
"x16",
"x17",
"x18",
"x19",
"x20",
"x21",
"x22",
1138 "x23",
"x24",
"x25",
"x26",
"x27",
"x28",
"fp",
"lr",
"sp",
1141 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
1142 "s12",
"s13",
"s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
1143 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
1146 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
"d8",
"d9",
"d10",
"d11",
1147 "d12",
"d13",
"d14",
"d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
1148 "d23",
"d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
1151 "v0",
"v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
"v9",
"v10",
"v11",
1152 "v12",
"v13",
"v14",
"v15",
"v16",
"v17",
"v18",
"v19",
"v20",
"v21",
"v22",
1153 "v23",
"v24",
"v25",
"v26",
"v27",
"v28",
"v29",
"v30",
"v31",
1156 "z0",
"z1",
"z2",
"z3",
"z4",
"z5",
"z6",
"z7",
"z8",
"z9",
"z10",
1157 "z11",
"z12",
"z13",
"z14",
"z15",
"z16",
"z17",
"z18",
"z19",
"z20",
"z21",
1158 "z22",
"z23",
"z24",
"z25",
"z26",
"z27",
"z28",
"z29",
"z30",
"z31",
1161 "p0",
"p1",
"p2",
"p3",
"p4",
"p5",
"p6",
"p7",
"p8",
"p9",
"p10",
1162 "p11",
"p12",
"p13",
"p14",
"p15"
1202 {{
"r29",
"x29"},
"fp"},
1203 {{
"r30",
"x30"},
"lr"},
1214 constexpr unsigned len = 5;
1215 auto RV = llvm::StringSwitch<unsigned>(Name)
1239 switch (*Constraint) {
1241 R = std::string(
"@3") + std::string(Constraint, 3);
1246 std::string Converted =
"{" + std::string(Constraint, Len) +
"}";
1247 Constraint += Len - 1;
1250 return std::string(1, *Constraint);
1282 if (Name[1] ==
'p' && (Name[2] ==
'l' || Name[2] ==
'a')) {
1317 StringRef Constraint,
char Modifier,
unsigned Size,
1318 std::string &SuggestedModifier)
const {
1320 while (Constraint[0] ==
'=' || Constraint[0] ==
'+' || Constraint[0] ==
'&')
1321 Constraint = Constraint.substr(1);
1323 switch (Constraint[0]) {
1343 SuggestedModifier =
"w";
1366void AArch64leTargetInfo::setDataLayout() {
1373 resetDataLayout(
"e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
1378 Builder.defineMacro(
"__AARCH64EL__");
1388 Builder.defineMacro(
"__AARCH64EB__");
1389 Builder.defineMacro(
"__AARCH_BIG_ENDIAN");
1390 Builder.defineMacro(
"__ARM_BIG_ENDIAN");
1394void AArch64beTargetInfo::setDataLayout() {
1395 assert(!
getTriple().isOSBinFormatMachO());
1396 resetDataLayout(
"E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
1405 IntWidth = IntAlign = 32;
1406 LongWidth = LongAlign = 32;
1407 DoubleAlign = LongLongAlign = 64;
1408 LongDoubleWidth = LongDoubleAlign = 64;
1409 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
1410 IntMaxType = SignedLongLong;
1411 Int64Type = SignedLongLong;
1412 SizeType = UnsignedLongLong;
1413 PtrDiffType = SignedLongLong;
1414 IntPtrType = SignedLongLong;
1418 resetDataLayout(Triple.isOSBinFormatMachO()
1419 ?
"e-m:o-i64:64-i128:128-n32:64-S128"
1420 :
"e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128",
1421 Triple.isOSBinFormatMachO() ?
"_" :
"");
1446 return CCCR_Warning;
1453 TheCXXABI.set(TargetCXXABI::Microsoft);
1459 Builder.defineMacro(
"_M_ARM64",
"1");
1464 return CCK_MicrosoftWin64;
1468 unsigned Align = WindowsARM64TargetInfo::getMinGlobalAlign(TypeSize);
1474 if (TypeSize >= 512) {
1475 Align = std::max(Align, 128u);
1476 }
else if (TypeSize >= 64) {
1477 Align = std::max(Align, 64u);
1478 }
else if (TypeSize >= 16) {
1479 Align = std::max(Align, 32u);
1487 TheCXXABI.set(TargetCXXABI::GenericAArch64);
1493 Int64Type = SignedLongLong;
1494 if (getTriple().isArch32Bit())
1495 IntMaxType = SignedLongLong;
1497 WCharType = SignedInt;
1498 UseSignedCharForObjCBool =
false;
1500 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
1501 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
1503 UseZeroLengthBitfieldAlignment =
false;
1505 if (getTriple().isArch32Bit()) {
1506 UseBitFieldTypeAlignment =
false;
1507 ZeroLengthBitfieldBoundary = 32;
1508 UseZeroLengthBitfieldAlignment =
true;
1509 TheCXXABI.set(TargetCXXABI::WatchOS);
1511 TheCXXABI.set(TargetCXXABI::AppleARM64);
1515 const llvm::Triple &Triple,
1517 Builder.defineMacro(
"__AARCH64_SIMD__");
1518 if (Triple.isArch32Bit())
1519 Builder.defineMacro(
"__ARM64_ARCH_8_32__");
1521 Builder.defineMacro(
"__ARM64_ARCH_8__");
1522 Builder.defineMacro(
"__ARM_NEON__");
1523 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
1524 Builder.defineMacro(
"__arm64",
"1");
1525 Builder.defineMacro(
"__arm64__",
"1");
1527 if (Triple.isArm64e())
1528 Builder.defineMacro(
"__arm64e__",
"1");
1543 Triple.getEnvironmentName()),
1550 Builder.defineMacro(
"__RENDERSCRIPT__");
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.
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.
@ BKey
Return address signing uses APIB key.
@ AKey
Return address signing uses APIA key.
@ None
No signing for any function.
@ NonLeaf
Sign the return address of functions that spill LR.
@ All
Sign the return address of all functions,.
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 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.
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.
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
brief 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 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
MicrosoftARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
TargetInfo::CallingConvKind getCallingConvKind(bool ClangABICompat4) const override
unsigned getMinGlobalAlign(uint64_t TypeSize) 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)
CallingConv
CallingConv - Specifies the calling convention that a function uses.
YAML serialization mapping.
Contains information gathered from parsing the contents of TargetAttr.
LangOptions::SignReturnAddressScopeKind SignReturnAddr
LangOptions::SignReturnAddressKeyKind SignKey
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