19259716434187c932704601f700375e53d865de8rossberg@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 49259716434187c932704601f700375e53d865de8rossberg@chromium.org 59259716434187c932704601f700375e53d865de8rossberg@chromium.org#ifndef V8CONFIG_H_ 69259716434187c932704601f700375e53d865de8rossberg@chromium.org#define V8CONFIG_H_ 79259716434187c932704601f700375e53d865de8rossberg@chromium.org 88fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// Platform headers for feature detection below. 98fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org#if defined(__ANDROID__) 108fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org# include <sys/cdefs.h> 118fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org#elif defined(__APPLE__) 128fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org# include <TargetConditionals.h> 138fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org#elif defined(__linux__) 148fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org# include <features.h> 158fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org#endif 168fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 178fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 188fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// This macro allows to test for the version of the GNU C library (or 198fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// a compatible C library that masquerades as glibc). It evaluates to 208fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// 0 if libc is not GNU libc or compatible. 218fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// Use like: 228fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// #if V8_GLIBC_PREREQ(2, 3) 238fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// ... 248fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// #endif 258fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org#if defined(__GLIBC__) && defined(__GLIBC_MINOR__) 268fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org# define V8_GLIBC_PREREQ(major, minor) \ 278fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org ((__GLIBC__ * 100 + __GLIBC_MINOR__) >= ((major) * 100 + (minor))) 288fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org#else 298fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org# define V8_GLIBC_PREREQ(major, minor) 0 308fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org#endif 318fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 328fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 338fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// This macro allows to test for the version of the GNU C++ compiler. 348fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// Note that this also applies to compilers that masquerade as GCC, 358fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// for example clang and the Intel C++ compiler for Linux. 368fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// Use like: 378fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// #if V8_GNUC_PREREQ(4, 3, 1) 388fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// ... 398fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// #endif 408fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org#if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) 418fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org# define V8_GNUC_PREREQ(major, minor, patchlevel) \ 428fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= \ 438fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org ((major) * 10000 + (minor) * 100 + (patchlevel))) 448fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org#elif defined(__GNUC__) && defined(__GNUC_MINOR__) 458fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org# define V8_GNUC_PREREQ(major, minor, patchlevel) \ 468fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org ((__GNUC__ * 10000 + __GNUC_MINOR__) >= \ 478fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org ((major) * 10000 + (minor) * 100 + (patchlevel))) 488fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org#else 498fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org# define V8_GNUC_PREREQ(major, minor, patchlevel) 0 508fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org#endif 518fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 528fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 538fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 549259716434187c932704601f700375e53d865de8rossberg@chromium.org// ----------------------------------------------------------------------------- 559259716434187c932704601f700375e53d865de8rossberg@chromium.org// Operating system detection 569259716434187c932704601f700375e53d865de8rossberg@chromium.org// 579259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_OS_ANDROID - Android 589259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_OS_BSD - BSDish (Mac OS X, Net/Free/Open/DragonFlyBSD) 599259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_OS_CYGWIN - Cygwin 609259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_OS_DRAGONFLYBSD - DragonFlyBSD 619259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_OS_FREEBSD - FreeBSD 629259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_OS_LINUX - Linux 639259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_OS_MACOSX - Mac OS X 649259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_OS_NACL - Native Client 659259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_OS_NETBSD - NetBSD 669259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_OS_OPENBSD - OpenBSD 679259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_OS_POSIX - POSIX compatible (mostly everything except Windows) 689ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org// V8_OS_QNX - QNX Neutrino 699259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_OS_SOLARIS - Sun Solaris and OpenSolaris 709259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_OS_WIN - Microsoft Windows 719259716434187c932704601f700375e53d865de8rossberg@chromium.org 729259716434187c932704601f700375e53d865de8rossberg@chromium.org#if defined(__ANDROID__) 739259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_ANDROID 1 749259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_LINUX 1 759259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_POSIX 1 769259716434187c932704601f700375e53d865de8rossberg@chromium.org#elif defined(__APPLE__) 779259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_BSD 1 789259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_MACOSX 1 799259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_POSIX 1 809259716434187c932704601f700375e53d865de8rossberg@chromium.org#elif defined(__native_client__) 819259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_NACL 1 829259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_POSIX 1 839259716434187c932704601f700375e53d865de8rossberg@chromium.org#elif defined(__CYGWIN__) 849259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_CYGWIN 1 859259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_POSIX 1 869259716434187c932704601f700375e53d865de8rossberg@chromium.org#elif defined(__linux__) 879259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_LINUX 1 889259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_POSIX 1 899259716434187c932704601f700375e53d865de8rossberg@chromium.org#elif defined(__sun) 909259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_POSIX 1 919259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_SOLARIS 1 929259716434187c932704601f700375e53d865de8rossberg@chromium.org#elif defined(__FreeBSD__) 939259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_BSD 1 949259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_FREEBSD 1 959259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_POSIX 1 969259716434187c932704601f700375e53d865de8rossberg@chromium.org#elif defined(__DragonFly__) 979259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_BSD 1 989259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_DRAGONFLYBSD 1 999259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_POSIX 1 1009259716434187c932704601f700375e53d865de8rossberg@chromium.org#elif defined(__NetBSD__) 1019259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_BSD 1 1029259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_NETBSD 1 1039259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_POSIX 1 1049259716434187c932704601f700375e53d865de8rossberg@chromium.org#elif defined(__OpenBSD__) 1059259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_BSD 1 1069259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_OPENBSD 1 1079259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_POSIX 1 1089ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org#elif defined(__QNXNTO__) 1099ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org# define V8_OS_POSIX 1 1109ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org# define V8_OS_QNX 1 1119259716434187c932704601f700375e53d865de8rossberg@chromium.org#elif defined(_WIN32) 1129259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_OS_WIN 1 1139259716434187c932704601f700375e53d865de8rossberg@chromium.org#endif 1149259716434187c932704601f700375e53d865de8rossberg@chromium.org 1159259716434187c932704601f700375e53d865de8rossberg@chromium.org 1169259716434187c932704601f700375e53d865de8rossberg@chromium.org// ----------------------------------------------------------------------------- 1178fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// C library detection 1188fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// 11905150ab746caefd8e734c394ecc7863200ca04cfmachenbach@chromium.org// V8_LIBC_MSVCRT - MSVC libc 1208fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// V8_LIBC_BIONIC - Bionic libc 1218fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// V8_LIBC_BSD - BSD libc derivate 1228fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// V8_LIBC_GLIBC - GNU C library 1238fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// V8_LIBC_UCLIBC - uClibc 1248fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// 1258fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// Note that testing for libc must be done using #if not #ifdef. For example, 1268fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// to test for the GNU C library, use: 1278fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// #if V8_LIBC_GLIBC 1288fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// ... 1298fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// #endif 1308fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 13105150ab746caefd8e734c394ecc7863200ca04cfmachenbach@chromium.org#if defined (_MSC_VER) 13205150ab746caefd8e734c394ecc7863200ca04cfmachenbach@chromium.org# define V8_LIBC_MSVCRT 1 13305150ab746caefd8e734c394ecc7863200ca04cfmachenbach@chromium.org#elif defined(__BIONIC__) 1348fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org# define V8_LIBC_BIONIC 1 1358fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org# define V8_LIBC_BSD 1 1368fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org#elif defined(__UCLIBC__) 1378fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org# define V8_LIBC_UCLIBC 1 1388fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org#elif defined(__GLIBC__) || defined(__GNU_LIBRARY__) 1398fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org# define V8_LIBC_GLIBC 1 1408fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org#else 1418fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org# define V8_LIBC_BSD V8_OS_BSD 1428fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org#endif 1438fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 1448fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 1458fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// ----------------------------------------------------------------------------- 1469259716434187c932704601f700375e53d865de8rossberg@chromium.org// Compiler detection 1479259716434187c932704601f700375e53d865de8rossberg@chromium.org// 1489259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_CC_CLANG - Clang 1499259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_CC_GNU - GNU C++ 150662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_CC_INTEL - Intel C++ 1519259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_CC_MINGW - Minimalist GNU for Windows 152662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_CC_MINGW32 - Minimalist GNU for Windows (mingw32) 153662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_CC_MINGW64 - Minimalist GNU for Windows (mingw-w64) 1549259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_CC_MSVC - Microsoft Visual C/C++ 1559259716434187c932704601f700375e53d865de8rossberg@chromium.org// 1569259716434187c932704601f700375e53d865de8rossberg@chromium.org// C++11 feature detection 1579259716434187c932704601f700375e53d865de8rossberg@chromium.org// 1589259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_HAS_CXX11_ALIGNAS - alignas specifier supported 1591e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// V8_HAS_CXX11_ALIGNOF - alignof(type) operator supported 1609259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_HAS_CXX11_STATIC_ASSERT - static_assert() supported 1619259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_HAS_CXX11_DELETE - deleted functions supported 1629259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_HAS_CXX11_FINAL - final marker supported 1639259716434187c932704601f700375e53d865de8rossberg@chromium.org// V8_HAS_CXX11_OVERRIDE - override marker supported 1649259716434187c932704601f700375e53d865de8rossberg@chromium.org// 1659259716434187c932704601f700375e53d865de8rossberg@chromium.org// Compiler-specific feature detection 1669259716434187c932704601f700375e53d865de8rossberg@chromium.org// 167662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_HAS___ALIGNOF - __alignof(type) operator supported 168662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_HAS___ALIGNOF__ - __alignof__(type) operator supported 169662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_HAS_ATTRIBUTE_ALIGNED - __attribute__((aligned(n))) supported 170662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_HAS_ATTRIBUTE_ALWAYS_INLINE - __attribute__((always_inline)) 171662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// supported 172662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_HAS_ATTRIBUTE_DEPRECATED - __attribute__((deprecated)) supported 173662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_HAS_ATTRIBUTE_NOINLINE - __attribute__((noinline)) supported 1740cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org// V8_HAS_ATTRIBUTE_UNUSED - __attribute__((unused)) supported 175662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_HAS_ATTRIBUTE_VISIBILITY - __attribute__((visibility)) supported 176662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT - __attribute__((warn_unused_result)) 177662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// supported 178e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org// V8_HAS_BUILTIN_CLZ - __builtin_clz() supported 179e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org// V8_HAS_BUILTIN_CTZ - __builtin_ctz() supported 180662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_HAS_BUILTIN_EXPECT - __builtin_expect() supported 181e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org// V8_HAS_BUILTIN_POPCOUNT - __builtin_popcount() supported 1822c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org// V8_HAS_BUILTIN_SADD_OVERFLOW - __builtin_sadd_overflow() supported 1832c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org// V8_HAS_BUILTIN_SSUB_OVERFLOW - __builtin_ssub_overflow() supported 184662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_HAS_DECLSPEC_ALIGN - __declspec(align(n)) supported 185662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_HAS_DECLSPEC_DEPRECATED - __declspec(deprecated) supported 186662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_HAS_DECLSPEC_NOINLINE - __declspec(noinline) supported 187662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_HAS___FINAL - __final supported in non-C++11 mode 188662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_HAS___FORCEINLINE - __forceinline supported 189662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// V8_HAS_SEALED - MSVC style sealed marker supported 190662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// 191662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// Note that testing for compilers and/or features must be done using #if 192662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// not #ifdef. For example, to test for Intel C++ Compiler, use: 193662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// #if V8_CC_INTEL 194662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// ... 195662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// #endif 1969259716434187c932704601f700375e53d865de8rossberg@chromium.org 1979259716434187c932704601f700375e53d865de8rossberg@chromium.org#if defined(__clang__) 1989259716434187c932704601f700375e53d865de8rossberg@chromium.org 1999259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_CC_CLANG 1 2009259716434187c932704601f700375e53d865de8rossberg@chromium.org 2011e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Clang defines __alignof__ as alias for __alignof 2021e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_HAS___ALIGNOF 1 2031e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_HAS___ALIGNOF__ V8_HAS___ALIGNOF 2041e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2051e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_HAS_ATTRIBUTE_ALIGNED (__has_attribute(aligned)) 2069259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_ATTRIBUTE_ALWAYS_INLINE (__has_attribute(always_inline)) 2079259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_ATTRIBUTE_DEPRECATED (__has_attribute(deprecated)) 208662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org# define V8_HAS_ATTRIBUTE_NOINLINE (__has_attribute(noinline)) 2090cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org# define V8_HAS_ATTRIBUTE_UNUSED (__has_attribute(unused)) 2109259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_ATTRIBUTE_VISIBILITY (__has_attribute(visibility)) 211662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org# define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT \ 212662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org (__has_attribute(warn_unused_result)) 2139259716434187c932704601f700375e53d865de8rossberg@chromium.org 214e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org# define V8_HAS_BUILTIN_CLZ (__has_builtin(__builtin_clz)) 215e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org# define V8_HAS_BUILTIN_CTZ (__has_builtin(__builtin_ctz)) 2169259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_BUILTIN_EXPECT (__has_builtin(__builtin_expect)) 217e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org# define V8_HAS_BUILTIN_POPCOUNT (__has_builtin(__builtin_popcount)) 2182c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org# define V8_HAS_BUILTIN_SADD_OVERFLOW (__has_builtin(__builtin_sadd_overflow)) 2192c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org# define V8_HAS_BUILTIN_SSUB_OVERFLOW (__has_builtin(__builtin_ssub_overflow)) 2209259716434187c932704601f700375e53d865de8rossberg@chromium.org 2219259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_CXX11_ALIGNAS (__has_feature(cxx_alignas)) 2229259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_CXX11_STATIC_ASSERT (__has_feature(cxx_static_assert)) 2239259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_CXX11_DELETE (__has_feature(cxx_deleted_functions)) 2249259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_CXX11_FINAL (__has_feature(cxx_override_control)) 2259259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_CXX11_OVERRIDE (__has_feature(cxx_override_control)) 2269259716434187c932704601f700375e53d865de8rossberg@chromium.org 2279259716434187c932704601f700375e53d865de8rossberg@chromium.org#elif defined(__GNUC__) 2289259716434187c932704601f700375e53d865de8rossberg@chromium.org 2299259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_CC_GNU 1 230662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// Intel C++ also masquerades as GCC 3.2.0 231662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org# define V8_CC_INTEL (defined(__INTEL_COMPILER)) 232662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org# define V8_CC_MINGW32 (defined(__MINGW32__)) 233662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org# define V8_CC_MINGW64 (defined(__MINGW64__)) 234662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org# define V8_CC_MINGW (V8_CC_MINGW32 || V8_CC_MINGW64) 2359259716434187c932704601f700375e53d865de8rossberg@chromium.org 2361e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_HAS___ALIGNOF__ (V8_GNUC_PREREQ(4, 3, 0)) 2371e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_HAS_ATTRIBUTE_ALIGNED (V8_GNUC_PREREQ(2, 95, 0)) 2391e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// always_inline is available in gcc 4.0 but not very reliable until 4.4. 2401e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Works around "sorry, unimplemented: inlining failed" build errors with 2411e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// older compilers. 2421e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_HAS_ATTRIBUTE_ALWAYS_INLINE (V8_GNUC_PREREQ(4, 4, 0)) 2439259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_ATTRIBUTE_DEPRECATED (V8_GNUC_PREREQ(3, 4, 0)) 244c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org# define V8_HAS_ATTRIBUTE_DEPRECATED_MESSAGE (V8_GNUC_PREREQ(4, 5, 0)) 245662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org# define V8_HAS_ATTRIBUTE_NOINLINE (V8_GNUC_PREREQ(3, 4, 0)) 2460cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org# define V8_HAS_ATTRIBUTE_UNUSED (V8_GNUC_PREREQ(2, 95, 0)) 2479259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_ATTRIBUTE_VISIBILITY (V8_GNUC_PREREQ(4, 3, 0)) 248662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org# define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT \ 249662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org (!V8_CC_INTEL && V8_GNUC_PREREQ(4, 1, 0)) 2509259716434187c932704601f700375e53d865de8rossberg@chromium.org 251e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org# define V8_HAS_BUILTIN_CLZ (V8_GNUC_PREREQ(3, 4, 0)) 252e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org# define V8_HAS_BUILTIN_CTZ (V8_GNUC_PREREQ(3, 4, 0)) 2539259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_BUILTIN_EXPECT (V8_GNUC_PREREQ(2, 96, 0)) 254e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org# define V8_HAS_BUILTIN_POPCOUNT (V8_GNUC_PREREQ(3, 4, 0)) 2559259716434187c932704601f700375e53d865de8rossberg@chromium.org 2569259716434187c932704601f700375e53d865de8rossberg@chromium.org// g++ requires -std=c++0x or -std=gnu++0x to support C++11 functionality 2579259716434187c932704601f700375e53d865de8rossberg@chromium.org// without warnings (functionality used by the macros below). These modes 2589259716434187c932704601f700375e53d865de8rossberg@chromium.org// are detectable by checking whether __GXX_EXPERIMENTAL_CXX0X__ is defined or, 2599259716434187c932704601f700375e53d865de8rossberg@chromium.org// more standardly, by checking whether __cplusplus has a C++11 or greater 2609259716434187c932704601f700375e53d865de8rossberg@chromium.org// value. Current versions of g++ do not correctly set __cplusplus, so we check 2619259716434187c932704601f700375e53d865de8rossberg@chromium.org// both for forward compatibility. 2629259716434187c932704601f700375e53d865de8rossberg@chromium.org# if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L 2639259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_CXX11_ALIGNAS (V8_GNUC_PREREQ(4, 8, 0)) 2641e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_HAS_CXX11_ALIGNOF (V8_GNUC_PREREQ(4, 8, 0)) 2659259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_CXX11_STATIC_ASSERT (V8_GNUC_PREREQ(4, 3, 0)) 2669259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_CXX11_DELETE (V8_GNUC_PREREQ(4, 4, 0)) 2679259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_CXX11_OVERRIDE (V8_GNUC_PREREQ(4, 7, 0)) 2689259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_CXX11_FINAL (V8_GNUC_PREREQ(4, 7, 0)) 2699259716434187c932704601f700375e53d865de8rossberg@chromium.org# else 2709259716434187c932704601f700375e53d865de8rossberg@chromium.org// '__final' is a non-C++11 GCC synonym for 'final', per GCC r176655. 2719259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS___FINAL (V8_GNUC_PREREQ(4, 7, 0)) 2729259716434187c932704601f700375e53d865de8rossberg@chromium.org# endif 2739259716434187c932704601f700375e53d865de8rossberg@chromium.org 2749259716434187c932704601f700375e53d865de8rossberg@chromium.org#elif defined(_MSC_VER) 2759259716434187c932704601f700375e53d865de8rossberg@chromium.org 2769259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_CC_MSVC 1 2779259716434187c932704601f700375e53d865de8rossberg@chromium.org 2781e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_HAS___ALIGNOF 1 2791e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2809259716434187c932704601f700375e53d865de8rossberg@chromium.org// Override control was added with Visual Studio 2005, but 2819259716434187c932704601f700375e53d865de8rossberg@chromium.org// Visual Studio 2010 and earlier spell "final" as "sealed". 2829259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_CXX11_FINAL (_MSC_VER >= 1700) 2839259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_CXX11_OVERRIDE (_MSC_VER >= 1400) 2849259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_SEALED (_MSC_VER >= 1400) 2859259716434187c932704601f700375e53d865de8rossberg@chromium.org 2869259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_DECLSPEC_ALIGN 1 2879259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS_DECLSPEC_DEPRECATED (_MSC_VER >= 1300) 288662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org# define V8_HAS_DECLSPEC_NOINLINE 1 2899259716434187c932704601f700375e53d865de8rossberg@chromium.org 2909259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_HAS___FORCEINLINE 1 2919259716434187c932704601f700375e53d865de8rossberg@chromium.org 2929259716434187c932704601f700375e53d865de8rossberg@chromium.org#endif 2939259716434187c932704601f700375e53d865de8rossberg@chromium.org 2949259716434187c932704601f700375e53d865de8rossberg@chromium.org 2959259716434187c932704601f700375e53d865de8rossberg@chromium.org// ----------------------------------------------------------------------------- 2969259716434187c932704601f700375e53d865de8rossberg@chromium.org// Helper macros 2979259716434187c932704601f700375e53d865de8rossberg@chromium.org 2989259716434187c932704601f700375e53d865de8rossberg@chromium.org// A macro used to make better inlining. Don't bother for debug builds. 2994a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org// Use like: 3004a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org// V8_INLINE int GetZero() { return 0; } 3019259716434187c932704601f700375e53d865de8rossberg@chromium.org#if !defined(DEBUG) && V8_HAS_ATTRIBUTE_ALWAYS_INLINE 3024a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org# define V8_INLINE inline __attribute__((always_inline)) 3039259716434187c932704601f700375e53d865de8rossberg@chromium.org#elif !defined(DEBUG) && V8_HAS___FORCEINLINE 3044a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org# define V8_INLINE __forceinline 3059259716434187c932704601f700375e53d865de8rossberg@chromium.org#else 3064a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org# define V8_INLINE inline 3079259716434187c932704601f700375e53d865de8rossberg@chromium.org#endif 3089259716434187c932704601f700375e53d865de8rossberg@chromium.org 3099259716434187c932704601f700375e53d865de8rossberg@chromium.org 310662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// A macro used to tell the compiler to never inline a particular function. 311662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org// Don't bother for debug builds. 3124a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org// Use like: 3134a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org// V8_NOINLINE int GetMinusOne() { return -1; } 314662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org#if !defined(DEBUG) && V8_HAS_ATTRIBUTE_NOINLINE 3154a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org# define V8_NOINLINE __attribute__((noinline)) 316662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org#elif !defined(DEBUG) && V8_HAS_DECLSPEC_NOINLINE 3174a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org# define V8_NOINLINE __declspec(noinline) 318662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org#else 3194a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org# define V8_NOINLINE /* NOT SUPPORTED */ 320662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org#endif 321662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 322662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 3239259716434187c932704601f700375e53d865de8rossberg@chromium.org// A macro to mark classes or functions as deprecated. 324c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org#if defined(V8_DEPRECATION_WARNINGS) && V8_HAS_ATTRIBUTE_DEPRECATED_MESSAGE 325c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org# define V8_DEPRECATED(message, declarator) \ 326c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgdeclarator __attribute__((deprecated(message))) 327c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org#elif defined(V8_DEPRECATION_WARNINGS) && V8_HAS_ATTRIBUTE_DEPRECATED 328c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org# define V8_DEPRECATED(message, declarator) \ 329c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgdeclarator __attribute__((deprecated)) 330c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org#elif defined(V8_DEPRECATION_WARNINGS) && V8_HAS_DECLSPEC_DEPRECATED 331c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org# define V8_DEPRECATED(message, declarator) __declspec(deprecated) declarator 3329259716434187c932704601f700375e53d865de8rossberg@chromium.org#else 333c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org# define V8_DEPRECATED(message, declarator) declarator 3349259716434187c932704601f700375e53d865de8rossberg@chromium.org#endif 3359259716434187c932704601f700375e53d865de8rossberg@chromium.org 3369259716434187c932704601f700375e53d865de8rossberg@chromium.org 3379259716434187c932704601f700375e53d865de8rossberg@chromium.org// A macro to provide the compiler with branch prediction information. 3389259716434187c932704601f700375e53d865de8rossberg@chromium.org#if V8_HAS_BUILTIN_EXPECT 3399259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_UNLIKELY(condition) (__builtin_expect(!!(condition), 0)) 3409259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_LIKELY(condition) (__builtin_expect(!!(condition), 1)) 3419259716434187c932704601f700375e53d865de8rossberg@chromium.org#else 3429259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_UNLIKELY(condition) (condition) 3439259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_LIKELY(condition) (condition) 3449259716434187c932704601f700375e53d865de8rossberg@chromium.org#endif 3459259716434187c932704601f700375e53d865de8rossberg@chromium.org 3469259716434187c932704601f700375e53d865de8rossberg@chromium.org 3479259716434187c932704601f700375e53d865de8rossberg@chromium.org// A macro to specify that a method is deleted from the corresponding class. 3489259716434187c932704601f700375e53d865de8rossberg@chromium.org// Any attempt to use the method will always produce an error at compile time 3499259716434187c932704601f700375e53d865de8rossberg@chromium.org// when this macro can be implemented (i.e. if the compiler supports C++11). 3509259716434187c932704601f700375e53d865de8rossberg@chromium.org// If the current compiler does not support C++11, use of the annotated method 3519259716434187c932704601f700375e53d865de8rossberg@chromium.org// will still cause an error, but the error will most likely occur at link time 3529259716434187c932704601f700375e53d865de8rossberg@chromium.org// rather than at compile time. As a backstop, method declarations using this 3539259716434187c932704601f700375e53d865de8rossberg@chromium.org// macro should be private. 3549259716434187c932704601f700375e53d865de8rossberg@chromium.org// Use like: 3559259716434187c932704601f700375e53d865de8rossberg@chromium.org// class A { 3569259716434187c932704601f700375e53d865de8rossberg@chromium.org// private: 3579259716434187c932704601f700375e53d865de8rossberg@chromium.org// A(const A& other) V8_DELETE; 3589259716434187c932704601f700375e53d865de8rossberg@chromium.org// A& operator=(const A& other) V8_DELETE; 3599259716434187c932704601f700375e53d865de8rossberg@chromium.org// }; 3609259716434187c932704601f700375e53d865de8rossberg@chromium.org#if V8_HAS_CXX11_DELETE 3619259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_DELETE = delete 3629259716434187c932704601f700375e53d865de8rossberg@chromium.org#else 3639259716434187c932704601f700375e53d865de8rossberg@chromium.org# define V8_DELETE /* NOT SUPPORTED */ 3649259716434187c932704601f700375e53d865de8rossberg@chromium.org#endif 3659259716434187c932704601f700375e53d865de8rossberg@chromium.org 3669259716434187c932704601f700375e53d865de8rossberg@chromium.org 3679259716434187c932704601f700375e53d865de8rossberg@chromium.org// This macro allows to specify memory alignment for structs, classes, etc. 3689259716434187c932704601f700375e53d865de8rossberg@chromium.org// Use like: 3691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// class V8_ALIGNED(16) MyClass { ... }; 3701e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// V8_ALIGNED(32) int array[42]; 3719259716434187c932704601f700375e53d865de8rossberg@chromium.org#if V8_HAS_CXX11_ALIGNAS 3721e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_ALIGNED(n) alignas(n) 3731e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#elif V8_HAS_ATTRIBUTE_ALIGNED 3741e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_ALIGNED(n) __attribute__((aligned(n))) 3759259716434187c932704601f700375e53d865de8rossberg@chromium.org#elif V8_HAS_DECLSPEC_ALIGN 3761e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_ALIGNED(n) __declspec(align(n)) 3771e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#else 3781e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_ALIGNED(n) /* NOT SUPPORTED */ 3791e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#endif 3801e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 3811e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 3821e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// This macro is similar to V8_ALIGNED(), but takes a type instead of size 3831e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// in bytes. If the compiler does not supports using the alignment of the 3841e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// |type|, it will align according to the |alignment| instead. For example, 3851e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Visual Studio C++ cannot combine __declspec(align) and __alignof. The 3861e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// |alignment| must be a literal that is used as a kind of worst-case fallback 3871e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// alignment. 3881e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Use like: 3891e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// struct V8_ALIGNAS(AnotherClass, 16) NewClass { ... }; 3901e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// V8_ALIGNAS(double, 8) int array[100]; 3911e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#if V8_HAS_CXX11_ALIGNAS 3921e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_ALIGNAS(type, alignment) alignas(type) 3931e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#elif V8_HAS___ALIGNOF__ && V8_HAS_ATTRIBUTE_ALIGNED 3941e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_ALIGNAS(type, alignment) __attribute__((aligned(__alignof__(type)))) 3951e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#else 3961e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_ALIGNAS(type, alignment) V8_ALIGNED(alignment) 3971e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#endif 3981e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 3991e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 4001e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// This macro returns alignment in bytes (an integer power of two) required for 4011e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// any instance of the given type, which is either complete type, an array type, 4021e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// or a reference type. 4031e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Use like: 4041e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// size_t alignment = V8_ALIGNOF(double); 4051e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#if V8_HAS_CXX11_ALIGNOF 4061e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_ALIGNOF(type) alignof(type) 4071e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#elif V8_HAS___ALIGNOF 4081e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_ALIGNOF(type) __alignof(type) 4091e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org#elif V8_HAS___ALIGNOF__ 4101e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_ALIGNOF(type) __alignof__(type) 4119259716434187c932704601f700375e53d865de8rossberg@chromium.org#else 4121e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Note that alignment of a type within a struct can be less than the 4131e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// alignment of the type stand-alone (because of ancient ABIs), so this 4141e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// should only be used as a last resort. 4151e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgnamespace v8 { template <typename T> class AlignOfHelper { char c; T t; }; } 4161e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org# define V8_ALIGNOF(type) (sizeof(::v8::AlignOfHelper<type>) - sizeof(type)) 4179259716434187c932704601f700375e53d865de8rossberg@chromium.org#endif 4189259716434187c932704601f700375e53d865de8rossberg@chromium.org 4199259716434187c932704601f700375e53d865de8rossberg@chromium.org#endif // V8CONFIG_H_ 420