blob: cf9f7b578a469fcfbc58819620928e314a8715a4 [file] [log] [blame]
// Copyright 2022 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_MAGLEV_MAGLEV_GRAPH_LABELLER_H_
#define V8_MAGLEV_MAGLEV_GRAPH_LABELLER_H_
#include <map>
#include "src/maglev/maglev-graph.h"
#include "src/maglev/maglev-ir.h"
#include "src/utils/utils.h"
namespace v8 {
namespace internal {
namespace maglev {
class MaglevGraphLabeller {
public:
struct Provenance {
const MaglevCompilationUnit* unit = nullptr;
BytecodeOffset bytecode_offset = BytecodeOffset::None();
SourcePosition position = SourcePosition::Unknown();
};
struct NodeInfo {
int label = -1;
Provenance provenance;
};
void RegisterNode(const NodeBase* node, const MaglevCompilationUnit* unit,
BytecodeOffset bytecode_offset, SourcePosition position) {
if (nodes_
.emplace(node, NodeInfo{next_node_label_,
{unit, bytecode_offset, position}})
.second) {
next_node_label_++;
}
}
void RegisterNode(const NodeBase* node) {
RegisterNode(node, nullptr, BytecodeOffset::None(),
SourcePosition::Unknown());
}
void RegisterBasicBlock(const BasicBlock* block) {
block_ids_[block] = next_block_label_++;
}
int BlockId(const BasicBlock* block) { return block_ids_[block]; }
int NodeId(const NodeBase* node) { return nodes_[node].label; }
const Provenance& GetNodeProvenance(const NodeBase* node) {
return nodes_[node].provenance;
}
int max_node_id() const { return next_node_label_ - 1; }
void PrintNodeLabel(std::ostream& os, const NodeBase* node) {
auto node_id_it = nodes_.find(node);
if (node_id_it == nodes_.end()) {
os << "<unregistered node " << node << ">";
return;
}
if (node->has_id()) {
os << "v" << node->id() << "/";
}
os << "n" << node_id_it->second.label;
}
void PrintInput(std::ostream& os, const Input& input) {
PrintNodeLabel(os, input.node());
os << ":" << input.operand();
}
private:
std::map<const BasicBlock*, int> block_ids_;
std::map<const NodeBase*, NodeInfo> nodes_;
int next_block_label_ = 1;
int next_node_label_ = 1;
};
} // namespace maglev
} // namespace internal
} // namespace v8
#endif // V8_MAGLEV_MAGLEV_GRAPH_LABELLER_H_