summaryrefslogtreecommitdiff
path: root/deps/v8/src/arm/debug-arm.cc
diff options
context:
space:
mode:
authorRyan Dahl <ry@tinyclouds.org>2009-09-17 16:16:41 +0200
committerRyan Dahl <ry@tinyclouds.org>2009-09-17 16:16:41 +0200
commitab530bb211148d89fc22ec2b2f2defe685f9aba9 (patch)
treeccb2b16ad0403c75876c0d61d126341bb254ee2c /deps/v8/src/arm/debug-arm.cc
parent605b7e9763c37f45c499d867f254345b56dfe9f6 (diff)
downloadnode-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.cc48
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);
}