Interesting.. Sorry, I don't have any more suggestions either. Depending on
how much time you still have to spend on this, please consider either
filing a bug at crbug.com/v8/new to document your current findings, or
trying to build a minimal repro (without V8). I'd still like to understand
if this is a bug in V8 or in the MSVC stdlib.

On Wed, Aug 9, 2023 at 6:05 PM Jean-Claude Monnin <jc_mon...@emailplus.org>
wrote:

> Hi Jakob,
>
> Sorry, I should have looked at the code more carefully before sending my
> reply. The lambda capture-by-copy of the variadic template arguments being
> buggy would be one explanation, but it looks like it's something else.
>
> I tried following workaround:
> CodeRange* CodeRange::EnsureProcessWideCodeRange(
>     v8::PageAllocator* page_allocator, size_t requested_size) {
>   base::CallOnce(&init_code_range_once, [&]() {
>     InitProcessWideCodeRange(page_allocator, requested_size);
>   });
>   return process_wide_code_range_;
> }
> This uses the overload taking the `std::function<void()>` directly. It
> crashes in `CallOnceImpl` at call of `init_func()`.
> I also tried to call `CallOnceImpl` directly, same crash.
>
> It looks like the `std::function` is corrupted in `CallOnceImpl`. It works
> when supplying a static function with no arguments, but any lambda crashes.
> Using simpler test code, it seems that it's linked to pass a
> `std::function` across dll boundary. It works when calling an
> template/inline function, but calling a function exported by the dll
> doesn't work (see [1]).
> I can't see why passing a `std::function` to a dll call is problematic. I
> tested the same test code on another project that uses MSVC compiler and it
> works fine there. It's not impossible it's a clang issue. Unfortunately,
> this looks too complicated for me to look further into (I'm not familiar
> with assembler and such low level stuff).
>
> I tried this ugly workaround since I can pass static functions, which
> allows the compile to pass. d8.exe launches, but tests fail.
> v8::PageAllocator* g_page_allocator;
> size_t g_requested_size;
>
> static void InitProcessWideCodeRangeNoArgs() {
>   InitProcessWideCodeRange(g_page_allocator, g_requested_size);
> }
>
> // static
> CodeRange* CodeRange::EnsureProcessWideCodeRange(
>     v8::PageAllocator* page_allocator, size_t requested_size) {
>   static base::Mutex mx;
>   base::MutexGuard guard(&mx);
>   g_page_allocator = page_allocator;
>   g_requested_size = requested_size;
>   base::CallOnce(&init_code_range_once, InitProcessWideCodeRangeNoArgs);
>   return process_wide_code_range_;
> }
>
> Regards,
> Jean-Claude
>
> -------------------
> [1] Test to reproduce the issue of passing a std::function across dll
> boundaries:
>
> src/base/once.h
> inline void Test1(std::function<void()> init_func) {
>   printf("Test1 before init_func\n");
>   init_func();
>   printf("Test1 after init_func\n");
> }
>
> V8_BASE_EXPORT void Test2(std::function<void()> init_func);
>
> src/base/once.cc
> void Test2(std::function<void()> init_func) {
>   printf("Test2 before init_func\n");
>   init_func();
>   printf("Test2 after init_func\n");
> }
>
> mksnapshot.cc
> void TestFunction() {
>   printf("  called TestFunction\n");
> }
>
> int main(int argc, char** argv) {
>   v8::base::Test1([]() {
>     printf("  called CallOnceFake1 lambda\n");
>   });
>
>   v8::base::Test2(TestFunction);
>
>   v8::base::Test2([]() {
>     printf("  called CallOnceFake2 lambda\n");
>   });
>
> The output is
>
> Test1 before init_func
>   called CallOnceFake1 lambda
> Test1 after init_func
> Test2 before init_func
>   called TestFunction
> Test2 after init_func
> Test2 before init_func
>
> The call to `Test2` with a lambda crashes
>
> On Wed, Aug 9, 2023, at 10:32 AM, Jakob Gruber wrote:
>
>
>
> On Wed, Aug 9, 2023 at 10:05 AM Jean-Claude Monnin <
> jc_mon...@emailplus.org> wrote:
>
>
> I've tried to figure out a bit more what is going on by adding prints
> along the call stack. It looks like it's the `base::CallOnce` in
> `code-range.cc` introduced in commit 26bc8bb4 that is the problem. Here the
> code with the added prints:
> V8_DECLARE_ONCE(init_code_range_once);
> void InitProcessWideCodeRange(v8::PageAllocator* page_allocator,
>                               size_t requested_size) {
>   i::PrintF(stdout, "InitProcessWideCodeRange %u\n", requested_size);
>   CodeRange* code_range = new CodeRange();
>   if (!code_range->InitReservation(page_allocator, requested_size)) {
>     V8::FatalProcessOutOfMemory(
>         nullptr, "Failed to reserve virtual memory for CodeRange");
>   }
>   process_wide_code_range_ = code_range;
> #ifdef V8_EXTERNAL_CODE_SPACE
> #ifdef V8_COMPRESS_POINTERS_IN_SHARED_CAGE
>   ExternalCodeCompressionScheme::InitBase(
>       ExternalCodeCompressionScheme::PrepareCageBaseAddress(
>           code_range->base()));
> #endif  // V8_COMPRESS_POINTERS_IN_SHARED_CAGE
> #endif  // V8_EXTERNAL_CODE_SPACE
> }
> }  // namespace
>
> // static
> CodeRange* CodeRange::EnsureProcessWideCodeRange(
>     v8::PageAllocator* page_allocator, size_t requested_size) {
>   i::PrintF(stdout, "CodeRange::EnsureProcessWideCodeRange %u\n",
> requested_size);
>   base::CallOnce(&init_code_range_once, InitProcessWideCodeRange,
>                  page_allocator, requested_size);
>   return process_wide_code_range_;
> }
>
> It outputs:
> CodeRange::EnsureProcessWideCodeRange 536870912
> InitProcessWideCodeRange 2034756544 <(203)%20475-6544>
>
> It looks like the `requested_size` isn't forwarded correctly in
> `base::CallOnce`.
> I'm not sure to understand the CallOnce implementation, but I wonder if
> calling `std::function<void()>` with `init_func(args...)` isn't undefined
> behavior. Not sure how to fix/work around.
>
>
> Which part would be undefined behavior? From a quick glance, the CallOnce
> implementation
> <https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:v8/src/base/once.h;l=101;drc=a9163a67bbe920dfcfa6286bf0d172a1af377dba>
>  looks
> reasonable to me. It sounds like something around the lambda
> capture-by-copy is buggy (accessing the wrong stack slot?). Perhaps you can
> verify with disassembly of InitProcessWideCodeRange, or step through and
> find out what it's actually copying.
>
>
>
>
> On Wed, Aug 9, 2023, at 8:03 AM, Jakob Gruber wrote:
>
>
>
> On Tue, Aug 8, 2023 at 3:20 PM Jean-Claude Monnin <jc_mon...@emailplus.org>
> wrote:
>
>
> Hi Jakob,
>
> Thanks for your reply.
> It looks like using Microsoft's C++ library instead of libc++ is somewhat
> exotic for v8. Unfortunately there are cases where it's almost impossible
> to switch to libc++.
>
> Since I have a chance to get some feedback here of how to address this
> issue, I'm going to try to give you as much info as possible.
>
> `mksnapshot.exe` aborts at `VirtualMemoryCage::InitReservation` at
> following check:
>   CHECK(IsAligned(params.reservation_size, allocate_page_size));
>
> When adding following print on the line before
>   i::PrintF(stdout, "VirtualMemoryCage::InitReservation %u %u\n",
> params.reservation_size, allocate_page_size);
> it prints
>   VirtualMemoryCage::InitReservation 3356617664 65536
> It looks like the supplied `params.reservation_size` is not aligned.
>
>
> Thanks for the investigation, very helpful. I wonder where that
> reservation_size comes from. It doesn't look like any value we'd set in V8.
> Corrupted? Uninitialized?
>
> I'd expect it to be set by mksnapshot here
> <https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:v8/src/snapshot/mksnapshot.cc;l=282;drc=a9163a67bbe920dfcfa6286bf0d172a1af377dba>
>  and
> picked up by isolate initialization here
> <https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:v8/src/heap/heap.cc;l=5420;drc=a9163a67bbe920dfcfa6286bf0d172a1af377dba>.
> There it should either be some reasonable aligned value, or 0 and we'd fall
> back to kMaximalCodeRangeSize.
>
>
>
>
> Full call stack is included in screenshot below (sorry for the screenshot,
> I couldn't find a way to copy text from WinDbg)
>
> I'm happy to investigate further, but wanted to send this out in case
> there is anything specific that would be helpful.
>
> Jean-Claude
>
> On Tue, Aug 8, 2023, at 12:13 PM, Jakob Gruber wrote:
>
> Hi Jean-Claude,
>
> no, we don't have a lot of test coverage for `use_custom_libcxx=false`,
> this mode is only supported on a best-effort basis.
>
> For debugging: a backtrace and symbols would be useful. Does running
> `mksnapshot` in a debugger give more infos? Also, a bisect to find the
> culprit change would be very helpful.
>
> On Thu, Aug 3, 2023 at 6:54 PM Jean-Claude Monnin <jc_mon...@emailplus.org>
> wrote:
>
> Hi,
>
> On windows, the v8 version 11.5 build fails when generating the snapshot
> with following error:
>
>
> C:/Users/jean-claude/Documents/src/google/depot_tools/bootstrap-2@3_8_10_chromium_26_bin/python3/bin/python3.exe
> ../../tools/run.py ./mksnapshot --turbo_instruction_scheduling
> --target_os=win --target_arch=x64 --embedded_src gen/embedded.S
> --embedded_variant Default --random-seed 314159265 --startup_blob
> snapshot_blob.bin --no-native-code-counters
> Return code is 2147483651 <(214)%20748-3651>
>
> These are the options used (args.gn):
> is_official_build = true
> target_cpu = "x64"
> is_component_build = true
> use_custom_libcxx = false
> chrome_pgo_phase = false
> treat_warnings_as_errors = false
> fatal_linker_warnings = false
> symbol_level = 0
>
> When using `is_debug=false` instead of `is_official_build = true` it
> builds fine, but it comes with performance regressions compared to older
> version 9.3 build with `is_official_build = true`.
>
> If using either `is_component_build = false` or `use_custom_libcxx =
> true`, it builds fine too, however it's not really an option as I need a
> dll build and I need to use Microsoft's C++ standard library because third
> party dependencies prevents us to use libc++.
>
> I also tried version 11.4 and 11.6 and they give the same error.
>
> Any hints in how to diagnose/fix that would be appreciated.
>
> Auxiliary question: Is any big project using `use_custom_libcxx = false`
> (eg. Microsoft's C++ standard library), or is this untested?
> Chrome/node/deno all use libc++?
>
> Best regards,
> Jean-Claude
>
> --
> --
> v8-users mailing list
> v8-users@googlegroups.com
> http://groups.google.com/group/v8-users
> ---
> You received this message because you are subscribed to the Google Groups
> "v8-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to v8-users+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/v8-users/984f3518-4b8e-4403-b794-923be66ccf08%40app.fastmail.com
> .
>
>
> --
> --
> v8-users mailing list
> v8-users@googlegroups.com
> http://groups.google.com/group/v8-users
> ---
> You received this message because you are subscribed to the Google Groups
> "v8-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to v8-users+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/v8-users/CAH3p7oO%2BEkjhuGaa9nXVWHd9Da3W4h0mr3ychCWu4J3gqRut8Q%40mail.gmail.com
> <https://groups.google.com/d/msgid/v8-users/CAH3p7oO%2BEkjhuGaa9nXVWHd9Da3W4h0mr3ychCWu4J3gqRut8Q%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>
>
>
> --
> --
> v8-users mailing list
> v8-users@googlegroups.com
> http://groups.google.com/group/v8-users
> ---
> You received this message because you are subscribed to the Google Groups
> "v8-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to v8-users+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/v8-users/7d4484d9-13bd-4f86-be64-79b12abc0ec9%40app.fastmail.com
> <https://groups.google.com/d/msgid/v8-users/7d4484d9-13bd-4f86-be64-79b12abc0ec9%40app.fastmail.com?utm_medium=email&utm_source=footer>
> .
>
>
> --
> --
> v8-users mailing list
> v8-users@googlegroups.com
> http://groups.google.com/group/v8-users
> ---
> You received this message because you are subscribed to the Google Groups
> "v8-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to v8-users+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/v8-users/CAH3p7oOHbcZqCXLDL9m2Eyw-%3DGJLQJCac22W%3Dnf0R2xaX7z-GA%40mail.gmail.com
> <https://groups.google.com/d/msgid/v8-users/CAH3p7oOHbcZqCXLDL9m2Eyw-%3DGJLQJCac22W%3Dnf0R2xaX7z-GA%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>
>
>
> --
> --
> v8-users mailing list
> v8-users@googlegroups.com
> http://groups.google.com/group/v8-users
> ---
> You received this message because you are subscribed to the Google Groups
> "v8-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to v8-users+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/v8-users/1ac31ebe-76de-4872-9ad7-32e0c6baf81a%40app.fastmail.com
> <https://groups.google.com/d/msgid/v8-users/1ac31ebe-76de-4872-9ad7-32e0c6baf81a%40app.fastmail.com?utm_medium=email&utm_source=footer>
> .
>
>
> --
> --
> v8-users mailing list
> v8-users@googlegroups.com
> http://groups.google.com/group/v8-users
> ---
> You received this message because you are subscribed to the Google Groups
> "v8-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to v8-users+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/v8-users/CAH3p7oPGApgXG-Qf6u8q56tD%3D7ZFThDQfjsPSW2n%3DiTgiOBH2g%40mail.gmail.com
> <https://groups.google.com/d/msgid/v8-users/CAH3p7oPGApgXG-Qf6u8q56tD%3D7ZFThDQfjsPSW2n%3DiTgiOBH2g%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>
>
> --
> --
> v8-users mailing list
> v8-users@googlegroups.com
> http://groups.google.com/group/v8-users
> ---
> You received this message because you are subscribed to the Google Groups
> "v8-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to v8-users+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/v8-users/6e962428-87a3-4408-b491-16029338c13a%40app.fastmail.com
> <https://groups.google.com/d/msgid/v8-users/6e962428-87a3-4408-b491-16029338c13a%40app.fastmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
-- 
v8-users mailing list
v8-users@googlegroups.com
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/v8-users/CAH3p7oPvpmg_ug8i7wtRYaStC_9if%2Bbhdr%2BaGhxmPic4anmnbQ%40mail.gmail.com.

Reply via email to