OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/debugger.h" | 5 #include "vm/debugger.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 | 8 |
9 #include "vm/code_generator.h" | 9 #include "vm/code_generator.h" |
10 #include "vm/code_patcher.h" | 10 #include "vm/code_patcher.h" |
(...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 if (line_number_ < 0) { | 753 if (line_number_ < 0) { |
754 const Script& script = Script::Handle(SourceCode()); | 754 const Script& script = Script::Handle(SourceCode()); |
755 script.GetTokenLocation(token_pos_, &line_number_, NULL); | 755 script.GetTokenLocation(token_pos_, &line_number_, NULL); |
756 } | 756 } |
757 return line_number_; | 757 return line_number_; |
758 } | 758 } |
759 | 759 |
760 | 760 |
761 void CodeBreakpoint::PatchCode() { | 761 void CodeBreakpoint::PatchCode() { |
762 ASSERT(!is_enabled_); | 762 ASSERT(!is_enabled_); |
763 switch (breakpoint_kind_) { | 763 const Code& code = |
764 case PcDescriptors::kIcCall: { | 764 Code::Handle(Function::Handle(function_).unoptimized_code()); |
765 const Code& code = | 765 const Instructions& instrs = Instructions::Handle(code.instructions()); |
766 Code::Handle(Function::Handle(function_).unoptimized_code()); | 766 { |
767 saved_bytes_.target_address_ = | 767 WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size()); |
768 CodePatcher::GetInstanceCallAt(pc_, code, NULL); | 768 switch (breakpoint_kind_) { |
769 CodePatcher::PatchInstanceCallAt(pc_, code, | 769 case PcDescriptors::kIcCall: { |
770 StubCode::BreakpointDynamicEntryPoint()); | 770 saved_bytes_.target_address_ = |
771 break; | 771 CodePatcher::GetInstanceCallAt(pc_, code, NULL); |
| 772 CodePatcher::PatchInstanceCallAt( |
| 773 pc_, code, StubCode::BreakpointDynamicEntryPoint()); |
| 774 break; |
| 775 } |
| 776 case PcDescriptors::kUnoptStaticCall: { |
| 777 saved_bytes_.target_address_ = |
| 778 CodePatcher::GetStaticCallTargetAt(pc_, code); |
| 779 CodePatcher::PatchStaticCallAt(pc_, code, |
| 780 StubCode::BreakpointStaticEntryPoint()); |
| 781 break; |
| 782 } |
| 783 case PcDescriptors::kRuntimeCall: |
| 784 case PcDescriptors::kClosureCall: |
| 785 case PcDescriptors::kReturn: { |
| 786 saved_bytes_.target_address_ = |
| 787 CodePatcher::GetStaticCallTargetAt(pc_, code); |
| 788 CodePatcher::PatchStaticCallAt(pc_, code, |
| 789 StubCode::BreakpointRuntimeEntryPoint()); |
| 790 break; |
| 791 } |
| 792 default: |
| 793 UNREACHABLE(); |
772 } | 794 } |
773 case PcDescriptors::kUnoptStaticCall: { | |
774 const Code& code = | |
775 Code::Handle(Function::Handle(function_).unoptimized_code()); | |
776 saved_bytes_.target_address_ = | |
777 CodePatcher::GetStaticCallTargetAt(pc_, code); | |
778 CodePatcher::PatchStaticCallAt(pc_, code, | |
779 StubCode::BreakpointStaticEntryPoint()); | |
780 break; | |
781 } | |
782 case PcDescriptors::kRuntimeCall: | |
783 case PcDescriptors::kClosureCall: | |
784 case PcDescriptors::kReturn: { | |
785 const Code& code = | |
786 Code::Handle(Function::Handle(function_).unoptimized_code()); | |
787 saved_bytes_.target_address_ = | |
788 CodePatcher::GetStaticCallTargetAt(pc_, code); | |
789 CodePatcher::PatchStaticCallAt(pc_, code, | |
790 StubCode::BreakpointRuntimeEntryPoint()); | |
791 break; | |
792 } | |
793 default: | |
794 UNREACHABLE(); | |
795 } | 795 } |
796 is_enabled_ = true; | 796 is_enabled_ = true; |
797 } | 797 } |
798 | 798 |
799 | 799 |
800 void CodeBreakpoint::RestoreCode() { | 800 void CodeBreakpoint::RestoreCode() { |
801 ASSERT(is_enabled_); | 801 ASSERT(is_enabled_); |
802 switch (breakpoint_kind_) { | 802 const Code& code = |
803 case PcDescriptors::kIcCall: { | 803 Code::Handle(Function::Handle(function_).unoptimized_code()); |
804 const Code& code = | 804 const Instructions& instrs = Instructions::Handle(code.instructions()); |
805 Code::Handle(Function::Handle(function_).unoptimized_code()); | 805 { |
806 CodePatcher::PatchInstanceCallAt(pc_, code, | 806 WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size()); |
| 807 switch (breakpoint_kind_) { |
| 808 case PcDescriptors::kIcCall: { |
| 809 CodePatcher::PatchInstanceCallAt(pc_, code, |
| 810 saved_bytes_.target_address_); |
| 811 break; |
| 812 } |
| 813 case PcDescriptors::kUnoptStaticCall: |
| 814 case PcDescriptors::kClosureCall: |
| 815 case PcDescriptors::kRuntimeCall: |
| 816 case PcDescriptors::kReturn: { |
| 817 CodePatcher::PatchStaticCallAt(pc_, code, |
807 saved_bytes_.target_address_); | 818 saved_bytes_.target_address_); |
808 break; | 819 break; |
| 820 } |
| 821 default: |
| 822 UNREACHABLE(); |
809 } | 823 } |
810 case PcDescriptors::kUnoptStaticCall: | |
811 case PcDescriptors::kClosureCall: | |
812 case PcDescriptors::kRuntimeCall: | |
813 case PcDescriptors::kReturn: { | |
814 const Code& code = | |
815 Code::Handle(Function::Handle(function_).unoptimized_code()); | |
816 CodePatcher::PatchStaticCallAt(pc_, code, | |
817 saved_bytes_.target_address_); | |
818 break; | |
819 } | |
820 default: | |
821 UNREACHABLE(); | |
822 } | 824 } |
823 is_enabled_ = false; | 825 is_enabled_ = false; |
824 } | 826 } |
825 | 827 |
826 | 828 |
827 void CodeBreakpoint::Enable() { | 829 void CodeBreakpoint::Enable() { |
828 if (!is_enabled_) { | 830 if (!is_enabled_) { |
829 PatchCode(); | 831 PatchCode(); |
830 } | 832 } |
831 ASSERT(is_enabled_); | 833 ASSERT(is_enabled_); |
(...skipping 1449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2281 } | 2283 } |
2282 | 2284 |
2283 | 2285 |
2284 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { | 2286 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { |
2285 ASSERT(bpt->next() == NULL); | 2287 ASSERT(bpt->next() == NULL); |
2286 bpt->set_next(code_breakpoints_); | 2288 bpt->set_next(code_breakpoints_); |
2287 code_breakpoints_ = bpt; | 2289 code_breakpoints_ = bpt; |
2288 } | 2290 } |
2289 | 2291 |
2290 } // namespace dart | 2292 } // namespace dart |
OLD | NEW |