Actually move WTF files to their new home
[WebKit-https.git] / Source / WTF / wtf / Compiler.h
1 /*
2  * Copyright (C) 2011, 2012 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef WTF_Compiler_h
27 #define WTF_Compiler_h
28
29 /* COMPILER() - the compiler being used to build the project */
30 #define COMPILER(WTF_FEATURE) (defined WTF_COMPILER_##WTF_FEATURE  && WTF_COMPILER_##WTF_FEATURE)
31
32 /* COMPILER_SUPPORTS() - whether the compiler being used to build the project supports the given feature. */
33 #define COMPILER_SUPPORTS(WTF_COMPILER_FEATURE) (defined WTF_COMPILER_SUPPORTS_##WTF_COMPILER_FEATURE  && WTF_COMPILER_SUPPORTS_##WTF_COMPILER_FEATURE)
34
35 /* ==== COMPILER() - the compiler being used to build the project ==== */
36
37 /* COMPILER(CLANG) - Clang  */
38 #if defined(__clang__)
39 #define WTF_COMPILER_CLANG 1
40
41 #ifndef __has_extension
42 #define __has_extension __has_feature /* Compatibility with older versions of clang */
43 #endif
44
45 /* Specific compiler features */
46 #define WTF_COMPILER_SUPPORTS_CXX_VARIADIC_TEMPLATES __has_feature(cxx_variadic_templates)
47 #define WTF_COMPILER_SUPPORTS_CXX_RVALUE_REFERENCES __has_feature(cxx_rvalue_references)
48 #define WTF_COMPILER_SUPPORTS_CXX_DELETED_FUNCTIONS __has_feature(cxx_deleted_functions)
49 #define WTF_COMPILER_SUPPORTS_CXX_NULLPTR __has_feature(cxx_nullptr)
50 #define WTF_COMPILER_SUPPORTS_BLOCKS __has_feature(blocks)
51 #define WTF_COMPILER_SUPPORTS_C_STATIC_ASSERT __has_extension(c_static_assert)
52
53 #define WTF_COMPILER_SUPPORTS_HAS_TRIVIAL_DESTRUCTOR __has_extension(has_trivial_destructor)
54
55 #endif
56
57 /* COMPILER(MSVC) - Microsoft Visual C++ */
58 /* COMPILER(MSVC7_OR_LOWER) - Microsoft Visual C++ 2003 or lower*/
59 /* COMPILER(MSVC9_OR_LOWER) - Microsoft Visual C++ 2008 or lower*/
60 #if defined(_MSC_VER)
61 #define WTF_COMPILER_MSVC 1
62 #if _MSC_VER < 1400
63 #define WTF_COMPILER_MSVC7_OR_LOWER 1
64 #elif _MSC_VER < 1600
65 #define WTF_COMPILER_MSVC9_OR_LOWER 1
66 #endif
67
68 /* Specific compiler features */
69 #if _MSC_VER >= 1600
70 #define WTF_COMPILER_SUPPORTS_CXX_NULLPTR 1
71 #endif
72
73 #endif
74
75 /* COMPILER(RVCT) - ARM RealView Compilation Tools */
76 /* COMPILER(RVCT4_OR_GREATER) - ARM RealView Compilation Tools 4.0 or greater */
77 #if defined(__CC_ARM) || defined(__ARMCC__)
78 #define WTF_COMPILER_RVCT 1
79 #define RVCT_VERSION_AT_LEAST(major, minor, patch, build) (__ARMCC_VERSION >= (major * 100000 + minor * 10000 + patch * 1000 + build))
80 #else
81 /* Define this for !RVCT compilers, just so we can write things like RVCT_VERSION_AT_LEAST(3, 0, 0, 0). */
82 #define RVCT_VERSION_AT_LEAST(major, minor, patch, build) 0
83 #endif
84
85 /* COMPILER(GCCE) - GNU Compiler Collection for Embedded */
86 #if defined(__GCCE__)
87 #define WTF_COMPILER_GCCE 1
88 #define GCCE_VERSION (__GCCE__ * 10000 + __GCCE_MINOR__ * 100 + __GCCE_PATCHLEVEL__)
89 #define GCCE_VERSION_AT_LEAST(major, minor, patch) (GCCE_VERSION >= (major * 10000 + minor * 100 + patch))
90 #endif
91
92 /* COMPILER(GCC) - GNU Compiler Collection */
93 /* --gnu option of the RVCT compiler also defines __GNUC__ */
94 #if defined(__GNUC__) && !COMPILER(RVCT)
95 #define WTF_COMPILER_GCC 1
96 #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
97 #define GCC_VERSION_AT_LEAST(major, minor, patch) (GCC_VERSION >= (major * 10000 + minor * 100 + patch))
98
99 /* Specific compiler features */
100 #if !COMPILER(CLANG) && GCC_VERSION_AT_LEAST(4, 6, 0) && defined(__GXX_EXPERIMENTAL_CXX0X__)
101 #define WTF_COMPILER_SUPPORTS_CXX_NULLPTR 1 
102 #endif
103
104 #else
105 /* Define this for !GCC compilers, just so we can write things like GCC_VERSION_AT_LEAST(4, 1, 0). */
106 #define GCC_VERSION_AT_LEAST(major, minor, patch) 0
107 #endif
108
109 /* COMPILER(MINGW) - MinGW GCC */
110 /* COMPILER(MINGW64) - mingw-w64 GCC - only used as additional check to exclude mingw.org specific functions */
111 #if defined(__MINGW32__)
112 #define WTF_COMPILER_MINGW 1
113 #include <_mingw.h> /* private MinGW header */
114     #if defined(__MINGW64_VERSION_MAJOR) /* best way to check for mingw-w64 vs mingw.org */
115         #define WTF_COMPILER_MINGW64 1
116     #endif /* __MINGW64_VERSION_MAJOR */
117 #endif /* __MINGW32__ */
118
119 /* COMPILER(INTEL) - Intel C++ Compiler */
120 #if defined(__INTEL_COMPILER)
121 #define WTF_COMPILER_INTEL 1
122 #endif
123
124 /* COMPILER(SUNCC) */
125 #if defined(__SUNPRO_CC) || defined(__SUNPRO_C)
126 #define WTF_COMPILER_SUNCC 1
127 #endif
128
129 /* ==== Compiler features ==== */
130
131
132 /* ALWAYS_INLINE */
133
134 #ifndef ALWAYS_INLINE
135 #if COMPILER(GCC) && defined(NDEBUG) && !COMPILER(MINGW)
136 #define ALWAYS_INLINE inline __attribute__((__always_inline__))
137 #elif (COMPILER(MSVC) || COMPILER(RVCT)) && defined(NDEBUG)
138 #define ALWAYS_INLINE __forceinline
139 #else
140 #define ALWAYS_INLINE inline
141 #endif
142 #endif
143
144
145 /* NEVER_INLINE */
146
147 #ifndef NEVER_INLINE
148 #if COMPILER(GCC)
149 #define NEVER_INLINE __attribute__((__noinline__))
150 #elif COMPILER(RVCT)
151 #define NEVER_INLINE __declspec(noinline)
152 #else
153 #define NEVER_INLINE
154 #endif
155 #endif
156
157
158 /* UNLIKELY */
159
160 #ifndef UNLIKELY
161 #if COMPILER(GCC) || (RVCT_VERSION_AT_LEAST(3, 0, 0, 0) && defined(__GNUC__))
162 #define UNLIKELY(x) __builtin_expect((x), 0)
163 #else
164 #define UNLIKELY(x) (x)
165 #endif
166 #endif
167
168
169 /* LIKELY */
170
171 #ifndef LIKELY
172 #if COMPILER(GCC) || (RVCT_VERSION_AT_LEAST(3, 0, 0, 0) && defined(__GNUC__))
173 #define LIKELY(x) __builtin_expect((x), 1)
174 #else
175 #define LIKELY(x) (x)
176 #endif
177 #endif
178
179
180 /* NO_RETURN */
181
182
183 #ifndef NO_RETURN
184 #if COMPILER(GCC)
185 #define NO_RETURN __attribute((__noreturn__))
186 #elif COMPILER(MSVC) || COMPILER(RVCT)
187 #define NO_RETURN __declspec(noreturn)
188 #else
189 #define NO_RETURN
190 #endif
191 #endif
192
193
194 /* NO_RETURN_WITH_VALUE */
195
196 #ifndef NO_RETURN_WITH_VALUE
197 #if !COMPILER(MSVC)
198 #define NO_RETURN_WITH_VALUE NO_RETURN
199 #else
200 #define NO_RETURN_WITH_VALUE
201 #endif
202 #endif
203
204
205 /* WARN_UNUSED_RETURN */
206
207 #if COMPILER(GCC)
208 #define WARN_UNUSED_RETURN __attribute__ ((warn_unused_result))
209 #else
210 #define WARN_UNUSED_RETURN
211 #endif
212
213 /* OVERRIDE */
214
215 #ifndef OVERRIDE
216 #if COMPILER(CLANG)
217 #if __has_extension(cxx_override_control)
218 #define OVERRIDE override
219 #endif
220 #elif COMPILER(MSVC)
221 #define OVERRIDE override
222 #endif
223 #endif
224
225 #ifndef OVERRIDE
226 #define OVERRIDE
227 #endif
228
229 /* FINAL */
230
231 #ifndef FINAL
232 #if COMPILER(CLANG)
233 #if __has_extension(cxx_override_control)
234 #define FINAL final
235 #endif
236 #elif COMPILER(MSVC)
237 #define FINAL sealed
238 #endif
239 #endif
240
241 #ifndef FINAL
242 #define FINAL
243 #endif
244
245 /* OBJC_CLASS */
246
247 #ifndef OBJC_CLASS
248 #ifdef __OBJC__
249 #define OBJC_CLASS @class
250 #else
251 #define OBJC_CLASS class
252 #endif
253 #endif
254
255 #endif /* WTF_Compiler_h */