10b57cec5SDimitry Andric /* 20b57cec5SDimitry Andric * kmp_platform.h -- header for determining operating system and architecture 30b57cec5SDimitry Andric */ 40b57cec5SDimitry Andric 50b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 80b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 90b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #ifndef KMP_PLATFORM_H 140b57cec5SDimitry Andric #define KMP_PLATFORM_H 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric /* ---------------------- Operating system recognition ------------------- */ 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric #define KMP_OS_LINUX 0 190b57cec5SDimitry Andric #define KMP_OS_DRAGONFLY 0 200b57cec5SDimitry Andric #define KMP_OS_FREEBSD 0 210b57cec5SDimitry Andric #define KMP_OS_NETBSD 0 220b57cec5SDimitry Andric #define KMP_OS_OPENBSD 0 230b57cec5SDimitry Andric #define KMP_OS_DARWIN 0 240b57cec5SDimitry Andric #define KMP_OS_WINDOWS 0 250b57cec5SDimitry Andric #define KMP_OS_HURD 0 265f757f3fSDimitry Andric #define KMP_OS_SOLARIS 0 275f757f3fSDimitry Andric #define KMP_OS_WASI 0 280b57cec5SDimitry Andric #define KMP_OS_UNIX 0 /* disjunction of KMP_OS_LINUX, KMP_OS_DARWIN etc. */ 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric #ifdef _WIN32 310b57cec5SDimitry Andric #undef KMP_OS_WINDOWS 320b57cec5SDimitry Andric #define KMP_OS_WINDOWS 1 330b57cec5SDimitry Andric #endif 340b57cec5SDimitry Andric 350b57cec5SDimitry Andric #if (defined __APPLE__ && defined __MACH__) 360b57cec5SDimitry Andric #undef KMP_OS_DARWIN 370b57cec5SDimitry Andric #define KMP_OS_DARWIN 1 380b57cec5SDimitry Andric #endif 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric // in some ppc64 linux installations, only the second condition is met 410b57cec5SDimitry Andric #if (defined __linux) 420b57cec5SDimitry Andric #undef KMP_OS_LINUX 430b57cec5SDimitry Andric #define KMP_OS_LINUX 1 440b57cec5SDimitry Andric #elif (defined __linux__) 450b57cec5SDimitry Andric #undef KMP_OS_LINUX 460b57cec5SDimitry Andric #define KMP_OS_LINUX 1 470b57cec5SDimitry Andric #else 480b57cec5SDimitry Andric #endif 490b57cec5SDimitry Andric 500b57cec5SDimitry Andric #if (defined __DragonFly__) 510b57cec5SDimitry Andric #undef KMP_OS_DRAGONFLY 520b57cec5SDimitry Andric #define KMP_OS_DRAGONFLY 1 530b57cec5SDimitry Andric #endif 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric #if (defined __FreeBSD__) 560b57cec5SDimitry Andric #undef KMP_OS_FREEBSD 570b57cec5SDimitry Andric #define KMP_OS_FREEBSD 1 580b57cec5SDimitry Andric #endif 590b57cec5SDimitry Andric 600b57cec5SDimitry Andric #if (defined __NetBSD__) 610b57cec5SDimitry Andric #undef KMP_OS_NETBSD 620b57cec5SDimitry Andric #define KMP_OS_NETBSD 1 630b57cec5SDimitry Andric #endif 640b57cec5SDimitry Andric 650b57cec5SDimitry Andric #if (defined __OpenBSD__) 660b57cec5SDimitry Andric #undef KMP_OS_OPENBSD 670b57cec5SDimitry Andric #define KMP_OS_OPENBSD 1 680b57cec5SDimitry Andric #endif 690b57cec5SDimitry Andric 700b57cec5SDimitry Andric #if (defined __GNU__) 710b57cec5SDimitry Andric #undef KMP_OS_HURD 720b57cec5SDimitry Andric #define KMP_OS_HURD 1 730b57cec5SDimitry Andric #endif 740b57cec5SDimitry Andric 755f757f3fSDimitry Andric #if (defined __sun__ && defined __svr4__) 765f757f3fSDimitry Andric #undef KMP_OS_SOLARIS 775f757f3fSDimitry Andric #define KMP_OS_SOLARIS 1 785f757f3fSDimitry Andric #endif 795f757f3fSDimitry Andric 805f757f3fSDimitry Andric #if (defined __wasi__) || (defined __EMSCRIPTEN__) 815f757f3fSDimitry Andric #undef KMP_OS_WASI 825f757f3fSDimitry Andric #define KMP_OS_WASI 1 835f757f3fSDimitry Andric #endif 845f757f3fSDimitry Andric 851db9f3b2SDimitry Andric #if (defined _AIX) 861db9f3b2SDimitry Andric #undef KMP_OS_AIX 871db9f3b2SDimitry Andric #define KMP_OS_AIX 1 881db9f3b2SDimitry Andric #endif 891db9f3b2SDimitry Andric 90fe6060f1SDimitry Andric #if (1 != KMP_OS_LINUX + KMP_OS_DRAGONFLY + KMP_OS_FREEBSD + KMP_OS_NETBSD + \ 915f757f3fSDimitry Andric KMP_OS_OPENBSD + KMP_OS_DARWIN + KMP_OS_WINDOWS + KMP_OS_HURD + \ 921db9f3b2SDimitry Andric KMP_OS_SOLARIS + KMP_OS_WASI + KMP_OS_AIX) 930b57cec5SDimitry Andric #error Unknown OS 940b57cec5SDimitry Andric #endif 950b57cec5SDimitry Andric 960b57cec5SDimitry Andric #if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \ 975f757f3fSDimitry Andric KMP_OS_OPENBSD || KMP_OS_DARWIN || KMP_OS_HURD || KMP_OS_SOLARIS || \ 981db9f3b2SDimitry Andric KMP_OS_WASI || KMP_OS_AIX 990b57cec5SDimitry Andric #undef KMP_OS_UNIX 1000b57cec5SDimitry Andric #define KMP_OS_UNIX 1 1010b57cec5SDimitry Andric #endif 1020b57cec5SDimitry Andric 1030b57cec5SDimitry Andric /* ---------------------- Architecture recognition ------------------- */ 1040b57cec5SDimitry Andric 1050b57cec5SDimitry Andric #define KMP_ARCH_X86 0 1060b57cec5SDimitry Andric #define KMP_ARCH_X86_64 0 1070b57cec5SDimitry Andric #define KMP_ARCH_AARCH64 0 108*0fca6ea1SDimitry Andric #define KMP_ARCH_AARCH64_32 0 1090b57cec5SDimitry Andric #define KMP_ARCH_PPC64_ELFv1 0 1100b57cec5SDimitry Andric #define KMP_ARCH_PPC64_ELFv2 0 1111db9f3b2SDimitry Andric #define KMP_ARCH_PPC64_XCOFF 0 1121db9f3b2SDimitry Andric #define KMP_ARCH_PPC_XCOFF 0 1130b57cec5SDimitry Andric #define KMP_ARCH_MIPS 0 1140b57cec5SDimitry Andric #define KMP_ARCH_MIPS64 0 115489b1cf2SDimitry Andric #define KMP_ARCH_RISCV64 0 116bdd1243dSDimitry Andric #define KMP_ARCH_LOONGARCH64 0 1175f757f3fSDimitry Andric #define KMP_ARCH_VE 0 1185f757f3fSDimitry Andric #define KMP_ARCH_S390X 0 1190b57cec5SDimitry Andric 1200b57cec5SDimitry Andric #if KMP_OS_WINDOWS 1210b57cec5SDimitry Andric #if defined(_M_AMD64) || defined(__x86_64) 1220b57cec5SDimitry Andric #undef KMP_ARCH_X86_64 1230b57cec5SDimitry Andric #define KMP_ARCH_X86_64 1 124fe6060f1SDimitry Andric #elif defined(__aarch64__) || defined(_M_ARM64) 125fe6060f1SDimitry Andric #undef KMP_ARCH_AARCH64 126fe6060f1SDimitry Andric #define KMP_ARCH_AARCH64 1 127bdd1243dSDimitry Andric #elif defined(__arm__) || defined(_M_ARM) 128bdd1243dSDimitry Andric #undef KMP_ARCH_ARMV7 129bdd1243dSDimitry Andric #define KMP_ARCH_ARMV7 1 1300b57cec5SDimitry Andric #else 1310b57cec5SDimitry Andric #undef KMP_ARCH_X86 1320b57cec5SDimitry Andric #define KMP_ARCH_X86 1 1330b57cec5SDimitry Andric #endif 1340b57cec5SDimitry Andric #endif 1350b57cec5SDimitry Andric 1360b57cec5SDimitry Andric #if KMP_OS_UNIX 1370b57cec5SDimitry Andric #if defined __x86_64 1380b57cec5SDimitry Andric #undef KMP_ARCH_X86_64 1390b57cec5SDimitry Andric #define KMP_ARCH_X86_64 1 1400b57cec5SDimitry Andric #elif defined __i386 1410b57cec5SDimitry Andric #undef KMP_ARCH_X86 1420b57cec5SDimitry Andric #define KMP_ARCH_X86 1 1430b57cec5SDimitry Andric #elif defined __powerpc64__ 1441db9f3b2SDimitry Andric #if defined(_CALL_ELF) 1451db9f3b2SDimitry Andric #if _CALL_ELF == 2 1460b57cec5SDimitry Andric #undef KMP_ARCH_PPC64_ELFv2 1470b57cec5SDimitry Andric #define KMP_ARCH_PPC64_ELFv2 1 1480b57cec5SDimitry Andric #else 1490b57cec5SDimitry Andric #undef KMP_ARCH_PPC64_ELFv1 1500b57cec5SDimitry Andric #define KMP_ARCH_PPC64_ELFv1 1 1510b57cec5SDimitry Andric #endif 1521db9f3b2SDimitry Andric #elif defined KMP_OS_AIX 1531db9f3b2SDimitry Andric #undef KMP_ARCH_PPC64_XCOFF 1541db9f3b2SDimitry Andric #define KMP_ARCH_PPC64_XCOFF 1 1551db9f3b2SDimitry Andric #endif 1561db9f3b2SDimitry Andric #elif defined(__powerpc__) && defined(KMP_OS_AIX) 1571db9f3b2SDimitry Andric #undef KMP_ARCH_PPC_XCOFF 1581db9f3b2SDimitry Andric #define KMP_ARCH_PPC_XCOFF 1 1591db9f3b2SDimitry Andric #undef KMP_ARCH_PPC 1601db9f3b2SDimitry Andric #define KMP_ARCH_PPC 1 161*0fca6ea1SDimitry Andric #elif defined __ARM64_ARCH_8_32__ 162*0fca6ea1SDimitry Andric #undef KMP_ARCH_AARCH64_32 163*0fca6ea1SDimitry Andric #define KMP_ARCH_AARCH64_32 1 1640b57cec5SDimitry Andric #elif defined __aarch64__ 1650b57cec5SDimitry Andric #undef KMP_ARCH_AARCH64 1660b57cec5SDimitry Andric #define KMP_ARCH_AARCH64 1 1670b57cec5SDimitry Andric #elif defined __mips__ 1680b57cec5SDimitry Andric #if defined __mips64 1690b57cec5SDimitry Andric #undef KMP_ARCH_MIPS64 1700b57cec5SDimitry Andric #define KMP_ARCH_MIPS64 1 1710b57cec5SDimitry Andric #else 1720b57cec5SDimitry Andric #undef KMP_ARCH_MIPS 1730b57cec5SDimitry Andric #define KMP_ARCH_MIPS 1 1740b57cec5SDimitry Andric #endif 175489b1cf2SDimitry Andric #elif defined __riscv && __riscv_xlen == 64 176489b1cf2SDimitry Andric #undef KMP_ARCH_RISCV64 177489b1cf2SDimitry Andric #define KMP_ARCH_RISCV64 1 178bdd1243dSDimitry Andric #elif defined __loongarch__ && __loongarch_grlen == 64 179bdd1243dSDimitry Andric #undef KMP_ARCH_LOONGARCH64 180bdd1243dSDimitry Andric #define KMP_ARCH_LOONGARCH64 1 1815f757f3fSDimitry Andric #elif defined __ve__ 1825f757f3fSDimitry Andric #undef KMP_ARCH_VE 1835f757f3fSDimitry Andric #define KMP_ARCH_VE 1 1845f757f3fSDimitry Andric #elif defined __s390x__ 1855f757f3fSDimitry Andric #undef KMP_ARCH_S390X 1865f757f3fSDimitry Andric #define KMP_ARCH_S390X 1 1870b57cec5SDimitry Andric #endif 1880b57cec5SDimitry Andric #endif 1890b57cec5SDimitry Andric 1900b57cec5SDimitry Andric #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7R__) || \ 191480093f4SDimitry Andric defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7VE__) 1920b57cec5SDimitry Andric #define KMP_ARCH_ARMV7 1 1930b57cec5SDimitry Andric #endif 1940b57cec5SDimitry Andric 1950b57cec5SDimitry Andric #if defined(KMP_ARCH_ARMV7) || defined(__ARM_ARCH_6__) || \ 1960b57cec5SDimitry Andric defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || \ 1970b57cec5SDimitry Andric defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6T2__) || \ 1980b57cec5SDimitry Andric defined(__ARM_ARCH_6ZK__) 1990b57cec5SDimitry Andric #define KMP_ARCH_ARMV6 1 2000b57cec5SDimitry Andric #endif 2010b57cec5SDimitry Andric 2020b57cec5SDimitry Andric #if defined(KMP_ARCH_ARMV6) || defined(__ARM_ARCH_5T__) || \ 2030b57cec5SDimitry Andric defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || \ 2040b57cec5SDimitry Andric defined(__ARM_ARCH_5TEJ__) 2050b57cec5SDimitry Andric #define KMP_ARCH_ARMV5 1 2060b57cec5SDimitry Andric #endif 2070b57cec5SDimitry Andric 2080b57cec5SDimitry Andric #if defined(KMP_ARCH_ARMV5) || defined(__ARM_ARCH_4__) || \ 2090b57cec5SDimitry Andric defined(__ARM_ARCH_4T__) 2100b57cec5SDimitry Andric #define KMP_ARCH_ARMV4 1 2110b57cec5SDimitry Andric #endif 2120b57cec5SDimitry Andric 2130b57cec5SDimitry Andric #if defined(KMP_ARCH_ARMV4) || defined(__ARM_ARCH_3__) || \ 2140b57cec5SDimitry Andric defined(__ARM_ARCH_3M__) 2150b57cec5SDimitry Andric #define KMP_ARCH_ARMV3 1 2160b57cec5SDimitry Andric #endif 2170b57cec5SDimitry Andric 2180b57cec5SDimitry Andric #if defined(KMP_ARCH_ARMV3) || defined(__ARM_ARCH_2__) 2190b57cec5SDimitry Andric #define KMP_ARCH_ARMV2 1 2200b57cec5SDimitry Andric #endif 2210b57cec5SDimitry Andric 2220b57cec5SDimitry Andric #if defined(KMP_ARCH_ARMV2) 2230b57cec5SDimitry Andric #define KMP_ARCH_ARM 1 2240b57cec5SDimitry Andric #endif 2250b57cec5SDimitry Andric 2265f757f3fSDimitry Andric #if defined(__wasm32__) 2275f757f3fSDimitry Andric #define KMP_ARCH_WASM 1 2285f757f3fSDimitry Andric #endif 2295f757f3fSDimitry Andric 2301db9f3b2SDimitry Andric #define KMP_ARCH_PPC64 \ 2311db9f3b2SDimitry Andric (KMP_ARCH_PPC64_ELFv2 || KMP_ARCH_PPC64_ELFv1 || KMP_ARCH_PPC64_XCOFF) 2321db9f3b2SDimitry Andric 2330b57cec5SDimitry Andric #if defined(__MIC__) || defined(__MIC2__) 2340b57cec5SDimitry Andric #define KMP_MIC 1 2350b57cec5SDimitry Andric #if __MIC2__ || __KNC__ 2360b57cec5SDimitry Andric #define KMP_MIC1 0 2370b57cec5SDimitry Andric #define KMP_MIC2 1 2380b57cec5SDimitry Andric #else 2390b57cec5SDimitry Andric #define KMP_MIC1 1 2400b57cec5SDimitry Andric #define KMP_MIC2 0 2410b57cec5SDimitry Andric #endif 2420b57cec5SDimitry Andric #else 2430b57cec5SDimitry Andric #define KMP_MIC 0 2440b57cec5SDimitry Andric #define KMP_MIC1 0 2450b57cec5SDimitry Andric #define KMP_MIC2 0 2460b57cec5SDimitry Andric #endif 2470b57cec5SDimitry Andric 2480b57cec5SDimitry Andric /* Specify 32 bit architectures here */ 2495f757f3fSDimitry Andric #define KMP_32_BIT_ARCH \ 2501db9f3b2SDimitry Andric (KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS || KMP_ARCH_WASM || \ 251*0fca6ea1SDimitry Andric KMP_ARCH_PPC || KMP_ARCH_AARCH64_32) 2520b57cec5SDimitry Andric 2530b57cec5SDimitry Andric // Platforms which support Intel(R) Many Integrated Core Architecture 2540b57cec5SDimitry Andric #define KMP_MIC_SUPPORTED \ 2550b57cec5SDimitry Andric ((KMP_ARCH_X86 || KMP_ARCH_X86_64) && (KMP_OS_LINUX || KMP_OS_WINDOWS)) 2560b57cec5SDimitry Andric 2570b57cec5SDimitry Andric // TODO: Fixme - This is clever, but really fugly 258fe6060f1SDimitry Andric #if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM + KMP_ARCH_PPC64 + \ 259fe6060f1SDimitry Andric KMP_ARCH_AARCH64 + KMP_ARCH_MIPS + KMP_ARCH_MIPS64 + \ 2605f757f3fSDimitry Andric KMP_ARCH_RISCV64 + KMP_ARCH_LOONGARCH64 + KMP_ARCH_VE + \ 261*0fca6ea1SDimitry Andric KMP_ARCH_S390X + KMP_ARCH_WASM + KMP_ARCH_PPC + \ 262*0fca6ea1SDimitry Andric KMP_ARCH_AARCH64_32) 2630b57cec5SDimitry Andric #error Unknown or unsupported architecture 2640b57cec5SDimitry Andric #endif 2650b57cec5SDimitry Andric 2660b57cec5SDimitry Andric #endif // KMP_PLATFORM_H 267