Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(436)

Unified Diff: runtime/vm/debugger_x64.cc

Issue 9484002: StepOver, StepInto, StepOut (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/debugger_ia32.cc ('k') | runtime/vm/disassembler_x64.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/debugger_x64.cc
===================================================================
--- runtime/vm/debugger_x64.cc (revision 4638)
+++ runtime/vm/debugger_x64.cc (working copy)
@@ -7,6 +7,9 @@
#include "vm/debugger.h"
+#include "vm/cpu.h"
+#include "vm/stub_code.h"
+
namespace dart {
RawInstance* ActivationFrame::GetLocalVarValue(intptr_t slot_index) {
@@ -14,6 +17,59 @@
return NULL;
}
+
+RawInstance* ActivationFrame::GetInstanceCallReceiver(
+ intptr_t num_actual_args) {
+ ASSERT(num_actual_args > 0); // At minimum we have a receiver on the stack.
+ // Stack pointer points to last argument that was pushed on the stack.
+ uword receiver_addr = sp() + ((num_actual_args - 1) * kWordSize);
+ return reinterpret_cast<RawInstance*>(
+ *reinterpret_cast<uword*>(receiver_addr));
+}
+
+
+void Breakpoint::PatchFunctionReturn() {
+ uint8_t* code = reinterpret_cast<uint8_t*>(pc_ - 13);
+ // movq %rbp,%rsp
+ ASSERT((code[0] == 0x48) && (code[1] == 0x8b) && (code[2] == 0xe5));
+ ASSERT(code[3] == 0x5d); // popq %rbp
+ ASSERT(code[4] == 0xc3); // ret
+ // Next 8 bytes are nop instructions
+ ASSERT((code[5] == 0x90) && (code[6] == 0x90) &&
+ (code[7] == 0x90) && (code[8] == 0x90) &&
+ (code[9] == 0x90) && (code[10] == 0x90) &&
+ (code[11] == 0x90) && (code[12] == 0x90));
+ // Smash code with call instruction and relative target address.
+ uword stub_addr = StubCode::BreakpointReturnEntryPoint();
+ code[0] = 0x49;
+ code[1] = 0xbb;
+ *reinterpret_cast<uword*>(&code[2]) = stub_addr;
+ code[10] = 0x41;
+ code[11] = 0xff;
+ code[12] = 0xd3;
+ CPU::FlushICache(pc_, 5);
+}
+
+
+void Breakpoint::RestoreFunctionReturn() {
+ uint8_t* code = reinterpret_cast<uint8_t*>(pc_ - 13);
+ ASSERT((code[0] == 0x49) && (code[1] == 0xbb));
+ code[0] = 0x48; // movq %rbp,%rsp
+ code[1] = 0x8b;
+ code[2] = 0xe5;
+ code[3] = 0x5d; // popq %rbp
+ code[4] = 0xc3; // ret
+ code[5] = 0x90; // nop
+ code[6] = 0x90; // nop
+ code[7] = 0x90; // nop
+ code[8] = 0x90; // nop
+ code[9] = 0x90; // nop
+ code[10] = 0x90; // nop
+ code[11] = 0x90; // nop
+ code[12] = 0x90; // nop
+ CPU::FlushICache(pc_, 5);
+}
+
} // namespace dart
#endif // defined TARGET_ARCH_X64
« no previous file with comments | « runtime/vm/debugger_ia32.cc ('k') | runtime/vm/disassembler_x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698