Index: runtime/vm/debugger_arm.cc |
=================================================================== |
--- runtime/vm/debugger_arm.cc (revision 31811) |
+++ runtime/vm/debugger_arm.cc (working copy) |
@@ -5,6 +5,7 @@ |
#include "vm/globals.h" |
#if defined(TARGET_ARCH_ARM) |
+#include "vm/code_patcher.h" |
#include "vm/cpu.h" |
#include "vm/debugger.h" |
#include "vm/instructions.h" |
@@ -31,6 +32,72 @@ |
*reinterpret_cast<uword*>(closure_addr)); |
} |
+ |
+uword CodeBreakpoint::OrigStubAddress() const { |
+ return saved_value_; |
+} |
+ |
+ |
+void CodeBreakpoint::PatchCode() { |
+ ASSERT(!is_enabled_); |
+ switch (breakpoint_kind_) { |
+ case PcDescriptors::kIcCall: { |
+ const Code& code = |
+ Code::Handle(Function::Handle(function_).unoptimized_code()); |
+ saved_value_ = CodePatcher::GetInstanceCallAt(pc_, code, NULL); |
+ CodePatcher::PatchInstanceCallAt(pc_, code, |
+ StubCode::BreakpointDynamicEntryPoint()); |
+ break; |
+ } |
+ case PcDescriptors::kUnoptStaticCall: { |
+ const Code& code = |
+ Code::Handle(Function::Handle(function_).unoptimized_code()); |
+ saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code); |
+ CodePatcher::PatchStaticCallAt(pc_, code, |
+ StubCode::BreakpointStaticEntryPoint()); |
+ break; |
+ } |
+ case PcDescriptors::kRuntimeCall: |
+ case PcDescriptors::kClosureCall: |
+ case PcDescriptors::kReturn: { |
+ const Code& code = |
+ Code::Handle(Function::Handle(function_).unoptimized_code()); |
+ saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code); |
+ CodePatcher::PatchStaticCallAt(pc_, code, |
+ StubCode::BreakpointRuntimeEntryPoint()); |
+ break; |
+ } |
+ default: |
+ UNREACHABLE(); |
+ } |
+ is_enabled_ = true; |
+} |
+ |
+ |
+void CodeBreakpoint::RestoreCode() { |
+ ASSERT(is_enabled_); |
+ switch (breakpoint_kind_) { |
+ case PcDescriptors::kIcCall: { |
+ const Code& code = |
+ Code::Handle(Function::Handle(function_).unoptimized_code()); |
+ CodePatcher::PatchInstanceCallAt(pc_, code, saved_value_); |
+ break; |
+ } |
+ case PcDescriptors::kUnoptStaticCall: |
+ case PcDescriptors::kClosureCall: |
+ case PcDescriptors::kRuntimeCall: |
+ case PcDescriptors::kReturn: { |
+ const Code& code = |
+ Code::Handle(Function::Handle(function_).unoptimized_code()); |
+ CodePatcher::PatchStaticCallAt(pc_, code, saved_value_); |
+ break; |
+ } |
+ default: |
+ UNREACHABLE(); |
+ } |
+ is_enabled_ = false; |
+} |
+ |
} // namespace dart |
#endif // defined TARGET_ARCH_ARM |