| // Copyright 2013 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_GRAPH_H_ | |
| #define V8_COMPILER_GRAPH_H_ | |
| #include <array> | |
| #include "src/base/compiler-specific.h" | |
| #include "src/globals.h" | |
| #include "src/zone/zone-containers.h" | |
| #include "src/zone/zone.h" | |
| namespace v8 { | |
| namespace internal { | |
| namespace compiler { | |
| // Forward declarations. | |
| class GraphDecorator; | |
| class Node; | |
| class Operator; | |
| // Marks are used during traversal of the graph to distinguish states of nodes. | |
| // Each node has a mark which is a monotonically increasing integer, and a | |
| // {NodeMarker} has a range of values that indicate states of a node. | |
| typedef uint32_t Mark; | |
| // NodeIds are identifying numbers for nodes that can be used to index auxiliary | |
| // out-of-line data associated with each node. | |
| typedef uint32_t NodeId; | |
| class V8_EXPORT_PRIVATE Graph final : public NON_EXPORTED_BASE(ZoneObject) { | |
| public: | |
| explicit Graph(Zone* zone); | |
| // Scope used when creating a subgraph for inlining. Automatically preserves | |
| // the original start and end nodes of the graph, and resets them when you | |
| // leave the scope. | |
| class SubgraphScope final { | |
| public: | |
| explicit SubgraphScope(Graph* graph) | |
| : graph_(graph), start_(graph->start()), end_(graph->end()) {} | |
| ~SubgraphScope() { | |
| graph_->SetStart(start_); | |
| graph_->SetEnd(end_); | |
| } | |
| private: | |
| Graph* const graph_; | |
| Node* const start_; | |
| Node* const end_; | |
| DISALLOW_COPY_AND_ASSIGN(SubgraphScope); | |
| }; | |
| // Base implementation used by all factory methods. | |
| Node* NewNodeUnchecked(const Operator* op, int input_count, | |
| Node* const* inputs, bool incomplete = false); | |
| // Factory that checks the input count. | |
| Node* NewNode(const Operator* op, int input_count, Node* const* inputs, | |
| bool incomplete = false); | |
| // Factory template for nodes with static input counts. | |
| template <typename... Nodes> | |
| Node* NewNode(const Operator* op, Nodes*... nodes) { | |
| std::array<Node*, sizeof...(nodes)> nodes_arr{{nodes...}}; | |
| return NewNode(op, nodes_arr.size(), nodes_arr.data()); | |
| } | |
| // Clone the {node}, and assign a new node id to the copy. | |
| Node* CloneNode(const Node* node); | |
| Zone* zone() const { return zone_; } | |
| Node* start() const { return start_; } | |
| Node* end() const { return end_; } | |
| void SetStart(Node* start) { start_ = start; } | |
| void SetEnd(Node* end) { end_ = end; } | |
| size_t NodeCount() const { return next_node_id_; } | |
| void Decorate(Node* node); | |
| void AddDecorator(GraphDecorator* decorator); | |
| void RemoveDecorator(GraphDecorator* decorator); | |
| // Very simple print API usable in a debugger. | |
| void Print() const; | |
| private: | |
| friend class NodeMarkerBase; | |
| inline NodeId NextNodeId(); | |
| Zone* const zone_; | |
| Node* start_; | |
| Node* end_; | |
| Mark mark_max_; | |
| NodeId next_node_id_; | |
| ZoneVector<GraphDecorator*> decorators_; | |
| DISALLOW_COPY_AND_ASSIGN(Graph); | |
| }; | |
| // A graph decorator can be used to add behavior to the creation of nodes | |
| // in a graph. | |
| class GraphDecorator : public ZoneObject { | |
| public: | |
| virtual ~GraphDecorator() {} | |
| virtual void Decorate(Node* node) = 0; | |
| }; | |
| } // namespace compiler | |
| } // namespace internal | |
| } // namespace v8 | |
| #endif // V8_COMPILER_GRAPH_H_ |