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

Side by Side Diff: src/compiler/bytecode-graph-builder.h

Issue 1641723002: [interpreter] Translate exception handlers into graph. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed comments. 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/compiler/bytecode-branch-analysis.cc ('k') | src/compiler/bytecode-graph-builder.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 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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_COMPILER_BYTECODE_GRAPH_BUILDER_H_ 5 #ifndef V8_COMPILER_BYTECODE_GRAPH_BUILDER_H_
6 #define V8_COMPILER_BYTECODE_GRAPH_BUILDER_H_ 6 #define V8_COMPILER_BYTECODE_GRAPH_BUILDER_H_
7 7
8 #include "src/compiler.h" 8 #include "src/compiler.h"
9 #include "src/compiler/bytecode-branch-analysis.h" 9 #include "src/compiler/bytecode-branch-analysis.h"
10 #include "src/compiler/js-graph.h" 10 #include "src/compiler/js-graph.h"
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 void BuildConditionalJump(Node* condition); 168 void BuildConditionalJump(Node* condition);
169 void BuildJumpIfEqual(Node* comperand); 169 void BuildJumpIfEqual(Node* comperand);
170 void BuildJumpIfToBooleanEqual(Node* boolean_comperand); 170 void BuildJumpIfToBooleanEqual(Node* boolean_comperand);
171 171
172 // Constructing merge and loop headers. 172 // Constructing merge and loop headers.
173 void MergeEnvironmentsOfBackwardBranches(int source_offset, 173 void MergeEnvironmentsOfBackwardBranches(int source_offset,
174 int target_offset); 174 int target_offset);
175 void MergeEnvironmentsOfForwardBranches(int source_offset); 175 void MergeEnvironmentsOfForwardBranches(int source_offset);
176 void BuildLoopHeaderForBackwardBranches(int source_offset); 176 void BuildLoopHeaderForBackwardBranches(int source_offset);
177 177
178 // Simulates entry and exit of exception handlers.
179 void EnterAndExitExceptionHandlers(int current_offset);
180
178 // Attaches a frame state to |node| for the entry to the function. 181 // Attaches a frame state to |node| for the entry to the function.
179 void PrepareEntryFrameState(Node* node); 182 void PrepareEntryFrameState(Node* node);
180 183
181 // Growth increment for the temporary buffer used to construct input lists to 184 // Growth increment for the temporary buffer used to construct input lists to
182 // new nodes. 185 // new nodes.
183 static const int kInputBufferSizeIncrement = 64; 186 static const int kInputBufferSizeIncrement = 64;
184 187
188 // An abstract representation for an exception handler that is being
189 // entered and exited while the graph builder is iterating over the
190 // underlying bytecode. The exception handlers within the bytecode are
191 // well scoped, hence will form a stack during iteration.
192 struct ExceptionHandler {
193 int start_offset_; // Start offset of the handled area in the bytecode.
194 int end_offset_; // End offset of the handled area in the bytecode.
195 int handler_offset_; // Handler entry offset within the bytecode.
196 };
197
185 // Field accessors 198 // Field accessors
186 CommonOperatorBuilder* common() const { return jsgraph_->common(); } 199 CommonOperatorBuilder* common() const { return jsgraph_->common(); }
187 Zone* graph_zone() const { return graph()->zone(); } 200 Zone* graph_zone() const { return graph()->zone(); }
188 CompilationInfo* info() const { return info_; } 201 CompilationInfo* info() const { return info_; }
189 JSGraph* jsgraph() const { return jsgraph_; } 202 JSGraph* jsgraph() const { return jsgraph_; }
190 JSOperatorBuilder* javascript() const { return jsgraph_->javascript(); } 203 JSOperatorBuilder* javascript() const { return jsgraph_->javascript(); }
191 Zone* local_zone() const { return local_zone_; } 204 Zone* local_zone() const { return local_zone_; }
192 const Handle<BytecodeArray>& bytecode_array() const { 205 const Handle<BytecodeArray>& bytecode_array() const {
193 return bytecode_array_; 206 return bytecode_array_;
194 } 207 }
208 const Handle<HandlerTable>& exception_handler_table() const {
209 return exception_handler_table_;
210 }
195 const FrameStateFunctionInfo* frame_state_function_info() const { 211 const FrameStateFunctionInfo* frame_state_function_info() const {
196 return frame_state_function_info_; 212 return frame_state_function_info_;
197 } 213 }
198 214
199 LanguageMode language_mode() const { 215 LanguageMode language_mode() const {
200 // TODO(mythria): Don't rely on parse information to get language mode. 216 // TODO(mythria): Don't rely on parse information to get language mode.
201 return info()->language_mode(); 217 return info()->language_mode();
202 } 218 }
203 219
204 const interpreter::BytecodeArrayIterator* bytecode_iterator() const { 220 const interpreter::BytecodeArrayIterator* bytecode_iterator() const {
205 return bytecode_iterator_; 221 return bytecode_iterator_;
206 } 222 }
207 223
208 void set_bytecode_iterator( 224 void set_bytecode_iterator(
209 const interpreter::BytecodeArrayIterator* bytecode_iterator) { 225 const interpreter::BytecodeArrayIterator* bytecode_iterator) {
210 bytecode_iterator_ = bytecode_iterator; 226 bytecode_iterator_ = bytecode_iterator;
211 } 227 }
212 228
213 const BytecodeBranchAnalysis* branch_analysis() const { 229 const BytecodeBranchAnalysis* branch_analysis() const {
214 return branch_analysis_; 230 return branch_analysis_;
215 } 231 }
216 232
217 void set_branch_analysis(const BytecodeBranchAnalysis* branch_analysis) { 233 void set_branch_analysis(BytecodeBranchAnalysis* branch_analysis) {
218 branch_analysis_ = branch_analysis; 234 branch_analysis_ = branch_analysis;
219 } 235 }
220 236
221 #define DECLARE_VISIT_BYTECODE(name, ...) \ 237 #define DECLARE_VISIT_BYTECODE(name, ...) \
222 void Visit##name(const interpreter::BytecodeArrayIterator& iterator); 238 void Visit##name(const interpreter::BytecodeArrayIterator& iterator);
223 BYTECODE_LIST(DECLARE_VISIT_BYTECODE) 239 BYTECODE_LIST(DECLARE_VISIT_BYTECODE)
224 #undef DECLARE_VISIT_BYTECODE 240 #undef DECLARE_VISIT_BYTECODE
225 241
226 Zone* local_zone_; 242 Zone* local_zone_;
227 CompilationInfo* info_; 243 CompilationInfo* info_;
228 JSGraph* jsgraph_; 244 JSGraph* jsgraph_;
229 Handle<BytecodeArray> bytecode_array_; 245 Handle<BytecodeArray> bytecode_array_;
246 Handle<HandlerTable> exception_handler_table_;
230 const FrameStateFunctionInfo* frame_state_function_info_; 247 const FrameStateFunctionInfo* frame_state_function_info_;
231 const interpreter::BytecodeArrayIterator* bytecode_iterator_; 248 const interpreter::BytecodeArrayIterator* bytecode_iterator_;
232 const BytecodeBranchAnalysis* branch_analysis_; 249 BytecodeBranchAnalysis* branch_analysis_; // TODO(mstarzinger): Make const.
233 Environment* environment_; 250 Environment* environment_;
234 251
235
236 // Merge environments are snapshots of the environment at a particular 252 // Merge environments are snapshots of the environment at a particular
237 // bytecode offset to be merged into a later environment. 253 // bytecode offset to be merged into a later environment.
238 ZoneMap<int, Environment*> merge_environments_; 254 ZoneMap<int, Environment*> merge_environments_;
239 255
240 // Loop header environments are environments created for bytecodes 256 // Loop header environments are environments created for bytecodes
241 // where it is known there are back branches, ie a loop header. 257 // where it is known there are back branches, ie a loop header.
242 ZoneMap<int, Environment*> loop_header_environments_; 258 ZoneMap<int, Environment*> loop_header_environments_;
243 259
260 // Exception handlers currently entered by the iteration.
261 ZoneStack<ExceptionHandler> exception_handlers_;
262 int current_exception_handler_;
263
244 // Temporary storage for building node input lists. 264 // Temporary storage for building node input lists.
245 int input_buffer_size_; 265 int input_buffer_size_;
246 Node** input_buffer_; 266 Node** input_buffer_;
247 267
248 // Nodes representing values in the activation record. 268 // Nodes representing values in the activation record.
249 SetOncePointer<Node> function_context_; 269 SetOncePointer<Node> function_context_;
250 SetOncePointer<Node> function_closure_; 270 SetOncePointer<Node> function_closure_;
251 SetOncePointer<Node> new_target_; 271 SetOncePointer<Node> new_target_;
252 272
253 // Optimization to cache loaded feedback vector. 273 // Optimization to cache loaded feedback vector.
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 Node* accumulator_state_values_; 362 Node* accumulator_state_values_;
343 int register_base_; 363 int register_base_;
344 int accumulator_base_; 364 int accumulator_base_;
345 }; 365 };
346 366
347 } // namespace compiler 367 } // namespace compiler
348 } // namespace internal 368 } // namespace internal
349 } // namespace v8 369 } // namespace v8
350 370
351 #endif // V8_COMPILER_BYTECODE_GRAPH_BUILDER_H_ 371 #endif // V8_COMPILER_BYTECODE_GRAPH_BUILDER_H_
OLDNEW
« no previous file with comments | « src/compiler/bytecode-branch-analysis.cc ('k') | src/compiler/bytecode-graph-builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698