MLIR  20.0.0git
Translation.cpp
Go to the documentation of this file.
1 //===- Translation.cpp - Translation registry -----------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // Definitions of the translation registry.
10 //
11 //===----------------------------------------------------------------------===//
12 
14 #include "mlir/IR/AsmState.h"
15 #include "mlir/IR/BuiltinOps.h"
16 #include "mlir/IR/Dialect.h"
17 #include "mlir/IR/Verifier.h"
18 #include "mlir/Parser/Parser.h"
20 #include "llvm/Support/ManagedStatic.h"
21 #include "llvm/Support/SourceMgr.h"
22 #include <optional>
23 
24 using namespace mlir;
25 
26 //===----------------------------------------------------------------------===//
27 // Translation CommandLine Options
28 //===----------------------------------------------------------------------===//
29 
31  llvm::cl::opt<bool> noImplicitModule{
32  "no-implicit-module",
33  llvm::cl::desc("Disable the parsing of an implicit top-level module op"),
34  llvm::cl::init(false)};
35 };
36 
37 static llvm::ManagedStatic<TranslationOptions> clOptions;
38 
40 
41 //===----------------------------------------------------------------------===//
42 // Translation Registry
43 //===----------------------------------------------------------------------===//
44 
45 /// Get the mutable static map between registered file-to-file MLIR
46 /// translations.
47 static llvm::StringMap<Translation> &getTranslationRegistry() {
48  static llvm::StringMap<Translation> translationBundle;
49  return translationBundle;
50 }
51 
52 /// Register the given translation.
53 static void registerTranslation(StringRef name, StringRef description,
54  std::optional<llvm::Align> inputAlignment,
55  const TranslateFunction &function) {
56  auto &registry = getTranslationRegistry();
57  if (registry.count(name))
58  llvm::report_fatal_error(
59  "Attempting to overwrite an existing <file-to-file> function");
60  assert(function &&
61  "Attempting to register an empty translate <file-to-file> function");
62  registry[name] = Translation(function, description, inputAlignment);
63 }
64 
66  StringRef name, StringRef description, const TranslateFunction &function) {
67  registerTranslation(name, description, /*inputAlignment=*/std::nullopt,
68  function);
69 }
70 
71 //===----------------------------------------------------------------------===//
72 // Translation to MLIR
73 //===----------------------------------------------------------------------===//
74 
75 // Puts `function` into the to-MLIR translation registry unless there is already
76 // a function registered for the same name.
78  StringRef name, StringRef description,
79  const DialectRegistrationFunction &dialectRegistration,
80  std::optional<llvm::Align> inputAlignment,
81  const TranslateSourceMgrToMLIRFunction &function) {
82  auto wrappedFn = [function, dialectRegistration](
83  const std::shared_ptr<llvm::SourceMgr> &sourceMgr,
84  raw_ostream &output, MLIRContext *context) {
85  DialectRegistry registry;
86  dialectRegistration(registry);
87  context->appendDialectRegistry(registry);
88  OwningOpRef<Operation *> op = function(sourceMgr, context);
89  if (!op || failed(verify(*op)))
90  return failure();
91  op.get()->print(output);
92  return success();
93  };
94  registerTranslation(name, description, inputAlignment, wrappedFn);
95 }
96 
98  StringRef name, StringRef description,
99  const TranslateSourceMgrToMLIRFunction &function,
100  const DialectRegistrationFunction &dialectRegistration,
101  std::optional<llvm::Align> inputAlignment) {
102  registerTranslateToMLIRFunction(name, description, dialectRegistration,
103  inputAlignment, function);
104 }
106  StringRef name, StringRef description,
107  const TranslateRawSourceMgrToMLIRFunction &function,
108  const DialectRegistrationFunction &dialectRegistration,
109  std::optional<llvm::Align> inputAlignment) {
111  name, description, dialectRegistration, inputAlignment,
112  [function](const std::shared_ptr<llvm::SourceMgr> &sourceMgr,
113  MLIRContext *ctx) { return function(*sourceMgr, ctx); });
114 }
115 /// Wraps `function` with a lambda that extracts a StringRef from a source
116 /// manager and registers the wrapper lambda as a to-MLIR conversion.
118  StringRef name, StringRef description,
119  const TranslateStringRefToMLIRFunction &function,
120  const DialectRegistrationFunction &dialectRegistration,
121  std::optional<llvm::Align> inputAlignment) {
123  name, description, dialectRegistration, inputAlignment,
124  [function](const std::shared_ptr<llvm::SourceMgr> &sourceMgr,
125  MLIRContext *ctx) {
126  const llvm::MemoryBuffer *buffer =
127  sourceMgr->getMemoryBuffer(sourceMgr->getMainFileID());
128  return function(buffer->getBuffer(), ctx);
129  });
130 }
131 
132 //===----------------------------------------------------------------------===//
133 // Translation from MLIR
134 //===----------------------------------------------------------------------===//
135 
137  StringRef name, StringRef description,
138  const TranslateFromMLIRFunction &function,
139  const DialectRegistrationFunction &dialectRegistration) {
141  name, description, /*inputAlignment=*/std::nullopt,
142  [function,
143  dialectRegistration](const std::shared_ptr<llvm::SourceMgr> &sourceMgr,
144  raw_ostream &output, MLIRContext *context) {
145  DialectRegistry registry;
146  dialectRegistration(registry);
147  context->appendDialectRegistry(registry);
148  bool implicitModule =
149  (!clOptions.isConstructed() || !clOptions->noImplicitModule);
151  parseSourceFileForTool(sourceMgr, context, implicitModule);
152  if (!op || failed(verify(*op)))
153  return failure();
154  return function(op.get(), output);
155  });
156 }
157 
158 //===----------------------------------------------------------------------===//
159 // Translation Parser
160 //===----------------------------------------------------------------------===//
161 
163  : llvm::cl::parser<const Translation *>(opt) {
164  for (const auto &kv : getTranslationRegistry())
165  addLiteralOption(kv.first(), &kv.second, kv.second.getDescription());
166 }
167 
168 void TranslationParser::printOptionInfo(const llvm::cl::Option &o,
169  size_t globalWidth) const {
170  TranslationParser *tp = const_cast<TranslationParser *>(this);
171  llvm::array_pod_sort(tp->Values.begin(), tp->Values.end(),
172  [](const TranslationParser::OptionInfo *lhs,
173  const TranslationParser::OptionInfo *rhs) {
174  return lhs->Name.compare(rhs->Name);
175  });
177 }
static llvm::ManagedStatic< TranslationOptions > clOptions
Definition: Translation.cpp:37
static llvm::StringMap< Translation > & getTranslationRegistry()
Get the mutable static map between registered file-to-file MLIR translations.
Definition: Translation.cpp:47
static void registerTranslateToMLIRFunction(StringRef name, StringRef description, const DialectRegistrationFunction &dialectRegistration, std::optional< llvm::Align > inputAlignment, const TranslateSourceMgrToMLIRFunction &function)
Definition: Translation.cpp:77
static void registerTranslation(StringRef name, StringRef description, std::optional< llvm::Align > inputAlignment, const TranslateFunction &function)
Register the given translation.
Definition: Translation.cpp:53
The DialectRegistry maps a dialect namespace to a constructor for the matching dialect.
MLIRContext is the top-level object for a collection of MLIR operations.
Definition: MLIRContext.h:60
void appendDialectRegistry(const DialectRegistry &registry)
Append the contents of the given dialect registry to the registry associated with this context.
This class acts as an owning reference to an op, and will automatically destroy the held op on destru...
Definition: OwningOpRef.h:29
OpTy get() const
Allow accessing the internal op.
Definition: OwningOpRef.h:51
This class contains all of the components necessary for performing a translation.
Definition: Translation.h:61
The OpAsmOpInterface, see OpAsmInterface.td for more details.
Definition: CallGraph.h:229
Include the generated interface declarations.
std::function< LogicalResult(const std::shared_ptr< llvm::SourceMgr > &sourceMgr, llvm::raw_ostream &output, MLIRContext *)> TranslateFunction
Interface of the function that performs file-to-file translation involving MLIR.
Definition: Translation.h:53
std::function< OwningOpRef< Operation * >(llvm::SourceMgr &sourceMgr, MLIRContext *)> TranslateRawSourceMgrToMLIRFunction
Definition: Translation.h:32
void registerTranslationCLOptions()
Register command-line options used by the translation registry.
Definition: Translation.cpp:39
std::function< void(DialectRegistry &)> DialectRegistrationFunction
Interface of the function that adds all dialects and dialect extensions used for the translation to t...
Definition: Translation.h:57
OwningOpRef< Operation * > parseSourceFileForTool(const std::shared_ptr< llvm::SourceMgr > &sourceMgr, const ParserConfig &config, bool insertImplicitModule)
This parses the file specified by the indicated SourceMgr.
std::function< LogicalResult(Operation *, llvm::raw_ostream &output)> TranslateFromMLIRFunction
Interface of the function that translates MLIR to a different format and outputs the result to a stre...
Definition: Translation.h:44
std::function< OwningOpRef< Operation * >(llvm::StringRef, MLIRContext *)> TranslateStringRefToMLIRFunction
Interface of the function that translates the given string to MLIR.
Definition: Translation.h:39
std::function< OwningOpRef< Operation * >(const std::shared_ptr< llvm::SourceMgr > &sourceMgr, MLIRContext *)> TranslateSourceMgrToMLIRFunction
Interface of the function that translates the sources managed by sourceMgr to MLIR.
Definition: Translation.h:29
LogicalResult verify(Operation *op, bool verifyRecursively=true)
Perform (potentially expensive) checks of invariants, used to detect compiler bugs,...
Definition: Verifier.cpp:426
TranslateFromMLIRRegistration(llvm::StringRef name, llvm::StringRef description, const TranslateFromMLIRFunction &function, const DialectRegistrationFunction &dialectRegistration=[](DialectRegistry &) {})
TranslateRegistration(llvm::StringRef name, llvm::StringRef description, const TranslateFunction &function)
Definition: Translation.cpp:65
TranslateToMLIRRegistration(llvm::StringRef name, llvm::StringRef description, const TranslateSourceMgrToMLIRFunction &function, const DialectRegistrationFunction &dialectRegistration=[](DialectRegistry &) {}, std::optional< llvm::Align > inputAlignment=std::nullopt)
A command line parser for translation functions.
Definition: Translation.h:162
void printOptionInfo(const llvm::cl::Option &o, size_t globalWidth) const override
TranslationParser(llvm::cl::Option &opt)