summaryrefslogtreecommitdiffstats
path: root/mlir/lib/Support/TranslateClParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mlir/lib/Support/TranslateClParser.cpp')
-rw-r--r--mlir/lib/Support/TranslateClParser.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/mlir/lib/Support/TranslateClParser.cpp b/mlir/lib/Support/TranslateClParser.cpp
new file mode 100644
index 00000000000..1f538cb531d
--- /dev/null
+++ b/mlir/lib/Support/TranslateClParser.cpp
@@ -0,0 +1,93 @@
+//===- TranslateClParser.h - Translations command line parser -------------===//
+//
+// Part of the MLIR 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
+//
+//===----------------------------------------------------------------------===//
+//
+// This file contains custom command line parser for translations.
+//
+//===----------------------------------------------------------------------===//
+
+#include "mlir/Support/TranslateClParser.h"
+
+#include "mlir/Analysis/Verifier.h"
+#include "mlir/IR/MLIRContext.h"
+#include "mlir/IR/Module.h"
+#include "mlir/Parser.h"
+#include "mlir/Support/LogicalResult.h"
+#include "mlir/Translation.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/FileUtilities.h"
+#include "llvm/Support/SourceMgr.h"
+#include "llvm/Support/ToolOutputFile.h"
+
+using namespace mlir;
+
+// Storage for the translation function wrappers that survive the parser.
+static SmallVector<TranslateFunction, 16> wrapperStorage;
+
+static LogicalResult printMLIROutput(ModuleOp module, raw_ostream &os) {
+ if (failed(verify(module)))
+ return failure();
+ module.print(os);
+ return success();
+}
+
+TranslationParser::TranslationParser(llvm::cl::Option &opt)
+ : llvm::cl::parser<const TranslateFunction *>(opt) {
+ const auto &toMLIRRegistry = getTranslationToMLIRRegistry();
+ const auto &fromMLIRRegistry = getTranslationFromMLIRRegistry();
+ const auto &fileToFileRegistry = getTranslationRegistry();
+
+ // Reserve the required capacity upfront so that pointers are not
+ // invalidated on reallocation.
+ wrapperStorage.reserve(toMLIRRegistry.size() + fromMLIRRegistry.size() +
+ fileToFileRegistry.size());
+ for (const auto &kv : toMLIRRegistry) {
+ TranslateSourceMgrToMLIRFunction function = kv.second;
+ TranslateFunction wrapper = [function](llvm::SourceMgr &sourceMgr,
+ raw_ostream &output,
+ MLIRContext *context) {
+ OwningModuleRef module = function(sourceMgr, context);
+ if (!module)
+ return failure();
+ return printMLIROutput(*module, output);
+ };
+ wrapperStorage.emplace_back(std::move(wrapper));
+
+ addLiteralOption(kv.first(), &wrapperStorage.back(), kv.first());
+ }
+
+ for (const auto &kv : fromMLIRRegistry) {
+ TranslateFromMLIRFunction function = kv.second;
+ TranslateFunction wrapper = [function](llvm::SourceMgr &sourceMgr,
+ raw_ostream &output,
+ MLIRContext *context) {
+ auto module = OwningModuleRef(parseSourceFile(sourceMgr, context));
+ if (!module)
+ return failure();
+ return function(module.get(), output);
+ };
+ wrapperStorage.emplace_back(std::move(wrapper));
+
+ addLiteralOption(kv.first(), &wrapperStorage.back(), kv.first());
+ }
+ for (const auto &kv : fileToFileRegistry) {
+ wrapperStorage.emplace_back(kv.second);
+ addLiteralOption(kv.first(), &wrapperStorage.back(), kv.first());
+ }
+}
+
+void TranslationParser::printOptionInfo(const llvm::cl::Option &O,
+ size_t GlobalWidth) const {
+ TranslationParser *TP = const_cast<TranslationParser *>(this);
+ llvm::array_pod_sort(TP->Values.begin(), TP->Values.end(),
+ [](const TranslationParser::OptionInfo *VT1,
+ const TranslationParser::OptionInfo *VT2) {
+ return VT1->Name.compare(VT2->Name);
+ });
+ using llvm::cl::parser;
+ parser<const TranslateFunction *>::printOptionInfo(O, GlobalWidth);
+}
OpenPOWER on IntegriCloud