1 1.1 joerg //===--- OSTargets.cpp - Implement OS target feature support --------------===// 2 1.1 joerg // 3 1.1 joerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 1.1 joerg // See https://llvm.org/LICENSE.txt for license information. 5 1.1 joerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 1.1 joerg // 7 1.1 joerg //===----------------------------------------------------------------------===// 8 1.1 joerg // 9 1.1 joerg // This file implements OS specific TargetInfo types. 10 1.1 joerg //===----------------------------------------------------------------------===// 11 1.1 joerg 12 1.1 joerg #include "OSTargets.h" 13 1.1 joerg #include "clang/Basic/MacroBuilder.h" 14 1.1 joerg #include "llvm/ADT/StringRef.h" 15 1.1 joerg 16 1.1 joerg using namespace clang; 17 1.1 joerg using namespace clang::targets; 18 1.1 joerg 19 1.1 joerg namespace clang { 20 1.1 joerg namespace targets { 21 1.1 joerg 22 1.1 joerg void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts, 23 1.1 joerg const llvm::Triple &Triple, StringRef &PlatformName, 24 1.1 joerg VersionTuple &PlatformMinVersion) { 25 1.1 joerg Builder.defineMacro("__APPLE_CC__", "6000"); 26 1.1 joerg Builder.defineMacro("__APPLE__"); 27 1.1 joerg Builder.defineMacro("__STDC_NO_THREADS__"); 28 1.1.1.2 joerg 29 1.1 joerg // AddressSanitizer doesn't play well with source fortification, which is on 30 1.1 joerg // by default on Darwin. 31 1.1 joerg if (Opts.Sanitize.has(SanitizerKind::Address)) 32 1.1 joerg Builder.defineMacro("_FORTIFY_SOURCE", "0"); 33 1.1 joerg 34 1.1 joerg // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode. 35 1.1 joerg if (!Opts.ObjC) { 36 1.1 joerg // __weak is always defined, for use in blocks and with objc pointers. 37 1.1 joerg Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))"); 38 1.1 joerg Builder.defineMacro("__strong", ""); 39 1.1 joerg Builder.defineMacro("__unsafe_unretained", ""); 40 1.1 joerg } 41 1.1 joerg 42 1.1 joerg if (Opts.Static) 43 1.1 joerg Builder.defineMacro("__STATIC__"); 44 1.1 joerg else 45 1.1 joerg Builder.defineMacro("__DYNAMIC__"); 46 1.1 joerg 47 1.1 joerg if (Opts.POSIXThreads) 48 1.1 joerg Builder.defineMacro("_REENTRANT"); 49 1.1 joerg 50 1.1 joerg // Get the platform type and version number from the triple. 51 1.1 joerg unsigned Maj, Min, Rev; 52 1.1 joerg if (Triple.isMacOSX()) { 53 1.1 joerg Triple.getMacOSXVersion(Maj, Min, Rev); 54 1.1 joerg PlatformName = "macos"; 55 1.1 joerg } else { 56 1.1 joerg Triple.getOSVersion(Maj, Min, Rev); 57 1.1 joerg PlatformName = llvm::Triple::getOSTypeName(Triple.getOS()); 58 1.1 joerg } 59 1.1 joerg 60 1.1 joerg // If -target arch-pc-win32-macho option specified, we're 61 1.1 joerg // generating code for Win32 ABI. No need to emit 62 1.1 joerg // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__. 63 1.1 joerg if (PlatformName == "win32") { 64 1.1 joerg PlatformMinVersion = VersionTuple(Maj, Min, Rev); 65 1.1 joerg return; 66 1.1 joerg } 67 1.1 joerg 68 1.1 joerg // Set the appropriate OS version define. 69 1.1 joerg if (Triple.isiOS()) { 70 1.1 joerg assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!"); 71 1.1 joerg char Str[7]; 72 1.1 joerg if (Maj < 10) { 73 1.1 joerg Str[0] = '0' + Maj; 74 1.1 joerg Str[1] = '0' + (Min / 10); 75 1.1 joerg Str[2] = '0' + (Min % 10); 76 1.1 joerg Str[3] = '0' + (Rev / 10); 77 1.1 joerg Str[4] = '0' + (Rev % 10); 78 1.1 joerg Str[5] = '\0'; 79 1.1 joerg } else { 80 1.1 joerg // Handle versions >= 10. 81 1.1 joerg Str[0] = '0' + (Maj / 10); 82 1.1 joerg Str[1] = '0' + (Maj % 10); 83 1.1 joerg Str[2] = '0' + (Min / 10); 84 1.1 joerg Str[3] = '0' + (Min % 10); 85 1.1 joerg Str[4] = '0' + (Rev / 10); 86 1.1 joerg Str[5] = '0' + (Rev % 10); 87 1.1 joerg Str[6] = '\0'; 88 1.1 joerg } 89 1.1 joerg if (Triple.isTvOS()) 90 1.1 joerg Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str); 91 1.1 joerg else 92 1.1 joerg Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", 93 1.1 joerg Str); 94 1.1 joerg 95 1.1 joerg } else if (Triple.isWatchOS()) { 96 1.1 joerg assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!"); 97 1.1 joerg char Str[6]; 98 1.1 joerg Str[0] = '0' + Maj; 99 1.1 joerg Str[1] = '0' + (Min / 10); 100 1.1 joerg Str[2] = '0' + (Min % 10); 101 1.1 joerg Str[3] = '0' + (Rev / 10); 102 1.1 joerg Str[4] = '0' + (Rev % 10); 103 1.1 joerg Str[5] = '\0'; 104 1.1 joerg Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str); 105 1.1 joerg } else if (Triple.isMacOSX()) { 106 1.1 joerg // Note that the Driver allows versions which aren't representable in the 107 1.1 joerg // define (because we only get a single digit for the minor and micro 108 1.1 joerg // revision numbers). So, we limit them to the maximum representable 109 1.1 joerg // version. 110 1.1 joerg assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!"); 111 1.1 joerg char Str[7]; 112 1.1 joerg if (Maj < 10 || (Maj == 10 && Min < 10)) { 113 1.1 joerg Str[0] = '0' + (Maj / 10); 114 1.1 joerg Str[1] = '0' + (Maj % 10); 115 1.1 joerg Str[2] = '0' + std::min(Min, 9U); 116 1.1 joerg Str[3] = '0' + std::min(Rev, 9U); 117 1.1 joerg Str[4] = '\0'; 118 1.1 joerg } else { 119 1.1 joerg // Handle versions > 10.9. 120 1.1 joerg Str[0] = '0' + (Maj / 10); 121 1.1 joerg Str[1] = '0' + (Maj % 10); 122 1.1 joerg Str[2] = '0' + (Min / 10); 123 1.1 joerg Str[3] = '0' + (Min % 10); 124 1.1 joerg Str[4] = '0' + (Rev / 10); 125 1.1 joerg Str[5] = '0' + (Rev % 10); 126 1.1 joerg Str[6] = '\0'; 127 1.1 joerg } 128 1.1 joerg Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str); 129 1.1 joerg } 130 1.1 joerg 131 1.1 joerg // Tell users about the kernel if there is one. 132 1.1 joerg if (Triple.isOSDarwin()) 133 1.1 joerg Builder.defineMacro("__MACH__"); 134 1.1 joerg 135 1.1 joerg PlatformMinVersion = VersionTuple(Maj, Min, Rev); 136 1.1 joerg } 137 1.1 joerg 138 1.1 joerg static void addMinGWDefines(const llvm::Triple &Triple, const LangOptions &Opts, 139 1.1 joerg MacroBuilder &Builder) { 140 1.1 joerg DefineStd(Builder, "WIN32", Opts); 141 1.1 joerg DefineStd(Builder, "WINNT", Opts); 142 1.1 joerg if (Triple.isArch64Bit()) { 143 1.1 joerg DefineStd(Builder, "WIN64", Opts); 144 1.1 joerg Builder.defineMacro("__MINGW64__"); 145 1.1 joerg } 146 1.1 joerg Builder.defineMacro("__MSVCRT__"); 147 1.1 joerg Builder.defineMacro("__MINGW32__"); 148 1.1 joerg addCygMingDefines(Opts, Builder); 149 1.1 joerg } 150 1.1 joerg 151 1.1 joerg static void addVisualCDefines(const LangOptions &Opts, MacroBuilder &Builder) { 152 1.1 joerg if (Opts.CPlusPlus) { 153 1.1 joerg if (Opts.RTTIData) 154 1.1 joerg Builder.defineMacro("_CPPRTTI"); 155 1.1 joerg 156 1.1 joerg if (Opts.CXXExceptions) 157 1.1 joerg Builder.defineMacro("_CPPUNWIND"); 158 1.1 joerg } 159 1.1 joerg 160 1.1 joerg if (Opts.Bool) 161 1.1 joerg Builder.defineMacro("__BOOL_DEFINED"); 162 1.1 joerg 163 1.1 joerg if (!Opts.CharIsSigned) 164 1.1 joerg Builder.defineMacro("_CHAR_UNSIGNED"); 165 1.1 joerg 166 1.1 joerg // FIXME: POSIXThreads isn't exactly the option this should be defined for, 167 1.1 joerg // but it works for now. 168 1.1 joerg if (Opts.POSIXThreads) 169 1.1 joerg Builder.defineMacro("_MT"); 170 1.1 joerg 171 1.1 joerg if (Opts.MSCompatibilityVersion) { 172 1.1 joerg Builder.defineMacro("_MSC_VER", 173 1.1 joerg Twine(Opts.MSCompatibilityVersion / 100000)); 174 1.1 joerg Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion)); 175 1.1 joerg // FIXME We cannot encode the revision information into 32-bits 176 1.1 joerg Builder.defineMacro("_MSC_BUILD", Twine(1)); 177 1.1 joerg 178 1.1 joerg if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) 179 1.1 joerg Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1)); 180 1.1 joerg 181 1.1 joerg if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) { 182 1.1.1.2 joerg if (Opts.CPlusPlus20) 183 1.1.1.2 joerg Builder.defineMacro("_MSVC_LANG", "201705L"); 184 1.1 joerg else if (Opts.CPlusPlus17) 185 1.1 joerg Builder.defineMacro("_MSVC_LANG", "201703L"); 186 1.1 joerg else if (Opts.CPlusPlus14) 187 1.1 joerg Builder.defineMacro("_MSVC_LANG", "201402L"); 188 1.1 joerg } 189 1.1 joerg } 190 1.1 joerg 191 1.1 joerg if (Opts.MicrosoftExt) { 192 1.1 joerg Builder.defineMacro("_MSC_EXTENSIONS"); 193 1.1 joerg 194 1.1 joerg if (Opts.CPlusPlus11) { 195 1.1 joerg Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED"); 196 1.1 joerg Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED"); 197 1.1 joerg Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED"); 198 1.1 joerg } 199 1.1 joerg } 200 1.1 joerg 201 1.1 joerg Builder.defineMacro("_INTEGRAL_MAX_BITS", "64"); 202 1.1 joerg } 203 1.1 joerg 204 1.1 joerg void addWindowsDefines(const llvm::Triple &Triple, const LangOptions &Opts, 205 1.1 joerg MacroBuilder &Builder) { 206 1.1 joerg Builder.defineMacro("_WIN32"); 207 1.1 joerg if (Triple.isArch64Bit()) 208 1.1 joerg Builder.defineMacro("_WIN64"); 209 1.1 joerg if (Triple.isWindowsGNUEnvironment()) 210 1.1 joerg addMinGWDefines(Triple, Opts, Builder); 211 1.1 joerg else if (Triple.isKnownWindowsMSVCEnvironment() || 212 1.1 joerg (Triple.isWindowsItaniumEnvironment() && Opts.MSVCCompat)) 213 1.1 joerg addVisualCDefines(Opts, Builder); 214 1.1 joerg } 215 1.1 joerg 216 1.1 joerg } // namespace targets 217 1.1 joerg } // namespace clang 218