| Index: include/v8config.h
|
| diff --git a/include/v8config.h b/include/v8config.h
|
| index aa24eebff50bb193543295723c9195ece613b8ec..25eb480eb164995d05fded158b126258ceb8fcd0 100644
|
| --- a/include/v8config.h
|
| +++ b/include/v8config.h
|
| @@ -97,6 +97,7 @@
|
| // C++11 feature detection
|
| //
|
| // V8_HAS_CXX11_ALIGNAS - alignas specifier supported
|
| +// V8_HAS_CXX11_ALIGNOF - alignof(type) operator supported
|
| // V8_HAS_CXX11_STATIC_ASSERT - static_assert() supported
|
| // V8_HAS_CXX11_DELETE - deleted functions supported
|
| // V8_HAS_CXX11_FINAL - final marker supported
|
| @@ -104,7 +105,9 @@
|
| //
|
| // Compiler-specific feature detection
|
| //
|
| -// V8_HAS_ATTRIBUTE___ALIGNED__ - __attribute__((__aligned__(n))) supported
|
| +// V8_HAS___ALIGNOF - __alignof(type) operator supported
|
| +// V8_HAS___ALIGNOF__ - __alignof__(type) operator supported
|
| +// V8_HAS_ATTRIBUTE_ALIGNED - __attribute__((aligned(n))) supported
|
| // V8_HAS_ATTRIBUTE_ALWAYS_INLINE - __attribute__((always_inline)) supported
|
| // V8_HAS_ATTRIBUTE_DEPRECATED - __attribute__((deprecated)) supported
|
| // V8_HAS_ATTRIBUTE_VISIBILITY - __attribute__((visibility)) supported
|
| @@ -122,7 +125,11 @@
|
|
|
| # define V8_CC_CLANG 1
|
|
|
| -# define V8_HAS_ATTRIBUTE___ALIGNED__ (__has_attribute(__aligned__))
|
| +// Clang defines __alignof__ as alias for __alignof
|
| +# define V8_HAS___ALIGNOF 1
|
| +# define V8_HAS___ALIGNOF__ V8_HAS___ALIGNOF
|
| +
|
| +# define V8_HAS_ATTRIBUTE_ALIGNED (__has_attribute(aligned))
|
| # define V8_HAS_ATTRIBUTE_ALWAYS_INLINE (__has_attribute(always_inline))
|
| # define V8_HAS_ATTRIBUTE_DEPRECATED (__has_attribute(deprecated))
|
| # define V8_HAS_ATTRIBUTE_VISIBILITY (__has_attribute(visibility))
|
| @@ -146,7 +153,9 @@
|
| # define V8_CC_MINGW 1
|
| # endif
|
|
|
| -# define V8_HAS_ATTRIBUTE___ALIGNED__ (V8_GNUC_PREREQ(2, 95, 0))
|
| +# define V8_HAS___ALIGNOF__ (V8_GNUC_PREREQ(4, 3, 0))
|
| +
|
| +# define V8_HAS_ATTRIBUTE_ALIGNED (V8_GNUC_PREREQ(2, 95, 0))
|
| // 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.
|
| @@ -164,6 +173,7 @@
|
| // both for forward compatibility.
|
| # if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L
|
| # define V8_HAS_CXX11_ALIGNAS (V8_GNUC_PREREQ(4, 8, 0))
|
| +# define V8_HAS_CXX11_ALIGNOF (V8_GNUC_PREREQ(4, 8, 0))
|
| # define V8_HAS_CXX11_STATIC_ASSERT (V8_GNUC_PREREQ(4, 3, 0))
|
| # define V8_HAS_CXX11_DELETE (V8_GNUC_PREREQ(4, 4, 0))
|
| # define V8_HAS_CXX11_OVERRIDE (V8_GNUC_PREREQ(4, 7, 0))
|
| @@ -179,6 +189,8 @@
|
|
|
| # define V8_CC_MSVC 1
|
|
|
| +# define V8_HAS___ALIGNOF 1
|
| +
|
| // Override control was added with Visual Studio 2005, but
|
| // Visual Studio 2010 and earlier spell "final" as "sealed".
|
| # define V8_HAS_CXX11_FINAL (_MSC_VER >= 1700)
|
| @@ -275,16 +287,54 @@
|
|
|
| // This macro allows to specify memory alignment for structs, classes, etc.
|
| // Use like:
|
| -// class V8_ALIGNAS(16) MyClass { ... };
|
| -// V8_ALIGNAS(32) int array[42];
|
| +// class V8_ALIGNED(16) MyClass { ... };
|
| +// V8_ALIGNED(32) int array[42];
|
| #if V8_HAS_CXX11_ALIGNAS
|
| -# define V8_ALIGNAS(n) alignas(n)
|
| -#elif V8_HAS_ATTRIBUTE___ALIGNED__
|
| -# define V8_ALIGNAS(n) __attribute__((__aligned__(n)))
|
| +# define V8_ALIGNED(n) alignas(n)
|
| +#elif V8_HAS_ATTRIBUTE_ALIGNED
|
| +# define V8_ALIGNED(n) __attribute__((aligned(n)))
|
| #elif V8_HAS_DECLSPEC_ALIGN
|
| -# define V8_ALIGNAS(n) __declspec(align(n))
|
| +# define V8_ALIGNED(n) __declspec(align(n))
|
| +#else
|
| +# define V8_ALIGNED(n) /* NOT SUPPORTED */
|
| +#endif
|
| +
|
| +
|
| +// This macro is similar to V8_ALIGNED(), but takes a type instead of size
|
| +// in bytes. If the compiler does not supports using the alignment of the
|
| +// |type|, it will align according to the |alignment| instead. For example,
|
| +// Visual Studio C++ cannot combine __declspec(align) and __alignof. The
|
| +// |alignment| must be a literal that is used as a kind of worst-case fallback
|
| +// alignment.
|
| +// Use like:
|
| +// struct V8_ALIGNAS(AnotherClass, 16) NewClass { ... };
|
| +// V8_ALIGNAS(double, 8) int array[100];
|
| +#if V8_HAS_CXX11_ALIGNAS
|
| +# define V8_ALIGNAS(type, alignment) alignas(type)
|
| +#elif V8_HAS___ALIGNOF__ && V8_HAS_ATTRIBUTE_ALIGNED
|
| +# define V8_ALIGNAS(type, alignment) __attribute__((aligned(__alignof__(type))))
|
| +#else
|
| +# define V8_ALIGNAS(type, alignment) V8_ALIGNED(alignment)
|
| +#endif
|
| +
|
| +
|
| +// This macro returns alignment in bytes (an integer power of two) required for
|
| +// any instance of the given type, which is either complete type, an array type,
|
| +// or a reference type.
|
| +// Use like:
|
| +// size_t alignment = V8_ALIGNOF(double);
|
| +#if V8_HAS_CXX11_ALIGNOF
|
| +# define V8_ALIGNOF(type) alignof(type)
|
| +#elif V8_HAS___ALIGNOF
|
| +# define V8_ALIGNOF(type) __alignof(type)
|
| +#elif V8_HAS___ALIGNOF__
|
| +# define V8_ALIGNOF(type) __alignof__(type)
|
| #else
|
| -# define V8_ALIGNAS(n) /* NOT SUPPORTED */
|
| +// Note that alignment of a type within a struct can be less than the
|
| +// alignment of the type stand-alone (because of ancient ABIs), so this
|
| +// should only be used as a last resort.
|
| +namespace v8 { template <typename T> class AlignOfHelper { char c; T t; }; }
|
| +# define V8_ALIGNOF(type) (sizeof(::v8::AlignOfHelper<type>) - sizeof(type))
|
| #endif
|
|
|
| #endif // V8CONFIG_H_
|
|
|