LLVM OpenMP* Runtime Library
kmp_platform.h
1 /*
2  * kmp_platform.h -- header for determining operating system and architecture
3  */
4 
5 //===----------------------------------------------------------------------===//
6 //
7 // The LLVM Compiler Infrastructure
8 //
9 // This file is dual licensed under the MIT and the University of Illinois Open
10 // Source Licenses. See LICENSE.txt for details.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef KMP_PLATFORM_H
15 #define KMP_PLATFORM_H
16 
17 /* ---------------------- Operating system recognition ------------------- */
18 
19 #define KMP_OS_LINUX 0
20 #define KMP_OS_FREEBSD 0
21 #define KMP_OS_NETBSD 0
22 #define KMP_OS_DARWIN 0
23 #define KMP_OS_WINDOWS 0
24 #define KMP_OS_CNK 0
25 #define KMP_OS_HURD 0
26 #define KMP_OS_UNIX 0 /* disjunction of KMP_OS_LINUX, KMP_OS_DARWIN etc. */
27 
28 #ifdef _WIN32
29 #undef KMP_OS_WINDOWS
30 #define KMP_OS_WINDOWS 1
31 #endif
32 
33 #if (defined __APPLE__ && defined __MACH__)
34 #undef KMP_OS_DARWIN
35 #define KMP_OS_DARWIN 1
36 #endif
37 
38 // in some ppc64 linux installations, only the second condition is met
39 #if (defined __linux)
40 #undef KMP_OS_LINUX
41 #define KMP_OS_LINUX 1
42 #elif (defined __linux__)
43 #undef KMP_OS_LINUX
44 #define KMP_OS_LINUX 1
45 #else
46 #endif
47 
48 #if (defined __FreeBSD__)
49 #undef KMP_OS_FREEBSD
50 #define KMP_OS_FREEBSD 1
51 #endif
52 
53 #if (defined __NetBSD__)
54 #undef KMP_OS_NETBSD
55 #define KMP_OS_NETBSD 1
56 #endif
57 
58 #if (defined __bgq__)
59 #undef KMP_OS_CNK
60 #define KMP_OS_CNK 1
61 #endif
62 
63 #if (defined __GNU__)
64 #undef KMP_OS_HURD
65 #define KMP_OS_HURD 1
66 #endif
67 
68 #if (1 != \
69  KMP_OS_LINUX + KMP_OS_FREEBSD + KMP_OS_NETBSD + KMP_OS_DARWIN + \
70  KMP_OS_WINDOWS + KMP_OS_HURD)
71 #error Unknown OS
72 #endif
73 
74 #if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DARWIN || KMP_OS_HURD
75 #undef KMP_OS_UNIX
76 #define KMP_OS_UNIX 1
77 #endif
78 
79 /* ---------------------- Architecture recognition ------------------- */
80 
81 #define KMP_ARCH_X86 0
82 #define KMP_ARCH_X86_64 0
83 #define KMP_ARCH_AARCH64 0
84 #define KMP_ARCH_PPC64_BE 0
85 #define KMP_ARCH_PPC64_LE 0
86 #define KMP_ARCH_PPC64 (KMP_ARCH_PPC64_LE || KMP_ARCH_PPC64_BE)
87 #define KMP_ARCH_MIPS 0
88 #define KMP_ARCH_MIPS64 0
89 
90 #if KMP_OS_WINDOWS
91 #if defined _M_AMD64
92 #undef KMP_ARCH_X86_64
93 #define KMP_ARCH_X86_64 1
94 #else
95 #undef KMP_ARCH_X86
96 #define KMP_ARCH_X86 1
97 #endif
98 #endif
99 
100 #if KMP_OS_UNIX
101 #if defined __x86_64
102 #undef KMP_ARCH_X86_64
103 #define KMP_ARCH_X86_64 1
104 #elif defined __i386
105 #undef KMP_ARCH_X86
106 #define KMP_ARCH_X86 1
107 #elif defined __powerpc64__
108 #if defined __LITTLE_ENDIAN__
109 #undef KMP_ARCH_PPC64_LE
110 #define KMP_ARCH_PPC64_LE 1
111 #else
112 #undef KMP_ARCH_PPC64_BE
113 #define KMP_ARCH_PPC64_BE 1
114 #endif
115 #elif defined __aarch64__
116 #undef KMP_ARCH_AARCH64
117 #define KMP_ARCH_AARCH64 1
118 #elif defined __mips__
119 #if defined __mips64
120 #undef KMP_ARCH_MIPS64
121 #define KMP_ARCH_MIPS64 1
122 #else
123 #undef KMP_ARCH_MIPS
124 #define KMP_ARCH_MIPS 1
125 #endif
126 #endif
127 #endif
128 
129 #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7R__) || \
130  defined(__ARM_ARCH_7A__)
131 #define KMP_ARCH_ARMV7 1
132 #endif
133 
134 #if defined(KMP_ARCH_ARMV7) || defined(__ARM_ARCH_6__) || \
135  defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || \
136  defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6T2__) || \
137  defined(__ARM_ARCH_6ZK__)
138 #define KMP_ARCH_ARMV6 1
139 #endif
140 
141 #if defined(KMP_ARCH_ARMV6) || defined(__ARM_ARCH_5T__) || \
142  defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || \
143  defined(__ARM_ARCH_5TEJ__)
144 #define KMP_ARCH_ARMV5 1
145 #endif
146 
147 #if defined(KMP_ARCH_ARMV5) || defined(__ARM_ARCH_4__) || \
148  defined(__ARM_ARCH_4T__)
149 #define KMP_ARCH_ARMV4 1
150 #endif
151 
152 #if defined(KMP_ARCH_ARMV4) || defined(__ARM_ARCH_3__) || \
153  defined(__ARM_ARCH_3M__)
154 #define KMP_ARCH_ARMV3 1
155 #endif
156 
157 #if defined(KMP_ARCH_ARMV3) || defined(__ARM_ARCH_2__)
158 #define KMP_ARCH_ARMV2 1
159 #endif
160 
161 #if defined(KMP_ARCH_ARMV2)
162 #define KMP_ARCH_ARM 1
163 #endif
164 
165 #if defined(__MIC__) || defined(__MIC2__)
166 #define KMP_MIC 1
167 #if __MIC2__ || __KNC__
168 #define KMP_MIC1 0
169 #define KMP_MIC2 1
170 #else
171 #define KMP_MIC1 1
172 #define KMP_MIC2 0
173 #endif
174 #else
175 #define KMP_MIC 0
176 #define KMP_MIC1 0
177 #define KMP_MIC2 0
178 #endif
179 
180 /* Specify 32 bit architectures here */
181 #define KMP_32_BIT_ARCH (KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS)
182 
183 // Platforms which support Intel(R) Many Integrated Core Architecture
184 #define KMP_MIC_SUPPORTED \
185  ((KMP_ARCH_X86 || KMP_ARCH_X86_64) && (KMP_OS_LINUX || KMP_OS_WINDOWS))
186 
187 // TODO: Fixme - This is clever, but really fugly
188 #if (1 != \
189  KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM + KMP_ARCH_PPC64 + \
190  KMP_ARCH_AARCH64 + KMP_ARCH_MIPS + KMP_ARCH_MIPS64)
191 #error Unknown or unsupported architecture
192 #endif
193 
194 #endif // KMP_PLATFORM_H