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.

Reply via email to