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.
void print(raw_ostream &os, const OpPrintingFlags &flags=std::nullopt)
This class acts as an owning reference to an op, and will automatically destroy the held op on destru...
Definition: OwningOpRef.h:29
This class contains all of the components necessary for performing a translation.
Definition: Translation.h:61
Include the generated interface declarations.
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:421
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)