OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_DEBUG_H_ | 5 #ifndef V8_DEBUG_H_ |
6 #define V8_DEBUG_H_ | 6 #define V8_DEBUG_H_ |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/arguments.h" | 9 #include "src/arguments.h" |
10 #include "src/assembler.h" | 10 #include "src/assembler.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 | 44 |
45 | 45 |
46 // Type of exception break. NOTE: These values are in macros.py as well. | 46 // Type of exception break. NOTE: These values are in macros.py as well. |
47 enum ExceptionBreakType { | 47 enum ExceptionBreakType { |
48 BreakException = 0, | 48 BreakException = 0, |
49 BreakUncaughtException = 1 | 49 BreakUncaughtException = 1 |
50 }; | 50 }; |
51 | 51 |
52 | 52 |
53 // Type of exception break. | 53 // Type of exception break. |
54 enum BreakLocatorType { | 54 enum BreakLocatorType { ALL_BREAK_LOCATIONS, CALLS_AND_RETURNS }; |
55 ALL_BREAK_LOCATIONS = 0, | |
56 SOURCE_BREAK_LOCATIONS = 1, | |
57 CALLS_AND_RETURNS = 2 | |
58 }; | |
59 | 55 |
60 | 56 |
61 // The different types of breakpoint position alignments. | 57 // The different types of breakpoint position alignments. |
62 // Must match Debug.BreakPositionAlignment in debug-debugger.js | 58 // Must match Debug.BreakPositionAlignment in debug-debugger.js |
63 enum BreakPositionAlignment { | 59 enum BreakPositionAlignment { |
64 STATEMENT_ALIGNED = 0, | 60 STATEMENT_ALIGNED = 0, |
65 BREAK_POSITION_ALIGNED = 1 | 61 BREAK_POSITION_ALIGNED = 1 |
66 }; | 62 }; |
67 | 63 |
68 | 64 |
69 class BreakLocation { | 65 class BreakLocation { |
70 public: | 66 public: |
71 // Find the break point at the supplied address, or the closest one before | 67 // Find the break point at the supplied address, or the closest one before |
72 // the address. | 68 // the address. |
73 static BreakLocation FromAddress(Handle<DebugInfo> debug_info, | 69 static BreakLocation FromAddress(Handle<DebugInfo> debug_info, |
74 BreakLocatorType type, Address pc); | 70 BreakLocatorType type, Address pc); |
75 | 71 |
76 static void FromAddressSameStatement(Handle<DebugInfo> debug_info, | 72 static void FromAddressSameStatement(Handle<DebugInfo> debug_info, |
77 BreakLocatorType type, Address pc, | 73 BreakLocatorType type, Address pc, |
78 List<BreakLocation>* result_out); | 74 List<BreakLocation>* result_out); |
79 | 75 |
80 static BreakLocation FromPosition(Handle<DebugInfo> debug_info, | 76 static BreakLocation FromPosition(Handle<DebugInfo> debug_info, |
81 BreakLocatorType type, int position, | 77 BreakLocatorType type, int position, |
82 BreakPositionAlignment alignment); | 78 BreakPositionAlignment alignment); |
83 | 79 |
84 bool IsDebugBreak() const; | 80 bool IsDebugBreak() const; |
85 inline bool IsExit() const { return RelocInfo::IsJSReturn(rmode_); } | 81 inline bool IsExit() const { return RelocInfo::IsJSReturn(rmode_); } |
| 82 inline bool IsCall() const { |
| 83 return IsDebugBreakSlot() && RelocInfo::DebugBreakIsCall(data_); |
| 84 } |
86 inline bool IsConstructCall() const { | 85 inline bool IsConstructCall() const { |
87 return RelocInfo::IsConstructCall(rmode_); | 86 return IsDebugBreakSlot() && RelocInfo::DebugBreakIsConstructCall(data_); |
88 } | 87 } |
89 inline bool IsCodeTarget() const { return RelocInfo::IsCodeTarget(rmode_); } | 88 inline int CallArgumentsCount() const { |
90 | 89 DCHECK(IsCall()); |
91 Handle<Code> CodeTarget() const; | 90 return RelocInfo::DebugBreakCallArgumentsCount(data_); |
92 Handle<Code> OriginalCodeTarget() const; | 91 } |
93 | 92 |
94 bool IsStepInLocation() const; | 93 bool IsStepInLocation() const; |
95 inline bool HasBreakPoint() const { | 94 inline bool HasBreakPoint() const { |
96 return debug_info_->HasBreakPoint(pc_offset_); | 95 return debug_info_->HasBreakPoint(pc_offset_); |
97 } | 96 } |
98 | 97 |
99 Handle<Object> BreakPointObjects() const; | 98 Handle<Object> BreakPointObjects() const; |
100 | 99 |
101 void SetBreakPoint(Handle<Object> break_point_object); | 100 void SetBreakPoint(Handle<Object> break_point_object); |
102 void ClearBreakPoint(Handle<Object> break_point_object); | 101 void ClearBreakPoint(Handle<Object> break_point_object); |
103 | 102 |
104 void SetOneShot(); | 103 void SetOneShot(); |
105 void ClearOneShot(); | 104 void ClearOneShot(); |
106 | 105 |
| 106 |
107 inline RelocInfo rinfo() const { | 107 inline RelocInfo rinfo() const { |
108 return RelocInfo(pc(), rmode(), data_, code()); | 108 return RelocInfo(pc(), rmode(), data_, code()); |
109 } | 109 } |
110 | 110 |
111 inline RelocInfo original_rinfo() const { | |
112 return RelocInfo(original_pc(), original_rmode(), original_data_, | |
113 original_code()); | |
114 } | |
115 | |
116 inline int position() const { return position_; } | 111 inline int position() const { return position_; } |
117 inline int statement_position() const { return statement_position_; } | 112 inline int statement_position() const { return statement_position_; } |
118 | 113 |
119 inline Address pc() const { return code()->entry() + pc_offset_; } | 114 inline Address pc() const { return code()->entry() + pc_offset_; } |
120 inline Address original_pc() const { | 115 inline Address original_pc() const { |
121 return original_code()->entry() + original_pc_offset_; | 116 return debug_info_->original_code()->entry() + original_pc_offset_; |
122 } | 117 } |
123 | 118 |
124 inline RelocInfo::Mode rmode() const { return rmode_; } | 119 inline RelocInfo::Mode rmode() const { return rmode_; } |
125 inline RelocInfo::Mode original_rmode() const { return original_rmode_; } | |
126 | 120 |
127 inline Code* code() const { return debug_info_->code(); } | 121 inline Code* code() const { return debug_info_->code(); } |
128 inline Code* original_code() const { return debug_info_->original_code(); } | |
129 | 122 |
130 private: | 123 private: |
131 BreakLocation(Handle<DebugInfo> debug_info, RelocInfo* rinfo, | 124 BreakLocation(Handle<DebugInfo> debug_info, RelocInfo* rinfo, |
132 RelocInfo* original_rinfo, int position, | 125 RelocInfo* original_rinfo, int position, |
133 int statement_position); | 126 int statement_position); |
134 | 127 |
135 class Iterator { | 128 class Iterator { |
136 public: | 129 public: |
137 Iterator(Handle<DebugInfo> debug_info, BreakLocatorType type); | 130 Iterator(Handle<DebugInfo> debug_info, BreakLocatorType type); |
138 | 131 |
139 BreakLocation GetBreakLocation() { | 132 BreakLocation GetBreakLocation() { |
140 return BreakLocation(debug_info_, rinfo(), original_rinfo(), position(), | 133 return BreakLocation(debug_info_, rinfo(), original_rinfo(), position(), |
141 statement_position()); | 134 statement_position()); |
142 } | 135 } |
143 | 136 |
144 inline bool Done() const { return RinfoDone(); } | 137 inline bool Done() const { return RinfoDone(); } |
145 void Next(); | 138 void Next(); |
146 | 139 |
147 void SkipTo(int count) { | 140 void SkipTo(int count) { |
148 while (count-- > 0) Next(); | 141 while (count-- > 0) Next(); |
149 } | 142 } |
150 | 143 |
151 inline RelocInfo::Mode rmode() { return reloc_iterator_.rinfo()->rmode(); } | 144 inline RelocInfo::Mode rmode() { return reloc_iterator_.rinfo()->rmode(); } |
152 inline RelocInfo::Mode original_rmode() { | |
153 return reloc_iterator_.rinfo()->rmode(); | |
154 } | |
155 | |
156 inline RelocInfo* rinfo() { return reloc_iterator_.rinfo(); } | 145 inline RelocInfo* rinfo() { return reloc_iterator_.rinfo(); } |
157 inline RelocInfo* original_rinfo() { | 146 inline RelocInfo* original_rinfo() { |
158 return reloc_iterator_original_.rinfo(); | 147 return reloc_iterator_original_.rinfo(); |
159 } | 148 } |
160 | 149 |
161 inline Address pc() { return rinfo()->pc(); } | 150 inline Address pc() { return rinfo()->pc(); } |
162 inline Address original_pc() { return original_rinfo()->pc(); } | |
163 | |
164 int break_index() const { return break_index_; } | 151 int break_index() const { return break_index_; } |
165 | |
166 inline int position() const { return position_; } | 152 inline int position() const { return position_; } |
167 inline int statement_position() const { return statement_position_; } | 153 inline int statement_position() const { return statement_position_; } |
168 | 154 |
169 private: | 155 private: |
170 bool RinfoDone() const; | 156 bool RinfoDone() const; |
171 void RinfoNext(); | 157 void RinfoNext(); |
172 | 158 |
173 Handle<DebugInfo> debug_info_; | 159 Handle<DebugInfo> debug_info_; |
174 BreakLocatorType type_; | 160 BreakLocatorType type_; |
175 RelocIterator reloc_iterator_; | 161 RelocIterator reloc_iterator_; |
(...skipping 11 matching lines...) Expand all Loading... |
187 | 173 |
188 static int BreakIndexFromAddress(Handle<DebugInfo> debug_info, | 174 static int BreakIndexFromAddress(Handle<DebugInfo> debug_info, |
189 BreakLocatorType type, Address pc); | 175 BreakLocatorType type, Address pc); |
190 | 176 |
191 void ClearDebugBreak(); | 177 void ClearDebugBreak(); |
192 void RestoreFromOriginal(int length_in_bytes); | 178 void RestoreFromOriginal(int length_in_bytes); |
193 | 179 |
194 void SetDebugBreak(); | 180 void SetDebugBreak(); |
195 void SetDebugBreakAtReturn(); | 181 void SetDebugBreakAtReturn(); |
196 void SetDebugBreakAtSlot(); | 182 void SetDebugBreakAtSlot(); |
197 void SetDebugBreakAtIC(); | |
198 | 183 |
199 inline bool IsDebuggerStatement() const { | 184 inline bool IsDebuggerStatement() const { |
200 return RelocInfo::IsDebuggerStatement(rmode_); | 185 return RelocInfo::IsDebuggerStatement(rmode_); |
201 } | 186 } |
202 inline bool IsDebugBreakSlot() const { | 187 inline bool IsDebugBreakSlot() const { |
203 return RelocInfo::IsDebugBreakSlot(rmode_); | 188 return RelocInfo::IsDebugBreakSlot(rmode_); |
204 } | 189 } |
205 | 190 |
206 Handle<DebugInfo> debug_info_; | 191 Handle<DebugInfo> debug_info_; |
207 int pc_offset_; | 192 int pc_offset_; |
(...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
800 Debug* debug_; | 785 Debug* debug_; |
801 bool old_state_; | 786 bool old_state_; |
802 DISALLOW_COPY_AND_ASSIGN(SuppressDebug); | 787 DISALLOW_COPY_AND_ASSIGN(SuppressDebug); |
803 }; | 788 }; |
804 | 789 |
805 | 790 |
806 // Code generator routines. | 791 // Code generator routines. |
807 class DebugCodegen : public AllStatic { | 792 class DebugCodegen : public AllStatic { |
808 public: | 793 public: |
809 static void GenerateSlot(MacroAssembler* masm); | 794 static void GenerateSlot(MacroAssembler* masm); |
810 static void GenerateCallICStubDebugBreak(MacroAssembler* masm); | |
811 static void GenerateLoadICDebugBreak(MacroAssembler* masm); | |
812 static void GenerateStoreICDebugBreak(MacroAssembler* masm); | |
813 static void GenerateKeyedLoadICDebugBreak(MacroAssembler* masm); | |
814 static void GenerateKeyedStoreICDebugBreak(MacroAssembler* masm); | |
815 static void GenerateCompareNilICDebugBreak(MacroAssembler* masm); | |
816 static void GenerateReturnDebugBreak(MacroAssembler* masm); | 795 static void GenerateReturnDebugBreak(MacroAssembler* masm); |
817 static void GenerateCallFunctionStubDebugBreak(MacroAssembler* masm); | |
818 static void GenerateCallConstructStubDebugBreak(MacroAssembler* masm); | |
819 static void GenerateCallConstructStubRecordDebugBreak(MacroAssembler* masm); | |
820 static void GenerateSlotDebugBreak(MacroAssembler* masm); | 796 static void GenerateSlotDebugBreak(MacroAssembler* masm); |
821 static void GeneratePlainReturnLiveEdit(MacroAssembler* masm); | 797 static void GeneratePlainReturnLiveEdit(MacroAssembler* masm); |
822 | 798 |
823 // FrameDropper is a code replacement for a JavaScript frame with possibly | 799 // FrameDropper is a code replacement for a JavaScript frame with possibly |
824 // several frames above. | 800 // several frames above. |
825 // There is no calling conventions here, because it never actually gets | 801 // There is no calling conventions here, because it never actually gets |
826 // called, it only gets returned to. | 802 // called, it only gets returned to. |
827 static void GenerateFrameDropperLiveEdit(MacroAssembler* masm); | 803 static void GenerateFrameDropperLiveEdit(MacroAssembler* masm); |
828 }; | 804 }; |
829 | 805 |
830 | 806 |
831 } } // namespace v8::internal | 807 } } // namespace v8::internal |
832 | 808 |
833 #endif // V8_DEBUG_H_ | 809 #endif // V8_DEBUG_H_ |
OLD | NEW |