#ifndef V8_MAGLEV_MAGLEV_GRAPH_PRINTER_H_
#define V8_MAGLEV_MAGLEV_GRAPH_PRINTER_H_
#include <memory>
#include <ostream>
#include <set>
#include <vector>
#include "src/maglev/maglev-compilation-unit.h"
#include "src/maglev/maglev-graph-labeller.h"
#include "src/maglev/maglev-graph-processor.h"
#include "src/maglev/maglev-ir.h"
namespace v8 {
namespace internal {
namespace maglev {
class BasicBlock;
class ControlNode;
class Graph;
class MaglevCompilationInfo;
class MaglevGraphLabeller;
class Node;
class NodeBase;
class Phi;
class ProcessingState;
#ifdef V8_ENABLE_MAGLEV_GRAPH_PRINTER
class MaglevPrintingVisitor {
public:
explicit MaglevPrintingVisitor(MaglevGraphLabeller* graph_labeller,
std::ostream& os);
void PreProcessGraph(Graph* graph);
void PostProcessGraph(Graph* graph) {}
BlockProcessResult PreProcessBasicBlock(BasicBlock* block);
void PostPhiProcessing() {}
ProcessResult Process(Phi* phi, const ProcessingState& state);
ProcessResult Process(Node* node, const ProcessingState& state);
ProcessResult Process(ControlNode* node, const ProcessingState& state);
std::ostream& os() { return *os_for_additional_info_; }
private:
MaglevGraphLabeller* graph_labeller_;
std::ostream& os_;
std::unique_ptr<std::ostream> os_for_additional_info_;
std::set<BasicBlock*> loop_headers_;
std::vector<BasicBlock*> targets_;
NodeIdT max_node_id_ = kInvalidNodeId;
MaglevGraphLabeller::Provenance existing_provenance_;
};
void PrintGraph(std::ostream& os, MaglevCompilationInfo* compilation_info,
Graph* const graph);
class PrintNode {
public:
PrintNode(MaglevGraphLabeller* graph_labeller, const NodeBase* node,
bool skip_targets = false)
: graph_labeller_(graph_labeller),
node_(node),
skip_targets_(skip_targets) {}
void Print(std::ostream& os) const;
private:
MaglevGraphLabeller* graph_labeller_;
const NodeBase* node_;
const bool skip_targets_;
};
class PrintNodeLabel {
public:
PrintNodeLabel(MaglevGraphLabeller* graph_labeller, const NodeBase* node)
: graph_labeller_(graph_labeller), node_(node) {}
void Print(std::ostream& os) const;
private:
MaglevGraphLabeller* graph_labeller_;
const NodeBase* node_;
};
#else
class MaglevPrintingVisitor { … };
inline void PrintGraph(std::ostream& os,
MaglevCompilationInfo* compilation_info,
Graph* const graph) { … }
class PrintNode { … };
class PrintNodeLabel { … };
#endif
inline std::ostream& operator<<(std::ostream& os, const PrintNode& printer) { … }
inline std::ostream& operator<<(std::ostream& os,
const PrintNodeLabel& printer) { … }
}
}
}
#endif