v8config.h 13.9 KB
Newer Older
1
// Copyright 2013 the V8 project authors. All rights reserved.
2 3
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
4 5 6 7

#ifndef V8CONFIG_H_
#define V8CONFIG_H_

8 9
// clang-format off

10 11 12 13
// Platform headers for feature detection below.
#if defined(__ANDROID__)
# include <sys/cdefs.h>
#elif defined(__APPLE__)
14
# include <TargetConditionals.h>
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
#elif defined(__linux__)
# include <features.h>
#endif


// This macro allows to test for the version of the GNU C library (or
// a compatible C library that masquerades as glibc). It evaluates to
// 0 if libc is not GNU libc or compatible.
// Use like:
//  #if V8_GLIBC_PREREQ(2, 3)
//   ...
//  #endif
#if defined(__GLIBC__) && defined(__GLIBC_MINOR__)
# define V8_GLIBC_PREREQ(major, minor)                                    \
    ((__GLIBC__ * 100 + __GLIBC_MINOR__) >= ((major) * 100 + (minor)))
#else
# define V8_GLIBC_PREREQ(major, minor) 0
#endif


// This macro allows to test for the version of the GNU C++ compiler.
// Note that this also applies to compilers that masquerade as GCC,
// for example clang and the Intel C++ compiler for Linux.
// Use like:
//  #if V8_GNUC_PREREQ(4, 3, 1)
//   ...
//  #endif
#if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
# define V8_GNUC_PREREQ(major, minor, patchlevel)                         \
    ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >=   \
     ((major) * 10000 + (minor) * 100 + (patchlevel)))
#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
47 48
# define V8_GNUC_PREREQ(major, minor, patchlevel)      \
    ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >=      \
49 50 51 52 53 54 55
     ((major) * 10000 + (minor) * 100 + (patchlevel)))
#else
# define V8_GNUC_PREREQ(major, minor, patchlevel) 0
#endif



56 57 58 59 60 61 62 63
// -----------------------------------------------------------------------------
// Operating system detection
//
//  V8_OS_ANDROID       - Android
//  V8_OS_BSD           - BSDish (Mac OS X, Net/Free/Open/DragonFlyBSD)
//  V8_OS_CYGWIN        - Cygwin
//  V8_OS_DRAGONFLYBSD  - DragonFlyBSD
//  V8_OS_FREEBSD       - FreeBSD
scottmg's avatar
scottmg committed
64
//  V8_OS_FUCHSIA       - Fuchsia
65 66
//  V8_OS_LINUX         - Linux
//  V8_OS_MACOSX        - Mac OS X
67
//  V8_OS_IOS           - iOS
68 69 70
//  V8_OS_NETBSD        - NetBSD
//  V8_OS_OPENBSD       - OpenBSD
//  V8_OS_POSIX         - POSIX compatible (mostly everything except Windows)
71
//  V8_OS_QNX           - QNX Neutrino
72
//  V8_OS_SOLARIS       - Sun Solaris and OpenSolaris
73
//  V8_OS_AIX           - AIX
74 75 76 77 78 79 80 81 82 83
//  V8_OS_WIN           - Microsoft Windows

