%PDF- %PDF-
Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/maglev/ |
Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/maglev/maglev-graph-printer.h |
// 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_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) {} void PreProcessBasicBlock(BasicBlock* block); 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_; // This is used when tracing graph building, since targets might not exist // yet. 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 // Dummy inlined definitions of the printer classes/functions. class MaglevPrintingVisitor { public: explicit MaglevPrintingVisitor(MaglevGraphLabeller* graph_labeller, std::ostream& os) : os_(os) {} void PreProcessGraph(Graph* graph) {} void PostProcessGraph(Graph* graph) {} void PreProcessBasicBlock(BasicBlock* block) {} ProcessResult Process(Phi* phi, const ProcessingState& state) { return ProcessResult::kContinue; } ProcessResult Process(Node* node, const ProcessingState& state) { return ProcessResult::kContinue; } ProcessResult Process(ControlNode* node, const ProcessingState& state) { return ProcessResult::kContinue; } std::ostream& os() { return os_; } private: std::ostream& os_; }; inline 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) {} void Print(std::ostream& os) const {} }; class PrintNodeLabel { public: PrintNodeLabel(MaglevGraphLabeller* graph_labeller, const NodeBase* node) {} void Print(std::ostream& os) const {} }; #endif // V8_ENABLE_MAGLEV_GRAPH_PRINTER inline std::ostream& operator<<(std::ostream& os, const PrintNode& printer) { printer.Print(os); return os; } inline std::ostream& operator<<(std::ostream& os, const PrintNodeLabel& printer) { printer.Print(os); return os; } } // namespace maglev } // namespace internal } // namespace v8 #endif // V8_MAGLEV_MAGLEV_GRAPH_PRINTER_H_