[mlir][NFC] Move Translation.h to a Tools/mlir-translate directory

Translation.h is currently awkwardly shoved into the top-level mlir, even though it is
specific to the mlir-translate tool. This commit moves it to a new Tools/mlir-translate
directory, which is intended for libraries used to implement tools. It also splits the
translate registry from the main entry point, to more closely mirror what mlir-opt
does.

Differential Revision: https://reviews.llvm.org/D121026
This commit is contained in:
River Riddle 2022-03-05 12:27:00 -08:00
parent 6b7d211a1b
commit ee1d447e5f
24 changed files with 173 additions and 129 deletions

View File

@ -17,7 +17,7 @@ target_link_libraries(standalone-translate
MLIRParser
MLIRPass
MLIRSPIRV
MLIRTranslation
MLIRTranslateLib
MLIRSupport
)

View File

@ -13,7 +13,7 @@
#include "mlir/InitAllTranslations.h"
#include "mlir/Support/LogicalResult.h"
#include "mlir/Translation.h"
#include "mlir/Tools/mlir-translate/MlirTranslateMain.h"
#include "Standalone/StandaloneDialect.h"

View File

@ -0,0 +1,28 @@
//===- MlirTranslateMain.h - MLIR Translation Driver main -------*- 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
//
//===----------------------------------------------------------------------===//
//
// Main entry function for mlir-translate for when built as standalone binary.
//
//===----------------------------------------------------------------------===//
#ifndef MLIR_TOOLS_MLIRTRANSLATE_MLIRTRANSLATEMAIN_H
#define MLIR_TOOLS_MLIRTRANSLATE_MLIRTRANSLATEMAIN_H
#include "mlir/Support/LogicalResult.h"
#include "llvm/ADT/StringRef.h"
namespace mlir {
/// Translate to/from an MLIR module from/to an external representation (e.g.
/// LLVM IR, SPIRV binary, ...). This is the entry point for the implementation
/// of tools like `mlir-translate`. The translation to perform is parsed from
/// the command line. The `toolName` argument is used for the header displayed
/// by `--help`.
LogicalResult mlirTranslateMain(int argc, char **argv, StringRef toolName);
} // namespace mlir
#endif // MLIR_TOOLS_MLIRTRANSLATE_MLIRTRANSLATEMAIN_H

View File

@ -9,8 +9,9 @@
// Registry for user-provided translations.
//
//===----------------------------------------------------------------------===//
#ifndef MLIR_TRANSLATION_H
#define MLIR_TRANSLATION_H
#ifndef MLIR_TOOLS_MLIRTRANSLATE_TRANSLATION_H
#define MLIR_TOOLS_MLIRTRANSLATE_TRANSLATION_H
#include "llvm/Support/CommandLine.h"
@ -96,14 +97,6 @@ struct TranslationParser : public llvm::cl::parser<const TranslateFunction *> {
size_t globalWidth) const override;
};
/// Translate to/from an MLIR module from/to an external representation (e.g.
/// LLVM IR, SPIRV binary, ...). This is the entry point for the implementation
/// of tools like `mlir-translate`. The translation to perform is parsed from
/// the command line. The `toolName` argument is used for the header displayed
/// by `--help`.
LogicalResult mlirTranslateMain(int argc, char **argv,
llvm::StringRef toolName);
} // namespace mlir
#endif // MLIR_TRANSLATION_H
#endif // MLIR_TOOLS_MLIRTRANSLATE_TRANSLATION_H

View File

@ -15,7 +15,6 @@ add_subdirectory(TableGen)
add_subdirectory(Target)
add_subdirectory(Tools)
add_subdirectory(Transforms)
add_subdirectory(Translation)
# Only enable the ExecutionEngine if the native target is configured in.
if(TARGET ${LLVM_NATIVE_ARCH})

View File

@ -15,5 +15,5 @@ add_mlir_conversion_library(MLIRGPUToVulkanTransforms
MLIRSPIRVSerialization
MLIRSupport
MLIRTransforms
MLIRTranslation
MLIRTranslateLib
)

View File

@ -14,5 +14,5 @@ add_mlir_translation_library(MLIRTargetCpp
MLIRMath
MLIRSCF
MLIRSupport
MLIRTranslation
MLIRTranslateLib
)

