37#include "llvm/ADT/StringRef.h"
38#include "llvm/Remarks/RemarkFormat.h"
39#include "llvm/Support/CommandLine.h"
40#include "llvm/Support/Debug.h"
41#include "llvm/Support/InitLLVM.h"
42#include "llvm/Support/LogicalResult.h"
43#include "llvm/Support/ManagedStatic.h"
44#include "llvm/Support/Process.h"
45#include "llvm/Support/Regex.h"
46#include "llvm/Support/SourceMgr.h"
47#include "llvm/Support/ThreadPool.h"
48#include "llvm/Support/ToolOutputFile.h"
54class BytecodeVersionParser :
public cl::parser<std::optional<int64_t>> {
56 BytecodeVersionParser(cl::Option &o)
57 : cl::parser<std::optional<int64_t>>(o) {}
59 bool parse(cl::Option &o, StringRef , StringRef arg,
60 std::optional<int64_t> &v) {
62 if (getAsSignedInteger(arg, 10, w))
63 return o.error(
"Invalid argument '" + arg +
64 "', only integer is supported.");
73 MlirOptMainConfigCLOptions() {
79 static cl::opt<bool,
true> allowUnregisteredDialects(
80 "allow-unregistered-dialect",
81 cl::desc(
"Allow operation with no registered dialects"),
82 cl::location(allowUnregisteredDialectsFlag), cl::init(
false));
84 static cl::opt<bool,
true> dumpPassPipeline(
85 "dump-pass-pipeline", cl::desc(
"Print the pipeline that will be run"),
86 cl::location(dumpPassPipelineFlag), cl::init(
false));
88 static cl::opt<bool,
true> emitBytecode(
89 "emit-bytecode", cl::desc(
"Emit bytecode when generating output"),
90 cl::location(emitBytecodeFlag), cl::init(
false));
92 static cl::opt<bool,
true> elideResourcesFromBytecode(
93 "elide-resource-data-from-bytecode",
94 cl::desc(
"Elide resources when generating bytecode"),
95 cl::location(elideResourceDataFromBytecodeFlag), cl::init(
false));
97 static cl::opt<std::string,
true> emitBytecodeProducer(
98 "emit-bytecode-producer",
99 cl::desc(
"Use specified producer when generating bytecode output"),
100 cl::location(emitBytecodeProducerFlag), cl::init(
""));
102 static cl::opt<std::optional<int64_t>,
true,
103 BytecodeVersionParser>
105 "emit-bytecode-version",
106 cl::desc(
"Use specified bytecode when generating output"),
107 cl::location(emitBytecodeVersion), cl::init(std::nullopt));
109 static cl::opt<std::string,
true> irdlFile(
111 cl::desc(
"IRDL file to register before processing the input"),
112 cl::location(irdlFileFlag), cl::init(
""), cl::value_desc(
"filename"));
115 diagnosticVerbosityLevel(
116 "mlir-diagnostic-verbosity-level",
117 cl::desc(
"Choose level of diagnostic information"),
118 cl::location(diagnosticVerbosityLevelFlag),
119 cl::init(VerbosityLevel::ErrorsWarningsAndRemarks),
121 clEnumValN(VerbosityLevel::ErrorsOnly,
"errors",
"Errors only"),
122 clEnumValN(VerbosityLevel::ErrorsAndWarnings,
"warnings",
123 "Errors and warnings"),
124 clEnumValN(VerbosityLevel::ErrorsWarningsAndRemarks,
"remarks",
125 "Errors, warnings and remarks")));
127 static cl::opt<bool,
true> disableDiagnosticNotes(
128 "mlir-disable-diagnostic-notes", cl::desc(
"Disable diagnostic notes."),
129 cl::location(disableDiagnosticNotesFlag), cl::init(
false));
131 static cl::opt<bool,
true> explicitModule(
132 "no-implicit-module",
133 cl::desc(
"Disable implicit addition of a top-level module op during "
135 cl::location(useExplicitModuleFlag), cl::init(
false));
137 static cl::opt<bool,
true> listPasses(
138 "list-passes", cl::desc(
"Print the list of registered passes and exit"),
139 cl::location(listPassesFlag), cl::init(
false));
141 static cl::opt<bool,
true> runReproducer(
142 "run-reproducer", cl::desc(
"Run the pipeline stored in the reproducer"),
143 cl::location(runReproducerFlag), cl::init(
false));
145 static cl::opt<bool,
true> showDialects(
147 cl::desc(
"Print the list of registered dialects and exit"),
148 cl::location(showDialectsFlag), cl::init(
false));
150 static cl::opt<std::string,
true> splitInputFile{
152 llvm::cl::ValueOptional,
153 cl::callback([&](
const std::string &str) {
158 cl::desc(
"Split the input file into chunks using the given or "
159 "default marker and process each chunk independently"),
160 cl::location(splitInputFileFlag),
163 static cl::opt<std::string,
true> outputSplitMarker(
164 "output-split-marker",
165 cl::desc(
"Split marker to use for merging the ouput"),
171 "verify-diagnostics", llvm::cl::ValueOptional,
172 cl::desc(
"Check that emitted diagnostics match expected-* lines on "
173 "the corresponding line"),
174 cl::location(verifyDiagnosticsFlag),
176 clEnumValN(SourceMgrDiagnosticVerifierHandler::Level::All,
178 "Check all diagnostics (expected, unexpected, "
182 clEnumValN(SourceMgrDiagnosticVerifierHandler::Level::All,
"",
183 "Check all diagnostics (expected, unexpected, "
186 SourceMgrDiagnosticVerifierHandler::Level::OnlyExpected,
187 "only-expected",
"Check only expected diagnostics"))};
189 static cl::opt<bool,
true> verifyPasses(
191 cl::desc(
"Run the verifier after each transformation pass"),
192 cl::location(verifyPassesFlag), cl::init(
true));
194 static cl::opt<bool,
true> disableVerifyOnParsing(
195 "mlir-very-unsafe-disable-verifier-on-parsing",
196 cl::desc(
"Disable the verifier on parsing (very unsafe)"),
197 cl::location(disableVerifierOnParsingFlag), cl::init(
false));
199 static cl::opt<bool,
true> verifyRoundtrip(
201 cl::desc(
"Round-trip the IR after parsing and ensure it succeeds"),
202 cl::location(verifyRoundtripFlag), cl::init(
false));
204 static cl::list<std::string> passPlugins(
205 "load-pass-plugin", cl::desc(
"Load passes from plugin library"));
207 static cl::opt<std::string,
true>
208 generateReproducerFile(
209 "mlir-generate-reproducer",
211 "Generate an mlir reproducer at the provided filename"
212 " (no crash required)"),
213 cl::location(generateReproducerFileFlag), cl::init(
""),
214 cl::value_desc(
"filename"));
216 static cl::OptionCategory remarkCategory(
218 "Filter remarks by regular expression (llvm::Regex syntax).");
222 llvm::cl::desc(
"Specify the format for remark output."),
223 cl::location(remarkFormatFlag),
224 llvm::cl::value_desc(
"format"),
225 llvm::cl::init(RemarkFormat::REMARK_FORMAT_STDOUT),
226 llvm::cl::values(clEnumValN(RemarkFormat::REMARK_FORMAT_STDOUT,
228 "Print as emitRemark to command-line"),
229 clEnumValN(RemarkFormat::REMARK_FORMAT_YAML,
"yaml",
231 clEnumValN(RemarkFormat::REMARK_FORMAT_BITSTREAM,
232 "bitstream",
"Print bitstream file")),
233 llvm::cl::cat(remarkCategory)};
237 llvm::cl::desc(
"Specify the policy for remark output."),
238 cl::location(remarkPolicyFlag),
239 llvm::cl::value_desc(
"format"),
240 llvm::cl::init(RemarkPolicy::REMARK_POLICY_ALL),
241 llvm::cl::values(clEnumValN(RemarkPolicy::REMARK_POLICY_ALL,
"all",
242 "Print all remarks"),
243 clEnumValN(RemarkPolicy::REMARK_POLICY_FINAL,
"final",
244 "Print final remarks")),
245 llvm::cl::cat(remarkCategory)};
247 static cl::opt<std::string,
true> remarksAll(
249 cl::desc(
"Show all remarks: passed, missed, failed, analysis"),
250 cl::location(remarksAllFilterFlag), cl::init(
""),
251 cl::cat(remarkCategory));
253 static cl::opt<std::string,
true> remarksFile(
254 "remarks-output-file",
256 "Output file for yaml and bitstream remark formats. Default is "
257 "mlir-remarks.yaml or mlir-remarks.bitstream"),
258 cl::location(remarksOutputFileFlag), cl::init(
""),
259 cl::cat(remarkCategory));
261 static cl::opt<std::string,
true> remarksPassed(
262 "remarks-filter-passed", cl::desc(
"Show passed remarks"),
263 cl::location(remarksPassedFilterFlag), cl::init(
""),
264 cl::cat(remarkCategory));
266 static cl::opt<std::string,
true> remarksFailed(
267 "remarks-filter-failed", cl::desc(
"Show failed remarks"),
268 cl::location(remarksFailedFilterFlag), cl::init(
""),
269 cl::cat(remarkCategory));
271 static cl::opt<std::string,
true> remarksMissed(
272 "remarks-filter-missed", cl::desc(
"Show missed remarks"),
273 cl::location(remarksMissedFilterFlag), cl::init(
""),
274 cl::cat(remarkCategory));
276 static cl::opt<std::string,
true> remarksAnalyse(
277 "remarks-filter-analyse", cl::desc(
"Show analysis remarks"),
278 cl::location(remarksAnalyseFilterFlag), cl::init(
""),
279 cl::cat(remarkCategory));
282 passPlugins.setCallback([&](
const std::string &pluginPath) {
285 errs() <<
"Failed to load passes from '" << pluginPath
286 <<
"'. Request ignored.\n";
289 plugin.get().registerPassRegistryCallbacks();
292 static cl::list<std::string> dialectPlugins(
293 "load-dialect-plugin", cl::desc(
"Load dialects from plugin library"));
294 this->dialectPlugins = std::addressof(dialectPlugins);
296 static PassPipelineCLParser passPipeline(
"",
"Compiler passes to run",
"p");
297 setPassPipelineParser(passPipeline);
301 void setDialectPluginsCallback(DialectRegistry ®istry);
305 cl::list<std::string> *dialectPlugins =
nullptr;
313 bool showNotes =
true)
314 : ScopedDiagnosticHandler(ctx) {
315 setHandler([verbosityLevel, showNotes](Diagnostic &
diag) {
316 auto severity =
diag.getSeverity();
324 if (verbosityLevel == VerbosityLevel::ErrorsOnly)
329 if (verbosityLevel == VerbosityLevel::ErrorsOnly ||
330 verbosityLevel == VerbosityLevel::ErrorsAndWarnings)
340 llvm_unreachable(
"Unknown diagnostic severity");
361 auto errorHandler = [&](
const Twine &msg) {
362 emitError(UnknownLoc::get(pm.getContext())) << msg;
370 llvm::errs() <<
"\n";
377void MlirOptMainConfigCLOptions::setDialectPluginsCallback(
379 dialectPlugins->setCallback([&](
const std::string &pluginPath) {
382 errs() <<
"Failed to load dialect plugin from '" << pluginPath
383 <<
"'. Request ignored.\n";
386 plugin.get().registerDialectRegistryCallbacks(registry);
392 registry.
insert<irdl::IRDLDialect>();
396 std::string errorMessage;
397 std::unique_ptr<MemoryBuffer> file =
openInputFile(irdlFile, &errorMessage);
399 emitError(UnknownLoc::get(&ctx)) << errorMessage;
406 sourceMgr.AddNewSourceBuffer(std::move(file), SMLoc());
432 if (!irdlFile.empty() && failed(
loadIRDLDialects(irdlFile, roundtripContext)))
435 std::string testType = (useBytecode) ?
"bytecode" :
"textual";
440 llvm::raw_string_ostream ostream(buffer);
444 <<
"failed to write bytecode, cannot verify round-trip.\n";
453 &fallbackResourceMap);
455 if (!roundtripModule) {
456 op->
emitOpError() <<
"failed to parse " << testType
457 <<
" content back, cannot verify round-trip.\n";
464 std::string reference, roundtrip;
466 llvm::raw_string_ostream ostreamref(reference);
467 op->
print(ostreamref,
469 llvm::raw_string_ostream ostreamrndtrip(roundtrip);
470 roundtripModule.
get()->print(
474 if (reference != roundtrip) {
478 <<
" roundTrip testing roundtripped module differs "
479 "from reference:\n<<<<<<Reference\n"
480 << reference <<
"\n=====\n"
481 << roundtrip <<
"\n>>>>>roundtripped\n";
491 return success(succeeded(txtStatus) && succeeded(bcStatus));
502 const std::shared_ptr<llvm::SourceMgr> &sourceMgr,
520 &fallbackResourceMap);
546 auto createPolicy = [&config]()
547 -> std::unique_ptr<mlir::remark::detail::RemarkEmittingPolicyBase> {
549 return std::make_unique<mlir::remark::RemarkEmittingPolicyAll>();
551 return std::make_unique<mlir::remark::RemarkEmittingPolicyFinal>();
553 llvm_unreachable(
"Invalid remark policy");
559 ctx,
nullptr, createPolicy(), cats,
true )))
565 ?
"mlir-remarks.yaml"
568 ctx, file, llvm::remarks::Format::YAML, createPolicy(), cats)))
575 ?
"mlir-remarks.bitstream"
578 ctx, file, llvm::remarks::Format::Bitstream, createPolicy(), cats)))
596 if (failed(pm.
run(*op)))
623 <<
"bytecode version while not emitting bytecode";
625 &fallbackResourceMap);
631 engine->getRemarkEmittingPolicy()->finalize();
640 llvm::MemoryBufferRef sourceBuffer,
643 llvm::ThreadPoolInterface *threadPool) {
645 auto sourceMgr = std::make_shared<SourceMgr>();
648 sourceMgr->AddNewSourceBuffer(
649 llvm::MemoryBuffer::getMemBuffer(sourceBuffer,
652 sourceMgr->AddNewSourceBuffer(std::move(ownedBuffer), SMLoc());
678 DiagnosticFilter diagnosticFilter(&context,
702 std::string helpHeader = (toolName +
"\nAvailable Dialects: ").str();
704 llvm::raw_string_ostream os(helpHeader);
706 [&](
auto name) { os << name; });
711std::pair<std::string, std::string>
713 static cl::opt<std::string> inputFilename(
714 cl::Positional, cl::desc(
"<input file>"), cl::init(
"-"));
716 static cl::opt<std::string> outputFilename(
"o", cl::desc(
"Output filename"),
717 cl::value_desc(
"filename"),
719 cl::ParseCommandLineOptions(argc, argv, helpHeader);
720 return std::make_pair(inputFilename.getValue(), outputFilename.getValue());
723std::pair<std::string, std::string>
725 llvm::StringRef toolName,
732 llvm::outs() <<
"Available Dialects: ";
734 llvm::outs() <<
"\n";
744 std::unique_ptr<llvm::MemoryBuffer> buffer,
757 ThreadPoolInterface *threadPool =
nullptr;
768 sourceMgr.AddNewSourceBuffer(
769 llvm::MemoryBuffer::getMemBuffer(buffer->getMemBufferRef(),
777 auto chunkFn = [&](std::unique_ptr<MemoryBuffer> chunkBuffer,
778 llvm::MemoryBufferRef sourceBuffer,
raw_ostream &os) {
780 os, std::move(chunkBuffer), sourceBuffer, config, registry,
785 llvm::MemoryBuffer::getMemBuffer(buffer->getMemBufferRef(),
795 llvm::StringRef inputFilename,
796 llvm::StringRef outputFilename,
799 InitLLVM y(argc, argv);
812 if (inputFilename ==
"-" &&
813 sys::Process::FileDescriptorIsDisplayed(fileno(stdin)))
814 llvm::errs() <<
"(processing input from stdin now, hit ctrl-c/ctrl-d to "
818 std::string errorMessage;
821 llvm::errs() << errorMessage <<
"\n";
827 llvm::errs() << errorMessage <<
"\n";
830 if (failed(
MlirOptMain(output->os(), std::move(file), registry, config)))
842 std::string inputFilename, outputFilename;
843 std::tie(inputFilename, outputFilename) =
846 return MlirOptMain(argc, argv, inputFilename, outputFilename, registry);
static ManagedStatic< DebugConfigCLOptions > clOptionsConfig
static LogicalResult printRegisteredDialects(DialectRegistry ®istry)
LogicalResult loadIRDLDialects(StringRef irdlFile, MLIRContext &ctx)
static LogicalResult doVerifyRoundTrip(Operation *op, const MlirOptMainConfig &config, bool useBytecode)
static LogicalResult processBuffer(raw_ostream &os, std::unique_ptr< MemoryBuffer > ownedBuffer, llvm::MemoryBufferRef sourceBuffer, const MlirOptMainConfig &config, DialectRegistry ®istry, SourceMgrDiagnosticVerifierHandler *verifyHandler, llvm::ThreadPoolInterface *threadPool)
Parses the memory buffer.
static LogicalResult printRegisteredPassesAndReturn()
static LogicalResult performActions(raw_ostream &os, const std::shared_ptr< llvm::SourceMgr > &sourceMgr, MLIRContext *context, const MlirOptMainConfig &config)
Perform the actions on the input file indicated by the command line flags within the specified contex...
static std::string diag(const llvm::Value &value)
This class provides management for the lifetime of the state used when printing the IR.
This class contains the configuration used for the bytecode writer.
void setElideResourceDataFlag(bool shouldElideResourceData=true)
Set a boolean flag to skip emission of resources into the bytecode file.
void setDesiredBytecodeVersion(int64_t bytecodeVersion)
Set the desired bytecode version to emit.
Facilities for time measurement and report printing to an output stream.
static llvm::Expected< DialectPlugin > load(const std::string &filename)
Attempts to load a dialect plugin from a given file.
The DialectRegistry maps a dialect namespace to a constructor for the matching dialect.
auto getDialectNames() const
Return the names of dialects known to this registry.
A fallback map containing external resources not explicitly handled by another parser/printer.
MLIRContext is the top-level object for a collection of MLIR operations.
void appendDialectRegistry(const DialectRegistry ®istry)
Append the contents of the given dialect registry to the registry associated with this context.
void disableMultithreading(bool disable=true)
Set the flag specifying if multi-threading is disabled by the context.
void setThreadPool(llvm::ThreadPoolInterface &pool)
Set a new thread pool to be used in this context.
void enableMultithreading(bool enable=true)
remark::detail::RemarkEngine * getRemarkEngine()
Returns the remark engine for this context, or nullptr if none has been set.
void printOpOnDiagnostic(bool enable)
Set the flag specifying if we should attach the operation to diagnostics emitted via Operation::emit.
const DialectRegistry & getDialectRegistry()
Return the dialect registry associated with this context.
llvm::ThreadPoolInterface & getThreadPool()
Return the thread pool used by this context.
bool isMultithreadingEnabled()
Return true if multi-threading is enabled by the context.
void allowUnregisteredDialects(bool allow=true)
Enables creating operations in unregistered dialects.
bool allowsUnregisteredDialects()
Return true if we allow to create operation for unregistered dialects.
Configuration options for the mlir-opt tool.
std::string getRemarksAnalyseFilter() const
Set the remark analyse filters.
std::string getRemarksMissedFilter() const
Set the remark missed filters.
static MlirOptMainConfig createFromCLOptions()
Create a new config with the default set from the CL options.
bool shouldVerifyPasses() const
StringRef inputSplitMarker() const
MlirOptMainConfig & outputSplitMarker(std::string splitMarker=kDefaultSplitMarker)
Set whether to merge the output chunks into one file using the given marker.
bool shouldVerifyRoundtrip() const
SourceMgrDiagnosticVerifierHandler::Level verifyDiagnosticsLevel() const
bool shouldShowNotes() const
StringRef getReproducerFilename() const
Reproducer file generation (no crash required).
std::string getRemarksOutputFile() const
Set the remark output file.
bool shouldShowDialects() const
std::string getRemarksFailedFilter() const
Set the remark failed filters.
std::function< LogicalResult(PassManager &)> passPipelineCallback
The callback to populate the pass manager.
bool shouldVerifyOnParsing() const
std::string getRemarksAllFilter() const
Set the remark format to use.
RemarkPolicy getRemarkPolicy() const
Set the remark policy to use.
bool shouldElideResourceDataFromBytecode() const
bool shouldEmitBytecode() const
RemarkFormat getRemarkFormat() const
Set the reproducer output filename.
std::optional< StringRef > bytecodeProducerToEmit() const
LogicalResult setupPassPipeline(PassManager &pm) const
Populate the passmanager, if any callback was set.
static void registerCLOptions(DialectRegistry &dialectRegistry)
Register the options as global LLVM command line options.
bool shouldAllowUnregisteredDialects() const
bool shouldUseExplicitModule() const
VerbosityLevel getDiagnosticVerbosityLevel() const
bool shouldRunReproducer() const
Return true if the reproducer should be run.
std::optional< int64_t > bytecodeVersionToEmit() const
bool shouldDumpPassPipeline() const
bool shouldVerifyDiagnostics() const
tracing::DebugConfig & getDebugConfig()
std::string getRemarksPassedFilter() const
Set the remark passed filters.
bool shouldListPasses() const
StringRef getIrdlFile() const
MlirOptMainConfig & setPassPipelineParser(const PassPipelineCLParser &parser)
Set the parser to use to populate the pass manager.
@ Implicit
Implicit nesting behavior.
StringRef getOpAnchorName() const
Return the name used to anchor this pass manager.
iterator_range< pass_iterator > getPasses()
Set of flags used to control the behavior of the various IR print methods (e.g.
A wrapper class that allows for printing an operation with a custom AsmState, useful to act as a "str...
Operation is the basic unit of execution within MLIR.
void print(raw_ostream &os, const OpPrintingFlags &flags={})
MLIRContext * getContext()
Return the context this operation is associated with.
InFlightDiagnostic emitOpError(const Twine &message={})
Emit an error with the op name prefixed, like "'dim' op " which is convenient for verifiers.
This class acts as an owning reference to an op, and will automatically destroy the held op on destru...
OpTy get() const
Allow accessing the internal op.
This class represents a configuration for the MLIR assembly parser.
The main pass manager and pipeline builder.
MLIRContext * getContext() const
Return an instance of the context.
LogicalResult run(Operation *op)
Run the passes within this manager on the provided operation.
void enableVerifier(bool enabled=true)
Runs the verifier after each individual pass.
void enableTiming(TimingScope &timingScope)
Add an instrumentation to time the execution of passes and the computation of analyses.
This class implements a command-line parser for MLIR passes.
LogicalResult addToPipeline(OpPassManager &pm, function_ref< LogicalResult(const Twine &)> errorHandler) const
Adds the passes defined by this parser entry to the given pass manager.
static llvm::Expected< PassPlugin > load(const std::string &filename)
Attempts to load a pass plugin from a given file.
This diagnostic handler is a simple RAII class that registers and erases a diagnostic handler on a gi...
This class is a utility diagnostic handler for use with llvm::SourceMgr.
This class is a utility diagnostic handler for use with llvm::SourceMgr that verifies that emitted di...
void registerInContext(MLIRContext *ctx)
Register this handler with the given context.
LogicalResult verify()
Returns the status of the handler and verifies that all expected diagnostics were emitted.
TimingScope getRootScope()
Get the root timer of this timing manager wrapped in a TimingScope for convenience.
An RAII-style wrapper around a timer that ensures the timer is properly started and stopped.
TimingScope nest(Args... args)
Create a nested timing scope.
void stop()
Manually stop the timer early.
static DebugConfig createFromCLOptions()
Create a new config with the default set from the CL options.
static void registerCLOptions()
Register the options as global LLVM command line options.
static void registerCLOptions()
Register the command line options for debug counters.
This is a RAII class that installs the debug handlers on the context based on the provided configurat...
The OpAsmOpInterface, see OpAsmInterface.td for more details.
llvm::LogicalResult loadDialects(ModuleOp op)
Load all the dialects defined in the module.
QueryRef parse(llvm::StringRef line, const QuerySession &qs)
Include the generated interface declarations.
std::pair< std::string, std::string > parseCLIOptions(int argc, char **argv, llvm::StringRef helpHeader)
Parse command line options.
LogicalResult applyPassManagerCLOptions(PassManager &pm)
Apply any values provided to the pass manager options that were registered with 'registerPassManagerO...
const char *const kDefaultSplitMarker
void registerDefaultTimingManagerCLOptions()
Register a set of useful command-line options that can be used to configure a DefaultTimingManager.
std::unique_ptr< llvm::ToolOutputFile > openOutputFile(llvm::StringRef outputFilename, std::string *errorMessage=nullptr)
Open the file specified by its name for writing.
std::string registerCLIOptions(llvm::StringRef toolName, DialectRegistry ®istry)
Register basic command line options.
void printRegisteredPasses()
Prints the passes that were previously registered and stored in passRegistry.
LogicalResult MlirOptMain(llvm::raw_ostream &outputStream, std::unique_ptr< llvm::MemoryBuffer > buffer, DialectRegistry ®istry, const MlirOptMainConfig &config)
Perform the core processing behind mlir-opt.
std::string makeReproducer(StringRef anchorName, const llvm::iterator_range< OpPassManager::pass_iterator > &passes, Operation *op, StringRef outputFile, bool disableThreads=false, bool verifyPasses=false)
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
void registerMLIRContextCLOptions()
Register a set of useful command-line options that can be used to configure various flags within the ...
std::unique_ptr< llvm::MemoryBuffer > openInputFile(llvm::StringRef inputFilename, std::string *errorMessage=nullptr)
Open the file specified by its name for reading.
LogicalResult splitAndProcessBuffer(std::unique_ptr< llvm::MemoryBuffer > originalBuffer, ChunkBufferHandler processChunkBuffer, raw_ostream &os, llvm::StringRef inputSplitMarker=kDefaultSplitMarker, llvm::StringRef outputSplitMarker="")
Splits the specified buffer on a marker (// ----- by default), processes each chunk independently acc...
LogicalResult parseSourceString(llvm::StringRef sourceStr, Block *block, const ParserConfig &config, StringRef sourceName="", LocationAttr *sourceFileLoc=nullptr)
This parses the IR string and appends parsed operations to the given block.
void registerAsmPrinterCLOptions()
Register a set of useful command-line options that can be used to configure various flags within the ...
void registerPassManagerCLOptions()
Register a set of useful command-line options that can be used to configure a pass manager.
LogicalResult parseSourceFile(const llvm::SourceMgr &sourceMgr, Block *block, const ParserConfig &config, LocationAttr *sourceFileLoc=nullptr)
This parses the file specified by the indicated SourceMgr and appends parsed operations to the given ...
void applyDefaultTimingManagerCLOptions(DefaultTimingManager &tm)
Apply any values that were registered with 'registerDefaultTimingManagerOptions' to a DefaultTimingMa...
OwningOpRef< Operation * > parseSourceFileForTool(const std::shared_ptr< llvm::SourceMgr > &sourceMgr, const ParserConfig &config, bool insertImplicitModule)
This parses the file specified by the indicated SourceMgr.
@ REMARK_FORMAT_BITSTREAM
std::pair< std::string, std::string > registerAndParseCLIOptions(int argc, char **argv, llvm::StringRef toolName, DialectRegistry ®istry)
Register and parse command line options.
VerbosityLevel
enum class to indicate the verbosity level of the diagnostic filter.
LogicalResult writeBytecodeToFile(Operation *op, raw_ostream &os, const BytecodeWriterConfig &config={})
Write the bytecode for the given operation to the provided output stream.
void attachResourceParser(ParserConfig &config)
Attach an assembly resource parser to 'config' that collects the MLIR reproducer configuration into t...
LogicalResult apply(PassManager &pm) const
Apply the reproducer options to 'pm' and its context.