Index: src/macro-assembler-arm.cc |
=================================================================== |
--- src/macro-assembler-arm.cc (revision 361) |
+++ src/macro-assembler-arm.cc (working copy) |
@@ -306,10 +306,27 @@ |
// Compute the argv pointer and keep it in a callee-saved register. |
add(r6, fp, Operand(r4, LSL, kPointerSizeLog2)); |
add(r6, r6, Operand(ExitFrameConstants::kPPDisplacement - kPointerSize)); |
+ |
+ // Save the state of all registers to the stack from the memory |
+ // location. This is needed to allow nested break points. |
+ if (type == StackFrame::EXIT_DEBUG) { |
+ // Use sp as base to push. |
+ CopyRegistersFromMemoryToStack(sp, kJSCallerSaved); |
+ } |
} |
-void MacroAssembler::LeaveExitFrame() { |
+void MacroAssembler::LeaveExitFrame(StackFrame::Type type) { |
+ // Restore the memory copy of the registers by digging them out from |
+ // the stack. This is needed to allow nested break points. |
+ if (type == StackFrame::EXIT_DEBUG) { |
+ // This code intentionally clobbers r2 and r3. |
+ const int kCallerSavedSize = kNumJSCallerSaved * kPointerSize; |
+ const int kOffset = ExitFrameConstants::kDebugMarkOffset - kCallerSavedSize; |
+ add(r3, fp, Operand(kOffset)); |
+ CopyRegistersFromStackToMemory(r3, r2, kJSCallerSaved); |
+ } |
+ |
// Clear top frame. |
mov(r3, Operand(0)); |
mov(ip, Operand(ExternalReference(Top::k_c_entry_fp_address))); |