13#include "llvm/ADT/ScopeExit.h"
14#include "llvm/ADT/StringRef.h"
15#include "llvm/Support/Format.h"
16#include "llvm/Support/ManagedStatic.h"
17#include "llvm/Support/MemoryBuffer.h"
18#include "llvm/Support/SourceMgr.h"
34static llvm::ManagedStatic<llvm::StringMap<PassPipelineInfo>>
41 function_ref<LogicalResult(
const Twine &)> errorHandler) {
42 std::unique_ptr<Pass> pass = allocator();
43 LogicalResult
result = pass->initializeOptions(
options, errorHandler);
45 std::optional<StringRef> pmOpName = pm.
getOpName();
46 std::optional<StringRef> passOpName = pass->getOpName();
48 passOpName && *pmOpName != *passOpName) {
49 return errorHandler(llvm::Twine(
"Can't add pass '") + pass->getName() +
50 "' restricted to '" + *pass->getOpName() +
51 "' on a PassManager intended to run on '" +
61 size_t descIndent,
bool isTopLevel) {
62 size_t numSpaces = descIndent - indent - 4;
63 llvm::outs().indent(indent)
64 <<
"--" << llvm::left_justify(arg, numSpaces) <<
"- " << desc <<
'\n';
75 maxWidth = std::max(maxWidth, entry.second.getOptionWidth() + 4);
78 auto printOrderedEntries = [&](StringRef header,
auto &map) {
81 orderedEntries.push_back(&kv.second);
83 orderedEntries.begin(), orderedEntries.end(),
85 return (*lhs)->getPassArgument().compare((*rhs)->getPassArgument());
88 llvm::outs().indent(0) << header <<
":\n";
90 entry->printHelpStr(2, maxWidth);
105 options.printHelp(indent, descIndent);
114 maxLen =
options.getOptionWidth() + 2;
127 std::move(optHandler));
131 report_fatal_error(
"Pass pipeline " + arg +
" registered multiple times");
146 optHandler(allocator()->passOptions);
150 std::unique_ptr<Pass> pass = function();
151 StringRef arg = pass->getArgument();
153 llvm::report_fatal_error(llvm::Twine(
"Trying to register '") +
155 "' pass that does not override `getArgument()`");
156 StringRef description = pass->getDescription();
157 PassInfo passInfo(arg, description, function);
162 TypeID entryTypeID = pass->getTypeID();
164 if (it->second != entryTypeID)
165 llvm::report_fatal_error(
166 "pass allocator creates a different pass than previously "
167 "registered for pass " +
192 for (
size_t i =
index, e = str.size(); i < e; ++i) {
198 else if (str[i] ==
'(')
200 else if (str[i] ==
'[')
202 else if (str[i] ==
'\"')
203 i = str.find_first_of(
'\"', i + 1);
204 else if (str[i] ==
'\'')
205 i = str.find_first_of(
'\'', i + 1);
206 if (i == StringRef::npos)
207 return StringRef::npos;
209 return StringRef::npos;
216 StringRef str =
options.take_front(argSize).trim();
223 const auto escapePairs = {std::make_pair(
'\'',
'\''),
224 std::make_pair(
'"',
'"')};
225 for (
const auto &escape : escapePairs) {
226 if (str.front() == escape.first && str.back() == escape.second) {
229 return str.drop_front().drop_back().trim();
237 if (str.front() ==
'{') {
238 unsigned match =
findChar(str, 1,
'}');
239 if (match == str.size() - 1)
240 str = str.drop_front().drop_back().trim();
247 llvm::cl::Option &opt, StringRef argName, StringRef optionStr,
248 function_ref<LogicalResult(StringRef)> elementParseFn) {
249 if (optionStr.empty())
252 size_t nextElePos =
findChar(optionStr, 0,
',');
253 while (nextElePos != StringRef::npos) {
260 optionStr = optionStr.drop_front();
261 nextElePos =
findChar(optionStr, 0,
',');
263 return elementParseFn(
268void detail::PassOptions::OptionBase::anchor() {}
271void detail::PassOptions::copyOptionValuesFrom(
const PassOptions &other) {
272 assert(
options.size() == other.options.size());
275 for (
auto optionsIt : llvm::zip(
options, other.options))
276 std::get<0>(optionsIt)->copyValueFrom(*std::get<1>(optionsIt));
282static std::tuple<StringRef, StringRef, StringRef>
286 auto tryProcessPunct = [&](
size_t ¤tPos,
char punct) {
287 if (
options[currentPos] != punct)
289 size_t nextIt =
options.find_first_of(punct, currentPos + 1);
290 if (nextIt != StringRef::npos)
297 for (
size_t argEndIt = 0, optionsE =
options.size();; ++argEndIt) {
299 if (argEndIt == optionsE ||
options[argEndIt] ==
' ') {
301 return std::make_tuple(argName, StringRef(),
options);
305 if (
options[argEndIt] ==
'=') {
313 for (
size_t argEndIt = 0, optionsE =
options.size();; ++argEndIt) {
315 if (argEndIt == optionsE ||
options[argEndIt] ==
' ') {
317 return std::make_tuple(argName, value,
options);
322 if (tryProcessPunct(argEndIt,
'\'') || tryProcessPunct(argEndIt,
'"'))
327 size_t braceCount = 1;
328 for (++argEndIt; argEndIt != optionsE; ++argEndIt) {
330 if (tryProcessPunct(argEndIt,
'\'') || tryProcessPunct(argEndIt,
'"'))
334 else if (
options[argEndIt] ==
'}' && --braceCount == 0)
341 llvm_unreachable(
"unexpected control flow in pass option parsing");
344LogicalResult detail::PassOptions::parseFromString(StringRef
options,
345 raw_ostream &errorStream) {
349 StringRef key, value;
354 auto it = OptionsMap.find(key);
355 if (it == OptionsMap.end()) {
356 errorStream <<
"<Pass-Options-Parser>: no such option " << key <<
"\n";
359 if (llvm::cl::ProvidePositionalOption(it->second, value, 0))
368void detail::PassOptions::print(raw_ostream &os)
const {
370 if (OptionsMap.empty())
374 SmallVector<OptionBase *, 4> orderedOps(
options.begin(),
options.end());
375 auto compareOptionArgs = [](OptionBase *
const *
lhs, OptionBase *
const *
rhs) {
376 return (*lhs)->getArgStr().compare((*rhs)->getArgStr());
378 llvm::array_pod_sort(orderedOps.begin(), orderedOps.end(), compareOptionArgs);
383 orderedOps, os, [&](OptionBase *option) { option->print(os); },
" ");
389void detail::PassOptions::printHelp(
size_t indent,
size_t descIndent)
const {
391 SmallVector<OptionBase *, 4> orderedOps(
options.begin(),
options.end());
392 auto compareOptionArgs = [](OptionBase *
const *
lhs, OptionBase *
const *
rhs) {
393 return (*lhs)->getArgStr().compare((*rhs)->getArgStr());
395 llvm::array_pod_sort(orderedOps.begin(), orderedOps.end(), compareOptionArgs);
396 for (OptionBase *option : orderedOps) {
401 llvm::outs().indent(indent);
402 option->getOption()->printOptionInfo(descIndent - indent);
407size_t detail::PassOptions::getOptionWidth()
const {
410 max = std::max(
max, option->getOption()->getOptionWidth());
424OptionValue<OpPassManager>::OptionValue() =
default;
428OptionValue<OpPassManager>::OptionValue(
429 const OptionValue<mlir::OpPassManager> &
rhs) {
431 setValue(
rhs.getValue());
433OptionValue<OpPassManager> &
439OptionValue<OpPassManager>::~OptionValue() =
default;
441void OptionValue<OpPassManager>::setValue(
const OpPassManager &newValue) {
445 value = std::make_unique<mlir::OpPassManager>(newValue);
447void OptionValue<OpPassManager>::setValue(StringRef pipelineStr) {
449 assert(succeeded(pipeline) &&
"invalid pass pipeline");
454 std::string lhsStr, rhsStr;
456 raw_string_ostream lhsStream(lhsStr);
459 raw_string_ostream rhsStream(rhsStr);
460 rhs.printAsTextualPipeline(rhsStream);
464 return lhsStr == rhsStr;
467void OptionValue<OpPassManager>::anchor() {}
480 ParsedPassManager &value) {
482 if (failed(pipeline))
484 value.value = std::make_unique<OpPassManager>(std::move(*pipeline));
488void llvm::cl::parser<OpPassManager>::print(raw_ostream &os,
489 const OpPassManager &value) {
493void llvm::cl::parser<OpPassManager>::printOptionDiff(
494 const Option &opt, OpPassManager &pm,
const OptVal &defaultValue,
495 size_t globalWidth)
const {
496 printOptionName(opt, globalWidth);
500 if (defaultValue.hasValue()) {
501 outs().indent(2) <<
" (default: ";
502 defaultValue.getValue().printAsTextualPipeline(outs());
508void llvm::cl::parser<OpPassManager>::anchor() {}
510llvm::cl::parser<OpPassManager>::ParsedPassManager::ParsedPassManager() =
512llvm::cl::parser<OpPassManager>::ParsedPassManager::ParsedPassManager(
513 ParsedPassManager &&) =
default;
514llvm::cl::parser<OpPassManager>::ParsedPassManager::~ParsedPassManager() =
523class TextualPipeline {
527 LogicalResult
initialize(StringRef text, raw_ostream &errorStream);
531 addToPipeline(OpPassManager &pm,
532 function_ref<LogicalResult(
const Twine &)> errorHandler)
const;
538 using ErrorHandlerT =
function_ref<LogicalResult(
const char *, Twine)>;
547 struct PipelineElement {
548 PipelineElement(StringRef name) : name(name) {}
552 const PassRegistryEntry *registryEntry =
nullptr;
553 std::vector<PipelineElement> innerPipeline;
559 LogicalResult parsePipelineText(StringRef text, ErrorHandlerT errorHandler);
564 resolvePipelineElements(MutableArrayRef<PipelineElement> elements,
565 ErrorHandlerT errorHandler);
568 LogicalResult resolvePipelineElement(PipelineElement &element,
569 ErrorHandlerT errorHandler);
573 addToPipeline(ArrayRef<PipelineElement> elements, OpPassManager &pm,
574 function_ref<LogicalResult(
const Twine &)> errorHandler)
const;
576 std::vector<PipelineElement> pipeline;
583LogicalResult TextualPipeline::initialize(StringRef text,
584 raw_ostream &errorStream) {
589 llvm::SourceMgr pipelineMgr;
590 pipelineMgr.AddNewSourceBuffer(
591 llvm::MemoryBuffer::getMemBuffer(text,
"MLIR Textual PassPipeline Parser",
594 auto errorHandler = [&](
const char *rawLoc, Twine msg) {
595 pipelineMgr.PrintMessage(errorStream, SMLoc::getFromPointer(rawLoc),
596 llvm::SourceMgr::DK_Error, msg);
601 if (
failed(parsePipelineText(text, errorHandler)))
603 return resolvePipelineElements(pipeline, errorHandler);
607LogicalResult TextualPipeline::addToPipeline(
609 function_ref<LogicalResult(
const Twine &)> errorHandler)
const {
615 llvm::scope_exit restore([&]() { pm.
setNesting(nesting); });
617 return addToPipeline(pipeline, pm, errorHandler);
623LogicalResult TextualPipeline::parsePipelineText(StringRef text,
624 ErrorHandlerT errorHandler) {
625 SmallVector<std::vector<PipelineElement> *, 4> pipelineStack = {&pipeline};
627 std::vector<PipelineElement> &pipeline = *pipelineStack.back();
628 size_t pos = text.find_first_of(
",(){");
629 pipeline.emplace_back(text.substr(0, pos).trim());
632 if (pos == StringRef::npos)
635 text = text.substr(pos);
640 text = text.substr(1);
643 size_t close = StringRef::npos;
644 for (
unsigned i = 0, e = text.size(), braceCount = 1; i < e; ++i) {
645 if (text[i] ==
'{') {
649 if (text[i] ==
'}' && --braceCount == 0) {
656 if (close == StringRef::npos) {
659 "missing closing '}' while processing pass options");
661 pipeline.back().options = text.substr(0, close);
662 text = text.substr(close + 1);
668 }
else if (sep ==
'(') {
669 text = text.substr(1);
672 pipelineStack.push_back(&pipeline.back().innerPipeline);
678 while (text.consume_front(
")")) {
680 if (pipelineStack.size() == 1)
681 return errorHandler(text.data() - 1,
682 "encountered extra closing ')' creating unbalanced "
683 "parentheses while parsing pipeline");
685 pipelineStack.pop_back();
696 if (!text.consume_front(
","))
697 return errorHandler(text.data(),
"expected ',' after parsing pipeline");
701 if (pipelineStack.size() > 1)
704 "encountered unbalanced parentheses while parsing pipeline");
706 assert(pipelineStack.back() == &pipeline &&
707 "wrong pipeline at the bottom of the stack");
713LogicalResult TextualPipeline::resolvePipelineElements(
714 MutableArrayRef<PipelineElement> elements, ErrorHandlerT errorHandler) {
715 for (
auto &elt : elements)
716 if (
failed(resolvePipelineElement(elt, errorHandler)))
723TextualPipeline::resolvePipelineElement(PipelineElement &element,
724 ErrorHandlerT errorHandler) {
727 if (!element.innerPipeline.empty())
728 return resolvePipelineElements(element.innerPipeline, errorHandler);
740 auto *rawLoc = element.name.data();
741 return errorHandler(rawLoc,
"'" + element.name +
742 "' does not refer to a "
743 "registered pass or pass pipeline");
747LogicalResult TextualPipeline::addToPipeline(
748 ArrayRef<PipelineElement> elements, OpPassManager &pm,
749 function_ref<LogicalResult(
const Twine &)> errorHandler)
const {
750 for (
auto &elt : elements) {
751 if (elt.registryEntry) {
752 if (
failed(elt.registryEntry->addToPipeline(pm, elt.options,
754 return errorHandler(
"failed to add `" + elt.name +
"` with options `" +
757 }
else if (
failed(addToPipeline(elt.innerPipeline, pm.
nest(elt.name),
759 return errorHandler(
"failed to add `" + elt.name +
"` with options `" +
760 elt.options +
"` to inner pipeline");
768 TextualPipeline pipelineParser;
769 if (failed(pipelineParser.initialize(pipeline, errorStream)))
771 auto errorHandler = [&](Twine msg) {
772 errorStream << msg <<
"\n";
775 if (failed(pipelineParser.addToPipeline(pm, errorHandler)))
782 pipeline = pipeline.trim();
784 size_t pipelineStart = pipeline.find_first_of(
'(');
785 if (pipelineStart == 0 || pipelineStart == StringRef::npos ||
786 !pipeline.consume_back(
")")) {
787 errorStream <<
"expected pass pipeline to be wrapped with the anchor "
788 "operation type, e.g. 'builtin.module(...)'";
792 StringRef opName = pipeline.take_front(pipelineStart).rtrim();
808 PassArgData() =
default;
810 : registryEntry(registryEntry) {}
814 const PassRegistryEntry *registryEntry{
nullptr};
845#define PASS_PIPELINE_ARG "pass-pipeline"
853 void printOptionInfo(
const llvm::cl::Option &opt,
854 size_t globalWidth)
const override;
855 size_t getOptionWidth(
const llvm::cl::Option &opt)
const override;
856 bool parse(llvm::cl::Option &opt, StringRef argName, StringRef arg,
862 bool passNamesOnly =
false;
866void PassNameParser::initialize() {
867 llvm::cl::parser<PassArgData>::initialize();
871 addLiteralOption(kv.second.getPassArgument(), &kv.second,
872 kv.second.getPassDescription());
875 if (!passNamesOnly) {
877 addLiteralOption(kv.second.getPassArgument(), &kv.second,
878 kv.second.getPassDescription());
883void PassNameParser::printOptionInfo(
const llvm::cl::Option &opt,
884 size_t globalWidth)
const {
888 llvm::outs() <<
" --" << opt.ArgStr <<
"=<pass-arg>";
889 opt.printHelpStr(opt.HelpStr, globalWidth, opt.ArgStr.size() + 18);
894 if (opt.hasArgStr()) {
895 llvm::outs() <<
" --" << opt.ArgStr;
896 opt.printHelpStr(opt.HelpStr, globalWidth, opt.ArgStr.size() + 7);
898 llvm::outs() <<
" " << opt.HelpStr <<
'\n';
902 auto printOrderedEntries = [&](StringRef header,
auto &map) {
903 llvm::SmallVector<PassRegistryEntry *, 32> orderedEntries;
905 orderedEntries.push_back(&kv.second);
906 llvm::array_pod_sort(
907 orderedEntries.begin(), orderedEntries.end(),
908 [](PassRegistryEntry *
const *
lhs, PassRegistryEntry *
const *
rhs) {
909 return (*lhs)->getPassArgument().compare((*rhs)->getPassArgument());
912 llvm::outs().indent(4) << header <<
":\n";
913 for (PassRegistryEntry *entry : orderedEntries)
914 entry->printHelpStr(6, globalWidth);
925size_t PassNameParser::getOptionWidth(
const llvm::cl::Option &opt)
const {
926 size_t maxWidth = llvm::cl::parser<PassArgData>::getOptionWidth(opt) + 2;
930 maxWidth = std::max(maxWidth, entry.second.getOptionWidth() + 4);
932 maxWidth = std::max(maxWidth, entry.second.getOptionWidth() + 4);
936bool PassNameParser::parse(llvm::cl::Option &opt, StringRef argName,
937 StringRef arg, PassArgData &value) {
938 if (llvm::cl::parser<PassArgData>::parse(opt, argName, arg, value))
954 passList.getParser().passNamesOnly = passNamesOnly;
955 passList.setValueExpectedFlag(llvm::cl::ValueExpected::ValueOptional);
961 return llvm::any_of(
passList, [&](
const PassArgData &data) {
962 return data.registryEntry == entry;
967 llvm::cl::list<PassArgData, bool, PassNameParser>
passList;
975 arg, description,
false)),
978 llvm::cl::desc(
"Textual description of the pass pipeline to run")) {}
983 passPipelineAlias.emplace(alias,
985 llvm::cl::aliasopt(passPipeline));
992 return passPipeline.getNumOccurrences() != 0 ||
993 impl->passList.getNumOccurrences() != 0;
999 return impl->contains(entry);
1005 function_ref<LogicalResult(
const Twine &)> errorHandler)
const {
1006 if (passPipeline.getNumOccurrences()) {
1007 if (
impl->passList.getNumOccurrences())
1008 return errorHandler(
1010 "' option can't be used with individual pass options");
1012 llvm::raw_string_ostream os(errMsg);
1015 return errorHandler(errMsg);
1016 pm = std::move(*parsed);
1020 for (
auto &passIt :
impl->passList) {
1021 if (failed(passIt.registryEntry->addToPipeline(pm, passIt.options,
1023 return errorHandler(
"failed to add `" +
1024 passIt.registryEntry->getPassArgument() +
1025 "` with options `" + passIt.options +
"`");
1037 arg, description,
true)) {
1038 impl->passList.setMiscFlag(llvm::cl::CommaSeparated);
1044 return impl->passList.getNumOccurrences() != 0;
1050 return impl->contains(entry);
true
Given two iterators into the same block, return "true" if a is before `b.
LogicalResult initialize(unsigned origNumLoops, ArrayRef< ReassociationIndices > foldedIterationDims)
*if copies could not be generated due to yet unimplemented cases *copyInPlacementStart and copyOutPlacementStart in copyPlacementBlock *specify the insertion points where the incoming copies and outgoing should be inserted(the insertion happens right before the *insertion point). Since `begin` can itself be invalidated due to the memref *rewriting done from this method
false
Parses a map_entries map type from a string format back into its numeric value.
static llvm::ManagedStatic< PassManagerOptions > options
static llvm::ManagedStatic< llvm::StringMap< PassPipelineInfo > > passPipelineRegistry
Static mapping of all of the registered pass pipelines.
#define PASS_PIPELINE_ARG
The name for the command line option used for parsing the textual pass pipeline.
static llvm::ManagedStatic< llvm::StringMap< PassInfo > > passRegistry
Static mapping of all of the registered passes.
static PassRegistryFunction buildDefaultRegistryFn(const PassAllocatorFunction &allocator)
Utility to create a default registry function from a pass instance.
static void printOptionHelp(StringRef arg, StringRef desc, size_t indent, size_t descIndent, bool isTopLevel)
Utility to print the help string for a specific option.
static llvm::ManagedStatic< llvm::StringMap< TypeID > > passRegistryTypeIDs
A mapping of the above pass registry entries to the corresponding TypeID of the pass that they genera...
static std::tuple< StringRef, StringRef, StringRef > parseNextArg(StringRef options)
Parse in the next argument from the given options string.
static size_t findChar(StringRef str, size_t index, char c)
Attempt to find the next occurance of character 'c' in the string starting from the index-th position...
static StringRef extractArgAndUpdateOptions(StringRef &options, size_t argSize)
Extract an argument from 'options' and update it to point after the arg.
static Value max(ImplicitLocOpBuilder &builder, Value value, Value bound)
This class represents a pass manager that runs passes on either a specific operation type,...
void printAsTextualPipeline(raw_ostream &os, bool pretty=false) const
Prints out the passes of the pass manager as the textual representation of pipelines.
std::optional< OperationName > getOpName(MLIRContext &context) const
Return the operation name that this pass manager operates on, or std::nullopt if this is an op-agnost...
void setNesting(Nesting nesting)
Enable or disable the implicit nesting on this particular PassManager.
void addPass(std::unique_ptr< Pass > pass)
Add the given pass to this pass manager.
Nesting getNesting()
Return the current nesting mode.
Nesting
This enum represents the nesting behavior of the pass manager.
@ Explicit
Explicit nesting behavior.
StringRef getOpAnchorName() const
Return the name used to anchor this pass manager.
OpPassManager & nest(OperationName nestedName)
Nest a new operation pass manager for the given operation kind under this pass manager.
A structure to represent the information for a derived pass class.
static const PassInfo * lookup(StringRef passArg)
Returns the pass info for the specified pass class or null if unknown.
PassInfo(StringRef arg, StringRef description, const PassAllocatorFunction &allocator)
PassInfo constructor should not be invoked directly, instead use PassRegistration or registerPass.
bool hasAnyOccurrences() const
Returns true if this parser contains any valid options to add.
PassNameCLParser(StringRef arg, StringRef description)
Construct a parser with the given command line description.
bool contains(const PassRegistryEntry *entry) const
Returns true if the given pass registry entry was registered at the top-level of the parser,...
bool hasAnyOccurrences() const
Returns true if this parser contains any valid options to add.
PassPipelineCLParser(StringRef arg, StringRef description)
Construct a pass pipeline parser with the given command line description.
LogicalResult addToPipeline(OpPassManager &pm, function_ref< LogicalResult(const Twine &)> errorHandler) const
Adds the passes defined by this parser entry to the given pass manager.
bool contains(const PassRegistryEntry *entry) const
Returns true if the given pass registry entry was registered at the top-level of the parser,...
A structure to represent the information of a registered pass pipeline.
PassPipelineInfo(StringRef arg, StringRef description, const PassRegistryFunction &builder, std::function< void(function_ref< void(const detail::PassOptions &)>)> optHandler)
static const PassPipelineInfo * lookup(StringRef pipelineArg)
Returns the pass pipeline info for the specified pass pipeline or null if unknown.
Structure to group information about a passes and pass pipelines (argument to invoke via mlir-opt,...
void printHelpStr(size_t indent, size_t descIndent) const
Print the help information for this pass.
size_t getOptionWidth() const
Return the maximum width required when printing the options of this entry.
PassRegistryEntry(StringRef arg, StringRef description, const PassRegistryFunction &builder, std::function< void(function_ref< void(const detail::PassOptions &)>)> optHandler)
StringRef getPassDescription() const
Returns a description for the pass, this never returns null.
StringRef getPassArgument() const
Returns the command line option that may be passed to 'mlir-opt' that will cause this pass to run or ...
This class provides an efficient unique identifier for a specific C++ type.
This class represents a specific pass option, with a provided data type.
Base container class and manager for all pass options.
The OpAsmOpInterface, see OpAsmInterface.td for more details.
LogicalResult parseCommaSeparatedList(llvm::cl::Option &opt, StringRef argName, StringRef optionStr, function_ref< LogicalResult(StringRef)> elementParseFn)
Parse a string containing a list of comma-delimited elements, invoking the given parser for each sub-...
Include the generated interface declarations.
std::function< std::unique_ptr< Pass >()> PassAllocatorFunction
std::function< LogicalResult( OpPassManager &, StringRef options, function_ref< LogicalResult(const Twine &)> errorHandler)> PassRegistryFunction
A registry function that adds passes to the given pass manager.
void printRegisteredPasses()
Prints the passes that were previously registered and stored in passRegistry.
void registerPass(const PassAllocatorFunction &function)
Register a specific dialect pass allocator function with the system, typically used through the PassR...
void registerPassPipeline(StringRef arg, StringRef description, const PassRegistryFunction &function, std::function< void(function_ref< void(const detail::PassOptions &)>)> optHandler)
Register a specific dialect pipeline registry function with the system, typically used through the Pa...
LogicalResult parsePassPipeline(StringRef pipeline, OpPassManager &pm, raw_ostream &errorStream=llvm::errs())
Parse the textual representation of a pass pipeline, adding the result to 'pm' on success.
llvm::function_ref< Fn > function_ref
const PassArgData & getValue() const
OptionValue(const PassArgData &value)
void setValue(const PassArgData &value)
llvm::cl::list< PassArgData, bool, PassNameParser > passList
The set of passes and pass pipelines to run.
PassPipelineCLParserImpl(StringRef arg, StringRef description, bool passNamesOnly)
bool contains(const PassRegistryEntry *entry) const
Returns true if the given pass registry entry was registered at the top-level of the parser,...