blob: 2f43cf83ff9f2736109a54cfafd81c24db51e16a [file] [log] [blame]
Jonathan Peyton92907c22015-05-29 16:13:56 +00001/*
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
Joerg Sonnenberger1564f3c2015-09-21 20:02:45 +000021#define KMP_OS_NETBSD 0
Jonathan Peyton92907c22015-05-29 16:13:56 +000022#define KMP_OS_DARWIN 0
23#define KMP_OS_WINDOWS 0
24#define KMP_OS_CNK 0
25#define KMP_OS_UNIX 0 /* disjunction of KMP_OS_LINUX, KMP_OS_DARWIN etc. */
26
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
Joerg Sonnenberger1564f3c2015-09-21 20:02:45 +000053#if ( defined __NetBSD__ )
54# undef KMP_OS_NETBSD
55# define KMP_OS_NETBSD 1
56#endif
57
Jonathan Peyton92907c22015-05-29 16:13:56 +000058#if ( defined __bgq__ )
59# undef KMP_OS_CNK
60# define KMP_OS_CNK 1
61#endif
62
Joerg Sonnenberger1564f3c2015-09-21 20:02:45 +000063#if (1 != KMP_OS_LINUX + KMP_OS_FREEBSD + KMP_OS_NETBSD + KMP_OS_DARWIN + KMP_OS_WINDOWS)
Jonathan Peyton92907c22015-05-29 16:13:56 +000064# error Unknown OS
65#endif
66
Joerg Sonnenberger1564f3c2015-09-21 20:02:45 +000067#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_DARWIN
Jonathan Peyton92907c22015-05-29 16:13:56 +000068# undef KMP_OS_UNIX
69# define KMP_OS_UNIX 1
70#endif
71
72/* ---------------------- Architecture recognition ------------------- */
73
74#define KMP_ARCH_X86 0
75#define KMP_ARCH_X86_64 0
76#define KMP_ARCH_AARCH64 0
77#define KMP_ARCH_PPC64_BE 0
78#define KMP_ARCH_PPC64_LE 0
79#define KMP_ARCH_PPC64 (KMP_ARCH_PPC64_LE || KMP_ARCH_PPC64_BE)
Sylvestre Ledrucd9d3742016-12-08 09:22:24 +000080#define KMP_ARCH_MIPS 0
81#define KMP_ARCH_MIPS64 0
Jonathan Peyton92907c22015-05-29 16:13:56 +000082
83#if KMP_OS_WINDOWS
84# if defined _M_AMD64
85# undef KMP_ARCH_X86_64
86# define KMP_ARCH_X86_64 1
87# else
88# undef KMP_ARCH_X86
89# define KMP_ARCH_X86 1
90# endif
91#endif
92
93#if KMP_OS_UNIX
94# if defined __x86_64
95# undef KMP_ARCH_X86_64
96# define KMP_ARCH_X86_64 1
97# elif defined __i386
98# undef KMP_ARCH_X86
99# define KMP_ARCH_X86 1
100# elif defined __powerpc64__
101# if defined __LITTLE_ENDIAN__
102# undef KMP_ARCH_PPC64_LE
103# define KMP_ARCH_PPC64_LE 1
104# else
105# undef KMP_ARCH_PPC64_BE
106# define KMP_ARCH_PPC64_BE 1
107# endif
108# elif defined __aarch64__
109# undef KMP_ARCH_AARCH64
110# define KMP_ARCH_AARCH64 1
Sylvestre Ledrucd9d3742016-12-08 09:22:24 +0000111# elif defined __mips__
112# if defined __mips64
113# undef KMP_ARCH_MIPS64
114# define KMP_ARCH_MIPS64 1
115# else
116# undef KMP_ARCH_MIPS
117# define KMP_ARCH_MIPS 1
118# endif
Jonathan Peyton92907c22015-05-29 16:13:56 +0000119# endif
120#endif
121
122#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7R__) || \
123 defined(__ARM_ARCH_7A__)
124# define KMP_ARCH_ARMV7 1
125#endif
126
127#if defined(KMP_ARCH_ARMV7) || defined(__ARM_ARCH_6__) || \
128 defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || \
129 defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6T2__) || \
130 defined(__ARM_ARCH_6ZK__)
131# define KMP_ARCH_ARMV6 1
132#endif
133
134#if defined(KMP_ARCH_ARMV6) || defined(__ARM_ARCH_5T__) || \
135 defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || \
136 defined(__ARM_ARCH_5TEJ__)
137# define KMP_ARCH_ARMV5 1
138#endif
139
140#if defined(KMP_ARCH_ARMV5) || defined(__ARM_ARCH_4__) || \
141 defined(__ARM_ARCH_4T__)
142# define KMP_ARCH_ARMV4 1
143#endif
144
145#if defined(KMP_ARCH_ARMV4) || defined(__ARM_ARCH_3__) || \
146 defined(__ARM_ARCH_3M__)
147# define KMP_ARCH_ARMV3 1
148#endif
149
150#if defined(KMP_ARCH_ARMV3) || defined(__ARM_ARCH_2__)
151# define KMP_ARCH_ARMV2 1
152#endif
153
154#if defined(KMP_ARCH_ARMV2)
155# define KMP_ARCH_ARM 1
156#endif
157
Jonathan Peyton621743b2015-08-20 19:46:14 +0000158#if defined(__MIC__) || defined(__MIC2__)
159# define KMP_MIC 1
160# if __MIC2__ || __KNC__
161# define KMP_MIC1 0
162# define KMP_MIC2 1
163# else
164# define KMP_MIC1 1
165# define KMP_MIC2 0
166# endif
167#else
168# define KMP_MIC 0
169# define KMP_MIC1 0
170# define KMP_MIC2 0
171#endif
172
Jonathan Peyton32a1ea12016-01-04 23:20:26 +0000173/* Specify 32 bit architectures here */
Sylvestre Ledrucd9d3742016-12-08 09:22:24 +0000174#define KMP_32_BIT_ARCH (KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS)
Jonathan Peyton32a1ea12016-01-04 23:20:26 +0000175
Jonathan Peyton92907c22015-05-29 16:13:56 +0000176// TODO: Fixme - This is clever, but really fugly
Sylvestre Ledrucd9d3742016-12-08 09:22:24 +0000177#if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM + KMP_ARCH_PPC64 + KMP_ARCH_AARCH64 + KMP_ARCH_MIPS + KMP_ARCH_MIPS64)
Jonathan Peyton92907c22015-05-29 16:13:56 +0000178# error Unknown or unsupported architecture
179#endif
180
181#endif // KMP_PLATFORM_H