OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/graph-visualizer.h" | 5 #include "src/compiler/graph-visualizer.h" |
6 | 6 |
7 #include "src/compiler/generic-algorithm.h" | 7 #include "src/compiler/generic-algorithm.h" |
8 #include "src/compiler/generic-node.h" | 8 #include "src/compiler/generic-node.h" |
9 #include "src/compiler/generic-node-inl.h" | 9 #include "src/compiler/generic-node-inl.h" |
10 #include "src/compiler/graph.h" | 10 #include "src/compiler/graph.h" |
11 #include "src/compiler/graph-inl.h" | 11 #include "src/compiler/graph-inl.h" |
12 #include "src/compiler/node.h" | 12 #include "src/compiler/node.h" |
13 #include "src/compiler/node-properties.h" | 13 #include "src/compiler/node-properties.h" |
14 #include "src/compiler/node-properties-inl.h" | 14 #include "src/compiler/node-properties-inl.h" |
15 #include "src/compiler/opcodes.h" | 15 #include "src/compiler/opcodes.h" |
16 #include "src/compiler/operator.h" | 16 #include "src/compiler/operator.h" |
17 #include "src/ostreams.h" | 17 #include "src/ostreams.h" |
18 | 18 |
19 namespace v8 { | 19 namespace v8 { |
20 namespace internal { | 20 namespace internal { |
21 namespace compiler { | 21 namespace compiler { |
22 | 22 |
23 #define DEAD_COLOR "#999999" | 23 #define DEAD_COLOR "#999999" |
24 | 24 |
25 class GraphVisualizer : public NullNodeVisitor { | 25 class GraphVisualizer : public NullNodeVisitor { |
26 public: | 26 public: |
27 GraphVisualizer(OStream& os, const Graph* graph); // NOLINT | 27 GraphVisualizer(OStream& os, Zone* zone, const Graph* graph); // NOLINT |
28 | 28 |
29 void Print(); | 29 void Print(); |
30 | 30 |
31 GenericGraphVisit::Control Pre(Node* node); | 31 GenericGraphVisit::Control Pre(Node* node); |
32 GenericGraphVisit::Control PreEdge(Node* from, int index, Node* to); | 32 GenericGraphVisit::Control PreEdge(Node* from, int index, Node* to); |
33 | 33 |
34 private: | 34 private: |
35 void AnnotateNode(Node* node); | 35 void AnnotateNode(Node* node); |
36 void PrintEdge(Node* from, int index, Node* to); | 36 void PrintEdge(Node* from, int index, Node* to); |
37 | 37 |
| 38 Zone* zone_; |
38 NodeSet all_nodes_; | 39 NodeSet all_nodes_; |
39 NodeSet white_nodes_; | 40 NodeSet white_nodes_; |
40 bool use_to_def_; | 41 bool use_to_def_; |
41 OStream& os_; | 42 OStream& os_; |
42 const Graph* const graph_; | 43 const Graph* const graph_; |
43 | 44 |
44 DISALLOW_COPY_AND_ASSIGN(GraphVisualizer); | 45 DISALLOW_COPY_AND_ASSIGN(GraphVisualizer); |
45 }; | 46 }; |
46 | 47 |
47 | 48 |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 | 219 |
219 // Make sure all nodes have been output before writing out the edges. | 220 // Make sure all nodes have been output before writing out the edges. |
220 use_to_def_ = true; | 221 use_to_def_ = true; |
221 // TODO(svenpanne) Remove the need for the const_casts. | 222 // TODO(svenpanne) Remove the need for the const_casts. |
222 const_cast<Graph*>(graph_)->VisitNodeInputsFromEnd(this); | 223 const_cast<Graph*>(graph_)->VisitNodeInputsFromEnd(this); |
223 white_nodes_.insert(const_cast<Graph*>(graph_)->start()); | 224 white_nodes_.insert(const_cast<Graph*>(graph_)->start()); |
224 | 225 |
225 // Visit all uses of white nodes. | 226 // Visit all uses of white nodes. |
226 use_to_def_ = false; | 227 use_to_def_ = false; |
227 GenericGraphVisit::Visit<GraphVisualizer, NodeUseIterationTraits<Node> >( | 228 GenericGraphVisit::Visit<GraphVisualizer, NodeUseIterationTraits<Node> >( |
228 const_cast<Graph*>(graph_), white_nodes_.begin(), white_nodes_.end(), | 229 const_cast<Graph*>(graph_), zone_, white_nodes_.begin(), |
229 this); | 230 white_nodes_.end(), this); |
230 | 231 |
231 os_ << " DEAD_INPUT [\n" | 232 os_ << " DEAD_INPUT [\n" |
232 << " style=\"filled\" \n" | 233 << " style=\"filled\" \n" |
233 << " fillcolor=\"" DEAD_COLOR "\"\n" | 234 << " fillcolor=\"" DEAD_COLOR "\"\n" |
234 << " ]\n" | 235 << " ]\n" |
235 << "\n"; | 236 << "\n"; |
236 | 237 |
237 // With all the nodes written, add the edges. | 238 // With all the nodes written, add the edges. |
238 for (NodeSetIter i = all_nodes_.begin(); i != all_nodes_.end(); ++i) { | 239 for (NodeSetIter i = all_nodes_.begin(); i != all_nodes_.end(); ++i) { |
239 Node::Inputs inputs = (*i)->inputs(); | 240 Node::Inputs inputs = (*i)->inputs(); |
240 for (Node::Inputs::iterator iter(inputs.begin()); iter != inputs.end(); | 241 for (Node::Inputs::iterator iter(inputs.begin()); iter != inputs.end(); |
241 ++iter) { | 242 ++iter) { |
242 PrintEdge(iter.edge().from(), iter.edge().index(), iter.edge().to()); | 243 PrintEdge(iter.edge().from(), iter.edge().index(), iter.edge().to()); |
243 } | 244 } |
244 } | 245 } |
245 os_ << "}\n"; | 246 os_ << "}\n"; |
246 } | 247 } |
247 | 248 |
248 | 249 |
249 GraphVisualizer::GraphVisualizer(OStream& os, const Graph* graph) // NOLINT | 250 GraphVisualizer::GraphVisualizer(OStream& os, Zone* zone, |
250 : all_nodes_(NodeSet::key_compare(), | 251 const Graph* graph) // NOLINT |
251 NodeSet::allocator_type(graph->zone())), | 252 : zone_(zone), |
252 white_nodes_(NodeSet::key_compare(), | 253 all_nodes_(NodeSet::key_compare(), NodeSet::allocator_type(zone)), |
253 NodeSet::allocator_type(graph->zone())), | 254 white_nodes_(NodeSet::key_compare(), NodeSet::allocator_type(zone)), |
254 use_to_def_(true), | 255 use_to_def_(true), |
255 os_(os), | 256 os_(os), |
256 graph_(graph) {} | 257 graph_(graph) {} |
257 | 258 |
258 | 259 |
259 OStream& operator<<(OStream& os, const AsDOT& ad) { | 260 OStream& operator<<(OStream& os, const AsDOT& ad) { |
260 GraphVisualizer(os, &ad.graph).Print(); | 261 Zone tmp_zone(ad.graph.zone()->isolate()); |
| 262 GraphVisualizer(os, &tmp_zone, &ad.graph).Print(); |
261 return os; | 263 return os; |
262 } | 264 } |
263 } | 265 } |
264 } | 266 } |
265 } // namespace v8::internal::compiler | 267 } // namespace v8::internal::compiler |
OLD | NEW |