forked from OSchip/llvm-project
Factor out translation registry.
The mlir-translate tool is expected to discover individual translations at link time. These translations must register themselves and may need the utilities that are currently defined in mlir-translate.cpp for their entry point functions. Since mlir-translate is linking against individual translations, the translations cannot link against mlir-translate themselves. Extract out the utilities into a separate "Translation" library to avoid the potential dependency cycle. Individual translations link to that library to access TranslateRegistration. The mlir-translate tool links to individual translations and to the "Translation" library because it needs the utilities as well. The main header of the new library is located in include/mlir/Translation.h to make it easily accessible by translators. The rationale for putting it to include/mlir rather than to one of its subdirectories is that its purpose is similar to that of include/mlir/Pass.h so it makes sense to put them at the same level. PiperOrigin-RevId: 222398617
This commit is contained in:
parent
1967325244
commit
b5756fdaa1
|
@ -0,0 +1,54 @@
|
||||||
|
//===- Translation.h - Translation registry ---------------------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// Copyright 2019 The MLIR Authors.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// =============================================================================
|
||||||
|
//
|
||||||
|
// Registry for user-provided translations.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
#ifndef MLIR_TRANSLATION_H
|
||||||
|
#define MLIR_TRANSLATION_H
|
||||||
|
|
||||||
|
#include "llvm/ADT/StringMap.h"
|
||||||
|
#include "llvm/ADT/StringRef.h"
|
||||||
|
|
||||||
|
namespace mlir {
|
||||||
|
class MLIRContext;
|
||||||
|
class Module;
|
||||||
|
|
||||||
|
using TranslateFunction =
|
||||||
|
std::function<bool(llvm::StringRef inputFilename,
|
||||||
|
llvm::StringRef oututFilename, MLIRContext *)>;
|
||||||
|
|
||||||
|
// Use TranslateRegistration as a global initialiser that registers a function
|
||||||
|
// and associates it with name. This requires that a translation has not been
|
||||||
|
// registered to a given name.
|
||||||
|
//
|
||||||
|
// Usage:
|
||||||
|
//
|
||||||
|
// // At namespace scope.
|
||||||
|
// static TranslateRegistration Unused(&MySubCommand, [] { ... });
|
||||||
|
//
|
||||||
|
struct TranslateRegistration {
|
||||||
|
TranslateRegistration(llvm::StringRef name,
|
||||||
|
const TranslateFunction &function);
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Get a read-only reference to the translator registry.
|
||||||
|
const llvm::StringMap<TranslateFunction> &getTranslationRegistry();
|
||||||
|
|
||||||
|
} // namespace mlir
|
||||||
|
|
||||||
|
#endif // MLIR_TRANSLATION_H
|
|
@ -0,0 +1,48 @@
|
||||||
|
//===- Translation.cpp - Translation registry -------------------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// Copyright 2019 The MLIR Authors.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// =============================================================================
|
||||||
|
//
|
||||||
|
// Definitions of the translation registry.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "mlir/Translation.h"
|
||||||
|
#include "mlir/Support/LLVM.h"
|
||||||
|
#include "llvm/Support/ManagedStatic.h"
|
||||||
|
|
||||||
|
using namespace mlir;
|
||||||
|
|
||||||
|
// Get the mutable static map between translations registered and the
|
||||||
|
// TranslateFunctions that perform those translations.
|
||||||
|
static llvm::StringMap<TranslateFunction> &getMutableTranslationRegistry() {
|
||||||
|
static llvm::StringMap<TranslateFunction> translationRegistry;
|
||||||
|
return translationRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
TranslateRegistration::TranslateRegistration(
|
||||||
|
StringRef name, const TranslateFunction &function) {
|
||||||
|
auto &translationRegistry = getMutableTranslationRegistry();
|
||||||
|
if (translationRegistry.find(name) != translationRegistry.end())
|
||||||
|
llvm::report_fatal_error("Attempting to overwrite an existing function");
|
||||||
|
assert(function && "Attempting to register an empty translate function");
|
||||||
|
translationRegistry[name] = function;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Merely add the const qualifier to the mutable registry so that external users
|
||||||
|
// cannot modify it.
|
||||||
|
const llvm::StringMap<TranslateFunction> &mlir::getTranslationRegistry() {
|
||||||
|
return getMutableTranslationRegistry();
|
||||||
|
}
|
|
@ -24,11 +24,11 @@
|
||||||
#include "mlir/IR/MLIRContext.h"
|
#include "mlir/IR/MLIRContext.h"
|
||||||
#include "mlir/IR/Module.h"
|
#include "mlir/IR/Module.h"
|
||||||
#include "mlir/Parser.h"
|
#include "mlir/Parser.h"
|
||||||
|
#include "mlir/Translation.h"
|
||||||
#include "llvm/ADT/StringMap.h"
|
#include "llvm/ADT/StringMap.h"
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
#include "llvm/Support/FileUtilities.h"
|
#include "llvm/Support/FileUtilities.h"
|
||||||
#include "llvm/Support/InitLLVM.h"
|
#include "llvm/Support/InitLLVM.h"
|
||||||
#include "llvm/Support/ManagedStatic.h"
|
|
||||||
#include "llvm/Support/PrettyStackTrace.h"
|
#include "llvm/Support/PrettyStackTrace.h"
|
||||||
#include "llvm/Support/SourceMgr.h"
|
#include "llvm/Support/SourceMgr.h"
|
||||||
#include "llvm/Support/ToolOutputFile.h"
|
#include "llvm/Support/ToolOutputFile.h"
|
||||||
|
@ -57,17 +57,26 @@ Module *mlir::parseMLIRInput(StringRef inputFilename, MLIRContext *context) {
|
||||||
return parseSourceFile(sourceMgr, context);
|
return parseSourceFile(sourceMgr, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool mlir::printMLIROutput(const Module &module,
|
std::unique_ptr<llvm::ToolOutputFile>
|
||||||
llvm::StringRef outputFilename) {
|
mlir::openOutputFile(llvm::StringRef outputFilename) {
|
||||||
std::error_code error;
|
std::error_code error;
|
||||||
auto result = llvm::make_unique<llvm::ToolOutputFile>(outputFilename, error,
|
auto result = llvm::make_unique<llvm::ToolOutputFile>(outputFilename, error,
|
||||||
llvm::sys::fs::F_None);
|
llvm::sys::fs::F_None);
|
||||||
if (error) {
|
if (error) {
|
||||||
llvm::errs() << error.message();
|
llvm::errs() << error.message();
|
||||||
return true;
|
return nullptr;
|
||||||
}
|
}
|
||||||
module.print(result->os());
|
|
||||||
result->keep();
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool mlir::printMLIROutput(const Module &module,
|
||||||
|
llvm::StringRef outputFilename) {
|
||||||
|
auto file = openOutputFile(outputFilename);
|
||||||
|
if (!file)
|
||||||
|
return true;
|
||||||
|
module.print(file->os());
|
||||||
|
file->keep();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,24 +92,11 @@ static TranslateRegistration MLIRToMLIRTranslate(
|
||||||
return printMLIROutput(*module, outputFilename);
|
return printMLIROutput(*module, outputFilename);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Static map between translations registered and the TranslateFunctions that
|
|
||||||
// perform those translations.
|
|
||||||
static llvm::ManagedStatic<llvm::StringMap<TranslateFunction>>
|
|
||||||
translationRegistry;
|
|
||||||
|
|
||||||
TranslateRegistration::TranslateRegistration(
|
|
||||||
llvm::StringRef name, const TranslateFunction &function) {
|
|
||||||
if (translationRegistry->find(name) != translationRegistry->end())
|
|
||||||
llvm::report_fatal_error("Attempting to overwrite an existing function");
|
|
||||||
assert(function && "Attempting to register an empty translate function");
|
|
||||||
(*translationRegistry)[name] = function;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Custom parser for TranslateFunction.
|
// Custom parser for TranslateFunction.
|
||||||
struct TranslationParser : public llvm::cl::parser<const TranslateFunction *> {
|
struct TranslationParser : public llvm::cl::parser<const TranslateFunction *> {
|
||||||
TranslationParser(llvm::cl::Option &opt)
|
TranslationParser(llvm::cl::Option &opt)
|
||||||
: llvm::cl::parser<const TranslateFunction *>(opt) {
|
: llvm::cl::parser<const TranslateFunction *>(opt) {
|
||||||
for (const auto &kv : *translationRegistry) {
|
for (const auto &kv : getTranslationRegistry()) {
|
||||||
addLiteralOption(kv.first(), &kv.second, kv.first());
|
addLiteralOption(kv.first(), &kv.second, kv.first());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
//===- mlir-translate.h - Registry & utility functions for translations ---===//
|
//===- mlir-translate.h - Translation driver -----------------*- C++ -*----===//
|
||||||
//
|
//
|
||||||
// Copyright 2019 The MLIR Authors.
|
// Copyright 2019 The MLIR Authors.
|
||||||
//
|
//
|
||||||
|
@ -22,29 +22,20 @@
|
||||||
#ifndef TOOLS_MLIR_TRANSLATE_H
|
#ifndef TOOLS_MLIR_TRANSLATE_H
|
||||||
#define TOOLS_MLIR_TRANSLATE_H
|
#define TOOLS_MLIR_TRANSLATE_H
|
||||||
|
|
||||||
#include "llvm/ADT/StringRef.h"
|
#include "mlir/Support/LLVM.h"
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
class ToolOutputFile;
|
||||||
|
}
|
||||||
|
|
||||||
namespace mlir {
|
namespace mlir {
|
||||||
class MLIRContext;
|
class MLIRContext;
|
||||||
class Module;
|
class Module;
|
||||||
|
|
||||||
using TranslateFunction =
|
/// Open a file to be used as raw_ostream.
|
||||||
std::function<bool(llvm::StringRef inputFilename,
|
std::unique_ptr<llvm::ToolOutputFile>
|
||||||
llvm::StringRef oututFilename, MLIRContext *)>;
|
openOutputFile(llvm::StringRef outputFilename);
|
||||||
|
|
||||||
// Use TranslateRegistration as a global initialiser that registers a function
|
|
||||||
// and associates it with name. This requires that a translation has not been
|
|
||||||
// registered to a given name.
|
|
||||||
//
|
|
||||||
// Usage:
|
|
||||||
//
|
|
||||||
// // At namespace scope.
|
|
||||||
// static TranslateRegistration Unused(&MySubCommand, [] { ... });
|
|
||||||
//
|
|
||||||
struct TranslateRegistration {
|
|
||||||
TranslateRegistration(llvm::StringRef name,
|
|
||||||
const TranslateFunction &function);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Returns module parsed from input filename or null in case of error.
|
// Returns module parsed from input filename or null in case of error.
|
||||||
Module *parseMLIRInput(llvm::StringRef inputFilename, MLIRContext *context);
|
Module *parseMLIRInput(llvm::StringRef inputFilename, MLIRContext *context);
|
||||||
|
|
Loading…
Reference in New Issue