Hi Jakob, I did a minimal repo, but I can't reproduce the issue (using v8's clang-cl compiler to compile it). I can't spend more time on it right now; we will be sticking to 10.9 for now. I might do further investigations at a later time.
Thanks for your input. Regards, Jean-Claude On Thu, Aug 10, 2023, at 8:09 AM, Jakob Gruber wrote: > 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 <tel:(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 <tel:(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 >>>>>>>> <mailto:v8-users%2bunsubscr...@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 > > <https://groups.google.com/d/msgid/v8-users/CAH3p7oPvpmg_ug8i7wtRYaStC_9if%2Bbhdr%2BaGhxmPic4anmnbQ%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/76da92e5-2171-43c5-b678-78f1af5a67ce%40app.fastmail.com.