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,
getTriple(),
263 if (LO.PointerAuthReturns &&
264 (PBP.Scope !=
"none" || PBP.BranchProtectionPAuthLR ||
265 PBP.GuardedControlStack))
269 llvm::StringSwitch<LangOptions::SignReturnAddressScopeKind>(PBP.Scope)
274 if (PBP.Key ==
"a_key")
286 return llvm::AArch64::parseCpu(Name).has_value();
293 llvm::AArch64::fillValidCPUArchList(Values);
298 Builder.defineMacro(
"__ARM_FEATURE_QRDMX",
"1");
309 Builder.defineMacro(
"__ARM_FEATURE_COMPLEX",
"1");
310 Builder.defineMacro(
"__ARM_FEATURE_JCVT",
"1");
323 Builder.defineMacro(
"__ARM_FEATURE_FRINT",
"1");
410 Builder.defineMacro(
"__amd64__");
411 Builder.defineMacro(
"__amd64");
412 Builder.defineMacro(
"__x86_64");
413 Builder.defineMacro(
"__x86_64__");
414 Builder.defineMacro(
"__arm64ec__");
416 Builder.defineMacro(
"__aarch64__");
420 Builder.defineMacro(
"__LFI__");
423 Builder.defineMacro(
"__GCC_ASM_FLAG_OUTPUTS__");
426 if (CodeModel ==
"default")
428 for (
char &c : CodeModel)
430 Builder.defineMacro(
"__AARCH64_CMODEL_" + CodeModel +
"__");
433 Builder.defineMacro(
"__ARM_ACLE_VERSION(year, quarter, patch)",
434 "(100 * (year) + 10 * (quarter) + (patch))");
435#define ARM_ACLE_VERSION(Y, Q, P) (100 * (Y) + 10 * (Q) + (P))
437 Builder.defineMacro(
"__FUNCTION_MULTI_VERSIONING_SUPPORT_LEVEL",
439#undef ARM_ACLE_VERSION
440 Builder.defineMacro(
"__ARM_ARCH",
441 std::to_string(ArchInfo->Version.getMajor()));
442 Builder.defineMacro(
"__ARM_ARCH_PROFILE",
443 std::string(
"'") + (
char)ArchInfo->Profile +
"'");
445 Builder.defineMacro(
"__ARM_64BIT_STATE",
"1");
446 Builder.defineMacro(
"__ARM_PCS_AAPCS64",
"1");
447 Builder.defineMacro(
"__ARM_ARCH_ISA_A64",
"1");
449 Builder.defineMacro(
"__ARM_FEATURE_CLZ",
"1");
450 Builder.defineMacro(
"__ARM_FEATURE_FMA",
"1");
451 Builder.defineMacro(
"__ARM_FEATURE_LDREX",
"0xF");
452 Builder.defineMacro(
"__ARM_FEATURE_IDIV",
"1");
453 Builder.defineMacro(
"__ARM_FEATURE_DIV");
454 Builder.defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
455 Builder.defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
457 Builder.defineMacro(
"__ARM_ALIGN_MAX_STACK_PWR",
"4");
461 Builder.defineMacro(
"__ARM_STATE_ZA",
"1");
462 Builder.defineMacro(
"__ARM_STATE_ZT0",
"1");
466 Builder.defineMacro(
"__ARM_FP",
"0xE");
470 Builder.defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
471 Builder.defineMacro(
"__ARM_FP16_ARGS",
"1");
474 Builder.defineMacro(
"__ARM_NEON_SVE_BRIDGE",
"1");
476 if (Opts.UnsafeFPMath)
477 Builder.defineMacro(
"__ARM_FP_FAST",
"1");
479 Builder.defineMacro(
"__ARM_SIZEOF_WCHAR_T",
480 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
482 Builder.defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
485 Builder.defineMacro(
"__ARM_PREFETCH_RANGE",
"1");
487 if (FPU & NeonMode) {
488 Builder.defineMacro(
"__ARM_NEON",
"1");
490 Builder.defineMacro(
"__ARM_NEON_FP",
"0xE");
494 Builder.defineMacro(
"__ARM_FEATURE_SVE",
"1");
497 Builder.defineMacro(
"__ARM_FEATURE_SVE2",
"1");
500 Builder.defineMacro(
"__ARM_FEATURE_SVE2p1",
"1");
502 if (HasSVE2 && HasSVEAES)
503 Builder.defineMacro(
"__ARM_FEATURE_SVE2_AES",
"1");
505 if (HasSVE2 && HasSVEBitPerm)
506 Builder.defineMacro(
"__ARM_FEATURE_SVE2_BITPERM",
"1");
508 if (HasSVE2 && HasSVE2SHA3)
509 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SHA3",
"1");
511 if (HasSVE2 && HasSVE2SM4)
512 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SM4",
"1");
515 Builder.defineMacro(
"__ARM_FEATURE_SVE_B16B16",
"1");
518 Builder.defineMacro(
"__ARM_FEATURE_SME");
519 Builder.defineMacro(
"__ARM_FEATURE_LOCALLY_STREAMING",
"1");
523 Builder.defineMacro(
"__ARM_FEATURE_SME2",
"1");
526 Builder.defineMacro(
"__ARM_FEATURE_SME2p1",
"1");
529 Builder.defineMacro(
"__ARM_FEATURE_SME_F16F16",
"1");
532 Builder.defineMacro(
"__ARM_FEATURE_SME_B16B16",
"1");
535 Builder.defineMacro(
"__ARM_FEATURE_FP8",
"1");
538 Builder.defineMacro(
"__ARM_FEATURE_FP8FMA",
"1");
541 Builder.defineMacro(
"__ARM_FEATURE_FP8DOT2",
"1");
544 Builder.defineMacro(
"__ARM_FEATURE_FP8DOT4",
"1");
547 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8DOT2",
"1");
550 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8DOT4",
"1");
553 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8FMA",
"1");
556 Builder.defineMacro(
"__ARM_FEATURE_SME_F8F32",
"1");
559 Builder.defineMacro(
"__ARM_FEATURE_SME_F8F16",
"1");
562 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
565 Builder.defineMacro(
"__ARM_FEATURE_CSSC",
"1");
568 Builder.defineMacro(
"__ARM_FEATURE_RCPC",
"3");
570 Builder.defineMacro(
"__ARM_FEATURE_RCPC",
"1");
573 Builder.defineMacro(
"__ARM_FEATURE_FPRCVT",
"1");
576 Builder.defineMacro(
"__ARM_FEATURE_F8F16MM",
"1");
579 Builder.defineMacro(
"__ARM_FEATURE_F8F32MM",
"1");
582 Builder.defineMacro(
"__ARM_FEATURE_SVE_F16F32MM",
"1");
585 Builder.defineMacro(
"__ARM_FEATURE_SVE_BFSCALE",
"1");
588 Builder.defineMacro(
"__ARM_FEATURE_SVE_B16MM",
"1");
591 Builder.defineMacro(
"__ARM_FEATURE_F16MM",
"1");
594 Builder.defineMacro(
"__ARM_FEATURE_F16F32DOT",
"1");
597 Builder.defineMacro(
"__ARM_FEATURE_F16F32MM",
"1");
600 Builder.defineMacro(
"__ARM_FEATURE_SVE_AES2",
"1");
603 Builder.defineMacro(
"__ARM_FEATURE_SSVE_AES",
"1");
606 Builder.defineMacro(
"__ARM_FEATURE_SVE2p2",
"1");
609 Builder.defineMacro(
"__ARM_FEATURE_SVE2p3",
"1");
612 Builder.defineMacro(
"__ARM_FEATURE_SME2p2",
"1");
615 Builder.defineMacro(
"__ARM_FEATURE_SME2p3",
"1");
618 Builder.defineMacro(
"__HAVE_FUNCTION_MULTI_VERSIONING",
"1");
622 if (HasAES && HasSHA2)
623 Builder.defineMacro(
"__ARM_FEATURE_CRYPTO",
"1");
626 Builder.defineMacro(
"__ARM_FEATURE_AES",
"1");
629 Builder.defineMacro(
"__ARM_FEATURE_SHA2",
"1");
632 Builder.defineMacro(
"__ARM_FEATURE_SHA3",
"1");
633 Builder.defineMacro(
"__ARM_FEATURE_SHA512",
"1");
637 Builder.defineMacro(
"__ARM_FEATURE_SM3",
"1");
638 Builder.defineMacro(
"__ARM_FEATURE_SM4",
"1");
642 Builder.defineMacro(
"__ARM_FEATURE_PAUTH",
"1");
645 Builder.defineMacro(
"__ARM_FEATURE_PAUTH_LR",
"1");
648 Builder.defineMacro(
"__ARM_FEATURE_BTI",
"1");
651 Builder.defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
653 if ((FPU & NeonMode) && HasFullFP16)
654 Builder.defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
656 Builder.defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
659 Builder.defineMacro(
"__ARM_FEATURE_DOTPROD",
"1");
662 Builder.defineMacro(
"__ARM_FEATURE_MEMORY_TAGGING",
"1");
665 Builder.defineMacro(
"__ARM_FEATURE_MATMUL_INT8",
"1");
668 Builder.defineMacro(
"__ARM_FEATURE_ATOMICS",
"1");
671 Builder.defineMacro(
"__ARM_FEATURE_BF16",
"1");
672 Builder.defineMacro(
"__ARM_FEATURE_BF16_VECTOR_ARITHMETIC",
"1");
673 Builder.defineMacro(
"__ARM_BF16_FORMAT_ALTERNATIVE",
"1");
674 Builder.defineMacro(
"__ARM_FEATURE_BF16_SCALAR_ARITHMETIC",
"1");
677 if ((FPU & SveMode) && HasBFloat16) {
678 Builder.defineMacro(
"__ARM_FEATURE_SVE_BF16",
"1");
681 if ((FPU & SveMode) && HasMatmulFP64)
682 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP64",
"1");
684 if ((FPU & SveMode) && HasMatmulFP32)
685 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP32",
"1");
687 if ((FPU & SveMode) && HasMatMul)
688 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_INT8",
"1");
690 if ((FPU & NeonMode) && HasFP16FML)
691 Builder.defineMacro(
"__ARM_FEATURE_FP16_FML",
"1");
709 if (Opts.BranchProtectionPAuthLR)
712 Builder.defineMacro(
"__ARM_FEATURE_PAC_DEFAULT", std::to_string(
Value));
715 if (Opts.BranchTargetEnforcement)
716 Builder.defineMacro(
"__ARM_FEATURE_BTI_DEFAULT",
"1");
718 if (Opts.GuardedControlStack)
719 Builder.defineMacro(
"__ARM_FEATURE_GCS_DEFAULT",
"1");
722 Builder.defineMacro(
"__ARM_FEATURE_LS64",
"1");
725 Builder.defineMacro(
"__ARM_FEATURE_RNG",
"1");
728 Builder.defineMacro(
"__ARM_FEATURE_MOPS",
"1");
731 Builder.defineMacro(
"__ARM_FEATURE_SYSREG128",
"1");
734 Builder.defineMacro(
"__ARM_FEATURE_GCS",
"1");
736 if (*ArchInfo == llvm::AArch64::ARMV8_1A)
738 else if (*ArchInfo == llvm::AArch64::ARMV8_2A)
740 else if (*ArchInfo == llvm::AArch64::ARMV8_3A)
742 else if (*ArchInfo == llvm::AArch64::ARMV8_4A)
744 else if (*ArchInfo == llvm::AArch64::ARMV8_5A)
746 else if (*ArchInfo == llvm::AArch64::ARMV8_6A)
748 else if (*ArchInfo == llvm::AArch64::ARMV8_7A)
750 else if (*ArchInfo == llvm::AArch64::ARMV8_8A)
752 else if (*ArchInfo == llvm::AArch64::ARMV8_9A)
754 else if (*ArchInfo == llvm::AArch64::ARMV9A)
756 else if (*ArchInfo == llvm::AArch64::ARMV9_1A)
758 else if (*ArchInfo == llvm::AArch64::ARMV9_2A)
760 else if (*ArchInfo == llvm::AArch64::ARMV9_3A)
762 else if (*ArchInfo == llvm::AArch64::ARMV9_4A)
764 else if (*ArchInfo == llvm::AArch64::ARMV9_5A)
766 else if (*ArchInfo == llvm::AArch64::ARMV9_6A)
768 else if (*ArchInfo == llvm::AArch64::ARMV9_7A)
772 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
773 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
774 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
775 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
776 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
779 Builder.defineMacro(
"__FP_FAST_FMA",
"1");
780 Builder.defineMacro(
"__FP_FAST_FMAF",
"1");
784 Builder.defineMacro(
"__ARM_FEATURE_SVE_VECTOR_OPERATORS",
"2");
786 if (Opts.VScaleMin && Opts.VScaleMin == Opts.VScaleMax) {
787 Builder.defineMacro(
"__ARM_FEATURE_SVE_BITS", Twine(Opts.VScaleMin * 128));
806std::optional<std::pair<unsigned, unsigned>>
809 llvm::StringMap<bool> *FeatureMap)
const {
811 (LangOpts.VScaleMin || LangOpts.VScaleMax))
812 return std::pair<unsigned, unsigned>(
813 LangOpts.VScaleMin ? LangOpts.VScaleMin : 1,
814 LangOpts.VScaleMax ? LangOpts.VScaleMax : 16);
817 (LangOpts.VScaleStreamingMin || LangOpts.VScaleStreamingMax))
818 return std::pair<unsigned, unsigned>(
819 LangOpts.VScaleStreamingMin ? LangOpts.VScaleStreamingMin : 1,
820 LangOpts.VScaleStreamingMax ? LangOpts.VScaleStreamingMax : 16);
823 ((LangOpts.VScaleMin && LangOpts.VScaleStreamingMin) ||
824 (LangOpts.VScaleMax && LangOpts.VScaleStreamingMax))) {
826 std::min(LangOpts.VScaleMin ? LangOpts.VScaleMin : 1,
827 LangOpts.VScaleStreamingMin ? LangOpts.VScaleStreamingMin : 1);
828 unsigned Max = std::max(
829 LangOpts.VScaleMax ? LangOpts.VScaleMax : 16,
830 LangOpts.VScaleStreamingMax ? LangOpts.VScaleStreamingMax : 16);
831 return std::pair(
Min,
Max);
834 if (
hasFeature(
"sve") || (FeatureMap && (FeatureMap->lookup(
"sve"))))
835 return std::pair<unsigned, unsigned>(1, 16);
838 (
hasFeature(
"sme") || (FeatureMap && (FeatureMap->lookup(
"sme")))))
839 return std::pair<unsigned, unsigned>(1, 16);
846 return llvm::AArch64::getFMVPriority(Features);
851 if (
auto Ext = llvm::AArch64::parseFMVExtension(Name))
852 return Ext->ID.has_value();
859 FeatureStr.split(Features,
"+");
861 if (!llvm::AArch64::parseFMVExtension(
Feature.trim()).has_value())
874 Features.insert(Feat);
880 Features.insert_range(Feats);
888void AArch64TargetInfo::computeFeatureLookup() {
889 FeatureLookupBuilder(HasFeatureLookup)
890 .Cases({
"aarch64",
"arm64",
"arm"},
true)
892 .Case(
"fp", FPU & FPUMode)
893 .Cases({
"neon",
"simd"}, FPU & NeonMode)
894 .Case(
"jscvt", HasJSCVT)
895 .Case(
"fcma", HasFCMA)
896 .Case(
"rng", HasRandGen)
897 .Case(
"flagm", HasFlagM)
898 .Case(
"flagm2", HasAlternativeNZCV)
899 .Case(
"fp16fml", HasFP16FML)
900 .Case(
"dotprod", HasDotProd)
905 .Case(
"cssc", HasCSSC)
906 .Case(
"sha2", HasSHA2)
907 .Case(
"sha3", HasSHA3)
908 .Cases({
"aes",
"pmull"}, HasAES)
909 .Cases({
"fp16",
"fullfp16"}, HasFullFP16)
911 .Case(
"dpb", HasCCPP)
912 .Case(
"dpb2", HasCCDP)
913 .Case(
"rcpc", HasRCPC)
914 .Case(
"frintts", HasFRInt3264)
915 .Case(
"i8mm", HasMatMul)
916 .Case(
"bf16", HasBFloat16)
917 .Case(
"sve", FPU & SveMode)
918 .Case(
"sve-b16b16", HasSVEB16B16)
919 .Case(
"f32mm", FPU & SveMode && HasMatmulFP32)
920 .Case(
"f64mm", FPU & SveMode && HasMatmulFP64)
921 .Case(
"sve2", FPU & SveMode && HasSVE2)
922 .Case(
"sve-aes", HasSVEAES)
923 .Case(
"sve-bitperm", FPU & HasSVEBitPerm)
924 .Case(
"sve2-sha3", FPU & SveMode && HasSVE2SHA3)
925 .Case(
"sve2-sm4", FPU & SveMode && HasSVE2SM4)
926 .Case(
"sve2p1", FPU & SveMode && HasSVE2p1)
928 .Case(
"sme2", HasSME2)
929 .Case(
"sme2p1", HasSME2p1)
930 .Case(
"sme-f64f64", HasSMEF64F64)
931 .Case(
"sme-i16i64", HasSMEI16I64)
932 .Case(
"sme-fa64", HasSMEFA64)
933 .Case(
"sme-f16f16", HasSMEF16F16)
934 .Case(
"sme-b16b16", HasSMEB16B16)
935 .Case(
"memtag", HasMTE)
937 .Case(
"predres", HasPredRes)
938 .Cases({
"ssbs",
"ssbs2"}, HasSSBS)
940 .Cases({
"ls64",
"ls64_v",
"ls64_accdata"}, HasLS64)
941 .Case(
"wfxt", HasWFxT)
942 .Case(
"rcpc3", HasRCPC3)
944 .Case(
"fp8fma", HasFP8FMA)
945 .Case(
"fp8dot2", HasFP8DOT2)
946 .Case(
"fp8dot4", HasFP8DOT4)
947 .Case(
"ssve-fp8dot2", HasSSVE_FP8DOT2)
948 .Case(
"ssve-fp8dot4", HasSSVE_FP8DOT4)
949 .Case(
"ssve-fp8fma", HasSSVE_FP8FMA)
950 .Case(
"sme-f8f32", HasSME_F8F32)
951 .Case(
"sme-f8f16", HasSME_F8F16)
952 .Case(
"fprcvt", HasFPRCVT)
953 .Case(
"f8f16mm", HasF8F16MM)
954 .Case(
"f8f32mm", HasF8F32MM)
955 .Case(
"sve-f16f32mm", HasSVE_F16F32MM)
956 .Case(
"sve-bfscale", HasSVE_BFSCALE)
957 .Case(
"sve-aes2", HasSVE_AES2)
958 .Case(
"ssve-aes", HasSSVE_AES)
959 .Case(
"sve2p2", FPU & SveMode && HasSVE2p2)
960 .Case(
"sme2p2", HasSME2p2)
961 .Case(
"sve2p3", FPU & SveMode && HasSVE2p3)
962 .Case(
"sme2p3", HasSME2p3)
963 .Case(
"sve-b16mm", HasSVE_B16MM)
964 .Case(
"f16mm", HasF16MM)
965 .Case(
"f16f32dot", HasF16F32DOT)
966 .Case(
"f16f32mm", HasF16F32MM);
970 return HasFeatureLookup.contains(
Feature);
974 StringRef Name,
bool Enabled)
const {
975 Features[Name] = Enabled;
978 const std::optional<llvm::AArch64::ArchInfo> ArchInfo =
979 llvm::AArch64::ArchInfo::findBySubArch(Name);
988 for (
const auto &OtherArch : llvm::AArch64::ArchInfos)
989 if (ArchInfo->implies(OtherArch))
990 Features[OtherArch.getSubArch()] =
true;
993 std::vector<StringRef> CPUFeats;
994 if (llvm::AArch64::getExtensionFeatures(ArchInfo->DefaultExts, CPUFeats)) {
995 for (
auto F : CPUFeats) {
996 assert(F[0] ==
'+' &&
"Expected + in target feature!");
997 Features[F.drop_front(1)] =
true;
1004 for (
const auto &
Feature : Features) {
1046 if (
Feature ==
"+sve2-sha3") {
1061 HasSVEB16B16 =
true;
1062 if (
Feature ==
"+sve-bitperm") {
1065 HasSVEBitPerm =
true;
1071 HasMatmulFP32 =
true;
1077 HasMatmulFP64 =
true;
1097 if (
Feature ==
"+sme-f64f64") {
1099 HasSMEF64F64 =
true;
1103 if (
Feature ==
"+sme-i16i64") {
1105 HasSMEI16I64 =
true;
1116 if (
Feature ==
"+sme-f16f16") {
1121 HasSMEF16F16 =
true;
1123 if (
Feature ==
"+sme-b16b16") {
1128 HasSVEB16B16 =
true;
1129 HasSMEB16B16 =
true;
1140 if (
Feature ==
"+ssve-fp8dot2")
1141 HasSSVE_FP8DOT2 =
true;
1142 if (
Feature ==
"+ssve-fp8dot4")
1143 HasSSVE_FP8DOT4 =
true;
1144 if (
Feature ==
"+ssve-fp8fma")
1145 HasSSVE_FP8FMA =
true;
1147 HasSME_F8F32 =
true;
1149 HasSME_F8F16 =
true;
1192 HasFRInt3264 =
true;
1197 if (
Feature ==
"+strict-align")
1205 if (
Feature ==
"+sve-f16f32mm")
1206 HasSVE_F16F32MM =
true;
1208 HasSVE_B16MM =
true;
1212 HasF16F32DOT =
true;
1215 if (
Feature ==
"+sve-bfscale")
1216 HasSVE_BFSCALE =
true;
1231 if (
Feature ==
"+v8a" && ArchInfo->Version < llvm::AArch64::ARMV8A.Version)
1232 ArchInfo = &llvm::AArch64::ARMV8A;
1234 ArchInfo->Version < llvm::AArch64::ARMV8_1A.Version)
1235 ArchInfo = &llvm::AArch64::ARMV8_1A;
1237 ArchInfo->Version < llvm::AArch64::ARMV8_2A.Version)
1238 ArchInfo = &llvm::AArch64::ARMV8_2A;
1240 ArchInfo->Version < llvm::AArch64::ARMV8_3A.Version)
1241 ArchInfo = &llvm::AArch64::ARMV8_3A;
1243 ArchInfo->Version < llvm::AArch64::ARMV8_4A.Version)
1244 ArchInfo = &llvm::AArch64::ARMV8_4A;
1246 ArchInfo->Version < llvm::AArch64::ARMV8_5A.Version)
1247 ArchInfo = &llvm::AArch64::ARMV8_5A;
1249 ArchInfo->Version < llvm::AArch64::ARMV8_6A.Version)
1250 ArchInfo = &llvm::AArch64::ARMV8_6A;
1252 ArchInfo->Version < llvm::AArch64::ARMV8_7A.Version)
1253 ArchInfo = &llvm::AArch64::ARMV8_7A;
1255 ArchInfo->Version < llvm::AArch64::ARMV8_8A.Version)
1256 ArchInfo = &llvm::AArch64::ARMV8_8A;
1258 ArchInfo->Version < llvm::AArch64::ARMV8_9A.Version)
1259 ArchInfo = &llvm::AArch64::ARMV8_9A;
1260 if (
Feature ==
"+v9a" && ArchInfo->Version < llvm::AArch64::ARMV9A.Version)
1261 ArchInfo = &llvm::AArch64::ARMV9A;
1263 ArchInfo->Version < llvm::AArch64::ARMV9_1A.Version)
1264 ArchInfo = &llvm::AArch64::ARMV9_1A;
1266 ArchInfo->Version < llvm::AArch64::ARMV9_2A.Version)
1267 ArchInfo = &llvm::AArch64::ARMV9_2A;
1269 ArchInfo->Version < llvm::AArch64::ARMV9_3A.Version)
1270 ArchInfo = &llvm::AArch64::ARMV9_3A;
1272 ArchInfo->Version < llvm::AArch64::ARMV9_4A.Version)
1273 ArchInfo = &llvm::AArch64::ARMV9_4A;
1275 ArchInfo->Version < llvm::AArch64::ARMV9_5A.Version)
1276 ArchInfo = &llvm::AArch64::ARMV9_5A;
1278 ArchInfo->Version < llvm::AArch64::ARMV9_6A.Version)
1279 ArchInfo = &llvm::AArch64::ARMV9_6A;
1281 ArchInfo->Version < llvm::AArch64::ARMV9_7A.Version)
1282 ArchInfo = &llvm::AArch64::ARMV9_7A;
1284 ArchInfo = &llvm::AArch64::ARMV8R;
1316 HasAlternativeNZCV =
true;
1337 for (
const auto &
Feature : Features) {
1356 computeFeatureLookup();
1373 if (Features ==
"default")
1376 Features.split(AttrFeatures,
",");
1377 bool FoundArch =
false;
1379 auto SplitAndAddFeatures = [](StringRef FeatString,
1380 std::vector<std::string> &Features,
1381 llvm::AArch64::ExtensionSet &FeatureBits) {
1383 FeatString.split(SplitFeatures, StringRef(
"+"), -1,
false);
1384 for (StringRef
Feature : SplitFeatures) {
1385 if (FeatureBits.parseModifier(
Feature))
1393 if (
Feature.starts_with(
"no"))
1394 Features.push_back(
"-" +
Feature.drop_front(2).str());
1396 Features.push_back(
"+" +
Feature.str());
1400 llvm::AArch64::ExtensionSet FeatureBits;
1402 FeatureBits.reconstructFromParsedFeatures(
getTargetOpts().FeaturesAsWritten,
1405 for (
auto &
Feature : AttrFeatures) {
1407 if (
Feature.starts_with(
"fpmath="))
1410 if (
Feature.starts_with(
"branch-protection=")) {
1411 Ret.BranchProtection =
Feature.split(
'=').second.trim();
1415 if (
Feature.starts_with(
"arch=")) {
1417 Ret.Duplicate =
"arch=";
1419 std::pair<StringRef, StringRef> Split =
1420 Feature.split(
"=").second.trim().split(
"+");
1421 const llvm::AArch64::ArchInfo *AI = llvm::AArch64::parseArch(Split.first);
1427 FeatureBits.addArchDefaults(*AI);
1429 SplitAndAddFeatures(Split.second, Ret.Features, FeatureBits);
1430 }
else if (
Feature.starts_with(
"cpu=")) {
1431 if (!Ret.CPU.empty())
1432 Ret.Duplicate =
"cpu=";
1436 std::pair<StringRef, StringRef> Split =
1437 Feature.split(
"=").second.trim().split(
"+");
1438 Ret.CPU = Split.first;
1439 if (
auto CpuInfo = llvm::AArch64::parseCpu(Ret.CPU)) {
1440 FeatureBits.addCPUDefaults(*CpuInfo);
1441 SplitAndAddFeatures(Split.second, Ret.Features, FeatureBits);
1444 }
else if (
Feature.starts_with(
"tune=")) {
1445 if (!Ret.Tune.empty())
1446 Ret.Duplicate =
"tune=";
1448 Ret.Tune =
Feature.split(
"=").second.trim();
1449 }
else if (
Feature.starts_with(
"+")) {
1450 SplitAndAddFeatures(
Feature, Ret.Features, FeatureBits);
1452 if (FeatureBits.parseModifier(
Feature,
true))
1460 if (
Feature.starts_with(
"no-"))
1461 Ret.Features.push_back(
"-" +
Feature.drop_front(3).str());
1463 Ret.Features.push_back(
"+" +
Feature.str());
1466 FeatureBits.toLLVMFeatureList(Ret.Features);
1499const char *
const AArch64TargetInfo::GCCRegNames[] = {
1503 "w0",
"w1",
"w2",
"w3",
"w4",
"w5",
"w6",
"w7",
"w8",
"w9",
"w10",
"w11",
1504 "w12",
"w13",
"w14",
"w15",
"w16",
"w17",
"w18",
"w19",
"w20",
"w21",
"w22",
1505 "w23",
"w24",
"w25",
"w26",
"w27",
"w28",
"w29",
"w30",
"wsp",
1508 "x0",
"x1",
"x2",
"x3",
"x4",
"x5",
"x6",
"x7",
"x8",
"x9",
"x10",
"x11",
1509 "x12",
"x13",
"x14",
"x15",
"x16",
"x17",
"x18",
"x19",
"x20",
"x21",
"x22",
1510 "x23",
"x24",
"x25",
"x26",
"x27",
"x28",
"fp",
"lr",
"sp",
1513 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
1514 "s12",
"s13",
"s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
1515 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
1518 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
"d8",
"d9",
"d10",
"d11",
1519 "d12",
"d13",
"d14",
"d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
1520 "d23",
"d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
1523 "v0",
"v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
"v9",
"v10",
"v11",
1524 "v12",
"v13",
"v14",
"v15",
"v16",
"v17",
"v18",
"v19",
"v20",
"v21",
"v22",
1525 "v23",
"v24",
"v25",
"v26",
"v27",
"v28",
"v29",
"v30",
"v31",
1528 "z0",
"z1",
"z2",
"z3",
"z4",
"z5",
"z6",
"z7",
"z8",
"z9",
"z10",
1529 "z11",
"z12",
"z13",
"z14",
"z15",
"z16",
"z17",
"z18",
"z19",
"z20",
"z21",
1530 "z22",
"z23",
"z24",
"z25",
"z26",
"z27",
"z28",
"z29",
"z30",
"z31",
1533 "p0",
"p1",
"p2",
"p3",
"p4",
"p5",
"p6",
"p7",
"p8",
"p9",
"p10",
1534 "p11",
"p12",
"p13",
"p14",
"p15",
1537 "pn0",
"pn1",
"pn2",
"pn3",
"pn4",
"pn5",
"pn6",
"pn7",
"pn8",
1538 "pn9",
"pn10",
"pn11",
"pn12",
"pn13",
"pn14",
"pn15",
1583 {{
"r29",
"x29"},
"fp"},
1584 {{
"r30",
"x30"},
"lr"},
1595 constexpr unsigned len = 5;
1596 auto RV = llvm::StringSwitch<unsigned>(Name)
1620 switch (*Constraint) {
1622 R = std::string(
"@3") + std::string(Constraint, 3);
1627 std::string Converted =
"{" + std::string(Constraint, Len) +
"}";
1628 Constraint += Len - 1;
1631 return std::string(1, *Constraint);
1663 if (Name[1] ==
'p' &&
1664 (Name[2] ==
'l' || Name[2] ==
'a' || Name[2] ==
'h')) {
1670 if (Name[1] ==
'c' && (Name[2] ==
'i' || Name[2] ==
'j')) {
1706 StringRef Constraint,
char Modifier,
unsigned Size,
1707 std::string &SuggestedModifier)
const {
1709 Constraint = Constraint.ltrim(
"=+&");
1711 switch (Constraint[0]) {
1731 SuggestedModifier =
"w";
1749 const llvm::APSInt &value)
const {
1750 return 0 <= value && value <= 3;
1761 Builder.defineMacro(
"__AARCH64EL__");
1771 Builder.defineMacro(
"__AARCH64EB__");
1772 Builder.defineMacro(
"__AARCH_BIG_ENDIAN");
1773 Builder.defineMacro(
"__ARM_BIG_ENDIAN");
1835 Builder.defineMacro(
"_M_X64",
"100");
1836 Builder.defineMacro(
"_M_AMD64",
"100");
1837 Builder.defineMacro(
"_M_ARM64EC",
"1");
1839 Builder.defineMacro(
"_M_ARM64",
"1");
1849 bool HasNonWeakDef)
const {
1859 TheCXXABI.set(TargetCXXABI::GenericAArch64);
1887 TheCXXABI.set(TargetCXXABI::AppleARM64);
1892 const llvm::Triple &Triple) {
1893 Builder.defineMacro(
"__AARCH64_SIMD__");
1894 if (Triple.isArch32Bit())
1895 Builder.defineMacro(
"__ARM64_ARCH_8_32__");
1897 Builder.defineMacro(
"__ARM64_ARCH_8__");
1898 Builder.defineMacro(
"__ARM_NEON__");
1899 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
1900 Builder.defineMacro(
"__arm64",
"1");
1901 Builder.defineMacro(
"__arm64__",
"1");
1903 if (Triple.isArm64e()) {
1904 Builder.defineMacro(
"__arm64e__",
"1");
1905 Builder.defineMacro(
"__PTRAUTH_INTRINSICS__",
"1");
1910 const llvm::Triple &Triple,
1918 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 constexpr LangASMap 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