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(
"__GCC_ASM_FLAG_OUTPUTS__");
419 if (CodeModel ==
"default")
421 for (
char &
c : CodeModel)
423 Builder.defineMacro(
"__AARCH64_CMODEL_" + CodeModel +
"__");
426 Builder.defineMacro(
"__ARM_ACLE_VERSION(year, quarter, patch)",
427 "(100 * (year) + 10 * (quarter) + (patch))");
428#define ARM_ACLE_VERSION(Y, Q, P) (100 * (Y) + 10 * (Q) + (P))
430 Builder.defineMacro(
"__FUNCTION_MULTI_VERSIONING_SUPPORT_LEVEL",
432#undef ARM_ACLE_VERSION
433 Builder.defineMacro(
"__ARM_ARCH",
434 std::to_string(ArchInfo->Version.getMajor()));
435 Builder.defineMacro(
"__ARM_ARCH_PROFILE",
436 std::string(
"'") + (
char)ArchInfo->Profile +
"'");
438 Builder.defineMacro(
"__ARM_64BIT_STATE",
"1");
439 Builder.defineMacro(
"__ARM_PCS_AAPCS64",
"1");
440 Builder.defineMacro(
"__ARM_ARCH_ISA_A64",
"1");
442 Builder.defineMacro(
"__ARM_FEATURE_CLZ",
"1");
443 Builder.defineMacro(
"__ARM_FEATURE_FMA",
"1");
444 Builder.defineMacro(
"__ARM_FEATURE_LDREX",
"0xF");
445 Builder.defineMacro(
"__ARM_FEATURE_IDIV",
"1");
446 Builder.defineMacro(
"__ARM_FEATURE_DIV");
447 Builder.defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
448 Builder.defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
450 Builder.defineMacro(
"__ARM_ALIGN_MAX_STACK_PWR",
"4");
454 Builder.defineMacro(
"__ARM_STATE_ZA",
"1");
455 Builder.defineMacro(
"__ARM_STATE_ZT0",
"1");
459 Builder.defineMacro(
"__ARM_FP",
"0xE");
463 Builder.defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
464 Builder.defineMacro(
"__ARM_FP16_ARGS",
"1");
467 Builder.defineMacro(
"__ARM_NEON_SVE_BRIDGE",
"1");
469 if (Opts.UnsafeFPMath)
470 Builder.defineMacro(
"__ARM_FP_FAST",
"1");
472 Builder.defineMacro(
"__ARM_SIZEOF_WCHAR_T",
473 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
475 Builder.defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
477 if (FPU & NeonMode) {
478 Builder.defineMacro(
"__ARM_NEON",
"1");
480 Builder.defineMacro(
"__ARM_NEON_FP",
"0xE");
484 Builder.defineMacro(
"__ARM_FEATURE_SVE",
"1");
487 Builder.defineMacro(
"__ARM_FEATURE_SVE2",
"1");
490 Builder.defineMacro(
"__ARM_FEATURE_SVE2p1",
"1");
492 if (HasSVE2 && HasSVEAES)
493 Builder.defineMacro(
"__ARM_FEATURE_SVE2_AES",
"1");
495 if (HasSVE2 && HasSVEBitPerm)
496 Builder.defineMacro(
"__ARM_FEATURE_SVE2_BITPERM",
"1");
498 if (HasSVE2 && HasSVE2SHA3)
499 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SHA3",
"1");
501 if (HasSVE2 && HasSVE2SM4)
502 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SM4",
"1");
505 Builder.defineMacro(
"__ARM_FEATURE_SVE_B16B16",
"1");
508 Builder.defineMacro(
"__ARM_FEATURE_SME");
509 Builder.defineMacro(
"__ARM_FEATURE_LOCALLY_STREAMING",
"1");
513 Builder.defineMacro(
"__ARM_FEATURE_SME2",
"1");
516 Builder.defineMacro(
"__ARM_FEATURE_SME2p1",
"1");
519 Builder.defineMacro(
"__ARM_FEATURE_SME_F16F16",
"1");
522 Builder.defineMacro(
"__ARM_FEATURE_SME_B16B16",
"1");
525 Builder.defineMacro(
"__ARM_FEATURE_FP8",
"1");
528 Builder.defineMacro(
"__ARM_FEATURE_FP8FMA",
"1");
531 Builder.defineMacro(
"__ARM_FEATURE_FP8DOT2",
"1");
534 Builder.defineMacro(
"__ARM_FEATURE_FP8DOT4",
"1");
537 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8DOT2",
"1");
540 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8DOT4",
"1");
543 Builder.defineMacro(
"__ARM_FEATURE_SSVE_FP8FMA",
"1");
546 Builder.defineMacro(
"__ARM_FEATURE_SME_F8F32",
"1");
549 Builder.defineMacro(
"__ARM_FEATURE_SME_F8F16",
"1");
552 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
555 Builder.defineMacro(
"__ARM_FEATURE_CSSC",
"1");
558 Builder.defineMacro(
"__ARM_FEATURE_RCPC",
"3");
560 Builder.defineMacro(
"__ARM_FEATURE_RCPC",
"1");
563 Builder.defineMacro(
"__HAVE_FUNCTION_MULTI_VERSIONING",
"1");
567 if (HasAES && HasSHA2)
568 Builder.defineMacro(
"__ARM_FEATURE_CRYPTO",
"1");
571 Builder.defineMacro(
"__ARM_FEATURE_AES",
"1");
574 Builder.defineMacro(
"__ARM_FEATURE_SHA2",
"1");
577 Builder.defineMacro(
"__ARM_FEATURE_SHA3",
"1");
578 Builder.defineMacro(
"__ARM_FEATURE_SHA512",
"1");
582 Builder.defineMacro(
"__ARM_FEATURE_SM3",
"1");
583 Builder.defineMacro(
"__ARM_FEATURE_SM4",
"1");
587 Builder.defineMacro(
"__ARM_FEATURE_PAUTH",
"1");
590 Builder.defineMacro(
"__ARM_FEATURE_PAUTH_LR",
"1");
593 Builder.defineMacro(
"__ARM_FEATURE_BTI",
"1");
596 Builder.defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
598 if ((FPU & NeonMode) && HasFullFP16)
599 Builder.defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
601 Builder.defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
604 Builder.defineMacro(
"__ARM_FEATURE_DOTPROD",
"1");
607 Builder.defineMacro(
"__ARM_FEATURE_MEMORY_TAGGING",
"1");
610 Builder.defineMacro(
"__ARM_FEATURE_TME",
"1");
613 Builder.defineMacro(
"__ARM_FEATURE_MATMUL_INT8",
"1");
616 Builder.defineMacro(
"__ARM_FEATURE_ATOMICS",
"1");
619 Builder.defineMacro(
"__ARM_FEATURE_BF16",
"1");
620 Builder.defineMacro(
"__ARM_FEATURE_BF16_VECTOR_ARITHMETIC",
"1");
621 Builder.defineMacro(
"__ARM_BF16_FORMAT_ALTERNATIVE",
"1");
622 Builder.defineMacro(
"__ARM_FEATURE_BF16_SCALAR_ARITHMETIC",
"1");
625 if ((FPU & SveMode) && HasBFloat16) {
626 Builder.defineMacro(
"__ARM_FEATURE_SVE_BF16",
"1");
629 if ((FPU & SveMode) && HasMatmulFP64)
630 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP64",
"1");
632 if ((FPU & SveMode) && HasMatmulFP32)
633 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP32",
"1");
635 if ((FPU & SveMode) && HasMatMul)
636 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_INT8",
"1");
638 if ((FPU & NeonMode) && HasFP16FML)
639 Builder.defineMacro(
"__ARM_FEATURE_FP16_FML",
"1");
657 if (Opts.BranchProtectionPAuthLR)
660 Builder.defineMacro(
"__ARM_FEATURE_PAC_DEFAULT", std::to_string(
Value));
663 if (Opts.BranchTargetEnforcement)
664 Builder.defineMacro(
"__ARM_FEATURE_BTI_DEFAULT",
"1");
666 if (Opts.GuardedControlStack)
667 Builder.defineMacro(
"__ARM_FEATURE_GCS_DEFAULT",
"1");
670 Builder.defineMacro(
"__ARM_FEATURE_LS64",
"1");
673 Builder.defineMacro(
"__ARM_FEATURE_RNG",
"1");
676 Builder.defineMacro(
"__ARM_FEATURE_MOPS",
"1");
679 Builder.defineMacro(
"__ARM_FEATURE_SYSREG128",
"1");
682 Builder.defineMacro(
"__ARM_FEATURE_GCS",
"1");
684 if (*ArchInfo == llvm::AArch64::ARMV8_1A)
686 else if (*ArchInfo == llvm::AArch64::ARMV8_2A)
688 else if (*ArchInfo == llvm::AArch64::ARMV8_3A)
690 else if (*ArchInfo == llvm::AArch64::ARMV8_4A)
692 else if (*ArchInfo == llvm::AArch64::ARMV8_5A)
694 else if (*ArchInfo == llvm::AArch64::ARMV8_6A)
696 else if (*ArchInfo == llvm::AArch64::ARMV8_7A)
698 else if (*ArchInfo == llvm::AArch64::ARMV8_8A)
700 else if (*ArchInfo == llvm::AArch64::ARMV8_9A)
702 else if (*ArchInfo == llvm::AArch64::ARMV9A)
704 else if (*ArchInfo == llvm::AArch64::ARMV9_1A)
706 else if (*ArchInfo == llvm::AArch64::ARMV9_2A)
708 else if (*ArchInfo == llvm::AArch64::ARMV9_3A)
710 else if (*ArchInfo == llvm::AArch64::ARMV9_4A)
712 else if (*ArchInfo == llvm::AArch64::ARMV9_5A)
714 else if (*ArchInfo == llvm::AArch64::ARMV9_6A)
716 else if (*ArchInfo == llvm::AArch64::ARMV9_7A)
720 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
721 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
722 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
723 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
724 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
727 Builder.defineMacro(
"__FP_FAST_FMA",
"1");
728 Builder.defineMacro(
"__FP_FAST_FMAF",
"1");
732 Builder.defineMacro(
"__ARM_FEATURE_SVE_VECTOR_OPERATORS",
"2");
734 if (Opts.VScaleMin && Opts.VScaleMin == Opts.VScaleMax) {
735 Builder.defineMacro(
"__ARM_FEATURE_SVE_BITS", Twine(Opts.VScaleMin * 128));
752std::optional<std::pair<unsigned, unsigned>>
755 llvm::StringMap<bool> *FeatureMap)
const {
757 (LangOpts.VScaleMin || LangOpts.VScaleMax))
758 return std::pair<unsigned, unsigned>(
759 LangOpts.VScaleMin ? LangOpts.VScaleMin : 1,
760 LangOpts.VScaleMax ? LangOpts.VScaleMax : 16);
763 (LangOpts.VScaleStreamingMin || LangOpts.VScaleStreamingMax))
764 return std::pair<unsigned, unsigned>(
765 LangOpts.VScaleStreamingMin ? LangOpts.VScaleStreamingMin : 1,
766 LangOpts.VScaleStreamingMax ? LangOpts.VScaleStreamingMax : 16);
769 ((LangOpts.VScaleMin && LangOpts.VScaleStreamingMin) ||
770 (LangOpts.VScaleMax && LangOpts.VScaleStreamingMax))) {
772 std::min(LangOpts.VScaleMin ? LangOpts.VScaleMin : 1,
773 LangOpts.VScaleStreamingMin ? LangOpts.VScaleStreamingMin : 1);
774 unsigned Max = std::max(
775 LangOpts.VScaleMax ? LangOpts.VScaleMax : 16,
776 LangOpts.VScaleStreamingMax ? LangOpts.VScaleStreamingMax : 16);
777 return std::pair(
Min,
Max);
780 if (
hasFeature(
"sve") || (FeatureMap && (FeatureMap->lookup(
"sve"))))
781 return std::pair<unsigned, unsigned>(1, 16);
784 (
hasFeature(
"sme") || (FeatureMap && (FeatureMap->lookup(
"sme")))))
785 return std::pair<unsigned, unsigned>(1, 16);
792 return llvm::AArch64::getFMVPriority(Features);
797 if (
auto Ext = llvm::AArch64::parseFMVExtension(Name))
798 return Ext->ID.has_value();
805 FeatureStr.split(Features,
"+");
807 if (!llvm::AArch64::parseFMVExtension(
Feature.trim()).has_value())
813 return llvm::StringSwitch<bool>(
Feature)
814 .Cases({
"aarch64",
"arm64",
"arm"},
true)
816 .Case(
"fp", FPU & FPUMode)
817 .Cases({
"neon",
"simd"}, FPU & NeonMode)
818 .Case(
"jscvt", HasJSCVT)
819 .Case(
"fcma", HasFCMA)
820 .Case(
"rng", HasRandGen)
821 .Case(
"flagm", HasFlagM)
822 .Case(
"flagm2", HasAlternativeNZCV)
823 .Case(
"fp16fml", HasFP16FML)
824 .Case(
"dotprod", HasDotProd)
829 .Case(
"cssc", HasCSSC)
830 .Case(
"sha2", HasSHA2)
831 .Case(
"sha3", HasSHA3)
832 .Cases({
"aes",
"pmull"}, HasAES)
833 .Cases({
"fp16",
"fullfp16"}, HasFullFP16)
835 .Case(
"dpb", HasCCPP)
836 .Case(
"dpb2", HasCCDP)
837 .Case(
"rcpc", HasRCPC)
838 .Case(
"frintts", HasFRInt3264)
839 .Case(
"i8mm", HasMatMul)
840 .Case(
"bf16", HasBFloat16)
841 .Case(
"sve", FPU & SveMode)
842 .Case(
"sve-b16b16", HasSVEB16B16)
843 .Case(
"f32mm", FPU & SveMode && HasMatmulFP32)
844 .Case(
"f64mm", FPU & SveMode && HasMatmulFP64)
845 .Case(
"sve2", FPU & SveMode && HasSVE2)
846 .Case(
"sve-aes", HasSVEAES)
847 .Case(
"sve-bitperm", FPU & HasSVEBitPerm)
848 .Case(
"sve2-sha3", FPU & SveMode && HasSVE2SHA3)
849 .Case(
"sve2-sm4", FPU & SveMode && HasSVE2SM4)
850 .Case(
"sve2p1", FPU & SveMode && HasSVE2p1)
852 .Case(
"sme2", HasSME2)
853 .Case(
"sme2p1", HasSME2p1)
854 .Case(
"sme-f64f64", HasSMEF64F64)
855 .Case(
"sme-i16i64", HasSMEI16I64)
856 .Case(
"sme-fa64", HasSMEFA64)
857 .Case(
"sme-f16f16", HasSMEF16F16)
858 .Case(
"sme-b16b16", HasSMEB16B16)
859 .Case(
"memtag", HasMTE)
861 .Case(
"predres", HasPredRes)
862 .Cases({
"ssbs",
"ssbs2"}, HasSSBS)
864 .Cases({
"ls64",
"ls64_v",
"ls64_accdata"}, HasLS64)
865 .Case(
"wfxt", HasWFxT)
866 .Case(
"rcpc3", HasRCPC3)
868 .Case(
"fp8fma", HasFP8FMA)
869 .Case(
"fp8dot2", HasFP8DOT2)
870 .Case(
"fp8dot4", HasFP8DOT4)
871 .Case(
"ssve-fp8dot2", HasSSVE_FP8DOT2)
872 .Case(
"ssve-fp8dot4", HasSSVE_FP8DOT4)
873 .Case(
"ssve-fp8fma", HasSSVE_FP8FMA)
874 .Case(
"sme-f8f32", HasSME_F8F32)
875 .Case(
"sme-f8f16", HasSME_F8F16)
880 StringRef Name,
bool Enabled)
const {
881 Features[Name] = Enabled;
884 const std::optional<llvm::AArch64::ArchInfo> ArchInfo =
885 llvm::AArch64::ArchInfo::findBySubArch(Name);
894 for (
const auto *OtherArch : llvm::AArch64::ArchInfos)
895 if (ArchInfo->implies(*OtherArch))
896 Features[OtherArch->getSubArch()] =
true;
899 std::vector<StringRef> CPUFeats;
900 if (llvm::AArch64::getExtensionFeatures(ArchInfo->DefaultExts, CPUFeats)) {
901 for (
auto F : CPUFeats) {
902 assert(F[0] ==
'+' &&
"Expected + in target feature!");
903 Features[F.drop_front(1)] =
true;
910 for (
const auto &
Feature : Features) {
968 if (
Feature ==
"+sve-bitperm") {
971 HasSVEBitPerm =
true;
977 HasMatmulFP32 =
true;
983 HasMatmulFP64 =
true;
1003 if (
Feature ==
"+sme-f64f64") {
1005 HasSMEF64F64 =
true;
1009 if (
Feature ==
"+sme-i16i64") {
1011 HasSMEI16I64 =
true;
1022 if (
Feature ==
"+sme-f16f16") {
1027 HasSMEF16F16 =
true;
1029 if (
Feature ==
"+sme-b16b16") {
1034 HasSVEB16B16 =
true;
1035 HasSMEB16B16 =
true;
1046 if (
Feature ==
"+ssve-fp8dot2")
1047 HasSSVE_FP8DOT2 =
true;
1048 if (
Feature ==
"+ssve-fp8dot4")
1049 HasSSVE_FP8DOT4 =
true;
1050 if (
Feature ==
"+ssve-fp8fma")
1051 HasSSVE_FP8FMA =
true;
1053 HasSME_F8F32 =
true;
1055 HasSME_F8F16 =
true;
1098 HasFRInt3264 =
true;
1103 if (
Feature ==
"+strict-align")
1107 if (
Feature ==
"+v8a" && ArchInfo->Version < llvm::AArch64::ARMV8A.Version)
1108 ArchInfo = &llvm::AArch64::ARMV8A;
1110 ArchInfo->Version < llvm::AArch64::ARMV8_1A.Version)
1111 ArchInfo = &llvm::AArch64::ARMV8_1A;
1113 ArchInfo->Version < llvm::AArch64::ARMV8_2A.Version)
1114 ArchInfo = &llvm::AArch64::ARMV8_2A;
1116 ArchInfo->Version < llvm::AArch64::ARMV8_3A.Version)
1117 ArchInfo = &llvm::AArch64::ARMV8_3A;
1119 ArchInfo->Version < llvm::AArch64::ARMV8_4A.Version)
1120 ArchInfo = &llvm::AArch64::ARMV8_4A;
1122 ArchInfo->Version < llvm::AArch64::ARMV8_5A.Version)
1123 ArchInfo = &llvm::AArch64::ARMV8_5A;
1125 ArchInfo->Version < llvm::AArch64::ARMV8_6A.Version)
1126 ArchInfo = &llvm::AArch64::ARMV8_6A;
1128 ArchInfo->Version < llvm::AArch64::ARMV8_7A.Version)
1129 ArchInfo = &llvm::AArch64::ARMV8_7A;
1131 ArchInfo->Version < llvm::AArch64::ARMV8_8A.Version)
1132 ArchInfo = &llvm::AArch64::ARMV8_8A;
1134 ArchInfo->Version < llvm::AArch64::ARMV8_9A.Version)
1135 ArchInfo = &llvm::AArch64::ARMV8_9A;
1136 if (
Feature ==
"+v9a" && ArchInfo->Version < llvm::AArch64::ARMV9A.Version)
1137 ArchInfo = &llvm::AArch64::ARMV9A;
1139 ArchInfo->Version < llvm::AArch64::ARMV9_1A.Version)
1140 ArchInfo = &llvm::AArch64::ARMV9_1A;
1142 ArchInfo->Version < llvm::AArch64::ARMV9_2A.Version)
1143 ArchInfo = &llvm::AArch64::ARMV9_2A;
1145 ArchInfo->Version < llvm::AArch64::ARMV9_3A.Version)
1146 ArchInfo = &llvm::AArch64::ARMV9_3A;
1148 ArchInfo->Version < llvm::AArch64::ARMV9_4A.Version)
1149 ArchInfo = &llvm::AArch64::ARMV9_4A;
1151 ArchInfo->Version < llvm::AArch64::ARMV9_5A.Version)
1152 ArchInfo = &llvm::AArch64::ARMV9_5A;
1154 ArchInfo->Version < llvm::AArch64::ARMV9_6A.Version)
1155 ArchInfo = &llvm::AArch64::ARMV9_6A;
1157 ArchInfo->Version < llvm::AArch64::ARMV9_7A.Version)
1158 ArchInfo = &llvm::AArch64::ARMV9_7A;
1160 ArchInfo = &llvm::AArch64::ARMV8R;
1194 HasAlternativeNZCV =
true;
1215 for (
const auto &
Feature : Features) {
1250 if (Features ==
"default")
1253 Features.split(AttrFeatures,
",");
1254 bool FoundArch =
false;
1256 auto SplitAndAddFeatures = [](StringRef FeatString,
1257 std::vector<std::string> &Features,
1258 llvm::AArch64::ExtensionSet &FeatureBits) {
1260 FeatString.split(SplitFeatures, StringRef(
"+"), -1,
false);
1261 for (StringRef
Feature : SplitFeatures) {
1262 if (FeatureBits.parseModifier(
Feature))
1270 if (
Feature.starts_with(
"no"))
1271 Features.push_back(
"-" +
Feature.drop_front(2).str());
1273 Features.push_back(
"+" +
Feature.str());
1277 llvm::AArch64::ExtensionSet FeatureBits;
1279 FeatureBits.reconstructFromParsedFeatures(
getTargetOpts().FeaturesAsWritten,
1282 for (
auto &
Feature : AttrFeatures) {
1284 if (
Feature.starts_with(
"fpmath="))
1287 if (
Feature.starts_with(
"branch-protection=")) {
1288 Ret.BranchProtection =
Feature.split(
'=').second.trim();
1292 if (
Feature.starts_with(
"arch=")) {
1294 Ret.Duplicate =
"arch=";
1296 std::pair<StringRef, StringRef> Split =
1297 Feature.split(
"=").second.trim().split(
"+");
1298 const llvm::AArch64::ArchInfo *AI = llvm::AArch64::parseArch(Split.first);
1304 FeatureBits.addArchDefaults(*AI);
1306 SplitAndAddFeatures(Split.second, Ret.Features, FeatureBits);
1307 }
else if (
Feature.starts_with(
"cpu=")) {
1308 if (!Ret.CPU.empty())
1309 Ret.Duplicate =
"cpu=";
1313 std::pair<StringRef, StringRef> Split =
1314 Feature.split(
"=").second.trim().split(
"+");
1315 Ret.CPU = Split.first;
1316 if (
auto CpuInfo = llvm::AArch64::parseCpu(Ret.CPU)) {
1317 FeatureBits.addCPUDefaults(*CpuInfo);
1318 SplitAndAddFeatures(Split.second, Ret.Features, FeatureBits);
1321 }
else if (
Feature.starts_with(
"tune=")) {
1322 if (!Ret.Tune.empty())
1323 Ret.Duplicate =
"tune=";
1325 Ret.Tune =
Feature.split(
"=").second.trim();
1326 }
else if (
Feature.starts_with(
"+")) {
1327 SplitAndAddFeatures(
Feature, Ret.Features, FeatureBits);
1329 if (FeatureBits.parseModifier(
Feature,
true))
1337 if (
Feature.starts_with(
"no-"))
1338 Ret.Features.push_back(
"-" +
Feature.drop_front(3).str());
1340 Ret.Features.push_back(
"+" +
Feature.str());
1343 FeatureBits.toLLVMFeatureList(Ret.Features);
1376const char *
const AArch64TargetInfo::GCCRegNames[] = {
1380 "w0",
"w1",
"w2",
"w3",
"w4",
"w5",
"w6",
"w7",
"w8",
"w9",
"w10",
"w11",
1381 "w12",
"w13",
"w14",
"w15",
"w16",
"w17",
"w18",
"w19",
"w20",
"w21",
"w22",
1382 "w23",
"w24",
"w25",
"w26",
"w27",
"w28",
"w29",
"w30",
"wsp",
1385 "x0",
"x1",
"x2",
"x3",
"x4",
"x5",
"x6",
"x7",
"x8",
"x9",
"x10",
"x11",
1386 "x12",
"x13",
"x14",
"x15",
"x16",
"x17",
"x18",
"x19",
"x20",
"x21",
"x22",
1387 "x23",
"x24",
"x25",
"x26",
"x27",
"x28",
"fp",
"lr",
"sp",
1390 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
1391 "s12",
"s13",
"s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
1392 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
1395 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
"d8",
"d9",
"d10",
"d11",
1396 "d12",
"d13",
"d14",
"d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
1397 "d23",
"d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
1400 "v0",
"v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
"v9",
"v10",
"v11",
1401 "v12",
"v13",
"v14",
"v15",
"v16",
"v17",
"v18",
"v19",
"v20",
"v21",
"v22",
1402 "v23",
"v24",
"v25",
"v26",
"v27",
"v28",
"v29",
"v30",
"v31",
1405 "z0",
"z1",
"z2",
"z3",
"z4",
"z5",
"z6",
"z7",
"z8",
"z9",
"z10",
1406 "z11",
"z12",
"z13",
"z14",
"z15",
"z16",
"z17",
"z18",
"z19",
"z20",
"z21",
1407 "z22",
"z23",
"z24",
"z25",
"z26",
"z27",
"z28",
"z29",
"z30",
"z31",
1410 "p0",
"p1",
"p2",
"p3",
"p4",
"p5",
"p6",
"p7",
"p8",
"p9",
"p10",
1411 "p11",
"p12",
"p13",
"p14",
"p15",
1414 "pn0",
"pn1",
"pn2",
"pn3",
"pn4",
"pn5",
"pn6",
"pn7",
"pn8",
1415 "pn9",
"pn10",
"pn11",
"pn12",
"pn13",
"pn14",
"pn15",
1460 {{
"r29",
"x29"},
"fp"},
1461 {{
"r30",
"x30"},
"lr"},
1472 constexpr unsigned len = 5;
1473 auto RV = llvm::StringSwitch<unsigned>(Name)
1497 switch (*Constraint) {
1499 R = std::string(
"@3") + std::string(Constraint, 3);
1504 std::string Converted =
"{" + std::string(Constraint, Len) +
"}";
1505 Constraint += Len - 1;
1508 return std::string(1, *Constraint);
1540 if (Name[1] ==
'p' &&
1541 (Name[2] ==
'l' || Name[2] ==
'a' || Name[2] ==
'h')) {
1547 if (Name[1] ==
'c' && (Name[2] ==
'i' || Name[2] ==
'j')) {
1583 StringRef Constraint,
char Modifier,
unsigned Size,
1584 std::string &SuggestedModifier)
const {
1586 Constraint = Constraint.ltrim(
"=+&");
1588 switch (Constraint[0]) {
1608 SuggestedModifier =
"w";
1626 const llvm::APSInt &value)
const {
1627 return 0 <= value && value <= 3;
1636void AArch64leTargetInfo::setDataLayout() {
1639 resetDataLayout(
"e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-"
1640 "i128:128-n32:64-S128-Fn32",
1643 resetDataLayout(
"e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-"
1647 resetDataLayout(
"e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-"
1648 "i64:64-i128:128-n32:64-S128-Fn32");
1653 Builder.defineMacro(
"__AARCH64EL__");
1663 Builder.defineMacro(
"__AARCH64EB__");
1664 Builder.defineMacro(
"__AARCH_BIG_ENDIAN");
1665 Builder.defineMacro(
"__ARM_BIG_ENDIAN");
1669void AArch64beTargetInfo::setDataLayout() {
1670 assert(!
getTriple().isOSBinFormatMachO());
1671 resetDataLayout(
"E-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-"
1672 "i64:64-i128:128-n32:64-S128-Fn32");
1695 ?
"e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:"
1696 "128-n32:64-S128-Fn32"
1697 :
"e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:32-"
1698 "i64:64-i128:128-n32:64-S128-Fn32",
1699 Triple.isOSBinFormatMachO() ?
"_" :
"");
1742 Builder.defineMacro(
"_M_X64",
"100");
1743 Builder.defineMacro(
"_M_AMD64",
"100");
1744 Builder.defineMacro(
"_M_ARM64EC",
"1");
1746 Builder.defineMacro(
"_M_ARM64",
"1");
1756 bool HasNonWeakDef)
const {
1764 if (TypeSize >= 512) {
1765 Align = std::max(Align, 128u);
1766 }
else if (TypeSize >= 64) {
1767 Align = std::max(Align, 64u);
1768 }
else if (TypeSize >= 16) {
1769 Align = std::max(Align, 32u);
1777 TheCXXABI.set(TargetCXXABI::GenericAArch64);
1805 TheCXXABI.set(TargetCXXABI::AppleARM64);
1810 const llvm::Triple &Triple) {
1811 Builder.defineMacro(
"__AARCH64_SIMD__");
1812 if (Triple.isArch32Bit())
1813 Builder.defineMacro(
"__ARM64_ARCH_8_32__");
1815 Builder.defineMacro(
"__ARM64_ARCH_8__");
1816 Builder.defineMacro(
"__ARM_NEON__");
1817 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
1818 Builder.defineMacro(
"__arm64",
"1");
1819 Builder.defineMacro(
"__arm64__",
"1");
1821 if (Triple.isArm64e())
1822 Builder.defineMacro(
"__arm64e__",
"1");
1826 const llvm::Triple &Triple,
1834 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
void resetDataLayout(StringRef DL, const char *UserLabelPrefix="")
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
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)
void setDataLayout() override
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