| Index: src/ia32/debug-ia32.cc
|
| ===================================================================
|
| --- src/ia32/debug-ia32.cc (revision 4816)
|
| +++ src/ia32/debug-ia32.cc (working copy)
|
| @@ -69,6 +69,27 @@
|
| }
|
|
|
|
|
| +bool BreakLocationIterator::IsDebugBreakAtSlot() {
|
| + ASSERT(IsDebugBreakSlot());
|
| + // Check whether the debug break slot instructions have been patched.
|
| + return rinfo()->IsPatchedDebugBreakSlotSequence();
|
| +}
|
| +
|
| +
|
| +void BreakLocationIterator::SetDebugBreakAtSlot() {
|
| + ASSERT(IsDebugBreakSlot());
|
| + rinfo()->PatchCodeWithCall(
|
| + Debug::debug_break_slot()->entry(),
|
| + Assembler::kDebugBreakSlotLength - Assembler::kCallInstructionLength);
|
| +}
|
| +
|
| +
|
| +void BreakLocationIterator::ClearDebugBreakAtSlot() {
|
| + ASSERT(IsDebugBreakSlot());
|
| + rinfo()->PatchCode(original_rinfo()->pc(), Assembler::kDebugBreakSlotLength);
|
| +}
|
| +
|
| +
|
| #define __ ACCESS_MASM(masm)
|
|
|
|
|
| @@ -208,10 +229,31 @@
|
| }
|
|
|
|
|
| +void Debug::GenerateSlot(MacroAssembler* masm) {
|
| + // Generate enough nop's to make space for a call instruction.
|
| + Label check_codesize;
|
| + __ bind(&check_codesize);
|
| + __ RecordDebugBreakSlot();
|
| + for (int i = 0; i < Assembler::kDebugBreakSlotLength; i++) {
|
| + __ nop();
|
| + }
|
| + ASSERT_EQ(Assembler::kDebugBreakSlotLength,
|
| + masm->SizeOfCodeGeneratedSince(&check_codesize));
|
| +}
|
| +
|
| +
|
| +void Debug::GenerateSlotDebugBreak(MacroAssembler* masm) {
|
| + // In the places where a debug break slot is inserted no registers can contain
|
| + // object pointers.
|
| + Generate_DebugBreakCallHelper(masm, 0, true);
|
| +}
|
| +
|
| +
|
| void Debug::GeneratePlainReturnLiveEdit(MacroAssembler* masm) {
|
| masm->ret(0);
|
| }
|
|
|
| +
|
| // FrameDropper is a code replacement for a JavaScript frame with possibly
|
| // several frames above.
|
| // There is no calling conventions here, because it never actually gets called,
|
|
|