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