#if defined(__ANDROID__)
# define V8_OS_ANDROID 1
# define V8_OS_LINUX 1
# define V8_OS_POSIX 1
#elif defined(__APPLE__)
# define V8_OS_BSD 1
# define V8_OS_MACOSX 1
# define V8_OS_POSIX 1
84 85 86
# if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
#  define V8_OS_IOS 1
# endif  // defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
87 88 89 90 91 92 93 94 95
#elif defined(__CYGWIN__)
# define V8_OS_CYGWIN 1
# define V8_OS_POSIX 1
#elif defined(__linux__)
# define V8_OS_LINUX 1
# define V8_OS_POSIX 1
#elif defined(__sun)
# define V8_OS_POSIX 1
# define V8_OS_SOLARIS 1
96 97 98
#elif defined(_AIX)
#define V8_OS_POSIX 1
#define V8_OS_AIX 1
99 100 101 102
#elif defined(__FreeBSD__)
# define V8_OS_BSD 1
# define V8_OS_FREEBSD 1
# define V8_OS_POSIX 1
scottmg's avatar
scottmg committed
103 104 105
#elif defined(__Fuchsia__)
# define V8_OS_FUCHSIA 1
# define V8_OS_POSIX 1
106 107 108 109 110 111 112 113 114 115 116 117
#elif defined(__DragonFly__)
# define V8_OS_BSD 1
# define V8_OS_DRAGONFLYBSD 1
# define V8_OS_POSIX 1
#elif defined(__NetBSD__)
# define V8_OS_BSD 1
# define V8_OS_NETBSD 1
# define V8_OS_POSIX 1
#elif defined(__OpenBSD__)
# define V8_OS_BSD 1
# define V8_OS_OPENBSD 1
# define V8_OS_POSIX 1
118 119 120
#elif defined(__QNXNTO__)
# define V8_OS_POSIX 1
# define V8_OS_QNX 1
121 122 123 124 125
#elif defined(_WIN32)
# define V8_OS_WIN 1
#endif


126 127 128
// -----------------------------------------------------------------------------
// C library detection
//
129
//  V8_LIBC_MSVCRT  - MSVC libc
130 131 132
//  V8_LIBC_BIONIC  - Bionic libc
//  V8_LIBC_BSD     - BSD libc derivate
//  V8_LIBC_GLIBC   - GNU C library
133
//  V8_LIBC_UCLIBC  - uClibc
134 135 136 137 138 139 140
//
// Note that testing for libc must be done using #if not #ifdef. For example,
// to test for the GNU C library, use:
//  #if V8_LIBC_GLIBC
//   ...
//  #endif

141 142 143
#if defined (_MSC_VER)
# define V8_LIBC_MSVCRT 1
#elif defined(__BIONIC__)
144 145
# define V8_LIBC_BIONIC 1
# define V8_LIBC_BSD 1
146 147 148
#elif defined(__UCLIBC__)
// Must test for UCLIBC before GLIBC, as UCLIBC pretends to be GLIBC.
# define V8_LIBC_UCLIBC 1
149 150 151 152 153 154 155
#elif defined(__GLIBC__) || defined(__GNU_LIBRARY__)
# define V8_LIBC_GLIBC 1
#else
# define V8_LIBC_BSD V8_OS_BSD
#endif


156 157 158
// -----------------------------------------------------------------------------
// Compiler detection
//
159
//  V8_CC_GNU     - GCC, or clang in gcc mode
160
//  V8_CC_INTEL   - Intel C++
161
//  V8_CC_MINGW   - Minimalist GNU for Windows
162 163
//  V8_CC_MINGW32 - Minimalist GNU for Windows (mingw32)
//  V8_CC_MINGW64 - Minimalist GNU for Windows (mingw-w64)
164
//  V8_CC_MSVC    - Microsoft Visual C/C++, or clang in cl.exe mode
165 166 167 168 169
//
// C++11 feature detection
//
// Compiler-specific feature detection
//
170 171 172
//  V8_HAS_ATTRIBUTE_ALWAYS_INLINE      - __attribute__((always_inline))
//                                        supported
//  V8_HAS_ATTRIBUTE_DEPRECATED         - __attribute__((deprecated)) supported
173
//  V8_HAS_ATTRIBUTE_NOINLINE           - __attribute__((noinline)) supported
174
//  V8_HAS_ATTRIBUTE_UNUSED             - __attribute__((unused)) supported
175 176 177
//  V8_HAS_ATTRIBUTE_VISIBILITY         - __attribute__((visibility)) supported
//  V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT - __attribute__((warn_unused_result))
//                                        supported
178 179 180
//  V8_HAS_BUILTIN_BSWAP16              - __builtin_bswap16() supported
//  V8_HAS_BUILTIN_BSWAP32              - __builtin_bswap32() supported
//  V8_HAS_BUILTIN_BSWAP64              - __builtin_bswap64() supported
181 182
//  V8_HAS_BUILTIN_CLZ                  - __builtin_clz() supported
//  V8_HAS_BUILTIN_CTZ                  - __builtin_ctz() supported
183
//  V8_HAS_BUILTIN_EXPECT               - __builtin_expect() supported
184
//  V8_HAS_BUILTIN_FRAME_ADDRESS        - __builtin_frame_address() supported
185
//  V8_HAS_BUILTIN_POPCOUNT             - __builtin_popcount() supported
186 187
//  V8_HAS_BUILTIN_SADD_OVERFLOW        - __builtin_sadd_overflow() supported
//  V8_HAS_BUILTIN_SSUB_OVERFLOW        - __builtin_ssub_overflow() supported
188
//  V8_HAS_BUILTIN_UADD_OVERFLOW        - __builtin_uadd_overflow() supported
189 190
//  V8_HAS_COMPUTED_GOTO                - computed goto/labels as values
//                                        supported
191
//  V8_HAS_DECLSPEC_DEPRECATED          - __declspec(deprecated) supported
192
//  V8_HAS_DECLSPEC_NOINLINE            - __declspec(noinline) supported
193
//  V8_HAS_DECLSPEC_SELECTANY           - __declspec(selectany) supported
194
//  V8_HAS_DECLSPEC_NORETURN            - __declspec(noreturn) supported
195 196 197 198 199 200 201
//  V8_HAS___FORCEINLINE                - __forceinline supported
//
// Note that testing for compilers and/or features must be done using #if
// not #ifdef. For example, to test for Intel C++ Compiler, use:
//  #if V8_CC_INTEL
//   ...
//  #endif
202 203 204

