xref: /llvm-project/mlir/lib/CAPI/Dialect/TransformInterpreter.cpp (revision 73140daebbf522dbb14dc4b2f3c67dc0aa1a62dd)
191f11611SOleksandr "Alex" Zinenko //===- TransformTransforms.cpp - C Interface for Transform dialect --------===//
291f11611SOleksandr "Alex" Zinenko //
391f11611SOleksandr "Alex" Zinenko // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
491f11611SOleksandr "Alex" Zinenko // See https://llvm.org/LICENSE.txt for license information.
591f11611SOleksandr "Alex" Zinenko // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
691f11611SOleksandr "Alex" Zinenko //
791f11611SOleksandr "Alex" Zinenko //===----------------------------------------------------------------------===//
891f11611SOleksandr "Alex" Zinenko //
991f11611SOleksandr "Alex" Zinenko // C interface to transforms for the transform dialect.
1091f11611SOleksandr "Alex" Zinenko //
1191f11611SOleksandr "Alex" Zinenko //===----------------------------------------------------------------------===//
1291f11611SOleksandr "Alex" Zinenko 
1391f11611SOleksandr "Alex" Zinenko #include "mlir-c/Dialect/Transform/Interpreter.h"
1491f11611SOleksandr "Alex" Zinenko #include "mlir-c/Support.h"
1591f11611SOleksandr "Alex" Zinenko #include "mlir/CAPI/IR.h"
1691f11611SOleksandr "Alex" Zinenko #include "mlir/CAPI/Support.h"
1791f11611SOleksandr "Alex" Zinenko #include "mlir/CAPI/Wrap.h"
18*73140daeSOleksandr "Alex" Zinenko #include "mlir/Dialect/Transform/IR/Utils.h"
195a9bdd85SOleksandr "Alex" Zinenko #include "mlir/Dialect/Transform/Interfaces/TransformInterfaces.h"
2091f11611SOleksandr "Alex" Zinenko #include "mlir/Dialect/Transform/Transforms/TransformInterpreterUtils.h"
2191f11611SOleksandr "Alex" Zinenko 
2291f11611SOleksandr "Alex" Zinenko using namespace mlir;
2391f11611SOleksandr "Alex" Zinenko 
DEFINE_C_API_PTR_METHODS(MlirTransformOptions,transform::TransformOptions)2491f11611SOleksandr "Alex" Zinenko DEFINE_C_API_PTR_METHODS(MlirTransformOptions, transform::TransformOptions)
2591f11611SOleksandr "Alex" Zinenko 
2691f11611SOleksandr "Alex" Zinenko extern "C" {
2791f11611SOleksandr "Alex" Zinenko 
2891f11611SOleksandr "Alex" Zinenko MlirTransformOptions mlirTransformOptionsCreate() {
2991f11611SOleksandr "Alex" Zinenko   return wrap(new transform::TransformOptions);
3091f11611SOleksandr "Alex" Zinenko }
3191f11611SOleksandr "Alex" Zinenko 
3291f11611SOleksandr "Alex" Zinenko void mlirTransformOptionsEnableExpensiveChecks(
3391f11611SOleksandr "Alex" Zinenko     MlirTransformOptions transformOptions, bool enable) {
3491f11611SOleksandr "Alex" Zinenko   unwrap(transformOptions)->enableExpensiveChecks(enable);
3591f11611SOleksandr "Alex" Zinenko }
3691f11611SOleksandr "Alex" Zinenko 
3791f11611SOleksandr "Alex" Zinenko bool mlirTransformOptionsGetExpensiveChecksEnabled(
3891f11611SOleksandr "Alex" Zinenko     MlirTransformOptions transformOptions) {
3991f11611SOleksandr "Alex" Zinenko   return unwrap(transformOptions)->getExpensiveChecksEnabled();
4091f11611SOleksandr "Alex" Zinenko }
4191f11611SOleksandr "Alex" Zinenko 
4291f11611SOleksandr "Alex" Zinenko void mlirTransformOptionsEnforceSingleTopLevelTransformOp(
4391f11611SOleksandr "Alex" Zinenko     MlirTransformOptions transformOptions, bool enable) {
4491f11611SOleksandr "Alex" Zinenko   unwrap(transformOptions)->enableEnforceSingleToplevelTransformOp(enable);
4591f11611SOleksandr "Alex" Zinenko }
4691f11611SOleksandr "Alex" Zinenko 
4791f11611SOleksandr "Alex" Zinenko bool mlirTransformOptionsGetEnforceSingleTopLevelTransformOp(
4891f11611SOleksandr "Alex" Zinenko     MlirTransformOptions transformOptions) {
4991f11611SOleksandr "Alex" Zinenko   return unwrap(transformOptions)->getEnforceSingleToplevelTransformOp();
5091f11611SOleksandr "Alex" Zinenko }
5191f11611SOleksandr "Alex" Zinenko 
5291f11611SOleksandr "Alex" Zinenko void mlirTransformOptionsDestroy(MlirTransformOptions transformOptions) {
5391f11611SOleksandr "Alex" Zinenko   delete unwrap(transformOptions);
5491f11611SOleksandr "Alex" Zinenko }
5591f11611SOleksandr "Alex" Zinenko 
5691f11611SOleksandr "Alex" Zinenko MlirLogicalResult mlirTransformApplyNamedSequence(
5791f11611SOleksandr "Alex" Zinenko     MlirOperation payload, MlirOperation transformRoot,
5891f11611SOleksandr "Alex" Zinenko     MlirOperation transformModule, MlirTransformOptions transformOptions) {
5991f11611SOleksandr "Alex" Zinenko   Operation *transformRootOp = unwrap(transformRoot);
6091f11611SOleksandr "Alex" Zinenko   Operation *transformModuleOp = unwrap(transformModule);
6191f11611SOleksandr "Alex" Zinenko   if (!isa<transform::TransformOpInterface>(transformRootOp)) {
6291f11611SOleksandr "Alex" Zinenko     transformRootOp->emitError()
6391f11611SOleksandr "Alex" Zinenko         << "must implement TransformOpInterface to be used as transform root";
6491f11611SOleksandr "Alex" Zinenko     return mlirLogicalResultFailure();
6591f11611SOleksandr "Alex" Zinenko   }
6691f11611SOleksandr "Alex" Zinenko   if (!isa<ModuleOp>(transformModuleOp)) {
6791f11611SOleksandr "Alex" Zinenko     transformModuleOp->emitError()
6891f11611SOleksandr "Alex" Zinenko         << "must be a " << ModuleOp::getOperationName();
6991f11611SOleksandr "Alex" Zinenko     return mlirLogicalResultFailure();
7091f11611SOleksandr "Alex" Zinenko   }
7191f11611SOleksandr "Alex" Zinenko   return wrap(transform::applyTransformNamedSequence(
7291f11611SOleksandr "Alex" Zinenko       unwrap(payload), unwrap(transformRoot),
7391f11611SOleksandr "Alex" Zinenko       cast<ModuleOp>(unwrap(transformModule)), *unwrap(transformOptions)));
7491f11611SOleksandr "Alex" Zinenko }
75*73140daeSOleksandr "Alex" Zinenko 
76*73140daeSOleksandr "Alex" Zinenko MlirLogicalResult mlirMergeSymbolsIntoFromClone(MlirOperation target,
77*73140daeSOleksandr "Alex" Zinenko                                                 MlirOperation other) {
78*73140daeSOleksandr "Alex" Zinenko   OwningOpRef<Operation *> otherOwning(unwrap(other)->clone());
79*73140daeSOleksandr "Alex" Zinenko   LogicalResult result = transform::detail::mergeSymbolsInto(
80*73140daeSOleksandr "Alex" Zinenko       unwrap(target), std::move(otherOwning));
81*73140daeSOleksandr "Alex" Zinenko   return wrap(result);
82*73140daeSOleksandr "Alex" Zinenko }
8391f11611SOleksandr "Alex" Zinenko }
84