//===- Pass.h - Base classes for compiler passes ----------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef MLIR_PASS_PASS_H #define MLIR_PASS_PASS_H #include "mlir/IR/Action.h" #include "mlir/Pass/AnalysisManager.h" #include "mlir/Pass/PassRegistry.h" #include "llvm/ADT/PointerIntPair.h" #include "llvm/ADT/Statistic.h" #include <optional> namespace mlir { namespace detail { class OpToOpPassAdaptor; struct OpPassManagerImpl; /// The state for a single execution of a pass. This provides a unified /// interface for accessing and initializing necessary state for pass execution. struct PassExecutionState { … }; } // namespace detail /// The abstract base pass class. This class contains information describing the /// derived pass object, e.g its kind and abstract TypeID. class Pass { … }; //===----------------------------------------------------------------------===// // Pass Model Definitions //===----------------------------------------------------------------------===// /// Pass to transform an operation of a specific type. /// /// Operation passes must not: /// - modify any other operations within the parent region, as other threads /// may be manipulating them concurrently. /// - modify any state within the parent operation, this includes adding /// additional operations. /// /// Derived operation passes are expected to provide the following: /// - A 'void runOnOperation()' method. /// - A 'StringRef getName() const' method. /// - A 'std::unique_ptr<Pass> clonePass() const' method. template <typename OpT = void> class OperationPass : public Pass { … }; /// Pass to transform an operation. /// /// Operation passes must not: /// - modify any other operations within the parent region, as other threads /// may be manipulating them concurrently. /// - modify any state within the parent operation, this includes adding /// additional operations. /// /// Derived operation passes are expected to provide the following: /// - A 'void runOnOperation()' method. /// - A 'StringRef getName() const' method. /// - A 'std::unique_ptr<Pass> clonePass() const' method. template <> class OperationPass<void> : public Pass { … }; /// Pass to transform an operation that implements the given interface. /// /// Interface passes must not: /// - modify any other operations within the parent region, as other threads /// may be manipulating them concurrently. /// - modify any state within the parent operation, this includes adding /// additional operations. /// /// Derived interface passes are expected to provide the following: /// - A 'void runOnOperation()' method. /// - A 'StringRef getName() const' method. /// - A 'std::unique_ptr<Pass> clonePass() const' method. template <typename InterfaceT> class InterfacePass : public OperationPass<> { … }; /// This class provides a CRTP wrapper around a base pass class to define /// several necessary utility methods. This should only be used for passes that /// are not suitably represented using the declarative pass specification(i.e. /// tablegen backend). template <typename PassT, typename BaseT> class PassWrapper : public BaseT { … }; /// This class encapsulates the "action" of executing a single pass. This allows /// a user of the Action infrastructure to query information about an action in /// (for example) a breakpoint context. You could use it like this: /// /// auto onBreakpoint = [&](const ActionActiveStack *backtrace) { /// if (auto passExec = dyn_cast<PassExecutionAction>(anAction)) /// record(passExec.getPass()); /// return ExecutionContext::Apply; /// }; /// ExecutionContext exeCtx(onBreakpoint); /// class PassExecutionAction : public tracing::ActionImpl<PassExecutionAction> { … }; } // namespace mlir #endif // MLIR_PASS_PASS_H