Files
gps/tools/local/circt/include/mlir/Tools/mlir-translate/Translation.h
T
2026-07-12 11:01:51 +03:00

175 lines
7.1 KiB
C++

//===- 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 <optional>
namespace mlir {
template <typename OpTy>
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<OwningOpRef<Operation *>(
const std::shared_ptr<llvm::SourceMgr> &sourceMgr, MLIRContext *)>;
using TranslateRawSourceMgrToMLIRFunction =
std::function<OwningOpRef<Operation *>(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<OwningOpRef<Operation *>(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<LogicalResult(Operation *, llvm::raw_ostream &output)>;
/// 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<LogicalResult(
const std::shared_ptr<llvm::SourceMgr> &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<void(DialectRegistry &)>;
/// This class contains all of the components necessary for performing a
/// translation.
class Translation {
public:
Translation() = default;
Translation(TranslateFunction function, StringRef description,
std::optional<llvm::Align> 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<llvm::Align> getInputAlignment() const {
return inputAlignment;
}
/// Invoke the translation function with the given input and output streams.
LogicalResult operator()(const std::shared_ptr<llvm::SourceMgr> &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<llvm::Align> 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<llvm::Align> inputAlignment = std::nullopt);
TranslateToMLIRRegistration(
llvm::StringRef name, llvm::StringRef description,
const TranslateRawSourceMgrToMLIRFunction &function,
const DialectRegistrationFunction &dialectRegistration =
[](DialectRegistry &) {},
std::optional<llvm::Align> inputAlignment = std::nullopt);
TranslateToMLIRRegistration(
llvm::StringRef name, llvm::StringRef description,
const TranslateStringRefToMLIRFunction &function,
const DialectRegistrationFunction &dialectRegistration =
[](DialectRegistry &) {},
std::optional<llvm::Align> inputAlignment = std::nullopt);
};
struct TranslateFromMLIRRegistration {
TranslateFromMLIRRegistration(
llvm::StringRef name, llvm::StringRef description,
const TranslateFromMLIRFunction &function,
const DialectRegistrationFunction &dialectRegistration =
[](DialectRegistry &) {});
template <typename FuncTy, typename OpTy = detail::first_argument<FuncTy>,
typename = std::enable_if_t<!std::is_same_v<OpTy, Operation *>>>
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<OpTy>(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<const Translation *> {
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