17 #include "llvm/ADT/StringExtras.h" 18 #include "llvm/ADT/StringRef.h" 19 #include "llvm/ADT/StringSwitch.h" 21 using namespace clang;
24 void ARMTargetInfo::setABIAAPCS() {
30 bool IsNetBSD = T.isOSNetBSD();
31 bool IsOpenBSD = T.isOSOpenBSD();
32 if (!T.isOSWindows() && !IsNetBSD && !IsOpenBSD)
41 if (T.isOSBinFormatMachO()) {
43 ?
"E-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" 44 :
"e-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64");
45 }
else if (T.isOSWindows()) {
46 assert(!
BigEndian &&
"Windows on ARM does not support big endian");
56 }
else if (T.isOSNaCl()) {
57 assert(!
BigEndian &&
"NaCl on ARM does not support big endian");
58 resetDataLayout(
"e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S128");
61 ?
"E-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" 62 :
"e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64");
68 void ARMTargetInfo::setABIAPCS(
bool IsAAPCS16) {
89 if (T.isOSBinFormatMachO() && IsAAPCS16) {
90 assert(!
BigEndian &&
"AAPCS16 does not support big-endian");
92 }
else if (T.isOSBinFormatMachO())
95 ?
"E-m:o-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" 96 :
"e-m:o-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
100 ?
"E-m:e-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" 101 :
"e-m:e-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
106 void ARMTargetInfo::setArchInfo() {
107 StringRef ArchName =
getTriple().getArchName();
109 ArchISA = llvm::ARM::parseArchISA(ArchName);
110 CPU = llvm::ARM::getDefaultCPU(ArchName);
111 llvm::ARM::ArchKind AK = llvm::ARM::parseArch(ArchName);
112 if (AK != llvm::ARM::ArchKind::INVALID)
114 setArchInfo(ArchKind);
117 void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind
Kind) {
122 SubArch = llvm::ARM::getSubArch(ArchKind);
123 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
124 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
127 CPUAttr = getCPUAttr();
128 CPUProfile = getCPUProfile();
131 void ARMTargetInfo::setAtomic() {
134 bool ShouldUseInlineAtomic =
135 (ArchISA == llvm::ARM::ISAKind::ARM && ArchVersion >= 6) ||
136 (ArchISA == llvm::ARM::ISAKind::THUMB && ArchVersion >= 7);
138 if (ArchProfile == llvm::ARM::ProfileKind::M) {
140 if (ShouldUseInlineAtomic)
144 if (ShouldUseInlineAtomic)
149 bool ARMTargetInfo::hasMVE()
const {
150 return ArchKind == llvm::ARM::ArchKind::ARMV8_1MMainline && MVE != 0;
153 bool ARMTargetInfo::hasMVEFloat()
const {
154 return hasMVE() && (MVE & MVE_FP);
157 bool ARMTargetInfo::isThumb()
const {
158 return ArchISA == llvm::ARM::ISAKind::THUMB;
161 bool ARMTargetInfo::supportsThumb()
const {
162 return CPUAttr.count(
'T') || ArchVersion >= 6;
165 bool ARMTargetInfo::supportsThumb2()
const {
166 return CPUAttr.equals(
"6T2") ||
167 (ArchVersion >= 7 && !CPUAttr.equals(
"8M_BASE"));
170 StringRef ARMTargetInfo::getCPUAttr()
const {
175 return llvm::ARM::getCPUAttr(ArchKind);
176 case llvm::ARM::ArchKind::ARMV6M:
178 case llvm::ARM::ArchKind::ARMV7S:
180 case llvm::ARM::ArchKind::ARMV7A:
182 case llvm::ARM::ArchKind::ARMV7R:
184 case llvm::ARM::ArchKind::ARMV7M:
186 case llvm::ARM::ArchKind::ARMV7EM:
188 case llvm::ARM::ArchKind::ARMV7VE:
190 case llvm::ARM::ArchKind::ARMV8A:
192 case llvm::ARM::ArchKind::ARMV8_1A:
194 case llvm::ARM::ArchKind::ARMV8_2A:
196 case llvm::ARM::ArchKind::ARMV8_3A:
198 case llvm::ARM::ArchKind::ARMV8_4A:
200 case llvm::ARM::ArchKind::ARMV8_5A:
202 case llvm::ARM::ArchKind::ARMV8MBaseline:
204 case llvm::ARM::ArchKind::ARMV8MMainline:
206 case llvm::ARM::ArchKind::ARMV8R:
208 case llvm::ARM::ArchKind::ARMV8_1MMainline:
213 StringRef ARMTargetInfo::getCPUProfile()
const {
214 switch (ArchProfile) {
215 case llvm::ARM::ProfileKind::A:
217 case llvm::ARM::ProfileKind::R:
219 case llvm::ARM::ProfileKind::M:
228 :
TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(
true), LDREX(0),
230 bool IsOpenBSD = Triple.isOSOpenBSD();
231 bool IsNetBSD = Triple.isOSNetBSD();
237 (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD ||
242 SizeType = (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD ||
248 if ((Triple.isOSDarwin() || Triple.isOSBinFormatMachO()) &&
249 !Triple.isWatchABI())
262 if (Triple.isOSBinFormatMachO()) {
265 if (Triple.getEnvironment() == llvm::Triple::EABI ||
266 Triple.getOS() == llvm::Triple::UnknownOS ||
267 ArchProfile == llvm::ARM::ProfileKind::M) {
269 }
else if (Triple.isWatchABI()) {
274 }
else if (Triple.isOSWindows()) {
279 switch (Triple.getEnvironment()) {
280 case llvm::Triple::Android:
281 case llvm::Triple::GNUEABI:
282 case llvm::Triple::GNUEABIHF:
283 case llvm::Triple::MuslEABI:
284 case llvm::Triple::MuslEABIHF:
287 case llvm::Triple::EABIHF:
288 case llvm::Triple::EABI:
291 case llvm::Triple::GNU:
313 if (IsAAPCS && (Triple.getEnvironment() != llvm::Triple::Android))
322 if (Triple.getOS() == llvm::Triple::Linux ||
323 Triple.getOS() == llvm::Triple::UnknownOS)
325 ?
"llvm.arm.gnu.eabi.mcount" 340 if (Name ==
"apcs-gnu" || Name ==
"aapcs16") {
341 setABIAPCS(Name ==
"aapcs16");
344 if (Name ==
"aapcs" || Name ==
"aapcs-vfp" || Name ==
"aapcs-linux") {
354 const std::vector<std::string> &FeaturesVec)
const {
356 std::string ArchFeature;
357 std::vector<StringRef> TargetFeatures;
358 llvm::ARM::ArchKind Arch = llvm::ARM::parseArch(
getTriple().getArchName());
362 llvm::ARM::ArchKind CPUArch = llvm::ARM::parseCPUArch(CPU);
363 if (CPUArch == llvm::ARM::ArchKind::INVALID)
365 if (CPUArch != llvm::ARM::ArchKind::INVALID) {
366 ArchFeature = (
"+" + llvm::ARM::getArchName(CPUArch)).str();
367 TargetFeatures.push_back(ArchFeature);
371 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
372 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
375 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
378 for (
auto Feature : TargetFeatures)
379 if (Feature[0] ==
'+')
380 Features[Feature.drop_front(1)] =
true;
385 Features[
"thumb-mode"] =
true;
387 Features[
"thumb-mode"] =
false;
391 std::vector<std::string> UpdatedFeaturesVec;
392 for (
const auto &Feature : FeaturesVec) {
395 if (Feature ==
"+soft-float-abi")
398 StringRef FixedFeature;
399 if (Feature ==
"+arm")
400 FixedFeature =
"-thumb-mode";
401 else if (Feature ==
"+thumb")
402 FixedFeature =
"+thumb-mode";
404 FixedFeature = Feature;
405 UpdatedFeaturesVec.push_back(FixedFeature.str());
428 for (
const auto &Feature : Features) {
429 if (Feature ==
"+soft-float") {
431 }
else if (Feature ==
"+vfp2sp" || Feature ==
"+vfp2") {
434 if (Feature ==
"+vfp2")
436 }
else if (Feature ==
"+vfp3sp" || Feature ==
"+vfp3d16sp" ||
437 Feature ==
"+vfp3" || Feature ==
"+vfp3d16") {
440 if (Feature ==
"+vfp3" || Feature ==
"+vfp3d16")
442 }
else if (Feature ==
"+vfp4sp" || Feature ==
"+vfp4d16sp" ||
443 Feature ==
"+vfp4" || Feature ==
"+vfp4d16") {
445 HW_FP |= HW_FP_SP | HW_FP_HP;
446 if (Feature ==
"+vfp4" || Feature ==
"+vfp4d16")
448 }
else if (Feature ==
"+fp-armv8sp" || Feature ==
"+fp-armv8d16sp" ||
449 Feature ==
"+fp-armv8" || Feature ==
"+fp-armv8d16") {
451 HW_FP |= HW_FP_SP | HW_FP_HP;
452 if (Feature ==
"+fp-armv8" || Feature ==
"+fp-armv8d16")
454 }
else if (Feature ==
"+neon") {
457 }
else if (Feature ==
"+hwdiv") {
459 }
else if (Feature ==
"+hwdiv-arm") {
461 }
else if (Feature ==
"+crc") {
463 }
else if (Feature ==
"+crypto") {
465 }
else if (Feature ==
"+dsp") {
467 }
else if (Feature ==
"+fp64") {
469 }
else if (Feature ==
"+8msecext") {
470 if (CPUProfile !=
"M" || ArchVersion != 8) {
471 Diags.
Report(diag::err_target_unsupported_mcmse) << CPU;
474 }
else if (Feature ==
"+strict-align") {
476 }
else if (Feature ==
"+fp16") {
478 }
else if (Feature ==
"+fullfp16") {
480 }
else if (Feature ==
"+dotprod") {
482 }
else if (Feature ==
"+mve") {
485 }
else if (Feature ==
"+mve.fp") {
489 MVE |= MVE_INT | MVE_FP;
490 HW_FP |= HW_FP_SP | HW_FP_HP;
494 switch (ArchVersion) {
496 if (ArchProfile == llvm::ARM::ProfileKind::M)
498 else if (ArchKind == llvm::ARM::ArchKind::ARMV6K)
499 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B;
504 if (ArchProfile == llvm::ARM::ProfileKind::M)
505 LDREX = LDREX_W | LDREX_H | LDREX_B;
507 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B;
510 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B;
513 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
514 Diags.
Report(diag::err_target_unsupported_fpmath) <<
"neon";
518 if (FPMath == FP_Neon)
519 Features.push_back(
"+neonfp");
520 else if (FPMath == FP_VFP)
521 Features.push_back(
"-neonfp");
527 return llvm::StringSwitch<bool>(Feature)
529 .Case(
"aarch32",
true)
530 .Case(
"softfloat", SoftFloat)
531 .Case(
"thumb", isThumb())
532 .Case(
"neon", (FPU & NeonFPU) && !SoftFloat)
533 .Case(
"vfp", FPU && !SoftFloat)
534 .Case(
"hwdiv", HWDiv & HWDivThumb)
535 .Case(
"hwdiv-arm", HWDiv & HWDivARM)
536 .Case(
"mve", hasMVE())
541 return Name ==
"generic" ||
542 llvm::ARM::parseCPUArch(Name) != llvm::ARM::ArchKind::INVALID;
546 llvm::ARM::fillValidCPUArchList(Values);
550 if (Name !=
"generic")
551 setArchInfo(llvm::ARM::parseCPUArch(Name));
553 if (ArchKind == llvm::ARM::ArchKind::INVALID)
561 if (Name ==
"neon") {
564 }
else if (Name ==
"vfp" || Name ==
"vfp2" || Name ==
"vfp3" ||
596 if (
getTriple().getOS() == llvm::Triple::UnknownOS &&
597 (
getTriple().getEnvironment() == llvm::Triple::EABI ||
598 getTriple().getEnvironment() == llvm::Triple::EABIHF))
609 if (!CPUAttr.empty())
610 Builder.
defineMacro(
"__ARM_ARCH_" + CPUAttr +
"__");
614 Builder.
defineMacro(
"__ARM_ARCH", Twine(ArchVersion));
616 if (ArchVersion >= 8) {
624 Builder.
defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
626 Builder.
defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
632 if (CPUProfile.empty() || ArchProfile != llvm::ARM::ProfileKind::M)
639 if (supportsThumb2())
641 else if (supportsThumb())
651 if (!CPUProfile.empty())
652 Builder.
defineMacro(
"__ARM_ARCH_PROFILE",
"'" + CPUProfile +
"'");
656 Builder.
defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
660 Builder.
defineMacro(
"__ARM_FEATURE_LDREX",
"0x" + Twine::utohexstr(LDREX));
663 if (ArchVersion == 5 || (ArchVersion == 6 && CPUProfile !=
"M") ||
669 Builder.
defineMacro(
"__ARM_FP",
"0x" + Twine::utohexstr(HW_FP));
675 Builder.
defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
679 if (ArchVersion >= 7 && (FPU & VFP4FPU))
687 if (5 <= ArchVersion && ArchVersion <= 8 && !
getTriple().isOSWindows())
690 if (ABI ==
"aapcs" || ABI ==
"aapcs-linux" || ABI ==
"aapcs-vfp") {
698 if ((!SoftFloat && !SoftFloatABI) || ABI ==
"aapcs-vfp" || ABI ==
"aapcs16")
710 if (ArchKind == llvm::ARM::ArchKind::XSCALE)
716 if (supportsThumb2())
721 if ((CPUProfile !=
"M" && ArchVersion >= 6) || (CPUProfile ==
"M" && DSP))
725 if (((HWDiv & HWDivThumb) && isThumb()) ||
726 ((HWDiv & HWDivARM) && !isThumb())) {
734 if (FPUModeIsVFP((FPUMode)FPU)) {
750 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
756 "0x" + Twine::utohexstr(HW_FP & ~HW_FP_DP));
760 Builder.
defineMacro(
"__ARM_FEATURE_MVE", hasMVEFloat() ?
"3" :
"1");
764 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
766 Builder.
defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
769 if (ArchVersion == 8 && ArchProfile == llvm::ARM::ProfileKind::M)
770 Builder.
defineMacro(
"__ARM_FEATURE_CMSE", Opts.Cmse ?
"3" :
"1");
772 if (ArchVersion >= 6 && CPUAttr !=
"6M" && CPUAttr !=
"8M_BASE") {
773 Builder.
defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
774 Builder.
defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
775 Builder.
defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
776 Builder.
defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
786 if ((ArchVersion == 6 && CPUProfile !=
"M") || ArchVersion > 6) {
795 if (Opts.UnsafeFPMath)
800 Builder.
defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
804 Builder.
defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
813 case llvm::ARM::ArchKind::ARMV8_1A:
816 case llvm::ARM::ArchKind::ARMV8_2A:
819 case llvm::ARM::ArchKind::ARMV8_3A:
820 case llvm::ARM::ArchKind::ARMV8_4A:
821 case llvm::ARM::ArchKind::ARMV8_5A:
828 #define BUILTIN(ID, TYPE, ATTRS) \ 829 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, 830 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 831 {#ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr}, 832 #include "clang/Basic/BuiltinsNEON.def" 834 #define BUILTIN(ID, TYPE, ATTRS) \ 835 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, 836 #define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \ 837 {#ID, TYPE, ATTRS, nullptr, LANG, nullptr}, 838 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 839 {#ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr}, 840 #define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \ 841 {#ID, TYPE, ATTRS, HEADER, LANGS, FEATURE}, 842 #include "clang/Basic/BuiltinsARM.def" 858 const char *
const ARMTargetInfo::GCCRegNames[] = {
860 "r0",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
"r8",
"r9",
"r10",
"r11",
861 "r12",
"sp",
"lr",
"pc",
864 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
865 "s12",
"s13",
"s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
866 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
869 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
"d8",
"d9",
"d10",
"d11",
870 "d12",
"d13",
"d14",
"d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
871 "d23",
"d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
874 "q0",
"q1",
"q2",
"q3",
"q4",
"q5",
"q6",
"q7",
"q8",
"q9",
"q10",
"q11",
875 "q12",
"q13",
"q14",
"q15"};
878 return llvm::makeArrayRef(GCCRegNames);
882 {{
"a1"},
"r0"}, {{
"a2"},
"r1"}, {{
"a3"},
"r2"}, {{
"a4"},
"r3"},
883 {{
"v1"},
"r4"}, {{
"v2"},
"r5"}, {{
"v3"},
"r6"}, {{
"v4"},
"r7"},
884 {{
"v5"},
"r8"}, {{
"v6",
"rfp"},
"r9"}, {{
"sl"},
"r10"}, {{
"fp"},
"r11"},
885 {{
"ip"},
"r12"}, {{
"r13"},
"sp"}, {{
"r14"},
"lr"}, {{
"r15"},
"pc"},
891 return llvm::makeArrayRef(GCCRegAliases);
917 if (CPUAttr.equals(
"6T2") || ArchVersion >= 7) {
924 if (!supportsThumb2())
936 if (isThumb() && !supportsThumb2())
943 if (!supportsThumb2())
958 if (!supportsThumb2())
970 if (isThumb() && !supportsThumb2())
981 if (isThumb() && !supportsThumb2()) {
988 if (isThumb() && !supportsThumb2()) {
1031 switch (*Constraint) {
1034 R = std::string(
"^") + std::string(Constraint, 2);
1038 R = std::string(
"r");
1041 return std::string(1, *Constraint);
1047 StringRef Constraint,
char Modifier,
unsigned Size,
1048 std::string &SuggestedModifier)
const {
1049 bool isOutput = (Constraint[0] ==
'=');
1050 bool isInOut = (Constraint[0] ==
'+');
1053 while (Constraint[0] ==
'=' || Constraint[0] ==
'+' || Constraint[0] ==
'&')
1054 Constraint = Constraint.substr(1);
1056 switch (Constraint[0]) {
1062 return (isInOut || isOutput || Size <= 64);
1133 assert((Triple.getArch() == llvm::Triple::arm ||
1134 Triple.getArch() == llvm::Triple::thumb) &&
1135 "invalid architecture for Windows ARM target info");
1136 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
1137 Builder.
defineMacro(
"_M_ARM", Triple.getArchName().substr(Offset));
1179 if (Opts.MSVCCompat)
1214 resetDataLayout(
"e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64");
1237 if (Triple.isWatchABI()) {
1248 const llvm::Triple &Triple,
1257 Triple.getEnvironmentName()),
MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
unsigned char LongLongAlign
void DefineStd(MacroBuilder &Builder, StringRef MacroName, const LangOptions &Opts)
DefineStd - Define a macro name and standard variants.
unsigned char DoubleAlign
Specialize PointerLikeTypeTraits to allow LazyGenerationalUpdatePtr to be placed into a PointerUnion...
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods --------------------——===//
MicrosoftARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void setRequiresImmediate(int Min, int Max)
Options for controlling the target.
unsigned UseSignedCharForObjCBool
Whether Objective-C's built-in boolean type should be signed char.
WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
bool setCPU(const std::string &Name) override
Target the specified CPU.
ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
unsigned char LongDoubleAlign
bool setFPMath(StringRef Name) override
Use the specified unit for FP math.
const char * 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.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods --------------------——===//
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
unsigned char MaxAtomicPromoteWidth
ArrayRef< Builtin::Info > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
The Microsoft ABI is the ABI used by Microsoft Visual Studio (and compatible compilers).
unsigned char SuitableAlign
Concrete class used by the front-end to report problems and issues.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods --------------------——===//
Defines the Diagnostic-related interfaces.
VersionTuple PlatformMinVersion
unsigned UseZeroLengthBitfieldAlignment
Whether zero length bitfields (e.g., int : 0;) force alignment of the next bitfield.
The iOS ABI is a partial implementation of the ARM ABI.
bool validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size, std::string &SuggestedModifier) const override
The generic ARM ABI is a modified version of the Itanium ABI proposed by ARM for use on ARM-based pla...
bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeaturesVec) const override
Initialize the map with the default set of target features for the CPU this should include all legal ...
unsigned char DefaultAlignForAttributeAligned
typedef void* __builtin_va_list;
Exposes information about the current target.
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
unsigned HasAlignMac68kSupport
virtual bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const
Initialize the map with the default set of target features for the CPU this should include all legal ...
void getVisualStudioDefines(const LangOptions &Opts, MacroBuilder &Builder) const
unsigned UseBitFieldTypeAlignment
Control whether the alignment of bit-field types is respected when laying out structures.
void getTargetDefinesARMV82A(const LangOptions &Opts, MacroBuilder &Builder) const
bool validateAsmConstraint(const char *&Name, TargetInfo::ConstraintInfo &Info) const override
std::string convertConstraint(const char *&Constraint) const override
bool hasSjLjLowering() const override
Controls if __builtin_longjmp / __builtin_setjmp can be lowered to llvm.eh.sjlj.longjmp / llvm...
ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
bool isValidCPUName(StringRef Name) const override
brief Determine whether this TargetInfo supports the given CPU name.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods --------------------——===//
CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
CallingConv
CallingConv - Specifies the calling convention that a function uses.
WatchOS is a modernisation of the iOS ABI, which roughly means it's the iOS64 ABI ported to 32-bits...
Enumerates target-specific builtins in their own namespaces within namespace clang.
unsigned IsRenderScriptTarget
bool isCLZForZeroUndef() const override
The __builtin_clz* and __builtin_ctz* built-in functions are specified to have undefined results for ...
void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts, const llvm::Triple &Triple, StringRef &PlatformName, VersionTuple &PlatformMinVersion)
OpenMPLinearClauseKind Modifier
Modifier of 'linear' clause.
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
Perform initialization based on the user configured set of features (e.g., +sse4).
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods --------------------——===//
ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods --------------------——===//
std::vector< std::string > FeaturesAsWritten
The list of target specific features to enable or disable, as written on the command line...
llvm::EABI EABIVersion
The EABI version to use.
__builtin_va_list as defined by ARM AAPCS ABI http://infocenter.arm.com
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods --------------------——===//
RenderScript32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Dataflow Directional Tag Classes.
unsigned ZeroLengthBitfieldBoundary
If non-zero, specifies a fixed alignment value for bitfields that follow zero length bitfield...
typedef char* __builtin_va_list;
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods --------------------——===//
void getTargetDefinesARMV81A(const LangOptions &Opts, MacroBuilder &Builder) const
BuiltinVaListKind
The different kinds of __builtin_va_list types defined by the target implementation.
ArrayRef< const char * > getGCCRegNames() const override
bool setABI(const std::string &Name) override
Use the specified ABI.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods --------------------——===//
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.
StringRef getABI() const override
Get the ABI currently in use.
unsigned char MaxAtomicInlineWidth
int getEHDataRegisterNumber(unsigned RegNo) const override
Return the register number that __builtin_eh_return_regno would return with the specified argument...
void defineMacro(const Twine &Name, const Twine &Value="1")
Append a #define line for macro of the form "\#define Name Value\n".
void resetDataLayout(StringRef DL)
Defines enum values for all the target-independent builtin functions.
unsigned short MaxVectorAlign