// Copyright 2015 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_COMPILER_NODE_MARKER_H_ #define V8_COMPILER_NODE_MARKER_H_ #include "src/compiler/node.h" namespace v8 { namespace internal { namespace compiler { // Forward declarations. class Graph; // Base class for templatized NodeMarkers. class NodeMarkerBase { public: NodeMarkerBase(Graph* graph, uint32_t num_states); V8_INLINE Mark Get(const Node* node) { Mark mark = node->mark(); if (mark < mark_min_) { return 0; } DCHECK_LT(mark, mark_max_); return mark - mark_min_; } V8_INLINE void Set(Node* node, Mark mark) { DCHECK_LT(mark, mark_max_ - mark_min_); DCHECK_LT(node->mark(), mark_max_); node->set_mark(mark + mark_min_); } private: Mark const mark_min_; Mark const mark_max_; DISALLOW_COPY_AND_ASSIGN(NodeMarkerBase); }; // A NodeMarker assigns a local "state" to every node of a graph in constant // memory. Only one NodeMarker per graph is valid at a given time, that is, // after you create a NodeMarker you should no longer use NodeMarkers that // were created earlier. Internally, the local state is stored in the Node // structure. // // When you initialize a NodeMarker, all the local states are conceptually // set to State(0) in constant time. // // In its current implementation, in debug mode NodeMarker will try to // (efficiently) detect invalid use of an older NodeMarker. Namely, if you set a // node with a NodeMarker, and then get or set that node with an older // NodeMarker you will get a crash. // // GraphReducer uses a NodeMarker, so individual Reducers cannot use a // NodeMarker. template class NodeMarker : public NodeMarkerBase { public: V8_INLINE NodeMarker(Graph* graph, uint32_t num_states) : NodeMarkerBase(graph, num_states) {} V8_INLINE State Get(const Node* node) { return static_cast(NodeMarkerBase::Get(node)); } V8_INLINE void Set(Node* node, State state) { NodeMarkerBase::Set(node, static_cast(state)); } }; } // namespace compiler } // namespace internal } // namespace v8 #endif // V8_COMPILER_NODE_MARKER_H_