1 /* 2 * kmp_platform.h -- header for determining operating system and architecture 3 */ 4 5 //===----------------------------------------------------------------------===// 6 // 7 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 8 // See https://llvm.org/LICENSE.txt for license information. 9 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef KMP_PLATFORM_H 14 #define KMP_PLATFORM_H 15 16 /* ---------------------- Operating system recognition ------------------- */ 17 18 #define KMP_OS_LINUX 0 19 #define KMP_OS_DRAGONFLY 0 20 #define KMP_OS_FREEBSD 0 21 #define KMP_OS_NETBSD 0 22 #define KMP_OS_OPENBSD 0 23 #define KMP_OS_DARWIN 0 24 #define KMP_OS_WINDOWS 0 25 #define KMP_OS_HAIKU 0 26 #define KMP_OS_HURD 0 27 #define KMP_OS_SOLARIS 0 28 #define KMP_OS_WASI 0 29 #define KMP_OS_EMSCRIPTEN 0 30 #define KMP_OS_AIX 0 31 #define KMP_OS_UNIX 0 /* disjunction of KMP_OS_LINUX, KMP_OS_DARWIN etc. */ 32 33 #ifdef _WIN32 34 #undef KMP_OS_WINDOWS 35 #define KMP_OS_WINDOWS 1 36 #endif 37 38 #if (defined __APPLE__ && defined __MACH__) 39 #undef KMP_OS_DARWIN 40 #define KMP_OS_DARWIN 1 41 #endif 42 43 // in some ppc64 linux installations, only the second condition is met 44 #if (defined __linux) 45 #undef KMP_OS_LINUX 46 #define KMP_OS_LINUX 1 47 #elif (defined __linux__) 48 #undef KMP_OS_LINUX 49 #define KMP_OS_LINUX 1 50 #elif defined(__EMSCRIPTEN__) 51 #undef KMP_OS_LINUX 52 #undef KMP_OS_EMSCRIPTEN 53 #define KMP_OS_LINUX 1 54 #define KMP_OS_EMSCRIPTEN 1 55 #else 56 #endif 57 58 #if (defined __DragonFly__) 59 #undef KMP_OS_DRAGONFLY 60 #define KMP_OS_DRAGONFLY 1 61 #endif 62 63 #if (defined __FreeBSD__) 64 #undef KMP_OS_FREEBSD 65 #define KMP_OS_FREEBSD 1 66 #endif 67 68 #if (defined __NetBSD__) 69 #undef KMP_OS_NETBSD 70 #define KMP_OS_NETBSD 1 71 #endif 72 73 #if (defined __OpenBSD__) 74 #undef KMP_OS_OPENBSD 75 #define KMP_OS_OPENBSD 1 76 #endif 77 78 #if (defined __HAIKU__) 79 #undef KMP_OS_HAIKU 80 #define KMP_OS_HAIKU 1 81 #endif 82 83 #if (defined __GNU__) 84 #undef KMP_OS_HURD 85 #define KMP_OS_HURD 1 86 #endif 87 88 #if (defined __sun__ && defined __svr4__) 89 #undef KMP_OS_SOLARIS 90 #define KMP_OS_SOLARIS 1 91 #endif 92 93 #if (defined __wasi__) 94 #undef KMP_OS_WASI 95 #define KMP_OS_WASI 1 96 #endif 97 98 #if (defined _AIX) 99 #undef KMP_OS_AIX 100 #define KMP_OS_AIX 1 101 #endif 102 103 #if (1 != KMP_OS_LINUX + KMP_OS_DRAGONFLY + KMP_OS_FREEBSD + KMP_OS_NETBSD + \ 104 KMP_OS_OPENBSD + KMP_OS_DARWIN + KMP_OS_WINDOWS + KMP_OS_HAIKU + \ 105 KMP_OS_HURD + KMP_OS_SOLARIS + KMP_OS_WASI + KMP_OS_AIX) 106 #error Unknown OS 107 #endif 108 109 #if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \ 110 KMP_OS_OPENBSD || KMP_OS_DARWIN || KMP_OS_HAIKU || KMP_OS_HURD || \ 111 KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX 112 #undef KMP_OS_UNIX 113 #define KMP_OS_UNIX 1 114 #endif 115 116 /* ---------------------- Architecture recognition ------------------- */ 117 118 #define KMP_ARCH_X86 0 119 #define KMP_ARCH_X86_64 0 120 #define KMP_ARCH_AARCH64 0 121 #define KMP_ARCH_AARCH64_32 0 122 #define KMP_ARCH_PPC64_ELFv1 0 123 #define KMP_ARCH_PPC64_ELFv2 0 124 #define KMP_ARCH_PPC64_XCOFF 0 125 #define KMP_ARCH_PPC_XCOFF 0 126 #define KMP_ARCH_PPC 0 127 #define KMP_ARCH_MIPS 0 128 #define KMP_ARCH_MIPS64 0 129 #define KMP_ARCH_RISCV64 0 130 #define KMP_ARCH_LOONGARCH64 0 131 #define KMP_ARCH_VE 0 132 #define KMP_ARCH_S390X 0 133 #define KMP_ARCH_SPARC 0 134 135 #if KMP_OS_WINDOWS 136 #if defined(_M_AMD64) || defined(__x86_64) 137 #undef KMP_ARCH_X86_64 138 #define KMP_ARCH_X86_64 1 139 #elif defined(__aarch64__) || defined(_M_ARM64) 140 #undef KMP_ARCH_AARCH64 141 #define KMP_ARCH_AARCH64 1 142 #elif defined(__arm__) || defined(_M_ARM) 143 #undef KMP_ARCH_ARMV7 144 #define KMP_ARCH_ARMV7 1 145 #else 146 #undef KMP_ARCH_X86 147 #define KMP_ARCH_X86 1 148 #endif 149 #endif 150 151 #if KMP_OS_UNIX 152 #if defined __x86_64 153 #undef KMP_ARCH_X86_64 154 #define KMP_ARCH_X86_64 1 155 #elif defined __i386 156 #undef KMP_ARCH_X86 157 #define KMP_ARCH_X86 1 158 #elif defined __powerpc64__ 159 #if defined(_CALL_ELF) 160 #if _CALL_ELF == 2 161 #undef KMP_ARCH_PPC64_ELFv2 162 #define KMP_ARCH_PPC64_ELFv2 1 163 #else 164 #undef KMP_ARCH_PPC64_ELFv1 165 #define KMP_ARCH_PPC64_ELFv1 1 166 #endif 167 #elif KMP_OS_AIX 168 #undef KMP_ARCH_PPC64_XCOFF 169 #define KMP_ARCH_PPC64_XCOFF 1 170 #endif 171 #elif defined(__powerpc__) && KMP_OS_AIX 172 #undef KMP_ARCH_PPC_XCOFF 173 #define KMP_ARCH_PPC_XCOFF 1 174 #undef KMP_ARCH_PPC 175 #define KMP_ARCH_PPC 1 176 #elif defined(__powerpc__) && !defined(__LP64__) 177 #undef KMP_ARCH_PPC 178 #define KMP_ARCH_PPC 1 179 #elif defined __ARM64_ARCH_8_32__ 180 #undef KMP_ARCH_AARCH64_32 181 #define KMP_ARCH_AARCH64_32 1 182 #elif defined __aarch64__ 183 #undef KMP_ARCH_AARCH64 184 #define KMP_ARCH_AARCH64 1 185 #elif defined __mips__ 186 #if defined __mips64 187 #undef KMP_ARCH_MIPS64 188 #define KMP_ARCH_MIPS64 1 189 #else 190 #undef KMP_ARCH_MIPS 191 #define KMP_ARCH_MIPS 1 192 #endif 193 #elif defined __riscv && __riscv_xlen == 64 194 #undef KMP_ARCH_RISCV64 195 #define KMP_ARCH_RISCV64 1 196 #elif defined __loongarch__ && __loongarch_grlen == 64 197 #undef KMP_ARCH_LOONGARCH64 198 #define KMP_ARCH_LOONGARCH64 1 199 #elif defined __ve__ 200 #undef KMP_ARCH_VE 201 #define KMP_ARCH_VE 1 202 #elif defined __s390x__ 203 #undef KMP_ARCH_S390X 204 #define KMP_ARCH_S390X 1 205 #elif defined __sparc || defined __sparc__ 206 #undef KMP_ARCH_SPARC 207 #define KMP_ARCH_SPARC 1 208 #endif 209 #endif 210 211 #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7R__) || \ 212 defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7VE__) 213 #define KMP_ARCH_ARMV7 1 214 #endif 215 216 #if defined(KMP_ARCH_ARMV7) || defined(__ARM_ARCH_6__) || \ 217 defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || \ 218 defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6T2__) || \ 219 defined(__ARM_ARCH_6ZK__) 220 #define KMP_ARCH_ARMV6 1 221 #endif 222 223 #if defined(KMP_ARCH_ARMV6) || defined(__ARM_ARCH_5T__) || \ 224 defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || \ 225 defined(__ARM_ARCH_5TEJ__) 226 #define KMP_ARCH_ARMV5 1 227 #endif 228 229 #if defined(KMP_ARCH_ARMV5) || defined(__ARM_ARCH_4__) || \ 230 defined(__ARM_ARCH_4T__) 231 #define KMP_ARCH_ARMV4 1 232 #endif 233 234 #if defined(KMP_ARCH_ARMV4) || defined(__ARM_ARCH_3__) || \ 235 defined(__ARM_ARCH_3M__) 236 #define KMP_ARCH_ARMV3 1 237 #endif 238 239 #if defined(KMP_ARCH_ARMV3) || defined(__ARM_ARCH_2__) 240 #define KMP_ARCH_ARMV2 1 241 #endif 242 243 #if defined(KMP_ARCH_ARMV2) 244 #define KMP_ARCH_ARM 1 245 #endif 246 247 #if defined(__wasm32__) 248 #define KMP_ARCH_WASM 1 249 #endif 250 251 #define KMP_ARCH_PPC64 \ 252 (KMP_ARCH_PPC64_ELFv2 || KMP_ARCH_PPC64_ELFv1 || KMP_ARCH_PPC64_XCOFF) 253 254 #if defined(KMP_ARCH_SPARC) 255 #undef KMP_ARCH_SPARC32 256 #undef KMP_ARCH_SPARC64 257 #if defined(__sparcv9) || defined(__sparc64__) 258 #define KMP_ARCH_SPARC64 1 259 #endif 260 #if defined(__sparc) && !defined(__sparcv9) && !defined(__sparc64__) 261 #define KMP_ARCH_SPARC32 1 262 #endif 263 #endif 264 265 #if defined(__MIC__) || defined(__MIC2__) 266 #define KMP_MIC 1 267 #if __MIC2__ || __KNC__ 268 #define KMP_MIC1 0 269 #define KMP_MIC2 1 270 #else 271 #define KMP_MIC1 1 272 #define KMP_MIC2 0 273 #endif 274 #else 275 #define KMP_MIC 0 276 #define KMP_MIC1 0 277 #define KMP_MIC2 0 278 #endif 279 280 /* Specify 32 bit architectures here */ 281 #define KMP_32_BIT_ARCH \ 282 (KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS || KMP_ARCH_WASM || \ 283 KMP_ARCH_PPC || KMP_ARCH_AARCH64_32 || KMP_ARCH_SPARC32) 284 285 // Platforms which support Intel(R) Many Integrated Core Architecture 286 #define KMP_MIC_SUPPORTED \ 287 ((KMP_ARCH_X86 || KMP_ARCH_X86_64) && (KMP_OS_LINUX || KMP_OS_WINDOWS)) 288 289 // TODO: Fixme - This is clever, but really fugly 290 #if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM + KMP_ARCH_PPC64 + \ 291 KMP_ARCH_AARCH64 + KMP_ARCH_MIPS + KMP_ARCH_MIPS64 + \ 292 KMP_ARCH_RISCV64 + KMP_ARCH_LOONGARCH64 + KMP_ARCH_VE + \ 293 KMP_ARCH_S390X + KMP_ARCH_WASM + KMP_ARCH_PPC + \ 294 KMP_ARCH_AARCH64_32 + KMP_ARCH_SPARC) 295 #error Unknown or unsupported architecture 296 #endif 297 298 #endif // KMP_PLATFORM_H 299