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 1080b57cec5SDimitry Andric #define KMP_ARCH_PPC64_ELFv1 0 1090b57cec5SDimitry Andric #define KMP_ARCH_PPC64_ELFv2 0 1101db9f3b2SDimitry Andric #define KMP_ARCH_PPC64_XCOFF 0 1111db9f3b2SDimitry Andric #define KMP_ARCH_PPC_XCOFF 0 1120b57cec5SDimitry Andric #define KMP_ARCH_MIPS 0 1130b57cec5SDimitry Andric #define KMP_ARCH_MIPS64 0 114489b1cf2SDimitry Andric #define KMP_ARCH_RISCV64 0 115bdd1243dSDimitry Andric #define KMP_ARCH_LOONGARCH64 0 1165f757f3fSDimitry Andric #define KMP_ARCH_VE 0 1175f757f3fSDimitry Andric #define KMP_ARCH_S390X 0 1180b57cec5SDimitry Andric 1190b57cec5SDimitry Andric #if KMP_OS_WINDOWS 1200b57cec5SDimitry Andric #if defined(_M_AMD64) || defined(__x86_64) 1210b57cec5SDimitry Andric #undef KMP_ARCH_X86_64 1220b57cec5SDimitry Andric #define KMP_ARCH_X86_64 1 123fe6060f1SDimitry Andric #elif defined(__aarch64__) || defined(_M_ARM64) 124fe6060f1SDimitry Andric #undef KMP_ARCH_AARCH64 125fe6060f1SDimitry Andric #define KMP_ARCH_AARCH64 1 126bdd1243dSDimitry Andric #elif defined(__arm__) || defined(_M_ARM) 127bdd1243dSDimitry Andric #undef KMP_ARCH_ARMV7 128bdd1243dSDimitry Andric #define KMP_ARCH_ARMV7 1 1290b57cec5SDimitry Andric #else 1300b57cec5SDimitry Andric #undef KMP_ARCH_X86 1310b57cec5SDimitry Andric #define KMP_ARCH_X86 1 1320b57cec5SDimitry Andric #endif 1330b57cec5SDimitry Andric #endif 1340b57cec5SDimitry Andric 1350b57cec5SDimitry Andric #if KMP_OS_UNIX 1360b57cec5SDimitry Andric #if defined __x86_64 1370b57cec5SDimitry Andric #undef KMP_ARCH_X86_64 1380b57cec5SDimitry Andric #define KMP_ARCH_X86_64 1 1390b57cec5SDimitry Andric #elif defined __i386 1400b57cec5SDimitry Andric #undef KMP_ARCH_X86 1410b57cec5SDimitry Andric #define KMP_ARCH_X86 1 1420b57cec5SDimitry Andric #elif defined __powerpc64__ 1431db9f3b2SDimitry Andric #if defined(_CALL_ELF) 1441db9f3b2SDimitry Andric #if _CALL_ELF == 2 1450b57cec5SDimitry Andric #undef KMP_ARCH_PPC64_ELFv2 1460b57cec5SDimitry Andric #define KMP_ARCH_PPC64_ELFv2 1 1470b57cec5SDimitry Andric #else 1480b57cec5SDimitry Andric #undef KMP_ARCH_PPC64_ELFv1 1490b57cec5SDimitry Andric #define KMP_ARCH_PPC64_ELFv1 1 1500b57cec5SDimitry Andric #endif 1511db9f3b2SDimitry Andric #elif defined KMP_OS_AIX 1521db9f3b2SDimitry Andric #undef KMP_ARCH_PPC64_XCOFF 1531db9f3b2SDimitry Andric #define KMP_ARCH_PPC64_XCOFF 1 1541db9f3b2SDimitry Andric #endif 1551db9f3b2SDimitry Andric #elif defined(__powerpc__) && defined(KMP_OS_AIX) 1561db9f3b2SDimitry Andric #undef KMP_ARCH_PPC_XCOFF 1571db9f3b2SDimitry Andric #define KMP_ARCH_PPC_XCOFF 1 1581db9f3b2SDimitry Andric #undef KMP_ARCH_PPC 1591db9f3b2SDimitry Andric #define KMP_ARCH_PPC 1 1600b57cec5SDimitry Andric #elif defined __aarch64__ 1610b57cec5SDimitry Andric #undef KMP_ARCH_AARCH64 1620b57cec5SDimitry Andric #define KMP_ARCH_AARCH64 1 1630b57cec5SDimitry Andric #elif defined __mips__ 1640b57cec5SDimitry Andric #if defined __mips64 1650b57cec5SDimitry Andric #undef KMP_ARCH_MIPS64 1660b57cec5SDimitry Andric #define KMP_ARCH_MIPS64 1 1670b57cec5SDimitry Andric #else 1680b57cec5SDimitry Andric #undef KMP_ARCH_MIPS 1690b57cec5SDimitry Andric #define KMP_ARCH_MIPS 1 1700b57cec5SDimitry Andric #endif 171489b1cf2SDimitry Andric #elif defined __riscv && __riscv_xlen == 64 172489b1cf2SDimitry Andric #undef KMP_ARCH_RISCV64 173489b1cf2SDimitry Andric #define KMP_ARCH_RISCV64 1 174bdd1243dSDimitry Andric #elif defined __loongarch__ && __loongarch_grlen == 64 175bdd1243dSDimitry Andric #undef KMP_ARCH_LOONGARCH64 176bdd1243dSDimitry Andric #define KMP_ARCH_LOONGARCH64 1 1775f757f3fSDimitry Andric #elif defined __ve__ 1785f757f3fSDimitry Andric #undef KMP_ARCH_VE 1795f757f3fSDimitry Andric #define KMP_ARCH_VE 1 1805f757f3fSDimitry Andric #elif defined __s390x__ 1815f757f3fSDimitry Andric #undef KMP_ARCH_S390X 1825f757f3fSDimitry Andric #define KMP_ARCH_S390X 1 1830b57cec5SDimitry Andric #endif 1840b57cec5SDimitry Andric #endif 1850b57cec5SDimitry Andric 1860b57cec5SDimitry Andric #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7R__) || \ 187480093f4SDimitry Andric defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7VE__) 1880b57cec5SDimitry Andric #define KMP_ARCH_ARMV7 1 1890b57cec5SDimitry Andric #endif 1900b57cec5SDimitry Andric 1910b57cec5SDimitry Andric #if defined(KMP_ARCH_ARMV7) || defined(__ARM_ARCH_6__) || \ 1920b57cec5SDimitry Andric defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || \ 1930b57cec5SDimitry Andric defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6T2__) || \ 1940b57cec5SDimitry Andric defined(__ARM_ARCH_6ZK__) 1950b57cec5SDimitry Andric #define KMP_ARCH_ARMV6 1 1960b57cec5SDimitry Andric #endif 1970b57cec5SDimitry Andric 1980b57cec5SDimitry Andric #if defined(KMP_ARCH_ARMV6) || defined(__ARM_ARCH_5T__) || \ 1990b57cec5SDimitry Andric defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || \ 2000b57cec5SDimitry Andric defined(__ARM_ARCH_5TEJ__) 2010b57cec5SDimitry Andric #define KMP_ARCH_ARMV5 1 2020b57cec5SDimitry Andric #endif 2030b57cec5SDimitry Andric 2040b57cec5SDimitry Andric #if defined(KMP_ARCH_ARMV5) || defined(__ARM_ARCH_4__) || \ 2050b57cec5SDimitry Andric defined(__ARM_ARCH_4T__) 2060b57cec5SDimitry Andric #define KMP_ARCH_ARMV4 1 2070b57cec5SDimitry Andric #endif 2080b57cec5SDimitry Andric 2090b57cec5SDimitry Andric #if defined(KMP_ARCH_ARMV4) || defined(__ARM_ARCH_3__) || \ 2100b57cec5SDimitry Andric defined(__ARM_ARCH_3M__) 2110b57cec5SDimitry Andric #define KMP_ARCH_ARMV3 1 2120b57cec5SDimitry Andric #endif 2130b57cec5SDimitry Andric 2140b57cec5SDimitry Andric #if defined(KMP_ARCH_ARMV3) || defined(__ARM_ARCH_2__) 2150b57cec5SDimitry Andric #define KMP_ARCH_ARMV2 1 2160b57cec5SDimitry Andric #endif 2170b57cec5SDimitry Andric 2180b57cec5SDimitry Andric #if defined(KMP_ARCH_ARMV2) 2190b57cec5SDimitry Andric #define KMP_ARCH_ARM 1 2200b57cec5SDimitry Andric #endif 2210b57cec5SDimitry Andric 2225f757f3fSDimitry Andric #if defined(__wasm32__) 2235f757f3fSDimitry Andric #define KMP_ARCH_WASM 1 2245f757f3fSDimitry Andric #endif 2255f757f3fSDimitry Andric 2261db9f3b2SDimitry Andric #define KMP_ARCH_PPC64 \ 2271db9f3b2SDimitry Andric (KMP_ARCH_PPC64_ELFv2 || KMP_ARCH_PPC64_ELFv1 || KMP_ARCH_PPC64_XCOFF) 2281db9f3b2SDimitry Andric 2290b57cec5SDimitry Andric #if defined(__MIC__) || defined(__MIC2__) 2300b57cec5SDimitry Andric #define KMP_MIC 1 2310b57cec5SDimitry Andric #if __MIC2__ || __KNC__ 2320b57cec5SDimitry Andric #define KMP_MIC1 0 2330b57cec5SDimitry Andric #define KMP_MIC2 1 2340b57cec5SDimitry Andric #else 2350b57cec5SDimitry Andric #define KMP_MIC1 1 2360b57cec5SDimitry Andric #define KMP_MIC2 0 2370b57cec5SDimitry Andric #endif 2380b57cec5SDimitry Andric #else 2390b57cec5SDimitry Andric #define KMP_MIC 0 2400b57cec5SDimitry Andric #define KMP_MIC1 0 2410b57cec5SDimitry Andric #define KMP_MIC2 0 2420b57cec5SDimitry Andric #endif 2430b57cec5SDimitry Andric 2440b57cec5SDimitry Andric /* Specify 32 bit architectures here */ 2455f757f3fSDimitry Andric #define KMP_32_BIT_ARCH \ 2461db9f3b2SDimitry Andric (KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS || KMP_ARCH_WASM || \ 2471db9f3b2SDimitry Andric KMP_ARCH_PPC) 2480b57cec5SDimitry Andric 2490b57cec5SDimitry Andric // Platforms which support Intel(R) Many Integrated Core Architecture 2500b57cec5SDimitry Andric #define KMP_MIC_SUPPORTED \ 2510b57cec5SDimitry Andric ((KMP_ARCH_X86 || KMP_ARCH_X86_64) && (KMP_OS_LINUX || KMP_OS_WINDOWS)) 2520b57cec5SDimitry Andric 2530b57cec5SDimitry Andric // TODO: Fixme - This is clever, but really fugly 254fe6060f1SDimitry Andric #if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM + KMP_ARCH_PPC64 + \ 255fe6060f1SDimitry Andric KMP_ARCH_AARCH64 + KMP_ARCH_MIPS + KMP_ARCH_MIPS64 + \ 2565f757f3fSDimitry Andric KMP_ARCH_RISCV64 + KMP_ARCH_LOONGARCH64 + KMP_ARCH_VE + \ 2571db9f3b2SDimitry Andric KMP_ARCH_S390X + KMP_ARCH_WASM + KMP_ARCH_PPC) 2580b57cec5SDimitry Andric #error Unknown or unsupported architecture 2590b57cec5SDimitry Andric #endif 2600b57cec5SDimitry Andric 2610b57cec5SDimitry Andric #endif // KMP_PLATFORM_H 262