//===- mlir-transform-opt.cpp -----------------------------------*- C++ -*-===// // // This file is licensed 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 // //===----------------------------------------------------------------------===// #include "mlir/Dialect/Transform/IR/TransformDialect.h" #include "mlir/Dialect/Transform/IR/Utils.h" #include "mlir/Dialect/Transform/Transforms/TransformInterpreterUtils.h" #include "mlir/IR/AsmState.h" #include "mlir/IR/BuiltinOps.h" #include "mlir/IR/Diagnostics.h" #include "mlir/IR/DialectRegistry.h" #include "mlir/IR/MLIRContext.h" #include "mlir/InitAllDialects.h" #include "mlir/InitAllExtensions.h" #include "mlir/InitAllPasses.h" #include "mlir/Parser/Parser.h" #include "mlir/Support/FileUtilities.h" #include "mlir/Tools/mlir-opt/MlirOptMain.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/InitLLVM.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/ToolOutputFile.h" #include <cstdlib> namespace { usingnamespacellvm; /// Structure containing command line options for the tool, these will get /// initialized when an instance is created. struct MlirTransformOptCLOptions { … }; } // namespace /// "Managed" static instance of the command-line options structure. This makes /// them locally-scoped and explicitly initialized/deinitialized. While this is /// not strictly necessary in the tool source file that is not being used as a /// library (where the options would pollute the global list of options), it is /// good practice to follow this. static llvm::ManagedStatic<MlirTransformOptCLOptions> clOptions; /// Explicitly registers command-line options. static void registerCLOptions() { … } namespace { /// A wrapper class for source managers diagnostic. This provides both unique /// ownership and virtual function-like overload for a pair of /// inheritance-related classes that do not use virtual functions. class DiagnosticHandlerWrapper { … }; /// MLIR has deeply rooted expectations that the LLVM source manager contains /// exactly one buffer, until at least the lexer level. This class wraps /// multiple LLVM source managers each managing a buffer to match MLIR's /// expectations while still providing a centralized handling mechanism. class TransformSourceMgr { … }; } // namespace /// Trivial wrapper around `applyTransforms` that doesn't support extra mapping /// and doesn't enforce the entry point transform ops being top-level. static llvm::LogicalResult applyTransforms(mlir::Operation *payloadRoot, mlir::transform::TransformOpInterface transformRoot, const mlir::transform::TransformOptions &options) { … } /// Applies transforms indicated in the transform dialect script to the input /// buffer. The transform script may be embedded in the input buffer or as a /// separate buffer. The transform script may have external symbols, the /// definitions of which must be provided in transform library buffers. If the /// application is successful, prints the transformed input buffer into the /// given output stream. Additional configuration options are derived from /// command-line options. static llvm::LogicalResult processPayloadBuffer( raw_ostream &os, std::unique_ptr<MemoryBuffer> inputBuffer, std::unique_ptr<llvm::MemoryBuffer> transformBuffer, MutableArrayRef<std::unique_ptr<MemoryBuffer>> transformLibraries, mlir::DialectRegistry ®istry) { … } /// Tool entry point. static llvm::LogicalResult runMain(int argc, char **argv) { … } int main(int argc, char **argv) { … }