#if defined(__clang__)

205 206 207
#if defined(__GNUC__)  // Clang in gcc mode.
# define V8_CC_GNU 1
#endif
208

209 210
# define V8_HAS_ATTRIBUTE_ALWAYS_INLINE (__has_attribute(always_inline))
# define V8_HAS_ATTRIBUTE_DEPRECATED (__has_attribute(deprecated))
211 212
# define V8_HAS_ATTRIBUTE_DEPRECATED_MESSAGE \
    (__has_extension(attribute_deprecated_with_message))
213
# define V8_HAS_ATTRIBUTE_NOINLINE (__has_attribute(noinline))
214
# define V8_HAS_ATTRIBUTE_UNUSED (__has_attribute(unused))
215
# define V8_HAS_ATTRIBUTE_VISIBILITY (__has_attribute(visibility))
216 217
# define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT \
    (__has_attribute(warn_unused_result))
218

219 220 221
# define V8_HAS_BUILTIN_BSWAP16 (__has_builtin(__builtin_bswap16))
# define V8_HAS_BUILTIN_BSWAP32 (__has_builtin(__builtin_bswap32))
# define V8_HAS_BUILTIN_BSWAP64 (__has_builtin(__builtin_bswap64))
222 223
# define V8_HAS_BUILTIN_CLZ (__has_builtin(__builtin_clz))
# define V8_HAS_BUILTIN_CTZ (__has_builtin(__builtin_ctz))
224
# define V8_HAS_BUILTIN_EXPECT (__has_builtin(__builtin_expect))
225
# define V8_HAS_BUILTIN_FRAME_ADDRESS (__has_builtin(__builtin_frame_address))
226
# define V8_HAS_BUILTIN_POPCOUNT (__has_builtin(__builtin_popcount))
227 228
# define V8_HAS_BUILTIN_SADD_OVERFLOW (__has_builtin(__builtin_sadd_overflow))
# define V8_HAS_BUILTIN_SSUB_OVERFLOW (__has_builtin(__builtin_ssub_overflow))
229
# define V8_HAS_BUILTIN_UADD_OVERFLOW (__has_builtin(__builtin_uadd_overflow))
230

231 232 233 234
// Clang has no __has_feature for computed gotos.
// GCC doc: https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
# define V8_HAS_COMPUTED_GOTO 1

235 236 237 238
# if __cplusplus >= 201402L
#  define V8_CAN_HAVE_DCHECK_IN_CONSTEXPR 1
# endif

