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