OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 10 matching lines...) Expand all Loading... |
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | 27 |
28 #ifndef V8CONFIG_H_ | 28 #ifndef V8CONFIG_H_ |
29 #define V8CONFIG_H_ | 29 #define V8CONFIG_H_ |
30 | 30 |
| 31 // Platform headers for feature detection below. |
| 32 #if defined(__ANDROID__) |
| 33 # include <sys/cdefs.h> |
| 34 #elif defined(__APPLE__) |
| 35 # include <TargetConditions.h> |
| 36 #elif defined(__linux__) |
| 37 # include <features.h> |
| 38 #endif |
| 39 |
| 40 |
| 41 // This macro allows to test for the version of the GNU C library (or |
| 42 // a compatible C library that masquerades as glibc). It evaluates to |
| 43 // 0 if libc is not GNU libc or compatible. |
| 44 // Use like: |
| 45 // #if V8_GLIBC_PREREQ(2, 3) |
| 46 // ... |
| 47 // #endif |
| 48 #if defined(__GLIBC__) && defined(__GLIBC_MINOR__) |
| 49 # define V8_GLIBC_PREREQ(major, minor) \ |
| 50 ((__GLIBC__ * 100 + __GLIBC_MINOR__) >= ((major) * 100 + (minor))) |
| 51 #else |
| 52 # define V8_GLIBC_PREREQ(major, minor) 0 |
| 53 #endif |
| 54 |
| 55 |
| 56 // This macro allows to test for the version of the GNU C++ compiler. |
| 57 // Note that this also applies to compilers that masquerade as GCC, |
| 58 // for example clang and the Intel C++ compiler for Linux. |
| 59 // Use like: |
| 60 // #if V8_GNUC_PREREQ(4, 3, 1) |
| 61 // ... |
| 62 // #endif |
| 63 #if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) |
| 64 # define V8_GNUC_PREREQ(major, minor, patchlevel) \ |
| 65 ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= \ |
| 66 ((major) * 10000 + (minor) * 100 + (patchlevel))) |
| 67 #elif defined(__GNUC__) && defined(__GNUC_MINOR__) |
| 68 # define V8_GNUC_PREREQ(major, minor, patchlevel) \ |
| 69 ((__GNUC__ * 10000 + __GNUC_MINOR__) >= \ |
| 70 ((major) * 10000 + (minor) * 100 + (patchlevel))) |
| 71 #else |
| 72 # define V8_GNUC_PREREQ(major, minor, patchlevel) 0 |
| 73 #endif |
| 74 |
| 75 |
| 76 |
31 // ----------------------------------------------------------------------------- | 77 // ----------------------------------------------------------------------------- |
32 // Operating system detection | 78 // Operating system detection |
33 // | 79 // |
34 // V8_OS_ANDROID - Android | 80 // V8_OS_ANDROID - Android |
35 // V8_OS_BSD - BSDish (Mac OS X, Net/Free/Open/DragonFlyBSD) | 81 // V8_OS_BSD - BSDish (Mac OS X, Net/Free/Open/DragonFlyBSD) |
36 // V8_OS_CYGWIN - Cygwin | 82 // V8_OS_CYGWIN - Cygwin |
37 // V8_OS_DRAGONFLYBSD - DragonFlyBSD | 83 // V8_OS_DRAGONFLYBSD - DragonFlyBSD |
38 // V8_OS_FREEBSD - FreeBSD | 84 // V8_OS_FREEBSD - FreeBSD |
39 // V8_OS_LINUX - Linux | 85 // V8_OS_LINUX - Linux |
40 // V8_OS_MACOSX - Mac OS X | 86 // V8_OS_MACOSX - Mac OS X |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 #elif defined(__OpenBSD__) | 126 #elif defined(__OpenBSD__) |
81 # define V8_OS_BSD 1 | 127 # define V8_OS_BSD 1 |
82 # define V8_OS_OPENBSD 1 | 128 # define V8_OS_OPENBSD 1 |
83 # define V8_OS_POSIX 1 | 129 # define V8_OS_POSIX 1 |
84 #elif defined(_WIN32) | 130 #elif defined(_WIN32) |
85 # define V8_OS_WIN 1 | 131 # define V8_OS_WIN 1 |
86 #endif | 132 #endif |
87 | 133 |
88 | 134 |
89 // ----------------------------------------------------------------------------- | 135 // ----------------------------------------------------------------------------- |
| 136 // C library detection |
| 137 // |
| 138 // V8_LIBC_BIONIC - Bionic libc |
| 139 // V8_LIBC_BSD - BSD libc derivate |
| 140 // V8_LIBC_GLIBC - GNU C library |
| 141 // V8_LIBC_UCLIBC - uClibc |
| 142 // |
| 143 // Note that testing for libc must be done using #if not #ifdef. For example, |
| 144 // to test for the GNU C library, use: |
| 145 // #if V8_LIBC_GLIBC |
| 146 // ... |
| 147 // #endif |
| 148 |
| 149 #if defined(__BIONIC__) |
| 150 # define V8_LIBC_BIONIC 1 |
| 151 # define V8_LIBC_BSD 1 |
| 152 #elif defined(__UCLIBC__) |
| 153 # define V8_LIBC_UCLIBC 1 |
| 154 #elif defined(__GLIBC__) || defined(__GNU_LIBRARY__) |
| 155 # define V8_LIBC_GLIBC 1 |
| 156 #else |
| 157 # define V8_LIBC_BSD V8_OS_BSD |
| 158 #endif |
| 159 |
| 160 |
| 161 // ----------------------------------------------------------------------------- |
90 // Compiler detection | 162 // Compiler detection |
91 // | 163 // |
92 // V8_CC_CLANG - Clang | 164 // V8_CC_CLANG - Clang |
93 // V8_CC_GNU - GNU C++ | 165 // V8_CC_GNU - GNU C++ |
94 // V8_CC_INTEL - Intel C++ | 166 // V8_CC_INTEL - Intel C++ |
95 // V8_CC_MINGW - Minimalist GNU for Windows | 167 // V8_CC_MINGW - Minimalist GNU for Windows |
96 // V8_CC_MINGW32 - Minimalist GNU for Windows (mingw32) | 168 // V8_CC_MINGW32 - Minimalist GNU for Windows (mingw32) |
97 // V8_CC_MINGW64 - Minimalist GNU for Windows (mingw-w64) | 169 // V8_CC_MINGW64 - Minimalist GNU for Windows (mingw-w64) |
98 // V8_CC_MSVC - Microsoft Visual C/C++ | 170 // V8_CC_MSVC - Microsoft Visual C/C++ |
99 // | 171 // |
(...skipping 27 matching lines...) Expand all Loading... |
127 // V8_HAS_SEALED - MSVC style sealed marker supported | 199 // V8_HAS_SEALED - MSVC style sealed marker supported |
128 // | 200 // |
129 // Note that testing for compilers and/or features must be done using #if | 201 // Note that testing for compilers and/or features must be done using #if |
130 // not #ifdef. For example, to test for Intel C++ Compiler, use: | 202 // not #ifdef. For example, to test for Intel C++ Compiler, use: |
131 // #if V8_CC_INTEL | 203 // #if V8_CC_INTEL |
132 // ... | 204 // ... |
133 // #endif | 205 // #endif |
134 | 206 |
135 #if defined(__clang__) | 207 #if defined(__clang__) |
136 | 208 |
137 // Don't treat clang as GCC. | |
138 # define V8_GNUC_PREREQ(major, minor, patchlevel) 0 | |
139 | |
140 # define V8_CC_CLANG 1 | 209 # define V8_CC_CLANG 1 |
141 | 210 |
142 // Clang defines __alignof__ as alias for __alignof | 211 // Clang defines __alignof__ as alias for __alignof |
143 # define V8_HAS___ALIGNOF 1 | 212 # define V8_HAS___ALIGNOF 1 |
144 # define V8_HAS___ALIGNOF__ V8_HAS___ALIGNOF | 213 # define V8_HAS___ALIGNOF__ V8_HAS___ALIGNOF |
145 | 214 |
146 # define V8_HAS_ATTRIBUTE_ALIGNED (__has_attribute(aligned)) | 215 # define V8_HAS_ATTRIBUTE_ALIGNED (__has_attribute(aligned)) |
147 # define V8_HAS_ATTRIBUTE_ALWAYS_INLINE (__has_attribute(always_inline)) | 216 # define V8_HAS_ATTRIBUTE_ALWAYS_INLINE (__has_attribute(always_inline)) |
148 # define V8_HAS_ATTRIBUTE_DEPRECATED (__has_attribute(deprecated)) | 217 # define V8_HAS_ATTRIBUTE_DEPRECATED (__has_attribute(deprecated)) |
149 # define V8_HAS_ATTRIBUTE_NOINLINE (__has_attribute(noinline)) | 218 # define V8_HAS_ATTRIBUTE_NOINLINE (__has_attribute(noinline)) |
150 # define V8_HAS_ATTRIBUTE_VISIBILITY (__has_attribute(visibility)) | 219 # define V8_HAS_ATTRIBUTE_VISIBILITY (__has_attribute(visibility)) |
151 # define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT \ | 220 # define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT \ |
152 (__has_attribute(warn_unused_result)) | 221 (__has_attribute(warn_unused_result)) |
153 | 222 |
154 # define V8_HAS_BUILTIN_EXPECT (__has_builtin(__builtin_expect)) | 223 # define V8_HAS_BUILTIN_EXPECT (__has_builtin(__builtin_expect)) |
155 | 224 |
156 # define V8_HAS_CXX11_ALIGNAS (__has_feature(cxx_alignas)) | 225 # define V8_HAS_CXX11_ALIGNAS (__has_feature(cxx_alignas)) |
157 # define V8_HAS_CXX11_STATIC_ASSERT (__has_feature(cxx_static_assert)) | 226 # define V8_HAS_CXX11_STATIC_ASSERT (__has_feature(cxx_static_assert)) |
158 # define V8_HAS_CXX11_DELETE (__has_feature(cxx_deleted_functions)) | 227 # define V8_HAS_CXX11_DELETE (__has_feature(cxx_deleted_functions)) |
159 # define V8_HAS_CXX11_FINAL (__has_feature(cxx_override_control)) | 228 # define V8_HAS_CXX11_FINAL (__has_feature(cxx_override_control)) |
160 # define V8_HAS_CXX11_OVERRIDE (__has_feature(cxx_override_control)) | 229 # define V8_HAS_CXX11_OVERRIDE (__has_feature(cxx_override_control)) |
161 | 230 |
162 #elif defined(__GNUC__) | 231 #elif defined(__GNUC__) |
163 | 232 |
164 # define V8_GNUC_PREREQ(major, minor, patchlevel) \ | |
165 ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= \ | |
166 ((major) * 10000 + (minor) * 100 + (patchlevel))) | |
167 | |
168 # define V8_CC_GNU 1 | 233 # define V8_CC_GNU 1 |
169 // Intel C++ also masquerades as GCC 3.2.0 | 234 // Intel C++ also masquerades as GCC 3.2.0 |
170 # define V8_CC_INTEL (defined(__INTEL_COMPILER)) | 235 # define V8_CC_INTEL (defined(__INTEL_COMPILER)) |
171 # define V8_CC_MINGW32 (defined(__MINGW32__)) | 236 # define V8_CC_MINGW32 (defined(__MINGW32__)) |
172 # define V8_CC_MINGW64 (defined(__MINGW64__)) | 237 # define V8_CC_MINGW64 (defined(__MINGW64__)) |
173 # define V8_CC_MINGW (V8_CC_MINGW32 || V8_CC_MINGW64) | 238 # define V8_CC_MINGW (V8_CC_MINGW32 || V8_CC_MINGW64) |
174 | 239 |
175 # define V8_HAS___ALIGNOF__ (V8_GNUC_PREREQ(4, 3, 0)) | 240 # define V8_HAS___ALIGNOF__ (V8_GNUC_PREREQ(4, 3, 0)) |
176 | 241 |
177 # define V8_HAS_ATTRIBUTE_ALIGNED (V8_GNUC_PREREQ(2, 95, 0)) | 242 # define V8_HAS_ATTRIBUTE_ALIGNED (V8_GNUC_PREREQ(2, 95, 0)) |
(...skipping 22 matching lines...) Expand all Loading... |
200 # define V8_HAS_CXX11_DELETE (V8_GNUC_PREREQ(4, 4, 0)) | 265 # define V8_HAS_CXX11_DELETE (V8_GNUC_PREREQ(4, 4, 0)) |
201 # define V8_HAS_CXX11_OVERRIDE (V8_GNUC_PREREQ(4, 7, 0)) | 266 # define V8_HAS_CXX11_OVERRIDE (V8_GNUC_PREREQ(4, 7, 0)) |
202 # define V8_HAS_CXX11_FINAL (V8_GNUC_PREREQ(4, 7, 0)) | 267 # define V8_HAS_CXX11_FINAL (V8_GNUC_PREREQ(4, 7, 0)) |
203 # else | 268 # else |
204 // '__final' is a non-C++11 GCC synonym for 'final', per GCC r176655. | 269 // '__final' is a non-C++11 GCC synonym for 'final', per GCC r176655. |
205 # define V8_HAS___FINAL (V8_GNUC_PREREQ(4, 7, 0)) | 270 # define V8_HAS___FINAL (V8_GNUC_PREREQ(4, 7, 0)) |
206 # endif | 271 # endif |
207 | 272 |
208 #elif defined(_MSC_VER) | 273 #elif defined(_MSC_VER) |
209 | 274 |
210 # define V8_GNUC_PREREQ(major, minor, patchlevel) 0 | |
211 | |
212 # define V8_CC_MSVC 1 | 275 # define V8_CC_MSVC 1 |
213 | 276 |
214 # define V8_HAS___ALIGNOF 1 | 277 # define V8_HAS___ALIGNOF 1 |
215 | 278 |
216 // Override control was added with Visual Studio 2005, but | 279 // Override control was added with Visual Studio 2005, but |
217 // Visual Studio 2010 and earlier spell "final" as "sealed". | 280 // Visual Studio 2010 and earlier spell "final" as "sealed". |
218 # define V8_HAS_CXX11_FINAL (_MSC_VER >= 1700) | 281 # define V8_HAS_CXX11_FINAL (_MSC_VER >= 1700) |
219 # define V8_HAS_CXX11_OVERRIDE (_MSC_VER >= 1400) | 282 # define V8_HAS_CXX11_OVERRIDE (_MSC_VER >= 1400) |
220 # define V8_HAS_SEALED (_MSC_VER >= 1400) | 283 # define V8_HAS_SEALED (_MSC_VER >= 1400) |
221 | 284 |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 # define V8_ALIGNOF(type) __alignof__(type) | 438 # define V8_ALIGNOF(type) __alignof__(type) |
376 #else | 439 #else |
377 // Note that alignment of a type within a struct can be less than the | 440 // Note that alignment of a type within a struct can be less than the |
378 // alignment of the type stand-alone (because of ancient ABIs), so this | 441 // alignment of the type stand-alone (because of ancient ABIs), so this |
379 // should only be used as a last resort. | 442 // should only be used as a last resort. |
380 namespace v8 { template <typename T> class AlignOfHelper { char c; T t; }; } | 443 namespace v8 { template <typename T> class AlignOfHelper { char c; T t; }; } |
381 # define V8_ALIGNOF(type) (sizeof(::v8::AlignOfHelper<type>) - sizeof(type)) | 444 # define V8_ALIGNOF(type) (sizeof(::v8::AlignOfHelper<type>) - sizeof(type)) |
382 #endif | 445 #endif |
383 | 446 |
384 #endif // V8CONFIG_H_ | 447 #endif // V8CONFIG_H_ |
OLD | NEW |