Index: runtime/vm/debugger_x64.cc |
=================================================================== |
--- runtime/vm/debugger_x64.cc (revision 31757) |
+++ runtime/vm/debugger_x64.cc (working copy) |
@@ -8,7 +8,9 @@ |
#include "vm/debugger.h" |
#include "vm/assembler.h" |
+#include "vm/code_patcher.h" |
#include "vm/cpu.h" |
+#include "vm/instructions.h" |
#include "vm/stub_code.h" |
namespace dart { |
@@ -32,6 +34,75 @@ |
*reinterpret_cast<uword*>(closure_addr)); |
} |
+ |
+uword CodeBreakpoint::OrigStubAddress() const { |
+ const Code& code = |
+ Code::Handle(Function::Handle(function_).unoptimized_code()); |
+ const Array& object_pool = Array::Handle(code.ObjectPool()); |
+ uword offset = saved_value_ + kHeapObjectTag; |
+ ASSERT((offset % kWordSize) == 0); |
+ intptr_t index = (offset - Array::data_offset()) / kWordSize; |
+ return reinterpret_cast<uword>(object_pool.At(index)); |
Ivan Posva
2014/01/14 22:12:39
There are some assertions that you can make about
hausner
2014/01/14 22:49:41
Done.
|
+} |
+ |
+ |
+void CodeBreakpoint::PatchCode() { |
+ ASSERT(!is_enabled_); |
+ switch (breakpoint_kind_) { |
+ case PcDescriptors::kIcCall: { |
+ saved_value_ = CodePatcher::GetPoolOffsetAt(pc_); |
+ const uint32_t stub_offset = |
+ InstructionPattern::OffsetFromPPIndex( |
+ Assembler::kBreakpointDynamicCPIndex); |
+ CodePatcher::SetPoolOffsetAt(pc_, stub_offset); |
+//printf("XXX dynamic: patched offs %ld with %d at 0x%lx\n", saved_value_, stub_offset, pc_); |
+ break; |
+ } |
+ case PcDescriptors::kUnoptStaticCall: { |
+ saved_value_ = CodePatcher::GetPoolOffsetAt(pc_); |
+ const uint32_t stub_offset = |
+ InstructionPattern::OffsetFromPPIndex( |
+ Assembler::kBreakpointStaticCPIndex); |
+ CodePatcher::SetPoolOffsetAt(pc_, stub_offset); |
+//printf("XXX static: patched offs %ld with %d at 0x%lx\n", saved_value_, stub_offset, pc_); |
+ break; |
+ } |
+ case PcDescriptors::kRuntimeCall: |
+ case PcDescriptors::kClosureCall: |
+ case PcDescriptors::kReturn: { |
+ saved_value_ = CodePatcher::GetPoolOffsetAt(pc_); |
+ const uint32_t stub_offset = |
+ InstructionPattern::OffsetFromPPIndex( |
+ Assembler::kBreakpointRuntimeCPIndex); |
+ CodePatcher::SetPoolOffsetAt(pc_, stub_offset); |
+//printf("XXX runtime: patched offs %ld with %d at 0x%lx\n", saved_value_, stub_offset, pc_); |
+ break; |
+ } |
+ default: |
+ UNREACHABLE(); |
+ } |
+ is_enabled_ = true; |
+} |
+ |
+ |
+void CodeBreakpoint::RestoreCode() { |
+ ASSERT(is_enabled_); |
+ switch (breakpoint_kind_) { |
+ case PcDescriptors::kIcCall: |
+ case PcDescriptors::kUnoptStaticCall: |
+ case PcDescriptors::kClosureCall: |
+ case PcDescriptors::kRuntimeCall: |
+ case PcDescriptors::kReturn: { |
+ CodePatcher::SetPoolOffsetAt(pc_, saved_value_); |
+ break; |
+ } |
+ default: |
+ UNREACHABLE(); |
+ } |
+ is_enabled_ = false; |
+} |
+ |
+ |
} // namespace dart |
#endif // defined TARGET_ARCH_X64 |