1 //===-- mlir-c/Pass.h - C API to Pass Management ------------------*- C -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 // This header declares the C interface to MLIR pass manager.
12 //===----------------------------------------------------------------------===//
17 #include "mlir-c/IR.h"
18 #include "mlir-c/Support.h"
24 //===----------------------------------------------------------------------===//
25 // Opaque type declarations.
27 // Types are exposed to C bindings as structs containing opaque pointers. They
28 // are not supposed to be inspected from C. This allows the underlying
29 // representation to change without affecting the API users. The use of structs
30 // instead of typedefs enables some type safety as structs are not implicitly
31 // convertible to each other.
33 // Instances of these types may or may not own the underlying object. The
34 // ownership semantics is defined by how an instance of the type was obtained.
35 //===----------------------------------------------------------------------===//
37 #define DEFINE_C_API_STRUCT(name, storage) \
41 typedef struct name name
43 DEFINE_C_API_STRUCT(MlirPass
, void);
44 DEFINE_C_API_STRUCT(MlirExternalPass
, void);
45 DEFINE_C_API_STRUCT(MlirPassManager
, void);
46 DEFINE_C_API_STRUCT(MlirOpPassManager
, void);
48 #undef DEFINE_C_API_STRUCT
50 //===----------------------------------------------------------------------===//
51 // PassManager/OpPassManager APIs.
52 //===----------------------------------------------------------------------===//
54 /// Create a new top-level PassManager with the default anchor.
55 MLIR_CAPI_EXPORTED MlirPassManager
mlirPassManagerCreate(MlirContext ctx
);
57 /// Create a new top-level PassManager anchored on `anchorOp`.
58 MLIR_CAPI_EXPORTED MlirPassManager
59 mlirPassManagerCreateOnOperation(MlirContext ctx
, MlirStringRef anchorOp
);
61 /// Destroy the provided PassManager.
62 MLIR_CAPI_EXPORTED
void mlirPassManagerDestroy(MlirPassManager passManager
);
64 /// Checks if a PassManager is null.
65 static inline bool mlirPassManagerIsNull(MlirPassManager passManager
) {
66 return !passManager
.ptr
;
69 /// Cast a top-level PassManager to a generic OpPassManager.
70 MLIR_CAPI_EXPORTED MlirOpPassManager
71 mlirPassManagerGetAsOpPassManager(MlirPassManager passManager
);
73 /// Run the provided `passManager` on the given `op`.
74 MLIR_CAPI_EXPORTED MlirLogicalResult
75 mlirPassManagerRunOnOp(MlirPassManager passManager
, MlirOperation op
);
77 /// Enable mlir-print-ir-after-all.
78 MLIR_CAPI_EXPORTED
void
79 mlirPassManagerEnableIRPrinting(MlirPassManager passManager
);
81 /// Enable / disable verify-each.
82 MLIR_CAPI_EXPORTED
void
83 mlirPassManagerEnableVerifier(MlirPassManager passManager
, bool enable
);
85 /// Nest an OpPassManager under the top-level PassManager, the nested
86 /// passmanager will only run on operations matching the provided name.
87 /// The returned OpPassManager will be destroyed when the parent is destroyed.
88 /// To further nest more OpPassManager under the newly returned one, see
89 /// `mlirOpPassManagerNest` below.
90 MLIR_CAPI_EXPORTED MlirOpPassManager
mlirPassManagerGetNestedUnder(
91 MlirPassManager passManager
, MlirStringRef operationName
);
93 /// Nest an OpPassManager under the provided OpPassManager, the nested
94 /// passmanager will only run on operations matching the provided name.
95 /// The returned OpPassManager will be destroyed when the parent is destroyed.
96 MLIR_CAPI_EXPORTED MlirOpPassManager
mlirOpPassManagerGetNestedUnder(
97 MlirOpPassManager passManager
, MlirStringRef operationName
);
99 /// Add a pass and transfer ownership to the provided top-level mlirPassManager.
100 /// If the pass is not a generic operation pass or a ModulePass, a new
101 /// OpPassManager is implicitly nested under the provided PassManager.
102 MLIR_CAPI_EXPORTED
void mlirPassManagerAddOwnedPass(MlirPassManager passManager
,
105 /// Add a pass and transfer ownership to the provided mlirOpPassManager. If the
106 /// pass is not a generic operation pass or matching the type of the provided
107 /// PassManager, a new OpPassManager is implicitly nested under the provided
109 MLIR_CAPI_EXPORTED
void
110 mlirOpPassManagerAddOwnedPass(MlirOpPassManager passManager
, MlirPass pass
);
112 /// Parse a sequence of textual MLIR pass pipeline elements and add them to the
113 /// provided OpPassManager. If parsing fails an error message is reported using
114 /// the provided callback.
115 MLIR_CAPI_EXPORTED MlirLogicalResult
mlirOpPassManagerAddPipeline(
116 MlirOpPassManager passManager
, MlirStringRef pipelineElements
,
117 MlirStringCallback callback
, void *userData
);
119 /// Print a textual MLIR pass pipeline by sending chunks of the string
120 /// representation and forwarding `userData to `callback`. Note that the
121 /// callback may be called several times with consecutive chunks of the string.
122 MLIR_CAPI_EXPORTED
void mlirPrintPassPipeline(MlirOpPassManager passManager
,
123 MlirStringCallback callback
,
126 /// Parse a textual MLIR pass pipeline and assign it to the provided
127 /// OpPassManager. If parsing fails an error message is reported using the
128 /// provided callback.
129 MLIR_CAPI_EXPORTED MlirLogicalResult
130 mlirParsePassPipeline(MlirOpPassManager passManager
, MlirStringRef pipeline
,
131 MlirStringCallback callback
, void *userData
);
133 //===----------------------------------------------------------------------===//
134 // External Pass API.
136 // This API allows to define passes outside of MLIR, not necessarily in
137 // C++, and register them with the MLIR pass management infrastructure.
139 //===----------------------------------------------------------------------===//
141 /// Structure of external `MlirPass` callbacks.
142 /// All callbacks are required to be set unless otherwise specified.
143 struct MlirExternalPassCallbacks
{
144 /// This callback is called from the pass is created.
145 /// This is analogous to a C++ pass constructor.
146 void (*construct
)(void *userData
);
148 /// This callback is called when the pass is destroyed
149 /// This is analogous to a C++ pass destructor.
150 void (*destruct
)(void *userData
);
152 /// This callback is optional.
153 /// The callback is called before the pass is run, allowing a chance to
154 /// initialize any complex state necessary for running the pass.
155 /// See Pass::initialize(MLIRContext *).
156 MlirLogicalResult (*initialize
)(MlirContext ctx
, void *userData
);
158 /// This callback is called when the pass is cloned.
159 /// See Pass::clonePass().
160 void *(*clone
)(void *userData
);
162 /// This callback is called when the pass is run.
163 /// See Pass::runOnOperation().
164 void (*run
)(MlirOperation op
, MlirExternalPass pass
, void *userData
);
166 typedef struct MlirExternalPassCallbacks MlirExternalPassCallbacks
;
168 /// Creates an external `MlirPass` that calls the supplied `callbacks` using the
169 /// supplied `userData`. If `opName` is empty, the pass is a generic operation
170 /// pass. Otherwise it is an operation pass specific to the specified pass name.
171 MLIR_CAPI_EXPORTED MlirPass
mlirCreateExternalPass(
172 MlirTypeID passID
, MlirStringRef name
, MlirStringRef argument
,
173 MlirStringRef description
, MlirStringRef opName
,
174 intptr_t nDependentDialects
, MlirDialectHandle
*dependentDialects
,
175 MlirExternalPassCallbacks callbacks
, void *userData
);
177 /// This signals that the pass has failed. This is only valid to call during
178 /// the `run` callback of `MlirExternalPassCallbacks`.
179 /// See Pass::signalPassFailure().
180 MLIR_CAPI_EXPORTED
void mlirExternalPassSignalFailure(MlirExternalPass pass
);
186 #endif // MLIR_C_PASS_H