--- qtwebengine-5.15.12_p20240122/src/3rdparty/chromium/v8/src/regexp/ppc/regexp-macro-assembler-ppc.h.orig 2021-01-20 02:18:44.000000000 +0100 +++ qtwebengine-5.15.12_p20240122/src/3rdparty/chromium/v8/src/regexp/ppc/regexp-macro-assembler-ppc.h 2024-03-23 15:44:16.821002068 +0100 @@ -81,7 +81,7 @@ // returning. // {raw_code} is an Address because this is called via ExternalReference. static int CheckStackGuardState(Address* return_address, Address raw_code, - Address re_frame); + Address re_frame, uintptr_t extra_space); private: // Offsets from frame_pointer() of function parameters and stored registers. @@ -127,7 +127,8 @@ // Generate a call to CheckStackGuardState. - void CallCheckStackGuardState(Register scratch); + void CallCheckStackGuardState( + Register scratch, Operand extra_space_for_variables = Operand::Zero()); // The ebp-relative location of a regexp register. MemOperand register_location(int register_index); --- qtwebengine-5.15.12_p20240122/src/3rdparty/chromium/v8/src/regexp/ppc/regexp-macro-assembler-ppc.cc.orig 2024-03-23 15:26:25.673652360 +0100 +++ qtwebengine-5.15.12_p20240122/src/3rdparty/chromium/v8/src/regexp/ppc/regexp-macro-assembler-ppc.cc 2024-03-23 15:43:36.821609443 +0100 @@ -710,11 +710,13 @@ __ mov(r3, Operand(stack_limit)); __ LoadP(r3, MemOperand(r3)); __ sub(r3, sp, r3, LeaveOE, SetRC); + Operand extra_space_for_variables(num_registers_ * kSystemPointerSize); + // Handle it if the stack pointer is already below the stack limit. __ ble(&stack_limit_hit, cr0); // Check if there is room for the variable number of registers above // the stack limit. - __ Cmpli(r3, Operand(num_registers_ * kSystemPointerSize), r0); + __ Cmpli(r3, extra_space_for_variables, r0); __ bge(&stack_ok); // Exit with OutOfMemory exception. There is not enough space on the stack // for our working registers. @@ -722,7 +724,7 @@ __ b(&return_r3); __ bind(&stack_limit_hit); - CallCheckStackGuardState(r3); + CallCheckStackGuardState(r3, extra_space_for_variables); __ cmpi(r3, Operand::Zero()); // If returned value is non-zero, we exit with the returned value as result. __ bne(&return_r3); @@ -1097,7 +1099,8 @@ // Private methods: -void RegExpMacroAssemblerPPC::CallCheckStackGuardState(Register scratch) { +void RegExpMacroAssemblerPPC::CallCheckStackGuardState(Register scratch, + Operand extra_space) { DCHECK(!isolate()->IsGeneratingEmbeddedBuiltins()); DCHECK(!masm_->options().isolate_independent_code); @@ -1128,10 +1131,12 @@ __ li(r0, Operand::Zero()); __ StorePU(r0, MemOperand(sp, -stack_space * kSystemPointerSize)); + // Extra space for variables to consider in stack check. + __ mov(arg_reg_4, extra_space); // RegExp code frame pointer. - __ mr(r5, frame_pointer()); + __ mr(arg_reg_3, frame_pointer()); // Code of self. - __ mov(r4, Operand(masm_->CodeObject())); + __ mov(arg_reg_2, Operand(masm_->CodeObject())); // r3 will point to the return address, placed by DirectCEntry. __ addi(r3, sp, Operand(kStackFrameExtraParamSlot * kSystemPointerSize)); @@ -1156,7 +1161,6 @@ __ mov(code_pointer(), Operand(masm_->CodeObject())); } - // Helper function for reading a value out of a stack frame. template static T& frame_entry(Address re_frame, int frame_offset) { @@ -1171,7 +1175,8 @@ int RegExpMacroAssemblerPPC::CheckStackGuardState(Address* return_address, Address raw_code, - Address re_frame) { + Address re_frame, + uintptr_t extra_space) { Code re_code = Code::cast(Object(raw_code)); return NativeRegExpMacroAssembler::CheckStackGuardState( frame_entry(re_frame, kIsolate), @@ -1181,10 +1186,10 @@ return_address, re_code, frame_entry_address
(re_frame, kInputString), frame_entry_address(re_frame, kInputStart), - frame_entry_address(re_frame, kInputEnd)); + frame_entry_address(re_frame, kInputEnd), + extra_space); } - MemOperand RegExpMacroAssemblerPPC::register_location(int register_index) { DCHECK(register_index < (1 << 30)); if (num_registers_ <= register_index) {