diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2009-09-17 16:16:41 +0200 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2009-09-17 16:16:41 +0200 |
commit | ab530bb211148d89fc22ec2b2f2defe685f9aba9 (patch) | |
tree | ccb2b16ad0403c75876c0d61d126341bb254ee2c /deps/v8/src/arm/debug-arm.cc | |
parent | 605b7e9763c37f45c499d867f254345b56dfe9f6 (diff) | |
download | node-ab530bb211148d89fc22ec2b2f2defe685f9aba9.tar.gz |
Upgrade v8 to 1.3.11
Diffstat (limited to 'deps/v8/src/arm/debug-arm.cc')
-rw-r--r-- | deps/v8/src/arm/debug-arm.cc | 48 |
1 files changed, 35 insertions, 13 deletions
diff --git a/deps/v8/src/arm/debug-arm.cc b/deps/v8/src/arm/debug-arm.cc index e14284136..4f45175a3 100644 --- a/deps/v8/src/arm/debug-arm.cc +++ b/deps/v8/src/arm/debug-arm.cc @@ -34,28 +34,41 @@ namespace v8 { namespace internal { #ifdef ENABLE_DEBUGGER_SUPPORT -// Currently debug break is not supported in frame exit code on ARM. bool BreakLocationIterator::IsDebugBreakAtReturn() { - return false; + return Debug::IsDebugBreakAtReturn(rinfo()); } -// Currently debug break is not supported in frame exit code on ARM. void BreakLocationIterator::SetDebugBreakAtReturn() { - UNIMPLEMENTED(); + // Patch the code changing the return from JS function sequence from + // mov sp, fp + // ldmia sp!, {fp, lr} + // add sp, sp, #4 + // bx lr + // to a call to the debug break return code. + // mov lr, pc + // ldr pc, [pc, #-4] + // <debug break return code entry point address> + // bktp 0 + CodePatcher patcher(rinfo()->pc(), 4); + patcher.masm()->mov(v8::internal::lr, v8::internal::pc); + patcher.masm()->ldr(v8::internal::pc, MemOperand(v8::internal::pc, -4)); + patcher.Emit(Debug::debug_break_return()->entry()); + patcher.masm()->bkpt(0); } -// Currently debug break is not supported in frame exit code on ARM. +// Restore the JS frame exit code. void BreakLocationIterator::ClearDebugBreakAtReturn() { - UNIMPLEMENTED(); + rinfo()->PatchCode(original_rinfo()->pc(), + CodeGenerator::kJSReturnSequenceLength); } +// A debug break in the exit code is identified by a call. bool Debug::IsDebugBreakAtReturn(RelocInfo* rinfo) { ASSERT(RelocInfo::IsJSReturn(rinfo->rmode())); - // Currently debug break is not supported in frame exit code on ARM. - return false; + return rinfo->IsCallInstruction(); } @@ -95,8 +108,6 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm, __ LeaveInternalFrame(); - // Inlined ExitJSFrame ends here. - // Finally restore all registers. __ RestoreRegistersFromMemory(kJSCallerSaved); @@ -138,12 +149,20 @@ void Debug::GenerateStoreICDebugBreak(MacroAssembler* masm) { void Debug::GenerateKeyedLoadICDebugBreak(MacroAssembler* masm) { - // Keyed load IC not implemented on ARM. + // ---------- S t a t e -------------- + // -- lr : return address + // -- sp[0] : key + // -- sp[4] : receiver + Generate_DebugBreakCallHelper(masm, 0); } void Debug::GenerateKeyedStoreICDebugBreak(MacroAssembler* masm) { - // Keyed store IC not implemented on ARM. + // ---------- S t a t e -------------- + // -- lr : return address + // -- sp[0] : key + // -- sp[4] : receiver + Generate_DebugBreakCallHelper(masm, 0); } @@ -180,7 +199,10 @@ void Debug::GenerateReturnDebugBreak(MacroAssembler* masm) { void Debug::GenerateStubNoRegistersDebugBreak(MacroAssembler* masm) { - // Generate nothing as CodeStub CallFunction is not used on ARM. + // ----------- S t a t e ------------- + // No registers used on entry. + // ----------------------------------- + Generate_DebugBreakCallHelper(masm, 0); } |