[Mlir-commits] [mlir] [MLIR][mlir-opt] Add `registerationAndParseCLIOptions` for `MlirOptMain`. (PR #70581)
weiwei chen
llvmlistbot at llvm.org
Sun Oct 29 19:29:04 PDT 2023
https://github.com/weiweichen updated https://github.com/llvm/llvm-project/pull/70581
>From d05ced5c9bdb4df4246e36f154f07df0992cba22 Mon Sep 17 00:00:00 2001
From: Weiwei Chen <weiwei.chen at modular.com>
Date: Sat, 28 Oct 2023 23:52:54 -0400
Subject: [PATCH 1/3] Add registerationAndParseCLIOptions for MlirOptMain.
Seprate registeration and CLI parsing from `MlirOptMain` to
`mlir::registrationAndParseCLIOptions` and a new `MlirOptMain`
so that external tools to drive mlir-opt can call these two new APIs to
get CLI option values before running MlirOptMain.
---
.../include/mlir/Tools/mlir-opt/MlirOptMain.h | 17 ++++
mlir/lib/Tools/mlir-opt/MlirOptMain.cpp | 77 ++++++++++++-------
2 files changed, 67 insertions(+), 27 deletions(-)
diff --git a/mlir/include/mlir/Tools/mlir-opt/MlirOptMain.h b/mlir/include/mlir/Tools/mlir-opt/MlirOptMain.h
index 222a51e8db77eac..61c90ab978cf7ab 100644
--- a/mlir/include/mlir/Tools/mlir-opt/MlirOptMain.h
+++ b/mlir/include/mlir/Tools/mlir-opt/MlirOptMain.h
@@ -229,6 +229,13 @@ class MlirOptMainConfig {
/// the loaded IR.
using PassPipelineFn = llvm::function_ref<LogicalResult(PassManager &pm)>;
+/// Register all dialects and parse command line options.
+/// - toolName is used for the header displayed by `--help`.
+/// - registry should contain all the dialects that can be parsed in the source.
+std::pair<std::string, std::string>
+registrationAndParseCLIOptions(int argc, char **argv, llvm::StringRef toolName,
+ DialectRegistry ®istry);
+
/// Perform the core processing behind `mlir-opt`.
/// - outputStream is the stream where the resulting IR is printed.
/// - buffer is the in-memory file to parser and process.
@@ -245,6 +252,16 @@ LogicalResult MlirOptMain(llvm::raw_ostream &outputStream,
LogicalResult MlirOptMain(int argc, char **argv, llvm::StringRef toolName,
DialectRegistry ®istry);
+/// Implementation for tools like `mlir-opt`.
+/// This function can be used with registrationAndParseCLIOptions so that
+/// CLI options can be accessed before running MlirOptMain.
+/// - inputFilename is the name of the input mlir file.
+/// - outputFilename is the name of the output file.
+/// - registry should contain all the dialects that can be parsed in the source.
+LogicalResult MlirOptMain(int argc, char **argv, llvm::StringRef inputFilename,
+ llvm::StringRef outputFilename,
+ DialectRegistry ®istry);
+
/// Helper wrapper to return the result of MlirOptMain directly from main.
///
/// Example:
diff --git a/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp b/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp
index 644113058bdc1cc..be466a4316612f2 100644
--- a/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp
+++ b/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp
@@ -268,7 +268,8 @@ static LogicalResult doVerifyRoundTrip(Operation *op,
llvm::raw_string_ostream ostream(buffer);
if (useBytecode) {
if (failed(writeBytecodeToFile(op, ostream))) {
- op->emitOpError() << "failed to write bytecode, cannot verify round-trip.\n";
+ op->emitOpError()
+ << "failed to write bytecode, cannot verify round-trip.\n";
return failure();
}
} else {
@@ -281,7 +282,8 @@ static LogicalResult doVerifyRoundTrip(Operation *op,
roundtripModule =
parseSourceString<Operation *>(ostream.str(), parseConfig);
if (!roundtripModule) {
- op->emitOpError() << "failed to parse bytecode back, cannot verify round-trip.\n";
+ op->emitOpError()
+ << "failed to parse bytecode back, cannot verify round-trip.\n";
return failure();
}
}
@@ -300,7 +302,8 @@ static LogicalResult doVerifyRoundTrip(Operation *op,
}
if (reference != roundtrip) {
// TODO implement a diff.
- return op->emitOpError() << "roundTrip testing roundtripped module differs from reference:\n<<<<<<Reference\n"
+ return op->emitOpError() << "roundTrip testing roundtripped module differs "
+ "from reference:\n<<<<<<Reference\n"
<< reference << "\n=====\n"
<< roundtrip << "\n>>>>>roundtripped\n";
}
@@ -443,6 +446,36 @@ static LogicalResult processBuffer(raw_ostream &os,
return sourceMgrHandler.verify();
}
+std::pair<std::string, std::string>
+mlir::registrationAndParseCLIOptions(int argc, char **argv,
+ llvm::StringRef toolName,
+ DialectRegistry ®istry) {
+ static cl::opt<std::string> inputFilename(
+ cl::Positional, cl::desc("<input file>"), cl::init("-"));
+
+ static cl::opt<std::string> outputFilename("o", cl::desc("Output filename"),
+ cl::value_desc("filename"),
+ cl::init("-"));
+ // Register any command line options.
+ MlirOptMainConfig::registerCLOptions(registry);
+ registerAsmPrinterCLOptions();
+ registerMLIRContextCLOptions();
+ registerPassManagerCLOptions();
+ registerDefaultTimingManagerCLOptions();
+ tracing::DebugCounter::registerCLOptions();
+
+ // Build the list of dialects as a header for the --help message.
+ std::string helpHeader = (toolName + "\nAvailable Dialects: ").str();
+ {
+ llvm::raw_string_ostream os(helpHeader);
+ interleaveComma(registry.getDialectNames(), os,
+ [&](auto name) { os << name; });
+ }
+ // Parse pass names in main to ensure static initialization completed.
+ cl::ParseCommandLineOptions(argc, argv, helpHeader);
+ return std::make_pair(inputFilename.getValue(), outputFilename.getValue());
+}
+
LogicalResult mlir::MlirOptMain(llvm::raw_ostream &outputStream,
std::unique_ptr<llvm::MemoryBuffer> buffer,
DialectRegistry ®istry,
@@ -477,34 +510,13 @@ LogicalResult mlir::MlirOptMain(llvm::raw_ostream &outputStream,
/*insertMarkerInOutput=*/true);
}
-LogicalResult mlir::MlirOptMain(int argc, char **argv, llvm::StringRef toolName,
+LogicalResult mlir::MlirOptMain(int argc, char **argv,
+ llvm::StringRef inputFilename,
+ llvm::StringRef outputFilename,
DialectRegistry ®istry) {
- static cl::opt<std::string> inputFilename(
- cl::Positional, cl::desc("<input file>"), cl::init("-"));
-
- static cl::opt<std::string> outputFilename("o", cl::desc("Output filename"),
- cl::value_desc("filename"),
- cl::init("-"));
InitLLVM y(argc, argv);
- // Register any command line options.
- MlirOptMainConfig::registerCLOptions(registry);
- registerAsmPrinterCLOptions();
- registerMLIRContextCLOptions();
- registerPassManagerCLOptions();
- registerDefaultTimingManagerCLOptions();
- tracing::DebugCounter::registerCLOptions();
-
- // Build the list of dialects as a header for the --help message.
- std::string helpHeader = (toolName + "\nAvailable Dialects: ").str();
- {
- llvm::raw_string_ostream os(helpHeader);
- interleaveComma(registry.getDialectNames(), os,
- [&](auto name) { os << name; });
- }
- // Parse pass names in main to ensure static initialization completed.
- cl::ParseCommandLineOptions(argc, argv, helpHeader);
MlirOptMainConfig config = MlirOptMainConfig::createFromCLOptions();
// When reading from stdin and the input is a tty, it is often a user mistake
@@ -535,3 +547,14 @@ LogicalResult mlir::MlirOptMain(int argc, char **argv, llvm::StringRef toolName,
output->keep();
return success();
}
+
+LogicalResult mlir::MlirOptMain(int argc, char **argv, llvm::StringRef toolName,
+ DialectRegistry ®istry) {
+
+ // Register dialects and parse command line options.
+ std::string inputFilename, outputFilename;
+ std::tie(inputFilename, outputFilename) =
+ registrationAndParseCLIOptions(argc, argv, toolName, registry);
+
+ return MlirOptMain(argc, argv, inputFilename, outputFilename, registry);
+}
>From 07cb28f2bdb695a4962dca9b5f15d466c6d59e2d Mon Sep 17 00:00:00 2001
From: Weiwei Chen <weiwei.chen at modular.com>
Date: Sun, 29 Oct 2023 22:21:32 -0400
Subject: [PATCH 2/3] Address review comments.
---
mlir/include/mlir/Tools/mlir-opt/MlirOptMain.h | 6 ++++--
mlir/lib/Tools/mlir-opt/MlirOptMain.cpp | 8 ++++----
2 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/mlir/include/mlir/Tools/mlir-opt/MlirOptMain.h b/mlir/include/mlir/Tools/mlir-opt/MlirOptMain.h
index 61c90ab978cf7ab..9305b93a5d35462 100644
--- a/mlir/include/mlir/Tools/mlir-opt/MlirOptMain.h
+++ b/mlir/include/mlir/Tools/mlir-opt/MlirOptMain.h
@@ -232,9 +232,11 @@ using PassPipelineFn = llvm::function_ref<LogicalResult(PassManager &pm)>;
/// Register all dialects and parse command line options.
/// - toolName is used for the header displayed by `--help`.
/// - registry should contain all the dialects that can be parsed in the source.
+/// - return std::pair<std::string, std::string> for
+/// inputFilename and outputFilename command line option values.
std::pair<std::string, std::string>
-registrationAndParseCLIOptions(int argc, char **argv, llvm::StringRef toolName,
- DialectRegistry ®istry);
+registerAndParseCLIOptions(int argc, char **argv, llvm::StringRef toolName,
+ DialectRegistry ®istry);
/// Perform the core processing behind `mlir-opt`.
/// - outputStream is the stream where the resulting IR is printed.
diff --git a/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp b/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp
index be466a4316612f2..1ae0172c163aed7 100644
--- a/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp
+++ b/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp
@@ -447,9 +447,9 @@ static LogicalResult processBuffer(raw_ostream &os,
}
std::pair<std::string, std::string>
-mlir::registrationAndParseCLIOptions(int argc, char **argv,
- llvm::StringRef toolName,
- DialectRegistry ®istry) {
+mlir::registerAndParseCLIOptions(int argc, char **argv,
+ llvm::StringRef toolName,
+ DialectRegistry ®istry) {
static cl::opt<std::string> inputFilename(
cl::Positional, cl::desc("<input file>"), cl::init("-"));
@@ -554,7 +554,7 @@ LogicalResult mlir::MlirOptMain(int argc, char **argv, llvm::StringRef toolName,
// Register dialects and parse command line options.
std::string inputFilename, outputFilename;
std::tie(inputFilename, outputFilename) =
- registrationAndParseCLIOptions(argc, argv, toolName, registry);
+ registerAndParseCLIOptions(argc, argv, toolName, registry);
return MlirOptMain(argc, argv, inputFilename, outputFilename, registry);
}
>From 7ec2e5afc8b8c6b2897b2760f8aa9e05eac89f5e Mon Sep 17 00:00:00 2001
From: Weiwei Chen <weiwei.chen at modular.com>
Date: Sun, 29 Oct 2023 22:28:49 -0400
Subject: [PATCH 3/3] Update comment.
---
mlir/lib/Tools/mlir-opt/MlirOptMain.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp b/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp
index 1ae0172c163aed7..c36afae716b12c5 100644
--- a/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp
+++ b/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp
@@ -551,7 +551,7 @@ LogicalResult mlir::MlirOptMain(int argc, char **argv,
LogicalResult mlir::MlirOptMain(int argc, char **argv, llvm::StringRef toolName,
DialectRegistry ®istry) {
- // Register dialects and parse command line options.
+ // Register and parse command line options.
std::string inputFilename, outputFilename;
std::tie(inputFilename, outputFilename) =
registerAndParseCLIOptions(argc, argv, toolName, registry);
More information about the Mlir-commits
mailing list