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_NEON_BUILTIN_STR_TABLE
48#include "clang/Basic/arm_neon.inc"
49#undef GET_NEON_BUILTIN_STR_TABLE
51static constexpr std::array<Builtin::Info, NumNeonBuiltins>
BuiltinInfos = {
52#define GET_NEON_BUILTIN_INFOS
53#include "clang/Basic/arm_neon.inc"
54#undef GET_NEON_BUILTIN_INFOS
58#define GET_NEON_BUILTIN_STR_TABLE
59#include "clang/Basic/arm_fp16.inc"
60#undef GET_NEON_BUILTIN_STR_TABLE
62static constexpr std::array<Builtin::Info, NumFp16Builtins>
BuiltinInfos = {
63#define GET_NEON_BUILTIN_INFOS
64#include "clang/Basic/arm_fp16.inc"
65#undef GET_NEON_BUILTIN_INFOS
71#define GET_SVE_BUILTIN_STR_TABLE
72#include "clang/Basic/arm_sve_builtins.inc"
73#undef GET_SVE_BUILTIN_STR_TABLE
75static constexpr std::array<Builtin::Info, NumSVEBuiltins>
BuiltinInfos = {
76#define GET_SVE_BUILTIN_INFOS
77#include "clang/Basic/arm_sve_builtins.inc"
78#undef GET_SVE_BUILTIN_INFOS
83#define GET_SME_BUILTIN_STR_TABLE
84#include "clang/Basic/arm_sme_builtins.inc"
85#undef GET_SME_BUILTIN_STR_TABLE
87static constexpr std::array<Builtin::Info, NumSMEBuiltins>
BuiltinInfos = {
88#define GET_SME_BUILTIN_INFOS
89#include "clang/Basic/arm_sme_builtins.inc"
90#undef GET_SME_BUILTIN_INFOS
97#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
98#define GET_SVE_BUILTINS
99#include "clang/Basic/BuiltinsAArch64NeonSVEBridge.def"
100#undef GET_SVE_BUILTINS
105#define BUILTIN CLANG_BUILTIN_STR_TABLE
106#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
107#define TARGET_HEADER_BUILTIN CLANG_TARGET_HEADER_BUILTIN_STR_TABLE
108#include "clang/Basic/BuiltinsAArch64.def"
113#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
114#define GET_SVE_BUILTINS
115#include "clang/Basic/BuiltinsAArch64NeonSVEBridge.def"
116#undef GET_SVE_BUILTINS
121#define BUILTIN CLANG_BUILTIN_ENTRY
122#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
123#define LANGBUILTIN CLANG_LANGBUILTIN_ENTRY
124#define TARGET_HEADER_BUILTIN CLANG_TARGET_HEADER_BUILTIN_ENTRY
125#include "clang/Basic/BuiltinsAArch64.def"
150 if (Triple.isArch64Bit())
197 TheCXXABI.set(TargetCXXABI::GenericAArch64);
199 if (Triple.getOS() == llvm::Triple::Linux)
200 this->MCountName =
"\01_mcount";
201 else if (Triple.getOS() == llvm::Triple::UnknownOS)
203 Opts.
EABIVersion == llvm::EABI::GNU ?
"\01_mcount" :
"mcount";
209 if (Name !=
"aapcs" && Name !=
"aapcs-soft" && Name !=
"darwinpcs")
220 Diags.
Report(diag::err_target_unsupported_abi_with_fpu) <<
ABI;
227 StringRef RegName,
unsigned RegSize,
bool &HasSizeMismatch)
const {
228 if (RegName ==
"sp") {
229 HasSizeMismatch = RegSize != 64;
232 if (RegName.starts_with(
"w"))
233 HasSizeMismatch = RegSize != 32;
234 else if (RegName.starts_with(
"x"))
235 HasSizeMismatch = RegSize != 64;
238 StringRef RegNum = RegName.drop_front();
241 return RegNum ==
"0" ||
243 llvm::AArch64::isX18ReservedByDefault(
getTriple())) ||
250 StringRef &Err)
const {
251 llvm::ARM::ParsedBranchProtection PBP;
252 if (!llvm::ARM::parseBranchProtection(Spec, PBP, Err, HasPAuthLR))
257 if (LO.PointerAuthReturns &&
258 (PBP.Scope !=
"none" || PBP.BranchProtectionPAuthLR ||
259 PBP.GuardedControlStack))
263 llvm::StringSwitch<LangOptions::SignReturnAddressScopeKind>(PBP.Scope)
268 if (PBP.Key ==
"a_key")
280 return llvm::AArch64::parseCpu(Name).has_value();
289 llvm::AArch64::fillValidCPUArchList(Values);
294 Builder.defineMacro(
"__ARM_FEATURE_QRDMX",
"1");
305 Builder.defineMacro(
"__ARM_FEATURE_COMPLEX",
"1");
306 Builder.defineMacro(
"__ARM_FEATURE_JCVT",
"1");
319 Builder.defineMacro(
"__ARM_FEATURE_FRINT",
"1");
406 Builder.defineMacro(
"__amd64__");
407 Builder.defineMacro(
"__amd64");
408 Builder.defineMacro(
"__x86_64");
409 Builder.defineMacro(
"__x86_64__");
410 Builder.defineMacro(
"__arm64ec__");
412 Builder.defineMacro(
"__aarch64__");
416 Builder.defineMacro(
"__LFI__");
419 Builder.defineMacro(
"__GCC_ASM_FLAG_OUTPUTS__");
422 if (CodeModel ==
"default")
424 for (
char &
c : CodeModel)
426 Builder.defineMacro(
"__AARCH64_CMODEL_" + CodeModel +
"__");
429 Builder.defineMacro(
"__ARM_ACLE_VERSION(year, quarter, patch)",
430 "(100 * (year) + 10 * (quarter) + (patch))");
431#define ARM_ACLE_VERSION(Y, Q, P) (100 * (Y) + 10 * (Q) + (P))
433 Builder.defineMacro(
"__FUNCTION_MULTI_VERSIONING_SUPPORT_LEVEL",
435#undef ARM_ACLE_VERSION
436 Builder.defineMacro(
"__ARM_ARCH",
437 std::to_string(ArchInfo->Version.getMajor()));
438 Builder.defineMacro(
"__ARM_ARCH_PROFILE",
439 std::string(
"'") + (
char)ArchInfo->Profile +
"'");
441 Builder.defineMacro(
"__ARM_64BIT_STATE",
"1");
442 Builder.defineMacro(
"__ARM_PCS_AAPCS64",
"1");
443 Builder.defineMacro(
"__ARM_ARCH_ISA_A64",
"1");
445 Builder.defineMacro(
"__ARM_FEATURE_CLZ",
"1");
446 Builder.defineMacro(
"__ARM_FEATURE_FMA",
"1");
447 Builder.defineMacro(
"__ARM_FEATURE_LDREX",
"0xF");
448 Builder.defineMacro(
"__ARM_FEATURE_IDIV",
"1");
449 Builder.defineMacro(
"__ARM_FEATURE_DIV");
450 Builder.defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
451 Builder.defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
453 Builder.defineMacro(
"__ARM_ALIGN_MAX_STACK_PWR",
"4");
457 Builder.defineMacro(
"__ARM_STATE_ZA",
"1");
458 Builder.defineMacro(
"__ARM_STATE_ZT0",
"1");
462 Builder.defineMacro(
"__ARM_FP",
"0xE");
466 Builder.defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
467 Builder.defineMacro(
"__ARM_FP16_ARGS",
"1");
470 Builder.defineMacro(
"__ARM_NEON_SVE_BRIDGE",
"1");
472 if (Opts.UnsafeFPMath)
473 Builder.defineMacro(
"__ARM_FP_FAST",
"1");
475 Builder.defineMacro(
"__ARM_SIZEOF_WCHAR_T",
476 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
478 Builder.defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
481 Builder.defineMacro(
"__ARM_PREFETCH_RANGE",
"1");
483 if (FPU & NeonMode) {
484 Builder.defineMacro(
"__ARM_NEON",
"1");
486 Builder.defineMacro(
"__ARM_NEON_FP",
"0xE");
490 Builder.defineMacro(
"__ARM_FEATURE_SVE",
"1");
493 Builder.defineMacro(
"__ARM_FEATURE_SVE2",
"1");
496 Builder.defineMacro(
"__ARM_FEATURE_SVE2p1",
"1");
498 if (HasSVE2 && HasSVEAES)
499 Builder.defineMacro(
"__ARM_FEATURE_SVE2_AES",
"1");
501 if (HasSVE2 && HasSVEBitPerm)
502 Builder.defineMacro(
"__ARM_FEATURE_SVE2_BITPERM",
"1");
504 if (HasSVE2 && HasSVE2SHA3)
505 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SHA3",
"1");
507 if (HasSVE2 && HasSVE2SM4)
508 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SM4",
"1");
511 Builder.defineMacro(
"__ARM_FEATURE_SVE_B16B16",
"1");
514 Builder.defineMacro(
"__ARM_FEATURE_SME");
515 Builder.defineMacro(
"__ARM_FEATURE_LOCALLY_STREAMING",
"1");
519 Builder.defineMacro(
"__ARM_FEATURE_SME2",
"1");
522 Builder.defineMacro(
"__ARM_FEATURE_SME2p1",
"1");
525 Builder.defineMacro(
"__ARM_FEATURE_SME_F16F16",
"1");
528 Builder.defineMacro(
"__ARM_FEATURE_SME_B16B16",
"1");
531 Builder.defineMacro(
"__ARM_FEATURE_FP8",
"1");
534 Builder.defineMacro(
"__ARM_FEATURE_FP8FMA",
"1");
537 Builder.defineMacro(
"__ARM_FEATURE_FP8DOT2",
"1");
540 Builder.defineMacro(
"__ARM_FEATURE_FP8DOT4",
"1");
543 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8DOT2",
"1");
546 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8DOT4",
"1");
549 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8FMA",
"1");
552 Builder.defineMacro(
"__ARM_FEATURE_SME_F8F32",
"1");
555 Builder.defineMacro(
"__ARM_FEATURE_SME_F8F16",
"1");
558 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
561 Builder.defineMacro(
"__ARM_FEATURE_CSSC",
"1");
564 Builder.defineMacro(
"__ARM_FEATURE_RCPC",
"3");
566 Builder.defineMacro(
"__ARM_FEATURE_RCPC",
"1");
569 Builder.defineMacro(
"__ARM_FEATURE_FPRCVT",
"1");
572 Builder.defineMacro(
"__ARM_FEATURE_F8F16MM",
"1");
575 Builder.defineMacro(
"__ARM_FEATURE_F8F32MM",
"1");
578 Builder.defineMacro(
"__ARM_FEATURE_SVE_F16F32MM",
"1");
581 Builder.defineMacro(
"__ARM_FEATURE_SVE_BFSCALE",
"1");
584 Builder.defineMacro(
"__ARM_FEATURE_SVE_AES2",
"1");
587 Builder.defineMacro(
"__ARM_FEATURE_SSVE_AES",
"1");
590 Builder.defineMacro(
"__ARM_FEATURE_SVE2p2",
"1");
593 Builder.defineMacro(
"__ARM_FEATURE_SME2p2",
"1");
596 Builder.defineMacro(
"__HAVE_FUNCTION_MULTI_VERSIONING",
"1");
600 if (HasAES && HasSHA2)
601 Builder.defineMacro(
"__ARM_FEATURE_CRYPTO",
"1");
604 Builder.defineMacro(
"__ARM_FEATURE_AES",
"1");
607 Builder.defineMacro(
"__ARM_FEATURE_SHA2",
"1");
610 Builder.defineMacro(
"__ARM_FEATURE_SHA3",
"1");
611 Builder.defineMacro(
"__ARM_FEATURE_SHA512",
"1");
615 Builder.defineMacro(
"__ARM_FEATURE_SM3",
"1");
616 Builder.defineMacro(
"__ARM_FEATURE_SM4",
"1");
620 Builder.defineMacro(
"__ARM_FEATURE_PAUTH",
"1");
623 Builder.defineMacro(
"__ARM_FEATURE_PAUTH_LR",
"1");
626 Builder.defineMacro(
"__ARM_FEATURE_BTI",
"1");
629 Builder.defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
631 if ((FPU & NeonMode) && HasFullFP16)
632 Builder.defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
634 Builder.defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
637 Builder.defineMacro(
"__ARM_FEATURE_DOTPROD",
"1");
640 Builder.defineMacro(
"__ARM_FEATURE_MEMORY_TAGGING",
"1");
643 Builder.defineMacro(
"__ARM_FEATURE_MATMUL_INT8",
"1");
646 Builder.defineMacro(
"__ARM_FEATURE_ATOMICS",
"1");
649 Builder.defineMacro(
"__ARM_FEATURE_BF16",
"1");
650 Builder.defineMacro(
"__ARM_FEATURE_BF16_VECTOR_ARITHMETIC",
"1");
651 Builder.defineMacro(
"__ARM_BF16_FORMAT_ALTERNATIVE",
"1");
652 Builder.defineMacro(
"__ARM_FEATURE_BF16_SCALAR_ARITHMETIC",
"1");
655 if ((FPU & SveMode) && HasBFloat16) {
656 Builder.defineMacro(
"__ARM_FEATURE_SVE_BF16",
"1");
659 if ((FPU & SveMode) && HasMatmulFP64)
660 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP64",
"1");
662 if ((FPU & SveMode) && HasMatmulFP32)
663 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP32",
"1");
665 if ((FPU & SveMode) && HasMatMul)
666 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_INT8",
"1");
668 if ((FPU & NeonMode) && HasFP16FML)
669 Builder.defineMacro(
"__ARM_FEATURE_FP16_FML",
"1");
687 if (Opts.BranchProtectionPAuthLR)
690 Builder.defineMacro(
"__ARM_FEATURE_PAC_DEFAULT", std::to_string(
Value));
693 if (Opts.BranchTargetEnforcement)
694 Builder.defineMacro(
"__ARM_FEATURE_BTI_DEFAULT",
"1");
696 if (Opts.GuardedControlStack)
697 Builder.defineMacro(
"__ARM_FEATURE_GCS_DEFAULT",
"1");
700 Builder.defineMacro(
"__ARM_FEATURE_LS64",
"1");
703 Builder.defineMacro(
"__ARM_FEATURE_RNG",
"1");
706 Builder.defineMacro(
"__ARM_FEATURE_MOPS",
"1");
709 Builder.defineMacro(
"__ARM_FEATURE_SYSREG128",
"1");
712 Builder.defineMacro(
"__ARM_FEATURE_GCS",
"1");
714 if (*ArchInfo == llvm::AArch64::ARMV8_1A)
716 else if (*ArchInfo == llvm::AArch64::ARMV8_2A)
718 else if (*ArchInfo == llvm::AArch64::ARMV8_3A)
720 else if (*ArchInfo == llvm::AArch64::ARMV8_4A)
722 else if (*ArchInfo == llvm::AArch64::ARMV8_5A)
724 else if (*ArchInfo == llvm::AArch64::ARMV8_6A)
726 else if (*ArchInfo == llvm::AArch64::ARMV8_7A)
728 else if (*ArchInfo == llvm::AArch64::ARMV8_8A)
730 else if (*ArchInfo == llvm::AArch64::ARMV8_9A)
732 else if (*ArchInfo == llvm::AArch64::ARMV9A)
734 else if (*ArchInfo == llvm::AArch64::ARMV9_1A)
736 else if (*ArchInfo == llvm::AArch64::ARMV9_2A)
738 else if (*ArchInfo == llvm::AArch64::ARMV9_3A)
740 else if (*ArchInfo == llvm::AArch64::ARMV9_4A)
742 else if (*ArchInfo == llvm::AArch64::ARMV9_5A)
744 else if (*ArchInfo == llvm::AArch64::ARMV9_6A)
746 else if (*ArchInfo == llvm::AArch64::ARMV9_7A)
750 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
751 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
752 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
753 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
754 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
757 Builder.defineMacro(
"__FP_FAST_FMA",
"1");
758 Builder.defineMacro(
"__FP_FAST_FMAF",
"1");
762 Builder.defineMacro(
"__ARM_FEATURE_SVE_VECTOR_OPERATORS",
"2");
764 if (Opts.VScaleMin && Opts.VScaleMin == Opts.VScaleMax) {
765 Builder.defineMacro(
"__ARM_FEATURE_SVE_BITS", Twine(Opts.VScaleMin * 128));
782std::optional<std::pair<unsigned, unsigned>>
785 llvm::StringMap<bool> *FeatureMap)
const {
787 (LangOpts.VScaleMin || LangOpts.VScaleMax))
788 return std::pair<unsigned, unsigned>(
789 LangOpts.VScaleMin ? LangOpts.VScaleMin : 1,
790 LangOpts.VScaleMax ? LangOpts.VScaleMax : 16);
793 (LangOpts.VScaleStreamingMin || LangOpts.VScaleStreamingMax))
794 return std::pair<unsigned, unsigned>(
795 LangOpts.VScaleStreamingMin ? LangOpts.VScaleStreamingMin : 1,
796 LangOpts.VScaleStreamingMax ? LangOpts.VScaleStreamingMax : 16);
799 ((LangOpts.VScaleMin && LangOpts.VScaleStreamingMin) ||
800 (LangOpts.VScaleMax && LangOpts.VScaleStreamingMax))) {
802 std::min(LangOpts.VScaleMin ? LangOpts.VScaleMin : 1,
803 LangOpts.VScaleStreamingMin ? LangOpts.VScaleStreamingMin : 1);
804 unsigned Max = std::max(
805 LangOpts.VScaleMax ? LangOpts.VScaleMax : 16,
806 LangOpts.VScaleStreamingMax ? LangOpts.VScaleStreamingMax : 16);
807 return std::pair(
Min,
Max);
810 if (
hasFeature(
"sve") || (FeatureMap && (FeatureMap->lookup(
"sve"))))
811 return std::pair<unsigned, unsigned>(1, 16);
814 (
hasFeature(
"sme") || (FeatureMap && (FeatureMap->lookup(
"sme")))))
815 return std::pair<unsigned, unsigned>(1, 16);
822 return llvm::AArch64::getFMVPriority(Features);
827 if (
auto Ext = llvm::AArch64::parseFMVExtension(Name))
828 return Ext->ID.has_value();
835 FeatureStr.split(Features,
"+");
837 if (!llvm::AArch64::parseFMVExtension(
Feature.trim()).has_value())
843 return llvm::StringSwitch<bool>(
Feature)
844 .Cases({
"aarch64",
"arm64",
"arm"},
true)
846 .Case(
"fp", FPU & FPUMode)
847 .Cases({
"neon",
"simd"}, FPU & NeonMode)
848 .Case(
"jscvt", HasJSCVT)
849 .Case(
"fcma", HasFCMA)
850 .Case(
"rng", HasRandGen)
851 .Case(
"flagm", HasFlagM)
852 .Case(
"flagm2", HasAlternativeNZCV)
853 .Case(
"fp16fml", HasFP16FML)
854 .Case(
"dotprod", HasDotProd)
859 .Case(
"cssc", HasCSSC)
860 .Case(
"sha2", HasSHA2)
861 .Case(
"sha3", HasSHA3)
862 .Cases({
"aes",
"pmull"}, HasAES)
863 .Cases({
"fp16",
"fullfp16"}, HasFullFP16)
865 .Case(
"dpb", HasCCPP)
866 .Case(
"dpb2", HasCCDP)
867 .Case(
"rcpc", HasRCPC)
868 .Case(
"frintts", HasFRInt3264)
869 .Case(
"i8mm", HasMatMul)
870 .Case(
"bf16", HasBFloat16)
871 .Case(
"sve", FPU & SveMode)
872 .Case(
"sve-b16b16", HasSVEB16B16)
873 .Case(
"f32mm", FPU & SveMode && HasMatmulFP32)
874 .Case(
"f64mm", FPU & SveMode && HasMatmulFP64)
875 .Case(
"sve2", FPU & SveMode && HasSVE2)
876 .Case(
"sve-aes", HasSVEAES)
877 .Case(
"sve-bitperm", FPU & HasSVEBitPerm)
878 .Case(
"sve2-sha3", FPU & SveMode && HasSVE2SHA3)
879 .Case(
"sve2-sm4", FPU & SveMode && HasSVE2SM4)
880 .Case(
"sve2p1", FPU & SveMode && HasSVE2p1)
882 .Case(
"sme2", HasSME2)
883 .Case(
"sme2p1", HasSME2p1)
884 .Case(
"sme-f64f64", HasSMEF64F64)
885 .Case(
"sme-i16i64", HasSMEI16I64)
886 .Case(
"sme-fa64", HasSMEFA64)
887 .Case(
"sme-f16f16", HasSMEF16F16)
888 .Case(
"sme-b16b16", HasSMEB16B16)
889 .Case(
"memtag", HasMTE)
891 .Case(
"predres", HasPredRes)
892 .Cases({
"ssbs",
"ssbs2"}, HasSSBS)
894 .Cases({
"ls64",
"ls64_v",
"ls64_accdata"}, HasLS64)
895 .Case(
"wfxt", HasWFxT)
896 .Case(
"rcpc3", HasRCPC3)
898 .Case(
"fp8fma", HasFP8FMA)
899 .Case(
"fp8dot2", HasFP8DOT2)
900 .Case(
"fp8dot4", HasFP8DOT4)
901 .Case(
"ssve-fp8dot2", HasSSVE_FP8DOT2)
902 .Case(
"ssve-fp8dot4", HasSSVE_FP8DOT4)
903 .Case(
"ssve-fp8fma", HasSSVE_FP8FMA)
904 .Case(
"sme-f8f32", HasSME_F8F32)
905 .Case(
"sme-f8f16", HasSME_F8F16)
906 .Case(
"fprcvt", HasFPRCVT)
907 .Case(
"f8f16mm", HasF8F16MM)
908 .Case(
"f8f32mm", HasF8F32MM)
909 .Case(
"sve-f16f32mm", HasSVE_F16F32MM)
910 .Case(
"sve-bfscale", HasSVE_BFSCALE)
911 .Case(
"sve-aes2", HasSVE_AES2)
912 .Case(
"ssve-aes", HasSSVE_AES)
913 .Case(
"sve2p2", FPU & SveMode && HasSVE2p2)
914 .Case(
"sme2p2", HasSME2p2)
919 StringRef Name,
bool Enabled)
const {
920 Features[Name] = Enabled;
923 const std::optional<llvm::AArch64::ArchInfo> ArchInfo =
924 llvm::AArch64::ArchInfo::findBySubArch(Name);
933 for (
const auto *OtherArch : llvm::AArch64::ArchInfos)
934 if (ArchInfo->implies(*OtherArch))
935 Features[OtherArch->getSubArch()] =
true;
938 std::vector<StringRef> CPUFeats;
939 if (llvm::AArch64::getExtensionFeatures(ArchInfo->DefaultExts, CPUFeats)) {
940 for (
auto F : CPUFeats) {
941 assert(F[0] ==
'+' &&
"Expected + in target feature!");
942 Features[F.drop_front(1)] =
true;
949 for (
const auto &
Feature : Features) {
1006 HasSVEB16B16 =
true;
1007 if (
Feature ==
"+sve-bitperm") {
1010 HasSVEBitPerm =
true;
1016 HasMatmulFP32 =
true;
1022 HasMatmulFP64 =
true;
1042 if (
Feature ==
"+sme-f64f64") {
1044 HasSMEF64F64 =
true;
1048 if (
Feature ==
"+sme-i16i64") {
1050 HasSMEI16I64 =
true;
1061 if (
Feature ==
"+sme-f16f16") {
1066 HasSMEF16F16 =
true;
1068 if (
Feature ==
"+sme-b16b16") {
1073 HasSVEB16B16 =
true;
1074 HasSMEB16B16 =
true;
1085 if (
Feature ==
"+ssve-fp8dot2")
1086 HasSSVE_FP8DOT2 =
true;
1087 if (
Feature ==
"+ssve-fp8dot4")
1088 HasSSVE_FP8DOT4 =
true;
1089 if (
Feature ==
"+ssve-fp8fma")
1090 HasSSVE_FP8FMA =
true;
1092 HasSME_F8F32 =
true;
1094 HasSME_F8F16 =
true;
1137 HasFRInt3264 =
true;
1142 if (
Feature ==
"+strict-align")
1150 if (
Feature ==
"+sve-f16f32mm")
1151 HasSVE_F16F32MM =
true;
1152 if (
Feature ==
"+sve-bfscale")
1153 HasSVE_BFSCALE =
true;
1164 if (
Feature ==
"+v8a" && ArchInfo->Version < llvm::AArch64::ARMV8A.Version)
1165 ArchInfo = &llvm::AArch64::ARMV8A;
1167 ArchInfo->Version < llvm::AArch64::ARMV8_1A.Version)
1168 ArchInfo = &llvm::AArch64::ARMV8_1A;
1170 ArchInfo->Version < llvm::AArch64::ARMV8_2A.Version)
1171 ArchInfo = &llvm::AArch64::ARMV8_2A;
1173 ArchInfo->Version < llvm::AArch64::ARMV8_3A.Version)
1174 ArchInfo = &llvm::AArch64::ARMV8_3A;
1176 ArchInfo->Version < llvm::AArch64::ARMV8_4A.Version)
1177 ArchInfo = &llvm::AArch64::ARMV8_4A;
1179 ArchInfo->Version < llvm::AArch64::ARMV8_5A.Version)
1180 ArchInfo = &llvm::AArch64::ARMV8_5A;
1182 ArchInfo->Version < llvm::AArch64::ARMV8_6A.Version)
1183 ArchInfo = &llvm::AArch64::ARMV8_6A;
1185 ArchInfo->Version < llvm::AArch64::ARMV8_7A.Version)
1186 ArchInfo = &llvm::AArch64::ARMV8_7A;
1188 ArchInfo->Version < llvm::AArch64::ARMV8_8A.Version)
1189 ArchInfo = &llvm::AArch64::ARMV8_8A;
1191 ArchInfo->Version < llvm::AArch64::ARMV8_9A.Version)
1192 ArchInfo = &llvm::AArch64::ARMV8_9A;
1193 if (
Feature ==
"+v9a" && ArchInfo->Version < llvm::AArch64::ARMV9A.Version)
1194 ArchInfo = &llvm::AArch64::ARMV9A;
1196 ArchInfo->Version < llvm::AArch64::ARMV9_1A.Version)
1197 ArchInfo = &llvm::AArch64::ARMV9_1A;
1199 ArchInfo->Version < llvm::AArch64::ARMV9_2A.Version)
1200 ArchInfo = &llvm::AArch64::ARMV9_2A;
1202 ArchInfo->Version < llvm::AArch64::ARMV9_3A.Version)
1203 ArchInfo = &llvm::AArch64::ARMV9_3A;
1205 ArchInfo->Version < llvm::AArch64::ARMV9_4A.Version)
1206 ArchInfo = &llvm::AArch64::ARMV9_4A;
1208 ArchInfo->Version < llvm::AArch64::ARMV9_5A.Version)
1209 ArchInfo = &llvm::AArch64::ARMV9_5A;
1211 ArchInfo->Version < llvm::AArch64::ARMV9_6A.Version)
1212 ArchInfo = &llvm::AArch64::ARMV9_6A;
1214 ArchInfo->Version < llvm::AArch64::ARMV9_7A.Version)
1215 ArchInfo = &llvm::AArch64::ARMV9_7A;
1217 ArchInfo = &llvm::AArch64::ARMV8R;
1249 HasAlternativeNZCV =
true;
1270 for (
const auto &
Feature : Features) {
1305 if (Features ==
"default")
1308 Features.split(AttrFeatures,
",");
1309 bool FoundArch =
false;
1311 auto SplitAndAddFeatures = [](StringRef FeatString,
1312 std::vector<std::string> &Features,
1313 llvm::AArch64::ExtensionSet &FeatureBits) {
1315 FeatString.split(SplitFeatures, StringRef(
"+"), -1,
false);
1316 for (StringRef
Feature : SplitFeatures) {
1317 if (FeatureBits.parseModifier(
Feature))
1325 if (
Feature.starts_with(
"no"))
1326 Features.push_back(
"-" +
Feature.drop_front(2).str());
1328 Features.push_back(
"+" +
Feature.str());
1332 llvm::AArch64::ExtensionSet FeatureBits;
1334 FeatureBits.reconstructFromParsedFeatures(
getTargetOpts().FeaturesAsWritten,
1337 for (
auto &
Feature : AttrFeatures) {
1339 if (
Feature.starts_with(
"fpmath="))
1342 if (
Feature.starts_with(
"branch-protection=")) {
1343 Ret.BranchProtection =
Feature.split(
'=').second.trim();
1347 if (
Feature.starts_with(
"arch=")) {
1349 Ret.Duplicate =
"arch=";
1351 std::pair<StringRef, StringRef> Split =
1352 Feature.split(
"=").second.trim().split(
"+");
1353 const llvm::AArch64::ArchInfo *AI = llvm::AArch64::parseArch(Split.first);
1359 FeatureBits.addArchDefaults(*AI);
1361 SplitAndAddFeatures(Split.second, Ret.Features, FeatureBits);
1362 }
else if (
Feature.starts_with(
"cpu=")) {
1363 if (!Ret.CPU.empty())
1364 Ret.Duplicate =
"cpu=";
1368 std::pair<StringRef, StringRef> Split =
1369 Feature.split(
"=").second.trim().split(
"+");
1370 Ret.CPU = Split.first;
1371 if (
auto CpuInfo = llvm::AArch64::parseCpu(Ret.CPU)) {
1372 FeatureBits.addCPUDefaults(*CpuInfo);
1373 SplitAndAddFeatures(Split.second, Ret.Features, FeatureBits);
1376 }
else if (
Feature.starts_with(
"tune=")) {
1377 if (!Ret.Tune.empty())
1378 Ret.Duplicate =
"tune=";
1380 Ret.Tune =
Feature.split(
"=").second.trim();
1381 }
else if (
Feature.starts_with(
"+")) {
1382 SplitAndAddFeatures(
Feature, Ret.Features, FeatureBits);
1384 if (FeatureBits.parseModifier(
Feature,
true))
1392 if (
Feature.starts_with(
"no-"))
1393 Ret.Features.push_back(
"-" +
Feature.drop_front(3).str());
1395 Ret.Features.push_back(
"+" +
Feature.str());
1398 FeatureBits.toLLVMFeatureList(Ret.Features);
1431const char *
const AArch64TargetInfo::GCCRegNames[] = {
1435 "w0",
"w1",
"w2",
"w3",
"w4",
"w5",
"w6",
"w7",
"w8",
"w9",
"w10",
"w11",
1436 "w12",
"w13",
"w14",
"w15",
"w16",
"w17",
"w18",
"w19",
"w20",
"w21",
"w22",
1437 "w23",
"w24",
"w25",
"w26",
"w27",
"w28",
"w29",
"w30",
"wsp",
1440 "x0",
"x1",
"x2",
"x3",
"x4",
"x5",
"x6",
"x7",
"x8",
"x9",
"x10",
"x11",
1441 "x12",
"x13",
"x14",
"x15",
"x16",
"x17",
"x18",
"x19",
"x20",
"x21",
"x22",
1442 "x23",
"x24",
"x25",
"x26",
"x27",
"x28",
"fp",
"lr",
"sp",
1445 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
1446 "s12",
"s13",
"s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
1447 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
1450 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
"d8",
"d9",
"d10",
"d11",
1451 "d12",
"d13",
"d14",
"d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
1452 "d23",
"d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
1455 "v0",
"v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
"v9",
"v10",
"v11",
1456 "v12",
"v13",
"v14",
"v15",
"v16",
"v17",
"v18",
"v19",
"v20",
"v21",
"v22",
1457 "v23",
"v24",
"v25",
"v26",
"v27",
"v28",
"v29",
"v30",
"v31",
1460 "z0",
"z1",
"z2",
"z3",
"z4",
"z5",
"z6",
"z7",
"z8",
"z9",
"z10",
1461 "z11",
"z12",
"z13",
"z14",
"z15",
"z16",
"z17",
"z18",
"z19",
"z20",
"z21",
1462 "z22",
"z23",
"z24",
"z25",
"z26",
"z27",
"z28",
"z29",
"z30",
"z31",
1465 "p0",
"p1",
"p2",
"p3",
"p4",
"p5",
"p6",
"p7",
"p8",
"p9",
"p10",
1466 "p11",
"p12",
"p13",
"p14",
"p15",
1469 "pn0",
"pn1",
"pn2",
"pn3",
"pn4",
"pn5",
"pn6",
"pn7",
"pn8",
1470 "pn9",
"pn10",
"pn11",
"pn12",
"pn13",
"pn14",
"pn15",
1515 {{
"r29",
"x29"},
"fp"},
1516 {{
"r30",
"x30"},
"lr"},
1527 constexpr unsigned len = 5;
1528 auto RV = llvm::StringSwitch<unsigned>(Name)
1552 switch (*Constraint) {
1554 R = std::string(
"@3") + std::string(Constraint, 3);
1559 std::string Converted =
"{" + std::string(Constraint, Len) +
"}";
1560 Constraint += Len - 1;
1563 return std::string(1, *Constraint);
1595 if (Name[1] ==
'p' &&
1596 (Name[2] ==
'l' || Name[2] ==
'a' || Name[2] ==
'h')) {
1602 if (Name[1] ==
'c' && (Name[2] ==
'i' || Name[2] ==
'j')) {
1638 StringRef Constraint,
char Modifier,
unsigned Size,
1639 std::string &SuggestedModifier)
const {
1641 Constraint = Constraint.ltrim(
"=+&");
1643 switch (Constraint[0]) {
1663 SuggestedModifier =
"w";
1681 const llvm::APSInt &value)
const {
1682 return 0 <= value && value <= 3;
1693 Builder.defineMacro(
"__AARCH64EL__");
1703 Builder.defineMacro(
"__AARCH64EB__");
1704 Builder.defineMacro(
"__AARCH_BIG_ENDIAN");
1705 Builder.defineMacro(
"__ARM_BIG_ENDIAN");
1767 Builder.defineMacro(
"_M_X64",
"100");
1768 Builder.defineMacro(
"_M_AMD64",
"100");
1769 Builder.defineMacro(
"_M_ARM64EC",
"1");
1771 Builder.defineMacro(
"_M_ARM64",
"1");
1781 bool HasNonWeakDef)
const {
1789 if (TypeSize >= 512) {
1790 Align = std::max(Align, 128u);
1791 }
else if (TypeSize >= 64) {
1792 Align = std::max(Align, 64u);
1793 }
else if (TypeSize >= 16) {
1794 Align = std::max(Align, 32u);
1802 TheCXXABI.set(TargetCXXABI::GenericAArch64);
1830 TheCXXABI.set(TargetCXXABI::AppleARM64);
1835 const llvm::Triple &Triple) {
1836 Builder.defineMacro(
"__AARCH64_SIMD__");
1837 if (Triple.isArch32Bit())
1838 Builder.defineMacro(
"__ARM64_ARCH_8_32__");
1840 Builder.defineMacro(
"__ARM64_ARCH_8__");
1841 Builder.defineMacro(
"__ARM_NEON__");
1842 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
1843 Builder.defineMacro(
"__arm64",
"1");
1844 Builder.defineMacro(
"__arm64__",
"1");
1846 if (Triple.isArm64e())
1847 Builder.defineMacro(
"__arm64e__",
"1");
1851 const llvm::Triple &Triple,
1859 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 auto BuiltinAArch64Infos
static constexpr llvm::StringTable BuiltinSVENeonBridgeStrings
static constexpr int NumSVENeonBridgeBuiltins
static constexpr int NumNeonBuiltins
static constexpr llvm::StringTable BuiltinAArch64Strings
static constexpr auto BuiltinSVENeonBridgeInfos
static constexpr unsigned NumBuiltins
#define CLANG_BUILTIN_STR_TABLE_START
Defines the clang::LangOptions interface.
Enumerates target-specific builtins in their own namespaces within namespace clang.
__device__ __2f16 float c
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
@ None
No signing for any function.
@ NonLeaf
Sign the return address of functions that spill LR.
@ All
Sign the return address of all functions,.
@ BKey
Return address signing uses APIB key.
@ AKey
Return address signing uses APIA key.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool isSignReturnAddressWithAKey() const
Check if return address signing uses AKey.
bool hasSignReturnAddress() const
Check if return address signing is enabled.
bool isSignReturnAddressScopeAll() const
Check if leaf functions are also signed.
LangOptions::SignReturnAddressScopeKind SignReturnAddr
LangOptions::SignReturnAddressKeyKind SignKey
bool BranchProtectionPAuthLR
bool BranchTargetEnforcement
TargetOptions & getTargetOpts() const
Retrieve the target options.
TargetInfo(const llvm::Triple &T)
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
const LangASMap * AddrSpaceMap
BuiltinVaListKind
The different kinds of __builtin_va_list types defined by the target implementation.
@ AArch64ABIBuiltinVaList
__builtin_va_list as defined by the AArch64 ABI http://infocenter.arm.com/help/topic/com....
@ CharPtrBuiltinVaList
typedef char* __builtin_va_list;
virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const =0
===-— Other target property query methods -----------------------—===//
unsigned HasUnalignedAccess
unsigned char MaxAtomicPromoteWidth
void resetDataLayout()
Set the data layout based on current triple and ABI.
virtual unsigned getMinGlobalAlign(uint64_t Size, bool HasNonWeakDef) const
getMinGlobalAlign - Return the minimum alignment of a global variable, unless its alignment is explic...
unsigned HasAArch64ACLETypes
virtual std::string convertConstraint(const char *&Constraint) const
unsigned char MaxAtomicInlineWidth
unsigned HasBuiltinMSVaList
Options for controlling the target.
llvm::EABI EABIVersion
The EABI version to use.
llvm::StringMap< bool > FeatureMap
The map of which features have been enabled disabled based on the command line.
void getTargetDefinesARMV95A(const LangOptions &Opts, MacroBuilder &Builder) const
std::string_view getClobbers() const override
Returns a string of target-specific clobbers, in LLVM format.
bool hasFeature(StringRef Feature) const override
Determine whether the given target has the given feature.
std::string convertConstraint(const char *&Constraint) const override
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
bool hasBFloat16Type() const override
Determine whether the _BFloat16 type is supported on this target.
ParsedTargetAttr parseTargetAttr(StringRef Str) const override
void getTargetDefinesARMV96A(const LangOptions &Opts, MacroBuilder &Builder) const
void getTargetDefinesARMV97A(const LangOptions &Opts, MacroBuilder &Builder) const
AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
ArrayRef< const char * > getGCCRegNames() const override
bool validateGlobalRegisterVariable(StringRef RegName, unsigned RegSize, bool &HasSizeMismatch) const override
Validate register name used for global register variables.
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
Perform initialization based on the user configured set of features (e.g., +sse4).
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
void setFeatureEnabled(llvm::StringMap< bool > &Features, StringRef Name, bool Enabled) const override
Enable or disable a specific target feature; the feature name must be valid.
llvm::SmallVector< Builtin::InfosShard > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
void getTargetDefinesARMV89A(const LangOptions &Opts, MacroBuilder &Builder) const
void getTargetDefinesARMV92A(const LangOptions &Opts, MacroBuilder &Builder) const
bool validateTarget(DiagnosticsEngine &Diags) const override
Check the target is valid after it is fully initialized.
void getTargetDefinesARMV93A(const LangOptions &Opts, MacroBuilder &Builder) const
bool setABI(const std::string &Name) override
Use the specified ABI.
void getTargetDefinesARMV84A(const LangOptions &Opts, MacroBuilder &Builder) const
bool isValidCPUName(StringRef Name) const override
Determine whether this TargetInfo supports the given CPU name.
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
StringRef getABI() const override
Get the ABI currently in use.
bool hasInt128Type() const override
Determine whether the __int128 type is supported on this target.
void getTargetDefinesARMV88A(const LangOptions &Opts, MacroBuilder &Builder) const
void getTargetDefinesARMV87A(const LangOptions &Opts, MacroBuilder &Builder) const
void getTargetDefinesARMV9A(const LangOptions &Opts, MacroBuilder &Builder) const
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
void getTargetDefinesARMV91A(const LangOptions &Opts, MacroBuilder &Builder) const
std::optional< std::pair< unsigned, unsigned > > getVScaleRange(const LangOptions &LangOpts, ArmStreamingKind Mode, llvm::StringMap< bool > *FeatureMap=nullptr) const override
Returns target-specific min and max values VScale_Range.
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
int getEHDataRegisterNumber(unsigned RegNo) const override
Return the register number that __builtin_eh_return_regno would return with the specified argument.
void getTargetDefinesARMV81A(const LangOptions &Opts, MacroBuilder &Builder) const
bool validateBranchProtection(StringRef Spec, StringRef Arch, BranchProtectionInfo &BPI, const LangOptions &LO, StringRef &Err) const override
Determine if this TargetInfo supports the given branch protection specification.
void getTargetDefinesARMV86A(const LangOptions &Opts, MacroBuilder &Builder) const
bool setCPU(const std::string &Name) override
Target the specified CPU.
void getTargetDefinesARMV94A(const LangOptions &Opts, MacroBuilder &Builder) const
llvm::APInt getFMVPriority(ArrayRef< StringRef > Features) const override
bool validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size, std::string &SuggestedModifier) const override
bool isCLZForZeroUndef() const override
The __builtin_clz* and __builtin_ctz* built-in functions are specified to have undefined results for ...
void getTargetDefinesARMV82A(const LangOptions &Opts, MacroBuilder &Builder) const
void getTargetDefinesARMV83A(const LangOptions &Opts, MacroBuilder &Builder) const
bool validateCpuSupports(StringRef FeatureStr) const override
bool validatePointerAuthKey(const llvm::APSInt &value) const override
Determine whether the given pointer-authentication key is valid.
bool validateAsmConstraint(const char *&Name, TargetInfo::ConstraintInfo &Info) const override
bool doesFeatureAffectCodeGen(StringRef Name) const override
Returns true if feature has an impact on target code generation.
void getTargetDefinesARMV85A(const LangOptions &Opts, MacroBuilder &Builder) const
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
AppleMachOAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
AppleMachOTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
unsigned getMinGlobalAlign(uint64_t TypeSize, bool HasNonWeakDef) const override
getMinGlobalAlign - Return the minimum alignment of a global variable, unless its alignment is explic...
MicrosoftARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
TargetInfo::CallingConvKind getCallingConvKind(bool ClangABICompat4) const override
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
MinGWARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
WindowsARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Defines the clang::TargetInfo interface.
static constexpr 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)
static const unsigned ARM64AddrSpaceMap[]
The JSON file list parser is used to communicate input to InstallAPI.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
CallingConv
CallingConv - Specifies the calling convention that a function uses.
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