| 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 #ifndef RUNTIME_VM_FLOW_GRAPH_BUILDER_H_ | 5 #ifndef RUNTIME_VM_FLOW_GRAPH_BUILDER_H_ |
| 6 #define RUNTIME_VM_FLOW_GRAPH_BUILDER_H_ | 6 #define RUNTIME_VM_FLOW_GRAPH_BUILDER_H_ |
| 7 | 7 |
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
| 9 #include "platform/globals.h" | 9 #include "platform/globals.h" |
| 10 #include "vm/allocation.h" | 10 #include "vm/allocation.h" |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 intptr_t try_index); | 83 intptr_t try_index); |
| 84 | 84 |
| 85 Isolate* isolate() const { return caller_graph_->isolate(); } | 85 Isolate* isolate() const { return caller_graph_->isolate(); } |
| 86 Zone* zone() const { return caller_graph_->zone(); } | 86 Zone* zone() const { return caller_graph_->zone(); } |
| 87 | 87 |
| 88 FlowGraph* caller_graph_; | 88 FlowGraph* caller_graph_; |
| 89 Definition* call_; | 89 Definition* call_; |
| 90 GrowableArray<Data> exits_; | 90 GrowableArray<Data> exits_; |
| 91 }; | 91 }; |
| 92 | 92 |
| 93 | |
| 94 // Build a flow graph from a parsed function's AST. | 93 // Build a flow graph from a parsed function's AST. |
| 95 class FlowGraphBuilder : public ValueObject { | 94 class FlowGraphBuilder : public ValueObject { |
| 96 public: | 95 public: |
| 97 // The inlining context is NULL if not inlining. The osr_id is the deopt | 96 // The inlining context is NULL if not inlining. The osr_id is the deopt |
| 98 // id of the OSR entry or Compiler::kNoOSRDeoptId if not compiling for OSR. | 97 // id of the OSR entry or Compiler::kNoOSRDeoptId if not compiling for OSR. |
| 99 FlowGraphBuilder(const ParsedFunction& parsed_function, | 98 FlowGraphBuilder(const ParsedFunction& parsed_function, |
| 100 const ZoneGrowableArray<const ICData*>& ic_data_array, | 99 const ZoneGrowableArray<const ICData*>& ic_data_array, |
| 101 ZoneGrowableArray<intptr_t>* context_level_array, | 100 ZoneGrowableArray<intptr_t>* context_level_array, |
| 102 InlineExitCollector* exit_collector, | 101 InlineExitCollector* exit_collector, |
| 103 intptr_t osr_id); | 102 intptr_t osr_id); |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 // for OSR. | 222 // for OSR. |
| 224 const intptr_t osr_id_; | 223 const intptr_t osr_id_; |
| 225 | 224 |
| 226 intptr_t jump_count_; | 225 intptr_t jump_count_; |
| 227 ZoneGrowableArray<JoinEntryInstr*>* await_joins_; | 226 ZoneGrowableArray<JoinEntryInstr*>* await_joins_; |
| 228 ZoneGrowableArray<TokenPosition>* await_token_positions_; | 227 ZoneGrowableArray<TokenPosition>* await_token_positions_; |
| 229 | 228 |
| 230 DISALLOW_IMPLICIT_CONSTRUCTORS(FlowGraphBuilder); | 229 DISALLOW_IMPLICIT_CONSTRUCTORS(FlowGraphBuilder); |
| 231 }; | 230 }; |
| 232 | 231 |
| 233 | |
| 234 // Translate an AstNode to a control-flow graph fragment for its effects | 232 // Translate an AstNode to a control-flow graph fragment for its effects |
| 235 // (e.g., a statement or an expression in an effect context). Implements a | 233 // (e.g., a statement or an expression in an effect context). Implements a |
| 236 // function from an AstNode and next temporary index to a graph fragment | 234 // function from an AstNode and next temporary index to a graph fragment |
| 237 // with a single entry and at most one exit. The fragment is represented by | 235 // with a single entry and at most one exit. The fragment is represented by |
| 238 // an (entry, exit) pair of Instruction pointers: | 236 // an (entry, exit) pair of Instruction pointers: |
| 239 // | 237 // |
| 240 // - (NULL, NULL): an empty and open graph fragment | 238 // - (NULL, NULL): an empty and open graph fragment |
| 241 // - (i0, NULL): a closed graph fragment which has only non-local exits | 239 // - (i0, NULL): a closed graph fragment which has only non-local exits |
| 242 // - (i0, i1): an open graph fragment | 240 // - (i0, i1): an open graph fragment |
| 243 class EffectGraphVisitor : public AstNodeVisitor { | 241 class EffectGraphVisitor : public AstNodeVisitor { |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 461 } | 459 } |
| 462 | 460 |
| 463 // Shared global state. | 461 // Shared global state. |
| 464 FlowGraphBuilder* owner_; | 462 FlowGraphBuilder* owner_; |
| 465 | 463 |
| 466 // Output parameters. | 464 // Output parameters. |
| 467 Instruction* entry_; | 465 Instruction* entry_; |
| 468 Instruction* exit_; | 466 Instruction* exit_; |
| 469 }; | 467 }; |
| 470 | 468 |
| 471 | |
| 472 // Translate an AstNode to a control-flow graph fragment for both its effects | 469 // Translate an AstNode to a control-flow graph fragment for both its effects |
| 473 // and value (e.g., for an expression in a value context). Implements a | 470 // and value (e.g., for an expression in a value context). Implements a |
| 474 // function from an AstNode and next temporary index to a graph fragment (as | 471 // function from an AstNode and next temporary index to a graph fragment (as |
| 475 // in the EffectGraphVisitor), a next temporary index, and an intermediate | 472 // in the EffectGraphVisitor), a next temporary index, and an intermediate |
| 476 // language Value. | 473 // language Value. |
| 477 class ValueGraphVisitor : public EffectGraphVisitor { | 474 class ValueGraphVisitor : public EffectGraphVisitor { |
| 478 public: | 475 public: |
| 479 explicit ValueGraphVisitor(FlowGraphBuilder* owner) | 476 explicit ValueGraphVisitor(FlowGraphBuilder* owner) |
| 480 : EffectGraphVisitor(owner), value_(NULL) {} | 477 : EffectGraphVisitor(owner), value_(NULL) {} |
| 481 | 478 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 507 virtual void ReturnValue(Value* value) { value_ = value; } | 504 virtual void ReturnValue(Value* value) { value_ = value; } |
| 508 | 505 |
| 509 // Specify a definition of the final result. Adds the definition to | 506 // Specify a definition of the final result. Adds the definition to |
| 510 // the graph and returns a use of it (i.e., set the visitor's output | 507 // the graph and returns a use of it (i.e., set the visitor's output |
| 511 // parameters). | 508 // parameters). |
| 512 virtual void ReturnDefinition(Definition* definition) { | 509 virtual void ReturnDefinition(Definition* definition) { |
| 513 ReturnValue(Bind(definition)); | 510 ReturnValue(Bind(definition)); |
| 514 } | 511 } |
| 515 }; | 512 }; |
| 516 | 513 |
| 517 | |
| 518 // Translate an AstNode to a control-flow graph fragment for both its | 514 // Translate an AstNode to a control-flow graph fragment for both its |
| 519 // effects and true/false control flow (e.g., for an expression in a test | 515 // effects and true/false control flow (e.g., for an expression in a test |
| 520 // context). The resulting graph is always closed (even if it is empty) | 516 // context). The resulting graph is always closed (even if it is empty) |
| 521 // Successor control flow is explicitly set by a pair of pointers to | 517 // Successor control flow is explicitly set by a pair of pointers to |
| 522 // TargetEntryInstr*. | 518 // TargetEntryInstr*. |
| 523 // | 519 // |
| 524 // To distinguish between the graphs with only nonlocal exits and graphs | 520 // To distinguish between the graphs with only nonlocal exits and graphs |
| 525 // with both true and false exits, there are a pair of TargetEntryInstr**: | 521 // with both true and false exits, there are a pair of TargetEntryInstr**: |
| 526 // | 522 // |
| 527 // - Both NULL: only non-local exits, truly closed | 523 // - Both NULL: only non-local exits, truly closed |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 // Output parameters. | 567 // Output parameters. |
| 572 GrowableArray<TargetEntryInstr**> true_successor_addresses_; | 568 GrowableArray<TargetEntryInstr**> true_successor_addresses_; |
| 573 GrowableArray<TargetEntryInstr**> false_successor_addresses_; | 569 GrowableArray<TargetEntryInstr**> false_successor_addresses_; |
| 574 | 570 |
| 575 TokenPosition condition_token_pos_; | 571 TokenPosition condition_token_pos_; |
| 576 }; | 572 }; |
| 577 | 573 |
| 578 } // namespace dart | 574 } // namespace dart |
| 579 | 575 |
| 580 #endif // RUNTIME_VM_FLOW_GRAPH_BUILDER_H_ | 576 #endif // RUNTIME_VM_FLOW_GRAPH_BUILDER_H_ |
| OLD | NEW |