12 #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H 13 #define LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H 16 #include "llvm/MC/MCSectionMachO.h" 21 template <
typename TgtInfo>
24 virtual void getOSDefines(
const LangOptions &Opts,
const llvm::Triple &Triple,
33 TgtInfo::getTargetDefines(Opts, Builder);
34 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
39 template <
typename Target>
48 Builder.
defineMacro(
"__STDC_ISO_10646__",
"201206L");
59 template <
typename Target>
75 const llvm::Triple &Triple, StringRef &PlatformName,
76 VersionTuple &PlatformMinVersion);
78 template <
typename Target>
84 this->PlatformMinVersion);
92 this->TLSSupported =
false;
94 if (Triple.isMacOSX())
95 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
96 else if (Triple.isiOS()) {
99 if (Triple.isArch64Bit())
100 this->TLSSupported = !Triple.isOSVersionLT(8);
101 else if (Triple.isArch32Bit()) {
102 if (!Triple.isSimulatorEnvironment())
103 this->TLSSupported = !Triple.isOSVersionLT(9);
105 this->TLSSupported = !Triple.isOSVersionLT(10);
107 }
else if (Triple.isWatchOS()) {
108 if (!Triple.isSimulatorEnvironment())
109 this->TLSSupported = !Triple.isOSVersionLT(2);
111 this->TLSSupported = !Triple.isOSVersionLT(3);
114 this->MCountName =
"\01mcount";
119 StringRef Segment, Section;
120 unsigned TAA, StubSize;
122 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
123 TAA, HasTAA, StubSize);
128 return "__TEXT,__StaticInit,regular,pure_instructions";
140 llvm::VersionTuple MinVersion;
141 const llvm::Triple &T = this->getTriple();
145 case llvm::Triple::Darwin:
146 case llvm::Triple::MacOSX:
147 MinVersion = llvm::VersionTuple(10U, 14U);
149 case llvm::Triple::IOS:
150 case llvm::Triple::TvOS:
151 MinVersion = llvm::VersionTuple(12U);
153 case llvm::Triple::WatchOS:
154 MinVersion = llvm::VersionTuple(5U);
157 llvm_unreachable(
"Unexpected OS");
160 unsigned Major, Minor, Micro;
161 T.getOSVersion(Major, Minor, Micro);
162 if (llvm::VersionTuple(Major, Minor, Micro) < MinVersion)
168 bool IsSigned)
const final {
170 return BitWidth == 64
178 template <
typename Target>
186 Builder.
defineMacro(
"__DragonFly_cc_version",
"100001");
196 switch (Triple.getArch()) {
198 case llvm::Triple::x86:
199 case llvm::Triple::x86_64:
200 this->MCountName =
".mcount";
206 #ifndef FREEBSD_CC_VERSION 207 #define FREEBSD_CC_VERSION 0U 211 template <
typename Target>
218 unsigned Release = Triple.getOSMajorVersion();
223 CCVersion = Release * 100000U + 1U;
225 Builder.
defineMacro(
"__FreeBSD__", Twine(Release));
226 Builder.
defineMacro(
"__FreeBSD_cc_version", Twine(CCVersion));
240 Builder.
defineMacro(
"__STDC_MB_MIGHT_NEQ_WC__",
"1");
246 switch (Triple.getArch()) {
248 case llvm::Triple::x86:
249 case llvm::Triple::x86_64:
250 this->MCountName =
".mcount";
252 case llvm::Triple::mips:
253 case llvm::Triple::mipsel:
254 case llvm::Triple::ppc:
255 case llvm::Triple::ppc64:
256 case llvm::Triple::ppc64le:
257 this->MCountName =
"_mcount";
259 case llvm::Triple::arm:
260 this->MCountName =
"__mcount";
267 template <
typename Target>
278 if (Opts.POSIXThreads)
290 template <
typename Target>
299 if (this->HasFloat128)
310 this->TLSSupported =
false;
311 switch (Triple.getArch()) {
314 case llvm::Triple::x86:
315 case llvm::Triple::x86_64:
316 this->HasFloat128 =
true;
323 template <
typename Target>
335 if (Opts.POSIXThreads)
346 template <
typename Target>
370 template <
typename Target>
379 if (Triple.isAndroid()) {
381 unsigned Maj, Min, Rev;
382 Triple.getEnvironmentVersion(Maj, Min, Rev);
383 this->PlatformName =
"android";
384 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
386 Builder.
defineMacro(
"__ANDROID_API__", Twine(Maj));
390 if (Opts.POSIXThreads)
394 if (this->HasFloat128)
403 switch (Triple.getArch()) {
406 case llvm::Triple::mips:
407 case llvm::Triple::mipsel:
408 case llvm::Triple::mips64:
409 case llvm::Triple::mips64el:
410 case llvm::Triple::ppc:
411 case llvm::Triple::ppc64:
412 case llvm::Triple::ppc64le:
413 this->MCountName =
"_mcount";
415 case llvm::Triple::x86:
416 case llvm::Triple::x86_64:
417 this->HasFloat128 =
true;
423 return ".text.startup";
428 template <
typename Target>
437 if (Opts.POSIXThreads)
444 this->MCountName =
"__mcount";
449 template <
typename Target>
459 if (Opts.POSIXThreads)
461 if (this->HasFloat128)
468 switch (Triple.getArch()) {
469 case llvm::Triple::x86:
470 case llvm::Triple::x86_64:
471 this->HasFloat128 =
true;
474 this->MCountName =
"__mcount";
476 case llvm::Triple::mips64:
477 case llvm::Triple::mips64el:
478 case llvm::Triple::ppc:
479 case llvm::Triple::sparcv9:
480 this->MCountName =
"_mcount";
487 template <
typename Target>
504 template <
typename Target>
522 this->LongWidth = this->LongAlign = 32;
523 this->PointerWidth = this->PointerAlign = 32;
527 this->resetDataLayout(
"E-m:e-p:32:32-i64:64-n32:64");
531 template <
typename Target>
537 Builder.
defineMacro(
"__FreeBSD_cc_version",
"900001");
551 this->MaxTLSAlign = 256;
555 this->UseExplicitBitFieldAlignment =
false;
557 switch (Triple.getArch()) {
559 case llvm::Triple::x86_64:
560 this->MCountName =
".mcount";
561 this->NewAlign = 256;
572 template <
typename Target>
588 switch (Triple.getArch()) {
590 case llvm::Triple::x86:
593 case llvm::Triple::mips:
594 case llvm::Triple::mipsel:
595 case llvm::Triple::ppc:
596 case llvm::Triple::ppc64:
597 case llvm::Triple::ppc64le:
600 case llvm::Triple::arm:
608 template <
typename Target>
626 if (Opts.CPlusPlus) {
634 if (Opts.POSIXThreads)
636 if (this->HasFloat128)
643 if (this->PointerWidth == 64) {
644 this->WCharType = this->WIntType = this->SignedInt;
646 this->WCharType = this->WIntType = this->SignedLong;
648 switch (Triple.getArch()) {
651 case llvm::Triple::x86:
652 case llvm::Triple::x86_64:
653 this->HasFloat128 =
true;
660 template <
typename Target>
671 unsigned Major, Minor, Micro;
672 Triple.getOSVersion(Major, Minor, Micro);
676 std::pair<int, int> OsVersion = {Major, Minor};
677 if (OsVersion >= std::make_pair(3, 2)) Builder.
defineMacro(
"_AIX32");
678 if (OsVersion >= std::make_pair(4, 1)) Builder.
defineMacro(
"_AIX41");
679 if (OsVersion >= std::make_pair(4, 3)) Builder.
defineMacro(
"_AIX43");
680 if (OsVersion >= std::make_pair(5, 0)) Builder.
defineMacro(
"_AIX50");
681 if (OsVersion >= std::make_pair(5, 1)) Builder.
defineMacro(
"_AIX51");
682 if (OsVersion >= std::make_pair(5, 2)) Builder.
defineMacro(
"_AIX52");
683 if (OsVersion >= std::make_pair(5, 3)) Builder.
defineMacro(
"_AIX53");
684 if (OsVersion >= std::make_pair(6, 1)) Builder.
defineMacro(
"_AIX61");
685 if (OsVersion >= std::make_pair(7, 1)) Builder.
defineMacro(
"_AIX71");
686 if (OsVersion >= std::make_pair(7, 2)) Builder.
defineMacro(
"_AIX72");
691 if (Opts.POSIXThreads) {
695 if (this->PointerWidth == 64) {
701 if (Opts.CPlusPlus && Opts.WChar) {
709 if (this->PointerWidth == 64) {
710 this->WCharType = this->UnsignedInt;
712 this->WCharType = this->UnsignedShort;
714 this->UseZeroLengthBitfieldAlignment =
true;
726 template <
typename Target>
742 template <
typename Target>
747 if (Opts.POSIXThreads)
760 this->LongAlign = 32;
761 this->LongWidth = 32;
762 this->PointerAlign = 32;
763 this->PointerWidth = 32;
766 this->DoubleAlign = 64;
767 this->LongDoubleWidth = 64;
768 this->LongDoubleAlign = 64;
769 this->LongLongWidth = 64;
770 this->LongLongAlign = 64;
775 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();
776 if (Triple.getArch() == llvm::Triple::arm) {
778 }
else if (Triple.getArch() == llvm::Triple::x86) {
779 this->resetDataLayout(
"e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-" 780 "i64:64-n8:16:32-S128");
781 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
782 this->resetDataLayout(
"e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-" 783 "i64:64-n8:16:32:64-S128");
784 }
else if (Triple.getArch() == llvm::Triple::mipsel) {
787 assert(Triple.getArch() == llvm::Triple::le32);
788 this->resetDataLayout(
"e-p:32:32-i64:64");
794 template <
typename Target>
801 if (Opts.POSIXThreads)
811 this->MCountName =
"__mcount";
817 template <
typename Target>
824 if (Opts.POSIXThreads)
837 this->MCountName =
"__mcount";
839 this->HasFloat128 =
true;
844 template <
typename Target>
847 void getOSDefines(
const LangOptions &Opts,
const llvm::Triple &Triple,
859 template <
typename Target>
862 void getOSDefines(
const LangOptions &Opts,
const llvm::Triple &Triple,
875 #endif // LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H PSPTargetInfo(const llvm::Triple &Triple)
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
void DefineStd(MacroBuilder &Builder, StringRef MacroName, const LangOptions &Opts)
DefineStd - Define a macro name and standard variants.
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
unsigned getFloatEvalMethod() const override
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
virtual IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const
Return the smallest integer type with at least the specified width.
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
const char * getStaticInitSectionSpecifier() const override
Options for controlling the target.
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
WebAssemblyOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const
bool hasProtectedVisibility() const override
Darwin does not support protected visibility.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
AnanasTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
const char * getStaticInitSectionSpecifier() const override
bool hasInt128Type() const override
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
AIXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
std::string isValidSectionSpecifier(StringRef SR) const override
KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
EmscriptenTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
CallingConv
CallingConv - Specifies the calling convention that a function uses.
HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
TargetInfo::CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts, const llvm::Triple &Triple, StringRef &PlatformName, VersionTuple &PlatformMinVersion)
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
#define FREEBSD_CC_VERSION
FuchsiaTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
The WebAssembly ABI is a modified version of the Itanium ABI.
IntType
===-— Target Data Type Query Methods ----------------------------—===//
Dataflow Directional Tag Classes.
PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
The Fuchsia ABI is a modified version of the Itanium ABI.
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
HurdTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
void addWindowsDefines(const llvm::Triple &Triple, const LangOptions &Opts, MacroBuilder &Builder)
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
unsigned getExnObjectAlignment() const override
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void defineMacro(const Twine &Name, const Twine &Value="1")
Append a #define line for macro of the form "\#define Name Value\n".
OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
WASITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
TargetInfo::IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final