LCOV - code coverage report
Current view: top level - src/compiler - node-marker.h (source / functions) Hit Total Coverage
Test: app.info Lines: 6 6 100.0 %
Date: 2019-04-17 Functions: 0 0 -

          Line data    Source code
       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
       3             : // found in the LICENSE file.
       4             : 
       5             : #ifndef V8_COMPILER_NODE_MARKER_H_
       6             : #define V8_COMPILER_NODE_MARKER_H_
       7             : 
       8             : #include "src/compiler/node.h"
       9             : 
      10             : namespace v8 {
      11             : namespace internal {
      12             : namespace compiler {
      13             : 
      14             : // Forward declarations.
      15             : class Graph;
      16             : 
      17             : 
      18             : // Base class for templatized NodeMarkers.
      19             : class NodeMarkerBase {
      20             :  public:
      21             :   NodeMarkerBase(Graph* graph, uint32_t num_states);
      22             : 
      23             :   V8_INLINE Mark Get(const Node* node) {
      24             :     Mark mark = node->mark();
      25  4409857826 :     if (mark < mark_min_) {
      26             :       return 0;
      27             :     }
      28             :     DCHECK_LT(mark, mark_max_);
      29  3428846503 :     return mark - mark_min_;
      30             :   }
      31             :   V8_INLINE void Set(Node* node, Mark mark) {
      32             :     DCHECK_LT(mark, mark_max_ - mark_min_);
      33             :     DCHECK_LT(node->mark(), mark_max_);
      34  1519436338 :     node->set_mark(mark + mark_min_);
      35             :   }
      36             : 
      37             :  private:
      38             :   Mark const mark_min_;
      39             :   Mark const mark_max_;
      40             : 
      41             :   DISALLOW_COPY_AND_ASSIGN(NodeMarkerBase);
      42             : };
      43             : 
      44             : // A NodeMarker assigns a local "state" to every node of a graph in constant
      45             : // memory. Only one NodeMarker per graph is valid at a given time, that is,
      46             : // after you create a NodeMarker you should no longer use NodeMarkers that
      47             : // were created earlier. Internally, the local state is stored in the Node
      48             : // structure.
      49             : //
      50             : // When you initialize a NodeMarker, all the local states are conceptually
      51             : // set to State(0) in constant time.
      52             : //
      53             : // In its current implementation, in debug mode NodeMarker will try to
      54             : // (efficiently) detect invalid use of an older NodeMarker. Namely, if you set a
      55             : // node with a NodeMarker, and then get or set that node with an older
      56             : // NodeMarker you will get a crash.
      57             : //
      58             : // GraphReducer uses a NodeMarker, so individual Reducers cannot use a
      59             : // NodeMarker.
      60             : template <typename State>
      61             : class NodeMarker : public NodeMarkerBase {
      62             :  public:
      63             :   V8_INLINE NodeMarker(Graph* graph, uint32_t num_states)
      64    15509232 :       : NodeMarkerBase(graph, num_states) {}
      65             : 
      66             :   V8_INLINE State Get(const Node* node) {
      67  2655730526 :     return static_cast<State>(NodeMarkerBase::Get(node));
      68             :   }
      69             : 
      70             :   V8_INLINE void Set(Node* node, State state) {
      71     1473917 :     NodeMarkerBase::Set(node, static_cast<Mark>(state));
      72             :   }
      73             : };
      74             : 
      75             : }  // namespace compiler
      76             : }  // namespace internal
      77             : }  // namespace v8
      78             : 
      79             : #endif  // V8_COMPILER_NODE_MARKER_H_

Generated by: LCOV version 1.10