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_ = new (graph_->zone()) 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