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
9namespace v8 {
10namespace internal {
11namespace compiler {
12
13void 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
29class NodeOriginTable::Decorator final : public GraphDecorator {
30 public:
31  explicit Decorator(NodeOriginTable* origins) : origins_(origins) {}
32
33  void Decorate(Node* node) final {
34    origins_->SetNodeOrigin(node, origins_->current_origin_);
35  }
36
37 private:
38  NodeOriginTable* origins_;
39};
40
41NodeOriginTable::NodeOriginTable(Graph* graph)
42    : graph_(graph),
43      decorator_(nullptr),
44      current_origin_(NodeOrigin::Unknown()),
45      current_phase_name_("unknown"),
46      table_(graph->zone()) {}
47
48void NodeOriginTable::AddDecorator() {
49  DCHECK_NULL(decorator_);
50  decorator_ = graph_->zone()->New<Decorator>(this);
51  graph_->AddDecorator(decorator_);
52}
53
54void NodeOriginTable::RemoveDecorator() {
55  DCHECK_NOT_NULL(decorator_);
56  graph_->RemoveDecorator(decorator_);
57  decorator_ = nullptr;
58}
59
60NodeOrigin NodeOriginTable::GetNodeOrigin(Node* node) const {
61  return table_.Get(node);
62}
63
64void NodeOriginTable::SetNodeOrigin(Node* node, const NodeOrigin& no) {
65  table_.Set(node, no);
66}
67
68void 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