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"
23#include "llvm/TargetParser/Triple.h"
48#define GET_BUILTIN_STR_TABLE
49#include "clang/Basic/BuiltinsAArch64.inc"
50#undef GET_BUILTIN_STR_TABLE
53#define GET_BUILTIN_INFOS
54#include "clang/Basic/BuiltinsAArch64.inc"
55#undef GET_BUILTIN_INFOS
59#define GET_BUILTIN_PREFIXED_INFOS
60#include "clang/Basic/BuiltinsAArch64.inc"
61#undef GET_BUILTIN_PREFIXED_INFOS
68#define GET_NEON_BUILTIN_STR_TABLE
69#include "clang/Basic/arm_neon.inc"
70#undef GET_NEON_BUILTIN_STR_TABLE
72static constexpr std::array<Builtin::Info, NumNeonBuiltins>
BuiltinInfos = {
73#define GET_NEON_BUILTIN_INFOS
74#include "clang/Basic/arm_neon.inc"
75#undef GET_NEON_BUILTIN_INFOS
79#define GET_NEON_BUILTIN_STR_TABLE
80#include "clang/Basic/arm_fp16.inc"
81#undef GET_NEON_BUILTIN_STR_TABLE
83static constexpr std::array<Builtin::Info, NumFp16Builtins>
BuiltinInfos = {
84#define GET_NEON_BUILTIN_INFOS
85#include "clang/Basic/arm_fp16.inc"
86#undef GET_NEON_BUILTIN_INFOS
92#define GET_SVE_BUILTIN_STR_TABLE
93#include "clang/Basic/arm_sve_builtins.inc"
94#undef GET_SVE_BUILTIN_STR_TABLE
96static constexpr std::array<Builtin::Info, NumSVEBuiltins>
BuiltinInfos = {
97#define GET_SVE_BUILTIN_INFOS
98#include "clang/Basic/arm_sve_builtins.inc"
99#undef GET_SVE_BUILTIN_INFOS
104#define GET_SME_BUILTIN_STR_TABLE
105#include "clang/Basic/arm_sme_builtins.inc"
106#undef GET_SME_BUILTIN_STR_TABLE
108static constexpr std::array<Builtin::Info, NumSMEBuiltins>
BuiltinInfos = {
109#define GET_SME_BUILTIN_INFOS
110#include "clang/Basic/arm_sme_builtins.inc"
111#undef GET_SME_BUILTIN_INFOS
118#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
119#define GET_SVE_BUILTINS
120#include "clang/Basic/BuiltinsAArch64NeonSVEBridge.def"
121#undef GET_SVE_BUILTINS
127#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
128#define GET_SVE_BUILTINS
129#include "clang/Basic/BuiltinsAArch64NeonSVEBridge.def"
130#undef GET_SVE_BUILTINS
156 if (Triple.isArch64Bit())
203 TheCXXABI.set(TargetCXXABI::GenericAArch64);
205 if (Triple.getOS() == llvm::Triple::Linux)
206 this->MCountName =
"\01_mcount";
207 else if (Triple.getOS() == llvm::Triple::UnknownOS)
208 this->MCountName = Triple.isGNUEnvironment() ?
"\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(
Attr.BranchProtection, PBP, Err,
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")
279 if (
Attr.SignReturnAddrHardening.empty())
282 else if (
auto Hardening =
292std::optional<LangOptions::SignReturnAddressHardeningKind>
294 return llvm::StringSwitch<
295 std::optional<LangOptions::SignReturnAddressHardeningKind>>(Spec)
296 .Case(
"load-return-address",
299 .Default(std::nullopt);
303 return llvm::AArch64::parseCpu(Name).has_value();
310 llvm::AArch64::fillValidCPUArchList(Values);
315 Builder.defineMacro(
"__ARM_FEATURE_QRDMX",
"1");
326 Builder.defineMacro(
"__ARM_FEATURE_COMPLEX",
"1");
327 Builder.defineMacro(
"__ARM_FEATURE_JCVT",
"1");
340 Builder.defineMacro(
"__ARM_FEATURE_FRINT",
"1");
431 if (
T.isWindowsArm64EC()) {
434 Builder.defineMacro(
"__amd64__");
435 Builder.defineMacro(
"__amd64");
436 Builder.defineMacro(
"__x86_64");
437 Builder.defineMacro(
"__x86_64__");
438 Builder.defineMacro(
"__arm64ec__");
440 Builder.defineMacro(
"__aarch64__");
444 if (
T.getOS() == llvm::Triple::UnknownOS &&
445 T.getEnvironment() == llvm::Triple::UnknownEnvironment &&
446 T.getObjectFormat() == llvm::Triple::ELF && Opts.CPlusPlus) {
447 Builder.defineMacro(
"_GNU_SOURCE");
451 Builder.defineMacro(
"__LFI__");
454 Builder.defineMacro(
"__GCC_ASM_FLAG_OUTPUTS__");
457 if (CodeModel ==
"default")
459 for (
char &c : CodeModel)
461 Builder.defineMacro(
"__AARCH64_CMODEL_" + CodeModel +
"__");
464 Builder.defineMacro(
"__ARM_ACLE_VERSION(year, quarter, patch)",
465 "(100 * (year) + 10 * (quarter) + (patch))");
466#define ARM_ACLE_VERSION(Y, Q, P) (100 * (Y) + 10 * (Q) + (P))
468 Builder.defineMacro(
"__FUNCTION_MULTI_VERSIONING_SUPPORT_LEVEL",
470#undef ARM_ACLE_VERSION
471 Builder.defineMacro(
"__ARM_ARCH",
472 std::to_string(ArchInfo->Version.getMajor()));
473 Builder.defineMacro(
"__ARM_ARCH_PROFILE",
474 std::string(
"'") + (
char)ArchInfo->Profile +
"'");
476 Builder.defineMacro(
"__ARM_64BIT_STATE",
"1");
477 Builder.defineMacro(
"__ARM_PCS_AAPCS64",
"1");
478 Builder.defineMacro(
"__ARM_ARCH_ISA_A64",
"1");
480 Builder.defineMacro(
"__ARM_FEATURE_CLZ",
"1");
481 Builder.defineMacro(
"__ARM_FEATURE_FMA",
"1");
482 Builder.defineMacro(
"__ARM_FEATURE_LDREX",
"0xF");
483 Builder.defineMacro(
"__ARM_FEATURE_IDIV",
"1");
484 Builder.defineMacro(
"__ARM_FEATURE_DIV");
485 Builder.defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
486 Builder.defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
488 Builder.defineMacro(
"__ARM_ALIGN_MAX_STACK_PWR",
"4");
492 Builder.defineMacro(
"__ARM_STATE_ZA",
"1");
493 Builder.defineMacro(
"__ARM_STATE_ZT0",
"1");
497 Builder.defineMacro(
"__ARM_FP",
"0xE");
501 Builder.defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
502 Builder.defineMacro(
"__ARM_FP16_ARGS",
"1");
505 Builder.defineMacro(
"__ARM_NEON_SVE_BRIDGE",
"1");
507 if (Opts.UnsafeFPMath)
508 Builder.defineMacro(
"__ARM_FP_FAST",
"1");
510 Builder.defineMacro(
"__ARM_SIZEOF_WCHAR_T",
511 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
513 Builder.defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
516 Builder.defineMacro(
"__ARM_PREFETCH_RANGE",
"1");
518 if (FPU & NeonMode) {
519 Builder.defineMacro(
"__ARM_NEON",
"1");
521 Builder.defineMacro(
"__ARM_NEON_FP",
"0xE");
525 Builder.defineMacro(
"__ARM_FEATURE_SVE",
"1");
528 Builder.defineMacro(
"__ARM_FEATURE_SVE2",
"1");
531 Builder.defineMacro(
"__ARM_FEATURE_SVE2p1",
"1");
533 if (HasSVE2 && HasSVEAES)
534 Builder.defineMacro(
"__ARM_FEATURE_SVE2_AES",
"1");
536 if (HasSVE2 && HasSVEBitPerm)
537 Builder.defineMacro(
"__ARM_FEATURE_SVE2_BITPERM",
"1");
539 if (HasSVE2 && HasSVE2SHA3)
540 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SHA3",
"1");
542 if (HasSVE2 && HasSVE2SM4)
543 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SM4",
"1");
546 Builder.defineMacro(
"__ARM_FEATURE_SVE_B16B16",
"1");
549 Builder.defineMacro(
"__ARM_FEATURE_SME");
550 Builder.defineMacro(
"__ARM_FEATURE_LOCALLY_STREAMING",
"1");
554 Builder.defineMacro(
"__ARM_FEATURE_SME2",
"1");
557 Builder.defineMacro(
"__ARM_FEATURE_SME2p1",
"1");
560 Builder.defineMacro(
"__ARM_FEATURE_SME_F16F16",
"1");
563 Builder.defineMacro(
"__ARM_FEATURE_SME_B16B16",
"1");
566 Builder.defineMacro(
"__ARM_FEATURE_FP8",
"1");
569 Builder.defineMacro(
"__ARM_FEATURE_FP8FMA",
"1");
572 Builder.defineMacro(
"__ARM_FEATURE_FP8DOT2",
"1");
575 Builder.defineMacro(
"__ARM_FEATURE_FP8DOT4",
"1");
578 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8DOT2",
"1");
581 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8DOT4",
"1");
584 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8FMA",
"1");
587 Builder.defineMacro(
"__ARM_FEATURE_SME_F8F32",
"1");
590 Builder.defineMacro(
"__ARM_FEATURE_SME_F8F16",
"1");
593 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
596 Builder.defineMacro(
"__ARM_FEATURE_CSSC",
"1");
599 Builder.defineMacro(
"__ARM_FEATURE_RCPC",
"3");
601 Builder.defineMacro(
"__ARM_FEATURE_RCPC",
"1");
604 Builder.defineMacro(
"__ARM_FEATURE_FPRCVT",
"1");
607 Builder.defineMacro(
"__ARM_FEATURE_F8F16MM",
"1");
610 Builder.defineMacro(
"__ARM_FEATURE_F8F32MM",
"1");
613 Builder.defineMacro(
"__ARM_FEATURE_SVE_F16F32MM",
"1");
616 Builder.defineMacro(
"__ARM_FEATURE_SVE_BFSCALE",
"1");
619 Builder.defineMacro(
"__ARM_FEATURE_SVE_B16MM",
"1");
622 Builder.defineMacro(
"__ARM_FEATURE_F16MM",
"1");
625 Builder.defineMacro(
"__ARM_FEATURE_F16F32DOT",
"1");
628 Builder.defineMacro(
"__ARM_FEATURE_F16F32MM",
"1");
631 Builder.defineMacro(
"__ARM_FEATURE_SVE_AES2",
"1");
634 Builder.defineMacro(
"__ARM_FEATURE_SSVE_AES",
"1");
637 Builder.defineMacro(
"__ARM_FEATURE_SVE2p2",
"1");
640 Builder.defineMacro(
"__ARM_FEATURE_SVE2p3",
"1");
643 Builder.defineMacro(
"__ARM_FEATURE_SME2p2",
"1");
646 Builder.defineMacro(
"__ARM_FEATURE_SME2p3",
"1");
649 Builder.defineMacro(
"__HAVE_FUNCTION_MULTI_VERSIONING",
"1");
653 if (HasAES && HasSHA2)
654 Builder.defineMacro(
"__ARM_FEATURE_CRYPTO",
"1");
657 Builder.defineMacro(
"__ARM_FEATURE_AES",
"1");
660 Builder.defineMacro(
"__ARM_FEATURE_SHA2",
"1");
663 Builder.defineMacro(
"__ARM_FEATURE_SHA3",
"1");
664 Builder.defineMacro(
"__ARM_FEATURE_SHA512",
"1");
668 Builder.defineMacro(
"__ARM_FEATURE_SM3",
"1");
669 Builder.defineMacro(
"__ARM_FEATURE_SM4",
"1");
673 Builder.defineMacro(
"__ARM_FEATURE_PAUTH",
"1");
676 Builder.defineMacro(
"__ARM_FEATURE_PAUTH_LR",
"1");
679 Builder.defineMacro(
"__ARM_FEATURE_BTI",
"1");
682 Builder.defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
684 if ((FPU & NeonMode) && HasFullFP16)
685 Builder.defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
687 Builder.defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
690 Builder.defineMacro(
"__ARM_FEATURE_DOTPROD",
"1");
693 Builder.defineMacro(
"__ARM_FEATURE_MEMORY_TAGGING",
"1");
696 Builder.defineMacro(
"__ARM_FEATURE_MATMUL_INT8",
"1");
699 Builder.defineMacro(
"__ARM_FEATURE_ATOMICS",
"1");
702 Builder.defineMacro(
"__ARM_FEATURE_BF16",
"1");
703 Builder.defineMacro(
"__ARM_FEATURE_BF16_VECTOR_ARITHMETIC",
"1");
704 Builder.defineMacro(
"__ARM_BF16_FORMAT_ALTERNATIVE",
"1");
705 Builder.defineMacro(
"__ARM_FEATURE_BF16_SCALAR_ARITHMETIC",
"1");
708 if ((FPU & SveMode) && HasBFloat16) {
709 Builder.defineMacro(
"__ARM_FEATURE_SVE_BF16",
"1");
712 if ((FPU & SveMode) && HasMatmulFP64)
713 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP64",
"1");
715 if ((FPU & SveMode) && HasMatmulFP32)
716 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP32",
"1");
718 if ((FPU & SveMode) && HasMatMul)
719 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_INT8",
"1");
721 if ((FPU & NeonMode) && HasFP16FML)
722 Builder.defineMacro(
"__ARM_FEATURE_FP16_FML",
"1");
740 if (Opts.BranchProtectionPAuthLR)
743 Builder.defineMacro(
"__ARM_FEATURE_PAC_DEFAULT", std::to_string(
Value));
746 if (Opts.BranchTargetEnforcement)
747 Builder.defineMacro(
"__ARM_FEATURE_BTI_DEFAULT",
"1");
749 if (Opts.GuardedControlStack)
750 Builder.defineMacro(
"__ARM_FEATURE_GCS_DEFAULT",
"1");
753 Builder.defineMacro(
"__ARM_FEATURE_LS64",
"1");
756 Builder.defineMacro(
"__ARM_FEATURE_RNG",
"1");
759 Builder.defineMacro(
"__ARM_FEATURE_MOPS",
"1");
762 Builder.defineMacro(
"__ARM_FEATURE_SYSREG128",
"1");
765 Builder.defineMacro(
"__ARM_FEATURE_GCS",
"1");
767 if (*ArchInfo == llvm::AArch64::ARMV8_1A)
769 else if (*ArchInfo == llvm::AArch64::ARMV8_2A)
771 else if (*ArchInfo == llvm::AArch64::ARMV8_3A)
773 else if (*ArchInfo == llvm::AArch64::ARMV8_4A)
775 else if (*ArchInfo == llvm::AArch64::ARMV8_5A)
777 else if (*ArchInfo == llvm::AArch64::ARMV8_6A)
779 else if (*ArchInfo == llvm::AArch64::ARMV8_7A)
781 else if (*ArchInfo == llvm::AArch64::ARMV8_8A)
783 else if (*ArchInfo == llvm::AArch64::ARMV8_9A)
785 else if (*ArchInfo == llvm::AArch64::ARMV9A)
787 else if (*ArchInfo == llvm::AArch64::ARMV9_1A)
789 else if (*ArchInfo == llvm::AArch64::ARMV9_2A)
791 else if (*ArchInfo == llvm::AArch64::ARMV9_3A)
793 else if (*ArchInfo == llvm::AArch64::ARMV9_4A)
795 else if (*ArchInfo == llvm::AArch64::ARMV9_5A)
797 else if (*ArchInfo == llvm::AArch64::ARMV9_6A)
799 else if (*ArchInfo == llvm::AArch64::ARMV9_7A)
801 else if (*ArchInfo == llvm::AArch64::ARMV9_8A)
805 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
806 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
807 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
808 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
809 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
812 Builder.defineMacro(
"__FP_FAST_FMA",
"1");
813 Builder.defineMacro(
"__FP_FAST_FMAF",
"1");
817 Builder.defineMacro(
"__ARM_FEATURE_SVE_VECTOR_OPERATORS",
"2");
819 if (Opts.VScaleMin && Opts.VScaleMin == Opts.VScaleMax) {
820 Builder.defineMacro(
"__ARM_FEATURE_SVE_BITS", Twine(Opts.VScaleMin * 128));
839std::optional<std::pair<unsigned, unsigned>>
842 llvm::StringMap<bool> *FeatureMap)
const {
844 (LangOpts.VScaleMin || LangOpts.VScaleMax))
845 return std::pair<unsigned, unsigned>(
846 LangOpts.VScaleMin ? LangOpts.VScaleMin : 1,
847 LangOpts.VScaleMax ? LangOpts.VScaleMax : 16);
850 (LangOpts.VScaleStreamingMin || LangOpts.VScaleStreamingMax))
851 return std::pair<unsigned, unsigned>(
852 LangOpts.VScaleStreamingMin ? LangOpts.VScaleStreamingMin : 1,
853 LangOpts.VScaleStreamingMax ? LangOpts.VScaleStreamingMax : 16);
856 ((LangOpts.VScaleMin && LangOpts.VScaleStreamingMin) ||
857 (LangOpts.VScaleMax && LangOpts.VScaleStreamingMax))) {
859 std::min(LangOpts.VScaleMin ? LangOpts.VScaleMin : 1,
860 LangOpts.VScaleStreamingMin ? LangOpts.VScaleStreamingMin : 1);
861 unsigned Max = std::max(
862 LangOpts.VScaleMax ? LangOpts.VScaleMax : 16,
863 LangOpts.VScaleStreamingMax ? LangOpts.VScaleStreamingMax : 16);
864 return std::pair(
Min,
Max);
867 if (
hasFeature(
"sve") || (FeatureMap && (FeatureMap->lookup(
"sve"))))
868 return std::pair<unsigned, unsigned>(1, 16);
871 (
hasFeature(
"sme") || (FeatureMap && (FeatureMap->lookup(
"sme")))))
872 return std::pair<unsigned, unsigned>(1, 16);
879 return llvm::AArch64::getFMVPriority(Features);
884 if (
auto Ext = llvm::AArch64::parseFMVExtension(Name))
885 return Ext->ID.has_value();
892 FeatureStr.split(Features,
"+");
894 if (!llvm::AArch64::parseFMVExtension(
Feature.trim()).has_value())
907 Features.insert(Feat);
913 Features.insert_range(Feats);
921void AArch64TargetInfo::computeFeatureLookup() {
922 FeatureLookupBuilder(HasFeatureLookup)
923 .Cases({
"aarch64",
"arm64",
"arm"},
true)
925 .Case(
"fp", FPU & FPUMode)
926 .Cases({
"neon",
"simd"}, FPU & NeonMode)
927 .Case(
"jscvt", HasJSCVT)
928 .Case(
"fcma", HasFCMA)
929 .Case(
"rng", HasRandGen)
930 .Case(
"flagm", HasFlagM)
931 .Case(
"flagm2", HasAlternativeNZCV)
932 .Case(
"fp16fml", HasFP16FML)
933 .Case(
"dotprod", HasDotProd)
938 .Case(
"cssc", HasCSSC)
939 .Case(
"sha2", HasSHA2)
940 .Case(
"sha3", HasSHA3)
941 .Cases({
"aes",
"pmull"}, HasAES)
942 .Cases({
"fp16",
"fullfp16"}, HasFullFP16)
944 .Case(
"dpb", HasCCPP)
945 .Case(
"dpb2", HasCCDP)
946 .Case(
"rcpc", HasRCPC)
947 .Case(
"frintts", HasFRInt3264)
948 .Case(
"i8mm", HasMatMul)
949 .Case(
"bf16", HasBFloat16)
950 .Case(
"sve", FPU & SveMode)
951 .Case(
"sve-b16b16", HasSVEB16B16)
952 .Case(
"f32mm", FPU & SveMode && HasMatmulFP32)
953 .Case(
"f64mm", FPU & SveMode && HasMatmulFP64)
954 .Case(
"sve2", FPU & SveMode && HasSVE2)
955 .Case(
"sve-aes", HasSVEAES)
956 .Case(
"sve-bitperm", FPU & HasSVEBitPerm)
957 .Case(
"sve2-sha3", FPU & SveMode && HasSVE2SHA3)
958 .Case(
"sve2-sm4", FPU & SveMode && HasSVE2SM4)
959 .Case(
"sve2p1", FPU & SveMode && HasSVE2p1)
961 .Case(
"sme2", HasSME2)
962 .Case(
"sme2p1", HasSME2p1)
963 .Case(
"sme-f64f64", HasSMEF64F64)
964 .Case(
"sme-i16i64", HasSMEI16I64)
965 .Case(
"sme-fa64", HasSMEFA64)
966 .Case(
"sme-f16f16", HasSMEF16F16)
967 .Case(
"sme-b16b16", HasSMEB16B16)
968 .Case(
"memtag", HasMTE)
970 .Case(
"predres", HasPredRes)
971 .Cases({
"ssbs",
"ssbs2"}, HasSSBS)
973 .Cases({
"ls64",
"ls64_v",
"ls64_accdata"}, HasLS64)
974 .Case(
"wfxt", HasWFxT)
975 .Case(
"rcpc3", HasRCPC3)
977 .Case(
"fp8fma", HasFP8FMA)
978 .Case(
"fp8dot2", HasFP8DOT2)
979 .Case(
"fp8dot4", HasFP8DOT4)
980 .Case(
"ssve-fp8dot2", HasSSVE_FP8DOT2)
981 .Case(
"ssve-fp8dot4", HasSSVE_FP8DOT4)
982 .Case(
"ssve-fp8fma", HasSSVE_FP8FMA)
983 .Case(
"sme-f8f32", HasSME_F8F32)
984 .Case(
"sme-f8f16", HasSME_F8F16)
985 .Case(
"fprcvt", HasFPRCVT)
986 .Case(
"f8f16mm", HasF8F16MM)
987 .Case(
"f8f32mm", HasF8F32MM)
988 .Case(
"sve-f16f32mm", HasSVE_F16F32MM)
989 .Case(
"sve-bfscale", HasSVE_BFSCALE)
990 .Case(
"sve-aes2", HasSVE_AES2)
991 .Case(
"ssve-aes", HasSSVE_AES)
992 .Case(
"sve2p2", FPU & SveMode && HasSVE2p2)
993 .Case(
"sme2p2", HasSME2p2)
994 .Case(
"sve2p3", FPU & SveMode && HasSVE2p3)
995 .Case(
"sme2p3", HasSME2p3)
996 .Case(
"sve-b16mm", HasSVE_B16MM)
997 .Case(
"f16mm", HasF16MM)
998 .Case(
"f16f32dot", HasF16F32DOT)
999 .Case(
"f16f32mm", HasF16F32MM);
1003 return HasFeatureLookup.contains(
Feature);
1007 StringRef Name,
bool Enabled)
const {
1008 Features[Name] = Enabled;
1011 const std::optional<llvm::AArch64::ArchInfo> ArchInfo =
1012 llvm::AArch64::ArchInfo::findBySubArch(Name);
1021 for (
const auto &OtherArch : llvm::AArch64::ArchInfos)
1022 if (ArchInfo->implies(OtherArch))
1023 Features[OtherArch.getSubArch()] =
true;
1026 std::vector<StringRef> CPUFeats;
1027 if (llvm::AArch64::getExtensionFeatures(ArchInfo->DefaultExts, CPUFeats)) {
1028 for (
auto F : CPUFeats) {
1029 assert(F[0] ==
'+' &&
"Expected + in target feature!");
1030 Features[F.drop_front(1)] =
true;
1037 for (
const auto &
Feature : Features) {
1079 if (
Feature ==
"+sve2-sha3") {
1094 HasSVEB16B16 =
true;
1095 if (
Feature ==
"+sve-bitperm") {
1098 HasSVEBitPerm =
true;
1104 HasMatmulFP32 =
true;
1110 HasMatmulFP64 =
true;
1130 if (
Feature ==
"+sme-f64f64") {
1132 HasSMEF64F64 =
true;
1136 if (
Feature ==
"+sme-i16i64") {
1138 HasSMEI16I64 =
true;
1149 if (
Feature ==
"+sme-f16f16") {
1154 HasSMEF16F16 =
true;
1156 if (
Feature ==
"+sme-b16b16") {
1161 HasSVEB16B16 =
true;
1162 HasSMEB16B16 =
true;
1173 if (
Feature ==
"+ssve-fp8dot2")
1174 HasSSVE_FP8DOT2 =
true;
1175 if (
Feature ==
"+ssve-fp8dot4")
1176 HasSSVE_FP8DOT4 =
true;
1177 if (
Feature ==
"+ssve-fp8fma")
1178 HasSSVE_FP8FMA =
true;
1180 HasSME_F8F32 =
true;
1182 HasSME_F8F16 =
true;
1225 HasFRInt3264 =
true;
1230 if (
Feature ==
"+strict-align")
1238 if (
Feature ==
"+sve-f16f32mm")
1239 HasSVE_F16F32MM =
true;
1241 HasSVE_B16MM =
true;
1245 HasF16F32DOT =
true;
1248 if (
Feature ==
"+sve-bfscale")
1249 HasSVE_BFSCALE =
true;
1264 if (
Feature ==
"+v8a" && ArchInfo->Version < llvm::AArch64::ARMV8A.Version)
1265 ArchInfo = &llvm::AArch64::ARMV8A;
1267 ArchInfo->Version < llvm::AArch64::ARMV8_1A.Version)
1268 ArchInfo = &llvm::AArch64::ARMV8_1A;
1270 ArchInfo->Version < llvm::AArch64::ARMV8_2A.Version)
1271 ArchInfo = &llvm::AArch64::ARMV8_2A;
1273 ArchInfo->Version < llvm::AArch64::ARMV8_3A.Version)
1274 ArchInfo = &llvm::AArch64::ARMV8_3A;
1276 ArchInfo->Version < llvm::AArch64::ARMV8_4A.Version)
1277 ArchInfo = &llvm::AArch64::ARMV8_4A;
1279 ArchInfo->Version < llvm::AArch64::ARMV8_5A.Version)
1280 ArchInfo = &llvm::AArch64::ARMV8_5A;
1282 ArchInfo->Version < llvm::AArch64::ARMV8_6A.Version)
1283 ArchInfo = &llvm::AArch64::ARMV8_6A;
1285 ArchInfo->Version < llvm::AArch64::ARMV8_7A.Version)
1286 ArchInfo = &llvm::AArch64::ARMV8_7A;
1288 ArchInfo->Version < llvm::AArch64::ARMV8_8A.Version)
1289 ArchInfo = &llvm::AArch64::ARMV8_8A;
1291 ArchInfo->Version < llvm::AArch64::ARMV8_9A.Version)
1292 ArchInfo = &llvm::AArch64::ARMV8_9A;
1293 if (
Feature ==
"+v9a" && ArchInfo->Version < llvm::AArch64::ARMV9A.Version)
1294 ArchInfo = &llvm::AArch64::ARMV9A;
1296 ArchInfo->Version < llvm::AArch64::ARMV9_1A.Version)
1297 ArchInfo = &llvm::AArch64::ARMV9_1A;
1299 ArchInfo->Version < llvm::AArch64::ARMV9_2A.Version)
1300 ArchInfo = &llvm::AArch64::ARMV9_2A;
1302 ArchInfo->Version < llvm::AArch64::ARMV9_3A.Version)
1303 ArchInfo = &llvm::AArch64::ARMV9_3A;
1305 ArchInfo->Version < llvm::AArch64::ARMV9_4A.Version)
1306 ArchInfo = &llvm::AArch64::ARMV9_4A;
1308 ArchInfo->Version < llvm::AArch64::ARMV9_5A.Version)
1309 ArchInfo = &llvm::AArch64::ARMV9_5A;
1311 ArchInfo->Version < llvm::AArch64::ARMV9_6A.Version)
1312 ArchInfo = &llvm::AArch64::ARMV9_6A;
1314 ArchInfo->Version < llvm::AArch64::ARMV9_7A.Version)
1315 ArchInfo = &llvm::AArch64::ARMV9_7A;
1317 ArchInfo->Version < llvm::AArch64::ARMV9_8A.Version)
1318 ArchInfo = &llvm::AArch64::ARMV9_8A;
1320 ArchInfo = &llvm::AArch64::ARMV8R;
1352 HasAlternativeNZCV =
true;
1373 for (
const auto &
Feature : Features) {
1392 computeFeatureLookup();
1409 if (Features ==
"default")
1412 Features.split(AttrFeatures,
",");
1413 bool FoundArch =
false;
1415 auto SplitAndAddFeatures = [](StringRef FeatString,
1416 std::vector<std::string> &Features,
1417 llvm::AArch64::ExtensionSet &FeatureBits) {
1419 FeatString.split(SplitFeatures, StringRef(
"+"), -1,
false);
1420 for (StringRef
Feature : SplitFeatures) {
1421 if (FeatureBits.parseModifier(
Feature))
1429 if (
Feature.starts_with(
"no"))
1430 Features.push_back(
"-" +
Feature.drop_front(2).str());
1432 Features.push_back(
"+" +
Feature.str());
1436 llvm::AArch64::ExtensionSet FeatureBits;
1438 FeatureBits.reconstructFromParsedFeatures(
getTargetOpts().FeaturesAsWritten,
1441 for (
auto &
Feature : AttrFeatures) {
1443 if (
Feature.starts_with(
"fpmath="))
1446 if (
Feature.starts_with(
"branch-protection=")) {
1447 Ret.BranchProtection =
Feature.split(
'=').second.trim();
1451 if (
Feature.starts_with(
"harden-pac-ret=")) {
1452 Ret.SignReturnAddrHardening =
Feature.split(
'=').second.trim();
1456 if (
Feature.starts_with(
"arch=")) {
1458 Ret.Duplicate =
"arch=";
1460 std::pair<StringRef, StringRef> Split =
1461 Feature.split(
"=").second.trim().split(
"+");
1462 const llvm::AArch64::ArchInfo *AI = llvm::AArch64::parseArch(Split.first);
1468 FeatureBits.addArchDefaults(*AI);
1470 SplitAndAddFeatures(Split.second, Ret.Features, FeatureBits);
1471 }
else if (
Feature.starts_with(
"cpu=")) {
1472 if (!Ret.CPU.empty())
1473 Ret.Duplicate =
"cpu=";
1477 std::pair<StringRef, StringRef> Split =
1478 Feature.split(
"=").second.trim().split(
"+");
1479 Ret.CPU = Split.first;
1480 if (
auto CpuInfo = llvm::AArch64::parseCpu(Ret.CPU)) {
1481 FeatureBits.addCPUDefaults(*CpuInfo);
1482 SplitAndAddFeatures(Split.second, Ret.Features, FeatureBits);
1485 }
else if (
Feature.starts_with(
"tune=")) {
1486 if (!Ret.Tune.empty())
1487 Ret.Duplicate =
"tune=";
1489 Ret.Tune =
Feature.split(
"=").second.trim();
1490 }
else if (
Feature.starts_with(
"+")) {
1491 SplitAndAddFeatures(
Feature, Ret.Features, FeatureBits);
1493 if (FeatureBits.parseModifier(
Feature,
true))
1501 if (
Feature.starts_with(
"no-"))
1502 Ret.Features.push_back(
"-" +
Feature.drop_front(3).str());
1504 Ret.Features.push_back(
"+" +
Feature.str());
1507 FeatureBits.toLLVMFeatureList(Ret.Features);
1540const char *
const AArch64TargetInfo::GCCRegNames[] = {
1544 "w0",
"w1",
"w2",
"w3",
"w4",
"w5",
"w6",
"w7",
"w8",
"w9",
"w10",
"w11",
1545 "w12",
"w13",
"w14",
"w15",
"w16",
"w17",
"w18",
"w19",
"w20",
"w21",
"w22",
1546 "w23",
"w24",
"w25",
"w26",
"w27",
"w28",
"w29",
"w30",
"wsp",
1549 "x0",
"x1",
"x2",
"x3",
"x4",
"x5",
"x6",
"x7",
"x8",
"x9",
"x10",
"x11",
1550 "x12",
"x13",
"x14",
"x15",
"x16",
"x17",
"x18",
"x19",
"x20",
"x21",
"x22",
1551 "x23",
"x24",
"x25",
"x26",
"x27",
"x28",
"fp",
"lr",
"sp",
1554 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
1555 "s12",
"s13",
"s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
1556 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
1559 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
"d8",
"d9",
"d10",
"d11",
1560 "d12",
"d13",
"d14",
"d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
1561 "d23",
"d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
1564 "v0",
"v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
"v9",
"v10",
"v11",
1565 "v12",
"v13",
"v14",
"v15",
"v16",
"v17",
"v18",
"v19",
"v20",
"v21",
"v22",
1566 "v23",
"v24",
"v25",
"v26",
"v27",
"v28",
"v29",
"v30",
"v31",
1569 "z0",
"z1",
"z2",
"z3",
"z4",
"z5",
"z6",
"z7",
"z8",
"z9",
"z10",
1570 "z11",
"z12",
"z13",
"z14",
"z15",
"z16",
"z17",
"z18",
"z19",
"z20",
"z21",
1571 "z22",
"z23",
"z24",
"z25",
"z26",
"z27",
"z28",
"z29",
"z30",
"z31",
1574 "p0",
"p1",
"p2",
"p3",
"p4",
"p5",
"p6",
"p7",
"p8",
"p9",
"p10",
1575 "p11",
"p12",
"p13",
"p14",
"p15",
1578 "pn0",
"pn1",
"pn2",
"pn3",
"pn4",
"pn5",
"pn6",
"pn7",
"pn8",
1579 "pn9",
"pn10",
"pn11",
"pn12",
"pn13",
"pn14",
"pn15",
1624 {{
"r29",
"x29"},
"fp"},
1625 {{
"r30",
"x30"},
"lr"},
1636 constexpr unsigned len = 5;
1637 auto RV = llvm::StringSwitch<unsigned>(Name)
1661 switch (*Constraint) {
1663 R = std::string(
"@3") + std::string(Constraint, 3);
1668 std::string Converted =
"{" + std::string(Constraint, Len) +
"}";
1669 Constraint += Len - 1;
1672 return std::string(1, *Constraint);
1704 if (Name[1] ==
'p' &&
1705 (Name[2] ==
'l' || Name[2] ==
'a' || Name[2] ==
'h')) {
1711 if (Name[1] ==
'c' && (Name[2] ==
'i' || Name[2] ==
'j')) {
1747 StringRef Constraint,
char Modifier,
unsigned Size,
1748 std::string &SuggestedModifier)
const {
1750 Constraint = Constraint.ltrim(
"=+&");
1752 switch (Constraint[0]) {
1772 SuggestedModifier =
"w";
1790 const llvm::APSInt &value)
const {
1791 return 0 <= value && value <= 3;
1802 Builder.defineMacro(
"__AARCH64EL__");
1812 Builder.defineMacro(
"__AARCH64EB__");
1813 Builder.defineMacro(
"__AARCH_BIG_ENDIAN");
1814 Builder.defineMacro(
"__ARM_BIG_ENDIAN");
1876 Builder.defineMacro(
"_M_X64",
"100");
1877 Builder.defineMacro(
"_M_AMD64",
"100");
1878 Builder.defineMacro(
"_M_ARM64EC",
"1");
1880 Builder.defineMacro(
"_M_ARM64",
"1");
1890 bool HasNonWeakDef)
const {
1900 TheCXXABI.set(TargetCXXABI::GenericAArch64);
1978 TheCXXABI.set(TargetCXXABI::AppleARM64);
1983 const llvm::Triple &Triple) {
1984 Builder.defineMacro(
"__AARCH64_SIMD__");
1985 if (Triple.isArch32Bit())
1986 Builder.defineMacro(
"__ARM64_ARCH_8_32__");
1988 Builder.defineMacro(
"__ARM64_ARCH_8__");
1989 Builder.defineMacro(
"__ARM_NEON__");
1990 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
1991 Builder.defineMacro(
"__arm64",
"1");
1992 Builder.defineMacro(
"__arm64__",
"1");
1994 if (Triple.isArm64e()) {
1995 Builder.defineMacro(
"__arm64e__",
"1");
1996 Builder.defineMacro(
"__PTRAUTH_INTRINSICS__",
"1");
2001 const llvm::Triple &Triple,
2009 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.
Attr - This represents one attribute.
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
Regular return address signing.
@ LoadReturnAddress
Hardened return address signing with load from the return address.
@ 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::SignReturnAddressHardeningKind SignReturnAddressHardening
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::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
bool validateBranchProtection(const ParsedTargetAttr &Attr, BranchProtectionInfo &BPI, const LangOptions &LO, StringRef &Err) const override
Determines whether this TargetInfo supports the given branch protection specification.
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.
std::optional< LangOptions::SignReturnAddressHardeningKind > parseSignReturnAddressHardening(StringRef Spec) const override
Parse the Return Address Authentication Hardening specification.
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
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 getTargetDefinesARMV98A(const LangOptions &Opts, MacroBuilder &Builder) const
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)
TargetInfo::CallingConvKind getCallingConvKind(bool ClangABICompat4) const override
UEFIAArch64TargetInfo(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.
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
UEFITargetInfo(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
Top level wrappers for InstallAPI frontend operations.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
unsigned Microsoft64BitMinGlobalAlign(uint64_t TypeSize)
const FunctionProtoType * T
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