Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(434)

Side by Side Diff: src/debug/debug.h

Issue 1682853003: [debugger] introduce abstract interface for break location. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: revert stray edit Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/debug/arm64/debug-arm64.cc ('k') | src/debug/debug.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_DEBUG_H_ 5 #ifndef V8_DEBUG_DEBUG_H_
6 #define V8_DEBUG_DEBUG_H_ 6 #define V8_DEBUG_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 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 75
76 static void AllForStatementPosition(Handle<DebugInfo> debug_info, 76 static void AllForStatementPosition(Handle<DebugInfo> debug_info,
77 int statement_position, 77 int statement_position,
78 List<BreakLocation>* result_out); 78 List<BreakLocation>* result_out);
79 79
80 static BreakLocation FromPosition(Handle<DebugInfo> debug_info, int position, 80 static BreakLocation FromPosition(Handle<DebugInfo> debug_info, int position,
81 BreakPositionAlignment alignment); 81 BreakPositionAlignment alignment);
82 82
83 bool IsDebugBreak() const; 83 bool IsDebugBreak() const;
84 84
85 inline bool IsReturn() const { 85 inline bool IsReturn() const { return type_ == DEBUG_BREAK_SLOT_AT_RETURN; }
86 return RelocInfo::IsDebugBreakSlotAtReturn(rmode_); 86 inline bool IsCall() const { return type_ == DEBUG_BREAK_SLOT_AT_CALL; }
87 }
88 inline bool IsCall() const {
89 return RelocInfo::IsDebugBreakSlotAtCall(rmode_);
90 }
91 inline bool HasBreakPoint() const { 87 inline bool HasBreakPoint() const {
92 return debug_info_->HasBreakPoint(code_offset_); 88 return debug_info_->HasBreakPoint(code_offset_);
93 } 89 }
94 90
95 Handle<Object> BreakPointObjects() const; 91 Handle<Object> BreakPointObjects() const;
96 92
97 void SetBreakPoint(Handle<Object> break_point_object); 93 void SetBreakPoint(Handle<Object> break_point_object);
98 void ClearBreakPoint(Handle<Object> break_point_object); 94 void ClearBreakPoint(Handle<Object> break_point_object);
99 95
100 void SetOneShot(); 96 void SetOneShot();
101 void ClearOneShot(); 97 void ClearOneShot();
102 98
103
104 inline RelocInfo rinfo() const {
105 return RelocInfo(debug_info_->GetIsolate(), pc(), rmode(), data_, code());
106 }
107
108 inline int position() const { return position_; } 99 inline int position() const { return position_; }
109 inline int statement_position() const { return statement_position_; } 100 inline int statement_position() const { return statement_position_; }
110 101
111 inline int code_offset() const { return code_offset_; } 102 inline int code_offset() const { return code_offset_; }
103 inline Isolate* isolate() { return debug_info_->GetIsolate(); }
112 104
113 inline RelocInfo::Mode rmode() const { return rmode_; } 105 inline AbstractCode* abstract_code() const {
114 106 return debug_info_->abstract_code();
115 inline Code* code() const { return debug_info_->code(); } 107 }
116 108
117 private: 109 private:
118 BreakLocation(Handle<DebugInfo> debug_info, RelocInfo* rinfo, int position, 110 enum DebugBreakType {
119 int statement_position); 111 NOT_DEBUG_BREAK,
112 DEBUGGER_STATEMENT,
113 DEBUG_BREAK_SLOT,
114 DEBUG_BREAK_SLOT_AT_CALL,
115 DEBUG_BREAK_SLOT_AT_RETURN
116 };
117
118 BreakLocation(Handle<DebugInfo> debug_info, DebugBreakType type,
119 int code_offset, int position, int statement_position);
120 120
121 class Iterator { 121 class Iterator {
122 public: 122 public:
123 Iterator(Handle<DebugInfo> debug_info, BreakLocatorType type); 123 virtual ~Iterator() {}
124 124
125 BreakLocation GetBreakLocation() { 125 virtual BreakLocation GetBreakLocation() = 0;
126 return BreakLocation(debug_info_, rinfo(), position(), 126 virtual bool Done() const = 0;
127 statement_position()); 127 virtual void Next() = 0;
128 }
129
130 inline bool Done() const { return reloc_iterator_.done(); }
131 void Next();
132 128
133 void SkipTo(int count) { 129 void SkipTo(int count) {
134 while (count-- > 0) Next(); 130 while (count-- > 0) Next();
135 } 131 }
136 132
137 inline RelocInfo::Mode rmode() { return reloc_iterator_.rinfo()->rmode(); } 133 virtual int code_offset() = 0;
138 inline RelocInfo* rinfo() { return reloc_iterator_.rinfo(); }
139 inline Address pc() { return rinfo()->pc(); }
140 int break_index() const { return break_index_; } 134 int break_index() const { return break_index_; }
141 inline int position() const { return position_; } 135 inline int position() const { return position_; }
142 inline int statement_position() const { return statement_position_; } 136 inline int statement_position() const { return statement_position_; }
143 137
144 private: 138 protected:
145 static int GetModeMask(BreakLocatorType type); 139 Iterator(Handle<DebugInfo> debug_info, BreakLocatorType type);
146 140
147 Handle<DebugInfo> debug_info_; 141 Handle<DebugInfo> debug_info_;
148 RelocIterator reloc_iterator_;
149 int break_index_; 142 int break_index_;
150 int position_; 143 int position_;
151 int statement_position_; 144 int statement_position_;
152 145
146 private:
153 DisallowHeapAllocation no_gc_; 147 DisallowHeapAllocation no_gc_;
154
155 DISALLOW_COPY_AND_ASSIGN(Iterator); 148 DISALLOW_COPY_AND_ASSIGN(Iterator);
156 }; 149 };
157 150
151 class CodeIterator : public Iterator {
152 public:
153 CodeIterator(Handle<DebugInfo> debug_info, BreakLocatorType type);
154 ~CodeIterator() override{};
155
156 BreakLocation GetBreakLocation() override;
157 bool Done() const override { return reloc_iterator_.done(); }
158 void Next() override;
159
160 int code_offset() override {
161 return static_cast<int>(
162 rinfo()->pc() -
163 debug_info_->abstract_code()->GetCode()->instruction_start());
164 }
165
166 private:
167 static int GetModeMask(BreakLocatorType type);
168 RelocInfo::Mode rmode() { return reloc_iterator_.rinfo()->rmode(); }
169 RelocInfo* rinfo() { return reloc_iterator_.rinfo(); }
170
171 RelocIterator reloc_iterator_;
172 DISALLOW_COPY_AND_ASSIGN(CodeIterator);
173 };
174
175 static Iterator* GetIterator(Handle<DebugInfo> debug_info,
176 BreakLocatorType type = ALL_BREAK_LOCATIONS);
177
158 friend class Debug; 178 friend class Debug;
159 179
160 static int BreakIndexFromCodeOffset(Handle<DebugInfo> debug_info, int offset); 180 static int BreakIndexFromCodeOffset(Handle<DebugInfo> debug_info, int offset);
161 181
162 void SetDebugBreak(); 182 void SetDebugBreak();
163 void ClearDebugBreak(); 183 void ClearDebugBreak();
164 184
165 inline bool IsDebuggerStatement() const { 185 inline bool IsDebuggerStatement() const {
166 return RelocInfo::IsDebuggerStatement(rmode_); 186 return type_ == DEBUGGER_STATEMENT;
167 } 187 }
168 inline bool IsDebugBreakSlot() const { 188 inline bool IsDebugBreakSlot() const { return type_ >= DEBUG_BREAK_SLOT; }
169 return RelocInfo::IsDebugBreakSlot(rmode_);
170 }
171
172 inline Address pc() const { return code()->entry() + code_offset_; }
173 189
174 Handle<DebugInfo> debug_info_; 190 Handle<DebugInfo> debug_info_;
175 int code_offset_; 191 int code_offset_;
176 RelocInfo::Mode rmode_; 192 DebugBreakType type_;
177 intptr_t data_;
178 int position_; 193 int position_;
179 int statement_position_; 194 int statement_position_;
180 }; 195 };
181 196
182 197
183 // Linked list holding debug info objects. The debug info objects are kept as 198 // Linked list holding debug info objects. The debug info objects are kept as
184 // weak handles to avoid a debug info object to keep a function alive. 199 // weak handles to avoid a debug info object to keep a function alive.
185 class DebugInfoListNode { 200 class DebugInfoListNode {
186 public: 201 public:
187 explicit DebugInfoListNode(DebugInfo* debug_info); 202 explicit DebugInfoListNode(DebugInfo* debug_info);
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after
743 // several frames above. 758 // several frames above.
744 // There is no calling conventions here, because it never actually gets 759 // There is no calling conventions here, because it never actually gets
745 // called, it only gets returned to. 760 // called, it only gets returned to.
746 static void GenerateFrameDropperLiveEdit(MacroAssembler* masm); 761 static void GenerateFrameDropperLiveEdit(MacroAssembler* masm);
747 762
748 763
749 static void GenerateSlot(MacroAssembler* masm, RelocInfo::Mode mode); 764 static void GenerateSlot(MacroAssembler* masm, RelocInfo::Mode mode);
750 765
751 static void PatchDebugBreakSlot(Isolate* isolate, Address pc, 766 static void PatchDebugBreakSlot(Isolate* isolate, Address pc,
752 Handle<Code> code); 767 Handle<Code> code);
768 static bool DebugBreakSlotIsPatched(Address pc);
753 static void ClearDebugBreakSlot(Isolate* isolate, Address pc); 769 static void ClearDebugBreakSlot(Isolate* isolate, Address pc);
754 }; 770 };
755 771
756 772
757 } // namespace internal 773 } // namespace internal
758 } // namespace v8 774 } // namespace v8
759 775
760 #endif // V8_DEBUG_DEBUG_H_ 776 #endif // V8_DEBUG_DEBUG_H_
OLDNEW
« no previous file with comments | « src/debug/arm64/debug-arm64.cc ('k') | src/debug/debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698