// 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_PROCESSOR_H_ #define V8_MAGLEV_MAGLEV_GRAPH_PROCESSOR_H_ #include "src/base/macros.h" #include "src/compiler/bytecode-analysis.h" #include "src/maglev/maglev-basic-block.h" #include "src/maglev/maglev-compilation-info.h" #include "src/maglev/maglev-graph.h" #include "src/maglev/maglev-interpreter-frame-state.h" #include "src/maglev/maglev-ir.h" namespace v8 { namespace internal { namespace maglev { // The GraphProcessor takes a NodeProcessor, and applies it to each Node in the // Graph by calling NodeProcessor::Process on each Node. // // The GraphProcessor also keeps track of the current ProcessingState, and // passes this to the Process method. // // It expects a NodeProcessor class with: // // // A function that processes the graph before the nodes are walked. // void PreProcessGraph(Graph* graph); // // // A function that processes the graph after the nodes are walked. // void PostProcessGraph(Graph* graph); // // // A function that processes each basic block before its nodes are walked. // BlockProcessResult PreProcessBasicBlock(BasicBlock* block); // // // Process methods for each Node type. The GraphProcessor switches over // // the Node's opcode, casts it to the appropriate FooNode, and dispatches // // to NodeProcessor::Process. It's then up to the NodeProcessor to provide // // either distinct Process methods per Node type, or using templates or // // overloading as appropriate to group node processing. // void Process(FooNode* node, const ProcessingState& state) {} // template <typename NodeProcessor, bool visit_identity_nodes = false> class GraphProcessor; enum class BlockProcessResult { … }; enum class ProcessResult { … }; class ProcessingState { … }; template <typename NodeProcessor, bool visit_identity_nodes> class GraphProcessor { … }; // A NodeProcessor that wraps multiple NodeProcessors, and forwards to each of // them iteratively. template <typename... Processors> class NodeMultiProcessor; template <> class NodeMultiProcessor<> { … }; NodeMultiProcessor<Processor, Processors...>; template <typename... Processors> using GraphMultiProcessor = GraphProcessor<NodeMultiProcessor<Processors...>>; } // namespace maglev } // namespace internal } // namespace v8 #endif // V8_MAGLEV_MAGLEV_GRAPH_PROCESSOR_H_