• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 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 #include "src/compiler/node-origin-table.h"
6 #include "src/compiler/graph.h"
7 #include "src/compiler/node-aux-data.h"
8 
9 namespace v8 {
10 namespace internal {
11 namespace compiler {
12 
PrintJson(std::ostream & out) const13 void NodeOrigin::PrintJson(std::ostream& out) const {
14   out << "{ ";
15   switch (origin_kind_) {
16     case kGraphNode:
17       out << "\"nodeId\" : ";
18       break;
19     case kWasmBytecode:
20       out << "\"bytecodePosition\" : ";
21       break;
22   }
23   out << created_from();
24   out << ", \"reducer\" : \"" << reducer_name() << "\"";
25   out << ", \"phase\" : \"" << phase_name() << "\"";
26   out << "}";
27 }
28 
29 class NodeOriginTable::Decorator final : public GraphDecorator {
30  public:
Decorator(NodeOriginTable * origins)31   explicit Decorator(NodeOriginTable* origins) : origins_(origins) {}
32 
Decorate(Node * node)33   void Decorate(Node* node) final {
34     origins_->SetNodeOrigin(node, origins_->current_origin_);
35   }
36 
37  private:
38   NodeOriginTable* origins_;
39 };
40 
NodeOriginTable(Graph * graph)41 NodeOriginTable::NodeOriginTable(Graph* graph)
42     : graph_(graph),
43       decorator_(nullptr),
44       current_origin_(NodeOrigin::Unknown()),
45       current_phase_name_("unknown"),
46       table_(graph->zone()) {}
47 
AddDecorator()48 void NodeOriginTable::AddDecorator() {
49   DCHECK_NULL(decorator_);
50   decorator_ = graph_->zone()->New<Decorator>(this);
51   graph_->AddDecorator(decorator_);
52 }
53 
RemoveDecorator()54 void NodeOriginTable::RemoveDecorator() {
55   DCHECK_NOT_NULL(decorator_);
56   graph_->RemoveDecorator(decorator_);
57   decorator_ = nullptr;
58 }
59 
GetNodeOrigin(Node * node) const60 NodeOrigin NodeOriginTable::GetNodeOrigin(Node* node) const {
61   return table_.Get(node);
62 }
63 
SetNodeOrigin(Node * node,const NodeOrigin & no)64 void NodeOriginTable::SetNodeOrigin(Node* node, const NodeOrigin& no) {
65   table_.Set(node, no);
66 }
67 
PrintJson(std::ostream & os) const68 void NodeOriginTable::PrintJson(std::ostream& os) const {
69   os << "{";
70   bool needs_comma = false;
71   for (auto i : table_) {
72     NodeOrigin no = i.second;
73     if (no.IsKnown()) {
74       if (needs_comma) {
75         os << ",";
76       }
77       os << "\"" << i.first << "\""
78          << ": ";
79       no.PrintJson(os);
80       needs_comma = true;
81     }
82   }
83   os << "}";
84 }
85 
86 }  // namespace compiler
87 }  // namespace internal
88 }  // namespace v8
89