LLVM OpenMP* Runtime Library
Loading...
Searching...
No Matches
kmp_platform.h
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_HURD 0
26#define KMP_OS_SOLARIS 0
27#define KMP_OS_UNIX 0 /* disjunction of KMP_OS_LINUX, KMP_OS_DARWIN etc. */
28
29#ifdef _WIN32
30#undef KMP_OS_WINDOWS
31#define KMP_OS_WINDOWS 1
32#endif
33
34#if (defined __APPLE__ && defined __MACH__)
35#undef KMP_OS_DARWIN
36#define KMP_OS_DARWIN 1
37#endif
38
39// in some ppc64 linux installations, only the second condition is met
40#if (defined __linux)
41#undef KMP_OS_LINUX
42#define KMP_OS_LINUX 1
43#elif (defined __linux__)
44#undef KMP_OS_LINUX
45#define KMP_OS_LINUX 1
46#else
47#endif
48
49#if (defined __DragonFly__)
50#undef KMP_OS_DRAGONFLY
51#define KMP_OS_DRAGONFLY 1
52#endif
53
54#if (defined __FreeBSD__)
55#undef KMP_OS_FREEBSD
56#define KMP_OS_FREEBSD 1
57#endif
58
59#if (defined __NetBSD__)
60#undef KMP_OS_NETBSD
61#define KMP_OS_NETBSD 1
62#endif
63
64#if (defined __OpenBSD__)
65#undef KMP_OS_OPENBSD
66#define KMP_OS_OPENBSD 1
67#endif
68
69#if (defined __GNU__)
70#undef KMP_OS_HURD
71#define KMP_OS_HURD 1
72#endif
73
74#if (defined __sun__ && defined __svr4__)
75#undef KMP_OS_SOLARIS
76#define KMP_OS_SOLARIS 1
77#endif
78
79#if (1 != KMP_OS_LINUX + KMP_OS_DRAGONFLY + KMP_OS_FREEBSD + KMP_OS_NETBSD + \
80 KMP_OS_OPENBSD + KMP_OS_DARWIN + KMP_OS_WINDOWS + KMP_OS_HURD + \
81 KMP_OS_SOLARIS)
82#error Unknown OS
83#endif
84
85#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
86 KMP_OS_OPENBSD || KMP_OS_DARWIN || KMP_OS_HURD || KMP_OS_SOLARIS
87#undef KMP_OS_UNIX
88#define KMP_OS_UNIX 1
89#endif
90
91/* ---------------------- Architecture recognition ------------------- */
92
93#define KMP_ARCH_X86 0
94#define KMP_ARCH_X86_64 0
95#define KMP_ARCH_AARCH64 0
96#define KMP_ARCH_PPC64_ELFv1 0
97#define KMP_ARCH_PPC64_ELFv2 0
98#define KMP_ARCH_PPC64 (KMP_ARCH_PPC64_ELFv2 || KMP_ARCH_PPC64_ELFv1)
99#define KMP_ARCH_MIPS 0
100#define KMP_ARCH_MIPS64 0
101#define KMP_ARCH_RISCV64 0
102#define KMP_ARCH_LOONGARCH64 0
103#define KMP_ARCH_VE 0
104#define KMP_ARCH_S390X 0
105
106#if KMP_OS_WINDOWS
107#if defined(_M_AMD64) || defined(__x86_64)
108#undef KMP_ARCH_X86_64
109#define KMP_ARCH_X86_64 1
110#elif defined(__aarch64__) || defined(_M_ARM64)
111#undef KMP_ARCH_AARCH64
112#define KMP_ARCH_AARCH64 1
113#elif defined(__arm__) || defined(_M_ARM)
114#undef KMP_ARCH_ARMV7
115#define KMP_ARCH_ARMV7 1
116#else
117#undef KMP_ARCH_X86
118#define KMP_ARCH_X86 1
119#endif
120#endif
121
122#if KMP_OS_UNIX
123#if defined __x86_64
124#undef KMP_ARCH_X86_64
125#define KMP_ARCH_X86_64 1
126#elif defined __i386
127#undef KMP_ARCH_X86
128#define KMP_ARCH_X86 1
129#elif defined __powerpc64__
130#if defined(_CALL_ELF) && _CALL_ELF == 2
131#undef KMP_ARCH_PPC64_ELFv2
132#define KMP_ARCH_PPC64_ELFv2 1
133#else
134#undef KMP_ARCH_PPC64_ELFv1
135#define KMP_ARCH_PPC64_ELFv1 1
136#endif
137#elif defined __aarch64__
138#undef KMP_ARCH_AARCH64
139#define KMP_ARCH_AARCH64 1
140#elif defined __mips__
141#if defined __mips64
142#undef KMP_ARCH_MIPS64
143#define KMP_ARCH_MIPS64 1
144#else
145#undef KMP_ARCH_MIPS
146#define KMP_ARCH_MIPS 1
147#endif
148#elif defined __riscv && __riscv_xlen == 64
149#undef KMP_ARCH_RISCV64
150#define KMP_ARCH_RISCV64 1
151#elif defined __loongarch__ && __loongarch_grlen == 64
152#undef KMP_ARCH_LOONGARCH64
153#define KMP_ARCH_LOONGARCH64 1
154#elif defined __ve__
155#undef KMP_ARCH_VE
156#define KMP_ARCH_VE 1
157#elif defined __s390x__
158#undef KMP_ARCH_S390X
159#define KMP_ARCH_S390X 1
160#endif
161#endif
162
163#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7R__) || \
164 defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7VE__)
165#define KMP_ARCH_ARMV7 1
166#endif
167
168#if defined(KMP_ARCH_ARMV7) || defined(__ARM_ARCH_6__) || \
169 defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || \
170 defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6T2__) || \
171 defined(__ARM_ARCH_6ZK__)
172#define KMP_ARCH_ARMV6 1
173#endif
174
175#if defined(KMP_ARCH_ARMV6) || defined(__ARM_ARCH_5T__) || \
176 defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || \
177 defined(__ARM_ARCH_5TEJ__)
178#define KMP_ARCH_ARMV5 1
179#endif
180
181#if defined(KMP_ARCH_ARMV5) || defined(__ARM_ARCH_4__) || \
182 defined(__ARM_ARCH_4T__)
183#define KMP_ARCH_ARMV4 1
184#endif
185
186#if defined(KMP_ARCH_ARMV4) || defined(__ARM_ARCH_3__) || \
187 defined(__ARM_ARCH_3M__)
188#define KMP_ARCH_ARMV3 1
189#endif
190
191#if defined(KMP_ARCH_ARMV3) || defined(__ARM_ARCH_2__)
192#define KMP_ARCH_ARMV2 1
193#endif
194
195#if defined(KMP_ARCH_ARMV2)
196#define KMP_ARCH_ARM 1
197#endif
198
199#if defined(__MIC__) || defined(__MIC2__)
200#define KMP_MIC 1
201#if __MIC2__ || __KNC__
202#define KMP_MIC1 0
203#define KMP_MIC2 1
204#else
205#define KMP_MIC1 1
206#define KMP_MIC2 0
207#endif
208#else
209#define KMP_MIC 0
210#define KMP_MIC1 0
211#define KMP_MIC2 0
212#endif
213
214/* Specify 32 bit architectures here */
215#define KMP_32_BIT_ARCH (KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS)
216
217// Platforms which support Intel(R) Many Integrated Core Architecture
218#define KMP_MIC_SUPPORTED \
219 ((KMP_ARCH_X86 || KMP_ARCH_X86_64) && (KMP_OS_LINUX || KMP_OS_WINDOWS))
220
221// TODO: Fixme - This is clever, but really fugly
222#if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM + KMP_ARCH_PPC64 + \
223 KMP_ARCH_AARCH64 + KMP_ARCH_MIPS + KMP_ARCH_MIPS64 + \
224 KMP_ARCH_RISCV64 + KMP_ARCH_LOONGARCH64 + KMP_ARCH_VE + \
225 KMP_ARCH_S390X)
226#error Unknown or unsupported architecture
227#endif
228
229#endif // KMP_PLATFORM_H