1 // Copyright 2013 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_GRAPH_H_ 6 #define V8_COMPILER_GRAPH_H_ 7 8 #include <map> 9 #include <set> 10 11 #include "src/compiler/generic-algorithm.h" 12 #include "src/compiler/node.h" 13 #include "src/compiler/node-aux-data.h" 14 #include "src/compiler/source-position.h" 15 16 namespace v8 { 17 namespace internal { 18 namespace compiler { 19 20 class GraphDecorator; 21 22 23 class Graph : public GenericGraph<Node> { 24 public: 25 explicit Graph(Zone* zone); 26 27 // Base implementation used by all factory methods. 28 Node* NewNode(const Operator* op, int input_count, Node** inputs); 29 30 // Factories for nodes with static input counts. NewNode(const Operator * op)31 Node* NewNode(const Operator* op) { 32 return NewNode(op, 0, static_cast<Node**>(NULL)); 33 } NewNode(const Operator * op,Node * n1)34 Node* NewNode(const Operator* op, Node* n1) { return NewNode(op, 1, &n1); } NewNode(const Operator * op,Node * n1,Node * n2)35 Node* NewNode(const Operator* op, Node* n1, Node* n2) { 36 Node* nodes[] = {n1, n2}; 37 return NewNode(op, arraysize(nodes), nodes); 38 } NewNode(const Operator * op,Node * n1,Node * n2,Node * n3)39 Node* NewNode(const Operator* op, Node* n1, Node* n2, Node* n3) { 40 Node* nodes[] = {n1, n2, n3}; 41 return NewNode(op, arraysize(nodes), nodes); 42 } NewNode(const Operator * op,Node * n1,Node * n2,Node * n3,Node * n4)43 Node* NewNode(const Operator* op, Node* n1, Node* n2, Node* n3, Node* n4) { 44 Node* nodes[] = {n1, n2, n3, n4}; 45 return NewNode(op, arraysize(nodes), nodes); 46 } NewNode(const Operator * op,Node * n1,Node * n2,Node * n3,Node * n4,Node * n5)47 Node* NewNode(const Operator* op, Node* n1, Node* n2, Node* n3, Node* n4, 48 Node* n5) { 49 Node* nodes[] = {n1, n2, n3, n4, n5}; 50 return NewNode(op, arraysize(nodes), nodes); 51 } NewNode(const Operator * op,Node * n1,Node * n2,Node * n3,Node * n4,Node * n5,Node * n6)52 Node* NewNode(const Operator* op, Node* n1, Node* n2, Node* n3, Node* n4, 53 Node* n5, Node* n6) { 54 Node* nodes[] = {n1, n2, n3, n4, n5, n6}; 55 return NewNode(op, arraysize(nodes), nodes); 56 } 57 58 template <class Visitor> 59 void VisitNodeUsesFrom(Node* node, Visitor* visitor); 60 61 template <class Visitor> 62 void VisitNodeUsesFromStart(Visitor* visitor); 63 64 template <class Visitor> 65 void VisitNodeInputsFromEnd(Visitor* visitor); 66 AddDecorator(GraphDecorator * decorator)67 void AddDecorator(GraphDecorator* decorator) { 68 decorators_.push_back(decorator); 69 } 70 RemoveDecorator(GraphDecorator * decorator)71 void RemoveDecorator(GraphDecorator* decorator) { 72 ZoneVector<GraphDecorator*>::iterator it = 73 std::find(decorators_.begin(), decorators_.end(), decorator); 74 DCHECK(it != decorators_.end()); 75 decorators_.erase(it, it + 1); 76 } 77 78 private: 79 ZoneVector<GraphDecorator*> decorators_; 80 }; 81 82 83 class GraphDecorator : public ZoneObject { 84 public: ~GraphDecorator()85 virtual ~GraphDecorator() {} 86 virtual void Decorate(Node* node) = 0; 87 }; 88 89 } // namespace compiler 90 } // namespace internal 91 } // namespace v8 92 93 #endif // V8_COMPILER_GRAPH_H_ 94