//===- Translation.h - Translation registry ---------------------*- C++ -*-===// // // Part of the LLVM Project, 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 // //===----------------------------------------------------------------------===// // // Registry for user-provided translations. // //===----------------------------------------------------------------------===// #ifndef MLIR_TOOLS_MLIRTRANSLATE_TRANSLATION_H #define MLIR_TOOLS_MLIRTRANSLATE_TRANSLATION_H #include "mlir/IR/Operation.h" #include "llvm/Support/CommandLine.h" #include namespace mlir { template class OwningOpRef; /// Interface of the function that translates the sources managed by `sourceMgr` /// to MLIR. The source manager has at least one buffer. The implementation /// should create a new MLIR Operation in the given context and return a /// pointer to it, or a nullptr in case of any error. using TranslateSourceMgrToMLIRFunction = std::function( const std::shared_ptr &sourceMgr, MLIRContext *)>; using TranslateRawSourceMgrToMLIRFunction = std::function(llvm::SourceMgr &sourceMgr, MLIRContext *)>; /// Interface of the function that translates the given string to MLIR. The /// implementation should create a new MLIR Operation in the given context. If /// source-related error reporting is required from within the function, use /// TranslateSourceMgrToMLIRFunction instead. using TranslateStringRefToMLIRFunction = std::function(llvm::StringRef, MLIRContext *)>; /// Interface of the function that translates MLIR to a different format and /// outputs the result to a stream. It is allowed to modify the operation. using TranslateFromMLIRFunction = std::function; /// Interface of the function that performs file-to-file translation involving /// MLIR. The input file is held in the given MemoryBuffer; the output file /// should be written to the given raw_ostream. The implementation should create /// all MLIR constructs needed during the process inside the given context. This /// can be used for round-tripping external formats through the MLIR system. using TranslateFunction = std::function &sourceMgr, llvm::raw_ostream &output, MLIRContext *)>; /// Interface of the function that adds all dialects and dialect extensions used /// for the translation to the given DialectRegistry. using DialectRegistrationFunction = std::function; /// This class contains all of the components necessary for performing a /// translation. class Translation { public: Translation() = default; Translation(TranslateFunction function, StringRef description, std::optional inputAlignment) : function(std::move(function)), description(description), inputAlignment(inputAlignment) {} /// Return the description of this translation. StringRef getDescription() const { return description; } /// Return the optional alignment desired for the input of the translation. std::optional getInputAlignment() const { return inputAlignment; } /// Invoke the translation function with the given input and output streams. LogicalResult operator()(const std::shared_ptr &sourceMgr, llvm::raw_ostream &output, MLIRContext *context) const { return function(sourceMgr, output, context); } private: /// The underlying translation function. TranslateFunction function; /// The description of the translation. StringRef description; /// An optional alignment desired for the input of the translation. std::optional inputAlignment; }; /// Use Translate[ToMLIR|FromMLIR]Registration as an initializer that /// registers a function and associates it with name. This requires that a /// translation has not been registered to a given name. `inputAlign` is an /// optional expected alignment for the input data. /// /// Usage: /// /// // At file scope. /// namespace mlir { /// void registerTRexToMLIRRegistration() { /// TranslateToMLIRRegistration Unused(&MySubCommand, [] { ... }); /// } /// } // namespace mlir /// /// \{ struct TranslateToMLIRRegistration { TranslateToMLIRRegistration( llvm::StringRef name, llvm::StringRef description, const TranslateSourceMgrToMLIRFunction &function, const DialectRegistrationFunction &dialectRegistration = [](DialectRegistry &) {}, std::optional inputAlignment = std::nullopt); TranslateToMLIRRegistration( llvm::StringRef name, llvm::StringRef description, const TranslateRawSourceMgrToMLIRFunction &function, const DialectRegistrationFunction &dialectRegistration = [](DialectRegistry &) {}, std::optional inputAlignment = std::nullopt); TranslateToMLIRRegistration( llvm::StringRef name, llvm::StringRef description, const TranslateStringRefToMLIRFunction &function, const DialectRegistrationFunction &dialectRegistration = [](DialectRegistry &) {}, std::optional inputAlignment = std::nullopt); }; struct TranslateFromMLIRRegistration { TranslateFromMLIRRegistration( llvm::StringRef name, llvm::StringRef description, const TranslateFromMLIRFunction &function, const DialectRegistrationFunction &dialectRegistration = [](DialectRegistry &) {}); template , typename = std::enable_if_t>> TranslateFromMLIRRegistration( llvm::StringRef name, llvm::StringRef description, FuncTy function, const DialectRegistrationFunction &dialectRegistration = [](DialectRegistry &) {}) : TranslateFromMLIRRegistration( name, description, [function](Operation *op, raw_ostream &os) -> LogicalResult { if (auto casted = dyn_cast(op)) return function(casted, os); return emitError(op->getLoc()) << "expected a '" << OpTy::getOperationName() << "' op, got '" << op->getName().getStringRef() << "'"; }, dialectRegistration) {} }; struct TranslateRegistration { TranslateRegistration(llvm::StringRef name, llvm::StringRef description, const TranslateFunction &function); }; /// \} /// A command line parser for translation functions. struct TranslationParser : public llvm::cl::parser { TranslationParser(llvm::cl::Option &opt); void printOptionInfo(const llvm::cl::Option &o, size_t globalWidth) const override; }; /// Register command-line options used by the translation registry. void registerTranslationCLOptions(); } // namespace mlir #endif // MLIR_TOOLS_MLIRTRANSLATE_TRANSLATION_H