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