From c838f15f5d7861c29af49a212465c693e64123a1 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Thu, 29 Oct 2026 12:58:56 +0100 Subject: [PATCH 1/2] deps: V8: cherry-pick c38986131c02 Original commit message: Add V8_DISABLE_PRESERVE_MOST for embedders to opt out of preserve_most preserve_most changes the calling convention, which clang encodes in the mangled name (e.g. "U" instead of "A" for cdecl in the Microsoft C++ ABI). A consumer whose toolchain does not support the attribute would reference a differently mangled symbol. This patch adds a V8_DISABLE_PRESERVE_MOST to disable it, so that it's possible to link to V8 using different toolchains, as long as the value of it is set consistently. Refs: https://github.com/nodejs/node/pull/55784 Change-Id: I67b49e739942d4026ac060be35bb39ec22256cbd Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8532546 Commit-Queue: Joyee Cheung Reviewed-by: Michael Lippautz Cr-Commit-Position: refs/heads/main@{#111381} Refs: https://github.com/v8/v8/commit/c38986131c02b6f24eb31d99d76ebf312a2b99aa --- common.gypi | 2 +- deps/v8/include/v8config.h | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/common.gypi b/common.gypi index a8dbd9ba13e4..5e100167a421 100644 --- a/common.gypi +++ b/common.gypi @@ -50,7 +50,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.10', + 'v8_embedder_string': '-node.11', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/include/v8config.h b/deps/v8/include/v8config.h index 79bb264d2c9f..3063b20885ce 100644 --- a/deps/v8/include/v8config.h +++ b/deps/v8/include/v8config.h @@ -402,6 +402,7 @@ path. Add it with -I to the command line || ((defined(__AARCH64EL__) || defined(_M_ARM64)) /* arm64, but ... */ \ && !defined(_WIN32))) /* not on windows */ \ && !defined(COMPONENT_BUILD) /* no component build */\ + && !defined(V8_DISABLE_PRESERVE_MOST) /* embedder opt-out */ \ && __clang_major__ >= 17 /* clang >= 17 */ # define V8_HAS_ATTRIBUTE_PRESERVE_MOST (__has_attribute(preserve_most)) #endif @@ -609,15 +610,11 @@ path. Add it with -I to the command line // functions. // Use like: // V8_NOINLINE V8_PRESERVE_MOST void UnlikelyMethod(); -#if V8_CC_MSVC -# define V8_PRESERVE_MOST -#else #if V8_HAS_ATTRIBUTE_PRESERVE_MOST # define V8_PRESERVE_MOST __attribute__((preserve_most)) #else # define V8_PRESERVE_MOST /* NOT SUPPORTED */ #endif -#endif // A macro (V8_DEPRECATED) to mark classes or functions as deprecated. From b5bcd5418a26d9784907c6dc1fdb02f1a356abd3 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Wed, 28 Oct 2026 20:43:30 +0100 Subject: [PATCH 2/2] build: set V8_DISABLE_PRESERVE_MOST --- common.gypi | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/common.gypi b/common.gypi index 5e100167a421..f8588b823119 100644 --- a/common.gypi +++ b/common.gypi @@ -588,6 +588,13 @@ '_HAS_EXCEPTIONS=0', 'BUILDING_V8_SHARED=1', 'BUILDING_UV_SHARED=1', + # Node.js is built with clang-cl but native addons may be built + # with MSVC, which does not support preserve_most. + # As preserve_most changes the mangled name of a function in the + # Microsoft C++ ABI, the addons would fail to link against the + # exported symbols. So this define must be consistely set for + # both the V8 build and addon builds. + 'V8_DISABLE_PRESERVE_MOST', # Stop from defining macros that conflict with # std::min() and std::max(). We don't use (much) # but we still inherit it from uv.h.