18 #include "llvm/ADT/StringExtras.h" 19 #include "llvm/ADT/StringRef.h" 20 #include "llvm/ADT/StringSwitch.h" 22 using namespace clang;
25 void ARMTargetInfo::setABIAAPCS() {
31 bool IsNetBSD = T.getOS() == llvm::Triple::NetBSD;
32 bool IsOpenBSD = T.getOS() == llvm::Triple::OpenBSD;
33 if (!T.isOSWindows() && !IsNetBSD && !IsOpenBSD)
42 if (T.isOSBinFormatMachO()) {
44 ?
"E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 45 :
"e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
46 }
else if (T.isOSWindows()) {
47 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");
61 ?
"E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 62 :
"e-m:e-p:32:32-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-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" 96 :
"e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
100 ?
"E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" 101 :
"e-m:e-p:32:32-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::isThumb()
const {
150 return ArchISA == llvm::ARM::ISAKind::THUMB;
153 bool ARMTargetInfo::supportsThumb()
const {
154 return CPUAttr.count(
'T') || ArchVersion >= 6;
157 bool ARMTargetInfo::supportsThumb2()
const {
158 return CPUAttr.equals(
"6T2") ||
159 (ArchVersion >= 7 && !CPUAttr.equals(
"8M_BASE"));
162 StringRef ARMTargetInfo::getCPUAttr()
const {
167 return llvm::ARM::getCPUAttr(ArchKind);
168 case llvm::ARM::ArchKind::ARMV6M:
170 case llvm::ARM::ArchKind::ARMV7S:
172 case llvm::ARM::ArchKind::ARMV7A:
174 case llvm::ARM::ArchKind::ARMV7R:
176 case llvm::ARM::ArchKind::ARMV7M:
178 case llvm::ARM::ArchKind::ARMV7EM:
180 case llvm::ARM::ArchKind::ARMV7VE:
182 case llvm::ARM::ArchKind::ARMV8A:
184 case llvm::ARM::ArchKind::ARMV8_1A:
186 case llvm::ARM::ArchKind::ARMV8_2A:
188 case llvm::ARM::ArchKind::ARMV8_3A:
190 case llvm::ARM::ArchKind::ARMV8_4A:
192 case llvm::ARM::ArchKind::ARMV8MBaseline:
194 case llvm::ARM::ArchKind::ARMV8MMainline:
196 case llvm::ARM::ArchKind::ARMV8R:
201 StringRef ARMTargetInfo::getCPUProfile()
const {
202 switch (ArchProfile) {
203 case llvm::ARM::ProfileKind::A:
205 case llvm::ARM::ProfileKind::R:
207 case llvm::ARM::ProfileKind::M:
216 :
TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(
true), LDREX(0),
218 bool IsOpenBSD = Triple.getOS() == llvm::Triple::OpenBSD;
219 bool IsNetBSD = Triple.getOS() == llvm::Triple::NetBSD;
225 (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD ||
230 SizeType = (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD ||
236 if ((Triple.isOSDarwin() || Triple.isOSBinFormatMachO()) &&
237 !Triple.isWatchABI())
250 if (Triple.isOSBinFormatMachO()) {
253 if (Triple.getEnvironment() == llvm::Triple::EABI ||
254 Triple.getOS() == llvm::Triple::UnknownOS ||
255 ArchProfile == llvm::ARM::ProfileKind::M) {
257 }
else if (Triple.isWatchABI()) {
262 }
else if (Triple.isOSWindows()) {
267 switch (Triple.getEnvironment()) {
268 case llvm::Triple::Android:
269 case llvm::Triple::GNUEABI:
270 case llvm::Triple::GNUEABIHF:
271 case llvm::Triple::MuslEABI:
272 case llvm::Triple::MuslEABIHF:
275 case llvm::Triple::EABIHF:
276 case llvm::Triple::EABI:
279 case llvm::Triple::GNU:
283 if (Triple.getOS() == llvm::Triple::NetBSD)
285 else if (Triple.getOS() == llvm::Triple::OpenBSD)
300 if (IsAAPCS && (Triple.getEnvironment() != llvm::Triple::Android))
309 if (Triple.getOS() == llvm::Triple::Linux ||
310 Triple.getOS() == llvm::Triple::UnknownOS)
312 ?
"\01__gnu_mcount_nc" 325 if (Name ==
"apcs-gnu" || Name ==
"aapcs16") {
326 setABIAPCS(Name ==
"aapcs16");
329 if (Name ==
"aapcs" || Name ==
"aapcs-vfp" || Name ==
"aapcs-linux") {
339 const std::vector<std::string> &FeaturesVec)
const {
341 std::string ArchFeature;
342 std::vector<StringRef> TargetFeatures;
343 llvm::ARM::ArchKind Arch = llvm::ARM::parseArch(
getTriple().getArchName());
347 llvm::ARM::ArchKind CPUArch = llvm::ARM::parseCPUArch(CPU);
348 if (CPUArch == llvm::ARM::ArchKind::INVALID)
350 if (CPUArch != llvm::ARM::ArchKind::INVALID) {
351 ArchFeature = (
"+" + llvm::ARM::getArchName(CPUArch)).str();
352 TargetFeatures.push_back(ArchFeature);
356 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
357 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
360 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
363 for (
auto Feature : TargetFeatures)
364 if (Feature[0] ==
'+')
365 Features[Feature.drop_front(1)] =
true;
370 Features[
"thumb-mode"] =
true;
372 Features[
"thumb-mode"] =
false;
376 std::vector<std::string> UpdatedFeaturesVec(FeaturesVec);
377 for (
auto &Feature : UpdatedFeaturesVec) {
378 if (Feature.compare(
"+arm") == 0)
379 Feature =
"-thumb-mode";
380 else if (Feature.compare(
"+thumb") == 0)
381 Feature =
"+thumb-mode";
395 SoftFloat = SoftFloatABI =
false;
401 uint32_t HW_FP_remove = 0;
402 for (
const auto &Feature : Features) {
403 if (Feature ==
"+soft-float") {
405 }
else if (Feature ==
"+soft-float-abi") {
407 }
else if (Feature ==
"+vfp2") {
409 HW_FP |= HW_FP_SP | HW_FP_DP;
410 }
else if (Feature ==
"+vfp3") {
412 HW_FP |= HW_FP_SP | HW_FP_DP;
413 }
else if (Feature ==
"+vfp4") {
415 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
416 }
else if (Feature ==
"+fp-armv8") {
418 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
419 }
else if (Feature ==
"+neon") {
421 HW_FP |= HW_FP_SP | HW_FP_DP;
422 }
else if (Feature ==
"+hwdiv") {
424 }
else if (Feature ==
"+hwdiv-arm") {
426 }
else if (Feature ==
"+crc") {
428 }
else if (Feature ==
"+crypto") {
430 }
else if (Feature ==
"+dsp") {
432 }
else if (Feature ==
"+fp-only-sp") {
433 HW_FP_remove |= HW_FP_DP;
434 }
else if (Feature ==
"+strict-align") {
436 }
else if (Feature ==
"+fp16") {
438 }
else if (Feature ==
"+fullfp16") {
440 }
else if (Feature ==
"+dotprod") {
444 HW_FP &= ~HW_FP_remove;
446 switch (ArchVersion) {
448 if (ArchProfile == llvm::ARM::ProfileKind::M)
450 else if (ArchKind == llvm::ARM::ArchKind::ARMV6K)
451 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B;
456 if (ArchProfile == llvm::ARM::ProfileKind::M)
457 LDREX = LDREX_W | LDREX_H | LDREX_B;
459 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B;
462 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B;
465 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
466 Diags.
Report(diag::err_target_unsupported_fpmath) <<
"neon";
470 if (FPMath == FP_Neon)
471 Features.push_back(
"+neonfp");
472 else if (FPMath == FP_VFP)
473 Features.push_back(
"-neonfp");
476 auto Feature = std::find(Features.begin(), Features.end(),
"+soft-float-abi");
477 if (Feature != Features.end())
478 Features.erase(Feature);
484 return llvm::StringSwitch<bool>(Feature)
486 .Case(
"aarch32",
true)
487 .Case(
"softfloat", SoftFloat)
488 .Case(
"thumb", isThumb())
489 .Case(
"neon", (FPU & NeonFPU) && !SoftFloat)
490 .Case(
"vfp", FPU && !SoftFloat)
491 .Case(
"hwdiv", HWDiv & HWDivThumb)
492 .Case(
"hwdiv-arm", HWDiv & HWDivARM)
497 return Name ==
"generic" ||
498 llvm::ARM::parseCPUArch(Name) != llvm::ARM::ArchKind::INVALID;
502 llvm::ARM::fillValidCPUArchList(Values);
506 if (Name !=
"generic")
507 setArchInfo(llvm::ARM::parseCPUArch(Name));
509 if (ArchKind == llvm::ARM::ArchKind::INVALID)
517 if (Name ==
"neon") {
520 }
else if (Name ==
"vfp" || Name ==
"vfp2" || Name ==
"vfp3" ||
545 if (
getTriple().getOS() == llvm::Triple::UnknownOS &&
546 (
getTriple().getEnvironment() == llvm::Triple::EABI ||
547 getTriple().getEnvironment() == llvm::Triple::EABIHF))
558 if (!CPUAttr.empty())
559 Builder.
defineMacro(
"__ARM_ARCH_" + CPUAttr +
"__");
563 Builder.
defineMacro(
"__ARM_ARCH", Twine(ArchVersion));
565 if (ArchVersion >= 8) {
573 Builder.
defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
575 Builder.
defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
581 if (CPUProfile.empty() || ArchProfile != llvm::ARM::ProfileKind::M)
588 if (supportsThumb2())
590 else if (supportsThumb())
600 if (!CPUProfile.empty())
601 Builder.
defineMacro(
"__ARM_ARCH_PROFILE",
"'" + CPUProfile +
"'");
605 Builder.
defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
609 Builder.
defineMacro(
"__ARM_FEATURE_LDREX",
"0x" + Twine::utohexstr(LDREX));
612 if (ArchVersion == 5 || (ArchVersion == 6 && CPUProfile !=
"M") ||
618 Builder.
defineMacro(
"__ARM_FP",
"0x" + Twine::utohexstr(HW_FP));
624 Builder.
defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
628 if (ArchVersion >= 7 && (FPU & VFP4FPU))
636 if (5 <= ArchVersion && ArchVersion <= 8 && !
getTriple().isOSWindows())
639 if (ABI ==
"aapcs" || ABI ==
"aapcs-linux" || ABI ==
"aapcs-vfp") {
647 if ((!SoftFloat && !SoftFloatABI) || ABI ==
"aapcs-vfp" || ABI ==
"aapcs16")
653 if (ArchKind == llvm::ARM::ArchKind::XSCALE)
659 if (supportsThumb2())
664 if (ArchVersion >= 6 && (CPUProfile !=
"M" || CPUAttr ==
"7EM"))
668 if (((HWDiv & HWDivThumb) && isThumb()) ||
669 ((HWDiv & HWDivARM) && !isThumb())) {
677 if (FPUModeIsVFP((FPUMode)FPU)) {
693 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
699 "0x" + Twine::utohexstr(HW_FP & ~HW_FP_DP));
703 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
705 Builder.
defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
707 if (ArchVersion >= 6 && CPUAttr !=
"6M" && CPUAttr !=
"8M_BASE") {
708 Builder.
defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
709 Builder.
defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
710 Builder.
defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
711 Builder.
defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
721 if ((ArchVersion == 6 && CPUProfile !=
"M") || ArchVersion > 6) {
730 if (Opts.UnsafeFPMath)
735 Builder.
defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
739 Builder.
defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
748 case llvm::ARM::ArchKind::ARMV8_1A:
751 case llvm::ARM::ArchKind::ARMV8_2A:
758 #define BUILTIN(ID, TYPE, ATTRS) \ 759 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, 760 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 761 {#ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr}, 762 #include "clang/Basic/BuiltinsNEON.def" 764 #define BUILTIN(ID, TYPE, ATTRS) \ 765 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, 766 #define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \ 767 {#ID, TYPE, ATTRS, nullptr, LANG, nullptr}, 768 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 769 {#ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr}, 770 #define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \ 771 {#ID, TYPE, ATTRS, HEADER, LANGS, FEATURE}, 772 #include "clang/Basic/BuiltinsARM.def" 788 const char *
const ARMTargetInfo::GCCRegNames[] = {
790 "r0",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
"r8",
"r9",
"r10",
"r11",
791 "r12",
"sp",
"lr",
"pc",
794 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
795 "s12",
"s13",
"s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
796 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
799 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
"d8",
"d9",
"d10",
"d11",
800 "d12",
"d13",
"d14",
"d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
801 "d23",
"d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
804 "q0",
"q1",
"q2",
"q3",
"q4",
"q5",
"q6",
"q7",
"q8",
"q9",
"q10",
"q11",
805 "q12",
"q13",
"q14",
"q15"};
808 return llvm::makeArrayRef(GCCRegNames);
812 {{
"a1"},
"r0"}, {{
"a2"},
"r1"}, {{
"a3"},
"r2"}, {{
"a4"},
"r3"},
813 {{
"v1"},
"r4"}, {{
"v2"},
"r5"}, {{
"v3"},
"r6"}, {{
"v4"},
"r7"},
814 {{
"v5"},
"r8"}, {{
"v6",
"rfp"},
"r9"}, {{
"sl"},
"r10"}, {{
"fp"},
"r11"},
815 {{
"ip"},
"r12"}, {{
"r13"},
"sp"}, {{
"r14"},
"lr"}, {{
"r15"},
"pc"},
821 return llvm::makeArrayRef(GCCRegAliases);
866 switch (*Constraint) {
868 R = std::string(
"^") + std::string(Constraint, 2);
872 R = std::string(
"r");
875 return std::string(1, *Constraint);
881 StringRef Constraint,
char Modifier,
unsigned Size,
882 std::string &SuggestedModifier)
const {
883 bool isOutput = (Constraint[0] ==
'=');
884 bool isInOut = (Constraint[0] ==
'+');
887 while (Constraint[0] ==
'=' || Constraint[0] ==
'+' || Constraint[0] ==
'&')
888 Constraint = Constraint.substr(1);
890 switch (Constraint[0]) {
896 return (isInOut || isOutput || Size <= 64);
969 assert((Triple.getArch() == llvm::Triple::arm ||
970 Triple.getArch() == llvm::Triple::thumb) &&
971 "invalid architecture for Windows ARM target info");
972 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
973 Builder.
defineMacro(
"_M_ARM", Triple.getArchName().substr(Offset));
1014 if (Opts.MSVCCompat)
1072 if (Triple.isWatchABI()) {
1083 const llvm::Triple &Triple,
1092 Triple.getEnvironmentName()),
MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void DefineStd(MacroBuilder &Builder, StringRef MacroName, const LangOptions &Opts)
DefineStd - Define a macro name and standard variants.
DominatorTree GraphTraits specialization so the DominatorTree can be iterable by generic graph iterat...
unsigned short MaxVectorAlign
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)
unsigned char LongDoubleAlign
Options for controlling the target.
unsigned ZeroLengthBitfieldBoundary
If non-zero, specifies a fixed alignment value for bitfields that follow zero length bitfield...
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)
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).
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
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 ...
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
void getVisualStudioDefines(const LangOptions &Opts, MacroBuilder &Builder) const
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 --------------------——===//
void resetDataLayout(StringRef DL)
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)
unsigned char DoubleAlign
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 --------------------——===//
unsigned UseZeroLengthBitfieldAlignment
Whether zero length bitfields (e.g., int : 0;) force alignment of the next bitfield.
llvm::EABI EABIVersion
The EABI version to use.
__builtin_va_list as defined by ARM AAPCS ABI http://infocenter.arm.com
unsigned char SuitableAlign
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.
typedef char* __builtin_va_list;
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods --------------------——===//
unsigned UseSignedCharForObjCBool
Whether Objective-C's built-in boolean type should be signed char.
void getTargetDefinesARMV81A(const LangOptions &Opts, MacroBuilder &Builder) const
unsigned char LongLongAlign
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 --------------------——===//
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".
unsigned UseBitFieldTypeAlignment
Control whether the alignment of bit-field types is respected when laying out structures.
Defines enum values for all the target-independent builtin functions.