18#include "llvm/ADT/APSInt.h"
19#include "llvm/ADT/ArrayRef.h"
20#include "llvm/ADT/StringSwitch.h"
21#include "llvm/TargetParser/AArch64TargetParser.h"
22#include "llvm/TargetParser/ARMTargetParserCommon.h"
47#define GET_BUILTIN_STR_TABLE
48#include "clang/Basic/BuiltinsAArch64.inc"
49#undef GET_BUILTIN_STR_TABLE
52#define GET_BUILTIN_INFOS
53#include "clang/Basic/BuiltinsAArch64.inc"
54#undef GET_BUILTIN_INFOS
58#define GET_BUILTIN_PREFIXED_INFOS
59#include "clang/Basic/BuiltinsAArch64.inc"
60#undef GET_BUILTIN_PREFIXED_INFOS
67#define GET_NEON_BUILTIN_STR_TABLE
68#include "clang/Basic/arm_neon.inc"
69#undef GET_NEON_BUILTIN_STR_TABLE
71static constexpr std::array<Builtin::Info, NumNeonBuiltins>
BuiltinInfos = {
72#define GET_NEON_BUILTIN_INFOS
73#include "clang/Basic/arm_neon.inc"
74#undef GET_NEON_BUILTIN_INFOS
78#define GET_NEON_BUILTIN_STR_TABLE
79#include "clang/Basic/arm_fp16.inc"
80#undef GET_NEON_BUILTIN_STR_TABLE
82static constexpr std::array<Builtin::Info, NumFp16Builtins>
BuiltinInfos = {
83#define GET_NEON_BUILTIN_INFOS
84#include "clang/Basic/arm_fp16.inc"
85#undef GET_NEON_BUILTIN_INFOS
91#define GET_SVE_BUILTIN_STR_TABLE
92#include "clang/Basic/arm_sve_builtins.inc"
93#undef GET_SVE_BUILTIN_STR_TABLE
95static constexpr std::array<Builtin::Info, NumSVEBuiltins>
BuiltinInfos = {
96#define GET_SVE_BUILTIN_INFOS
97#include "clang/Basic/arm_sve_builtins.inc"
98#undef GET_SVE_BUILTIN_INFOS
103#define GET_SME_BUILTIN_STR_TABLE
104#include "clang/Basic/arm_sme_builtins.inc"
105#undef GET_SME_BUILTIN_STR_TABLE
107static constexpr std::array<Builtin::Info, NumSMEBuiltins>
BuiltinInfos = {
108#define GET_SME_BUILTIN_INFOS
109#include "clang/Basic/arm_sme_builtins.inc"
110#undef GET_SME_BUILTIN_INFOS
117#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
118#define GET_SVE_BUILTINS
119#include "clang/Basic/BuiltinsAArch64NeonSVEBridge.def"
120#undef GET_SVE_BUILTINS
126#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
127#define GET_SVE_BUILTINS
128#include "clang/Basic/BuiltinsAArch64NeonSVEBridge.def"
129#undef GET_SVE_BUILTINS
155 if (Triple.isArch64Bit())
202 TheCXXABI.set(TargetCXXABI::GenericAArch64);
204 if (Triple.getOS() == llvm::Triple::Linux)
205 this->MCountName =
"\01_mcount";
206 else if (Triple.getOS() == llvm::Triple::UnknownOS)
208 Opts.
EABIVersion == llvm::EABI::GNU ?
"\01_mcount" :
"mcount";
214 if (Name !=
"aapcs" && Name !=
"aapcs-soft" && Name !=
"darwinpcs")
225 Diags.
Report(diag::err_target_unsupported_abi_with_fpu) <<
ABI;
232 StringRef RegName,
unsigned RegSize,
bool &HasSizeMismatch)
const {
233 if (RegName ==
"sp") {
234 HasSizeMismatch = RegSize != 64;
237 if (RegName.starts_with(
"w"))
238 HasSizeMismatch = RegSize != 32;
239 else if (RegName.starts_with(
"x"))
240 HasSizeMismatch = RegSize != 64;
243 StringRef RegNum = RegName.drop_front();
246 return RegNum ==
"0" ||
248 llvm::AArch64::isX18ReservedByDefault(
getTriple())) ||
255 StringRef &Err)
const {
256 llvm::ARM::ParsedBranchProtection PBP;
257 if (!llvm::ARM::parseBranchProtection(Spec, PBP, Err, HasPAuthLR))
262 if (LO.PointerAuthReturns &&
263 (PBP.Scope !=
"none" || PBP.BranchProtectionPAuthLR ||
264 PBP.GuardedControlStack))
268 llvm::StringSwitch<LangOptions::SignReturnAddressScopeKind>(PBP.Scope)
273 if (PBP.Key ==
"a_key")
285 return llvm::AArch64::parseCpu(Name).has_value();
294 llvm::AArch64::fillValidCPUArchList(Values);
299 Builder.defineMacro(
"__ARM_FEATURE_QRDMX",
"1");
310 Builder.defineMacro(
"__ARM_FEATURE_COMPLEX",
"1");
311 Builder.defineMacro(
"__ARM_FEATURE_JCVT",
"1");
324 Builder.defineMacro(
"__ARM_FEATURE_FRINT",
"1");
411 Builder.defineMacro(
"__amd64__");
412 Builder.defineMacro(
"__amd64");
413 Builder.defineMacro(
"__x86_64");
414 Builder.defineMacro(
"__x86_64__");
415 Builder.defineMacro(
"__arm64ec__");
417 Builder.defineMacro(
"__aarch64__");
421 Builder.defineMacro(
"__LFI__");
424 Builder.defineMacro(
"__GCC_ASM_FLAG_OUTPUTS__");
427 if (CodeModel ==
"default")
429 for (
char &
c : CodeModel)
431 Builder.defineMacro(
"__AARCH64_CMODEL_" + CodeModel +
"__");
434 Builder.defineMacro(
"__ARM_ACLE_VERSION(year, quarter, patch)",
435 "(100 * (year) + 10 * (quarter) + (patch))");
436#define ARM_ACLE_VERSION(Y, Q, P) (100 * (Y) + 10 * (Q) + (P))
438 Builder.defineMacro(
"__FUNCTION_MULTI_VERSIONING_SUPPORT_LEVEL",
440#undef ARM_ACLE_VERSION
441 Builder.defineMacro(
"__ARM_ARCH",
442 std::to_string(ArchInfo->Version.getMajor()));
443 Builder.defineMacro(
"__ARM_ARCH_PROFILE",
444 std::string(
"'") + (
char)ArchInfo->Profile +
"'");
446 Builder.defineMacro(
"__ARM_64BIT_STATE",
"1");
447 Builder.defineMacro(
"__ARM_PCS_AAPCS64",
"1");
448 Builder.defineMacro(
"__ARM_ARCH_ISA_A64",
"1");
450 Builder.defineMacro(
"__ARM_FEATURE_CLZ",
"1");
451 Builder.defineMacro(
"__ARM_FEATURE_FMA",
"1");
452 Builder.defineMacro(
"__ARM_FEATURE_LDREX",
"0xF");
453 Builder.defineMacro(
"__ARM_FEATURE_IDIV",
"1");
454 Builder.defineMacro(
"__ARM_FEATURE_DIV");
455 Builder.defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
456 Builder.defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
458 Builder.defineMacro(
"__ARM_ALIGN_MAX_STACK_PWR",
"4");
462 Builder.defineMacro(
"__ARM_STATE_ZA",
"1");
463 Builder.defineMacro(
"__ARM_STATE_ZT0",
"1");
467 Builder.defineMacro(
"__ARM_FP",
"0xE");
471 Builder.defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
472 Builder.defineMacro(
"__ARM_FP16_ARGS",
"1");
475 Builder.defineMacro(
"__ARM_NEON_SVE_BRIDGE",
"1");
477 if (Opts.UnsafeFPMath)
478 Builder.defineMacro(
"__ARM_FP_FAST",
"1");
480 Builder.defineMacro(
"__ARM_SIZEOF_WCHAR_T",
481 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
483 Builder.defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
486 Builder.defineMacro(
"__ARM_PREFETCH_RANGE",
"1");
488 if (FPU & NeonMode) {
489 Builder.defineMacro(
"__ARM_NEON",
"1");
491 Builder.defineMacro(
"__ARM_NEON_FP",
"0xE");
495 Builder.defineMacro(
"__ARM_FEATURE_SVE",
"1");
498 Builder.defineMacro(
"__ARM_FEATURE_SVE2",
"1");
501 Builder.defineMacro(
"__ARM_FEATURE_SVE2p1",
"1");
503 if (HasSVE2 && HasSVEAES)
504 Builder.defineMacro(
"__ARM_FEATURE_SVE2_AES",
"1");
506 if (HasSVE2 && HasSVEBitPerm)
507 Builder.defineMacro(
"__ARM_FEATURE_SVE2_BITPERM",
"1");
509 if (HasSVE2 && HasSVE2SHA3)
510 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SHA3",
"1");
512 if (HasSVE2 && HasSVE2SM4)
513 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SM4",
"1");
516 Builder.defineMacro(
"__ARM_FEATURE_SVE_B16B16",
"1");
519 Builder.defineMacro(
"__ARM_FEATURE_SME");
520 Builder.defineMacro(
"__ARM_FEATURE_LOCALLY_STREAMING",
"1");
524 Builder.defineMacro(
"__ARM_FEATURE_SME2",
"1");
527 Builder.defineMacro(
"__ARM_FEATURE_SME2p1",
"1");
530 Builder.defineMacro(
"__ARM_FEATURE_SME_F16F16",
"1");
533 Builder.defineMacro(
"__ARM_FEATURE_SME_B16B16",
"1");
536 Builder.defineMacro(
"__ARM_FEATURE_FP8",
"1");
539 Builder.defineMacro(
"__ARM_FEATURE_FP8FMA",
"1");
542 Builder.defineMacro(
"__ARM_FEATURE_FP8DOT2",
"1");
545 Builder.defineMacro(
"__ARM_FEATURE_FP8DOT4",
"1");
548 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8DOT2",
"1");
551 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8DOT4",
"1");
554 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8FMA",
"1");
557 Builder.defineMacro(
"__ARM_FEATURE_SME_F8F32",
"1");
560 Builder.defineMacro(
"__ARM_FEATURE_SME_F8F16",
"1");
563 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
566 Builder.defineMacro(
"__ARM_FEATURE_CSSC",
"1");
569 Builder.defineMacro(
"__ARM_FEATURE_RCPC",
"3");
571 Builder.defineMacro(
"__ARM_FEATURE_RCPC",
"1");
574 Builder.defineMacro(
"__ARM_FEATURE_FPRCVT",
"1");
577 Builder.defineMacro(
"__ARM_FEATURE_F8F16MM",
"1");
580 Builder.defineMacro(
"__ARM_FEATURE_F8F32MM",
"1");
583 Builder.defineMacro(
"__ARM_FEATURE_SVE_F16F32MM",
"1");
586 Builder.defineMacro(
"__ARM_FEATURE_SVE_BFSCALE",
"1");
589 Builder.defineMacro(
"__ARM_FEATURE_SVE_AES2",
"1");
592 Builder.defineMacro(
"__ARM_FEATURE_SSVE_AES",
"1");
595 Builder.defineMacro(
"__ARM_FEATURE_SVE2p2",
"1");
598 Builder.defineMacro(
"__ARM_FEATURE_SME2p2",
"1");
601 Builder.defineMacro(
"__HAVE_FUNCTION_MULTI_VERSIONING",
"1");
605 if (HasAES && HasSHA2)
606 Builder.defineMacro(
"__ARM_FEATURE_CRYPTO",
"1");
609 Builder.defineMacro(
"__ARM_FEATURE_AES",
"1");
612 Builder.defineMacro(
"__ARM_FEATURE_SHA2",
"1");
615 Builder.defineMacro(
"__ARM_FEATURE_SHA3",
"1");
616 Builder.defineMacro(
"__ARM_FEATURE_SHA512",
"1");
620 Builder.defineMacro(
"__ARM_FEATURE_SM3",
"1");
621 Builder.defineMacro(
"__ARM_FEATURE_SM4",
"1");
625 Builder.defineMacro(
"__ARM_FEATURE_PAUTH",
"1");
628 Builder.defineMacro(
"__ARM_FEATURE_PAUTH_LR",
"1");
631 Builder.defineMacro(
"__ARM_FEATURE_BTI",
"1");
634 Builder.defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
636 if ((FPU & NeonMode) && HasFullFP16)
637 Builder.defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
639 Builder.defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
642 Builder.defineMacro(
"__ARM_FEATURE_DOTPROD",
"1");
645 Builder.defineMacro(
"__ARM_FEATURE_MEMORY_TAGGING",
"1");
648 Builder.defineMacro(
"__ARM_FEATURE_MATMUL_INT8",
"1");
651 Builder.defineMacro(
"__ARM_FEATURE_ATOMICS",
"1");
654 Builder.defineMacro(
"__ARM_FEATURE_BF16",
"1");
655 Builder.defineMacro(
"__ARM_FEATURE_BF16_VECTOR_ARITHMETIC",
"1");
656 Builder.defineMacro(
"__ARM_BF16_FORMAT_ALTERNATIVE",
"1");
657 Builder.defineMacro(
"__ARM_FEATURE_BF16_SCALAR_ARITHMETIC",
"1");
660 if ((FPU & SveMode) && HasBFloat16) {
661 Builder.defineMacro(
"__ARM_FEATURE_SVE_BF16",
"1");
664 if ((FPU & SveMode) && HasMatmulFP64)
665 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP64",
"1");
667 if ((FPU & SveMode) && HasMatmulFP32)
668 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP32",
"1");
670 if ((FPU & SveMode) && HasMatMul)
671 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_INT8",
"1");
673 if ((FPU & NeonMode) && HasFP16FML)
674 Builder.defineMacro(
"__ARM_FEATURE_FP16_FML",
"1");
692 if (Opts.BranchProtectionPAuthLR)
695 Builder.defineMacro(
"__ARM_FEATURE_PAC_DEFAULT", std::to_string(
Value));
698 if (Opts.BranchTargetEnforcement)
699 Builder.defineMacro(
"__ARM_FEATURE_BTI_DEFAULT",
"1");
701 if (Opts.GuardedControlStack)
702 Builder.defineMacro(
"__ARM_FEATURE_GCS_DEFAULT",
"1");
705 Builder.defineMacro(
"__ARM_FEATURE_LS64",
"1");
708 Builder.defineMacro(
"__ARM_FEATURE_RNG",
"1");
711 Builder.defineMacro(
"__ARM_FEATURE_MOPS",
"1");
714 Builder.defineMacro(
"__ARM_FEATURE_SYSREG128",
"1");
717 Builder.defineMacro(
"__ARM_FEATURE_GCS",
"1");
719 if (*ArchInfo == llvm::AArch64::ARMV8_1A)
721 else if (*ArchInfo == llvm::AArch64::ARMV8_2A)
723 else if (*ArchInfo == llvm::AArch64::ARMV8_3A)
725 else if (*ArchInfo == llvm::AArch64::ARMV8_4A)
727 else if (*ArchInfo == llvm::AArch64::ARMV8_5A)
729 else if (*ArchInfo == llvm::AArch64::ARMV8_6A)
731 else if (*ArchInfo == llvm::AArch64::ARMV8_7A)
733 else if (*ArchInfo == llvm::AArch64::ARMV8_8A)
735 else if (*ArchInfo == llvm::AArch64::ARMV8_9A)
737 else if (*ArchInfo == llvm::AArch64::ARMV9A)
739 else if (*ArchInfo == llvm::AArch64::ARMV9_1A)
741 else if (*ArchInfo == llvm::AArch64::ARMV9_2A)
743 else if (*ArchInfo == llvm::AArch64::ARMV9_3A)
745 else if (*ArchInfo == llvm::AArch64::ARMV9_4A)
747 else if (*ArchInfo == llvm::AArch64::ARMV9_5A)
749 else if (*ArchInfo == llvm::AArch64::ARMV9_6A)
751 else if (*ArchInfo == llvm::AArch64::ARMV9_7A)
755 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
756 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
757 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
758 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
759 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
762 Builder.defineMacro(
"__FP_FAST_FMA",
"1");
763 Builder.defineMacro(
"__FP_FAST_FMAF",
"1");
767 Builder.defineMacro(
"__ARM_FEATURE_SVE_VECTOR_OPERATORS",
"2");
769 if (Opts.VScaleMin && Opts.VScaleMin == Opts.VScaleMax) {
770 Builder.defineMacro(
"__ARM_FEATURE_SVE_BITS", Twine(Opts.VScaleMin * 128));
789std::optional<std::pair<unsigned, unsigned>>
792 llvm::StringMap<bool> *FeatureMap)
const {
794 (LangOpts.VScaleMin || LangOpts.VScaleMax))
795 return std::pair<unsigned, unsigned>(
796 LangOpts.VScaleMin ? LangOpts.VScaleMin : 1,
797 LangOpts.VScaleMax ? LangOpts.VScaleMax : 16);
800 (LangOpts.VScaleStreamingMin || LangOpts.VScaleStreamingMax))
801 return std::pair<unsigned, unsigned>(
802 LangOpts.VScaleStreamingMin ? LangOpts.VScaleStreamingMin : 1,
803 LangOpts.VScaleStreamingMax ? LangOpts.VScaleStreamingMax : 16);
806 ((LangOpts.VScaleMin && LangOpts.VScaleStreamingMin) ||
807 (LangOpts.VScaleMax && LangOpts.VScaleStreamingMax))) {
809 std::min(LangOpts.VScaleMin ? LangOpts.VScaleMin : 1,
810 LangOpts.VScaleStreamingMin ? LangOpts.VScaleStreamingMin : 1);
811 unsigned Max = std::max(
812 LangOpts.VScaleMax ? LangOpts.VScaleMax : 16,
813 LangOpts.VScaleStreamingMax ? LangOpts.VScaleStreamingMax : 16);
814 return std::pair(
Min,
Max);
817 if (
hasFeature(
"sve") || (FeatureMap && (FeatureMap->lookup(
"sve"))))
818 return std::pair<unsigned, unsigned>(1, 16);
821 (
hasFeature(
"sme") || (FeatureMap && (FeatureMap->lookup(
"sme")))))
822 return std::pair<unsigned, unsigned>(1, 16);
829 return llvm::AArch64::getFMVPriority(Features);
834 if (
auto Ext = llvm::AArch64::parseFMVExtension(Name))
835 return Ext->ID.has_value();
842 FeatureStr.split(Features,
"+");
844 if (!llvm::AArch64::parseFMVExtension(
Feature.trim()).has_value())
857 Features.insert(Feat);
863 Features.insert_range(Feats);
871void AArch64TargetInfo::computeFeatureLookup() {
872 FeatureLookupBuilder(HasFeatureLookup)
873 .Cases({
"aarch64",
"arm64",
"arm"},
true)
875 .Case(
"fp", FPU & FPUMode)
876 .Cases({
"neon",
"simd"}, FPU & NeonMode)
877 .Case(
"jscvt", HasJSCVT)
878 .Case(
"fcma", HasFCMA)
879 .Case(
"rng", HasRandGen)
880 .Case(
"flagm", HasFlagM)
881 .Case(
"flagm2", HasAlternativeNZCV)
882 .Case(
"fp16fml", HasFP16FML)
883 .Case(
"dotprod", HasDotProd)
888 .Case(
"cssc", HasCSSC)
889 .Case(
"sha2", HasSHA2)
890 .Case(
"sha3", HasSHA3)
891 .Cases({
"aes",
"pmull"}, HasAES)
892 .Cases({
"fp16",
"fullfp16"}, HasFullFP16)
894 .Case(
"dpb", HasCCPP)
895 .Case(
"dpb2", HasCCDP)
896 .Case(
"rcpc", HasRCPC)
897 .Case(
"frintts", HasFRInt3264)
898 .Case(
"i8mm", HasMatMul)
899 .Case(
"bf16", HasBFloat16)
900 .Case(
"sve", FPU & SveMode)
901 .Case(
"sve-b16b16", HasSVEB16B16)
902 .Case(
"f32mm", FPU & SveMode && HasMatmulFP32)
903 .Case(
"f64mm", FPU & SveMode && HasMatmulFP64)
904 .Case(
"sve2", FPU & SveMode && HasSVE2)
905 .Case(
"sve-aes", HasSVEAES)
906 .Case(
"sve-bitperm", FPU & HasSVEBitPerm)
907 .Case(
"sve2-sha3", FPU & SveMode && HasSVE2SHA3)
908 .Case(
"sve2-sm4", FPU & SveMode && HasSVE2SM4)
909 .Case(
"sve2p1", FPU & SveMode && HasSVE2p1)
911 .Case(
"sme2", HasSME2)
912 .Case(
"sme2p1", HasSME2p1)
913 .Case(
"sme-f64f64", HasSMEF64F64)
914 .Case(
"sme-i16i64", HasSMEI16I64)
915 .Case(
"sme-fa64", HasSMEFA64)
916 .Case(
"sme-f16f16", HasSMEF16F16)
917 .Case(
"sme-b16b16", HasSMEB16B16)
918 .Case(
"memtag", HasMTE)
920 .Case(
"predres", HasPredRes)
921 .Cases({
"ssbs",
"ssbs2"}, HasSSBS)
923 .Cases({
"ls64",
"ls64_v",
"ls64_accdata"}, HasLS64)
924 .Case(
"wfxt", HasWFxT)
925 .Case(
"rcpc3", HasRCPC3)
927 .Case(
"fp8fma", HasFP8FMA)
928 .Case(
"fp8dot2", HasFP8DOT2)
929 .Case(
"fp8dot4", HasFP8DOT4)
930 .Case(
"ssve-fp8dot2", HasSSVE_FP8DOT2)
931 .Case(
"ssve-fp8dot4", HasSSVE_FP8DOT4)
932 .Case(
"ssve-fp8fma", HasSSVE_FP8FMA)
933 .Case(
"sme-f8f32", HasSME_F8F32)
934 .Case(
"sme-f8f16", HasSME_F8F16)
935 .Case(
"fprcvt", HasFPRCVT)
936 .Case(
"f8f16mm", HasF8F16MM)
937 .Case(
"f8f32mm", HasF8F32MM)
938 .Case(
"sve-f16f32mm", HasSVE_F16F32MM)
939 .Case(
"sve-bfscale", HasSVE_BFSCALE)
940 .Case(
"sve-aes2", HasSVE_AES2)
941 .Case(
"ssve-aes", HasSSVE_AES)
942 .Case(
"sve2p2", FPU & SveMode && HasSVE2p2)
943 .Case(
"sme2p2", HasSME2p2);
947 return HasFeatureLookup.contains(
Feature);
951 StringRef Name,
bool Enabled)
const {
952 Features[Name] = Enabled;
955 const std::optional<llvm::AArch64::ArchInfo> ArchInfo =
956 llvm::AArch64::ArchInfo::findBySubArch(Name);
965 for (
const auto *OtherArch : llvm::AArch64::ArchInfos)
966 if (ArchInfo->implies(*OtherArch))
967 Features[OtherArch->getSubArch()] =
true;
970 std::vector<StringRef> CPUFeats;
971 if (llvm::AArch64::getExtensionFeatures(ArchInfo->DefaultExts, CPUFeats)) {
972 for (
auto F : CPUFeats) {
973 assert(F[0] ==
'+' &&
"Expected + in target feature!");
974 Features[F.drop_front(1)] =
true;
981 for (
const auto &
Feature : Features) {
1023 if (
Feature ==
"+sve2-sha3") {
1038 HasSVEB16B16 =
true;
1039 if (
Feature ==
"+sve-bitperm") {
1042 HasSVEBitPerm =
true;
1048 HasMatmulFP32 =
true;
1054 HasMatmulFP64 =
true;
1074 if (
Feature ==
"+sme-f64f64") {
1076 HasSMEF64F64 =
true;
1080 if (
Feature ==
"+sme-i16i64") {
1082 HasSMEI16I64 =
true;
1093 if (
Feature ==
"+sme-f16f16") {
1098 HasSMEF16F16 =
true;
1100 if (
Feature ==
"+sme-b16b16") {
1105 HasSVEB16B16 =
true;
1106 HasSMEB16B16 =
true;
1117 if (
Feature ==
"+ssve-fp8dot2")
1118 HasSSVE_FP8DOT2 =
true;
1119 if (
Feature ==
"+ssve-fp8dot4")
1120 HasSSVE_FP8DOT4 =
true;
1121 if (
Feature ==
"+ssve-fp8fma")
1122 HasSSVE_FP8FMA =
true;
1124 HasSME_F8F32 =
true;
1126 HasSME_F8F16 =
true;
1169 HasFRInt3264 =
true;
1174 if (
Feature ==
"+strict-align")
1182 if (
Feature ==
"+sve-f16f32mm")
1183 HasSVE_F16F32MM =
true;
1184 if (
Feature ==
"+sve-bfscale")
1185 HasSVE_BFSCALE =
true;
1196 if (
Feature ==
"+v8a" && ArchInfo->Version < llvm::AArch64::ARMV8A.Version)
1197 ArchInfo = &llvm::AArch64::ARMV8A;
1199 ArchInfo->Version < llvm::AArch64::ARMV8_1A.Version)
1200 ArchInfo = &llvm::AArch64::ARMV8_1A;
1202 ArchInfo->Version < llvm::AArch64::ARMV8_2A.Version)
1203 ArchInfo = &llvm::AArch64::ARMV8_2A;
1205 ArchInfo->Version < llvm::AArch64::ARMV8_3A.Version)
1206 ArchInfo = &llvm::AArch64::ARMV8_3A;
1208 ArchInfo->Version < llvm::AArch64::ARMV8_4A.Version)
1209 ArchInfo = &llvm::AArch64::ARMV8_4A;
1211 ArchInfo->Version < llvm::AArch64::ARMV8_5A.Version)
1212 ArchInfo = &llvm::AArch64::ARMV8_5A;
1214 ArchInfo->Version < llvm::AArch64::ARMV8_6A.Version)
1215 ArchInfo = &llvm::AArch64::ARMV8_6A;
1217 ArchInfo->Version < llvm::AArch64::ARMV8_7A.Version)
1218 ArchInfo = &llvm::AArch64::ARMV8_7A;
1220 ArchInfo->Version < llvm::AArch64::ARMV8_8A.Version)
1221 ArchInfo = &llvm::AArch64::ARMV8_8A;
1223 ArchInfo->Version < llvm::AArch64::ARMV8_9A.Version)
1224 ArchInfo = &llvm::AArch64::ARMV8_9A;
1225 if (
Feature ==
"+v9a" && ArchInfo->Version < llvm::AArch64::ARMV9A.Version)
1226 ArchInfo = &llvm::AArch64::ARMV9A;
1228 ArchInfo->Version < llvm::AArch64::ARMV9_1A.Version)
1229 ArchInfo = &llvm::AArch64::ARMV9_1A;
1231 ArchInfo->Version < llvm::AArch64::ARMV9_2A.Version)
1232 ArchInfo = &llvm::AArch64::ARMV9_2A;
1234 ArchInfo->Version < llvm::AArch64::ARMV9_3A.Version)
1235 ArchInfo = &llvm::AArch64::ARMV9_3A;
1237 ArchInfo->Version < llvm::AArch64::ARMV9_4A.Version)
1238 ArchInfo = &llvm::AArch64::ARMV9_4A;
1240 ArchInfo->Version < llvm::AArch64::ARMV9_5A.Version)
1241 ArchInfo = &llvm::AArch64::ARMV9_5A;
1243 ArchInfo->Version < llvm::AArch64::ARMV9_6A.Version)
1244 ArchInfo = &llvm::AArch64::ARMV9_6A;
1246 ArchInfo->Version < llvm::AArch64::ARMV9_7A.Version)
1247 ArchInfo = &llvm::AArch64::ARMV9_7A;
1249 ArchInfo = &llvm::AArch64::ARMV8R;
1281 HasAlternativeNZCV =
true;
1302 for (
const auto &
Feature : Features) {
1321 computeFeatureLookup();
1338 if (Features ==
"default")
1341 Features.split(AttrFeatures,
",");
1342 bool FoundArch =
false;
1344 auto SplitAndAddFeatures = [](StringRef FeatString,
1345 std::vector<std::string> &Features,
1346 llvm::AArch64::ExtensionSet &FeatureBits) {
1348 FeatString.split(SplitFeatures, StringRef(
"+"), -1,
false);
1349 for (StringRef
Feature : SplitFeatures) {
1350 if (FeatureBits.parseModifier(
Feature))
1358 if (
Feature.starts_with(
"no"))
1359 Features.push_back(
"-" +
Feature.drop_front(2).str());
1361 Features.push_back(
"+" +
Feature.str());
1365 llvm::AArch64::ExtensionSet FeatureBits;
1367 FeatureBits.reconstructFromParsedFeatures(
getTargetOpts().FeaturesAsWritten,
1370 for (
auto &
Feature : AttrFeatures) {
1372 if (
Feature.starts_with(
"fpmath="))
1375 if (
Feature.starts_with(
"branch-protection=")) {
1376 Ret.BranchProtection =
Feature.split(
'=').second.trim();
1380 if (
Feature.starts_with(
"arch=")) {
1382 Ret.Duplicate =
"arch=";
1384 std::pair<StringRef, StringRef> Split =
1385 Feature.split(
"=").second.trim().split(
"+");
1386 const llvm::AArch64::ArchInfo *AI = llvm::AArch64::parseArch(Split.first);
1392 FeatureBits.addArchDefaults(*AI);
1394 SplitAndAddFeatures(Split.second, Ret.Features, FeatureBits);
1395 }
else if (
Feature.starts_with(
"cpu=")) {
1396 if (!Ret.CPU.empty())
1397 Ret.Duplicate =
"cpu=";
1401 std::pair<StringRef, StringRef> Split =
1402 Feature.split(
"=").second.trim().split(
"+");
1403 Ret.CPU = Split.first;
1404 if (
auto CpuInfo = llvm::AArch64::parseCpu(Ret.CPU)) {
1405 FeatureBits.addCPUDefaults(*CpuInfo);
1406 SplitAndAddFeatures(Split.second, Ret.Features, FeatureBits);
1409 }
else if (
Feature.starts_with(
"tune=")) {
1410 if (!Ret.Tune.empty())
1411 Ret.Duplicate =
"tune=";
1413 Ret.Tune =
Feature.split(
"=").second.trim();
1414 }
else if (
Feature.starts_with(
"+")) {
1415 SplitAndAddFeatures(
Feature, Ret.Features, FeatureBits);
1417 if (FeatureBits.parseModifier(
Feature,
true))
1425 if (
Feature.starts_with(
"no-"))
1426 Ret.Features.push_back(
"-" +
Feature.drop_front(3).str());
1428 Ret.Features.push_back(
"+" +
Feature.str());
1431 FeatureBits.toLLVMFeatureList(Ret.Features);
1464const char *
const AArch64TargetInfo::GCCRegNames[] = {
1468 "w0",
"w1",
"w2",
"w3",
"w4",
"w5",
"w6",
"w7",
"w8",
"w9",
"w10",
"w11",
1469 "w12",
"w13",
"w14",
"w15",
"w16",
"w17",
"w18",
"w19",
"w20",
"w21",
"w22",
1470 "w23",
"w24",
"w25",
"w26",
"w27",
"w28",
"w29",
"w30",
"wsp",
1473 "x0",
"x1",
"x2",
"x3",
"x4",
"x5",
"x6",
"x7",
"x8",
"x9",
"x10",
"x11",
1474 "x12",
"x13",
"x14",
"x15",
"x16",
"x17",
"x18",
"x19",
"x20",
"x21",
"x22",
1475 "x23",
"x24",
"x25",
"x26",
"x27",
"x28",
"fp",
"lr",
"sp",
1478 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
1479 "s12",
"s13",
"s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
1480 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
1483 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
"d8",
"d9",
"d10",
"d11",
1484 "d12",
"d13",
"d14",
"d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
1485 "d23",
"d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
1488 "v0",
"v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
"v9",
"v10",
"v11",
1489 "v12",
"v13",
"v14",
"v15",
"v16",
"v17",
"v18",
"v19",
"v20",
"v21",
"v22",
1490 "v23",
"v24",
"v25",
"v26",
"v27",
"v28",
"v29",
"v30",
"v31",
1493 "z0",
"z1",
"z2",
"z3",
"z4",
"z5",
"z6",
"z7",
"z8",
"z9",
"z10",
1494 "z11",
"z12",
"z13",
"z14",
"z15",
"z16",
"z17",
"z18",
"z19",
"z20",
"z21",
1495 "z22",
"z23",
"z24",
"z25",
"z26",
"z27",
"z28",
"z29",
"z30",
"z31",
1498 "p0",
"p1",
"p2",
"p3",
"p4",
"p5",
"p6",
"p7",
"p8",
"p9",
"p10",
1499 "p11",
"p12",
"p13",
"p14",
"p15",
1502 "pn0",
"pn1",
"pn2",
"pn3",
"pn4",
"pn5",
"pn6",
"pn7",
"pn8",
1503 "pn9",
"pn10",
"pn11",
"pn12",
"pn13",
"pn14",
"pn15",
1548 {{
"r29",
"x29"},
"fp"},
1549 {{
"r30",
"x30"},
"lr"},
1560 constexpr unsigned len = 5;
1561 auto RV = llvm::StringSwitch<unsigned>(Name)
1585 switch (*Constraint) {
1587 R = std::string(
"@3") + std::string(Constraint, 3);
1592 std::string Converted =
"{" + std::string(Constraint, Len) +
"}";
1593 Constraint += Len - 1;
1596 return std::string(1, *Constraint);
1628 if (Name[1] ==
'p' &&
1629 (Name[2] ==
'l' || Name[2] ==
'a' || Name[2] ==
'h')) {
1635 if (Name[1] ==
'c' && (Name[2] ==
'i' || Name[2] ==
'j')) {
1671 StringRef Constraint,
char Modifier,
unsigned Size,
1672 std::string &SuggestedModifier)
const {
1674 Constraint = Constraint.ltrim(
"=+&");
1676 switch (Constraint[0]) {
1696 SuggestedModifier =
"w";
1714 const llvm::APSInt &value)
const {
1715 return 0 <= value && value <= 3;
1726 Builder.defineMacro(
"__AARCH64EL__");
1736 Builder.defineMacro(
"__AARCH64EB__");
1737 Builder.defineMacro(
"__AARCH_BIG_ENDIAN");
1738 Builder.defineMacro(
"__ARM_BIG_ENDIAN");
1800 Builder.defineMacro(
"_M_X64",
"100");
1801 Builder.defineMacro(
"_M_AMD64",
"100");
1802 Builder.defineMacro(
"_M_ARM64EC",
"1");
1804 Builder.defineMacro(
"_M_ARM64",
"1");
1814 bool HasNonWeakDef)
const {
1822 if (TypeSize >= 512) {
1823 Align = std::max(Align, 128u);
1824 }
else if (TypeSize >= 64) {
1825 Align = std::max(Align, 64u);
1826 }
else if (TypeSize >= 16) {
1827 Align = std::max(Align, 32u);
1835 TheCXXABI.set(TargetCXXABI::GenericAArch64);
1863 TheCXXABI.set(TargetCXXABI::AppleARM64);
1868 const llvm::Triple &Triple) {
1869 Builder.defineMacro(
"__AARCH64_SIMD__");
1870 if (Triple.isArch32Bit())
1871 Builder.defineMacro(
"__ARM64_ARCH_8_32__");
1873 Builder.defineMacro(
"__ARM64_ARCH_8__");
1874 Builder.defineMacro(
"__ARM_NEON__");
1875 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
1876 Builder.defineMacro(
"__arm64",
"1");
1877 Builder.defineMacro(
"__arm64__",
"1");
1879 if (Triple.isArm64e()) {
1880 Builder.defineMacro(
"__arm64e__",
"1");
1881 Builder.defineMacro(
"__PTRAUTH_INTRINSICS__",
"1");
1886 const llvm::Triple &Triple,
1894 const llvm::Triple &Triple,
Defines the Diagnostic-related interfaces.
static unsigned matchAsmCCConstraint(const char *Name)
static constexpr int NumAArch64Builtins
#define ARM_ACLE_VERSION(Y, Q, P)
static constexpr int NumSVEBuiltins
static constexpr int NumFp16Builtins
static constexpr int NumSMEBuiltins
static constexpr llvm::StringTable BuiltinSVENeonBridgeStrings
static constexpr int NumSVENeonBridgeBuiltins
static constexpr int NumNeonBuiltins
static constexpr auto BuiltinSVENeonBridgeInfos
static constexpr Builtin::Info PrefixedBuiltinInfos[]
static constexpr Builtin::Info BuiltinInfos[]
static constexpr unsigned NumBuiltins
#define CLANG_BUILTIN_STR_TABLE_START
Defines the clang::LangOptions interface.
static bool HasFeature(const Preprocessor &PP, StringRef Feature)
HasFeature - Return true if we recognize and implement the feature specified by the identifier as a s...
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.
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.
const LangASMap * AddrSpaceMap
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;
virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const =0
===-— Other target property query methods -----------------------—===//
unsigned HasUnalignedAccess
unsigned char MaxAtomicPromoteWidth
void resetDataLayout()
Set the data layout based on current triple and ABI.
virtual unsigned getMinGlobalAlign(uint64_t Size, bool HasNonWeakDef) const
getMinGlobalAlign - Return the minimum alignment of a global variable, unless its alignment is explic...
unsigned HasAArch64ACLETypes
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.
llvm::StringMap< bool > FeatureMap
The map of which features have been enabled disabled based on the command line.
void getTargetDefinesARMV95A(const LangOptions &Opts, MacroBuilder &Builder) const
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
void getTargetDefinesARMV96A(const LangOptions &Opts, MacroBuilder &Builder) const
void getTargetDefinesARMV97A(const LangOptions &Opts, MacroBuilder &Builder) const
AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
ArrayRef< const char * > getGCCRegNames() const override
bool validateGlobalRegisterVariable(StringRef RegName, unsigned RegSize, bool &HasSizeMismatch) const override
Validate register name used for global register variables.
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.
llvm::SmallVector< Builtin::InfosShard > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
void getTargetDefinesARMV89A(const LangOptions &Opts, MacroBuilder &Builder) const
void getTargetDefinesARMV92A(const LangOptions &Opts, MacroBuilder &Builder) const
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
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
std::optional< std::pair< unsigned, unsigned > > getVScaleRange(const LangOptions &LangOpts, ArmStreamingKind Mode, llvm::StringMap< bool > *FeatureMap=nullptr) const override
Returns target-specific min and max values VScale_Range.
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
bool validateBranchProtection(StringRef Spec, StringRef Arch, BranchProtectionInfo &BPI, const LangOptions &LO, StringRef &Err) const override
Determine if this TargetInfo supports the given branch protection specification.
void getTargetDefinesARMV86A(const LangOptions &Opts, MacroBuilder &Builder) const
bool setCPU(const std::string &Name) override
Target the specified CPU.
void getTargetDefinesARMV94A(const LangOptions &Opts, MacroBuilder &Builder) const
llvm::APInt getFMVPriority(ArrayRef< StringRef > Features) const override
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 -----------------------—===//
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
AppleMachOAArch64TargetInfo(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)
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
Returns the kind of __builtin_va_list type that should be used with this target.
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
unsigned getMinGlobalAlign(uint64_t TypeSize, bool HasNonWeakDef) const override
getMinGlobalAlign - Return the minimum alignment of a global variable, unless its alignment is explic...
MicrosoftARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
TargetInfo::CallingConvKind getCallingConvKind(bool ClangABICompat4) const override
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
MinGWARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
WindowsARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Defines the clang::TargetInfo interface.
static constexpr Builtin::Info PrefixedBuiltinInfos[]
static constexpr Builtin::Info BuiltinInfos[]
static constexpr std::array< Info, N > MakeInfos(std::array< Info, N > Infos)
A constexpr function to construct an infos array from X-macros.
static constexpr std::array< Builtin::Info, NumFp16Builtins > BuiltinInfos
static constexpr std::array< Builtin::Info, NumNeonBuiltins > BuiltinInfos
static constexpr std::array< Builtin::Info, NumSMEBuiltins > BuiltinInfos
static constexpr std::array< Builtin::Info, NumSVEBuiltins > BuiltinInfos
void getAppleMachOAArch64Defines(MacroBuilder &Builder, const LangOptions &Opts, const llvm::Triple &Triple)
llvm::SmallDenseSet< StringRef, 32 > AArch64FeatureSet
static const unsigned ARM64AddrSpaceMap[]
The JSON file list parser is used to communicate input to InstallAPI.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
CallingConv
CallingConv - Specifies the calling convention that a function uses.
FeatureLookupBuilder & Case(StringRef Feat, bool HasFeature)
FeatureLookupBuilder(AArch64FeatureSet &Features)
FeatureLookupBuilder & Cases(ArrayRef< StringRef > Feats, bool HasFeature)
The info used to represent each builtin.
Contains information gathered from parsing the contents of TargetAttr.
void setOutputOperandBounds(unsigned Min, unsigned Max)
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 ZeroLengthBitfieldBoundary
If non-zero, specifies a fixed alignment value for bitfields that follow zero length bitfield,...
std::optional< unsigned > BitIntMaxAlign
unsigned LargestOverSizedBitfieldContainer
The largest container size which should be used for an over-sized bitfield, in bits.
unsigned char LongLongAlign
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
unsigned char DoubleAlign
unsigned UseSignedCharForObjCBool
Whether Objective-C's built-in boolean type should be signed char.
const llvm::fltSemantics * BFloat16Format