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();
292 llvm::AArch64::fillValidCPUArchList(Values);
297 Builder.defineMacro(
"__ARM_FEATURE_QRDMX",
"1");
308 Builder.defineMacro(
"__ARM_FEATURE_COMPLEX",
"1");
309 Builder.defineMacro(
"__ARM_FEATURE_JCVT",
"1");
322 Builder.defineMacro(
"__ARM_FEATURE_FRINT",
"1");
409 Builder.defineMacro(
"__amd64__");
410 Builder.defineMacro(
"__amd64");
411 Builder.defineMacro(
"__x86_64");
412 Builder.defineMacro(
"__x86_64__");
413 Builder.defineMacro(
"__arm64ec__");
415 Builder.defineMacro(
"__aarch64__");
419 Builder.defineMacro(
"__LFI__");
422 Builder.defineMacro(
"__GCC_ASM_FLAG_OUTPUTS__");
425 if (CodeModel ==
"default")
427 for (
char &c : CodeModel)
429 Builder.defineMacro(
"__AARCH64_CMODEL_" + CodeModel +
"__");
432 Builder.defineMacro(
"__ARM_ACLE_VERSION(year, quarter, patch)",
433 "(100 * (year) + 10 * (quarter) + (patch))");
434#define ARM_ACLE_VERSION(Y, Q, P) (100 * (Y) + 10 * (Q) + (P))
436 Builder.defineMacro(
"__FUNCTION_MULTI_VERSIONING_SUPPORT_LEVEL",
438#undef ARM_ACLE_VERSION
439 Builder.defineMacro(
"__ARM_ARCH",
440 std::to_string(ArchInfo->Version.getMajor()));
441 Builder.defineMacro(
"__ARM_ARCH_PROFILE",
442 std::string(
"'") + (
char)ArchInfo->Profile +
"'");
444 Builder.defineMacro(
"__ARM_64BIT_STATE",
"1");
445 Builder.defineMacro(
"__ARM_PCS_AAPCS64",
"1");
446 Builder.defineMacro(
"__ARM_ARCH_ISA_A64",
"1");
448 Builder.defineMacro(
"__ARM_FEATURE_CLZ",
"1");
449 Builder.defineMacro(
"__ARM_FEATURE_FMA",
"1");
450 Builder.defineMacro(
"__ARM_FEATURE_LDREX",
"0xF");
451 Builder.defineMacro(
"__ARM_FEATURE_IDIV",
"1");
452 Builder.defineMacro(
"__ARM_FEATURE_DIV");
453 Builder.defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
454 Builder.defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
456 Builder.defineMacro(
"__ARM_ALIGN_MAX_STACK_PWR",
"4");
460 Builder.defineMacro(
"__ARM_STATE_ZA",
"1");
461 Builder.defineMacro(
"__ARM_STATE_ZT0",
"1");
465 Builder.defineMacro(
"__ARM_FP",
"0xE");
469 Builder.defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
470 Builder.defineMacro(
"__ARM_FP16_ARGS",
"1");
473 Builder.defineMacro(
"__ARM_NEON_SVE_BRIDGE",
"1");
475 if (Opts.UnsafeFPMath)
476 Builder.defineMacro(
"__ARM_FP_FAST",
"1");
478 Builder.defineMacro(
"__ARM_SIZEOF_WCHAR_T",
479 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
481 Builder.defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
484 Builder.defineMacro(
"__ARM_PREFETCH_RANGE",
"1");
486 if (FPU & NeonMode) {
487 Builder.defineMacro(
"__ARM_NEON",
"1");
489 Builder.defineMacro(
"__ARM_NEON_FP",
"0xE");
493 Builder.defineMacro(
"__ARM_FEATURE_SVE",
"1");
496 Builder.defineMacro(
"__ARM_FEATURE_SVE2",
"1");
499 Builder.defineMacro(
"__ARM_FEATURE_SVE2p1",
"1");
501 if (HasSVE2 && HasSVEAES)
502 Builder.defineMacro(
"__ARM_FEATURE_SVE2_AES",
"1");
504 if (HasSVE2 && HasSVEBitPerm)
505 Builder.defineMacro(
"__ARM_FEATURE_SVE2_BITPERM",
"1");
507 if (HasSVE2 && HasSVE2SHA3)
508 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SHA3",
"1");
510 if (HasSVE2 && HasSVE2SM4)
511 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SM4",
"1");
514 Builder.defineMacro(
"__ARM_FEATURE_SVE_B16B16",
"1");
517 Builder.defineMacro(
"__ARM_FEATURE_SME");
518 Builder.defineMacro(
"__ARM_FEATURE_LOCALLY_STREAMING",
"1");
522 Builder.defineMacro(
"__ARM_FEATURE_SME2",
"1");
525 Builder.defineMacro(
"__ARM_FEATURE_SME2p1",
"1");
528 Builder.defineMacro(
"__ARM_FEATURE_SME_F16F16",
"1");
531 Builder.defineMacro(
"__ARM_FEATURE_SME_B16B16",
"1");
534 Builder.defineMacro(
"__ARM_FEATURE_FP8",
"1");
537 Builder.defineMacro(
"__ARM_FEATURE_FP8FMA",
"1");
540 Builder.defineMacro(
"__ARM_FEATURE_FP8DOT2",
"1");
543 Builder.defineMacro(
"__ARM_FEATURE_FP8DOT4",
"1");
546 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8DOT2",
"1");
549 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8DOT4",
"1");
552 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8FMA",
"1");
555 Builder.defineMacro(
"__ARM_FEATURE_SME_F8F32",
"1");
558 Builder.defineMacro(
"__ARM_FEATURE_SME_F8F16",
"1");
561 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
564 Builder.defineMacro(
"__ARM_FEATURE_CSSC",
"1");
567 Builder.defineMacro(
"__ARM_FEATURE_RCPC",
"3");
569 Builder.defineMacro(
"__ARM_FEATURE_RCPC",
"1");
572 Builder.defineMacro(
"__ARM_FEATURE_FPRCVT",
"1");
575 Builder.defineMacro(
"__ARM_FEATURE_F8F16MM",
"1");
578 Builder.defineMacro(
"__ARM_FEATURE_F8F32MM",
"1");
581 Builder.defineMacro(
"__ARM_FEATURE_SVE_F16F32MM",
"1");
584 Builder.defineMacro(
"__ARM_FEATURE_SVE_BFSCALE",
"1");
587 Builder.defineMacro(
"__ARM_FEATURE_SVE_B16MM",
"1");
590 Builder.defineMacro(
"__ARM_FEATURE_F16MM",
"1");
593 Builder.defineMacro(
"__ARM_FEATURE_F16F32DOT",
"1");
596 Builder.defineMacro(
"__ARM_FEATURE_F16F32MM",
"1");
599 Builder.defineMacro(
"__ARM_FEATURE_SVE_AES2",
"1");
602 Builder.defineMacro(
"__ARM_FEATURE_SSVE_AES",
"1");
605 Builder.defineMacro(
"__ARM_FEATURE_SVE2p2",
"1");
608 Builder.defineMacro(
"__ARM_FEATURE_SVE2p3",
"1");
611 Builder.defineMacro(
"__ARM_FEATURE_SME2p2",
"1");
614 Builder.defineMacro(
"__ARM_FEATURE_SME2p3",
"1");
617 Builder.defineMacro(
"__HAVE_FUNCTION_MULTI_VERSIONING",
"1");
621 if (HasAES && HasSHA2)
622 Builder.defineMacro(
"__ARM_FEATURE_CRYPTO",
"1");
625 Builder.defineMacro(
"__ARM_FEATURE_AES",
"1");
628 Builder.defineMacro(
"__ARM_FEATURE_SHA2",
"1");
631 Builder.defineMacro(
"__ARM_FEATURE_SHA3",
"1");
632 Builder.defineMacro(
"__ARM_FEATURE_SHA512",
"1");
636 Builder.defineMacro(
"__ARM_FEATURE_SM3",
"1");
637 Builder.defineMacro(
"__ARM_FEATURE_SM4",
"1");
641 Builder.defineMacro(
"__ARM_FEATURE_PAUTH",
"1");
644 Builder.defineMacro(
"__ARM_FEATURE_PAUTH_LR",
"1");
647 Builder.defineMacro(
"__ARM_FEATURE_BTI",
"1");
650 Builder.defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
652 if ((FPU & NeonMode) && HasFullFP16)
653 Builder.defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
655 Builder.defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
658 Builder.defineMacro(
"__ARM_FEATURE_DOTPROD",
"1");
661 Builder.defineMacro(
"__ARM_FEATURE_MEMORY_TAGGING",
"1");
664 Builder.defineMacro(
"__ARM_FEATURE_MATMUL_INT8",
"1");
667 Builder.defineMacro(
"__ARM_FEATURE_ATOMICS",
"1");
670 Builder.defineMacro(
"__ARM_FEATURE_BF16",
"1");
671 Builder.defineMacro(
"__ARM_FEATURE_BF16_VECTOR_ARITHMETIC",
"1");
672 Builder.defineMacro(
"__ARM_BF16_FORMAT_ALTERNATIVE",
"1");
673 Builder.defineMacro(
"__ARM_FEATURE_BF16_SCALAR_ARITHMETIC",
"1");
676 if ((FPU & SveMode) && HasBFloat16) {
677 Builder.defineMacro(
"__ARM_FEATURE_SVE_BF16",
"1");
680 if ((FPU & SveMode) && HasMatmulFP64)
681 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP64",
"1");
683 if ((FPU & SveMode) && HasMatmulFP32)
684 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP32",
"1");
686 if ((FPU & SveMode) && HasMatMul)
687 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_INT8",
"1");
689 if ((FPU & NeonMode) && HasFP16FML)
690 Builder.defineMacro(
"__ARM_FEATURE_FP16_FML",
"1");
708 if (Opts.BranchProtectionPAuthLR)
711 Builder.defineMacro(
"__ARM_FEATURE_PAC_DEFAULT", std::to_string(
Value));
714 if (Opts.BranchTargetEnforcement)
715 Builder.defineMacro(
"__ARM_FEATURE_BTI_DEFAULT",
"1");
717 if (Opts.GuardedControlStack)
718 Builder.defineMacro(
"__ARM_FEATURE_GCS_DEFAULT",
"1");
721 Builder.defineMacro(
"__ARM_FEATURE_LS64",
"1");
724 Builder.defineMacro(
"__ARM_FEATURE_RNG",
"1");
727 Builder.defineMacro(
"__ARM_FEATURE_MOPS",
"1");
730 Builder.defineMacro(
"__ARM_FEATURE_SYSREG128",
"1");
733 Builder.defineMacro(
"__ARM_FEATURE_GCS",
"1");
735 if (*ArchInfo == llvm::AArch64::ARMV8_1A)
737 else if (*ArchInfo == llvm::AArch64::ARMV8_2A)
739 else if (*ArchInfo == llvm::AArch64::ARMV8_3A)
741 else if (*ArchInfo == llvm::AArch64::ARMV8_4A)
743 else if (*ArchInfo == llvm::AArch64::ARMV8_5A)
745 else if (*ArchInfo == llvm::AArch64::ARMV8_6A)
747 else if (*ArchInfo == llvm::AArch64::ARMV8_7A)
749 else if (*ArchInfo == llvm::AArch64::ARMV8_8A)
751 else if (*ArchInfo == llvm::AArch64::ARMV8_9A)
753 else if (*ArchInfo == llvm::AArch64::ARMV9A)
755 else if (*ArchInfo == llvm::AArch64::ARMV9_1A)
757 else if (*ArchInfo == llvm::AArch64::ARMV9_2A)
759 else if (*ArchInfo == llvm::AArch64::ARMV9_3A)
761 else if (*ArchInfo == llvm::AArch64::ARMV9_4A)
763 else if (*ArchInfo == llvm::AArch64::ARMV9_5A)
765 else if (*ArchInfo == llvm::AArch64::ARMV9_6A)
767 else if (*ArchInfo == llvm::AArch64::ARMV9_7A)
771 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
772 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
773 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
774 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
775 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
778 Builder.defineMacro(
"__FP_FAST_FMA",
"1");
779 Builder.defineMacro(
"__FP_FAST_FMAF",
"1");
783 Builder.defineMacro(
"__ARM_FEATURE_SVE_VECTOR_OPERATORS",
"2");
785 if (Opts.VScaleMin && Opts.VScaleMin == Opts.VScaleMax) {
786 Builder.defineMacro(
"__ARM_FEATURE_SVE_BITS", Twine(Opts.VScaleMin * 128));
805std::optional<std::pair<unsigned, unsigned>>
808 llvm::StringMap<bool> *FeatureMap)
const {
810 (LangOpts.VScaleMin || LangOpts.VScaleMax))
811 return std::pair<unsigned, unsigned>(
812 LangOpts.VScaleMin ? LangOpts.VScaleMin : 1,
813 LangOpts.VScaleMax ? LangOpts.VScaleMax : 16);
816 (LangOpts.VScaleStreamingMin || LangOpts.VScaleStreamingMax))
817 return std::pair<unsigned, unsigned>(
818 LangOpts.VScaleStreamingMin ? LangOpts.VScaleStreamingMin : 1,
819 LangOpts.VScaleStreamingMax ? LangOpts.VScaleStreamingMax : 16);
822 ((LangOpts.VScaleMin && LangOpts.VScaleStreamingMin) ||
823 (LangOpts.VScaleMax && LangOpts.VScaleStreamingMax))) {
825 std::min(LangOpts.VScaleMin ? LangOpts.VScaleMin : 1,
826 LangOpts.VScaleStreamingMin ? LangOpts.VScaleStreamingMin : 1);
827 unsigned Max = std::max(
828 LangOpts.VScaleMax ? LangOpts.VScaleMax : 16,
829 LangOpts.VScaleStreamingMax ? LangOpts.VScaleStreamingMax : 16);
830 return std::pair(
Min,
Max);
833 if (
hasFeature(
"sve") || (FeatureMap && (FeatureMap->lookup(
"sve"))))
834 return std::pair<unsigned, unsigned>(1, 16);
837 (
hasFeature(
"sme") || (FeatureMap && (FeatureMap->lookup(
"sme")))))
838 return std::pair<unsigned, unsigned>(1, 16);
845 return llvm::AArch64::getFMVPriority(Features);
850 if (
auto Ext = llvm::AArch64::parseFMVExtension(Name))
851 return Ext->ID.has_value();
858 FeatureStr.split(Features,
"+");
860 if (!llvm::AArch64::parseFMVExtension(
Feature.trim()).has_value())
873 Features.insert(Feat);
879 Features.insert_range(Feats);
887void AArch64TargetInfo::computeFeatureLookup() {
888 FeatureLookupBuilder(HasFeatureLookup)
889 .Cases({
"aarch64",
"arm64",
"arm"},
true)
891 .Case(
"fp", FPU & FPUMode)
892 .Cases({
"neon",
"simd"}, FPU & NeonMode)
893 .Case(
"jscvt", HasJSCVT)
894 .Case(
"fcma", HasFCMA)
895 .Case(
"rng", HasRandGen)
896 .Case(
"flagm", HasFlagM)
897 .Case(
"flagm2", HasAlternativeNZCV)
898 .Case(
"fp16fml", HasFP16FML)
899 .Case(
"dotprod", HasDotProd)
904 .Case(
"cssc", HasCSSC)
905 .Case(
"sha2", HasSHA2)
906 .Case(
"sha3", HasSHA3)
907 .Cases({
"aes",
"pmull"}, HasAES)
908 .Cases({
"fp16",
"fullfp16"}, HasFullFP16)
910 .Case(
"dpb", HasCCPP)
911 .Case(
"dpb2", HasCCDP)
912 .Case(
"rcpc", HasRCPC)
913 .Case(
"frintts", HasFRInt3264)
914 .Case(
"i8mm", HasMatMul)
915 .Case(
"bf16", HasBFloat16)
916 .Case(
"sve", FPU & SveMode)
917 .Case(
"sve-b16b16", HasSVEB16B16)
918 .Case(
"f32mm", FPU & SveMode && HasMatmulFP32)
919 .Case(
"f64mm", FPU & SveMode && HasMatmulFP64)
920 .Case(
"sve2", FPU & SveMode && HasSVE2)
921 .Case(
"sve-aes", HasSVEAES)
922 .Case(
"sve-bitperm", FPU & HasSVEBitPerm)
923 .Case(
"sve2-sha3", FPU & SveMode && HasSVE2SHA3)
924 .Case(
"sve2-sm4", FPU & SveMode && HasSVE2SM4)
925 .Case(
"sve2p1", FPU & SveMode && HasSVE2p1)
927 .Case(
"sme2", HasSME2)
928 .Case(
"sme2p1", HasSME2p1)
929 .Case(
"sme-f64f64", HasSMEF64F64)
930 .Case(
"sme-i16i64", HasSMEI16I64)
931 .Case(
"sme-fa64", HasSMEFA64)
932 .Case(
"sme-f16f16", HasSMEF16F16)
933 .Case(
"sme-b16b16", HasSMEB16B16)
934 .Case(
"memtag", HasMTE)
936 .Case(
"predres", HasPredRes)
937 .Cases({
"ssbs",
"ssbs2"}, HasSSBS)
939 .Cases({
"ls64",
"ls64_v",
"ls64_accdata"}, HasLS64)
940 .Case(
"wfxt", HasWFxT)
941 .Case(
"rcpc3", HasRCPC3)
943 .Case(
"fp8fma", HasFP8FMA)
944 .Case(
"fp8dot2", HasFP8DOT2)
945 .Case(
"fp8dot4", HasFP8DOT4)
946 .Case(
"ssve-fp8dot2", HasSSVE_FP8DOT2)
947 .Case(
"ssve-fp8dot4", HasSSVE_FP8DOT4)
948 .Case(
"ssve-fp8fma", HasSSVE_FP8FMA)
949 .Case(
"sme-f8f32", HasSME_F8F32)
950 .Case(
"sme-f8f16", HasSME_F8F16)
951 .Case(
"fprcvt", HasFPRCVT)
952 .Case(
"f8f16mm", HasF8F16MM)
953 .Case(
"f8f32mm", HasF8F32MM)
954 .Case(
"sve-f16f32mm", HasSVE_F16F32MM)
955 .Case(
"sve-bfscale", HasSVE_BFSCALE)
956 .Case(
"sve-aes2", HasSVE_AES2)
957 .Case(
"ssve-aes", HasSSVE_AES)
958 .Case(
"sve2p2", FPU & SveMode && HasSVE2p2)
959 .Case(
"sme2p2", HasSME2p2)
960 .Case(
"sve2p3", FPU & SveMode && HasSVE2p3)
961 .Case(
"sme2p3", HasSME2p3)
962 .Case(
"sve-b16mm", HasSVE_B16MM)
963 .Case(
"f16mm", HasF16MM)
964 .Case(
"f16f32dot", HasF16F32DOT)
965 .Case(
"f16f32mm", HasF16F32MM);
969 return HasFeatureLookup.contains(
Feature);
973 StringRef Name,
bool Enabled)
const {
974 Features[Name] = Enabled;
977 const std::optional<llvm::AArch64::ArchInfo> ArchInfo =
978 llvm::AArch64::ArchInfo::findBySubArch(Name);
987 for (
const auto &OtherArch : llvm::AArch64::ArchInfos)
988 if (ArchInfo->implies(OtherArch))
989 Features[OtherArch.getSubArch()] =
true;
992 std::vector<StringRef> CPUFeats;
993 if (llvm::AArch64::getExtensionFeatures(ArchInfo->DefaultExts, CPUFeats)) {
994 for (
auto F : CPUFeats) {
995 assert(F[0] ==
'+' &&
"Expected + in target feature!");
996 Features[F.drop_front(1)] =
true;
1003 for (
const auto &
Feature : Features) {
1045 if (
Feature ==
"+sve2-sha3") {
1060 HasSVEB16B16 =
true;
1061 if (
Feature ==
"+sve-bitperm") {
1064 HasSVEBitPerm =
true;
1070 HasMatmulFP32 =
true;
1076 HasMatmulFP64 =
true;
1096 if (
Feature ==
"+sme-f64f64") {
1098 HasSMEF64F64 =
true;
1102 if (
Feature ==
"+sme-i16i64") {
1104 HasSMEI16I64 =
true;
1115 if (
Feature ==
"+sme-f16f16") {
1120 HasSMEF16F16 =
true;
1122 if (
Feature ==
"+sme-b16b16") {
1127 HasSVEB16B16 =
true;
1128 HasSMEB16B16 =
true;
1139 if (
Feature ==
"+ssve-fp8dot2")
1140 HasSSVE_FP8DOT2 =
true;
1141 if (
Feature ==
"+ssve-fp8dot4")
1142 HasSSVE_FP8DOT4 =
true;
1143 if (
Feature ==
"+ssve-fp8fma")
1144 HasSSVE_FP8FMA =
true;
1146 HasSME_F8F32 =
true;
1148 HasSME_F8F16 =
true;
1191 HasFRInt3264 =
true;
1196 if (
Feature ==
"+strict-align")
1204 if (
Feature ==
"+sve-f16f32mm")
1205 HasSVE_F16F32MM =
true;
1207 HasSVE_B16MM =
true;
1211 HasF16F32DOT =
true;
1214 if (
Feature ==
"+sve-bfscale")
1215 HasSVE_BFSCALE =
true;
1230 if (
Feature ==
"+v8a" && ArchInfo->Version < llvm::AArch64::ARMV8A.Version)
1231 ArchInfo = &llvm::AArch64::ARMV8A;
1233 ArchInfo->Version < llvm::AArch64::ARMV8_1A.Version)
1234 ArchInfo = &llvm::AArch64::ARMV8_1A;
1236 ArchInfo->Version < llvm::AArch64::ARMV8_2A.Version)
1237 ArchInfo = &llvm::AArch64::ARMV8_2A;
1239 ArchInfo->Version < llvm::AArch64::ARMV8_3A.Version)
1240 ArchInfo = &llvm::AArch64::ARMV8_3A;
1242 ArchInfo->Version < llvm::AArch64::ARMV8_4A.Version)
1243 ArchInfo = &llvm::AArch64::ARMV8_4A;
1245 ArchInfo->Version < llvm::AArch64::ARMV8_5A.Version)
1246 ArchInfo = &llvm::AArch64::ARMV8_5A;
1248 ArchInfo->Version < llvm::AArch64::ARMV8_6A.Version)
1249 ArchInfo = &llvm::AArch64::ARMV8_6A;
1251 ArchInfo->Version < llvm::AArch64::ARMV8_7A.Version)
1252 ArchInfo = &llvm::AArch64::ARMV8_7A;
1254 ArchInfo->Version < llvm::AArch64::ARMV8_8A.Version)
1255 ArchInfo = &llvm::AArch64::ARMV8_8A;
1257 ArchInfo->Version < llvm::AArch64::ARMV8_9A.Version)
1258 ArchInfo = &llvm::AArch64::ARMV8_9A;
1259 if (
Feature ==
"+v9a" && ArchInfo->Version < llvm::AArch64::ARMV9A.Version)
1260 ArchInfo = &llvm::AArch64::ARMV9A;
1262 ArchInfo->Version < llvm::AArch64::ARMV9_1A.Version)
1263 ArchInfo = &llvm::AArch64::ARMV9_1A;
1265 ArchInfo->Version < llvm::AArch64::ARMV9_2A.Version)
1266 ArchInfo = &llvm::AArch64::ARMV9_2A;
1268 ArchInfo->Version < llvm::AArch64::ARMV9_3A.Version)
1269 ArchInfo = &llvm::AArch64::ARMV9_3A;
1271 ArchInfo->Version < llvm::AArch64::ARMV9_4A.Version)
1272 ArchInfo = &llvm::AArch64::ARMV9_4A;
1274 ArchInfo->Version < llvm::AArch64::ARMV9_5A.Version)
1275 ArchInfo = &llvm::AArch64::ARMV9_5A;
1277 ArchInfo->Version < llvm::AArch64::ARMV9_6A.Version)
1278 ArchInfo = &llvm::AArch64::ARMV9_6A;
1280 ArchInfo->Version < llvm::AArch64::ARMV9_7A.Version)
1281 ArchInfo = &llvm::AArch64::ARMV9_7A;
1283 ArchInfo = &llvm::AArch64::ARMV8R;
1315 HasAlternativeNZCV =
true;
1336 for (
const auto &
Feature : Features) {
1355 computeFeatureLookup();
1372 if (Features ==
"default")
1375 Features.split(AttrFeatures,
",");
1376 bool FoundArch =
false;
1378 auto SplitAndAddFeatures = [](StringRef FeatString,
1379 std::vector<std::string> &Features,
1380 llvm::AArch64::ExtensionSet &FeatureBits) {
1382 FeatString.split(SplitFeatures, StringRef(
"+"), -1,
false);
1383 for (StringRef
Feature : SplitFeatures) {
1384 if (FeatureBits.parseModifier(
Feature))
1392 if (
Feature.starts_with(
"no"))
1393 Features.push_back(
"-" +
Feature.drop_front(2).str());
1395 Features.push_back(
"+" +
Feature.str());
1399 llvm::AArch64::ExtensionSet FeatureBits;
1401 FeatureBits.reconstructFromParsedFeatures(
getTargetOpts().FeaturesAsWritten,
1404 for (
auto &
Feature : AttrFeatures) {
1406 if (
Feature.starts_with(
"fpmath="))
1409 if (
Feature.starts_with(
"branch-protection=")) {
1410 Ret.BranchProtection =
Feature.split(
'=').second.trim();
1414 if (
Feature.starts_with(
"arch=")) {
1416 Ret.Duplicate =
"arch=";
1418 std::pair<StringRef, StringRef> Split =
1419 Feature.split(
"=").second.trim().split(
"+");
1420 const llvm::AArch64::ArchInfo *AI = llvm::AArch64::parseArch(Split.first);
1426 FeatureBits.addArchDefaults(*AI);
1428 SplitAndAddFeatures(Split.second, Ret.Features, FeatureBits);
1429 }
else if (
Feature.starts_with(
"cpu=")) {
1430 if (!Ret.CPU.empty())
1431 Ret.Duplicate =
"cpu=";
1435 std::pair<StringRef, StringRef> Split =
1436 Feature.split(
"=").second.trim().split(
"+");
1437 Ret.CPU = Split.first;
1438 if (
auto CpuInfo = llvm::AArch64::parseCpu(Ret.CPU)) {
1439 FeatureBits.addCPUDefaults(*CpuInfo);
1440 SplitAndAddFeatures(Split.second, Ret.Features, FeatureBits);
1443 }
else if (
Feature.starts_with(
"tune=")) {
1444 if (!Ret.Tune.empty())
1445 Ret.Duplicate =
"tune=";
1447 Ret.Tune =
Feature.split(
"=").second.trim();
1448 }
else if (
Feature.starts_with(
"+")) {
1449 SplitAndAddFeatures(
Feature, Ret.Features, FeatureBits);
1451 if (FeatureBits.parseModifier(
Feature,
true))
1459 if (
Feature.starts_with(
"no-"))
1460 Ret.Features.push_back(
"-" +
Feature.drop_front(3).str());
1462 Ret.Features.push_back(
"+" +
Feature.str());
1465 FeatureBits.toLLVMFeatureList(Ret.Features);
1498const char *
const AArch64TargetInfo::GCCRegNames[] = {
1502 "w0",
"w1",
"w2",
"w3",
"w4",
"w5",
"w6",
"w7",
"w8",
"w9",
"w10",
"w11",
1503 "w12",
"w13",
"w14",
"w15",
"w16",
"w17",
"w18",
"w19",
"w20",
"w21",
"w22",
1504 "w23",
"w24",
"w25",
"w26",
"w27",
"w28",
"w29",
"w30",
"wsp",
1507 "x0",
"x1",
"x2",
"x3",
"x4",
"x5",
"x6",
"x7",
"x8",
"x9",
"x10",
"x11",
1508 "x12",
"x13",
"x14",
"x15",
"x16",
"x17",
"x18",
"x19",
"x20",
"x21",
"x22",
1509 "x23",
"x24",
"x25",
"x26",
"x27",
"x28",
"fp",
"lr",
"sp",
1512 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
1513 "s12",
"s13",
"s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
1514 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
1517 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
"d8",
"d9",
"d10",
"d11",
1518 "d12",
"d13",
"d14",
"d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
1519 "d23",
"d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
1522 "v0",
"v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
"v9",
"v10",
"v11",
1523 "v12",
"v13",
"v14",
"v15",
"v16",
"v17",
"v18",
"v19",
"v20",
"v21",
"v22",
1524 "v23",
"v24",
"v25",
"v26",
"v27",
"v28",
"v29",
"v30",
"v31",
1527 "z0",
"z1",
"z2",
"z3",
"z4",
"z5",
"z6",
"z7",
"z8",
"z9",
"z10",
1528 "z11",
"z12",
"z13",
"z14",
"z15",
"z16",
"z17",
"z18",
"z19",
"z20",
"z21",
1529 "z22",
"z23",
"z24",
"z25",
"z26",
"z27",
"z28",
"z29",
"z30",
"z31",
1532 "p0",
"p1",
"p2",
"p3",
"p4",
"p5",
"p6",
"p7",
"p8",
"p9",
"p10",
1533 "p11",
"p12",
"p13",
"p14",
"p15",
1536 "pn0",
"pn1",
"pn2",
"pn3",
"pn4",
"pn5",
"pn6",
"pn7",
"pn8",
1537 "pn9",
"pn10",
"pn11",
"pn12",
"pn13",
"pn14",
"pn15",
1582 {{
"r29",
"x29"},
"fp"},
1583 {{
"r30",
"x30"},
"lr"},
1594 constexpr unsigned len = 5;
1595 auto RV = llvm::StringSwitch<unsigned>(Name)
1619 switch (*Constraint) {
1621 R = std::string(
"@3") + std::string(Constraint, 3);
1626 std::string Converted =
"{" + std::string(Constraint, Len) +
"}";
1627 Constraint += Len - 1;
1630 return std::string(1, *Constraint);
1662 if (Name[1] ==
'p' &&
1663 (Name[2] ==
'l' || Name[2] ==
'a' || Name[2] ==
'h')) {
1669 if (Name[1] ==
'c' && (Name[2] ==
'i' || Name[2] ==
'j')) {
1705 StringRef Constraint,
char Modifier,
unsigned Size,
1706 std::string &SuggestedModifier)
const {
1708 Constraint = Constraint.ltrim(
"=+&");
1710 switch (Constraint[0]) {
1730 SuggestedModifier =
"w";
1748 const llvm::APSInt &value)
const {
1749 return 0 <= value && value <= 3;
1760 Builder.defineMacro(
"__AARCH64EL__");
1770 Builder.defineMacro(
"__AARCH64EB__");
1771 Builder.defineMacro(
"__AARCH_BIG_ENDIAN");
1772 Builder.defineMacro(
"__ARM_BIG_ENDIAN");
1834 Builder.defineMacro(
"_M_X64",
"100");
1835 Builder.defineMacro(
"_M_AMD64",
"100");
1836 Builder.defineMacro(
"_M_ARM64EC",
"1");
1838 Builder.defineMacro(
"_M_ARM64",
"1");
1848 bool HasNonWeakDef)
const {
1858 TheCXXABI.set(TargetCXXABI::GenericAArch64);
1886 TheCXXABI.set(TargetCXXABI::AppleARM64);
1891 const llvm::Triple &Triple) {
1892 Builder.defineMacro(
"__AARCH64_SIMD__");
1893 if (Triple.isArch32Bit())
1894 Builder.defineMacro(
"__ARM64_ARCH_8_32__");
1896 Builder.defineMacro(
"__ARM64_ARCH_8__");
1897 Builder.defineMacro(
"__ARM_NEON__");
1898 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
1899 Builder.defineMacro(
"__arm64",
"1");
1900 Builder.defineMacro(
"__arm64__",
"1");
1902 if (Triple.isArm64e()) {
1903 Builder.defineMacro(
"__arm64e__",
"1");
1904 Builder.defineMacro(
"__PTRAUTH_INTRINSICS__",
"1");
1909 const llvm::Triple &Triple,
1917 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.
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...
bool setCPU(StringRef Name) override
Target the specified CPU.
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
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())))
unsigned Microsoft64BitMinGlobalAlign(uint64_t TypeSize)
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