diff options
Diffstat (limited to 'deps/v8/src/debug/arm64/debug-arm64.cc')
-rw-r--r-- | deps/v8/src/debug/arm64/debug-arm64.cc | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/deps/v8/src/debug/arm64/debug-arm64.cc b/deps/v8/src/debug/arm64/debug-arm64.cc index 3e4b67c938..cd017219d2 100644 --- a/deps/v8/src/debug/arm64/debug-arm64.cc +++ b/deps/v8/src/debug/arm64/debug-arm64.cc @@ -92,9 +92,15 @@ void DebugCodegen::GenerateDebugBreakStub(MacroAssembler* masm, __ Mov(scratch, Smi::FromInt(LiveEdit::kFramePaddingInitialSize)); __ Push(scratch); - if (mode == SAVE_RESULT_REGISTER) __ Push(x0); - - __ Mov(x0, 0); // No arguments. + // Push arguments for DebugBreak call. + if (mode == SAVE_RESULT_REGISTER) { + // Break on return. + __ Push(x0); + } else { + // Non-return breaks. + __ Push(masm->isolate()->factory()->the_hole_value()); + } + __ Mov(x0, 1); __ Mov(x1, ExternalReference(Runtime::FunctionForId(Runtime::kDebugBreak), masm->isolate())); @@ -104,13 +110,14 @@ void DebugCodegen::GenerateDebugBreakStub(MacroAssembler* masm, if (FLAG_debug_code) { for (int i = 0; i < kNumJSCallerSaved; i++) { Register reg = Register::XRegFromCode(JSCallerSavedCode(i)); - __ Mov(reg, Operand(kDebugZapValue)); + // Do not clobber x0 if mode is SAVE_RESULT_REGISTER. It will + // contain return value of the function. + if (!(reg.is(x0) && (mode == SAVE_RESULT_REGISTER))) { + __ Mov(reg, Operand(kDebugZapValue)); + } } } - // Restore the register values from the expression stack. - if (mode == SAVE_RESULT_REGISTER) __ Pop(x0); - // Don't bother removing padding bytes pushed on the stack // as the frame is going to be restored right away. @@ -130,10 +137,12 @@ void DebugCodegen::GenerateDebugBreakStub(MacroAssembler* masm, void DebugCodegen::GenerateFrameDropperLiveEdit(MacroAssembler* masm) { // We do not know our frame height, but set sp based on fp. - __ Sub(masm->StackPointer(), fp, kPointerSize); + __ Add(masm->StackPointer(), fp, FrameDropperFrameConstants::kFunctionOffset); __ AssertStackConsistency(); - __ Pop(x1, fp, lr); // Function, Frame, Return address. + __ Pop(x1); // Function + __ Mov(masm->StackPointer(), Operand(fp)); + __ Pop(fp, lr); // Frame, Return address. ParameterCount dummy(0); __ FloodFunctionIfStepping(x1, no_reg, dummy, dummy); |