Go to the documentation of this file.
17 #include "llvm/ADT/ArrayRef.h"
18 #include "llvm/ADT/StringExtras.h"
19 #include "llvm/ADT/StringSwitch.h"
20 #include "llvm/Support/AArch64TargetParser.h"
22 using namespace clang;
26 #define BUILTIN(ID, TYPE, ATTRS) \
27 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
28 #include "clang/Basic/BuiltinsNEON.def"
30 #define BUILTIN(ID, TYPE, ATTRS) \
31 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
32 #include "clang/Basic/BuiltinsSVE.def"
34 #define BUILTIN(ID, TYPE, ATTRS) \
35 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
36 #define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
37 {#ID, TYPE, ATTRS, nullptr, LANG, nullptr},
38 #define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
39 {#ID, TYPE, ATTRS, HEADER, LANGS, FEATURE},
40 #include "clang/Basic/BuiltinsAArch64.def"
45 case llvm::AArch64::ArchKind::ARMV9A:
46 case llvm::AArch64::ArchKind::ARMV9_1A:
47 case llvm::AArch64::ArchKind::ARMV9_2A:
48 case llvm::AArch64::ArchKind::ARMV9_3A:
55 StringRef AArch64TargetInfo::getArchProfile()
const {
57 case llvm::AArch64::ArchKind::ARMV8R:
82 if (Triple.isArch64Bit())
124 if (Triple.getOS() == llvm::Triple::Linux)
126 else if (Triple.getOS() == llvm::Triple::UnknownOS)
128 Opts.
EABIVersion == llvm::EABI::GNU ?
"\01_mcount" :
"mcount";
134 if (Name !=
"aapcs" && Name !=
"darwinpcs")
143 StringRef &Err)
const {
144 llvm::ARM::ParsedBranchProtection PBP;
145 if (!llvm::ARM::parseBranchProtection(Spec, PBP, Err))
149 llvm::StringSwitch<LangOptions::SignReturnAddressScopeKind>(PBP.Scope)
154 if (PBP.Key ==
"a_key")
164 return Name ==
"generic" ||
165 llvm::AArch64::parseCPUArch(Name) != llvm::AArch64::ArchKind::INVALID;
174 llvm::AArch64::fillValidCPUArchList(Values);
179 Builder.defineMacro(
"__ARM_FEATURE_QRDMX",
"1");
180 Builder.defineMacro(
"__ARM_FEATURE_ATOMICS",
"1");
181 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
192 Builder.defineMacro(
"__ARM_FEATURE_COMPLEX",
"1");
193 Builder.defineMacro(
"__ARM_FEATURE_JCVT",
"1");
206 Builder.defineMacro(
"__ARM_FEATURE_FRINT",
"1");
260 Builder.defineMacro(
"__aarch64__");
262 if (
getTriple().getOS() == llvm::Triple::UnknownOS &&
264 Builder.defineMacro(
"__ELF__");
268 Builder.defineMacro(
"_LP64");
269 Builder.defineMacro(
"__LP64__");
273 if (CodeModel ==
"default")
275 for (
char &
c : CodeModel)
277 Builder.defineMacro(
"__AARCH64_CMODEL_" + CodeModel +
"__");
280 Builder.defineMacro(
"__ARM_ACLE",
"200");
282 Builder.defineMacro(
"__ARM_ARCH_PROFILE",
"'" + getArchProfile() +
"'");
284 Builder.defineMacro(
"__ARM_64BIT_STATE",
"1");
285 Builder.defineMacro(
"__ARM_PCS_AAPCS64",
"1");
286 Builder.defineMacro(
"__ARM_ARCH_ISA_A64",
"1");
288 Builder.defineMacro(
"__ARM_FEATURE_CLZ",
"1");
289 Builder.defineMacro(
"__ARM_FEATURE_FMA",
"1");
290 Builder.defineMacro(
"__ARM_FEATURE_LDREX",
"0xF");
291 Builder.defineMacro(
"__ARM_FEATURE_IDIV",
"1");
292 Builder.defineMacro(
"__ARM_FEATURE_DIV");
293 Builder.defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
294 Builder.defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
296 Builder.defineMacro(
"__ARM_ALIGN_MAX_STACK_PWR",
"4");
299 Builder.defineMacro(
"__ARM_FP",
"0xE");
303 Builder.defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
304 Builder.defineMacro(
"__ARM_FP16_ARGS",
"1");
306 if (Opts.UnsafeFPMath)
307 Builder.defineMacro(
"__ARM_FP_FAST",
"1");
309 Builder.defineMacro(
"__ARM_SIZEOF_WCHAR_T",
310 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
312 Builder.defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
314 if (FPU & NeonMode) {
315 Builder.defineMacro(
"__ARM_NEON",
"1");
317 Builder.defineMacro(
"__ARM_NEON_FP",
"0xE");
321 Builder.defineMacro(
"__ARM_FEATURE_SVE",
"1");
323 if ((FPU & NeonMode) && (FPU & SveMode))
324 Builder.defineMacro(
"__ARM_NEON_SVE_BRIDGE",
"1");
327 Builder.defineMacro(
"__ARM_FEATURE_SVE2",
"1");
329 if (HasSVE2 && HasSVE2AES)
330 Builder.defineMacro(
"__ARM_FEATURE_SVE2_AES",
"1");
332 if (HasSVE2 && HasSVE2BitPerm)
333 Builder.defineMacro(
"__ARM_FEATURE_SVE2_BITPERM",
"1");
335 if (HasSVE2 && HasSVE2SHA3)
336 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SHA3",
"1");
338 if (HasSVE2 && HasSVE2SM4)
339 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SM4",
"1");
342 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
346 if (HasAES && HasSHA2)
347 Builder.defineMacro(
"__ARM_FEATURE_CRYPTO",
"1");
350 Builder.defineMacro(
"__ARM_FEATURE_AES",
"1");
353 Builder.defineMacro(
"__ARM_FEATURE_SHA2",
"1");
356 Builder.defineMacro(
"__ARM_FEATURE_SHA3",
"1");
357 Builder.defineMacro(
"__ARM_FEATURE_SHA512",
"1");
361 Builder.defineMacro(
"__ARM_FEATURE_SM3",
"1");
362 Builder.defineMacro(
"__ARM_FEATURE_SM4",
"1");
366 Builder.defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
368 if ((FPU & NeonMode) && HasFullFP16)
369 Builder.defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
371 Builder.defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
374 Builder.defineMacro(
"__ARM_FEATURE_DOTPROD",
"1");
377 Builder.defineMacro(
"__ARM_FEATURE_MEMORY_TAGGING",
"1");
380 Builder.defineMacro(
"__ARM_FEATURE_TME",
"1");
383 Builder.defineMacro(
"__ARM_FEATURE_MATMUL_INT8",
"1");
386 Builder.defineMacro(
"__ARM_FEATURE_ATOMICS",
"1");
389 Builder.defineMacro(
"__ARM_FEATURE_BF16",
"1");
390 Builder.defineMacro(
"__ARM_FEATURE_BF16_VECTOR_ARITHMETIC",
"1");
391 Builder.defineMacro(
"__ARM_BF16_FORMAT_ALTERNATIVE",
"1");
392 Builder.defineMacro(
"__ARM_FEATURE_BF16_SCALAR_ARITHMETIC",
"1");
396 Builder.defineMacro(
"__ARM_FEATURE_SVE_BF16",
"1");
399 if ((FPU & SveMode) && HasMatmulFP64)
400 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP64",
"1");
402 if ((FPU & SveMode) && HasMatmulFP32)
403 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP32",
"1");
405 if ((FPU & SveMode) && HasMatMul)
406 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_INT8",
"1");
408 if ((FPU & NeonMode) && HasFP16FML)
409 Builder.defineMacro(
"__ARM_FEATURE_FP16_FML",
"1");
426 Builder.defineMacro(
"__ARM_FEATURE_PAC_DEFAULT", std::to_string(
Value));
429 if (Opts.BranchTargetEnforcement)
430 Builder.defineMacro(
"__ARM_FEATURE_BTI_DEFAULT",
"1");
433 Builder.defineMacro(
"__ARM_FEATURE_LS64",
"1");
436 Builder.defineMacro(
"__ARM_FEATURE_RNG",
"1");
439 Builder.defineMacro(
"__ARM_FEATURE_MOPS",
"1");
444 case llvm::AArch64::ArchKind::ARMV8_1A:
447 case llvm::AArch64::ArchKind::ARMV8_2A:
450 case llvm::AArch64::ArchKind::ARMV8_3A:
453 case llvm::AArch64::ArchKind::ARMV8_4A:
456 case llvm::AArch64::ArchKind::ARMV8_5A:
459 case llvm::AArch64::ArchKind::ARMV8_6A:
462 case llvm::AArch64::ArchKind::ARMV8_7A:
465 case llvm::AArch64::ArchKind::ARMV8_8A:
468 case llvm::AArch64::ArchKind::ARMV9A:
471 case llvm::AArch64::ArchKind::ARMV9_1A:
474 case llvm::AArch64::ArchKind::ARMV9_2A:
477 case llvm::AArch64::ArchKind::ARMV9_3A:
483 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
484 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
485 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
486 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
489 Builder.defineMacro(
"__FP_FAST_FMA",
"1");
490 Builder.defineMacro(
"__FP_FAST_FMAF",
"1");
492 if (Opts.VScaleMin && Opts.VScaleMin == Opts.VScaleMax) {
493 Builder.defineMacro(
"__ARM_FEATURE_SVE_BITS", Twine(Opts.VScaleMin * 128));
494 Builder.defineMacro(
"__ARM_FEATURE_SVE_VECTOR_OPERATORS");
505 if (LangOpts.VScaleMin || LangOpts.VScaleMax)
506 return std::pair<unsigned, unsigned>(
507 LangOpts.VScaleMin ? LangOpts.VScaleMin : 1, LangOpts.VScaleMax);
510 return std::pair<unsigned, unsigned>(1, 16);
516 return llvm::StringSwitch<bool>(Feature)
517 .Cases(
"aarch64",
"arm64",
"arm",
true)
518 .Case(
"neon", FPU & NeonMode)
519 .Cases(
"sve",
"sve2",
"sve2-bitperm",
"sve2-aes",
"sve2-sha3",
"sve2-sm4",
"f64mm",
"f32mm",
"i8mm",
"bf16", FPU & SveMode)
520 .Case(
"ls64", HasLS64)
546 HasSVE2BitPerm =
false;
547 HasMatmulFP64 =
false;
548 HasMatmulFP32 =
false;
552 ArchKind = llvm::AArch64::ArchKind::INVALID;
554 for (
const auto &Feature : Features) {
555 if (Feature ==
"+neon")
557 if (Feature ==
"+sve") {
561 if (Feature ==
"+sve2") {
566 if (Feature ==
"+sve2-aes") {
572 if (Feature ==
"+sve2-sha3") {
578 if (Feature ==
"+sve2-sm4") {
584 if (Feature ==
"+sve2-bitperm") {
588 HasSVE2BitPerm =
true;
590 if (Feature ==
"+f32mm") {
592 HasMatmulFP32 =
true;
594 if (Feature ==
"+f64mm") {
596 HasMatmulFP64 =
true;
598 if (Feature ==
"+crc")
600 if (Feature ==
"+aes")
602 if (Feature ==
"+sha2")
604 if (Feature ==
"+sha3") {
608 if (Feature ==
"+sm4")
610 if (Feature ==
"+strict-align")
611 HasUnaligned =
false;
612 if (Feature ==
"+v8a")
613 ArchKind = llvm::AArch64::ArchKind::ARMV8A;
614 if (Feature ==
"+v8.1a")
615 ArchKind = llvm::AArch64::ArchKind::ARMV8_1A;
616 if (Feature ==
"+v8.2a")
617 ArchKind = llvm::AArch64::ArchKind::ARMV8_2A;
618 if (Feature ==
"+v8.3a")
619 ArchKind = llvm::AArch64::ArchKind::ARMV8_3A;
620 if (Feature ==
"+v8.4a")
621 ArchKind = llvm::AArch64::ArchKind::ARMV8_4A;
622 if (Feature ==
"+v8.5a")
623 ArchKind = llvm::AArch64::ArchKind::ARMV8_5A;
624 if (Feature ==
"+v8.6a")
625 ArchKind = llvm::AArch64::ArchKind::ARMV8_6A;
626 if (Feature ==
"+v8.7a")
627 ArchKind = llvm::AArch64::ArchKind::ARMV8_7A;
628 if (Feature ==
"+v8.8a")
629 ArchKind = llvm::AArch64::ArchKind::ARMV8_8A;
630 if (Feature ==
"+v9a")
631 ArchKind = llvm::AArch64::ArchKind::ARMV9A;
632 if (Feature ==
"+v9.1a")
633 ArchKind = llvm::AArch64::ArchKind::ARMV9_1A;
634 if (Feature ==
"+v9.2a")
635 ArchKind = llvm::AArch64::ArchKind::ARMV9_2A;
636 if (Feature ==
"+v9.3a")
637 ArchKind = llvm::AArch64::ArchKind::ARMV9_3A;
638 if (Feature ==
"+v8r")
639 ArchKind = llvm::AArch64::ArchKind::ARMV8R;
640 if (Feature ==
"+fullfp16")
642 if (Feature ==
"+dotprod")
644 if (Feature ==
"+fp16fml")
646 if (Feature ==
"+mte")
648 if (Feature ==
"+tme")
650 if (Feature ==
"+pauth")
652 if (Feature ==
"+i8mm")
654 if (Feature ==
"+bf16")
656 if (Feature ==
"+lse")
658 if (Feature ==
"+ls64")
660 if (Feature ==
"+rand")
662 if (Feature ==
"+flagm")
664 if (Feature ==
"+mops")
697 const char *
const AArch64TargetInfo::GCCRegNames[] = {
699 "w0",
"w1",
"w2",
"w3",
"w4",
"w5",
"w6",
"w7",
"w8",
"w9",
"w10",
"w11",
700 "w12",
"w13",
"w14",
"w15",
"w16",
"w17",
"w18",
"w19",
"w20",
"w21",
"w22",
701 "w23",
"w24",
"w25",
"w26",
"w27",
"w28",
"w29",
"w30",
"wsp",
704 "x0",
"x1",
"x2",
"x3",
"x4",
"x5",
"x6",
"x7",
"x8",
"x9",
"x10",
"x11",
705 "x12",
"x13",
"x14",
"x15",
"x16",
"x17",
"x18",
"x19",
"x20",
"x21",
"x22",
706 "x23",
"x24",
"x25",
"x26",
"x27",
"x28",
"fp",
"lr",
"sp",
709 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
710 "s12",
"s13",
"s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
711 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
714 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
"d8",
"d9",
"d10",
"d11",
715 "d12",
"d13",
"d14",
"d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
716 "d23",
"d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
719 "v0",
"v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
"v9",
"v10",
"v11",
720 "v12",
"v13",
"v14",
"v15",
"v16",
"v17",
"v18",
"v19",
"v20",
"v21",
"v22",
721 "v23",
"v24",
"v25",
"v26",
"v27",
"v28",
"v29",
"v30",
"v31",
724 "z0",
"z1",
"z2",
"z3",
"z4",
"z5",
"z6",
"z7",
"z8",
"z9",
"z10",
725 "z11",
"z12",
"z13",
"z14",
"z15",
"z16",
"z17",
"z18",
"z19",
"z20",
"z21",
726 "z22",
"z23",
"z24",
"z25",
"z26",
"z27",
"z28",
"z29",
"z30",
"z31",
729 "p0",
"p1",
"p2",
"p3",
"p4",
"p5",
"p6",
"p7",
"p8",
"p9",
"p10",
730 "p11",
"p12",
"p13",
"p14",
"p15"
734 return llvm::makeArrayRef(GCCRegNames);
770 {{
"r29",
"x29"},
"fp"},
771 {{
"r30",
"x30"},
"lr"},
777 return llvm::makeArrayRef(GCCRegAliases);
804 if (Name[1] ==
'p' && (Name[2] ==
'l' || Name[2] ==
'a')) {
832 StringRef Constraint,
char Modifier,
unsigned Size,
835 while (Constraint[0] ==
'=' || Constraint[0] ==
'+' || Constraint[0] ==
'&')
836 Constraint = Constraint.substr(1);
838 switch (Constraint[0]) {
858 SuggestedModifier =
"w";
881 void AArch64leTargetInfo::setDataLayout() {
888 resetDataLayout(
"e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
893 Builder.defineMacro(
"__AARCH64EL__");
903 Builder.defineMacro(
"__AARCH64EB__");
904 Builder.defineMacro(
"__AARCH_BIG_ENDIAN");
905 Builder.defineMacro(
"__ARM_BIG_ENDIAN");
909 void AArch64beTargetInfo::setDataLayout() {
910 assert(!
getTriple().isOSBinFormatMachO());
911 resetDataLayout(
"E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
934 ?
"e-m:o-i64:64-i128:128-n32:64-S128"
935 :
"e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128",
936 Triple.isOSBinFormatMachO() ?
"_" :
"");
974 Builder.defineMacro(
"_M_ARM64",
"1");
989 if (TypeSize >= 512) {
991 }
else if (TypeSize >= 64) {
993 }
else if (TypeSize >= 16) {
1030 const llvm::Triple &Triple,
1032 Builder.defineMacro(
"__AARCH64_SIMD__");
1033 if (Triple.isArch32Bit())
1034 Builder.defineMacro(
"__ARM64_ARCH_8_32__");
1036 Builder.defineMacro(
"__ARM64_ARCH_8__");
1037 Builder.defineMacro(
"__ARM_NEON__");
1038 Builder.defineMacro(
"__LITTLE_ENDIAN__");
1039 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
1040 Builder.defineMacro(
"__arm64",
"1");
1041 Builder.defineMacro(
"__arm64__",
"1");
1043 if (Triple.isArm64e())
1044 Builder.defineMacro(
"__arm64e__",
"1");
1059 Triple.getEnvironmentName()),
1066 Builder.defineMacro(
"__RENDERSCRIPT__");
unsigned char PointerAlign
void setDataLayout() override
void getTargetDefinesARMV84A(const LangOptions &Opts, MacroBuilder &Builder) const
LangOptions::SignReturnAddressKeyKind SignKey
bool hasFeature(StringRef Feature) const override
Determine whether the given target has the given feature.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
__DEVICE__ int max(int __a, int __b)
void getTargetDefinesARMV87A(const LangOptions &Opts, MacroBuilder &Builder) const
YAML serialization mapping.
VersionTuple PlatformMinVersion
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.
MicrosoftARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
bool isSignReturnAddressScopeAll() const
Check if leaf functions are also signed.
WindowsARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
void getTargetDefinesARMV86A(const LangOptions &Opts, MacroBuilder &Builder) const
unsigned char LongLongAlign
void getTargetDefinesARMV81A(const LangOptions &Opts, MacroBuilder &Builder) const
unsigned char DoubleAlign
AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
bool setABI(const std::string &Name) override
Use the specified ABI.
unsigned UseZeroLengthBitfieldAlignment
Whether zero length bitfields (e.g., int : 0;) force alignment of the next bitfield.
Concrete class used by the front-end to report problems and issues.
Exposes information about the current target.
ArrayRef< Builtin::Info > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
@ NonLeaf
Sign the return address of functions that spill LR.
unsigned char BFloat16Width
@ None
No signing for any function.
AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
unsigned IsRenderScriptTarget
void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts, const llvm::Triple &Triple, StringRef &PlatformName, VersionTuple &PlatformMinVersion)
void getTargetDefinesARMV82A(const LangOptions &Opts, MacroBuilder &Builder) const
BuiltinVaListKind
The different kinds of __builtin_va_list types defined by the target implementation.
unsigned char MaxAtomicPromoteWidth
const llvm::fltSemantics * BFloat16Format
bool validateAsmConstraint(const char *&Name, TargetInfo::ConstraintInfo &Info) const override
@ AKey
Return address signing uses APIA key.
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
unsigned HasAArch64SVETypes
int getEHDataRegisterNumber(unsigned RegNo) const override
Return the register number that __builtin_eh_return_regno would return with the specified argument.
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
Perform initialization based on the user configured set of features (e.g., +sse4).
void getTargetDefinesARMV9A(const LangOptions &Opts, MacroBuilder &Builder) const
unsigned getMinGlobalAlign(uint64_t TypeSize) const override
getMinGlobalAlign - Return the minimum alignment of a global variable, unless its alignment is explic...
bool hasInt128Type() const override
Determine whether the __int128 type is supported on this target.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
void resetDataLayout(StringRef DL, const char *UserLabelPrefix="")
void getTargetDefinesARMV85A(const LangOptions &Opts, MacroBuilder &Builder) const
bool validateBranchProtection(StringRef Spec, StringRef Arch, BranchProtectionInfo &BPI, StringRef &Err) const override
Determine if this TargetInfo supports the given branch protection specification.
RenderScript64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
unsigned char BFloat16Align
bool isCLZForZeroUndef() const override
The __builtin_clz* and __builtin_ctz* built-in functions are specified to have undefined results for ...
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
bool BranchTargetEnforcement
StringRef getABI() const override
Get the ABI currently in use.
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
TargetOptions & getTargetOpts() const
Retrieve the target options.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
TargetInfo::CallingConvKind getCallingConvKind(bool ClangABICompat4) const override
const llvm::fltSemantics * LongDoubleFormat
const char * getClobbers() const override
Returns a string of target-specific clobbers, in LLVM format.
bool isValidCPUName(StringRef Name) const override
brief Determine whether this TargetInfo supports the given CPU name.
@ CharPtrBuiltinVaList
typedef char* __builtin_va_list;
virtual unsigned getMinGlobalAlign(uint64_t) const
getMinGlobalAlign - Return the minimum alignment of a global variable, unless its alignment is explic...
unsigned char MaxAtomicInlineWidth
bool hasSignReturnAddress() const
Check if return address signing is enabled.
unsigned UseBitFieldTypeAlignment
Control whether the alignment of bit-field types is respected when laying out structures.
void getTargetDefinesARMV92A(const LangOptions &Opts, MacroBuilder &Builder) const
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
ArrayRef< const char * > getGCCRegNames() const override
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
bool isSignReturnAddressWithAKey() const
Check if return address signing uses AKey.
@ BKey
Return address signing uses APIB key.
Optional< std::pair< unsigned, unsigned > > getVScaleRange(const LangOptions &LangOpts) const override
Returns target-specific min and max values VScale_Range.
llvm::EABI EABIVersion
The EABI version to use.
AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
void getTargetDefinesARMV88A(const LangOptions &Opts, MacroBuilder &Builder) const
__device__ __2f16 float c
unsigned short SuitableAlign
bool validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size, std::string &SuggestedModifier) const override
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
static StringRef getArchVersionString(llvm::AArch64::ArchKind Kind)
@ All
Sign the return address of all functions,.
Options for controlling the target.
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
@ AArch64ABIBuiltinVaList
__builtin_va_list as defined by the AArch64 ABI http://infocenter.arm.com/help/topic/com....
void getTargetDefinesARMV93A(const LangOptions &Opts, MacroBuilder &Builder) const
unsigned char PointerWidth
DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
unsigned HasBuiltinMSVaList
unsigned ZeroLengthBitfieldBoundary
If non-zero, specifies a fixed alignment value for bitfields that follow zero length bitfield,...
unsigned char LongDoubleWidth
void getTargetDefinesARMV91A(const LangOptions &Opts, MacroBuilder &Builder) const
bool setCPU(const std::string &Name) override
Target the specified CPU.
unsigned UseSignedCharForObjCBool
Whether Objective-C's built-in boolean type should be signed char.
unsigned char LongDoubleAlign
LangOptions::SignReturnAddressScopeKind SignReturnAddr
void getTargetDefinesARMV83A(const LangOptions &Opts, MacroBuilder &Builder) const
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.