MLIR 22.0.0git
Pass.h
Go to the documentation of this file.
1//===-- mlir-c/Pass.h - C API to Pass Management ------------------*- C -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM
4// Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7//
8//===----------------------------------------------------------------------===//
9//
10// This header declares the C interface to MLIR pass manager.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef MLIR_C_PASS_H
15#define MLIR_C_PASS_H
16
17#include "mlir-c/IR.h"
18#include "mlir-c/Support.h"
19
20#ifdef __cplusplus
21extern "C" {
22#endif
23
24//===----------------------------------------------------------------------===//
25// Opaque type declarations.
26//
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.
32//
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//===----------------------------------------------------------------------===//
36
37#define DEFINE_C_API_STRUCT(name, storage) \
38 struct name { \
39 storage *ptr; \
40 }; \
41 typedef struct name name
42
43DEFINE_C_API_STRUCT(MlirPass, void);
44DEFINE_C_API_STRUCT(MlirExternalPass, void);
45DEFINE_C_API_STRUCT(MlirPassManager, void);
46DEFINE_C_API_STRUCT(MlirOpPassManager, void);
47
48#undef DEFINE_C_API_STRUCT
49
50//===----------------------------------------------------------------------===//
51// PassManager/OpPassManager APIs.
52//===----------------------------------------------------------------------===//
53
54/// Create a new top-level PassManager with the default anchor.
55MLIR_CAPI_EXPORTED MlirPassManager mlirPassManagerCreate(MlirContext ctx);
56
57/// Create a new top-level PassManager anchored on `anchorOp`.
58MLIR_CAPI_EXPORTED MlirPassManager
59mlirPassManagerCreateOnOperation(MlirContext ctx, MlirStringRef anchorOp);
60
61/// Destroy the provided PassManager.
62MLIR_CAPI_EXPORTED void mlirPassManagerDestroy(MlirPassManager passManager);
63
64/// Checks if a PassManager is null.
65static inline bool mlirPassManagerIsNull(MlirPassManager passManager) {
66 return !passManager.ptr;
67}
68
69/// Cast a top-level PassManager to a generic OpPassManager.
70MLIR_CAPI_EXPORTED MlirOpPassManager
71mlirPassManagerGetAsOpPassManager(MlirPassManager passManager);
72
73/// Run the provided `passManager` on the given `op`.
75mlirPassManagerRunOnOp(MlirPassManager passManager, MlirOperation op);
76
77/// Enable IR printing.
78/// The treePrintingPath argument is an optional path to a directory
79/// where the dumps will be produced. If it isn't provided then dumps
80/// are produced to stderr.
82 MlirPassManager passManager, bool printBeforeAll, bool printAfterAll,
83 bool printModuleScope, bool printAfterOnlyOnChange,
84 bool printAfterOnlyOnFailure, MlirOpPrintingFlags flags,
85 MlirStringRef treePrintingPath);
86
87/// Enable / disable verify-each.
89mlirPassManagerEnableVerifier(MlirPassManager passManager, bool enable);
90
91/// Enable pass timing.
93mlirPassManagerEnableTiming(MlirPassManager passManager);
94
95/// Enumerated type of pass display modes.
96/// Mainly used in mlirPassManagerEnableStatistics.
101
102/// Enable pass statistics.
104mlirPassManagerEnableStatistics(MlirPassManager passManager,
105 MlirPassDisplayMode displayMode);
106
107/// Nest an OpPassManager under the top-level PassManager, the nested
108/// passmanager will only run on operations matching the provided name.
109/// The returned OpPassManager will be destroyed when the parent is destroyed.
110/// To further nest more OpPassManager under the newly returned one, see
111/// `mlirOpPassManagerNest` below.
113 MlirPassManager passManager, MlirStringRef operationName);
114
115/// Nest an OpPassManager under the provided OpPassManager, the nested
116/// passmanager will only run on operations matching the provided name.
117/// The returned OpPassManager will be destroyed when the parent is destroyed.
119 MlirOpPassManager passManager, MlirStringRef operationName);
120
121/// Add a pass and transfer ownership to the provided top-level mlirPassManager.
122/// If the pass is not a generic operation pass or a ModulePass, a new
123/// OpPassManager is implicitly nested under the provided PassManager.
124MLIR_CAPI_EXPORTED void mlirPassManagerAddOwnedPass(MlirPassManager passManager,
125 MlirPass pass);
126
127/// Add a pass and transfer ownership to the provided mlirOpPassManager. If the
128/// pass is not a generic operation pass or matching the type of the provided
129/// PassManager, a new OpPassManager is implicitly nested under the provided
130/// PassManager.
132mlirOpPassManagerAddOwnedPass(MlirOpPassManager passManager, MlirPass pass);
133
134/// Parse a sequence of textual MLIR pass pipeline elements and add them to the
135/// provided OpPassManager. If parsing fails an error message is reported using
136/// the provided callback.
138 MlirOpPassManager passManager, MlirStringRef pipelineElements,
139 MlirStringCallback callback, void *userData);
140
141/// Print a textual MLIR pass pipeline by sending chunks of the string
142/// representation and forwarding `userData to `callback`. Note that the
143/// callback may be called several times with consecutive chunks of the string.
144MLIR_CAPI_EXPORTED void mlirPrintPassPipeline(MlirOpPassManager passManager,
145 MlirStringCallback callback,
146 void *userData);
147
148/// Parse a textual MLIR pass pipeline and assign it to the provided
149/// OpPassManager. If parsing fails an error message is reported using the
150/// provided callback.
152mlirParsePassPipeline(MlirOpPassManager passManager, MlirStringRef pipeline,
153 MlirStringCallback callback, void *userData);
154
155//===----------------------------------------------------------------------===//
156// External Pass API.
157//
158// This API allows to define passes outside of MLIR, not necessarily in
159// C++, and register them with the MLIR pass management infrastructure.
160//
161//===----------------------------------------------------------------------===//
162
163/// Structure of external `MlirPass` callbacks.
164/// All callbacks are required to be set unless otherwise specified.
165struct MlirExternalPassCallbacks {
166 /// This callback is called from the pass is created.
167 /// This is analogous to a C++ pass constructor.
168 void (*construct)(void *userData);
169
170 /// This callback is called when the pass is destroyed
171 /// This is analogous to a C++ pass destructor.
172 void (*destruct)(void *userData);
173
174 /// This callback is optional.
175 /// The callback is called before the pass is run, allowing a chance to
176 /// initialize any complex state necessary for running the pass.
177 /// See Pass::initialize(MLIRContext *).
178 MlirLogicalResult (*initialize)(MlirContext ctx, void *userData);
179
180 /// This callback is called when the pass is cloned.
181 /// See Pass::clonePass().
182 void *(*clone)(void *userData);
183
184 /// This callback is called when the pass is run.
185 /// See Pass::runOnOperation().
186 void (*run)(MlirOperation op, MlirExternalPass pass, void *userData);
187};
188typedef struct MlirExternalPassCallbacks MlirExternalPassCallbacks;
189
190/// Creates an external `MlirPass` that calls the supplied `callbacks` using the
191/// supplied `userData`. If `opName` is empty, the pass is a generic operation
192/// pass. Otherwise it is an operation pass specific to the specified pass name.
194 MlirTypeID passID, MlirStringRef name, MlirStringRef argument,
195 MlirStringRef description, MlirStringRef opName,
196 intptr_t nDependentDialects, MlirDialectHandle *dependentDialects,
197 MlirExternalPassCallbacks callbacks, void *userData);
198
199/// This signals that the pass has failed. This is only valid to call during
200/// the `run` callback of `MlirExternalPassCallbacks`.
201/// See Pass::signalPassFailure().
202MLIR_CAPI_EXPORTED void mlirExternalPassSignalFailure(MlirExternalPass pass);
203
204#ifdef __cplusplus
205}
206#endif
207
208#endif // MLIR_C_PASS_H
MlirPass mlirCreateExternalPass(MlirTypeID passID, MlirStringRef name, MlirStringRef argument, MlirStringRef description, MlirStringRef opName, intptr_t nDependentDialects, MlirDialectHandle *dependentDialects, MlirExternalPassCallbacks callbacks, void *userData)
Definition Pass.cpp:219
MlirLogicalResult mlirParsePassPipeline(MlirOpPassManager passManager, MlirStringRef pipeline, MlirStringCallback callback, void *userData)
Definition Pass.cpp:131
void mlirPrintPassPipeline(MlirOpPassManager passManager, MlirStringCallback callback, void *userData)
Definition Pass.cpp:125
LogicalResult initialize(unsigned origNumLoops, ArrayRef< ReassociationIndices > foldedIterationDims)
MLIR_CAPI_EXPORTED void mlirPassManagerEnableVerifier(MlirPassManager passManager, bool enable)
Enable / disable verify-each.
Definition Pass.cpp:75
MLIR_CAPI_EXPORTED MlirOpPassManager mlirPassManagerGetNestedUnder(MlirPassManager passManager, MlirStringRef operationName)
Nest an OpPassManager under the top-level PassManager, the nested passmanager will only run on operat...
Definition Pass.cpp:97
MLIR_CAPI_EXPORTED void mlirExternalPassSignalFailure(MlirExternalPass pass)
Print a textual MLIR pass pipeline by sending chunks of the string representation and forwarding user...
Definition Pass.cpp:234
MLIR_CAPI_EXPORTED void mlirPassManagerEnableStatistics(MlirPassManager passManager, MlirPassDisplayMode displayMode)
Enable pass statistics.
Definition Pass.cpp:83
MLIR_CAPI_EXPORTED MlirOpPassManager mlirPassManagerGetAsOpPassManager(MlirPassManager passManager)
Cast a top-level PassManager to a generic OpPassManager.
Definition Pass.cpp:39
MLIR_CAPI_EXPORTED MlirLogicalResult mlirPassManagerRunOnOp(MlirPassManager passManager, MlirOperation op)
Run the provided passManager on the given op.
Definition Pass.cpp:43
MLIR_CAPI_EXPORTED void mlirPassManagerEnableTiming(MlirPassManager passManager)
Enable pass timing.
Definition Pass.cpp:79
MLIR_CAPI_EXPORTED MlirPassManager mlirPassManagerCreate(MlirContext ctx)
Create a new top-level PassManager with the default anchor.
Definition Pass.cpp:25
MLIR_CAPI_EXPORTED void mlirOpPassManagerAddOwnedPass(MlirOpPassManager passManager, MlirPass pass)
Add a pass and transfer ownership to the provided mlirOpPassManager.
Definition Pass.cpp:111
MLIR_CAPI_EXPORTED void mlirPassManagerEnableIRPrinting(MlirPassManager passManager, bool printBeforeAll, bool printAfterAll, bool printModuleScope, bool printAfterOnlyOnChange, bool printAfterOnlyOnFailure, MlirOpPrintingFlags flags, MlirStringRef treePrintingPath)
Enable IR printing.
Definition Pass.cpp:48
#define DEFINE_C_API_STRUCT(name, storage)
Definition Pass.h:37
MLIR_CAPI_EXPORTED MlirLogicalResult mlirOpPassManagerAddPipeline(MlirOpPassManager passManager, MlirStringRef pipelineElements, MlirStringCallback callback, void *userData)
Parse a sequence of textual MLIR pass pipeline elements and add them to the provided OpPassManager.
Definition Pass.cpp:116
MlirPassDisplayMode
Enumerated type of pass display modes.
Definition Pass.h:97
@ MLIR_PASS_DISPLAY_MODE_LIST
Definition Pass.h:98
@ MLIR_PASS_DISPLAY_MODE_PIPELINE
Definition Pass.h:99
MLIR_CAPI_EXPORTED MlirOpPassManager mlirOpPassManagerGetNestedUnder(MlirOpPassManager passManager, MlirStringRef operationName)
Nest an OpPassManager under the provided OpPassManager, the nested passmanager will only run on opera...
Definition Pass.cpp:102
MLIR_CAPI_EXPORTED void mlirPassManagerAddOwnedPass(MlirPassManager passManager, MlirPass pass)
Add a pass and transfer ownership to the provided top-level mlirPassManager.
Definition Pass.cpp:107
static bool mlirPassManagerIsNull(MlirPassManager passManager)
Checks if a PassManager is null.
Definition Pass.h:65
MLIR_CAPI_EXPORTED MlirPassManager mlirPassManagerCreateOnOperation(MlirContext ctx, MlirStringRef anchorOp)
Create a new top-level PassManager anchored on anchorOp.
Definition Pass.cpp:29
MLIR_CAPI_EXPORTED void mlirPassManagerDestroy(MlirPassManager passManager)
Destroy the provided PassManager.
Definition Pass.cpp:34
struct MlirLogicalResult MlirLogicalResult
Definition Support.h:119
#define MLIR_CAPI_EXPORTED
Definition Support.h:46
void(* MlirStringCallback)(MlirStringRef, void *)
A callback for returning string references.
Definition Support.h:105
A logical result value, essentially a boolean with named states.
Definition Support.h:116
A pointer to a sized fragment of a string, not necessarily null-terminated.
Definition Support.h:73