v8  7.0.276 (node 11.14.0)
V8 is Google's open source JavaScript engine
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
v8config.h
Go to the documentation of this file.
1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8CONFIG_H_
6 #define V8CONFIG_H_
7 
8 // clang-format off
9 
10 // Platform headers for feature detection below.
11 #if defined(__ANDROID__)
12 # include <sys/cdefs.h>
13 #elif defined(__APPLE__)
14 # include <TargetConditionals.h>
15 #elif defined(__linux__)
16 # include <features.h>
17 #endif
18 
19 
20 // This macro allows to test for the version of the GNU C library (or
21 // a compatible C library that masquerades as glibc). It evaluates to
22 // 0 if libc is not GNU libc or compatible.
23 // Use like:
24 // #if V8_GLIBC_PREREQ(2, 3)
25 // ...
26 // #endif
27 #if defined(__GLIBC__) && defined(__GLIBC_MINOR__)
28 # define V8_GLIBC_PREREQ(major, minor)
29  ((__GLIBC__ * 100 + __GLIBC_MINOR__) >= ((major) * 100 + (minor)))
30 #else
31 # define V8_GLIBC_PREREQ(major, minor) 0
32 #endif
33 
34 
35 // This macro allows to test for the version of the GNU C++ compiler.
36 // Note that this also applies to compilers that masquerade as GCC,
37 // for example clang and the Intel C++ compiler for Linux.
38 // Use like:
39 // #if V8_GNUC_PREREQ(4, 3, 1)
40 // ...
41 // #endif
42 #if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
43 # define V8_GNUC_PREREQ(major, minor, patchlevel)
44  ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >=
45  ((major) * 10000 + (minor) * 100 + (patchlevel)))
46 #elif defined(__GNUC__) && defined(__GNUC_MINOR__)
47 # define V8_GNUC_PREREQ(major, minor, patchlevel)
48  ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >=
49  ((major) * 10000 + (minor) * 100 + (patchlevel)))
50 #else
51 # define V8_GNUC_PREREQ(major, minor, patchlevel) 0
52 #endif
53 
54 
55 
56 // -----------------------------------------------------------------------------
57 // Operating system detection
58 //
59 // V8_OS_ANDROID - Android
60 // V8_OS_BSD - BSDish (Mac OS X, Net/Free/Open/DragonFlyBSD)
61 // V8_OS_CYGWIN - Cygwin
62 // V8_OS_DRAGONFLYBSD - DragonFlyBSD
63 // V8_OS_FREEBSD - FreeBSD
64 // V8_OS_FUCHSIA - Fuchsia
65 // V8_OS_LINUX - Linux
66 // V8_OS_MACOSX - Mac OS X
67 // V8_OS_NETBSD - NetBSD
68 // V8_OS_OPENBSD - OpenBSD
69 // V8_OS_POSIX - POSIX compatible (mostly everything except Windows)
70 // V8_OS_QNX - QNX Neutrino
71 // V8_OS_SOLARIS - Sun Solaris and OpenSolaris
72 // V8_OS_AIX - AIX
73 // V8_OS_WIN - Microsoft Windows
74 
75 #if defined(__ANDROID__)
76 # define V8_OS_ANDROID 1
77 # define V8_OS_LINUX 1
78 # define V8_OS_POSIX 1
79 #elif defined(__APPLE__)
80 # define V8_OS_BSD 1
81 # define V8_OS_MACOSX 1
82 # define V8_OS_POSIX 1
83 #elif defined(__CYGWIN__)
84 # define V8_OS_CYGWIN 1
85 # define V8_OS_POSIX 1
86 #elif defined(__linux__)
87 # define V8_OS_LINUX 1
88 # define V8_OS_POSIX 1
89 #elif defined(__sun)
90 # define V8_OS_POSIX 1
91 # define V8_OS_SOLARIS 1
92 #elif defined(_AIX)
93 #define V8_OS_POSIX 1
94 #define V8_OS_AIX 1
95 #elif defined(__FreeBSD__)
96 # define V8_OS_BSD 1
97 # define V8_OS_FREEBSD 1
98 # define V8_OS_POSIX 1
99 #elif defined(__Fuchsia__)
100 # define V8_OS_FUCHSIA 1
101 # define V8_OS_POSIX 1
102 #elif defined(__DragonFly__)
103 # define V8_OS_BSD 1
104 # define V8_OS_DRAGONFLYBSD 1
105 # define V8_OS_POSIX 1
106 #elif defined(__NetBSD__)
107 # define V8_OS_BSD 1
108 # define V8_OS_NETBSD 1
109 # define V8_OS_POSIX 1
110 #elif defined(__OpenBSD__)
111 # define V8_OS_BSD 1
112 # define V8_OS_OPENBSD 1
113 # define V8_OS_POSIX 1
114 #elif defined(__QNXNTO__)
115 # define V8_OS_POSIX 1
116 # define V8_OS_QNX 1
117 #elif defined(_WIN32)
118 # define V8_OS_WIN 1
119 #endif
120 
121 
122 // -----------------------------------------------------------------------------
123 // C library detection
124 //
125 // V8_LIBC_MSVCRT - MSVC libc
126 // V8_LIBC_BIONIC - Bionic libc
127 // V8_LIBC_BSD - BSD libc derivate
128 // V8_LIBC_GLIBC - GNU C library
129 // V8_LIBC_UCLIBC - uClibc
130 //
131 // Note that testing for libc must be done using #if not #ifdef. For example,
132 // to test for the GNU C library, use:
133 // #if V8_LIBC_GLIBC
134 // ...
135 // #endif
136 
137 #if defined (_MSC_VER)
138 # define V8_LIBC_MSVCRT 1
139 #elif defined(__BIONIC__)
140 # define V8_LIBC_BIONIC 1
141 # define V8_LIBC_BSD 1
142 #elif defined(__UCLIBC__)
143 // Must test for UCLIBC before GLIBC, as UCLIBC pretends to be GLIBC.
144 # define V8_LIBC_UCLIBC 1
145 #elif defined(__GLIBC__) || defined(__GNU_LIBRARY__)
146 # define V8_LIBC_GLIBC 1
147 #else
148 # define V8_LIBC_BSD V8_OS_BSD
149 #endif
150 
151 
152 // -----------------------------------------------------------------------------
153 // Compiler detection
154 //
155 // V8_CC_GNU - GCC, or clang in gcc mode
156 // V8_CC_INTEL - Intel C++
157 // V8_CC_MINGW - Minimalist GNU for Windows
158 // V8_CC_MINGW32 - Minimalist GNU for Windows (mingw32)
159 // V8_CC_MINGW64 - Minimalist GNU for Windows (mingw-w64)
160 // V8_CC_MSVC - Microsoft Visual C/C++, or clang in cl.exe mode
161 //
162 // C++11 feature detection
163 //
164 // V8_HAS_CXX11_ALIGNAS - alignas specifier supported
165 // V8_HAS_CXX11_ALIGNOF - alignof(type) operator supported
166 //
167 // Compiler-specific feature detection
168 //
169 // V8_HAS___ALIGNOF - __alignof(type) operator supported
170 // V8_HAS___ALIGNOF__ - __alignof__(type) operator supported
171 // V8_HAS_ATTRIBUTE_ALIGNED - __attribute__((aligned(n))) supported
172 // V8_HAS_ATTRIBUTE_ALWAYS_INLINE - __attribute__((always_inline))
173 // supported
174 // V8_HAS_ATTRIBUTE_DEPRECATED - __attribute__((deprecated)) supported
175 // V8_HAS_ATTRIBUTE_NOINLINE - __attribute__((noinline)) supported
176 // V8_HAS_ATTRIBUTE_UNUSED - __attribute__((unused)) supported
177 // V8_HAS_ATTRIBUTE_VISIBILITY - __attribute__((visibility)) supported
178 // V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT - __attribute__((warn_unused_result))
179 // supported
180 // V8_HAS_BUILTIN_BSWAP16 - __builtin_bswap16() supported
181 // V8_HAS_BUILTIN_BSWAP32 - __builtin_bswap32() supported
182 // V8_HAS_BUILTIN_BSWAP64 - __builtin_bswap64() supported
183 // V8_HAS_BUILTIN_CLZ - __builtin_clz() supported
184 // V8_HAS_BUILTIN_CTZ - __builtin_ctz() supported
185 // V8_HAS_BUILTIN_EXPECT - __builtin_expect() supported
186 // V8_HAS_BUILTIN_FRAME_ADDRESS - __builtin_frame_address() supported
187 // V8_HAS_BUILTIN_POPCOUNT - __builtin_popcount() supported
188 // V8_HAS_BUILTIN_SADD_OVERFLOW - __builtin_sadd_overflow() supported
189 // V8_HAS_BUILTIN_SSUB_OVERFLOW - __builtin_ssub_overflow() supported
190 // V8_HAS_BUILTIN_UADD_OVERFLOW - __builtin_uadd_overflow() supported
191 // V8_HAS_DECLSPEC_ALIGN - __declspec(align(n)) supported
192 // V8_HAS_DECLSPEC_DEPRECATED - __declspec(deprecated) supported
193 // V8_HAS_DECLSPEC_NOINLINE - __declspec(noinline) supported
194 // V8_HAS_DECLSPEC_SELECTANY - __declspec(selectany) supported
195 // V8_HAS_DECLSPEC_NORETURN - __declspec(noreturn) supported
196 // V8_HAS___FORCEINLINE - __forceinline supported
197 //
198 // Note that testing for compilers and/or features must be done using #if
199 // not #ifdef. For example, to test for Intel C++ Compiler, use:
200 // #if V8_CC_INTEL
201 // ...
202 // #endif
203 
204 #if defined(__clang__)
205 
206 #if defined(__GNUC__) // Clang in gcc mode.
207 # define V8_CC_GNU 1
208 #endif
209 
210 // Clang defines __alignof__ as alias for __alignof
211 # define V8_HAS___ALIGNOF 1
212 # define V8_HAS___ALIGNOF__ V8_HAS___ALIGNOF
213 
214 # define V8_HAS_ATTRIBUTE_ALIGNED (__has_attribute(aligned))
215 # define V8_HAS_ATTRIBUTE_ALWAYS_INLINE (__has_attribute(always_inline))
216 # define V8_HAS_ATTRIBUTE_DEPRECATED (__has_attribute(deprecated))
217 # define V8_HAS_ATTRIBUTE_DEPRECATED_MESSAGE
218  (__has_extension(attribute_deprecated_with_message))
219 # define V8_HAS_ATTRIBUTE_NOINLINE (__has_attribute(noinline))
220 # define V8_HAS_ATTRIBUTE_UNUSED (__has_attribute(unused))
221 # define V8_HAS_ATTRIBUTE_VISIBILITY (__has_attribute(visibility))
222 # define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT
223  (__has_attribute(warn_unused_result))
224 
225 # define V8_HAS_BUILTIN_BSWAP16 (__has_builtin(__builtin_bswap16))
226 # define V8_HAS_BUILTIN_BSWAP32 (__has_builtin(__builtin_bswap32))
227 # define V8_HAS_BUILTIN_BSWAP64 (__has_builtin(__builtin_bswap64))
228 # define V8_HAS_BUILTIN_CLZ (__has_builtin(__builtin_clz))
229 # define V8_HAS_BUILTIN_CTZ (__has_builtin(__builtin_ctz))
230 # define V8_HAS_BUILTIN_EXPECT (__has_builtin(__builtin_expect))
231 # define V8_HAS_BUILTIN_FRAME_ADDRESS (__has_builtin(__builtin_frame_address))
232 # define V8_HAS_BUILTIN_POPCOUNT (__has_builtin(__builtin_popcount))
233 # define V8_HAS_BUILTIN_SADD_OVERFLOW (__has_builtin(__builtin_sadd_overflow))
234 # define V8_HAS_BUILTIN_SSUB_OVERFLOW (__has_builtin(__builtin_ssub_overflow))
235 # define V8_HAS_BUILTIN_UADD_OVERFLOW (__has_builtin(__builtin_uadd_overflow))
236 
237 # define V8_HAS_CXX11_ALIGNAS (__has_feature(cxx_alignas))
238 
239 #elif defined(__GNUC__)
240 
241 # define V8_CC_GNU 1
242 # if defined(__INTEL_COMPILER) // Intel C++ also masquerades as GCC 3.2.0
243 # define V8_CC_INTEL 1
244 # endif
245 # if defined(__MINGW32__)
246 # define V8_CC_MINGW32 1
247 # endif
248 # if defined(__MINGW64__)
249 # define V8_CC_MINGW64 1
250 # endif
251 # define V8_CC_MINGW (V8_CC_MINGW32 || V8_CC_MINGW64)
252 
253 # define V8_HAS___ALIGNOF__ (V8_GNUC_PREREQ(4, 3, 0))
254 
255 # define V8_HAS_ATTRIBUTE_ALIGNED (V8_GNUC_PREREQ(2, 95, 0))
256 // always_inline is available in gcc 4.0 but not very reliable until 4.4.
257 // Works around "sorry, unimplemented: inlining failed" build errors with
258 // older compilers.
259 # define V8_HAS_ATTRIBUTE_ALWAYS_INLINE (V8_GNUC_PREREQ(4, 4, 0))
260 # define V8_HAS_ATTRIBUTE_DEPRECATED (V8_GNUC_PREREQ(3, 4, 0))
261 # define V8_HAS_ATTRIBUTE_DEPRECATED_MESSAGE (V8_GNUC_PREREQ(4, 5, 0))
262 # define V8_HAS_ATTRIBUTE_NOINLINE (V8_GNUC_PREREQ(3, 4, 0))
263 # define V8_HAS_ATTRIBUTE_UNUSED (V8_GNUC_PREREQ(2, 95, 0))
264 # define V8_HAS_ATTRIBUTE_VISIBILITY (V8_GNUC_PREREQ(4, 3, 0))
265 # define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT
266  (!V8_CC_INTEL && V8_GNUC_PREREQ(4, 1, 0))
267 
268 # define V8_HAS_BUILTIN_CLZ (V8_GNUC_PREREQ(3, 4, 0))
269 # define V8_HAS_BUILTIN_CTZ (V8_GNUC_PREREQ(3, 4, 0))
270 # define V8_HAS_BUILTIN_EXPECT (V8_GNUC_PREREQ(2, 96, 0))
271 # define V8_HAS_BUILTIN_FRAME_ADDRESS (V8_GNUC_PREREQ(2, 96, 0))
272 # define V8_HAS_BUILTIN_POPCOUNT (V8_GNUC_PREREQ(3, 4, 0))
273 
274 # if __cplusplus >= 201103L
275 # define V8_HAS_CXX11_ALIGNAS (V8_GNUC_PREREQ(4, 8, 0))
276 # define V8_HAS_CXX11_ALIGNOF (V8_GNUC_PREREQ(4, 8, 0))
277 # endif
278 #endif
279 
280 #if defined(_MSC_VER)
281 # define V8_CC_MSVC 1
282 # define V8_HAS___ALIGNOF 1
283 
284 # define V8_HAS_DECLSPEC_ALIGN 1
285 # define V8_HAS_DECLSPEC_DEPRECATED 1
286 # define V8_HAS_DECLSPEC_NOINLINE 1
287 # define V8_HAS_DECLSPEC_SELECTANY 1
288 # define V8_HAS_DECLSPEC_NORETURN 1
289 
290 # define V8_HAS___FORCEINLINE 1
291 
292 #endif
293 
294 
295 // -----------------------------------------------------------------------------
296 // Helper macros
297 
298 // A macro used to make better inlining. Don't bother for debug builds.
299 // Use like:
300 // V8_INLINE int GetZero() { return 0; }
301 #if !defined(DEBUG) && V8_HAS_ATTRIBUTE_ALWAYS_INLINE
302 # define V8_INLINE inline __attribute__((always_inline))
303 #elif !defined(DEBUG) && V8_HAS___FORCEINLINE
304 # define V8_INLINE __forceinline
305 #else
306 # define V8_INLINE inline
307 #endif
308 
309 
310 // A macro used to tell the compiler to never inline a particular function.
311 // Don't bother for debug builds.
312 // Use like:
313 // V8_NOINLINE int GetMinusOne() { return -1; }
314 #if !defined(DEBUG) && V8_HAS_ATTRIBUTE_NOINLINE
315 # define V8_NOINLINE __attribute__((noinline))
316 #elif !defined(DEBUG) && V8_HAS_DECLSPEC_NOINLINE
317 # define V8_NOINLINE __declspec(noinline)
318 #else
319 # define V8_NOINLINE /* NOT SUPPORTED */
320 #endif
321 
322 
323 // A macro (V8_DEPRECATED) to mark classes or functions as deprecated.
324 #if defined(V8_DEPRECATION_WARNINGS) && V8_HAS_ATTRIBUTE_DEPRECATED_MESSAGE
325 #define V8_DEPRECATED(message, declarator)
326  declarator __attribute__((deprecated(message)))
327 #elif defined(V8_DEPRECATION_WARNINGS) && V8_HAS_ATTRIBUTE_DEPRECATED
328 #define V8_DEPRECATED(message, declarator)
329  declarator __attribute__((deprecated))
330 #elif defined(V8_DEPRECATION_WARNINGS) && V8_HAS_DECLSPEC_DEPRECATED
331 #define V8_DEPRECATED(message, declarator) __declspec(deprecated) declarator
332 #else
333 #define V8_DEPRECATED(message, declarator) declarator
334 #endif
335 
336 
337 // A macro (V8_DEPRECATE_SOON) to make it easier to see what will be deprecated.
338 #if defined(V8_IMMINENT_DEPRECATION_WARNINGS) &&
339  V8_HAS_ATTRIBUTE_DEPRECATED_MESSAGE
340 #define V8_DEPRECATE_SOON(message, declarator)
341  declarator __attribute__((deprecated(message)))
342 #elif defined(V8_IMMINENT_DEPRECATION_WARNINGS) && V8_HAS_ATTRIBUTE_DEPRECATED
343 #define V8_DEPRECATE_SOON(message, declarator)
344  declarator __attribute__((deprecated))
345 #elif defined(V8_IMMINENT_DEPRECATION_WARNINGS) && V8_HAS_DECLSPEC_DEPRECATED
346 #define V8_DEPRECATE_SOON(message, declarator) __declspec(deprecated) declarator
347 #else
348 #define V8_DEPRECATE_SOON(message, declarator) declarator
349 #endif
350 
351 
352 // A macro to provide the compiler with branch prediction information.
353 #if V8_HAS_BUILTIN_EXPECT
354 # define V8_UNLIKELY(condition) (__builtin_expect(!!(condition), 0))
355 # define V8_LIKELY(condition) (__builtin_expect(!!(condition), 1))
356 #else
357 # define V8_UNLIKELY(condition) (condition)
358 # define V8_LIKELY(condition) (condition)
359 #endif
360 
361 
362 // This macro allows to specify memory alignment for structs, classes, etc.
363 // Use like:
364 // class V8_ALIGNED(16) MyClass { ... };
365 // V8_ALIGNED(32) int array[42];
366 #if V8_HAS_CXX11_ALIGNAS
367 # define V8_ALIGNED(n) alignas(n)
368 #elif V8_HAS_ATTRIBUTE_ALIGNED
369 # define V8_ALIGNED(n) __attribute__((aligned(n)))
370 #elif V8_HAS_DECLSPEC_ALIGN
371 # define V8_ALIGNED(n) __declspec(align(n))
372 #else
373 # define V8_ALIGNED(n) /* NOT SUPPORTED */
374 #endif
375 
376 
377 // This macro is similar to V8_ALIGNED(), but takes a type instead of size
378 // in bytes. If the compiler does not supports using the alignment of the
379 // |type|, it will align according to the |alignment| instead. For example,
380 // Visual Studio C++ cannot combine __declspec(align) and __alignof. The
381 // |alignment| must be a literal that is used as a kind of worst-case fallback
382 // alignment.
383 // Use like:
384 // struct V8_ALIGNAS(AnotherClass, 16) NewClass { ... };
385 // V8_ALIGNAS(double, 8) int array[100];
386 #if V8_HAS_CXX11_ALIGNAS
387 # define V8_ALIGNAS(type, alignment) alignas(type)
388 #elif V8_HAS___ALIGNOF__ && V8_HAS_ATTRIBUTE_ALIGNED
389 # define V8_ALIGNAS(type, alignment) __attribute__((aligned(__alignof__(type))))
390 #else
391 # define V8_ALIGNAS(type, alignment) V8_ALIGNED(alignment)
392 #endif
393 
394 
395 // This macro returns alignment in bytes (an integer power of two) required for
396 // any instance of the given type, which is either complete type, an array type,
397 // or a reference type.
398 // Use like:
399 // size_t alignment = V8_ALIGNOF(double);
400 #if V8_HAS_CXX11_ALIGNOF
401 # define V8_ALIGNOF(type) alignof(type)
402 #elif V8_HAS___ALIGNOF
403 # define V8_ALIGNOF(type) __alignof(type)
404 #elif V8_HAS___ALIGNOF__
405 # define V8_ALIGNOF(type) __alignof__(type)
406 #else
407 // Note that alignment of a type within a struct can be less than the
408 // alignment of the type stand-alone (because of ancient ABIs), so this
409 // should only be used as a last resort.
410 namespace v8 { template <typename T> class AlignOfHelper { char c; T t; }; }
411 # define V8_ALIGNOF(type) (sizeof(::v8::AlignOfHelper<type>) - sizeof(type))
412 #endif
413 
414 // Annotate a function indicating the caller must examine the return value.
415 // Use like:
416 // int foo() V8_WARN_UNUSED_RESULT;
417 #if V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT
418 #define V8_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
419 #else
420 #define V8_WARN_UNUSED_RESULT /* NOT SUPPORTED */
421 #endif
422 
423 // clang-format on
424 
425 #endif // V8CONFIG_H_