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 13 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: 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 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 48 void NodeOriginTable::AddDecorator() { 49 DCHECK_NULL(decorator_); 50 decorator_ = new (graph_->zone()) Decorator(this); 51 graph_->AddDecorator(decorator_); 52 } 53 54 void NodeOriginTable::RemoveDecorator() { 55 DCHECK_NOT_NULL(decorator_); 56 graph_->RemoveDecorator(decorator_); 57 decorator_ = nullptr; 58 } 59 60 NodeOrigin NodeOriginTable::GetNodeOrigin(Node* node) const { 61 return table_.Get(node); 62 } 63 64 void NodeOriginTable::SetNodeOrigin(Node* node, const NodeOrigin& no) { 65 table_.Set(node, no); 66 } 67 68 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