239 240 241
#elif defined(__GNUC__)

# define V8_CC_GNU 1
242 243 244 245 246 247 248 249 250
# if defined(__INTEL_COMPILER)  // Intel C++ also masquerades as GCC 3.2.0
#  define V8_CC_INTEL 1
# endif
# if defined(__MINGW32__)
#  define V8_CC_MINGW32 1
# endif
# if defined(__MINGW64__)
#  define V8_CC_MINGW64 1
# endif
251
# define V8_CC_MINGW (V8_CC_MINGW32 || V8_CC_MINGW64)
252

253 254 255 256
// always_inline is available in gcc 4.0 but not very reliable until 4.4.
// Works around "sorry, unimplemented: inlining failed" build errors with
// older compilers.
# define V8_HAS_ATTRIBUTE_ALWAYS_INLINE (V8_GNUC_PREREQ(4, 4, 0))
257
# define V8_HAS_ATTRIBUTE_DEPRECATED (V8_GNUC_PREREQ(3, 4, 0))
258
# define V8_HAS_ATTRIBUTE_DEPRECATED_MESSAGE (V8_GNUC_PREREQ(4, 5, 0))
259
# define V8_HAS_ATTRIBUTE_NOINLINE (V8_GNUC_PREREQ(3, 4, 0))
260
# define V8_HAS_ATTRIBUTE_UNUSED (V8_GNUC_PREREQ(2, 95, 0))
261
# define V8_HAS_ATTRIBUTE_VISIBILITY (V8_GNUC_PREREQ(4, 3, 0))
262 263
# define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT \
    (!V8_CC_INTEL && V8_GNUC_PREREQ(4, 1, 0))
264

265 266
# define V8_HAS_BUILTIN_CLZ (V8_GNUC_PREREQ(3, 4, 0))
# define V8_HAS_BUILTIN_CTZ (V8_GNUC_PREREQ(3, 4, 0))
267
# define V8_HAS_BUILTIN_EXPECT (V8_GNUC_PREREQ(2, 96, 0))
268
# define V8_HAS_BUILTIN_FRAME_ADDRESS (V8_GNUC_PREREQ(2, 96, 0))
269
# define V8_HAS_BUILTIN_POPCOUNT (V8_GNUC_PREREQ(3, 4, 0))
270

271 272 273
// GCC doc: https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
#define V8_HAS_COMPUTED_GOTO (V8_GNUC_PREREQ(2, 0, 0))

274
#endif
275

276
#if defined(_MSC_VER)
277
# define V8_CC_MSVC 1
278

279
# define V8_HAS_DECLSPEC_DEPRECATED 1
280
# define V8_HAS_DECLSPEC_NOINLINE 1
281
# define V8_HAS_DECLSPEC_SELECTANY 1
282
# define V8_HAS_DECLSPEC_NORETURN 1
283 284 285 286 287 288 289 290 291 292

# define V8_HAS___FORCEINLINE 1

#endif


// -----------------------------------------------------------------------------
// Helper macros

// A macro used to make better inlining. Don't bother for debug builds.
293 294
// Use like:
//   V8_INLINE int GetZero() { return 0; }
295
#if !defined(DEBUG) && V8_HAS_ATTRIBUTE_ALWAYS_INLINE
296
# define V8_INLINE inline __attribute__((always_inline))
297
#elif !defined(DEBUG) && V8_HAS___FORCEINLINE
298
# define V8_INLINE __forceinline
299
#else
300
# define V8_INLINE inline
301 302 303
#endif


304 305
// A macro used to tell the compiler to never inline a particular function.
// Don't bother for debug builds.
306 307
// Use like:
//   V8_NOINLINE int GetMinusOne() { return -1; }
308
#if !defined(DEBUG) && V8_HAS_ATTRIBUTE_NOINLINE
309
# define V8_NOINLINE __attribute__((noinline))
310
#elif !defined(DEBUG) && V8_HAS_DECLSPEC_NOINLINE
311
# define V8_NOINLINE __declspec(noinline)
312
#else
313
# define V8_NOINLINE /* NOT SUPPORTED */
314 315 316
#endif


