1 // Copyright 2022 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 #ifndef V8_MAGLEV_MAGLEV_GRAPH_LABELLER_H_ 6 #define V8_MAGLEV_MAGLEV_GRAPH_LABELLER_H_ 7 8 #include <map> 9 10 #include "src/maglev/maglev-graph.h" 11 #include "src/maglev/maglev-ir.h" 12 13 namespace v8 { 14 namespace internal { 15 namespace maglev { 16 17 class MaglevGraphLabeller { 18 public: RegisterNode(const Node * node)19 void RegisterNode(const Node* node) { 20 if (node_ids_.emplace(node, next_node_id_).second) { 21 next_node_id_++; 22 } 23 } RegisterBasicBlock(const BasicBlock * block)24 void RegisterBasicBlock(const BasicBlock* block) { 25 block_ids_[block] = next_block_id_++; 26 if (node_ids_.emplace(block->control_node(), next_node_id_).second) { 27 next_node_id_++; 28 } 29 } 30 BlockId(const BasicBlock * block)31 int BlockId(const BasicBlock* block) { return block_ids_[block]; } NodeId(const NodeBase * node)32 int NodeId(const NodeBase* node) { return node_ids_[node]; } 33 max_node_id()34 int max_node_id() const { return next_node_id_ - 1; } 35 max_node_id_width()36 int max_node_id_width() const { return std::ceil(std::log10(max_node_id())); } 37 PrintNodeLabel(std::ostream & os,const Node * node)38 void PrintNodeLabel(std::ostream& os, const Node* node) { 39 auto node_id_it = node_ids_.find(node); 40 41 if (node_id_it == node_ids_.end()) { 42 os << "<invalid node " << node << ">"; 43 return; 44 } 45 46 os << "n" << node_id_it->second; 47 } 48 PrintInput(std::ostream & os,const Input & input)49 void PrintInput(std::ostream& os, const Input& input) { 50 PrintNodeLabel(os, input.node()); 51 os << ":" << input.operand(); 52 } 53 54 private: 55 std::map<const BasicBlock*, int> block_ids_; 56 std::map<const NodeBase*, int> node_ids_; 57 int next_block_id_ = 1; 58 int next_node_id_ = 1; 59 }; 60 61 } // namespace maglev 62 } // namespace internal 63 } // namespace v8 64 65 #endif // V8_MAGLEV_MAGLEV_GRAPH_LABELLER_H_ 66