Path: blob/main/contrib/llvm-project/clang/lib/Basic/Targets/OSTargets.h
35267 views
//===--- OSTargets.h - Declare OS target feature support --------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file declares OS specific TargetInfo types.9//===----------------------------------------------------------------------===//1011#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H12#define LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H1314#include "Targets.h"1516namespace clang {17namespace targets {1819template <typename TgtInfo>20class LLVM_LIBRARY_VISIBILITY OSTargetInfo : public TgtInfo {21protected:22virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,23MacroBuilder &Builder) const = 0;2425public:26OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)27: TgtInfo(Triple, Opts) {}2829void getTargetDefines(const LangOptions &Opts,30MacroBuilder &Builder) const override {31TgtInfo::getTargetDefines(Opts, Builder);32getOSDefines(Opts, TgtInfo::getTriple(), Builder);33}34};3536void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,37const llvm::Triple &Triple, StringRef &PlatformName,38VersionTuple &PlatformMinVersion);3940template <typename Target>41class LLVM_LIBRARY_VISIBILITY DarwinTargetInfo : public OSTargetInfo<Target> {42protected:43void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,44MacroBuilder &Builder) const override {45getDarwinDefines(Builder, Opts, Triple, this->PlatformName,46this->PlatformMinVersion);47}4849public:50DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)51: OSTargetInfo<Target>(Triple, Opts) {52// By default, no TLS, and we list permitted architecture/OS53// combinations.54this->TLSSupported = false;5556if (Triple.isMacOSX())57this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);58else if (Triple.isiOS()) {59// 64-bit iOS supported it from 8 onwards, 32-bit device from 9 onwards,60// 32-bit simulator from 10 onwards.61if (Triple.isArch64Bit())62this->TLSSupported = !Triple.isOSVersionLT(8);63else if (Triple.isArch32Bit()) {64if (!Triple.isSimulatorEnvironment())65this->TLSSupported = !Triple.isOSVersionLT(9);66else67this->TLSSupported = !Triple.isOSVersionLT(10);68}69} else if (Triple.isWatchOS()) {70if (!Triple.isSimulatorEnvironment())71this->TLSSupported = !Triple.isOSVersionLT(2);72else73this->TLSSupported = !Triple.isOSVersionLT(3);74} else if (Triple.isDriverKit()) {75// No TLS on DriverKit.76} else if (Triple.isXROS())77this->TLSSupported = true;7879this->MCountName = "\01mcount";80}8182const char *getStaticInitSectionSpecifier() const override {83// FIXME: We should return 0 when building kexts.84return "__TEXT,__StaticInit,regular,pure_instructions";85}8687/// Darwin does not support protected visibility. Darwin's "default"88/// is very similar to ELF's "protected"; Darwin requires a "weak"89/// attribute on declarations that can be dynamically replaced.90bool hasProtectedVisibility() const override { return false; }9192unsigned getExnObjectAlignment() const override {93// Older versions of libc++abi guarantee an alignment of only 8-bytes for94// exception objects because of a bug in __cxa_exception that was95// eventually fixed in r319123.96llvm::VersionTuple MinVersion;97const llvm::Triple &T = this->getTriple();9899// Compute the earliest OS versions that have the fix to libc++abi.100switch (T.getOS()) {101case llvm::Triple::Darwin:102case llvm::Triple::MacOSX: // Earliest supporting version is 10.14.103MinVersion = llvm::VersionTuple(10U, 14U);104break;105case llvm::Triple::IOS:106case llvm::Triple::TvOS: // Earliest supporting version is 12.0.0.107MinVersion = llvm::VersionTuple(12U);108break;109case llvm::Triple::WatchOS: // Earliest supporting version is 5.0.0.110MinVersion = llvm::VersionTuple(5U);111break;112case llvm::Triple::XROS:113MinVersion = llvm::VersionTuple(0);114break;115default:116// Conservatively return 8 bytes if OS is unknown.117return 64;118}119120if (T.getOSVersion() < MinVersion)121return 64;122return OSTargetInfo<Target>::getExnObjectAlignment();123}124125TargetInfo::IntType getLeastIntTypeByWidth(unsigned BitWidth,126bool IsSigned) const final {127// Darwin uses `long long` for `int_least64_t` and `int_fast64_t`.128return BitWidth == 64129? (IsSigned ? TargetInfo::SignedLongLong130: TargetInfo::UnsignedLongLong)131: TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);132}133134bool areDefaultedSMFStillPOD(const LangOptions &) const override {135return false;136}137};138139// DragonFlyBSD Target140template <typename Target>141class LLVM_LIBRARY_VISIBILITY DragonFlyBSDTargetInfo142: public OSTargetInfo<Target> {143protected:144void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,145MacroBuilder &Builder) const override {146// DragonFly defines; list based off of gcc output147Builder.defineMacro("__DragonFly__");148Builder.defineMacro("__DragonFly_cc_version", "100001");149Builder.defineMacro("__KPRINTF_ATTRIBUTE__");150Builder.defineMacro("__tune_i386__");151DefineStd(Builder, "unix", Opts);152if (this->HasFloat128)153Builder.defineMacro("__FLOAT128__");154}155156public:157DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)158: OSTargetInfo<Target>(Triple, Opts) {159switch (Triple.getArch()) {160default:161case llvm::Triple::x86:162case llvm::Triple::x86_64:163this->HasFloat128 = true;164this->MCountName = ".mcount";165break;166}167}168};169170#ifndef FREEBSD_CC_VERSION171#define FREEBSD_CC_VERSION 0U172#endif173174// FreeBSD Target175template <typename Target>176class LLVM_LIBRARY_VISIBILITY FreeBSDTargetInfo : public OSTargetInfo<Target> {177protected:178void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,179MacroBuilder &Builder) const override {180// FreeBSD defines; list based off of gcc output181182unsigned Release = Triple.getOSMajorVersion();183if (Release == 0U)184Release = 8U;185unsigned CCVersion = FREEBSD_CC_VERSION;186if (CCVersion == 0U)187CCVersion = Release * 100000U + 1U;188189Builder.defineMacro("__FreeBSD__", Twine(Release));190Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));191Builder.defineMacro("__KPRINTF_ATTRIBUTE__");192DefineStd(Builder, "unix", Opts);193if (this->HasFloat128)194Builder.defineMacro("__FLOAT128__");195196// On FreeBSD, wchar_t contains the number of the code point as197// used by the character set of the locale. These character sets are198// not necessarily a superset of ASCII.199//200// FIXME: This is wrong; the macro refers to the numerical values201// of wchar_t *literals*, which are not locale-dependent. However,202// FreeBSD systems apparently depend on us getting this wrong, and203// setting this to 1 is conforming even if all the basic source204// character literals have the same encoding as char and wchar_t.205Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");206}207208public:209FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)210: OSTargetInfo<Target>(Triple, Opts) {211switch (Triple.getArch()) {212case llvm::Triple::x86:213case llvm::Triple::x86_64:214this->HasFloat128 = true;215[[fallthrough]];216default:217this->MCountName = ".mcount";218break;219case llvm::Triple::mips:220case llvm::Triple::mipsel:221case llvm::Triple::ppc:222case llvm::Triple::ppcle:223case llvm::Triple::ppc64:224case llvm::Triple::ppc64le:225this->MCountName = "_mcount";226break;227case llvm::Triple::arm:228this->MCountName = "__mcount";229break;230case llvm::Triple::riscv32:231case llvm::Triple::riscv64:232break;233}234}235};236237// GNU/kFreeBSD Target238template <typename Target>239class LLVM_LIBRARY_VISIBILITY KFreeBSDTargetInfo : public OSTargetInfo<Target> {240protected:241void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,242MacroBuilder &Builder) const override {243// GNU/kFreeBSD defines; list based off of gcc output244245DefineStd(Builder, "unix", Opts);246Builder.defineMacro("__FreeBSD_kernel__");247Builder.defineMacro("__GLIBC__");248if (Opts.POSIXThreads)249Builder.defineMacro("_REENTRANT");250if (Opts.CPlusPlus)251Builder.defineMacro("_GNU_SOURCE");252}253254public:255using OSTargetInfo<Target>::OSTargetInfo;256};257258// Haiku Target259template <typename Target>260class LLVM_LIBRARY_VISIBILITY HaikuTargetInfo : public OSTargetInfo<Target> {261protected:262void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,263MacroBuilder &Builder) const override {264// Haiku defines; list based off of gcc output265Builder.defineMacro("__HAIKU__");266DefineStd(Builder, "unix", Opts);267if (this->HasFloat128)268Builder.defineMacro("__FLOAT128__");269}270271public:272HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)273: OSTargetInfo<Target>(Triple, Opts) {274this->SizeType = TargetInfo::UnsignedLong;275this->IntPtrType = TargetInfo::SignedLong;276this->PtrDiffType = TargetInfo::SignedLong;277this->ProcessIDType = TargetInfo::SignedLong;278switch (Triple.getArch()) {279default:280break;281case llvm::Triple::x86:282case llvm::Triple::x86_64:283this->HasFloat128 = true;284break;285}286}287};288289// Hurd target290template <typename Target>291class LLVM_LIBRARY_VISIBILITY HurdTargetInfo : public OSTargetInfo<Target> {292protected:293void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,294MacroBuilder &Builder) const override {295// Hurd defines; list based off of gcc output.296DefineStd(Builder, "unix", Opts);297Builder.defineMacro("__GNU__");298Builder.defineMacro("__gnu_hurd__");299Builder.defineMacro("__MACH__");300Builder.defineMacro("__GLIBC__");301if (Opts.POSIXThreads)302Builder.defineMacro("_REENTRANT");303if (Opts.CPlusPlus)304Builder.defineMacro("_GNU_SOURCE");305}306public:307using OSTargetInfo<Target>::OSTargetInfo;308};309310// Linux target311template <typename Target>312class LLVM_LIBRARY_VISIBILITY LinuxTargetInfo : public OSTargetInfo<Target> {313protected:314void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,315MacroBuilder &Builder) const override {316// Linux defines; list based off of gcc output317DefineStd(Builder, "unix", Opts);318DefineStd(Builder, "linux", Opts);319if (Triple.isAndroid()) {320Builder.defineMacro("__ANDROID__", "1");321this->PlatformName = "android";322this->PlatformMinVersion = Triple.getEnvironmentVersion();323const unsigned Maj = this->PlatformMinVersion.getMajor();324if (Maj) {325Builder.defineMacro("__ANDROID_MIN_SDK_VERSION__", Twine(Maj));326// This historical but ambiguous name for the minSdkVersion macro. Keep327// defined for compatibility.328Builder.defineMacro("__ANDROID_API__", "__ANDROID_MIN_SDK_VERSION__");329}330} else {331Builder.defineMacro("__gnu_linux__");332}333if (Opts.POSIXThreads)334Builder.defineMacro("_REENTRANT");335if (Opts.CPlusPlus)336Builder.defineMacro("_GNU_SOURCE");337if (this->HasFloat128)338Builder.defineMacro("__FLOAT128__");339if (Triple.isTime64ABI()) {340Builder.defineMacro("_FILE_OFFSET_BITS", "64");341Builder.defineMacro("_TIME_BITS", "64");342}343}344345public:346LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)347: OSTargetInfo<Target>(Triple, Opts) {348this->WIntType = TargetInfo::UnsignedInt;349350switch (Triple.getArch()) {351default:352break;353case llvm::Triple::mips:354case llvm::Triple::mipsel:355case llvm::Triple::mips64:356case llvm::Triple::mips64el:357case llvm::Triple::ppc:358case llvm::Triple::ppcle:359case llvm::Triple::ppc64:360case llvm::Triple::ppc64le:361this->MCountName = "_mcount";362break;363case llvm::Triple::x86:364case llvm::Triple::x86_64:365this->HasFloat128 = true;366break;367}368}369370const char *getStaticInitSectionSpecifier() const override {371return ".text.startup";372}373};374375// NetBSD Target376template <typename Target>377class LLVM_LIBRARY_VISIBILITY NetBSDTargetInfo : public OSTargetInfo<Target> {378protected:379void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,380MacroBuilder &Builder) const override {381// NetBSD defines; list based off of gcc output382Builder.defineMacro("__NetBSD__");383Builder.defineMacro("__unix__");384if (Opts.POSIXThreads)385Builder.defineMacro("_REENTRANT");386if (this->HasFloat128)387Builder.defineMacro("__FLOAT128__");388}389390public:391NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)392: OSTargetInfo<Target>(Triple, Opts) {393this->MCountName = "__mcount";394switch (Triple.getArch()) {395default:396break;397case llvm::Triple::x86:398case llvm::Triple::x86_64:399this->HasFloat128 = true;400break;401}402}403};404405// OpenBSD Target406template <typename Target>407class LLVM_LIBRARY_VISIBILITY OpenBSDTargetInfo : public OSTargetInfo<Target> {408protected:409void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,410MacroBuilder &Builder) const override {411// OpenBSD defines; list based off of gcc output412413Builder.defineMacro("__OpenBSD__");414DefineStd(Builder, "unix", Opts);415if (Opts.POSIXThreads)416Builder.defineMacro("_REENTRANT");417if (this->HasFloat128)418Builder.defineMacro("__FLOAT128__");419420if (Opts.C11)421Builder.defineMacro("__STDC_NO_THREADS__");422}423424public:425OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)426: OSTargetInfo<Target>(Triple, Opts) {427this->WCharType = this->WIntType = this->SignedInt;428this->IntMaxType = TargetInfo::SignedLongLong;429this->Int64Type = TargetInfo::SignedLongLong;430switch (Triple.getArch()) {431case llvm::Triple::x86:432case llvm::Triple::x86_64:433this->HasFloat128 = true;434[[fallthrough]];435default:436this->MCountName = "__mcount";437break;438case llvm::Triple::mips64:439case llvm::Triple::mips64el:440case llvm::Triple::ppc:441case llvm::Triple::ppc64:442case llvm::Triple::ppc64le:443case llvm::Triple::sparcv9:444this->MCountName = "_mcount";445break;446case llvm::Triple::riscv32:447case llvm::Triple::riscv64:448break;449}450}451};452453// PS3 PPU Target454template <typename Target>455class LLVM_LIBRARY_VISIBILITY PS3PPUTargetInfo : public OSTargetInfo<Target> {456protected:457void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,458MacroBuilder &Builder) const override {459// PS3 PPU defines.460Builder.defineMacro("__PPU__");461Builder.defineMacro("__CELLOS_LV2__");462Builder.defineMacro("__LP32__");463Builder.defineMacro("_ARCH_PPC64");464Builder.defineMacro("__powerpc64__");465}466467public:468PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)469: OSTargetInfo<Target>(Triple, Opts) {470this->LongWidth = this->LongAlign = 32;471this->PointerWidth = this->PointerAlign = 32;472this->IntMaxType = TargetInfo::SignedLongLong;473this->Int64Type = TargetInfo::SignedLongLong;474this->SizeType = TargetInfo::UnsignedInt;475this->resetDataLayout("E-m:e-p:32:32-Fi64-i64:64-n32:64");476}477};478479// Common base class for PS4/PS5 targets.480template <typename Target>481class LLVM_LIBRARY_VISIBILITY PSOSTargetInfo : public OSTargetInfo<Target> {482protected:483void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,484MacroBuilder &Builder) const override {485Builder.defineMacro("__FreeBSD__", "9");486Builder.defineMacro("__FreeBSD_cc_version", "900001");487Builder.defineMacro("__KPRINTF_ATTRIBUTE__");488DefineStd(Builder, "unix", Opts);489Builder.defineMacro("__SCE__");490Builder.defineMacro("__STDC_NO_COMPLEX__");491Builder.defineMacro("__STDC_NO_THREADS__");492}493494public:495PSOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)496: OSTargetInfo<Target>(Triple, Opts) {497this->WCharType = TargetInfo::UnsignedShort;498499// On PS4/PS5, TLS variable cannot be aligned to more than 32 bytes (256500// bits).501this->MaxTLSAlign = 256;502503// On PS4/PS5, do not honor explicit bit field alignment,504// as in "__attribute__((aligned(2))) int b : 1;".505this->UseExplicitBitFieldAlignment = false;506507this->MCountName = ".mcount";508this->NewAlign = 256;509this->SuitableAlign = 256;510}511512TargetInfo::CallingConvCheckResult513checkCallingConvention(CallingConv CC) const override {514return (CC == CC_C) ? TargetInfo::CCCR_OK : TargetInfo::CCCR_Error;515}516517bool areDefaultedSMFStillPOD(const LangOptions &) const override {518return false;519}520};521522// PS4 Target523template <typename Target>524class LLVM_LIBRARY_VISIBILITY PS4OSTargetInfo : public PSOSTargetInfo<Target> {525protected:526void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,527MacroBuilder &Builder) const override {528// Start with base class defines.529PSOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder);530531Builder.defineMacro("__ORBIS__");532}533534public:535using PSOSTargetInfo<Target>::PSOSTargetInfo;536};537538// PS5 Target539template <typename Target>540class LLVM_LIBRARY_VISIBILITY PS5OSTargetInfo : public PSOSTargetInfo<Target> {541protected:542void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,543MacroBuilder &Builder) const override {544// Start with base class defines.545PSOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder);546547Builder.defineMacro("__PROSPERO__");548}549550public:551using PSOSTargetInfo<Target>::PSOSTargetInfo;552};553554// RTEMS Target555template <typename Target>556class LLVM_LIBRARY_VISIBILITY RTEMSTargetInfo : public OSTargetInfo<Target> {557protected:558void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,559MacroBuilder &Builder) const override {560// RTEMS defines; list based off of gcc output561562Builder.defineMacro("__rtems__");563if (Opts.CPlusPlus)564Builder.defineMacro("_GNU_SOURCE");565}566567public:568RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)569: OSTargetInfo<Target>(Triple, Opts) {570switch (Triple.getArch()) {571default:572case llvm::Triple::x86:573// this->MCountName = ".mcount";574break;575case llvm::Triple::mips:576case llvm::Triple::mipsel:577case llvm::Triple::ppc:578case llvm::Triple::ppc64:579case llvm::Triple::ppc64le:580// this->MCountName = "_mcount";581break;582case llvm::Triple::arm:583// this->MCountName = "__mcount";584break;585}586}587};588589// Solaris target590template <typename Target>591class LLVM_LIBRARY_VISIBILITY SolarisTargetInfo : public OSTargetInfo<Target> {592protected:593void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,594MacroBuilder &Builder) const override {595DefineStd(Builder, "sun", Opts);596DefineStd(Builder, "unix", Opts);597Builder.defineMacro("__svr4__");598Builder.defineMacro("__SVR4");599// Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and600// newer, but to 500 for everything else. feature_test.h has a check to601// ensure that you are not using C99 with an old version of X/Open or C89602// with a new version.603if (Opts.C99)604Builder.defineMacro("_XOPEN_SOURCE", "600");605else606Builder.defineMacro("_XOPEN_SOURCE", "500");607if (Opts.CPlusPlus) {608Builder.defineMacro("__C99FEATURES__");609Builder.defineMacro("_FILE_OFFSET_BITS", "64");610}611// GCC restricts the next two to C++.612Builder.defineMacro("_LARGEFILE_SOURCE");613Builder.defineMacro("_LARGEFILE64_SOURCE");614Builder.defineMacro("__EXTENSIONS__");615if (Opts.POSIXThreads)616Builder.defineMacro("_REENTRANT");617if (this->HasFloat128)618Builder.defineMacro("__FLOAT128__");619}620621public:622SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)623: OSTargetInfo<Target>(Triple, Opts) {624if (this->PointerWidth == 64) {625this->WCharType = this->WIntType = this->SignedInt;626} else {627this->WCharType = this->WIntType = this->SignedLong;628}629switch (Triple.getArch()) {630default:631break;632case llvm::Triple::x86:633case llvm::Triple::x86_64:634this->HasFloat128 = true;635break;636}637}638};639640// AIX Target641template <typename Target>642class AIXTargetInfo : public OSTargetInfo<Target> {643protected:644void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,645MacroBuilder &Builder) const override {646DefineStd(Builder, "unix", Opts);647Builder.defineMacro("_IBMR2");648Builder.defineMacro("_POWER");649Builder.defineMacro("__THW_BIG_ENDIAN__");650651Builder.defineMacro("_AIX");652Builder.defineMacro("__TOS_AIX__");653Builder.defineMacro("__HOS_AIX__");654655if (Opts.C11) {656Builder.defineMacro("__STDC_NO_ATOMICS__");657Builder.defineMacro("__STDC_NO_THREADS__");658}659660if (Opts.EnableAIXExtendedAltivecABI)661Builder.defineMacro("__EXTABI__");662663VersionTuple OsVersion = Triple.getOSVersion();664665// Define AIX OS-Version Macros.666// Includes logic for legacy versions of AIX; no specific intent to support.667if (OsVersion >= VersionTuple(3, 2))668Builder.defineMacro("_AIX32");669if (OsVersion >= VersionTuple(4, 1))670Builder.defineMacro("_AIX41");671if (OsVersion >= VersionTuple(4, 3))672Builder.defineMacro("_AIX43");673if (OsVersion >= VersionTuple(5, 0))674Builder.defineMacro("_AIX50");675if (OsVersion >= VersionTuple(5, 1))676Builder.defineMacro("_AIX51");677if (OsVersion >= VersionTuple(5, 2))678Builder.defineMacro("_AIX52");679if (OsVersion >= VersionTuple(5, 3))680Builder.defineMacro("_AIX53");681if (OsVersion >= VersionTuple(6, 1))682Builder.defineMacro("_AIX61");683if (OsVersion >= VersionTuple(7, 1))684Builder.defineMacro("_AIX71");685if (OsVersion >= VersionTuple(7, 2))686Builder.defineMacro("_AIX72");687if (OsVersion >= VersionTuple(7, 3))688Builder.defineMacro("_AIX73");689690// FIXME: Do not define _LONG_LONG when -fno-long-long is specified.691Builder.defineMacro("_LONG_LONG");692693if (Opts.POSIXThreads) {694Builder.defineMacro("_THREAD_SAFE");695}696697if (this->PointerWidth == 64) {698Builder.defineMacro("__64BIT__");699}700701// Define _WCHAR_T when it is a fundamental type702// (i.e., for C++ without -fno-wchar).703if (Opts.CPlusPlus && Opts.WChar) {704Builder.defineMacro("_WCHAR_T");705}706}707708public:709AIXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)710: OSTargetInfo<Target>(Triple, Opts) {711this->MCountName = "__mcount";712this->TheCXXABI.set(TargetCXXABI::XL);713714if (this->PointerWidth == 64) {715this->WCharType = this->UnsignedInt;716} else {717this->WCharType = this->UnsignedShort;718}719this->UseZeroLengthBitfieldAlignment = true;720}721722// AIX sets FLT_EVAL_METHOD to be 1.723LangOptions::FPEvalMethodKind getFPEvalMethod() const override {724return LangOptions::FPEvalMethodKind::FEM_Double;725}726727bool defaultsToAIXPowerAlignment() const override { return true; }728729bool areDefaultedSMFStillPOD(const LangOptions &) const override {730return false;731}732};733734// z/OS target735template <typename Target>736class LLVM_LIBRARY_VISIBILITY ZOSTargetInfo : public OSTargetInfo<Target> {737protected:738void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,739MacroBuilder &Builder) const override {740// FIXME: _LONG_LONG should not be defined under -std=c89.741Builder.defineMacro("_LONG_LONG");742Builder.defineMacro("__370__");743Builder.defineMacro("__BFP__");744// FIXME: __BOOL__ should not be defined under -std=c89.745Builder.defineMacro("__BOOL__");746Builder.defineMacro("__COMPILER_VER__", "0x50000000");747Builder.defineMacro("__LONGNAME__");748Builder.defineMacro("__MVS__");749Builder.defineMacro("__THW_370__");750Builder.defineMacro("__THW_BIG_ENDIAN__");751Builder.defineMacro("__TOS_390__");752Builder.defineMacro("__TOS_MVS__");753Builder.defineMacro("__XPLINK__");754755if (this->PointerWidth == 64)756Builder.defineMacro("__64BIT__");757758if (Opts.CPlusPlus && Opts.WChar) {759// Macro __wchar_t is defined so that the wchar_t data760// type is not declared as a typedef in system headers.761Builder.defineMacro("__wchar_t");762}763764this->PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());765}766767public:768ZOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)769: OSTargetInfo<Target>(Triple, Opts) {770this->WCharType = TargetInfo::UnsignedInt;771this->MaxAlignedAttribute = 128;772this->UseBitFieldTypeAlignment = false;773this->UseZeroLengthBitfieldAlignment = true;774this->UseLeadingZeroLengthBitfield = false;775this->ZeroLengthBitfieldBoundary = 32;776this->TheCXXABI.set(TargetCXXABI::XL);777}778779bool areDefaultedSMFStillPOD(const LangOptions &) const override {780return false;781}782};783784void addWindowsDefines(const llvm::Triple &Triple, const LangOptions &Opts,785MacroBuilder &Builder);786787// Windows target788template <typename Target>789class LLVM_LIBRARY_VISIBILITY WindowsTargetInfo : public OSTargetInfo<Target> {790protected:791void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,792MacroBuilder &Builder) const override {793addWindowsDefines(Triple, Opts, Builder);794}795796public:797WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)798: OSTargetInfo<Target>(Triple, Opts) {799this->WCharType = TargetInfo::UnsignedShort;800this->WIntType = TargetInfo::UnsignedShort;801}802};803804template <typename Target>805class LLVM_LIBRARY_VISIBILITY NaClTargetInfo : public OSTargetInfo<Target> {806protected:807void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,808MacroBuilder &Builder) const override {809if (Opts.POSIXThreads)810Builder.defineMacro("_REENTRANT");811if (Opts.CPlusPlus)812Builder.defineMacro("_GNU_SOURCE");813814DefineStd(Builder, "unix", Opts);815Builder.defineMacro("__native_client__");816}817818public:819NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)820: OSTargetInfo<Target>(Triple, Opts) {821this->LongAlign = 32;822this->LongWidth = 32;823this->PointerAlign = 32;824this->PointerWidth = 32;825this->IntMaxType = TargetInfo::SignedLongLong;826this->Int64Type = TargetInfo::SignedLongLong;827this->DoubleAlign = 64;828this->LongDoubleWidth = 64;829this->LongDoubleAlign = 64;830this->LongLongWidth = 64;831this->LongLongAlign = 64;832this->SizeType = TargetInfo::UnsignedInt;833this->PtrDiffType = TargetInfo::SignedInt;834this->IntPtrType = TargetInfo::SignedInt;835// RegParmMax is inherited from the underlying architecture.836this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();837if (Triple.getArch() == llvm::Triple::arm) {838// Handled in ARM's setABI().839} else if (Triple.getArch() == llvm::Triple::x86) {840this->resetDataLayout("e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-"841"i64:64-i128:128-n8:16:32-S128");842} else if (Triple.getArch() == llvm::Triple::x86_64) {843this->resetDataLayout("e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-"844"i64:64-i128:128-n8:16:32:64-S128");845} else if (Triple.getArch() == llvm::Triple::mipsel) {846// Handled on mips' setDataLayout.847} else {848assert(Triple.getArch() == llvm::Triple::le32);849this->resetDataLayout("e-p:32:32-i64:64");850}851}852};853854// Fuchsia Target855template <typename Target>856class LLVM_LIBRARY_VISIBILITY FuchsiaTargetInfo : public OSTargetInfo<Target> {857protected:858void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,859MacroBuilder &Builder) const override {860Builder.defineMacro("__Fuchsia__");861if (Opts.POSIXThreads)862Builder.defineMacro("_REENTRANT");863// Required by the libc++ locale support.864if (Opts.CPlusPlus)865Builder.defineMacro("_GNU_SOURCE");866Builder.defineMacro("__Fuchsia_API_level__", Twine(Opts.FuchsiaAPILevel));867this->PlatformName = "fuchsia";868this->PlatformMinVersion = VersionTuple(Opts.FuchsiaAPILevel);869}870871public:872FuchsiaTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)873: OSTargetInfo<Target>(Triple, Opts) {874this->WIntType = TargetInfo::UnsignedInt;875this->MCountName = "__mcount";876this->TheCXXABI.set(TargetCXXABI::Fuchsia);877}878};879880// WebAssembly target881template <typename Target>882class LLVM_LIBRARY_VISIBILITY WebAssemblyOSTargetInfo883: public OSTargetInfo<Target> {884protected:885void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,886MacroBuilder &Builder) const override {887// A common platform macro.888if (Opts.POSIXThreads)889Builder.defineMacro("_REENTRANT");890// Follow g++ convention and predefine _GNU_SOURCE for C++.891if (Opts.CPlusPlus)892Builder.defineMacro("_GNU_SOURCE");893// Indicate that we have __float128.894Builder.defineMacro("__FLOAT128__");895}896897public:898explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,899const TargetOptions &Opts)900: OSTargetInfo<Target>(Triple, Opts) {901this->MCountName = "__mcount";902this->TheCXXABI.set(TargetCXXABI::WebAssembly);903this->HasFloat128 = true;904}905};906907// WASI target908template <typename Target>909class LLVM_LIBRARY_VISIBILITY WASITargetInfo910: public WebAssemblyOSTargetInfo<Target> {911void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,912MacroBuilder &Builder) const final {913WebAssemblyOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder);914Builder.defineMacro("__wasi__");915}916917public:918using WebAssemblyOSTargetInfo<Target>::WebAssemblyOSTargetInfo;919};920921// Emscripten target922template <typename Target>923class LLVM_LIBRARY_VISIBILITY EmscriptenTargetInfo924: public WebAssemblyOSTargetInfo<Target> {925void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,926MacroBuilder &Builder) const final {927WebAssemblyOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder);928DefineStd(Builder, "unix", Opts);929Builder.defineMacro("__EMSCRIPTEN__");930if (Opts.POSIXThreads)931Builder.defineMacro("__EMSCRIPTEN_PTHREADS__");932}933934public:935explicit EmscriptenTargetInfo(const llvm::Triple &Triple,936const TargetOptions &Opts)937: WebAssemblyOSTargetInfo<Target>(Triple, Opts) {938// Keeping the alignment of long double to 8 bytes even though its size is939// 16 bytes allows emscripten to have an 8-byte-aligned max_align_t which940// in turn gives is a 8-byte aligned malloc.941// Emscripten's ABI is unstable and we may change this back to 128 to match942// the WebAssembly default in the future.943this->LongDoubleAlign = 64;944}945};946947// OHOS target948template <typename Target>949class LLVM_LIBRARY_VISIBILITY OHOSTargetInfo : public OSTargetInfo<Target> {950protected:951void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,952MacroBuilder &Builder) const override {953// Linux defines; list based off of gcc output954DefineStd(Builder, "unix", Opts);955956// Generic OHOS target defines957if (Triple.isOHOSFamily()) {958Builder.defineMacro("__OHOS_FAMILY__", "1");959960auto Version = Triple.getEnvironmentVersion();961this->PlatformName = "ohos";962this->PlatformMinVersion = Version;963Builder.defineMacro("__OHOS_Major__", Twine(Version.getMajor()));964if (auto Minor = Version.getMinor())965Builder.defineMacro("__OHOS_Minor__", Twine(*Minor));966if (auto Subminor = Version.getSubminor())967Builder.defineMacro("__OHOS_Micro__", Twine(*Subminor));968}969970if (Triple.isOpenHOS())971Builder.defineMacro("__OHOS__");972973if (Triple.isOSLinux()) {974DefineStd(Builder, "linux", Opts);975} else if (Triple.isOSLiteOS()) {976Builder.defineMacro("__LITEOS__");977}978979if (Opts.POSIXThreads)980Builder.defineMacro("_REENTRANT");981if (Opts.CPlusPlus)982Builder.defineMacro("_GNU_SOURCE");983if (this->HasFloat128)984Builder.defineMacro("__FLOAT128__");985}986987public:988OHOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)989: OSTargetInfo<Target>(Triple, Opts) {990this->WIntType = TargetInfo::UnsignedInt;991992switch (Triple.getArch()) {993default:994break;995case llvm::Triple::x86:996case llvm::Triple::x86_64:997this->HasFloat128 = true;998break;999}1000}10011002const char *getStaticInitSectionSpecifier() const override {1003return ".text.startup";1004}1005};10061007} // namespace targets1008} // namespace clang1009#endif // LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H101010111012