-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[MLIR][mlir-opt] Add registerationAndParseCLIOptions
for MlirOptMain
.
#70581
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[MLIR][mlir-opt] Add registerationAndParseCLIOptions
for MlirOptMain
.
#70581
Conversation
@llvm/pr-subscribers-mlir-core @llvm/pr-subscribers-mlir Author: weiwei chen (weiweichen) ChangesSeprate registeration and CLI parsing from Full diff: https://github.com/llvm/llvm-project/pull/70581.diff 2 Files Affected:
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);
+}
|
/// - 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, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
spelling: registerAndParseCLIOptions
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, could you comment what it returns? It's not clear by looking at the header.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
spelling:
registerAndParseCLIOptions
?
Yes!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, could you comment what it returns? It's not clear by looking at the header.
Sure, updated.
@@ -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() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
whitespace changes? Did the file need reformatting?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
whitespace changes? Did the file need reformatting?
Weird, I think my clang-format is acting out somehow here. Wait, the reformatting looks like needed since the original code has 88 characters in the line where llvm coding style says it should be "within 80 columns" 🤔.
@@ -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. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What does "Register all dialects" refer to here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What does "Register all dialects" refer to here?
Oops, wrong comment, should be Register and parse command line options
here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(not fixed yet)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yep, should be fixed now 🙏
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.
632dc8b
to
07cb28f
Compare
Seprate registeration and CLI parsing from
MlirOptMain
tomlir::registrationAndParseCLIOptions
and a newMlirOptMain
so that external tools to drive mlir-opt can call these two new APIs to get CLI option values before running MlirOptMain.