View File

@ -15,7 +15,7 @@
#include "mlir/IR/BuiltinOps.h"
#include "mlir/IR/Dialect.h"
#include "mlir/Target/Cpp/CppEmitter.h"
#include "mlir/Translation.h"
#include "mlir/Tools/mlir-translate/Translation.h"
#include "llvm/Support/CommandLine.h"
using namespace mlir;

View File

@ -30,7 +30,7 @@ add_mlir_translation_library(MLIRTargetLLVMIRExport
MLIRDLTI
MLIRLLVMIR
MLIRLLVMIRTransforms
MLIRTranslation
MLIRTranslateLib
)
add_mlir_translation_library(MLIRToLLVMIRTranslationRegistration
@ -62,5 +62,5 @@ add_mlir_translation_library(MLIRTargetLLVMIRImport
LINK_LIBS PUBLIC
MLIRDLTI
MLIRLLVMIR
MLIRTranslation
MLIRTranslateLib
)

View File

@ -20,7 +20,7 @@
#include "mlir/IR/MLIRContext.h"
#include "mlir/Interfaces/DataLayoutInterfaces.h"
#include "mlir/Target/LLVMIR/TypeFromLLVM.h"
#include "mlir/Translation.h"
#include "mlir/Tools/mlir-translate/Translation.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/ADT/TypeSwitch.h"

View File

@ -14,7 +14,7 @@
#include "mlir/IR/BuiltinOps.h"
#include "mlir/Target/LLVMIR/Dialect/All.h"
#include "mlir/Target/LLVMIR/Export.h"
#include "mlir/Translation.h"
#include "mlir/Tools/mlir-translate/Translation.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"

View File

@ -24,5 +24,5 @@ add_mlir_translation_library(MLIRSPIRVTranslateRegistration
MLIRSPIRVSerialization
MLIRSPIRVDeserialization
MLIRSupport
MLIRTranslation
MLIRTranslateLib
)

View File

@ -11,7 +11,7 @@ add_mlir_translation_library(MLIRSPIRVDeserialization
MLIRSPIRV
MLIRSPIRVBinaryUtils
MLIRSupport
MLIRTranslation
MLIRTranslateLib
)

View File

@ -11,7 +11,7 @@ add_mlir_translation_library(MLIRSPIRVSerialization
MLIRSPIRV
MLIRSPIRVBinaryUtils
MLIRSupport
MLIRTranslation
MLIRTranslateLib
)

View File

@ -21,7 +21,7 @@
#include "mlir/Support/FileUtilities.h"
#include "mlir/Target/SPIRV/Deserialization.h"
#include "mlir/Target/SPIRV/Serialization.h"
#include "mlir/Translation.h"
#include "mlir/Tools/mlir-translate/Translation.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/SMLoc.h"

View File

@ -1,4 +1,5 @@
add_subdirectory(mlir-lsp-server)
add_subdirectory(mlir-opt)
add_subdirectory(mlir-reduce)
add_subdirectory(mlir-translate)
add_subdirectory(PDLL)

View File

@ -0,0 +1,11 @@
add_mlir_library(MLIRTranslateLib
MlirTranslateMain.cpp
Translation.cpp
ADDITIONAL_HEADER_DIRS
${MLIR_MAIN_INCLUDE_DIR}/mlir/Tools/mlir-translate
LINK_LIBS PUBLIC
MLIRIR
MLIRParser
)

View File

@ -0,0 +1,111 @@
//===- MlirTranslateMain.cpp - MLIR Translation entry point ---------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "mlir/Tools/mlir-translate/MlirTranslateMain.h"
#include "mlir/IR/AsmState.h"
#include "mlir/IR/BuiltinOps.h"
#include "mlir/IR/Dialect.h"
#include "mlir/IR/Verifier.h"
#include "mlir/Parser/Parser.h"
#include "mlir/Support/FileUtilities.h"
#include "mlir/Support/ToolUtilities.h"
#include "mlir/Tools/mlir-translate/Translation.h"
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/ToolOutputFile.h"
using namespace mlir;
//===----------------------------------------------------------------------===//
// Translation Parser
//===----------------------------------------------------------------------===//
LogicalResult mlir::mlirTranslateMain(int argc, char **argv,
llvm::StringRef toolName) {
static llvm::cl::opt<std::string> inputFilename(
llvm::cl::Positional, llvm::cl::desc("<input file>"),
llvm::cl::init("-"));
static llvm::cl::opt<std::string> outputFilename(
"o", llvm::cl::desc("Output filename"), llvm::cl::value_desc("filename"),
llvm::cl::init("-"));
static llvm::cl::opt<bool> allowUnregisteredDialects(
"allow-unregistered-dialect",
llvm::cl::desc("Allow operation with no registered dialects"),
llvm::cl::init(false));
static llvm::cl::opt<bool> splitInputFile(
"split-input-file",
llvm::cl::desc("Split the input file into pieces and "
"process each chunk independently"),
llvm::cl::init(false));
static llvm::cl::opt<bool> verifyDiagnostics(
"verify-diagnostics",
llvm::cl::desc("Check that emitted diagnostics match "
"expected-* lines on the corresponding line"),
llvm::cl::init(false));
llvm::InitLLVM y(argc, argv);
// Add flags for all the registered translations.
llvm::cl::opt<const TranslateFunction *, false, TranslationParser>
translationRequested("", llvm::cl::desc("Translation to perform"),
llvm::cl::Required);
registerAsmPrinterCLOptions();
registerMLIRContextCLOptions();
llvm::cl::ParseCommandLineOptions(argc, argv, toolName);
std::string errorMessage;
auto input = openInputFile(inputFilename, &errorMessage);
if (!input) {
llvm::errs() << errorMessage << "\n";
return failure();
}
auto output = openOutputFile(outputFilename, &errorMessage);
if (!output) {
llvm::errs() << errorMessage << "\n";
return failure();
}
// Processes the memory buffer with a new MLIRContext.
auto processBuffer = [&](std::unique_ptr<llvm::MemoryBuffer> ownedBuffer,
raw_ostream &os) {
MLIRContext context;
context.allowUnregisteredDialects(allowUnregisteredDialects);
context.printOpOnDiagnostic(!verifyDiagnostics);
llvm::SourceMgr sourceMgr;
sourceMgr.AddNewSourceBuffer(std::move(ownedBuffer), SMLoc());
if (!verifyDiagnostics) {
SourceMgrDiagnosticHandler sourceMgrHandler(sourceMgr, &context);
return (*translationRequested)(sourceMgr, os, &context);
}
// In the diagnostic verification flow, we ignore whether the translation
// failed (in most cases, it is expected to fail). Instead, we check if the
// diagnostics were produced as expected.
SourceMgrDiagnosticVerifierHandler sourceMgrHandler(sourceMgr, &context);
(void)(*translationRequested)(sourceMgr, os, &context);
return sourceMgrHandler.verify();
};
if (splitInputFile) {
if (failed(splitAndProcessBuffer(std::move(input), processBuffer,
output->os())))
return failure();
} else if (failed(processBuffer(std::move(input), output->os()))) {
return failure();
}
output->keep();
return success();
}

View File

@ -10,17 +10,13 @@
//
//===----------------------------------------------------------------------===//
#include "mlir/Translation.h"
#include "mlir/Tools/mlir-translate/Translation.h"
#include "mlir/IR/AsmState.h"
#include "mlir/IR/BuiltinOps.h"
#include "mlir/IR/Dialect.h"
#include "mlir/IR/Verifier.h"
#include "mlir/Parser/Parser.h"
#include "mlir/Support/FileUtilities.h"
#include "mlir/Support/ToolUtilities.h"
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/ToolOutputFile.h"
using namespace mlir;
@ -128,88 +124,3 @@ void TranslationParser::printOptionInfo(const llvm::cl::Option &o,
});
llvm::cl::parser<const TranslateFunction *>::printOptionInfo(o, globalWidth);
}
LogicalResult mlir::mlirTranslateMain(int argc, char **argv,
llvm::StringRef toolName) {
static llvm::cl::opt<std::string> inputFilename(
llvm::cl::Positional, llvm::cl::desc("<input file>"),
llvm::cl::init("-"));
static llvm::cl::opt<std::string> outputFilename(
"o", llvm::cl::desc("Output filename"), llvm::cl::value_desc("filename"),
llvm::cl::init("-"));
static llvm::cl::opt<bool> allowUnregisteredDialects(
"allow-unregistered-dialect",
llvm::cl::desc("Allow operation with no registered dialects"),
llvm::cl::init(false));
static llvm::cl::opt<bool> splitInputFile(
"split-input-file",
llvm::cl::desc("Split the input file into pieces and "
"process each chunk independently"),
llvm::cl::init(false));
static llvm::cl::opt<bool> verifyDiagnostics(
"verify-diagnostics",
llvm::cl::desc("Check that emitted diagnostics match "
"expected-* lines on the corresponding line"),
llvm::cl::init(false));
llvm::InitLLVM y(argc, argv);
// Add flags for all the registered translations.
llvm::cl::opt<const TranslateFunction *, false, TranslationParser>
translationRequested("", llvm::cl::desc("Translation to perform"),
llvm::cl::Required);
registerAsmPrinterCLOptions();
registerMLIRContextCLOptions();
llvm::cl::ParseCommandLineOptions(argc, argv, toolName);
std::string errorMessage;
auto input = openInputFile(inputFilename, &errorMessage);
if (!input) {
llvm::errs() << errorMessage << "\n";
return failure();
}
auto output = openOutputFile(outputFilename, &errorMessage);
if (!output) {
llvm::errs() << errorMessage << "\n";
return failure();
}
// Processes the memory buffer with a new MLIRContext.
auto processBuffer = [&](std::unique_ptr<llvm::MemoryBuffer> ownedBuffer,
raw_ostream &os) {
MLIRContext context;
context.allowUnregisteredDialects(allowUnregisteredDialects);
context.printOpOnDiagnostic(!verifyDiagnostics);
llvm::SourceMgr sourceMgr;
sourceMgr.AddNewSourceBuffer(std::move(ownedBuffer), SMLoc());
if (!verifyDiagnostics) {
SourceMgrDiagnosticHandler sourceMgrHandler(sourceMgr, &context);
return (*translationRequested)(sourceMgr, os, &context);
}
// In the diagnostic verification flow, we ignore whether the translation
// failed (in most cases, it is expected to fail). Instead, we check if the
// diagnostics were produced as expected.
SourceMgrDiagnosticVerifierHandler sourceMgrHandler(sourceMgr, &context);
(void)(*translationRequested)(sourceMgr, os, &context);
return sourceMgrHandler.verify();
};
if (splitInputFile) {
if (failed(splitAndProcessBuffer(std::move(input), processBuffer,
output->os())))
return failure();
} else if (failed(processBuffer(std::move(input), output->os()))) {
return failure();
}
output->keep();
return success();
}