317
// A macro (V8_DEPRECATED) to mark classes or functions as deprecated.
318
#if defined(V8_DEPRECATION_WARNINGS) && V8_HAS_ATTRIBUTE_DEPRECATED_MESSAGE
319 320
#define V8_DEPRECATED(message, declarator) \
  declarator __attribute__((deprecated(message)))
321
#elif defined(V8_DEPRECATION_WARNINGS) && V8_HAS_ATTRIBUTE_DEPRECATED
322 323
#define V8_DEPRECATED(message, declarator) \
  declarator __attribute__((deprecated))
324
#elif defined(V8_DEPRECATION_WARNINGS) && V8_HAS_DECLSPEC_DEPRECATED
325
#define V8_DEPRECATED(message, declarator) __declspec(deprecated) declarator
326
#else
327
#define V8_DEPRECATED(message, declarator) declarator
328 329 330
#endif


331 332 333 334 335 336 337 338 339 340 341
// A macro (V8_DEPRECATE_SOON) to make it easier to see what will be deprecated.
#if defined(V8_IMMINENT_DEPRECATION_WARNINGS) && \
    V8_HAS_ATTRIBUTE_DEPRECATED_MESSAGE
#define V8_DEPRECATE_SOON(message, declarator) \
  declarator __attribute__((deprecated(message)))
#elif defined(V8_IMMINENT_DEPRECATION_WARNINGS) && V8_HAS_ATTRIBUTE_DEPRECATED
#define V8_DEPRECATE_SOON(message, declarator) \
  declarator __attribute__((deprecated))
#elif defined(V8_IMMINENT_DEPRECATION_WARNINGS) && V8_HAS_DECLSPEC_DEPRECATED
#define V8_DEPRECATE_SOON(message, declarator) __declspec(deprecated) declarator
#else
342
#define V8_DEPRECATE_SOON(message, declarator) declarator
343
#endif
344 345


346 347 348 349 350 351 352 353 354 355
// A macro to provide the compiler with branch prediction information.
#if V8_HAS_BUILTIN_EXPECT
# define V8_UNLIKELY(condition) (__builtin_expect(!!(condition), 0))
# define V8_LIKELY(condition) (__builtin_expect(!!(condition), 1))
#else
# define V8_UNLIKELY(condition) (condition)
# define V8_LIKELY(condition) (condition)
#endif


356 357
// Annotate a function indicating the caller must examine the return value.
// Use like:
358
//   int foo() V8_WARN_UNUSED_RESULT;
359 360 361 362 363 364
#if V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT
#define V8_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
#else
#define V8_WARN_UNUSED_RESULT /* NOT SUPPORTED */
#endif

365 366 367 368 369 370
#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED)
#error Inconsistent build configuration: To build the V8 shared library \
set BUILDING_V8_SHARED, to include its headers for linking against the \
V8 shared library set USING_V8_SHARED.
#endif

371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400
#ifdef V8_OS_WIN

// Setup for Windows DLL export/import. When building the V8 DLL the
// BUILDING_V8_SHARED needs to be defined. When building a program which uses
// the V8 DLL USING_V8_SHARED needs to be defined. When either building the V8
// static library or building a program which uses the V8 static library neither
// BUILDING_V8_SHARED nor USING_V8_SHARED should be defined.
#ifdef BUILDING_V8_SHARED
# define V8_EXPORT __declspec(dllexport)
#elif USING_V8_SHARED
# define V8_EXPORT __declspec(dllimport)
#else
# define V8_EXPORT
#endif  // BUILDING_V8_SHARED

#else  // V8_OS_WIN

// Setup for Linux shared library export.
#if V8_HAS_ATTRIBUTE_VISIBILITY
# ifdef BUILDING_V8_SHARED
#  define V8_EXPORT __attribute__ ((visibility("default")))
# else
#  define V8_EXPORT
# endif
#else
# define V8_EXPORT
#endif

#endif  // V8_OS_WIN

401 402
// clang-format on

403
#endif  // V8CONFIG_H_