14 #ifndef MLIR_PASS_PASSOPTIONS_H_ 15 #define MLIR_PASS_PASSOPTIONS_H_ 20 #include "llvm/ADT/StringRef.h" 21 #include "llvm/Support/CommandLine.h" 22 #include "llvm/Support/Compiler.h" 34 virtual ~OptionBase() =
default;
37 virtual void anchor();
40 virtual void print(raw_ostream &os) = 0;
43 StringRef getArgStr()
const {
return getOption()->ArgStr; }
47 virtual const llvm::cl::Option *getOption()
const = 0;
50 virtual void copyValueFrom(
const OptionBase &other) = 0;
59 template <
typename DataType>
60 struct GenericOptionParser :
public llvm::cl::parser<DataType> {
61 using llvm::cl::parser<DataType>::parser;
65 for (
auto &it : this->Values)
66 if (it.V.compare(value))
77 template <
typename DataType>
79 std::conditional_t<std::is_base_of<llvm::cl::generic_parser_base,
80 llvm::cl::parser<DataType>>::value,
81 GenericOptionParser<DataType>,
82 llvm::cl::parser<DataType>>;
85 template <
typename DataT>
86 static void printValue(raw_ostream &os, GenericOptionParser<DataT> &parser,
91 llvm_unreachable(
"unknown data value for option");
93 template <
typename DataT,
typename ParserT>
94 static void printValue(raw_ostream &os, ParserT &parser,
const DataT &value) {
97 template <
typename ParserT>
98 static void printValue(raw_ostream &os, ParserT &parser,
const bool &value) {
99 os << (value ? StringRef(
"true") : StringRef(
"false"));
104 template <
typename DataType>
105 class Option :
public llvm::cl::opt<DataType, false,
106 OptionParser<DataType>>,
109 template <
typename... Args>
111 :
llvm::cl::opt<DataType, false,
112 OptionParser<DataType>>(arg,
llvm::cl::
sub(parent),
113 std::forward<Args>(args)...) {
114 assert(!this->isPositional() && !this->isSink() &&
115 "sink and positional options are not supported");
116 parent.options.push_back(
this);
118 using llvm::cl::opt<DataType,
false,
119 OptionParser<DataType>>::operator=;
120 ~
Option()
override =
default;
124 const llvm::cl::Option *getOption()
const final {
return this; }
127 void print(raw_ostream &os)
final {
128 os << this->ArgStr <<
'=';
129 printValue(os, this->getParser(), this->getValue());
133 void copyValueFrom(
const OptionBase &other)
final {
140 template <
typename DataType>
142 OptionParser<DataType>>,
145 template <
typename... Args>
147 :
llvm::cl::list<DataType, bool,
148 OptionParser<DataType>>(arg,
llvm::cl::
sub(parent),
149 std::forward<Args>(args)...) {
150 assert(!this->isPositional() && !this->isSink() &&
151 "sink and positional options are not supported");
152 parent.options.push_back(
this);
158 (*this)->assign(values.begin(), values.end());
166 const llvm::cl::Option *getOption()
const final {
return this; }
169 void print(raw_ostream &os)
final {
170 os << this->ArgStr <<
'=';
171 auto printElementFn = [&](
const DataType &value) {
172 printValue(os, this->getParser(), value);
178 void copyValueFrom(
const OptionBase &other)
final {
197 void print(raw_ostream &os);
201 std::vector<OptionBase *> options;
225 auto result = std::make_unique<T>();
226 if (
failed(result->parseFromString(options)))
239 #endif // MLIR_PASS_PASSOPTIONS_H_ Option(PassOptions &parent, StringRef arg, Args &&... args)
Definition: PassOptions.h:110
Definition: InferTypeOpInterface.cpp:20
Definition: PassRegistry.cpp:413
Definition: PassOptions.h:141
bool failed(LogicalResult result)
Definition: LogicalResult.h:45
LogicalResult parseFromString(StringRef options)
Definition: PassRegistry.cpp:91
Definition: LogicalResult.h:18
static std::unique_ptr< T > createFromString(StringRef options)
Definition: PassOptions.h:224
ListOption(PassOptions &parent, StringRef arg, Args &&... args)
Definition: PassOptions.h:146
void copyOptionValuesFrom(const PassOptions &other)
Copy the option values from 'other'.
Definition: PassRegistry.cpp:83
Definition: PassOptions.h:234
This class represents a specific pass option, with a provided data type.
Definition: PassOptions.h:105
ValueBuilder< mlir::LLVM::SubOp > sub
Definition: LinalgToLLVM.cpp:67
Base container class and manager for all pass options.
Definition: PassOptions.h:28
void interleave(ForwardIterator begin, ForwardIterator end, UnaryFunctor each_fn, NullaryFunctor between_fn)
Definition: STLExtras.h:43
ListOption< DataType > & operator=(ArrayRef< DataType > values)
Allow assigning from an ArrayRef.
Definition: PassOptions.h:157
Definition: PassOptions.h:220
Definition: StandardTypes.h:63
void print(raw_ostream &os)
Definition: PassRegistry.cpp:134
std::vector< DataType > * operator->()
Definition: PassOptions.h:162