View File

@ -1,10 +0,0 @@
add_mlir_library(MLIRTranslation
Translation.cpp
ADDITIONAL_HEADER_DIRS
${MLIR_MAIN_INCLUDE_DIR}/mlir/Translation
LINK_LIBS PUBLIC
MLIRIR
MLIRParser
)

View File

@ -29,7 +29,7 @@ if (MLIR_ENABLE_SPIRV_CPU_RUNNER)
MLIRSPIRV
MLIRTargetLLVMIRExport
MLIRTransforms
MLIRTranslation
MLIRTranslateLib
MLIRSupport
)
endif()

View File

@ -18,7 +18,7 @@ target_link_libraries(mlir-translate
MLIRParser
MLIRPass
MLIRSPIRV
MLIRTranslation
MLIRTranslateLib
MLIRSupport
)

View File

@ -13,7 +13,7 @@
#include "mlir/InitAllTranslations.h"
#include "mlir/Support/LogicalResult.h"
#include "mlir/Translation.h"
#include "mlir/Tools/mlir-translate/MlirTranslateMain.h"
using namespace mlir;

View File

@ -73,7 +73,7 @@ if (MLIR_ENABLE_VULKAN_RUNNER)
MLIRSupport
MLIRTargetLLVMIRExport
MLIRTransforms
MLIRTranslation
MLIRTranslateLib
${Vulkan_LIBRARY}
)