Chromium Code Reviews| Index: src/ia32/debug-ia32.cc |
| diff --git a/src/ia32/debug-ia32.cc b/src/ia32/debug-ia32.cc |
| index d13fa759ca315f33e12bdb559426654ce01fd82f..2da52823262709323a53168502fb3b35fefafb1b 100644 |
| --- a/src/ia32/debug-ia32.cc |
| +++ b/src/ia32/debug-ia32.cc |
| @@ -91,9 +91,11 @@ void BreakLocationIterator::ClearDebugBreakAtSlot() { |
| rinfo()->PatchCode(original_rinfo()->pc(), Assembler::kDebugBreakSlotLength); |
| } |
| +// All debug break stubs support padding for LiveEdit. |
| +const bool Debug::FramePaddingLayout::kIsSupported = true; |
| -#define __ ACCESS_MASM(masm) |
| +#define __ ACCESS_MASM(masm) |
| static void Generate_DebugBreakCallHelper(MacroAssembler* masm, |
| RegList object_regs, |
| @@ -103,6 +105,12 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm, |
| { |
| FrameScope scope(masm, StackFrame::INTERNAL); |
| + // Load padding words on stack. |
| + for (int i = 0; i < Debug::FramePaddingLayout::kInitialSize; i++) { |
| + __ push(Immediate(Debug::FramePaddingLayout::kPaddingValue)); |
| + } |
| + __ push(Immediate(2 * Debug::FramePaddingLayout::kInitialSize)); |
|
Yang
2012/05/02 11:38:34
I assume multiplying by 2 is for Smi-tagging? Use
Peter Rybin
2012/05/02 23:46:33
Done.
|
| + |
| // Store the registers containing live values on the expression stack to |
| // make sure that these are correctly updated during GC. Non object values |
| // are stored as a smi causing it to be untouched by GC. |
| @@ -134,6 +142,10 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm, |
| CEntryStub ceb(1); |
| __ CallStub(&ceb); |
| + // Automatically find register that could be used after register restore. |
| + // We need one register for padding skip instructions. |
| + Register unused_reg = { -1 }; |
| + |
| // Restore the register values containing object pointers from the |
| // expression stack. |
| for (int i = kNumJSCallerSaved; --i >= 0;) { |
| @@ -142,15 +154,27 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm, |
| if (FLAG_debug_code) { |
| __ Set(reg, Immediate(kDebugZapValue)); |
| } |
| + bool taken = reg.code() == esi.code(); |
| if ((object_regs & (1 << r)) != 0) { |
| __ pop(reg); |
| + taken = true; |
| } |
| if ((non_object_regs & (1 << r)) != 0) { |
| __ pop(reg); |
| __ SmiUntag(reg); |
| + taken = true; |
| + } |
| + if (!taken) { |
| + unused_reg = reg; |
| } |
| } |
| + ASSERT(unused_reg.code() != -1); |
| + |
| + // Read current padding counter and skip corresponding number of words. |
| + __ pop(unused_reg); |
| + __ lea(esp, Operand(esp, unused_reg, times_half_pointer_size, 0)); |
|
Yang
2012/05/02 11:38:34
This is based on the implication that Smis are rep
Peter Rybin
2012/05/02 23:46:33
Done.
|
| + |
| // Get rid of the internal frame. |
| } |