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");
550 this->MaxTLSAlign = 256;
554 this->UseExplicitBitFieldAlignment =
false;
556 switch (Triple.getArch()) {
558 case llvm::Triple::x86_64:
559 this->MCountName =
".mcount";
560 this->NewAlign = 256;
567 template <
typename Target>
583 switch (Triple.getArch()) {
585 case llvm::Triple::x86:
588 case llvm::Triple::mips:
589 case llvm::Triple::mipsel:
590 case llvm::Triple::ppc:
591 case llvm::Triple::ppc64:
592 case llvm::Triple::ppc64le:
595 case llvm::Triple::arm:
603 template <
typename Target>
621 if (Opts.CPlusPlus) {
629 if (Opts.POSIXThreads)
631 if (this->HasFloat128)
638 if (this->PointerWidth == 64) {
639 this->WCharType = this->WIntType = this->SignedInt;
641 this->WCharType = this->WIntType = this->SignedLong;
643 switch (Triple.getArch()) {
646 case llvm::Triple::x86:
647 case llvm::Triple::x86_64:
648 this->HasFloat128 =
true;
655 template <
typename Target>
666 unsigned Major, Minor, Micro;
667 Triple.getOSVersion(Major, Minor, Micro);
671 std::pair<int, int> OsVersion = {Major, Minor};
672 if (OsVersion >= std::make_pair(3, 2)) Builder.
defineMacro(
"_AIX32");
673 if (OsVersion >= std::make_pair(4, 1)) Builder.
defineMacro(
"_AIX41");
674 if (OsVersion >= std::make_pair(4, 3)) Builder.
defineMacro(
"_AIX43");
675 if (OsVersion >= std::make_pair(5, 0)) Builder.
defineMacro(
"_AIX50");
676 if (OsVersion >= std::make_pair(5, 1)) Builder.
defineMacro(
"_AIX51");
677 if (OsVersion >= std::make_pair(5, 2)) Builder.
defineMacro(
"_AIX52");
678 if (OsVersion >= std::make_pair(5, 3)) Builder.
defineMacro(
"_AIX53");
679 if (OsVersion >= std::make_pair(6, 1)) Builder.
defineMacro(
"_AIX61");
680 if (OsVersion >= std::make_pair(7, 1)) Builder.
defineMacro(
"_AIX71");
681 if (OsVersion >= std::make_pair(7, 2)) Builder.
defineMacro(
"_AIX72");
686 if (Opts.POSIXThreads) {
690 if (this->PointerWidth == 64) {
696 if (Opts.CPlusPlus && Opts.WChar) {
704 if (this->PointerWidth == 64) {
705 this->WCharType = this->UnsignedInt;
707 this->WCharType = this->UnsignedShort;
709 this->UseZeroLengthBitfieldAlignment =
true;
721 template <
typename Target>
737 template <
typename Target>
742 if (Opts.POSIXThreads)
755 this->LongAlign = 32;
756 this->LongWidth = 32;
757 this->PointerAlign = 32;
758 this->PointerWidth = 32;
761 this->DoubleAlign = 64;
762 this->LongDoubleWidth = 64;
763 this->LongDoubleAlign = 64;
764 this->LongLongWidth = 64;
765 this->LongLongAlign = 64;
770 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();
771 if (Triple.getArch() == llvm::Triple::arm) {
773 }
else if (Triple.getArch() == llvm::Triple::x86) {
774 this->resetDataLayout(
"e-m:e-p:32:32-i64:64-n8:16:32-S128");
775 }
else if (Triple.getArch() == llvm::Triple::x86_64) {
776 this->resetDataLayout(
"e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
777 }
else if (Triple.getArch() == llvm::Triple::mipsel) {
780 assert(Triple.getArch() == llvm::Triple::le32);
781 this->resetDataLayout(
"e-p:32:32-i64:64");
787 template <
typename Target>
794 if (Opts.POSIXThreads)
804 this->MCountName =
"__mcount";
809 template <
typename Target>
816 if (Opts.POSIXThreads)
829 this->MCountName =
"__mcount";
831 this->HasFloat128 =
true;
836 template <
typename Target>
839 void getOSDefines(
const LangOptions &Opts,
const llvm::Triple &Triple,
851 template <
typename Target>
854 void getOSDefines(
const LangOptions &Opts,
const llvm::Triple &Triple,
867 #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)
HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
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)
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