Chromium Code Reviews| 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 |