Home | History | Annotate | Download | only in compiler
      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