/src/node/deps/v8/include/v8config.h
Line  | Count  | Source  | 
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  |  | // gcc 10 defines __cplusplus to "an unspecified value strictly larger than  | 
9  |  | // 201703L" for its experimental -std=gnu++2a config.  | 
10  |  | // TODO(leszeks): Change to `__cplusplus <= 202002L` once we only support  | 
11  |  | // compilers with full C++20 support.  | 
12  |  | #if __cplusplus <= 201703L  | 
13  |  | #error "C++20 or later required."  | 
14  |  | #endif  | 
15  |  |  | 
16  |  | #ifdef V8_GN_HEADER  | 
17  |  | #if !__has_include("v8-gn.h") | 
18  |  | #error Missing v8-gn.h. The configuration for v8 is missing from the include \  | 
19  |  | path. Add it with -I<path> to the command line  | 
20  |  | #endif  | 
21  |  | #include "v8-gn.h"  // NOLINT(build/include_directory)  | 
22  |  | #endif  | 
23  |  |  | 
24  |  | #include <memory>  | 
25  |  | // clang-format off  | 
26  |  |  | 
27  |  | // Platform headers for feature detection below.  | 
28  |  | #if defined(__ANDROID__)  | 
29  |  | # include <sys/cdefs.h>  | 
30  |  | #elif defined(__APPLE__)  | 
31  |  | # include <TargetConditionals.h>  | 
32  |  | #elif defined(__linux__)  | 
33  |  | # include <features.h>  | 
34  |  | #elif defined(__MVS__)  | 
35  |  | # include "zos-base.h"  | 
36  |  | #endif  | 
37  |  |  | 
38  |  |  | 
39  |  | // This macro allows to test for the version of the GNU C library (or  | 
40  |  | // a compatible C library that masquerades as glibc). It evaluates to  | 
41  |  | // 0 if libc is not GNU libc or compatible.  | 
42  |  | // Use like:  | 
43  |  | //  #if V8_GLIBC_PREREQ(2, 3)  | 
44  |  | //   ...  | 
45  |  | //  #endif  | 
46  |  | #if defined(__GLIBC__) && defined(__GLIBC_MINOR__)  | 
47  |  | # define V8_GLIBC_PREREQ(major, minor)                                    \  | 
48  |  |     ((__GLIBC__ * 100 + __GLIBC_MINOR__) >= ((major) * 100 + (minor)))  | 
49  |  | #else  | 
50  |  | # define V8_GLIBC_PREREQ(major, minor) 0  | 
51  |  | #endif  | 
52  |  |  | 
53  |  |  | 
54  |  | // This macro allows to test for the version of the GNU C++ compiler.  | 
55  |  | // Note that this also applies to compilers that masquerade as GCC,  | 
56  |  | // for example clang and the Intel C++ compiler for Linux.  | 
57  |  | // Use like:  | 
58  |  | //  #if V8_GNUC_PREREQ(4, 3, 1)  | 
59  |  | //   ...  | 
60  |  | //  #endif  | 
61  |  | #if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)  | 
62  |  | # define V8_GNUC_PREREQ(major, minor, patchlevel)                         \  | 
63  |  |     ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >=   \  | 
64  |  |      ((major) * 10000 + (minor) * 100 + (patchlevel)))  | 
65  |  | #elif defined(__GNUC__) && defined(__GNUC_MINOR__)  | 
66  |  | # define V8_GNUC_PREREQ(major, minor, patchlevel)      \  | 
67  |  |     ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >=      \  | 
68  |  |      ((major) * 10000 + (minor) * 100 + (patchlevel)))  | 
69  |  | #else  | 
70  |  | # define V8_GNUC_PREREQ(major, minor, patchlevel) 0  | 
71  |  | #endif  | 
72  |  |  | 
73  |  |  | 
74  |  |  | 
75  |  | // -----------------------------------------------------------------------------  | 
76  |  | // Operating system detection (host)  | 
77  |  | //  | 
78  |  | //  V8_OS_ANDROID       - Android  | 
79  |  | //  V8_OS_BSD           - BSDish (macOS, Net/Free/Open/DragonFlyBSD)  | 
80  |  | //  V8_OS_CYGWIN        - Cygwin  | 
81  |  | //  V8_OS_DRAGONFLYBSD  - DragonFlyBSD  | 
82  |  | //  V8_OS_FREEBSD       - FreeBSD  | 
83  |  | //  V8_OS_FUCHSIA       - Fuchsia  | 
84  |  | //  V8_OS_LINUX         - Linux (Android, ChromeOS, Linux, ...)  | 
85  |  | //  V8_OS_DARWIN        - Darwin (macOS, iOS)  | 
86  |  | //  V8_OS_MACOS         - macOS  | 
87  |  | //  V8_OS_IOS           - iOS  | 
88  |  | //  V8_OS_TVOS          - tvOS (also sets V8_OS_IOS)  | 
89  |  | //  V8_OS_NETBSD        - NetBSD  | 
90  |  | //  V8_OS_OPENBSD       - OpenBSD  | 
91  |  | //  V8_OS_POSIX         - POSIX compatible (mostly everything except Windows)  | 
92  |  | //  V8_OS_QNX           - QNX Neutrino  | 
93  |  | //  V8_OS_SOLARIS       - Sun Solaris and OpenSolaris  | 
94  |  | //  V8_OS_STARBOARD     - Starboard (platform abstraction for Cobalt)  | 
95  |  | //  V8_OS_AIX           - AIX  | 
96  |  | //  V8_OS_WIN           - Microsoft Windows  | 
97  |  | //  V8_OS_ZOS           - z/OS  | 
98  |  |  | 
99  |  | #if defined(__ANDROID__)  | 
100  |  | # define V8_OS_ANDROID 1  | 
101  |  | # define V8_OS_LINUX 1  | 
102  |  | # define V8_OS_POSIX 1  | 
103  |  | # define V8_OS_STRING "android"  | 
104  |  |  | 
105  |  | #elif defined(__APPLE__)  | 
106  |  | # define V8_OS_POSIX 1  | 
107  |  | # define V8_OS_BSD 1  | 
108  |  | # define V8_OS_DARWIN 1  | 
109  |  | # if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE  | 
110  |  | #  define V8_OS_IOS 1  | 
111  |  | #  define V8_OS_STRING "ios"  | 
112  |  | #  if defined(TARGET_OS_TV) && TARGET_OS_TV  | 
113  |  | #   define V8_OS_TVOS 1  | 
114  |  | #  endif  | 
115  |  | # else  | 
116  |  | #  define V8_OS_MACOS 1  | 
117  |  | #  define V8_OS_STRING "macos"  | 
118  |  | # endif  // defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE  | 
119  |  |  | 
120  |  | #elif defined(__CYGWIN__)  | 
121  |  | # define V8_OS_CYGWIN 1  | 
122  |  | # define V8_OS_POSIX 1  | 
123  |  | # define V8_OS_STRING "cygwin"  | 
124  |  |  | 
125  |  | #elif defined(__linux__)  | 
126  |  | # define V8_OS_LINUX 1  | 
127  |  | # define V8_OS_POSIX 1  | 
128  |  | # define V8_OS_STRING "linux"  | 
129  |  |  | 
130  |  | #elif defined(__sun)  | 
131  |  | # define V8_OS_POSIX 1  | 
132  |  | # define V8_OS_SOLARIS 1  | 
133  |  | # define V8_OS_STRING "sun"  | 
134  |  |  | 
135  |  | #elif defined(STARBOARD)  | 
136  |  | # define V8_OS_STARBOARD 1  | 
137  |  | # define V8_OS_STRING "starboard"  | 
138  |  |  | 
139  |  | #elif defined(_AIX)  | 
140  |  | # define V8_OS_POSIX 1  | 
141  |  | # define V8_OS_AIX 1  | 
142  |  | # define V8_OS_STRING "aix"  | 
143  |  |  | 
144  |  | #elif defined(__FreeBSD__)  | 
145  |  | # define V8_OS_BSD 1  | 
146  |  | # define V8_OS_FREEBSD 1  | 
147  |  | # define V8_OS_POSIX 1  | 
148  |  | # define V8_OS_STRING "freebsd"  | 
149  |  |  | 
150  |  | #elif defined(__Fuchsia__)  | 
151  |  | # define V8_OS_FUCHSIA 1  | 
152  |  | # define V8_OS_POSIX 1  | 
153  |  | # define V8_OS_STRING "fuchsia"  | 
154  |  |  | 
155  |  | #elif defined(__DragonFly__)  | 
156  |  | # define V8_OS_BSD 1  | 
157  |  | # define V8_OS_DRAGONFLYBSD 1  | 
158  |  | # define V8_OS_POSIX 1  | 
159  |  | # define V8_OS_STRING "dragonflybsd"  | 
160  |  |  | 
161  |  | #elif defined(__NetBSD__)  | 
162  |  | # define V8_OS_BSD 1  | 
163  |  | # define V8_OS_NETBSD 1  | 
164  |  | # define V8_OS_POSIX 1  | 
165  |  | # define V8_OS_STRING "netbsd"  | 
166  |  |  | 
167  |  | #elif defined(__OpenBSD__)  | 
168  |  | # define V8_OS_BSD 1  | 
169  |  | # define V8_OS_OPENBSD 1  | 
170  |  | # define V8_OS_POSIX 1  | 
171  |  | # define V8_OS_STRING "openbsd"  | 
172  |  |  | 
173  |  | #elif defined(__QNXNTO__)  | 
174  |  | # define V8_OS_POSIX 1  | 
175  |  | # define V8_OS_QNX 1  | 
176  |  | # define V8_OS_STRING "qnx"  | 
177  |  |  | 
178  |  | #elif defined(_WIN32)  | 
179  |  | # define V8_OS_WIN 1  | 
180  |  | # define V8_OS_STRING "windows"  | 
181  |  |  | 
182  |  | #elif defined(__MVS__)  | 
183  |  | # define V8_OS_POSIX 1  | 
184  |  | # define V8_OS_ZOS 1  | 
185  |  | # define V8_OS_STRING "zos"  | 
186  |  | #endif  | 
187  |  |  | 
188  |  | // -----------------------------------------------------------------------------  | 
189  |  | // Operating system detection (target)  | 
190  |  | //  | 
191  |  | //  V8_TARGET_OS_ANDROID  | 
192  |  | //  V8_TARGET_OS_FUCHSIA  | 
193  |  | //  V8_TARGET_OS_IOS  | 
194  |  | //  V8_TARGET_OS_TVOS (also sets V8_TARGET_OS_IOS)  | 
195  |  | //  V8_TARGET_OS_LINUX  | 
196  |  | //  V8_TARGET_OS_MACOS  | 
197  |  | //  V8_TARGET_OS_WIN  | 
198  |  | //  V8_TARGET_OS_CHROMEOS  | 
199  |  | //  | 
200  |  | // If not set explicitly, these fall back to corresponding V8_OS_ values.  | 
201  |  |  | 
202  |  | #ifdef V8_HAVE_TARGET_OS  | 
203  |  |  | 
204  |  | // The target OS is provided, just check that at least one known value is set.  | 
205  |  | # if !defined(V8_TARGET_OS_ANDROID) \  | 
206  |  |   && !defined(V8_TARGET_OS_FUCHSIA) \  | 
207  |  |   && !defined(V8_TARGET_OS_IOS) \  | 
208  |  |   && !defined(V8_TARGET_OS_TVOS) \  | 
209  |  |   && !defined(V8_TARGET_OS_LINUX) \  | 
210  |  |   && !defined(V8_TARGET_OS_MACOS) \  | 
211  |  |   && !defined(V8_TARGET_OS_WIN) \  | 
212  |  |   && !defined(V8_TARGET_OS_CHROMEOS)  | 
213  |  | #  error No known target OS defined.  | 
214  |  | # endif  | 
215  |  |  | 
216  |  | #else  // V8_HAVE_TARGET_OS  | 
217  |  |  | 
218  |  | # if defined(V8_TARGET_OS_ANDROID) \  | 
219  |  |   || defined(V8_TARGET_OS_FUCHSIA) \  | 
220  |  |   || defined(V8_TARGET_OS_IOS) \  | 
221  |  |   || defined(V8_TARGET_OS_TVOS) \  | 
222  |  |   || defined(V8_TARGET_OS_LINUX) \  | 
223  |  |   || defined(V8_TARGET_OS_MACOS) \  | 
224  |  |   || defined(V8_TARGET_OS_WIN) \  | 
225  |  |   || defined(V8_TARGET_OS_CHROMEOS)  | 
226  |  | #  error A target OS is defined but V8_HAVE_TARGET_OS is unset.  | 
227  |  | # endif  | 
228  |  |  | 
229  |  | // Fall back to the detected host OS.  | 
230  |  | #ifdef V8_OS_ANDROID  | 
231  |  | # define V8_TARGET_OS_ANDROID  | 
232  |  | #endif  | 
233  |  |  | 
234  |  | #ifdef V8_OS_FUCHSIA  | 
235  |  | # define V8_TARGET_OS_FUCHSIA  | 
236  |  | #endif  | 
237  |  |  | 
238  |  | #ifdef V8_OS_IOS  | 
239  |  | # define V8_TARGET_OS_IOS  | 
240  |  | #endif  | 
241  |  |  | 
242  |  | #ifdef V8_OS_TVOS  | 
243  |  | # define V8_TARGET_OS_TVOS  | 
244  |  | #endif  | 
245  |  |  | 
246  |  | #ifdef V8_OS_LINUX  | 
247  |  | # define V8_TARGET_OS_LINUX  | 
248  |  | #endif  | 
249  |  |  | 
250  |  | #ifdef V8_OS_MACOS  | 
251  |  | # define V8_TARGET_OS_MACOS  | 
252  |  | #endif  | 
253  |  |  | 
254  |  | #ifdef V8_OS_WIN  | 
255  |  | # define V8_TARGET_OS_WIN  | 
256  |  | #endif  | 
257  |  |  | 
258  |  | #endif  // V8_HAVE_TARGET_OS  | 
259  |  |  | 
260  |  | #if defined(V8_TARGET_OS_ANDROID)  | 
261  |  | # define V8_TARGET_OS_STRING "android"  | 
262  |  | #elif defined(V8_TARGET_OS_FUCHSIA)  | 
263  |  | # define V8_TARGET_OS_STRING "fuchsia"  | 
264  |  | #elif defined(V8_TARGET_OS_IOS)  | 
265  |  | # define V8_TARGET_OS_STRING "ios"  | 
266  |  | #elif defined(V8_TARGET_OS_LINUX)  | 
267  |  | # define V8_TARGET_OS_STRING "linux"  | 
268  |  | #elif defined(V8_TARGET_OS_MACOS)  | 
269  |  | # define V8_TARGET_OS_STRING "macos"  | 
270  |  | #elif defined(V8_TARGET_OS_WINDOWS)  | 
271  |  | # define V8_TARGET_OS_STRING "windows"  | 
272  |  | #else  | 
273  |  | # define V8_TARGET_OS_STRING "unknown"  | 
274  |  | #endif  | 
275  |  |  | 
276  |  | // -----------------------------------------------------------------------------  | 
277  |  | // C library detection  | 
278  |  | //  | 
279  |  | //  V8_LIBC_MSVCRT  - MSVC libc  | 
280  |  | //  V8_LIBC_BIONIC  - Bionic libc  | 
281  |  | //  V8_LIBC_BSD     - BSD libc derivate  | 
282  |  | //  V8_LIBC_GLIBC   - GNU C library  | 
283  |  | //  V8_LIBC_UCLIBC  - uClibc  | 
284  |  | //  | 
285  |  | // Note that testing for libc must be done using #if not #ifdef. For example,  | 
286  |  | // to test for the GNU C library, use:  | 
287  |  | //  #if V8_LIBC_GLIBC  | 
288  |  | //   ...  | 
289  |  | //  #endif  | 
290  |  |  | 
291  |  | #if defined (_MSC_VER)  | 
292  |  | # define V8_LIBC_MSVCRT 1  | 
293  |  | #elif defined(__BIONIC__)  | 
294  |  | # define V8_LIBC_BIONIC 1  | 
295  |  | # define V8_LIBC_BSD 1  | 
296  |  | #elif defined(__UCLIBC__)  | 
297  |  | // Must test for UCLIBC before GLIBC, as UCLIBC pretends to be GLIBC.  | 
298  |  | # define V8_LIBC_UCLIBC 1  | 
299  |  | #elif defined(__GLIBC__) || defined(__GNU_LIBRARY__)  | 
300  |  | # define V8_LIBC_GLIBC 1  | 
301  |  | #else  | 
302  |  | # define V8_LIBC_BSD V8_OS_BSD  | 
303  |  | #endif  | 
304  |  |  | 
305  |  |  | 
306  |  | // -----------------------------------------------------------------------------  | 
307  |  | // Compiler detection  | 
308  |  | //  | 
309  |  | //  V8_CC_GNU     - GCC, or clang in gcc mode  | 
310  |  | //  V8_CC_INTEL   - Intel C++  | 
311  |  | //  V8_CC_MINGW   - Minimalist GNU for Windows  | 
312  |  | //  V8_CC_MINGW32 - Minimalist GNU for Windows (mingw32)  | 
313  |  | //  V8_CC_MINGW64 - Minimalist GNU for Windows (mingw-w64)  | 
314  |  | //  V8_CC_MSVC    - Microsoft Visual C/C++, or clang in cl.exe mode  | 
315  |  | //  | 
316  |  | // C++11 feature detection  | 
317  |  | //  | 
318  |  | // Compiler-specific feature detection  | 
319  |  | //  | 
320  |  | //  V8_HAS_ATTRIBUTE_ALWAYS_INLINE      - __attribute__((always_inline))  | 
321  |  | //                                        supported  | 
322  |  | //  V8_HAS_ATTRIBUTE_CONSTINIT          - __attribute__((require_constant_  | 
323  |  | //                                                       initialization))  | 
324  |  | //                                        supported  | 
325  |  | //  V8_HAS_ATTRIBUTE_NONNULL            - __attribute__((nonnull)) supported  | 
326  |  | //  V8_HAS_ATTRIBUTE_NOINLINE           - __attribute__((noinline)) supported  | 
327  |  | //  V8_HAS_ATTRIBUTE_UNUSED             - __attribute__((unused)) supported  | 
328  |  | //  V8_HAS_ATTRIBUTE_USED               - __attribute__((used)) supported  | 
329  |  | //  V8_HAS_ATTRIBUTE_RETAIN             - __attribute__((retain)) supported  | 
330  |  | //  V8_HAS_ATTRIBUTE_VISIBILITY         - __attribute__((visibility)) supported  | 
331  |  | //  V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT - __attribute__((warn_unused_result))  | 
332  |  | //                                        supported  | 
333  |  | //  V8_HAS_CPP_ATTRIBUTE_NODISCARD      - [[nodiscard]] supported  | 
334  |  | //  V8_HAS_CPP_ATTRIBUTE_NO_UNIQUE_ADDRESS  | 
335  |  | //                                      - [[no_unique_address]] supported  | 
336  |  | //  V8_HAS_CPP_ATTRIBUTE_LIFETIME_BOUND - [[clang::lifetimebound]] supported  | 
337  |  | //  V8_HAS_BUILTIN_ADD_OVERFLOW         - __builtin_add_overflow() supported  | 
338  |  | //  V8_HAS_BUILTIN_BSWAP16              - __builtin_bswap16() supported  | 
339  |  | //  V8_HAS_BUILTIN_BSWAP32              - __builtin_bswap32() supported  | 
340  |  | //  V8_HAS_BUILTIN_BSWAP64              - __builtin_bswap64() supported  | 
341  |  | //  V8_HAS_BUILTIN_CLZ                  - __builtin_clz() supported  | 
342  |  | //  V8_HAS_BUILTIN_CTZ                  - __builtin_ctz() supported  | 
343  |  | //  V8_HAS_BUILTIN_EXPECT               - __builtin_expect() supported  | 
344  |  | //  V8_HAS_BUILTIN_FRAME_ADDRESS        - __builtin_frame_address() supported  | 
345  |  | //  V8_HAS_BUILTIN_MUL_OVERFLOW         - __builtin_mul_overflow() supported  | 
346  |  | //  V8_HAS_BUILTIN_POPCOUNT             - __builtin_popcount() supported  | 
347  |  | //  V8_HAS_BUILTIN_SADD_OVERFLOW        - __builtin_sadd_overflow() supported  | 
348  |  | //  V8_HAS_BUILTIN_SMUL_OVERFLOW        - __builtin_smul_overflow() supported  | 
349  |  | //  V8_HAS_BUILTIN_SSUB_OVERFLOW        - __builtin_ssub_overflow() supported  | 
350  |  | //  V8_HAS_BUILTIN_SUB_OVERFLOW         - __builtin_sub_overflow() supported  | 
351  |  | //  V8_HAS_BUILTIN_UADD_OVERFLOW        - __builtin_uadd_overflow() supported  | 
352  |  | //  V8_HAS_COMPUTED_GOTO                - computed goto/labels as values  | 
353  |  | //                                        supported  | 
354  |  | //  V8_HAS_DECLSPEC_NOINLINE            - __declspec(noinline) supported  | 
355  |  | //  V8_HAS_DECLSPEC_SELECTANY           - __declspec(selectany) supported  | 
356  |  | //  V8_HAS___FORCEINLINE                - __forceinline supported  | 
357  |  | //  | 
358  |  | // Note that testing for compilers and/or features must be done using #if  | 
359  |  | // not #ifdef. For example, to test for Intel C++ Compiler, use:  | 
360  |  | //  #if V8_CC_INTEL  | 
361  |  | //   ...  | 
362  |  | //  #endif  | 
363  |  |  | 
364  |  | #if defined(__has_cpp_attribute)  | 
365  |  | #define V8_HAS_CPP_ATTRIBUTE(FEATURE) __has_cpp_attribute(FEATURE)  | 
366  |  | #else  | 
367  |  | #define V8_HAS_CPP_ATTRIBUTE(FEATURE) 0  | 
368  |  | #endif  | 
369  |  |  | 
370  |  | #if defined(__clang__)  | 
371  |  |  | 
372  |  | #if defined(__GNUC__)  // Clang in gcc mode.  | 
373  |  | # define V8_CC_GNU 1  | 
374  |  | #endif  | 
375  |  |  | 
376  |  | # define V8_HAS_ATTRIBUTE_ALWAYS_INLINE (__has_attribute(always_inline))  | 
377  |  | # define V8_HAS_ATTRIBUTE_CONSTINIT \  | 
378  |  |     (__has_attribute(require_constant_initialization))  | 
379  |  | # define V8_HAS_ATTRIBUTE_CONST (__has_attribute(const))  | 
380  |  | # define V8_HAS_ATTRIBUTE_NONNULL (__has_attribute(nonnull))  | 
381  |  | # define V8_HAS_ATTRIBUTE_NOINLINE (__has_attribute(noinline))  | 
382  |  | # define V8_HAS_ATTRIBUTE_UNUSED (__has_attribute(unused))  | 
383  |  | # define V8_HAS_ATTRIBUTE_USED (__has_attribute(used))  | 
384  |  | # define V8_HAS_ATTRIBUTE_RETAIN (__has_attribute(retain))  | 
385  |  | # define V8_HAS_ATTRIBUTE_OPTNONE (__has_attribute(optnone))  | 
386  |  | // Support for the "preserve_most" attribute is limited:  | 
387  |  | // - 32-bit platforms do not implement it,  | 
388  |  | // - component builds fail because _dl_runtime_resolve clobbers registers,  | 
389  |  | // - we see crashes on arm64 on Windows (https://crbug.com/1409934), which can  | 
390  |  | //   hopefully be fixed in the future.  | 
391  |  | // Additionally, the initial implementation in clang <= 16 overwrote the return  | 
392  |  | // register(s) in the epilogue of a preserve_most function, so we only use  | 
393  |  | // preserve_most in clang >= 17 (see https://reviews.llvm.org/D143425).  | 
394  |  | #if (defined(_M_X64) || defined(__x86_64__)            /* x64 (everywhere) */  \  | 
395  |  |      || ((defined(__AARCH64EL__) || defined(_M_ARM64)) /* arm64, but ... */    \  | 
396  |  |          && !defined(_WIN32)))                         /* not on windows */    \  | 
397  |  |      && !defined(COMPONENT_BUILD)                      /* no component build */\  | 
398  |  |      && __clang_major__ >= 17                          /* clang >= 17 */  | 
399  |  | # define V8_HAS_ATTRIBUTE_PRESERVE_MOST (__has_attribute(preserve_most))  | 
400  |  | #endif  | 
401  |  | # define V8_HAS_ATTRIBUTE_VISIBILITY (__has_attribute(visibility))  | 
402  |  | # define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT \  | 
403  |  |     (__has_attribute(warn_unused_result))  | 
404  |  | # define V8_HAS_ATTRIBUTE_WEAK (__has_attribute(weak))  | 
405  |  |  | 
406  |  | # define V8_HAS_CPP_ATTRIBUTE_NODISCARD (V8_HAS_CPP_ATTRIBUTE(nodiscard))  | 
407  |  | #if defined(V8_CC_MSVC)  | 
408  |  | # define V8_HAS_CPP_ATTRIBUTE_NO_UNIQUE_ADDRESS       \  | 
409  |  |     (V8_HAS_CPP_ATTRIBUTE(msvc::no_unique_address) || \  | 
410  |  |      V8_HAS_CPP_ATTRIBUTE(no_unique_address))  | 
411  |  | #else  | 
412  |  | # define V8_HAS_CPP_ATTRIBUTE_NO_UNIQUE_ADDRESS \  | 
413  |  |     (V8_HAS_CPP_ATTRIBUTE(no_unique_address))  | 
414  |  | #endif  | 
415  |  | # define V8_HAS_CPP_ATTRIBUTE_LIFETIME_BOUND (V8_HAS_CPP_ATTRIBUTE(clang::lifetimebound))  | 
416  |  |  | 
417  |  | # define V8_HAS_BUILTIN_ADD_OVERFLOW (__has_builtin(__builtin_add_overflow))  | 
418  |  | # define V8_HAS_BUILTIN_ASSUME (__has_builtin(__builtin_assume))  | 
419  |  | # define V8_HAS_BUILTIN_ASSUME_ALIGNED (__has_builtin(__builtin_assume_aligned))  | 
420  |  | # define V8_HAS_BUILTIN_BSWAP16 (__has_builtin(__builtin_bswap16))  | 
421  |  | # define V8_HAS_BUILTIN_BSWAP32 (__has_builtin(__builtin_bswap32))  | 
422  |  | # define V8_HAS_BUILTIN_BSWAP64 (__has_builtin(__builtin_bswap64))  | 
423  |  | # define V8_HAS_BUILTIN_CLZ (__has_builtin(__builtin_clz))  | 
424  |  | # define V8_HAS_BUILTIN_CTZ (__has_builtin(__builtin_ctz))  | 
425  |  | # define V8_HAS_BUILTIN_EXPECT (__has_builtin(__builtin_expect))  | 
426  |  | # define V8_HAS_BUILTIN_FRAME_ADDRESS (__has_builtin(__builtin_frame_address))  | 
427  |  | # define V8_HAS_BUILTIN_MUL_OVERFLOW (__has_builtin(__builtin_mul_overflow))  | 
428  |  | # define V8_HAS_BUILTIN_POPCOUNT (__has_builtin(__builtin_popcount))  | 
429  |  | # define V8_HAS_BUILTIN_SADD_OVERFLOW (__has_builtin(__builtin_sadd_overflow))  | 
430  |  | # define V8_HAS_BUILTIN_SMUL_OVERFLOW (__has_builtin(__builtin_smul_overflow))  | 
431  |  | # define V8_HAS_BUILTIN_SSUB_OVERFLOW (__has_builtin(__builtin_ssub_overflow))  | 
432  |  | # define V8_HAS_BUILTIN_SUB_OVERFLOW (__has_builtin(__builtin_sub_overflow))  | 
433  |  | # define V8_HAS_BUILTIN_UADD_OVERFLOW (__has_builtin(__builtin_uadd_overflow))  | 
434  |  | # define V8_HAS_BUILTIN_UNREACHABLE (__has_builtin(__builtin_unreachable))  | 
435  |  |  | 
436  |  | // Clang has no __has_feature for computed gotos.  | 
437  |  | // GCC doc: https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html  | 
438  |  | # define V8_HAS_COMPUTED_GOTO 1  | 
439  |  |  | 
440  |  | #elif defined(__GNUC__)  | 
441  |  |  | 
442  |  | # define V8_CC_GNU 1  | 
443  |  | # if defined(__INTEL_COMPILER)  // Intel C++ also masquerades as GCC 3.2.0  | 
444  |  | #  define V8_CC_INTEL 1  | 
445  |  | # endif  | 
446  |  | # if defined(__MINGW32__)  | 
447  |  | #  define V8_CC_MINGW32 1  | 
448  |  | # endif  | 
449  |  | # if defined(__MINGW64__)  | 
450  |  | #  define V8_CC_MINGW64 1  | 
451  |  | # endif  | 
452  |  | # define V8_CC_MINGW (V8_CC_MINGW32 || V8_CC_MINGW64)  | 
453  |  |  | 
454  |  | // FYI: __has_builtin is only available with GCC 10 and later, so explicitly  | 
455  |  | // check GCC version numbers to enable features. TODO(leszeks): Merge feature  | 
456  |  | // enabling for GCC 10 and later into the Clang section above, and leave this  | 
457  |  | // section for GCC 9 and earlier.  | 
458  |  |  | 
459  |  | // always_inline is available in gcc 4.0 but not very reliable until 4.4.  | 
460  |  | // Works around "sorry, unimplemented: inlining failed" build errors with  | 
461  |  | // older compilers.  | 
462  |  | # define V8_HAS_ATTRIBUTE_ALWAYS_INLINE 1  | 
463  |  | # define V8_HAS_ATTRIBUTE_NOINLINE 1  | 
464  |  | # define V8_HAS_ATTRIBUTE_UNUSED 1  | 
465  |  | # define V8_HAS_ATTRIBUTE_VISIBILITY 1  | 
466  |  | # define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT (!V8_CC_INTEL)  | 
467  |  | # define V8_HAS_ATTRIBUTE_WEAK 1  | 
468  |  |  | 
469  |  | // [[nodiscard]] does not work together with with  | 
470  |  | // __attribute__((visibility(""))) on GCC 7.4 which is why there is no define | 
471  |  | // for V8_HAS_CPP_ATTRIBUTE_NODISCARD. See https://crbug.com/v8/11707.  | 
472  |  |  | 
473  |  | # define V8_HAS_BUILTIN_ASSUME_ALIGNED 1  | 
474  |  | # define V8_HAS_BUILTIN_CLZ 1  | 
475  |  | # define V8_HAS_BUILTIN_CTZ 1  | 
476  |  | # define V8_HAS_BUILTIN_EXPECT 1  | 
477  |  | # define V8_HAS_BUILTIN_FRAME_ADDRESS 1  | 
478  |  | # define V8_HAS_BUILTIN_POPCOUNT 1  | 
479  |  | # define V8_HAS_BUILTIN_UNREACHABLE 1  | 
480  |  |  | 
481  |  | // GCC doc: https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html  | 
482  |  | #define V8_HAS_COMPUTED_GOTO 1  | 
483  |  |  | 
484  |  | #endif  | 
485  |  |  | 
486  |  | #if defined(_MSC_VER)  | 
487  |  | # define V8_CC_MSVC 1  | 
488  |  |  | 
489  |  | # define V8_HAS_DECLSPEC_NOINLINE 1  | 
490  |  | # define V8_HAS_DECLSPEC_SELECTANY 1  | 
491  |  |  | 
492  |  | # define V8_HAS___FORCEINLINE 1  | 
493  |  |  | 
494  |  | #endif  | 
495  |  |  | 
496  |  |  | 
497  |  | // -----------------------------------------------------------------------------  | 
498  |  | // Helper macros  | 
499  |  |  | 
500  |  | // A macro used to make better inlining. Don't bother for debug builds.  | 
501  |  | // Use like:  | 
502  |  | //   V8_INLINE int GetZero() { return 0; } | 
503  |  | #if !defined(DEBUG) && V8_HAS_ATTRIBUTE_ALWAYS_INLINE  | 
504  |  | # define V8_INLINE inline __attribute__((always_inline))  | 
505  |  | #elif !defined(DEBUG) && V8_HAS___FORCEINLINE  | 
506  |  | # define V8_INLINE __forceinline  | 
507  |  | #else  | 
508  |  | # define V8_INLINE inline  | 
509  |  | #endif  | 
510  |  |  | 
511  |  | // A macro to force better inlining of calls in a statement. Don't bother for  | 
512  |  | // debug builds.  | 
513  |  | // Use like:  | 
514  |  | //   V8_INLINE_STATEMENT foo = bar(); // Will force inlining the bar() call.  | 
515  |  | #if !defined(DEBUG) && defined(__clang__) && V8_HAS_ATTRIBUTE_ALWAYS_INLINE  | 
516  |  | # define V8_INLINE_STATEMENT [[clang::always_inline]]  | 
517  |  | #else  | 
518  |  | # define V8_INLINE_STATEMENT  | 
519  |  | #endif  | 
520  |  |  | 
521  |  | #if V8_HAS_BUILTIN_ASSUME  | 
522  |  | #ifdef DEBUG  | 
523  |  | // In debug mode, check assumptions in addition to adding annotations.  | 
524  |  | // This helps GCC (and maybe other compilers) figure out that certain  | 
525  |  | // situations are unreachable.  | 
526  |  | # define V8_ASSUME(condition)    \  | 
527  |  |   do {                           \ | 
528  |  |     DCHECK(condition);           \  | 
529  |  |     __builtin_assume(condition); \  | 
530  |  |   } while (false)  | 
531  |  | #else  // DEBUG  | 
532  |  | # define V8_ASSUME __builtin_assume  | 
533  |  | #endif  // DEBUG  | 
534  |  | #elif V8_HAS_BUILTIN_UNREACHABLE  | 
535  |  | # define V8_ASSUME(condition)                  \  | 
536  |  |   do {                                         \ | 
537  |  |     DCHECK(condition);                         \  | 
538  |  |     if (!(condition)) __builtin_unreachable(); \  | 
539  |  |   } while (false)  | 
540  |  | #else  | 
541  |  | # define V8_ASSUME USE  | 
542  |  | #endif  | 
543  |  |  | 
544  |  | // Prefer c++20 std::assume_aligned. Don't use it on MSVC though, because it's  | 
545  |  | // not happy with our large 4GB alignment values.  | 
546  |  | #if __cplusplus >= 202002L && defined(__cpp_lib_assume_aligned) && !V8_CC_MSVC  | 
547  |  | # define V8_ASSUME_ALIGNED(ptr, alignment) \  | 
548  |  |   std::assume_aligned<(alignment)>(ptr)  | 
549  |  | #elif V8_HAS_BUILTIN_ASSUME_ALIGNED  | 
550  |  | # define V8_ASSUME_ALIGNED(ptr, alignment) \  | 
551  |  |   __builtin_assume_aligned((ptr), (alignment))  | 
552  |  | #else  | 
553  |  | # define V8_ASSUME_ALIGNED(ptr, alignment) (ptr)  | 
554  |  | #endif  | 
555  |  |  | 
556  |  | // A macro to mark functions whose values don't change (e.g. across calls)  | 
557  |  | // and thereby compiler is free to hoist and fold multiple calls together.  | 
558  |  | // Use like:  | 
559  |  | //   V8_CONST int foo() { ... } | 
560  |  | #if V8_HAS_ATTRIBUTE_CONST  | 
561  |  | # define V8_CONST __attribute__((const))  | 
562  |  | #else  | 
563  |  | # define V8_CONST  | 
564  |  | #endif  | 
565  |  |  | 
566  |  | // A macro to mark a declaration as requiring constant initialization.  | 
567  |  | // Use like:  | 
568  |  | //   int* foo V8_CONSTINIT;  | 
569  |  | #if V8_HAS_ATTRIBUTE_CONSTINIT  | 
570  |  | # define V8_CONSTINIT __attribute__((require_constant_initialization))  | 
571  |  | #else  | 
572  |  | # define V8_CONSTINIT  | 
573  |  | #endif  | 
574  |  |  | 
575  |  |  | 
576  |  | // A macro to mark specific arguments as non-null.  | 
577  |  | // Use like:  | 
578  |  | //   int add(int* x, int y, int* z) V8_NONNULL(1, 3) { return *x + y + *z; } | 
579  |  | #if V8_HAS_ATTRIBUTE_NONNULL  | 
580  |  | # define V8_NONNULL(...) __attribute__((nonnull(__VA_ARGS__)))  | 
581  |  | #else  | 
582  |  | # define V8_NONNULL(...) /* NOT SUPPORTED */  | 
583  |  | #endif  | 
584  |  |  | 
585  |  |  | 
586  |  | // A macro used to tell the compiler to never inline a particular function.  | 
587  |  | // Use like:  | 
588  |  | //   V8_NOINLINE int GetMinusOne() { return -1; } | 
589  |  | #if V8_HAS_ATTRIBUTE_NOINLINE  | 
590  |  | # define V8_NOINLINE __attribute__((noinline))  | 
591  |  | #elif V8_HAS_DECLSPEC_NOINLINE  | 
592  |  | # define V8_NOINLINE __declspec(noinline)  | 
593  |  | #else  | 
594  |  | # define V8_NOINLINE /* NOT SUPPORTED */  | 
595  |  | #endif  | 
596  |  |  | 
597  |  |  | 
598  |  | // A macro used to change the calling conventions to preserve all registers (no  | 
599  |  | // caller-saved registers). Use this for cold functions called from hot  | 
600  |  | // functions.  | 
601  |  | // Use like:  | 
602  |  | //   V8_NOINLINE V8_PRESERVE_MOST void UnlikelyMethod();  | 
603  |  | #if V8_OS_WIN  | 
604  |  | # define V8_PRESERVE_MOST  | 
605  |  | #else  | 
606  |  | #if V8_HAS_ATTRIBUTE_PRESERVE_MOST  | 
607  |  | # define V8_PRESERVE_MOST __attribute__((preserve_most))  | 
608  |  | #else  | 
609  |  | # define V8_PRESERVE_MOST /* NOT SUPPORTED */  | 
610  |  | #endif  | 
611  |  | #endif  | 
612  |  |  | 
613  |  |  | 
614  |  | // A macro (V8_DEPRECATED) to mark classes or functions as deprecated.  | 
615  |  | #if defined(V8_DEPRECATION_WARNINGS)  | 
616  |  | # define V8_DEPRECATED(message) [[deprecated(message)]]  | 
617  |  | #else  | 
618  |  | # define V8_DEPRECATED(message)  | 
619  |  | #endif  | 
620  |  |  | 
621  |  |  | 
622  |  | // A macro (V8_DEPRECATE_SOON) to make it easier to see what will be deprecated.  | 
623  |  | #if defined(V8_IMMINENT_DEPRECATION_WARNINGS)  | 
624  |  | # define V8_DEPRECATE_SOON(message) [[deprecated(message)]]  | 
625  |  | #else  | 
626  |  | # define V8_DEPRECATE_SOON(message)  | 
627  |  | #endif  | 
628  |  |  | 
629  |  |  | 
630  |  | #if defined(V8_IMMINENT_DEPRECATION_WARNINGS) || \  | 
631  |  |     defined(V8_DEPRECATION_WARNINGS)  | 
632  |  | #if defined(V8_CC_MSVC)  | 
633  |  | # define START_ALLOW_USE_DEPRECATED() \  | 
634  |  |     __pragma(warning(push))           \  | 
635  |  |     __pragma(warning(disable : 4996))  | 
636  |  | # define END_ALLOW_USE_DEPRECATED() __pragma(warning(pop))  | 
637  |  | #else  // !defined(V8_CC_MSVC)  | 
638  |  | # define START_ALLOW_USE_DEPRECATED()                               \  | 
639  |  |     _Pragma("GCC diagnostic push")                                  \ | 
640  |  |     _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") | 
641  |  | #define END_ALLOW_USE_DEPRECATED() _Pragma("GCC diagnostic pop") | 
642  |  | #endif  // !defined(V8_CC_MSVC)  | 
643  |  | #else  // !(defined(V8_IMMINENT_DEPRECATION_WARNINGS) ||  | 
644  |  |        // defined(V8_DEPRECATION_WARNINGS))  | 
645  |  | #define START_ALLOW_USE_DEPRECATED()  | 
646  |  | #define END_ALLOW_USE_DEPRECATED()  | 
647  |  | #endif  // !(defined(V8_IMMINENT_DEPRECATION_WARNINGS) ||  | 
648  |  |         // defined(V8_DEPRECATION_WARNINGS))  | 
649  |  | #define ALLOW_COPY_AND_MOVE_WITH_DEPRECATED_FIELDS(ClassName) \  | 
650  |  |   START_ALLOW_USE_DEPRECATED()                                \  | 
651  | 35  |   ClassName(const ClassName&) = default;                      \  | 
652  |  |   ClassName(ClassName&&) = default;                           \  | 
653  |  |   ClassName& operator=(const ClassName&) = default;           \  | 
654  |  |   ClassName& operator=(ClassName&&) = default;                \  | 
655  |  |   END_ALLOW_USE_DEPRECATED()  | 
656  |  |  | 
657  |  |  | 
658  |  | #if defined(__GNUC__) && !defined(__clang__) && (__GNUC__ < 6)  | 
659  |  | # define V8_ENUM_DEPRECATED(message)  | 
660  |  | # define V8_ENUM_DEPRECATE_SOON(message)  | 
661  |  | #else  | 
662  |  | # define V8_ENUM_DEPRECATED(message) V8_DEPRECATED(message)  | 
663  |  | # define V8_ENUM_DEPRECATE_SOON(message) V8_DEPRECATE_SOON(message)  | 
664  |  | #endif  | 
665  |  |  | 
666  |  |  | 
667  |  | // A macro to provide the compiler with branch prediction information.  | 
668  |  | #if V8_HAS_BUILTIN_EXPECT  | 
669  | 8.96M  | # define V8_UNLIKELY(condition) (__builtin_expect(!!(condition), 0))  | 
670  | 105  | # define V8_LIKELY(condition) (__builtin_expect(!!(condition), 1))  | 
671  |  | #else  | 
672  |  | # define V8_UNLIKELY(condition) (condition)  | 
673  |  | # define V8_LIKELY(condition) (condition)  | 
674  |  | #endif  | 
675  |  |  | 
676  |  |  | 
677  |  | // Annotate a function indicating the caller must examine the return value.  | 
678  |  | // Use like:  | 
679  |  | //   int foo() V8_WARN_UNUSED_RESULT;  | 
680  |  | #if V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT  | 
681  |  | #define V8_WARN_UNUSED_RESULT __attribute__((warn_unused_result))  | 
682  |  | #else  | 
683  |  | #define V8_WARN_UNUSED_RESULT /* NOT SUPPORTED */  | 
684  |  | #endif  | 
685  |  |  | 
686  |  |  | 
687  |  | // Annotate functions/variables as weak to allow overriding the symbol.  | 
688  |  | #if V8_HAS_ATTRIBUTE_WEAK  | 
689  |  | #define V8_WEAK __attribute__((weak))  | 
690  |  | #else  | 
691  |  | #define V8_WEAK /* NOT SUPPORTED */  | 
692  |  | #endif  | 
693  |  |  | 
694  |  |  | 
695  |  | // Annotate a class or constructor indicating the caller must assign the  | 
696  |  | // constructed instances.  | 
697  |  | // Apply to the whole class like:  | 
698  |  | //   class V8_NODISCARD Foo() { ... }; | 
699  |  | // or apply to just one constructor like:  | 
700  |  | //   V8_NODISCARD Foo() { ... }; | 
701  |  | // [[nodiscard]] comes in C++17 but supported in clang with -std >= c++11.  | 
702  |  | #if V8_HAS_CPP_ATTRIBUTE_NODISCARD  | 
703  |  | #define V8_NODISCARD [[nodiscard]]  | 
704  |  | #else  | 
705  |  | #define V8_NODISCARD /* NOT SUPPORTED */  | 
706  |  | #endif  | 
707  |  |  | 
708  |  |  | 
709  |  | // Annotate a function to ensure the function is retained in the compiled binary  | 
710  |  | // even if it appears to be unused to the compiler.  | 
711  |  | #if V8_HAS_ATTRIBUTE_USED && V8_HAS_ATTRIBUTE_VISIBILITY  | 
712  |  | #define V8_SYMBOL_USED \  | 
713  |  |   __attribute__((used, visibility("default"))) | 
714  |  | #else  | 
715  |  | #define V8_SYMBOL_USED /* NOT SUPPORTED */  | 
716  |  | #endif  | 
717  |  |  | 
718  |  |  | 
719  |  | // The no_unique_address attribute allows tail padding in a non-static data  | 
720  |  | // member to overlap other members of the enclosing class (and in the special  | 
721  |  | // case when the type is empty, permits it to fully overlap other members). The  | 
722  |  | // field is laid out as if a base class were encountered at the corresponding  | 
723  |  | // point within the class (except that it does not share a vptr with the  | 
724  |  | // enclosing object).  | 
725  |  | //  | 
726  |  | // Apply to a data member like:  | 
727  |  | //  | 
728  |  | //   class Foo { | 
729  |  | //    V8_NO_UNIQUE_ADDRESS Bar bar_;  | 
730  |  | //   };  | 
731  |  | //  | 
732  |  | // [[no_unique_address]] comes in C++20 but supported in clang with  | 
733  |  | // -std >= c++11.  | 
734  |  | #if V8_HAS_CPP_ATTRIBUTE_NO_UNIQUE_ADDRESS  | 
735  |  | #if defined(V8_CC_MSVC) && V8_HAS_CPP_ATTRIBUTE(msvc::no_unique_address)  | 
736  |  | // Unfortunately MSVC ignores [[no_unique_address]] (see  | 
737  |  | // https://devblogs.microsoft.com/cppblog/msvc-cpp20-and-the-std-cpp20-switch/#msvc-extensions-and-abi),  | 
738  |  | // and clang-cl matches it for ABI compatibility reasons. We need to prefer  | 
739  |  | // [[msvc::no_unique_address]] when available if we actually want any effect.  | 
740  |  | #define V8_NO_UNIQUE_ADDRESS [[msvc::no_unique_address]]  | 
741  |  | #else  | 
742  |  | #define V8_NO_UNIQUE_ADDRESS [[no_unique_address]]  | 
743  |  | #endif  | 
744  |  | #else  | 
745  |  | #define V8_NO_UNIQUE_ADDRESS /* NOT SUPPORTED */  | 
746  |  | #endif  | 
747  |  |  | 
748  |  | // Annotates a pointer or reference parameter or return value for a member  | 
749  |  | // function as having lifetime intertwined with the instance on which the  | 
750  |  | // function is called. For parameters, the function is assumed to store the  | 
751  |  | // value into the called-on object, so if the referred-to object is later  | 
752  |  | // destroyed, the called-on object is also considered to be dangling. For return  | 
753  |  | // values, the value is assumed to point into the called-on object, so if that  | 
754  |  | // object is destroyed, the returned value is also considered to be dangling.  | 
755  |  | // Useful to diagnose some cases of lifetime errors.  | 
756  |  | //  | 
757  |  | // See also:  | 
758  |  | //   https://clang.llvm.org/docs/AttributeReference.html#lifetimebound  | 
759  |  | //  | 
760  |  | // Usage:  | 
761  |  | // ```  | 
762  |  | //   struct S { | 
763  |  | //      S(int* p V8_LIFETIME_BOUND);  | 
764  |  | //      int* Get() V8_LIFETIME_BOUND;  | 
765  |  | //   };  | 
766  |  | //   S Func1() { | 
767  |  | //     int i = 0;  | 
768  |  | //     // The following return will not compile; diagnosed as returning address  | 
769  |  | //     // of a stack object.  | 
770  |  | //     return S(&i);  | 
771  |  | //   }  | 
772  |  | //   int* Func2(int* p) { | 
773  |  | //     // The following return will not compile; diagnosed as returning address  | 
774  |  | //     // of a local temporary.  | 
775  |  | //     return S(p).Get();  | 
776  |  | //   }  | 
777  |  | #if V8_HAS_CPP_ATTRIBUTE_LIFETIME_BOUND  | 
778  |  | #define V8_LIFETIME_BOUND [[clang::lifetimebound]]  | 
779  |  | #else  | 
780  |  | #define V8_LIFETIME_BOUND /* NOT SUPPORTED */  | 
781  |  | #endif  | 
782  |  |  | 
783  |  | // Marks a type as being eligible for the "trivial" ABI despite having a  | 
784  |  | // non-trivial destructor or copy/move constructor. Such types can be relocated  | 
785  |  | // after construction by simply copying their memory, which makes them eligible  | 
786  |  | // to be passed in registers. The canonical example is std::unique_ptr.  | 
787  |  | //  | 
788  |  | // Use with caution; this has some subtle effects on constructor/destructor  | 
789  |  | // ordering and will be very incorrect if the type relies on its address  | 
790  |  | // remaining constant. When used as a function argument (by value), the value  | 
791  |  | // may be constructed in the caller's stack frame, passed in a register, and  | 
792  |  | // then used and destructed in the callee's stack frame. A similar thing can  | 
793  |  | // occur when values are returned.  | 
794  |  | //  | 
795  |  | // TRIVIAL_ABI is not needed for types which have a trivial destructor and  | 
796  |  | // copy/move constructors, since those are automatically trivial by the ABI  | 
797  |  | // spec.  | 
798  |  | //  | 
799  |  | // It is also not likely to be effective on types too large to be passed in one  | 
800  |  | // or two registers on typical target ABIs.  | 
801  |  | //  | 
802  |  | // See also:  | 
803  |  | //   https://clang.llvm.org/docs/AttributeReference.html#trivial-abi  | 
804  |  | //   https://libcxx.llvm.org/docs/DesignDocs/UniquePtrTrivialAbi.html  | 
805  |  | #if defined(__clang__) && defined(__has_attribute)  | 
806  |  | #if __has_attribute(trivial_abi)  | 
807  |  | #define V8_TRIVIAL_ABI [[clang::trivial_abi]]  | 
808  |  | #define V8_HAS_ATTRIBUTE_TRIVIAL_ABI 1  | 
809  |  | #endif // __has_attribute(trivial_abi)  | 
810  |  | #endif // defined(__clang__) && defined(__has_attribute)  | 
811  |  | #if !defined(V8_TRIVIAL_ABI)  | 
812  |  | #define V8_TRIVIAL_ABI  | 
813  |  | #define V8_HAS_ATTRIBUTE_TRIVIAL_ABI 0  | 
814  |  | #endif //!defined(V8_TRIVIAL_ABI)  | 
815  |  |  | 
816  |  | // Helper macro to define no_sanitize attributes only with clang.  | 
817  |  | #if defined(__clang__) && defined(__has_attribute)  | 
818  |  | #if __has_attribute(no_sanitize)  | 
819  |  | #define V8_CLANG_NO_SANITIZE(what) __attribute__((no_sanitize(what)))  | 
820  |  | #endif  | 
821  |  | #endif  | 
822  |  | #if !defined(V8_CLANG_NO_SANITIZE)  | 
823  |  | #define V8_CLANG_NO_SANITIZE(what)  | 
824  |  | #endif  | 
825  |  |  | 
826  |  | // Exposing private symbols requires exposing public symbols too.  | 
827  |  | #ifdef BUILDING_V8_SHARED_PRIVATE  | 
828  |  | #define BUILDING_V8_SHARED  | 
829  |  | #endif  | 
830  |  |  | 
831  |  | #if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED)  | 
832  |  | #error Inconsistent build configuration: To build the V8 shared library \  | 
833  |  | set BUILDING_V8_SHARED, to include its headers for linking against the \  | 
834  |  | V8 shared library set USING_V8_SHARED.  | 
835  |  | #endif  | 
836  |  |  | 
837  |  | #ifdef V8_OS_WIN  | 
838  |  |  | 
839  |  | // Setup for Windows DLL export/import. When building the V8 DLL the  | 
840  |  | // BUILDING_V8_SHARED needs to be defined. When building a program which uses  | 
841  |  | // the V8 DLL USING_V8_SHARED needs to be defined. When either building the V8  | 
842  |  | // static library or building a program which uses the V8 static library neither  | 
843  |  | // BUILDING_V8_SHARED nor USING_V8_SHARED should be defined.  | 
844  |  | #ifdef BUILDING_V8_SHARED  | 
845  |  | # define V8_EXPORT __declspec(dllexport)  | 
846  |  | #elif USING_V8_SHARED  | 
847  |  | # define V8_EXPORT __declspec(dllimport)  | 
848  |  | #else  | 
849  |  | # define V8_EXPORT  | 
850  |  | #endif  // BUILDING_V8_SHARED  | 
851  |  |  | 
852  |  | #else  // V8_OS_WIN  | 
853  |  |  | 
854  |  | // Setup for Linux shared library export.  | 
855  |  | #if (V8_HAS_ATTRIBUTE_VISIBILITY && \  | 
856  |  |      (defined(BUILDING_V8_SHARED) || USING_V8_SHARED))  | 
857  |  | # define V8_EXPORT __attribute__((visibility("default"))) | 
858  |  | #else  | 
859  |  | # define V8_EXPORT  | 
860  |  | # endif  // V8_HAS_ATTRIBUTE_VISIBILITY && ...  | 
861  |  |  | 
862  |  | #endif  // V8_OS_WIN  | 
863  |  |  | 
864  |  | // clang-format on  | 
865  |  |  | 
866  |  | // Processor architecture detection.  For more info on what's defined, see:  | 
867  |  | //   http://msdn.microsoft.com/en-us/library/b0084kay.aspx  | 
868  |  | //   http://www.agner.org/optimize/calling_conventions.pdf  | 
869  |  | //   or with gcc, run: "echo | gcc -E -dM -"  | 
870  |  | // The V8_HOST_ARCH_* macros correspond to the architecture on which V8, as a  | 
871  |  | // virtual machine and compiler, runs. Don't confuse this with the architecture  | 
872  |  | // on which V8 is built.  | 
873  |  | #if defined(_M_X64) || defined(__x86_64__)  | 
874  |  | #define V8_HOST_ARCH_X64 1  | 
875  |  | #if defined(__x86_64__) && __SIZEOF_POINTER__ == 4  // Check for x32.  | 
876  |  | #define V8_HOST_ARCH_32_BIT 1  | 
877  |  | #else  | 
878  |  | #define V8_HOST_ARCH_64_BIT 1  | 
879  |  | #endif  | 
880  |  | #elif defined(_M_IX86) || defined(__i386__)  | 
881  |  | #define V8_HOST_ARCH_IA32 1  | 
882  |  | #define V8_HOST_ARCH_32_BIT 1  | 
883  |  | #elif defined(__AARCH64EL__) || defined(_M_ARM64)  | 
884  |  | #define V8_HOST_ARCH_ARM64 1  | 
885  |  | #define V8_HOST_ARCH_64_BIT 1  | 
886  |  | #elif defined(__ARMEL__)  | 
887  |  | #define V8_HOST_ARCH_ARM 1  | 
888  |  | #define V8_HOST_ARCH_32_BIT 1  | 
889  |  | #elif defined(__mips64)  | 
890  |  | #define V8_HOST_ARCH_MIPS64 1  | 
891  |  | #define V8_HOST_ARCH_64_BIT 1  | 
892  |  | #elif defined(__loongarch_lp64)  | 
893  |  | #define V8_HOST_ARCH_LOONG64 1  | 
894  |  | #define V8_HOST_ARCH_64_BIT 1  | 
895  |  | #elif defined(__PPC64__) || defined(_ARCH_PPC64)  | 
896  |  | #define V8_HOST_ARCH_PPC64 1  | 
897  |  | #define V8_HOST_ARCH_64_BIT 1  | 
898  |  | #elif defined(__s390x__)  | 
899  |  | #define V8_HOST_ARCH_S390X 1  | 
900  |  | #define V8_HOST_ARCH_64_BIT 1  | 
901  |  | #elif defined(__riscv) || defined(__riscv__)  | 
902  |  | #if __riscv_xlen == 64  | 
903  |  | #define V8_HOST_ARCH_RISCV64 1  | 
904  |  | #define V8_HOST_ARCH_64_BIT 1  | 
905  |  | #elif __riscv_xlen == 32  | 
906  |  | #define V8_HOST_ARCH_RISCV32 1  | 
907  |  | #define V8_HOST_ARCH_32_BIT 1  | 
908  |  | #else  | 
909  |  | #error "Cannot detect Riscv's bitwidth"  | 
910  |  | #endif  | 
911  |  | #else  | 
912  |  | #error "Host architecture was not detected as supported by v8"  | 
913  |  | #endif  | 
914  |  |  | 
915  |  | // Target architecture detection. This corresponds to the architecture for which  | 
916  |  | // V8's JIT will generate code (the last stage of the canadian cross-compiler).  | 
917  |  | // The macros may be set externally. If not, detect in the same way as the host  | 
918  |  | // architecture, that is, target the native environment as presented by the  | 
919  |  | // compiler.  | 
920  |  | #if !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_ARM && \  | 
921  |  |     !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_MIPS64 &&                    \  | 
922  |  |     !V8_TARGET_ARCH_PPC64 && !V8_TARGET_ARCH_S390X &&                     \  | 
923  |  |     !V8_TARGET_ARCH_RISCV64 && !V8_TARGET_ARCH_LOONG64 &&                 \  | 
924  |  |     !V8_TARGET_ARCH_RISCV32  | 
925  |  | #if defined(_M_X64) || defined(__x86_64__)  | 
926  |  | #define V8_TARGET_ARCH_X64 1  | 
927  |  | #elif defined(_M_IX86) || defined(__i386__)  | 
928  |  | #define V8_TARGET_ARCH_IA32 1  | 
929  |  | #elif defined(__AARCH64EL__) || defined(_M_ARM64)  | 
930  |  | #define V8_TARGET_ARCH_ARM64 1  | 
931  |  | #elif defined(__ARMEL__)  | 
932  |  | #define V8_TARGET_ARCH_ARM 1  | 
933  |  | #elif defined(__mips64)  | 
934  |  | #define V8_TARGET_ARCH_MIPS64 1  | 
935  |  | #elif defined(__loongarch_lp64)  | 
936  |  | #define V8_TARGET_ARCH_LOONG64 1  | 
937  |  | #elif defined(_ARCH_PPC64)  | 
938  |  | #define V8_TARGET_ARCH_PPC64 1  | 
939  |  | #elif defined(__s390x__)  | 
940  |  | #define V8_TARGET_ARCH_S390X 1  | 
941  |  | #elif defined(__riscv) || defined(__riscv__)  | 
942  |  | #if __riscv_xlen == 64  | 
943  |  | #define V8_TARGET_ARCH_RISCV64 1  | 
944  |  | #elif __riscv_xlen == 32  | 
945  |  | #define V8_TARGET_ARCH_RISCV32 1  | 
946  |  | #endif  | 
947  |  | #else  | 
948  |  | #error Target architecture was not detected as supported by v8  | 
949  |  | #endif  | 
950  |  | #endif  | 
951  |  |  | 
952  |  | // Determine architecture pointer size.  | 
953  |  | #if V8_TARGET_ARCH_IA32  | 
954  |  | #define V8_TARGET_ARCH_32_BIT 1  | 
955  |  | #elif V8_TARGET_ARCH_X64  | 
956  |  | #if !V8_TARGET_ARCH_32_BIT && !V8_TARGET_ARCH_64_BIT  | 
957  |  | #if defined(__x86_64__) && __SIZEOF_POINTER__ == 4  // Check for x32.  | 
958  |  | #define V8_TARGET_ARCH_32_BIT 1  | 
959  |  | #else  | 
960  |  | #define V8_TARGET_ARCH_64_BIT 1  | 
961  |  | #endif  | 
962  |  | #endif  | 
963  |  | #elif V8_TARGET_ARCH_ARM  | 
964  |  | #define V8_TARGET_ARCH_32_BIT 1  | 
965  |  | #elif V8_TARGET_ARCH_ARM64  | 
966  |  | #define V8_TARGET_ARCH_64_BIT 1  | 
967  |  | #elif V8_TARGET_ARCH_MIPS64  | 
968  |  | #define V8_TARGET_ARCH_64_BIT 1  | 
969  |  | #elif V8_TARGET_ARCH_LOONG64  | 
970  |  | #define V8_TARGET_ARCH_64_BIT 1  | 
971  |  | #elif V8_TARGET_ARCH_PPC64  | 
972  |  | #define V8_TARGET_ARCH_64_BIT 1  | 
973  |  | #elif V8_TARGET_ARCH_S390X  | 
974  |  | #define V8_TARGET_ARCH_64_BIT 1  | 
975  |  | #elif V8_TARGET_ARCH_RISCV64  | 
976  |  | #define V8_TARGET_ARCH_64_BIT 1  | 
977  |  | #elif V8_TARGET_ARCH_RISCV32  | 
978  |  | #define V8_TARGET_ARCH_32_BIT 1  | 
979  |  | #else  | 
980  |  | #error Unknown target architecture pointer size  | 
981  |  | #endif  | 
982  |  |  | 
983  |  | // Check for supported combinations of host and target architectures.  | 
984  |  | #if V8_TARGET_ARCH_IA32 && !V8_HOST_ARCH_IA32  | 
985  |  | #error Target architecture ia32 is only supported on ia32 host  | 
986  |  | #endif  | 
987  |  | #if (V8_TARGET_ARCH_X64 && V8_TARGET_ARCH_64_BIT && \  | 
988  |  |      !((V8_HOST_ARCH_X64 || V8_HOST_ARCH_ARM64) && V8_HOST_ARCH_64_BIT))  | 
989  |  | #error Target architecture x64 is only supported on x64 and arm64 host  | 
990  |  | #endif  | 
991  |  | #if (V8_TARGET_ARCH_X64 && V8_TARGET_ARCH_32_BIT && \  | 
992  |  |      !(V8_HOST_ARCH_X64 && V8_HOST_ARCH_32_BIT))  | 
993  |  | #error Target architecture x32 is only supported on x64 host with x32 support  | 
994  |  | #endif  | 
995  |  | #if (V8_TARGET_ARCH_ARM && !(V8_HOST_ARCH_IA32 || V8_HOST_ARCH_ARM))  | 
996  |  | #error Target architecture arm is only supported on arm and ia32 host  | 
997  |  | #endif  | 
998  |  | #if (V8_TARGET_ARCH_ARM64 && !(V8_HOST_ARCH_X64 || V8_HOST_ARCH_ARM64))  | 
999  |  | #error Target architecture arm64 is only supported on arm64 and x64 host  | 
1000  |  | #endif  | 
1001  |  | #if (V8_TARGET_ARCH_MIPS64 && !(V8_HOST_ARCH_X64 || V8_HOST_ARCH_MIPS64))  | 
1002  |  | #error Target architecture mips64 is only supported on mips64 and x64 host  | 
1003  |  | #endif  | 
1004  |  | #if (V8_TARGET_ARCH_RISCV64 && \  | 
1005  |  |      !(V8_HOST_ARCH_X64 || V8_HOST_ARCH_ARM64 || V8_HOST_ARCH_RISCV64))  | 
1006  |  | #error Target architecture riscv64 is only supported on riscv64, x64, and \  | 
1007  |  | arm64 host  | 
1008  |  | #endif  | 
1009  |  | #if (V8_TARGET_ARCH_RISCV32 && !(V8_HOST_ARCH_IA32 || V8_HOST_ARCH_RISCV32))  | 
1010  |  | #error Target architecture riscv32 is only supported on riscv32 and ia32 host  | 
1011  |  | #endif  | 
1012  |  | #if (V8_TARGET_ARCH_LOONG64 && !(V8_HOST_ARCH_X64 || V8_HOST_ARCH_LOONG64))  | 
1013  |  | #error Target architecture loong64 is only supported on loong64 and x64 host  | 
1014  |  | #endif  | 
1015  |  |  | 
1016  |  | // Determine architecture endianness.  | 
1017  |  | #if V8_TARGET_ARCH_IA32  | 
1018  |  | #define V8_TARGET_LITTLE_ENDIAN 1  | 
1019  |  | #elif V8_TARGET_ARCH_X64  | 
1020  |  | #define V8_TARGET_LITTLE_ENDIAN 1  | 
1021  |  | #elif V8_TARGET_ARCH_ARM  | 
1022  |  | #define V8_TARGET_LITTLE_ENDIAN 1  | 
1023  |  | #elif V8_TARGET_ARCH_ARM64  | 
1024  |  | #define V8_TARGET_LITTLE_ENDIAN 1  | 
1025  |  | #elif V8_TARGET_ARCH_LOONG64  | 
1026  |  | #define V8_TARGET_LITTLE_ENDIAN 1  | 
1027  |  | #elif V8_TARGET_ARCH_MIPS64  | 
1028  |  | #if defined(__MIPSEB__) || defined(V8_TARGET_ARCH_MIPS64_BE)  | 
1029  |  | #define V8_TARGET_BIG_ENDIAN 1  | 
1030  |  | #else  | 
1031  |  | #define V8_TARGET_LITTLE_ENDIAN 1  | 
1032  |  | #endif  | 
1033  |  | #elif V8_TARGET_ARCH_PPC64  | 
1034  |  | #if V8_OS_AIX  | 
1035  |  | #define V8_TARGET_BIG_ENDIAN 1  | 
1036  |  | #else  | 
1037  |  | #define V8_TARGET_LITTLE_ENDIAN 1  | 
1038  |  | #endif  | 
1039  |  | #elif V8_TARGET_ARCH_S390X  | 
1040  |  | #if V8_TARGET_ARCH_S390X_LE_SIM  | 
1041  |  | #define V8_TARGET_LITTLE_ENDIAN 1  | 
1042  |  | #else  | 
1043  |  | #define V8_TARGET_BIG_ENDIAN 1  | 
1044  |  | #endif  | 
1045  |  | #elif V8_TARGET_ARCH_RISCV32 || V8_TARGET_ARCH_RISCV64  | 
1046  |  | #define V8_TARGET_LITTLE_ENDIAN 1  | 
1047  |  | #elif defined(__BYTE_ORDER__)  | 
1048  |  | #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__  | 
1049  |  | #define V8_TARGET_BIG_ENDIAN 1  | 
1050  |  | #else  | 
1051  |  | #define V8_TARGET_LITTLE_ENDIAN 1  | 
1052  |  | #endif  | 
1053  |  | #else  | 
1054  |  | #error Unknown target architecture endianness  | 
1055  |  | #endif  | 
1056  |  |  | 
1057  |  | #undef V8_HAS_CPP_ATTRIBUTE  | 
1058  |  |  | 
1059  |  | #if !defined(V8_STATIC_ROOTS)  | 
1060  |  | #define V8_STATIC_ROOTS_BOOL false  | 
1061  |  | #else  | 
1062  |  | #define V8_STATIC_ROOTS_BOOL true  | 
1063  |  | #endif  | 
1064  |  | #ifdef V8_TARGET_BIG_ENDIAN  | 
1065  |  | #define V8_TARGET_BIG_ENDIAN_BOOL true  | 
1066  |  | #else  | 
1067  |  | #define V8_TARGET_BIG_ENDIAN_BOOL false  | 
1068  |  | #endif  | 
1069  |  |  | 
1070  |  | #endif  // V8CONFIG_H_  |