1 //===- llvm/Support/CommandLine.h - Command line handler --------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This class implements a command line argument processor that is useful when 10 // creating a tool. It provides a simple, minimalistic interface that is easily 11 // extensible and supports nonlocal (library) command line options. 12 // 13 // Note that rather than trying to figure out what this code does, you should 14 // read the library documentation located in docs/CommandLine.html or looks at 15 // the many example usages in tools/*/*.cpp 16 // 17 //===----------------------------------------------------------------------===// 18 19 #ifndef LLVM_SUPPORT_COMMANDLINE_H 20 #define LLVM_SUPPORT_COMMANDLINE_H 21 22 #include "llvm/ADT/ArrayRef.h" 23 #include "llvm/ADT/STLExtras.h" 24 #include "llvm/ADT/SmallPtrSet.h" 25 #include "llvm/ADT/SmallVector.h" 26 #include "llvm/ADT/StringMap.h" 27 #include "llvm/ADT/StringRef.h" 28 #include "llvm/ADT/Twine.h" 29 #include "llvm/ADT/iterator_range.h" 30 #include "llvm/Support/ErrorHandling.h" 31 #include "llvm/Support/ManagedStatic.h" 32 #include "llvm/Support/StringSaver.h" 33 #include "llvm/Support/raw_ostream.h" 34 #include <cassert> 35 #include <climits> 36 #include <cstddef> 37 #include <functional> 38 #include <initializer_list> 39 #include <string> 40 #include <type_traits> 41 #include <vector> 42 43 namespace llvm { 44 45 namespace vfs { 46 class FileSystem; 47 } 48 49 class StringSaver; 50 51 /// This namespace contains all of the command line option processing machinery. 52 /// It is intentionally a short name to make qualified usage concise. 53 namespace cl { 54 55 //===----------------------------------------------------------------------===// 56 // Command line option processing entry point. 57 // 58 // Returns true on success. Otherwise, this will print the error message to 59 // stderr and exit if \p Errs is not set (nullptr by default), or print the 60 // error message to \p Errs and return false if \p Errs is provided. 61 // 62 // If EnvVar is not nullptr, command-line options are also parsed from the 63 // environment variable named by EnvVar. Precedence is given to occurrences 64 // from argv. This precedence is currently implemented by parsing argv after 65 // the environment variable, so it is only implemented correctly for options 66 // that give precedence to later occurrences. If your program supports options 67 // that give precedence to earlier occurrences, you will need to extend this 68 // function to support it correctly. 69 bool ParseCommandLineOptions(int argc, const char *const *argv, 70 StringRef Overview = "", 71 raw_ostream *Errs = nullptr, 72 const char *EnvVar = nullptr, 73 bool LongOptionsUseDoubleDash = false); 74 75 // Function pointer type for printing version information. 76 using VersionPrinterTy = std::function<void(raw_ostream &)>; 77 78 ///===---------------------------------------------------------------------===// 79 /// Override the default (LLVM specific) version printer used to print out the 80 /// version when --version is given on the command line. This allows other 81 /// systems using the CommandLine utilities to print their own version string. 82 void SetVersionPrinter(VersionPrinterTy func); 83 84 ///===---------------------------------------------------------------------===// 85 /// Add an extra printer to use in addition to the default one. This can be 86 /// called multiple times, and each time it adds a new function to the list 87 /// which will be called after the basic LLVM version printing is complete. 88 /// Each can then add additional information specific to the tool. 89 void AddExtraVersionPrinter(VersionPrinterTy func); 90 91 // Print option values. 92 // With -print-options print the difference between option values and defaults. 93 // With -print-all-options print all option values. 94 // (Currently not perfect, but best-effort.) 95 void PrintOptionValues(); 96 97 // Forward declaration - AddLiteralOption needs to be up here to make gcc happy. 98 class Option; 99 100 /// Adds a new option for parsing and provides the option it refers to. 101 /// 102 /// \param O pointer to the option 103 /// \param Name the string name for the option to handle during parsing 104 /// 105 /// Literal options are used by some parsers to register special option values. 106 /// This is how the PassNameParser registers pass names for opt. 107 void AddLiteralOption(Option &O, StringRef Name); 108 109 //===----------------------------------------------------------------------===// 110 // Flags permitted to be passed to command line arguments 111 // 112 113 enum NumOccurrencesFlag { // Flags for the number of occurrences allowed 114 Optional = 0x00, // Zero or One occurrence 115 ZeroOrMore = 0x01, // Zero or more occurrences allowed 116 Required = 0x02, // One occurrence required 117 OneOrMore = 0x03, // One or more occurrences required 118 119 // Indicates that this option is fed anything that follows the last positional 120 // argument required by the application (it is an error if there are zero 121 // positional arguments, and a ConsumeAfter option is used). 122 // Thus, for example, all arguments to LLI are processed until a filename is 123 // found. Once a filename is found, all of the succeeding arguments are 124 // passed, unprocessed, to the ConsumeAfter option. 125 // 126 ConsumeAfter = 0x04 127 }; 128 129 enum ValueExpected { // Is a value required for the option? 130 // zero reserved for the unspecified value 131 ValueOptional = 0x01, // The value can appear... or not 132 ValueRequired = 0x02, // The value is required to appear! 133 ValueDisallowed = 0x03 // A value may not be specified (for flags) 134 }; 135 136 enum OptionHidden { // Control whether -help shows this option 137 NotHidden = 0x00, // Option included in -help & -help-hidden 138 Hidden = 0x01, // -help doesn't, but -help-hidden does 139 ReallyHidden = 0x02 // Neither -help nor -help-hidden show this arg 140 }; 141 142 // This controls special features that the option might have that cause it to be 143 // parsed differently... 144 // 145 // Prefix - This option allows arguments that are otherwise unrecognized to be 146 // matched by options that are a prefix of the actual value. This is useful for 147 // cases like a linker, where options are typically of the form '-lfoo' or 148 // '-L../../include' where -l or -L are the actual flags. When prefix is 149 // enabled, and used, the value for the flag comes from the suffix of the 150 // argument. 151 // 152 // AlwaysPrefix - Only allow the behavior enabled by the Prefix flag and reject 153 // the Option=Value form. 154 // 155 156 enum FormattingFlags { 157 NormalFormatting = 0x00, // Nothing special 158 Positional = 0x01, // Is a positional argument, no '-' required 159 Prefix = 0x02, // Can this option directly prefix its value? 160 AlwaysPrefix = 0x03 // Can this option only directly prefix its value? 161 }; 162 163 enum MiscFlags { // Miscellaneous flags to adjust argument 164 CommaSeparated = 0x01, // Should this cl::list split between commas? 165 PositionalEatsArgs = 0x02, // Should this positional cl::list eat -args? 166 Sink = 0x04, // Should this cl::list eat all unknown options? 167 168 // Can this option group with other options? 169 // If this is enabled, multiple letter options are allowed to bunch together 170 // with only a single hyphen for the whole group. This allows emulation 171 // of the behavior that ls uses for example: ls -la === ls -l -a 172 Grouping = 0x08, 173 174 // Default option 175 DefaultOption = 0x10 176 }; 177 178 //===----------------------------------------------------------------------===// 179 // 180 class OptionCategory { 181 private: 182 StringRef const Name; 183 StringRef const Description; 184 185 void registerCategory(); 186 187 public: 188 OptionCategory(StringRef const Name, 189 StringRef const Description = "") 190 : Name(Name), Description(Description) { 191 registerCategory(); 192 } 193 194 StringRef getName() const { return Name; } 195 StringRef getDescription() const { return Description; } 196 }; 197 198 // The general Option Category (used as default category). 199 OptionCategory &getGeneralCategory(); 200 201 //===----------------------------------------------------------------------===// 202 // 203 class SubCommand { 204 private: 205 StringRef Name; 206 StringRef Description; 207 208 protected: 209 void registerSubCommand(); 210 void unregisterSubCommand(); 211 212 public: 213 SubCommand(StringRef Name, StringRef Description = "") 214 : Name(Name), Description(Description) { 215 registerSubCommand(); 216 } 217 SubCommand() = default; 218 219 // Get the special subcommand representing no subcommand. 220 static SubCommand &getTopLevel(); 221 222 // Get the special subcommand that can be used to put an option into all 223 // subcommands. 224 static SubCommand &getAll(); 225 226 void reset(); 227 228 explicit operator bool() const; 229 230 StringRef getName() const { return Name; } 231 StringRef getDescription() const { return Description; } 232 233 SmallVector<Option *, 4> PositionalOpts; 234 SmallVector<Option *, 4> SinkOpts; 235 StringMap<Option *> OptionsMap; 236 237 Option *ConsumeAfterOpt = nullptr; // The ConsumeAfter option if it exists. 238 }; 239 240 // A special subcommand representing no subcommand 241 extern ManagedStatic<SubCommand> TopLevelSubCommand; 242 243 // A special subcommand that can be used to put an option into all subcommands. 244 extern ManagedStatic<SubCommand> AllSubCommands; 245 246 //===----------------------------------------------------------------------===// 247 // 248 class Option { 249 friend class alias; 250 251 // Overriden by subclasses to handle the value passed into an argument. Should 252 // return true if there was an error processing the argument and the program 253 // should exit. 254 // 255 virtual bool handleOccurrence(unsigned pos, StringRef ArgName, 256 StringRef Arg) = 0; 257 258 virtual enum ValueExpected getValueExpectedFlagDefault() const { 259 return ValueOptional; 260 } 261 262 // Out of line virtual function to provide home for the class. 263 virtual void anchor(); 264 265 uint16_t NumOccurrences; // The number of times specified 266 // Occurrences, HiddenFlag, and Formatting are all enum types but to avoid 267 // problems with signed enums in bitfields. 268 uint16_t Occurrences : 3; // enum NumOccurrencesFlag 269 // not using the enum type for 'Value' because zero is an implementation 270 // detail representing the non-value 271 uint16_t Value : 2; 272 uint16_t HiddenFlag : 2; // enum OptionHidden 273 uint16_t Formatting : 2; // enum FormattingFlags 274 uint16_t Misc : 5; 275 uint16_t FullyInitialized : 1; // Has addArgument been called? 276 uint16_t Position; // Position of last occurrence of the option 277 uint16_t AdditionalVals; // Greater than 0 for multi-valued option. 278 279 public: 280 StringRef ArgStr; // The argument string itself (ex: "help", "o") 281 StringRef HelpStr; // The descriptive text message for -help 282 StringRef ValueStr; // String describing what the value of this option is 283 SmallVector<OptionCategory *, 1> 284 Categories; // The Categories this option belongs to 285 SmallPtrSet<SubCommand *, 1> Subs; // The subcommands this option belongs to. 286 287 inline enum NumOccurrencesFlag getNumOccurrencesFlag() const { 288 return (enum NumOccurrencesFlag)Occurrences; 289 } 290 291 inline enum ValueExpected getValueExpectedFlag() const { 292 return Value ? ((enum ValueExpected)Value) : getValueExpectedFlagDefault(); 293 } 294 295 inline enum OptionHidden getOptionHiddenFlag() const { 296 return (enum OptionHidden)HiddenFlag; 297 } 298 299 inline enum FormattingFlags getFormattingFlag() const { 300 return (enum FormattingFlags)Formatting; 301 } 302 303 inline unsigned getMiscFlags() const { return Misc; } 304 inline unsigned getPosition() const { return Position; } 305 inline unsigned getNumAdditionalVals() const { return AdditionalVals; } 306 307 // Return true if the argstr != "" 308 bool hasArgStr() const { return !ArgStr.empty(); } 309 bool isPositional() const { return getFormattingFlag() == cl::Positional; } 310 bool isSink() const { return getMiscFlags() & cl::Sink; } 311 bool isDefaultOption() const { return getMiscFlags() & cl::DefaultOption; } 312 313 bool isConsumeAfter() const { 314 return getNumOccurrencesFlag() == cl::ConsumeAfter; 315 } 316 317 bool isInAllSubCommands() const { 318 return Subs.contains(&SubCommand::getAll()); 319 } 320 321 //-------------------------------------------------------------------------=== 322 // Accessor functions set by OptionModifiers 323 // 324 void setArgStr(StringRef S); 325 void setDescription(StringRef S) { HelpStr = S; } 326 void setValueStr(StringRef S) { ValueStr = S; } 327 void setNumOccurrencesFlag(enum NumOccurrencesFlag Val) { Occurrences = Val; } 328 void setValueExpectedFlag(enum ValueExpected Val) { Value = Val; } 329 void setHiddenFlag(enum OptionHidden Val) { HiddenFlag = Val; } 330 void setFormattingFlag(enum FormattingFlags V) { Formatting = V; } 331 void setMiscFlag(enum MiscFlags M) { Misc |= M; } 332 void setPosition(unsigned pos) { Position = pos; } 333 void addCategory(OptionCategory &C); 334 void addSubCommand(SubCommand &S) { Subs.insert(&S); } 335 336 protected: 337 explicit Option(enum NumOccurrencesFlag OccurrencesFlag, 338 enum OptionHidden Hidden) 339 : NumOccurrences(0), Occurrences(OccurrencesFlag), Value(0), 340 HiddenFlag(Hidden), Formatting(NormalFormatting), Misc(0), 341 FullyInitialized(false), Position(0), AdditionalVals(0) { 342 Categories.push_back(&getGeneralCategory()); 343 } 344 345 inline void setNumAdditionalVals(unsigned n) { AdditionalVals = n; } 346 347 public: 348 virtual ~Option() = default; 349 350 // Register this argument with the commandline system. 351 // 352 void addArgument(); 353 354 /// Unregisters this option from the CommandLine system. 355 /// 356 /// This option must have been the last option registered. 357 /// For testing purposes only. 358 void removeArgument(); 359 360 // Return the width of the option tag for printing... 361 virtual size_t getOptionWidth() const = 0; 362 363 // Print out information about this option. The to-be-maintained width is 364 // specified. 365 // 366 virtual void printOptionInfo(size_t GlobalWidth) const = 0; 367 368 virtual void printOptionValue(size_t GlobalWidth, bool Force) const = 0; 369 370 virtual void setDefault() = 0; 371 372 // Prints the help string for an option. 373 // 374 // This maintains the Indent for multi-line descriptions. 375 // FirstLineIndentedBy is the count of chars of the first line 376 // i.e. the one containing the --<option name>. 377 static void printHelpStr(StringRef HelpStr, size_t Indent, 378 size_t FirstLineIndentedBy); 379 380 // Prints the help string for an enum value. 381 // 382 // This maintains the Indent for multi-line descriptions. 383 // FirstLineIndentedBy is the count of chars of the first line 384 // i.e. the one containing the =<value>. 385 static void printEnumValHelpStr(StringRef HelpStr, size_t Indent, 386 size_t FirstLineIndentedBy); 387 388 virtual void getExtraOptionNames(SmallVectorImpl<StringRef> &) {} 389 390 // Wrapper around handleOccurrence that enforces Flags. 391 // 392 virtual bool addOccurrence(unsigned pos, StringRef ArgName, StringRef Value, 393 bool MultiArg = false); 394 395 // Prints option name followed by message. Always returns true. 396 bool error(const Twine &Message, StringRef ArgName = StringRef(), raw_ostream &Errs = llvm::errs()); 397 bool error(const Twine &Message, raw_ostream &Errs) { 398 return error(Message, StringRef(), Errs); 399 } 400 401 inline int getNumOccurrences() const { return NumOccurrences; } 402 void reset(); 403 }; 404 405 //===----------------------------------------------------------------------===// 406 // Command line option modifiers that can be used to modify the behavior of 407 // command line option parsers... 408 // 409 410 // Modifier to set the description shown in the -help output... 411 struct desc { 412 StringRef Desc; 413 414 desc(StringRef Str) : Desc(Str) {} 415 416 void apply(Option &O) const { O.setDescription(Desc); } 417 }; 418 419 // Modifier to set the value description shown in the -help output... 420 struct value_desc { 421 StringRef Desc; 422 423 value_desc(StringRef Str) : Desc(Str) {} 424 425 void apply(Option &O) const { O.setValueStr(Desc); } 426 }; 427 428 // Specify a default (initial) value for the command line argument, if the 429 // default constructor for the argument type does not give you what you want. 430 // This is only valid on "opt" arguments, not on "list" arguments. 431 template <class Ty> struct initializer { 432 const Ty &Init; 433 initializer(const Ty &Val) : Init(Val) {} 434 435 template <class Opt> void apply(Opt &O) const { O.setInitialValue(Init); } 436 }; 437 438 template <class Ty> struct list_initializer { 439 ArrayRef<Ty> Inits; 440 list_initializer(ArrayRef<Ty> Vals) : Inits(Vals) {} 441 442 template <class Opt> void apply(Opt &O) const { O.setInitialValues(Inits); } 443 }; 444 445 template <class Ty> initializer<Ty> init(const Ty &Val) { 446 return initializer<Ty>(Val); 447 } 448 449 template <class Ty> 450 list_initializer<Ty> list_init(ArrayRef<Ty> Vals) { 451 return list_initializer<Ty>(Vals); 452 } 453 454 // Allow the user to specify which external variable they want to store the 455 // results of the command line argument processing into, if they don't want to 456 // store it in the option itself. 457 template <class Ty> struct LocationClass { 458 Ty &Loc; 459 460 LocationClass(Ty &L) : Loc(L) {} 461 462 template <class Opt> void apply(Opt &O) const { O.setLocation(O, Loc); } 463 }; 464 465 template <class Ty> LocationClass<Ty> location(Ty &L) { 466 return LocationClass<Ty>(L); 467 } 468 469 // Specify the Option category for the command line argument to belong to. 470 struct cat { 471 OptionCategory &Category; 472 473 cat(OptionCategory &c) : Category(c) {} 474 475 template <class Opt> void apply(Opt &O) const { O.addCategory(Category); } 476 }; 477 478 // Specify the subcommand that this option belongs to. 479 struct sub { 480 SubCommand ⋐ 481 482 sub(SubCommand &S) : Sub(S) {} 483 484 template <class Opt> void apply(Opt &O) const { O.addSubCommand(Sub); } 485 }; 486 487 // Specify a callback function to be called when an option is seen. 488 // Can be used to set other options automatically. 489 template <typename R, typename Ty> struct cb { 490 std::function<R(Ty)> CB; 491 492 cb(std::function<R(Ty)> CB) : CB(CB) {} 493 494 template <typename Opt> void apply(Opt &O) const { O.setCallback(CB); } 495 }; 496 497 namespace detail { 498 template <typename F> 499 struct callback_traits : public callback_traits<decltype(&F::operator())> {}; 500 501 template <typename R, typename C, typename... Args> 502 struct callback_traits<R (C::*)(Args...) const> { 503 using result_type = R; 504 using arg_type = std::tuple_element_t<0, std::tuple<Args...>>; 505 static_assert(sizeof...(Args) == 1, "callback function must have one and only one parameter"); 506 static_assert(std::is_same_v<result_type, void>, 507 "callback return type must be void"); 508 static_assert(std::is_lvalue_reference_v<arg_type> && 509 std::is_const_v<std::remove_reference_t<arg_type>>, 510 "callback arg_type must be a const lvalue reference"); 511 }; 512 } // namespace detail 513 514 template <typename F> 515 cb<typename detail::callback_traits<F>::result_type, 516 typename detail::callback_traits<F>::arg_type> 517 callback(F CB) { 518 using result_type = typename detail::callback_traits<F>::result_type; 519 using arg_type = typename detail::callback_traits<F>::arg_type; 520 return cb<result_type, arg_type>(CB); 521 } 522 523 //===----------------------------------------------------------------------===// 524 525 // Support value comparison outside the template. 526 struct GenericOptionValue { 527 virtual bool compare(const GenericOptionValue &V) const = 0; 528 529 protected: 530 GenericOptionValue() = default; 531 GenericOptionValue(const GenericOptionValue&) = default; 532 GenericOptionValue &operator=(const GenericOptionValue &) = default; 533 ~GenericOptionValue() = default; 534 535 private: 536 virtual void anchor(); 537 }; 538 539 template <class DataType> struct OptionValue; 540 541 // The default value safely does nothing. Option value printing is only 542 // best-effort. 543 template <class DataType, bool isClass> 544 struct OptionValueBase : public GenericOptionValue { 545 // Temporary storage for argument passing. 546 using WrapperType = OptionValue<DataType>; 547 548 bool hasValue() const { return false; } 549 550 const DataType &getValue() const { llvm_unreachable("no default value"); } 551 552 // Some options may take their value from a different data type. 553 template <class DT> void setValue(const DT & /*V*/) {} 554 555 bool compare(const DataType & /*V*/) const { return false; } 556 557 bool compare(const GenericOptionValue & /*V*/) const override { 558 return false; 559 } 560 561 protected: 562 ~OptionValueBase() = default; 563 }; 564 565 // Simple copy of the option value. 566 template <class DataType> class OptionValueCopy : public GenericOptionValue { 567 DataType Value; 568 bool Valid = false; 569 570 protected: 571 OptionValueCopy(const OptionValueCopy&) = default; 572 OptionValueCopy &operator=(const OptionValueCopy &) = default; 573 ~OptionValueCopy() = default; 574 575 public: 576 OptionValueCopy() = default; 577 578 bool hasValue() const { return Valid; } 579 580 const DataType &getValue() const { 581 assert(Valid && "invalid option value"); 582 return Value; 583 } 584 585 void setValue(const DataType &V) { 586 Valid = true; 587 Value = V; 588 } 589 590 bool compare(const DataType &V) const { return Valid && (Value != V); } 591 592 bool compare(const GenericOptionValue &V) const override { 593 const OptionValueCopy<DataType> &VC = 594 static_cast<const OptionValueCopy<DataType> &>(V); 595 if (!VC.hasValue()) 596 return false; 597 return compare(VC.getValue()); 598 } 599 }; 600 601 // Non-class option values. 602 template <class DataType> 603 struct OptionValueBase<DataType, false> : OptionValueCopy<DataType> { 604 using WrapperType = DataType; 605 606 protected: 607 OptionValueBase() = default; 608 OptionValueBase(const OptionValueBase&) = default; 609 OptionValueBase &operator=(const OptionValueBase &) = default; 610 ~OptionValueBase() = default; 611 }; 612 613 // Top-level option class. 614 template <class DataType> 615 struct OptionValue final 616 : OptionValueBase<DataType, std::is_class_v<DataType>> { 617 OptionValue() = default; 618 619 OptionValue(const DataType &V) { this->setValue(V); } 620 621 // Some options may take their value from a different data type. 622 template <class DT> OptionValue<DataType> &operator=(const DT &V) { 623 this->setValue(V); 624 return *this; 625 } 626 }; 627 628 // Other safe-to-copy-by-value common option types. 629 enum boolOrDefault { BOU_UNSET, BOU_TRUE, BOU_FALSE }; 630 template <> 631 struct OptionValue<cl::boolOrDefault> final 632 : OptionValueCopy<cl::boolOrDefault> { 633 using WrapperType = cl::boolOrDefault; 634 635 OptionValue() = default; 636 637 OptionValue(const cl::boolOrDefault &V) { this->setValue(V); } 638 639 OptionValue<cl::boolOrDefault> &operator=(const cl::boolOrDefault &V) { 640 setValue(V); 641 return *this; 642 } 643 644 private: 645 void anchor() override; 646 }; 647 648 template <> 649 struct OptionValue<std::string> final : OptionValueCopy<std::string> { 650 using WrapperType = StringRef; 651 652 OptionValue() = default; 653 654 OptionValue(const std::string &V) { this->setValue(V); } 655 656 OptionValue<std::string> &operator=(const std::string &V) { 657 setValue(V); 658 return *this; 659 } 660 661 private: 662 void anchor() override; 663 }; 664 665 //===----------------------------------------------------------------------===// 666 // Enum valued command line option 667 // 668 669 // This represents a single enum value, using "int" as the underlying type. 670 struct OptionEnumValue { 671 StringRef Name; 672 int Value; 673 StringRef Description; 674 }; 675 676 #define clEnumVal(ENUMVAL, DESC) \ 677 llvm::cl::OptionEnumValue { #ENUMVAL, int(ENUMVAL), DESC } 678 #define clEnumValN(ENUMVAL, FLAGNAME, DESC) \ 679 llvm::cl::OptionEnumValue { FLAGNAME, int(ENUMVAL), DESC } 680 681 // For custom data types, allow specifying a group of values together as the 682 // values that go into the mapping that the option handler uses. 683 // 684 class ValuesClass { 685 // Use a vector instead of a map, because the lists should be short, 686 // the overhead is less, and most importantly, it keeps them in the order 687 // inserted so we can print our option out nicely. 688 SmallVector<OptionEnumValue, 4> Values; 689 690 public: 691 ValuesClass(std::initializer_list<OptionEnumValue> Options) 692 : Values(Options) {} 693 694 template <class Opt> void apply(Opt &O) const { 695 for (const auto &Value : Values) 696 O.getParser().addLiteralOption(Value.Name, Value.Value, 697 Value.Description); 698 } 699 }; 700 701 /// Helper to build a ValuesClass by forwarding a variable number of arguments 702 /// as an initializer list to the ValuesClass constructor. 703 template <typename... OptsTy> ValuesClass values(OptsTy... Options) { 704 return ValuesClass({Options...}); 705 } 706 707 //===----------------------------------------------------------------------===// 708 // Parameterizable parser for different data types. By default, known data types 709 // (string, int, bool) have specialized parsers, that do what you would expect. 710 // The default parser, used for data types that are not built-in, uses a mapping 711 // table to map specific options to values, which is used, among other things, 712 // to handle enum types. 713 714 //-------------------------------------------------- 715 // This class holds all the non-generic code that we do not need replicated for 716 // every instance of the generic parser. This also allows us to put stuff into 717 // CommandLine.cpp 718 // 719 class generic_parser_base { 720 protected: 721 class GenericOptionInfo { 722 public: 723 GenericOptionInfo(StringRef name, StringRef helpStr) 724 : Name(name), HelpStr(helpStr) {} 725 StringRef Name; 726 StringRef HelpStr; 727 }; 728 729 public: 730 generic_parser_base(Option &O) : Owner(O) {} 731 732 virtual ~generic_parser_base() = default; 733 // Base class should have virtual-destructor 734 735 // Virtual function implemented by generic subclass to indicate how many 736 // entries are in Values. 737 // 738 virtual unsigned getNumOptions() const = 0; 739 740 // Return option name N. 741 virtual StringRef getOption(unsigned N) const = 0; 742 743 // Return description N 744 virtual StringRef getDescription(unsigned N) const = 0; 745 746 // Return the width of the option tag for printing... 747 virtual size_t getOptionWidth(const Option &O) const; 748 749 virtual const GenericOptionValue &getOptionValue(unsigned N) const = 0; 750 751 // Print out information about this option. The to-be-maintained width is 752 // specified. 753 // 754 virtual void printOptionInfo(const Option &O, size_t GlobalWidth) const; 755 756 void printGenericOptionDiff(const Option &O, const GenericOptionValue &V, 757 const GenericOptionValue &Default, 758 size_t GlobalWidth) const; 759 760 // Print the value of an option and it's default. 761 // 762 // Template definition ensures that the option and default have the same 763 // DataType (via the same AnyOptionValue). 764 template <class AnyOptionValue> 765 void printOptionDiff(const Option &O, const AnyOptionValue &V, 766 const AnyOptionValue &Default, 767 size_t GlobalWidth) const { 768 printGenericOptionDiff(O, V, Default, GlobalWidth); 769 } 770 771 void initialize() {} 772 773 void getExtraOptionNames(SmallVectorImpl<StringRef> &OptionNames) { 774 // If there has been no argstr specified, that means that we need to add an 775 // argument for every possible option. This ensures that our options are 776 // vectored to us. 777 if (!Owner.hasArgStr()) 778 for (unsigned i = 0, e = getNumOptions(); i != e; ++i) 779 OptionNames.push_back(getOption(i)); 780 } 781 782 enum ValueExpected getValueExpectedFlagDefault() const { 783 // If there is an ArgStr specified, then we are of the form: 784 // 785 // -opt=O2 or -opt O2 or -optO2 786 // 787 // In which case, the value is required. Otherwise if an arg str has not 788 // been specified, we are of the form: 789 // 790 // -O2 or O2 or -la (where -l and -a are separate options) 791 // 792 // If this is the case, we cannot allow a value. 793 // 794 if (Owner.hasArgStr()) 795 return ValueRequired; 796 else 797 return ValueDisallowed; 798 } 799 800 // Return the option number corresponding to the specified 801 // argument string. If the option is not found, getNumOptions() is returned. 802 // 803 unsigned findOption(StringRef Name); 804 805 protected: 806 Option &Owner; 807 }; 808 809 // Default parser implementation - This implementation depends on having a 810 // mapping of recognized options to values of some sort. In addition to this, 811 // each entry in the mapping also tracks a help message that is printed with the 812 // command line option for -help. Because this is a simple mapping parser, the 813 // data type can be any unsupported type. 814 // 815 template <class DataType> class parser : public generic_parser_base { 816 protected: 817 class OptionInfo : public GenericOptionInfo { 818 public: 819 OptionInfo(StringRef name, DataType v, StringRef helpStr) 820 : GenericOptionInfo(name, helpStr), V(v) {} 821 822 OptionValue<DataType> V; 823 }; 824 SmallVector<OptionInfo, 8> Values; 825 826 public: 827 parser(Option &O) : generic_parser_base(O) {} 828 829 using parser_data_type = DataType; 830 831 // Implement virtual functions needed by generic_parser_base 832 unsigned getNumOptions() const override { return unsigned(Values.size()); } 833 StringRef getOption(unsigned N) const override { return Values[N].Name; } 834 StringRef getDescription(unsigned N) const override { 835 return Values[N].HelpStr; 836 } 837 838 // Return the value of option name N. 839 const GenericOptionValue &getOptionValue(unsigned N) const override { 840 return Values[N].V; 841 } 842 843 // Return true on error. 844 bool parse(Option &O, StringRef ArgName, StringRef Arg, DataType &V) { 845 StringRef ArgVal; 846 if (Owner.hasArgStr()) 847 ArgVal = Arg; 848 else 849 ArgVal = ArgName; 850 851 for (size_t i = 0, e = Values.size(); i != e; ++i) 852 if (Values[i].Name == ArgVal) { 853 V = Values[i].V.getValue(); 854 return false; 855 } 856 857 return O.error("Cannot find option named '" + ArgVal + "'!"); 858 } 859 860 /// Add an entry to the mapping table. 861 /// 862 template <class DT> 863 void addLiteralOption(StringRef Name, const DT &V, StringRef HelpStr) { 864 assert(findOption(Name) == Values.size() && "Option already exists!"); 865 OptionInfo X(Name, static_cast<DataType>(V), HelpStr); 866 Values.push_back(X); 867 AddLiteralOption(Owner, Name); 868 } 869 870 /// Remove the specified option. 871 /// 872 void removeLiteralOption(StringRef Name) { 873 unsigned N = findOption(Name); 874 assert(N != Values.size() && "Option not found!"); 875 Values.erase(Values.begin() + N); 876 } 877 }; 878 879 //-------------------------------------------------- 880 // Super class of parsers to provide boilerplate code 881 // 882 class basic_parser_impl { // non-template implementation of basic_parser<t> 883 public: 884 basic_parser_impl(Option &) {} 885 886 virtual ~basic_parser_impl() = default; 887 888 enum ValueExpected getValueExpectedFlagDefault() const { 889 return ValueRequired; 890 } 891 892 void getExtraOptionNames(SmallVectorImpl<StringRef> &) {} 893 894 void initialize() {} 895 896 // Return the width of the option tag for printing... 897 size_t getOptionWidth(const Option &O) const; 898 899 // Print out information about this option. The to-be-maintained width is 900 // specified. 901 // 902 void printOptionInfo(const Option &O, size_t GlobalWidth) const; 903 904 // Print a placeholder for options that don't yet support printOptionDiff(). 905 void printOptionNoValue(const Option &O, size_t GlobalWidth) const; 906 907 // Overload in subclass to provide a better default value. 908 virtual StringRef getValueName() const { return "value"; } 909 910 // An out-of-line virtual method to provide a 'home' for this class. 911 virtual void anchor(); 912 913 protected: 914 // A helper for basic_parser::printOptionDiff. 915 void printOptionName(const Option &O, size_t GlobalWidth) const; 916 }; 917 918 // The real basic parser is just a template wrapper that provides a typedef for 919 // the provided data type. 920 // 921 template <class DataType> class basic_parser : public basic_parser_impl { 922 public: 923 using parser_data_type = DataType; 924 using OptVal = OptionValue<DataType>; 925 926 basic_parser(Option &O) : basic_parser_impl(O) {} 927 }; 928 929 //-------------------------------------------------- 930 931 extern template class basic_parser<bool>; 932 933 template <> class parser<bool> : public basic_parser<bool> { 934 public: 935 parser(Option &O) : basic_parser(O) {} 936 937 // Return true on error. 938 bool parse(Option &O, StringRef ArgName, StringRef Arg, bool &Val); 939 940 void initialize() {} 941 942 enum ValueExpected getValueExpectedFlagDefault() const { 943 return ValueOptional; 944 } 945 946 // Do not print =<value> at all. 947 StringRef getValueName() const override { return StringRef(); } 948 949 void printOptionDiff(const Option &O, bool V, OptVal Default, 950 size_t GlobalWidth) const; 951 952 // An out-of-line virtual method to provide a 'home' for this class. 953 void anchor() override; 954 }; 955 956 //-------------------------------------------------- 957 958 extern template class basic_parser<boolOrDefault>; 959 960 template <> class parser<boolOrDefault> : public basic_parser<boolOrDefault> { 961 public: 962 parser(Option &O) : basic_parser(O) {} 963 964 // Return true on error. 965 bool parse(Option &O, StringRef ArgName, StringRef Arg, boolOrDefault &Val); 966 967 enum ValueExpected getValueExpectedFlagDefault() const { 968 return ValueOptional; 969 } 970 971 // Do not print =<value> at all. 972 StringRef getValueName() const override { return StringRef(); } 973 974 void printOptionDiff(const Option &O, boolOrDefault V, OptVal Default, 975 size_t GlobalWidth) const; 976 977 // An out-of-line virtual method to provide a 'home' for this class. 978 void anchor() override; 979 }; 980 981 //-------------------------------------------------- 982 983 extern template class basic_parser<int>; 984 985 template <> class parser<int> : public basic_parser<int> { 986 public: 987 parser(Option &O) : basic_parser(O) {} 988 989 // Return true on error. 990 bool parse(Option &O, StringRef ArgName, StringRef Arg, int &Val); 991 992 // Overload in subclass to provide a better default value. 993 StringRef getValueName() const override { return "int"; } 994 995 void printOptionDiff(const Option &O, int V, OptVal Default, 996 size_t GlobalWidth) const; 997 998 // An out-of-line virtual method to provide a 'home' for this class. 999 void anchor() override; 1000 }; 1001 1002 //-------------------------------------------------- 1003 1004 extern template class basic_parser<long>; 1005 1006 template <> class parser<long> final : public basic_parser<long> { 1007 public: 1008 parser(Option &O) : basic_parser(O) {} 1009 1010 // Return true on error. 1011 bool parse(Option &O, StringRef ArgName, StringRef Arg, long &Val); 1012 1013 // Overload in subclass to provide a better default value. 1014 StringRef getValueName() const override { return "long"; } 1015 1016 void printOptionDiff(const Option &O, long V, OptVal Default, 1017 size_t GlobalWidth) const; 1018 1019 // An out-of-line virtual method to provide a 'home' for this class. 1020 void anchor() override; 1021 }; 1022 1023 //-------------------------------------------------- 1024 1025 extern template class basic_parser<long long>; 1026 1027 template <> class parser<long long> : public basic_parser<long long> { 1028 public: 1029 parser(Option &O) : basic_parser(O) {} 1030 1031 // Return true on error. 1032 bool parse(Option &O, StringRef ArgName, StringRef Arg, long long &Val); 1033 1034 // Overload in subclass to provide a better default value. 1035 StringRef getValueName() const override { return "long"; } 1036 1037 void printOptionDiff(const Option &O, long long V, OptVal Default, 1038 size_t GlobalWidth) const; 1039 1040 // An out-of-line virtual method to provide a 'home' for this class. 1041 void anchor() override; 1042 }; 1043 1044 //-------------------------------------------------- 1045 1046 extern template class basic_parser<unsigned>; 1047 1048 template <> class parser<unsigned> : public basic_parser<unsigned> { 1049 public: 1050 parser(Option &O) : basic_parser(O) {} 1051 1052 // Return true on error. 1053 bool parse(Option &O, StringRef ArgName, StringRef Arg, unsigned &Val); 1054 1055 // Overload in subclass to provide a better default value. 1056 StringRef getValueName() const override { return "uint"; } 1057 1058 void printOptionDiff(const Option &O, unsigned V, OptVal Default, 1059 size_t GlobalWidth) const; 1060 1061 // An out-of-line virtual method to provide a 'home' for this class. 1062 void anchor() override; 1063 }; 1064 1065 //-------------------------------------------------- 1066 1067 extern template class basic_parser<unsigned long>; 1068 1069 template <> 1070 class parser<unsigned long> final : public basic_parser<unsigned long> { 1071 public: 1072 parser(Option &O) : basic_parser(O) {} 1073 1074 // Return true on error. 1075 bool parse(Option &O, StringRef ArgName, StringRef Arg, unsigned long &Val); 1076 1077 // Overload in subclass to provide a better default value. 1078 StringRef getValueName() const override { return "ulong"; } 1079 1080 void printOptionDiff(const Option &O, unsigned long V, OptVal Default, 1081 size_t GlobalWidth) const; 1082 1083 // An out-of-line virtual method to provide a 'home' for this class. 1084 void anchor() override; 1085 }; 1086 1087 //-------------------------------------------------- 1088 1089 extern template class basic_parser<unsigned long long>; 1090 1091 template <> 1092 class parser<unsigned long long> : public basic_parser<unsigned long long> { 1093 public: 1094 parser(Option &O) : basic_parser(O) {} 1095 1096 // Return true on error. 1097 bool parse(Option &O, StringRef ArgName, StringRef Arg, 1098 unsigned long long &Val); 1099 1100 // Overload in subclass to provide a better default value. 1101 StringRef getValueName() const override { return "ulong"; } 1102 1103 void printOptionDiff(const Option &O, unsigned long long V, OptVal Default, 1104 size_t GlobalWidth) const; 1105 1106 // An out-of-line virtual method to provide a 'home' for this class. 1107 void anchor() override; 1108 }; 1109 1110 //-------------------------------------------------- 1111 1112 extern template class basic_parser<double>; 1113 1114 template <> class parser<double> : public basic_parser<double> { 1115 public: 1116 parser(Option &O) : basic_parser(O) {} 1117 1118 // Return true on error. 1119 bool parse(Option &O, StringRef ArgName, StringRef Arg, double &Val); 1120 1121 // Overload in subclass to provide a better default value. 1122 StringRef getValueName() const override { return "number"; } 1123 1124 void printOptionDiff(const Option &O, double V, OptVal Default, 1125 size_t GlobalWidth) const; 1126 1127 // An out-of-line virtual method to provide a 'home' for this class. 1128 void anchor() override; 1129 }; 1130 1131 //-------------------------------------------------- 1132 1133 extern template class basic_parser<float>; 1134 1135 template <> class parser<float> : public basic_parser<float> { 1136 public: 1137 parser(Option &O) : basic_parser(O) {} 1138 1139 // Return true on error. 1140 bool parse(Option &O, StringRef ArgName, StringRef Arg, float &Val); 1141 1142 // Overload in subclass to provide a better default value. 1143 StringRef getValueName() const override { return "number"; } 1144 1145 void printOptionDiff(const Option &O, float V, OptVal Default, 1146 size_t GlobalWidth) const; 1147 1148 // An out-of-line virtual method to provide a 'home' for this class. 1149 void anchor() override; 1150 }; 1151 1152 //-------------------------------------------------- 1153 1154 extern template class basic_parser<std::string>; 1155 1156 template <> class parser<std::string> : public basic_parser<std::string> { 1157 public: 1158 parser(Option &O) : basic_parser(O) {} 1159 1160 // Return true on error. 1161 bool parse(Option &, StringRef, StringRef Arg, std::string &Value) { 1162 Value = Arg.str(); 1163 return false; 1164 } 1165 1166 // Overload in subclass to provide a better default value. 1167 StringRef getValueName() const override { return "string"; } 1168 1169 void printOptionDiff(const Option &O, StringRef V, const OptVal &Default, 1170 size_t GlobalWidth) const; 1171 1172 // An out-of-line virtual method to provide a 'home' for this class. 1173 void anchor() override; 1174 }; 1175 1176 //-------------------------------------------------- 1177 1178 extern template class basic_parser<char>; 1179 1180 template <> class parser<char> : public basic_parser<char> { 1181 public: 1182 parser(Option &O) : basic_parser(O) {} 1183 1184 // Return true on error. 1185 bool parse(Option &, StringRef, StringRef Arg, char &Value) { 1186 Value = Arg[0]; 1187 return false; 1188 } 1189 1190 // Overload in subclass to provide a better default value. 1191 StringRef getValueName() const override { return "char"; } 1192 1193 void printOptionDiff(const Option &O, char V, OptVal Default, 1194 size_t GlobalWidth) const; 1195 1196 // An out-of-line virtual method to provide a 'home' for this class. 1197 void anchor() override; 1198 }; 1199 1200 //-------------------------------------------------- 1201 // This collection of wrappers is the intermediary between class opt and class 1202 // parser to handle all the template nastiness. 1203 1204 // This overloaded function is selected by the generic parser. 1205 template <class ParserClass, class DT> 1206 void printOptionDiff(const Option &O, const generic_parser_base &P, const DT &V, 1207 const OptionValue<DT> &Default, size_t GlobalWidth) { 1208 OptionValue<DT> OV = V; 1209 P.printOptionDiff(O, OV, Default, GlobalWidth); 1210 } 1211 1212 // This is instantiated for basic parsers when the parsed value has a different 1213 // type than the option value. e.g. HelpPrinter. 1214 template <class ParserDT, class ValDT> struct OptionDiffPrinter { 1215 void print(const Option &O, const parser<ParserDT> &P, const ValDT & /*V*/, 1216 const OptionValue<ValDT> & /*Default*/, size_t GlobalWidth) { 1217 P.printOptionNoValue(O, GlobalWidth); 1218 } 1219 }; 1220 1221 // This is instantiated for basic parsers when the parsed value has the same 1222 // type as the option value. 1223 template <class DT> struct OptionDiffPrinter<DT, DT> { 1224 void print(const Option &O, const parser<DT> &P, const DT &V, 1225 const OptionValue<DT> &Default, size_t GlobalWidth) { 1226 P.printOptionDiff(O, V, Default, GlobalWidth); 1227 } 1228 }; 1229 1230 // This overloaded function is selected by the basic parser, which may parse a 1231 // different type than the option type. 1232 template <class ParserClass, class ValDT> 1233 void printOptionDiff( 1234 const Option &O, 1235 const basic_parser<typename ParserClass::parser_data_type> &P, 1236 const ValDT &V, const OptionValue<ValDT> &Default, size_t GlobalWidth) { 1237 1238 OptionDiffPrinter<typename ParserClass::parser_data_type, ValDT> printer; 1239 printer.print(O, static_cast<const ParserClass &>(P), V, Default, 1240 GlobalWidth); 1241 } 1242 1243 //===----------------------------------------------------------------------===// 1244 // This class is used because we must use partial specialization to handle 1245 // literal string arguments specially (const char* does not correctly respond to 1246 // the apply method). Because the syntax to use this is a pain, we have the 1247 // 'apply' method below to handle the nastiness... 1248 // 1249 template <class Mod> struct applicator { 1250 template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); } 1251 }; 1252 1253 // Handle const char* as a special case... 1254 template <unsigned n> struct applicator<char[n]> { 1255 template <class Opt> static void opt(StringRef Str, Opt &O) { 1256 O.setArgStr(Str); 1257 } 1258 }; 1259 template <unsigned n> struct applicator<const char[n]> { 1260 template <class Opt> static void opt(StringRef Str, Opt &O) { 1261 O.setArgStr(Str); 1262 } 1263 }; 1264 template <> struct applicator<StringRef > { 1265 template <class Opt> static void opt(StringRef Str, Opt &O) { 1266 O.setArgStr(Str); 1267 } 1268 }; 1269 1270 template <> struct applicator<NumOccurrencesFlag> { 1271 static void opt(NumOccurrencesFlag N, Option &O) { 1272 O.setNumOccurrencesFlag(N); 1273 } 1274 }; 1275 1276 template <> struct applicator<ValueExpected> { 1277 static void opt(ValueExpected VE, Option &O) { O.setValueExpectedFlag(VE); } 1278 }; 1279 1280 template <> struct applicator<OptionHidden> { 1281 static void opt(OptionHidden OH, Option &O) { O.setHiddenFlag(OH); } 1282 }; 1283 1284 template <> struct applicator<FormattingFlags> { 1285 static void opt(FormattingFlags FF, Option &O) { O.setFormattingFlag(FF); } 1286 }; 1287 1288 template <> struct applicator<MiscFlags> { 1289 static void opt(MiscFlags MF, Option &O) { 1290 assert((MF != Grouping || O.ArgStr.size() == 1) && 1291 "cl::Grouping can only apply to single character Options."); 1292 O.setMiscFlag(MF); 1293 } 1294 }; 1295 1296 // Apply modifiers to an option in a type safe way. 1297 template <class Opt, class Mod, class... Mods> 1298 void apply(Opt *O, const Mod &M, const Mods &... Ms) { 1299 applicator<Mod>::opt(M, *O); 1300 apply(O, Ms...); 1301 } 1302 1303 template <class Opt, class Mod> void apply(Opt *O, const Mod &M) { 1304 applicator<Mod>::opt(M, *O); 1305 } 1306 1307 //===----------------------------------------------------------------------===// 1308 // Default storage class definition: external storage. This implementation 1309 // assumes the user will specify a variable to store the data into with the 1310 // cl::location(x) modifier. 1311 // 1312 template <class DataType, bool ExternalStorage, bool isClass> 1313 class opt_storage { 1314 DataType *Location = nullptr; // Where to store the object... 1315 OptionValue<DataType> Default; 1316 1317 void check_location() const { 1318 assert(Location && "cl::location(...) not specified for a command " 1319 "line option with external storage, " 1320 "or cl::init specified before cl::location()!!"); 1321 } 1322 1323 public: 1324 opt_storage() = default; 1325 1326 bool setLocation(Option &O, DataType &L) { 1327 if (Location) 1328 return O.error("cl::location(x) specified more than once!"); 1329 Location = &L; 1330 Default = L; 1331 return false; 1332 } 1333 1334 template <class T> void setValue(const T &V, bool initial = false) { 1335 check_location(); 1336 *Location = V; 1337 if (initial) 1338 Default = V; 1339 } 1340 1341 DataType &getValue() { 1342 check_location(); 1343 return *Location; 1344 } 1345 const DataType &getValue() const { 1346 check_location(); 1347 return *Location; 1348 } 1349 1350 operator DataType() const { return this->getValue(); } 1351 1352 const OptionValue<DataType> &getDefault() const { return Default; } 1353 }; 1354 1355 // Define how to hold a class type object, such as a string. Since we can 1356 // inherit from a class, we do so. This makes us exactly compatible with the 1357 // object in all cases that it is used. 1358 // 1359 template <class DataType> 1360 class opt_storage<DataType, false, true> : public DataType { 1361 public: 1362 OptionValue<DataType> Default; 1363 1364 template <class T> void setValue(const T &V, bool initial = false) { 1365 DataType::operator=(V); 1366 if (initial) 1367 Default = V; 1368 } 1369 1370 DataType &getValue() { return *this; } 1371 const DataType &getValue() const { return *this; } 1372 1373 const OptionValue<DataType> &getDefault() const { return Default; } 1374 }; 1375 1376 // Define a partial specialization to handle things we cannot inherit from. In 1377 // this case, we store an instance through containment, and overload operators 1378 // to get at the value. 1379 // 1380 template <class DataType> class opt_storage<DataType, false, false> { 1381 public: 1382 DataType Value; 1383 OptionValue<DataType> Default; 1384 1385 // Make sure we initialize the value with the default constructor for the 1386 // type. 1387 opt_storage() : Value(DataType()), Default() {} 1388 1389 template <class T> void setValue(const T &V, bool initial = false) { 1390 Value = V; 1391 if (initial) 1392 Default = V; 1393 } 1394 DataType &getValue() { return Value; } 1395 DataType getValue() const { return Value; } 1396 1397 const OptionValue<DataType> &getDefault() const { return Default; } 1398 1399 operator DataType() const { return getValue(); } 1400 1401 // If the datatype is a pointer, support -> on it. 1402 DataType operator->() const { return Value; } 1403 }; 1404 1405 //===----------------------------------------------------------------------===// 1406 // A scalar command line option. 1407 // 1408 template <class DataType, bool ExternalStorage = false, 1409 class ParserClass = parser<DataType>> 1410 class opt 1411 : public Option, 1412 public opt_storage<DataType, ExternalStorage, std::is_class_v<DataType>> { 1413 ParserClass Parser; 1414 1415 bool handleOccurrence(unsigned pos, StringRef ArgName, 1416 StringRef Arg) override { 1417 typename ParserClass::parser_data_type Val = 1418 typename ParserClass::parser_data_type(); 1419 if (Parser.parse(*this, ArgName, Arg, Val)) 1420 return true; // Parse error! 1421 this->setValue(Val); 1422 this->setPosition(pos); 1423 Callback(Val); 1424 return false; 1425 } 1426 1427 enum ValueExpected getValueExpectedFlagDefault() const override { 1428 return Parser.getValueExpectedFlagDefault(); 1429 } 1430 1431 void getExtraOptionNames(SmallVectorImpl<StringRef> &OptionNames) override { 1432 return Parser.getExtraOptionNames(OptionNames); 1433 } 1434 1435 // Forward printing stuff to the parser... 1436 size_t getOptionWidth() const override { 1437 return Parser.getOptionWidth(*this); 1438 } 1439 1440 void printOptionInfo(size_t GlobalWidth) const override { 1441 Parser.printOptionInfo(*this, GlobalWidth); 1442 } 1443 1444 void printOptionValue(size_t GlobalWidth, bool Force) const override { 1445 if (Force || this->getDefault().compare(this->getValue())) { 1446 cl::printOptionDiff<ParserClass>(*this, Parser, this->getValue(), 1447 this->getDefault(), GlobalWidth); 1448 } 1449 } 1450 1451 template <class T, class = std::enable_if_t<std::is_assignable_v<T &, T>>> 1452 void setDefaultImpl() { 1453 const OptionValue<DataType> &V = this->getDefault(); 1454 if (V.hasValue()) 1455 this->setValue(V.getValue()); 1456 else 1457 this->setValue(T()); 1458 } 1459 1460 template <class T, class = std::enable_if_t<!std::is_assignable_v<T &, T>>> 1461 void setDefaultImpl(...) {} 1462 1463 void setDefault() override { setDefaultImpl<DataType>(); } 1464 1465 void done() { 1466 addArgument(); 1467 Parser.initialize(); 1468 } 1469 1470 public: 1471 // Command line options should not be copyable 1472 opt(const opt &) = delete; 1473 opt &operator=(const opt &) = delete; 1474 1475 // setInitialValue - Used by the cl::init modifier... 1476 void setInitialValue(const DataType &V) { this->setValue(V, true); } 1477 1478 ParserClass &getParser() { return Parser; } 1479 1480 template <class T> DataType &operator=(const T &Val) { 1481 this->setValue(Val); 1482 Callback(Val); 1483 return this->getValue(); 1484 } 1485 1486 template <class... Mods> 1487 explicit opt(const Mods &... Ms) 1488 : Option(llvm::cl::Optional, NotHidden), Parser(*this) { 1489 apply(this, Ms...); 1490 done(); 1491 } 1492 1493 void setCallback( 1494 std::function<void(const typename ParserClass::parser_data_type &)> CB) { 1495 Callback = CB; 1496 } 1497 1498 std::function<void(const typename ParserClass::parser_data_type &)> Callback = 1499 [](const typename ParserClass::parser_data_type &) {}; 1500 }; 1501 1502 extern template class opt<unsigned>; 1503 extern template class opt<int>; 1504 extern template class opt<std::string>; 1505 extern template class opt<char>; 1506 extern template class opt<bool>; 1507 1508 //===----------------------------------------------------------------------===// 1509 // Default storage class definition: external storage. This implementation 1510 // assumes the user will specify a variable to store the data into with the 1511 // cl::location(x) modifier. 1512 // 1513 template <class DataType, class StorageClass> class list_storage { 1514 StorageClass *Location = nullptr; // Where to store the object... 1515 std::vector<OptionValue<DataType>> Default = 1516 std::vector<OptionValue<DataType>>(); 1517 bool DefaultAssigned = false; 1518 1519 public: 1520 list_storage() = default; 1521 1522 void clear() {} 1523 1524 bool setLocation(Option &O, StorageClass &L) { 1525 if (Location) 1526 return O.error("cl::location(x) specified more than once!"); 1527 Location = &L; 1528 return false; 1529 } 1530 1531 template <class T> void addValue(const T &V, bool initial = false) { 1532 assert(Location != nullptr && 1533 "cl::location(...) not specified for a command " 1534 "line option with external storage!"); 1535 Location->push_back(V); 1536 if (initial) 1537 Default.push_back(V); 1538 } 1539 1540 const std::vector<OptionValue<DataType>> &getDefault() const { 1541 return Default; 1542 } 1543 1544 void assignDefault() { DefaultAssigned = true; } 1545 void overwriteDefault() { DefaultAssigned = false; } 1546 bool isDefaultAssigned() { return DefaultAssigned; } 1547 }; 1548 1549 // Define how to hold a class type object, such as a string. 1550 // Originally this code inherited from std::vector. In transitioning to a new 1551 // API for command line options we should change this. The new implementation 1552 // of this list_storage specialization implements the minimum subset of the 1553 // std::vector API required for all the current clients. 1554 // 1555 // FIXME: Reduce this API to a more narrow subset of std::vector 1556 // 1557 template <class DataType> class list_storage<DataType, bool> { 1558 std::vector<DataType> Storage; 1559 std::vector<OptionValue<DataType>> Default; 1560 bool DefaultAssigned = false; 1561 1562 public: 1563 using iterator = typename std::vector<DataType>::iterator; 1564 1565 iterator begin() { return Storage.begin(); } 1566 iterator end() { return Storage.end(); } 1567 1568 using const_iterator = typename std::vector<DataType>::const_iterator; 1569 1570 const_iterator begin() const { return Storage.begin(); } 1571 const_iterator end() const { return Storage.end(); } 1572 1573 using size_type = typename std::vector<DataType>::size_type; 1574 1575 size_type size() const { return Storage.size(); } 1576 1577 bool empty() const { return Storage.empty(); } 1578 1579 void push_back(const DataType &value) { Storage.push_back(value); } 1580 void push_back(DataType &&value) { Storage.push_back(value); } 1581 1582 using reference = typename std::vector<DataType>::reference; 1583 using const_reference = typename std::vector<DataType>::const_reference; 1584 1585 reference operator[](size_type pos) { return Storage[pos]; } 1586 const_reference operator[](size_type pos) const { return Storage[pos]; } 1587 1588 void clear() { 1589 Storage.clear(); 1590 } 1591 1592 iterator erase(const_iterator pos) { return Storage.erase(pos); } 1593 iterator erase(const_iterator first, const_iterator last) { 1594 return Storage.erase(first, last); 1595 } 1596 1597 iterator erase(iterator pos) { return Storage.erase(pos); } 1598 iterator erase(iterator first, iterator last) { 1599 return Storage.erase(first, last); 1600 } 1601 1602 iterator insert(const_iterator pos, const DataType &value) { 1603 return Storage.insert(pos, value); 1604 } 1605 iterator insert(const_iterator pos, DataType &&value) { 1606 return Storage.insert(pos, value); 1607 } 1608 1609 iterator insert(iterator pos, const DataType &value) { 1610 return Storage.insert(pos, value); 1611 } 1612 iterator insert(iterator pos, DataType &&value) { 1613 return Storage.insert(pos, value); 1614 } 1615 1616 reference front() { return Storage.front(); } 1617 const_reference front() const { return Storage.front(); } 1618 1619 operator std::vector<DataType> &() { return Storage; } 1620 operator ArrayRef<DataType>() const { return Storage; } 1621 std::vector<DataType> *operator&() { return &Storage; } 1622 const std::vector<DataType> *operator&() const { return &Storage; } 1623 1624 template <class T> void addValue(const T &V, bool initial = false) { 1625 Storage.push_back(V); 1626 if (initial) 1627 Default.push_back(OptionValue<DataType>(V)); 1628 } 1629 1630 const std::vector<OptionValue<DataType>> &getDefault() const { 1631 return Default; 1632 } 1633 1634 void assignDefault() { DefaultAssigned = true; } 1635 void overwriteDefault() { DefaultAssigned = false; } 1636 bool isDefaultAssigned() { return DefaultAssigned; } 1637 }; 1638 1639 //===----------------------------------------------------------------------===// 1640 // A list of command line options. 1641 // 1642 template <class DataType, class StorageClass = bool, 1643 class ParserClass = parser<DataType>> 1644 class list : public Option, public list_storage<DataType, StorageClass> { 1645 std::vector<unsigned> Positions; 1646 ParserClass Parser; 1647 1648 enum ValueExpected getValueExpectedFlagDefault() const override { 1649 return Parser.getValueExpectedFlagDefault(); 1650 } 1651 1652 void getExtraOptionNames(SmallVectorImpl<StringRef> &OptionNames) override { 1653 return Parser.getExtraOptionNames(OptionNames); 1654 } 1655 1656 bool handleOccurrence(unsigned pos, StringRef ArgName, 1657 StringRef Arg) override { 1658 typename ParserClass::parser_data_type Val = 1659 typename ParserClass::parser_data_type(); 1660 if (list_storage<DataType, StorageClass>::isDefaultAssigned()) { 1661 clear(); 1662 list_storage<DataType, StorageClass>::overwriteDefault(); 1663 } 1664 if (Parser.parse(*this, ArgName, Arg, Val)) 1665 return true; // Parse Error! 1666 list_storage<DataType, StorageClass>::addValue(Val); 1667 setPosition(pos); 1668 Positions.push_back(pos); 1669 Callback(Val); 1670 return false; 1671 } 1672 1673 // Forward printing stuff to the parser... 1674 size_t getOptionWidth() const override { 1675 return Parser.getOptionWidth(*this); 1676 } 1677 1678 void printOptionInfo(size_t GlobalWidth) const override { 1679 Parser.printOptionInfo(*this, GlobalWidth); 1680 } 1681 1682 // Unimplemented: list options don't currently store their default value. 1683 void printOptionValue(size_t /*GlobalWidth*/, bool /*Force*/) const override { 1684 } 1685 1686 void setDefault() override { 1687 Positions.clear(); 1688 list_storage<DataType, StorageClass>::clear(); 1689 for (auto &Val : list_storage<DataType, StorageClass>::getDefault()) 1690 list_storage<DataType, StorageClass>::addValue(Val.getValue()); 1691 } 1692 1693 void done() { 1694 addArgument(); 1695 Parser.initialize(); 1696 } 1697 1698 public: 1699 // Command line options should not be copyable 1700 list(const list &) = delete; 1701 list &operator=(const list &) = delete; 1702 1703 ParserClass &getParser() { return Parser; } 1704 1705 unsigned getPosition(unsigned optnum) const { 1706 assert(optnum < this->size() && "Invalid option index"); 1707 return Positions[optnum]; 1708 } 1709 1710 void clear() { 1711 Positions.clear(); 1712 list_storage<DataType, StorageClass>::clear(); 1713 } 1714 1715 // setInitialValues - Used by the cl::list_init modifier... 1716 void setInitialValues(ArrayRef<DataType> Vs) { 1717 assert(!(list_storage<DataType, StorageClass>::isDefaultAssigned()) && 1718 "Cannot have two default values"); 1719 list_storage<DataType, StorageClass>::assignDefault(); 1720 for (auto &Val : Vs) 1721 list_storage<DataType, StorageClass>::addValue(Val, true); 1722 } 1723 1724 void setNumAdditionalVals(unsigned n) { Option::setNumAdditionalVals(n); } 1725 1726 template <class... Mods> 1727 explicit list(const Mods &... Ms) 1728 : Option(ZeroOrMore, NotHidden), Parser(*this) { 1729 apply(this, Ms...); 1730 done(); 1731 } 1732 1733 void setCallback( 1734 std::function<void(const typename ParserClass::parser_data_type &)> CB) { 1735 Callback = CB; 1736 } 1737 1738 std::function<void(const typename ParserClass::parser_data_type &)> Callback = 1739 [](const typename ParserClass::parser_data_type &) {}; 1740 }; 1741 1742 // Modifier to set the number of additional values. 1743 struct multi_val { 1744 unsigned AdditionalVals; 1745 explicit multi_val(unsigned N) : AdditionalVals(N) {} 1746 1747 template <typename D, typename S, typename P> 1748 void apply(list<D, S, P> &L) const { 1749 L.setNumAdditionalVals(AdditionalVals); 1750 } 1751 }; 1752 1753 //===----------------------------------------------------------------------===// 1754 // Default storage class definition: external storage. This implementation 1755 // assumes the user will specify a variable to store the data into with the 1756 // cl::location(x) modifier. 1757 // 1758 template <class DataType, class StorageClass> class bits_storage { 1759 unsigned *Location = nullptr; // Where to store the bits... 1760 1761 template <class T> static unsigned Bit(const T &V) { 1762 unsigned BitPos = static_cast<unsigned>(V); 1763 assert(BitPos < sizeof(unsigned) * CHAR_BIT && 1764 "enum exceeds width of bit vector!"); 1765 return 1 << BitPos; 1766 } 1767 1768 public: 1769 bits_storage() = default; 1770 1771 bool setLocation(Option &O, unsigned &L) { 1772 if (Location) 1773 return O.error("cl::location(x) specified more than once!"); 1774 Location = &L; 1775 return false; 1776 } 1777 1778 template <class T> void addValue(const T &V) { 1779 assert(Location != nullptr && 1780 "cl::location(...) not specified for a command " 1781 "line option with external storage!"); 1782 *Location |= Bit(V); 1783 } 1784 1785 unsigned getBits() { return *Location; } 1786 1787 void clear() { 1788 if (Location) 1789 *Location = 0; 1790 } 1791 1792 template <class T> bool isSet(const T &V) { 1793 return (*Location & Bit(V)) != 0; 1794 } 1795 }; 1796 1797 // Define how to hold bits. Since we can inherit from a class, we do so. 1798 // This makes us exactly compatible with the bits in all cases that it is used. 1799 // 1800 template <class DataType> class bits_storage<DataType, bool> { 1801 unsigned Bits{0}; // Where to store the bits... 1802 1803 template <class T> static unsigned Bit(const T &V) { 1804 unsigned BitPos = static_cast<unsigned>(V); 1805 assert(BitPos < sizeof(unsigned) * CHAR_BIT && 1806 "enum exceeds width of bit vector!"); 1807 return 1 << BitPos; 1808 } 1809 1810 public: 1811 template <class T> void addValue(const T &V) { Bits |= Bit(V); } 1812 1813 unsigned getBits() { return Bits; } 1814 1815 void clear() { Bits = 0; } 1816 1817 template <class T> bool isSet(const T &V) { return (Bits & Bit(V)) != 0; } 1818 }; 1819 1820 //===----------------------------------------------------------------------===// 1821 // A bit vector of command options. 1822 // 1823 template <class DataType, class Storage = bool, 1824 class ParserClass = parser<DataType>> 1825 class bits : public Option, public bits_storage<DataType, Storage> { 1826 std::vector<unsigned> Positions; 1827 ParserClass Parser; 1828 1829 enum ValueExpected getValueExpectedFlagDefault() const override { 1830 return Parser.getValueExpectedFlagDefault(); 1831 } 1832 1833 void getExtraOptionNames(SmallVectorImpl<StringRef> &OptionNames) override { 1834 return Parser.getExtraOptionNames(OptionNames); 1835 } 1836 1837 bool handleOccurrence(unsigned pos, StringRef ArgName, 1838 StringRef Arg) override { 1839 typename ParserClass::parser_data_type Val = 1840 typename ParserClass::parser_data_type(); 1841 if (Parser.parse(*this, ArgName, Arg, Val)) 1842 return true; // Parse Error! 1843 this->addValue(Val); 1844 setPosition(pos); 1845 Positions.push_back(pos); 1846 Callback(Val); 1847 return false; 1848 } 1849 1850 // Forward printing stuff to the parser... 1851 size_t getOptionWidth() const override { 1852 return Parser.getOptionWidth(*this); 1853 } 1854 1855 void printOptionInfo(size_t GlobalWidth) const override { 1856 Parser.printOptionInfo(*this, GlobalWidth); 1857 } 1858 1859 // Unimplemented: bits options don't currently store their default values. 1860 void printOptionValue(size_t /*GlobalWidth*/, bool /*Force*/) const override { 1861 } 1862 1863 void setDefault() override { bits_storage<DataType, Storage>::clear(); } 1864 1865 void done() { 1866 addArgument(); 1867 Parser.initialize(); 1868 } 1869 1870 public: 1871 // Command line options should not be copyable 1872 bits(const bits &) = delete; 1873 bits &operator=(const bits &) = delete; 1874 1875 ParserClass &getParser() { return Parser; } 1876 1877 unsigned getPosition(unsigned optnum) const { 1878 assert(optnum < this->size() && "Invalid option index"); 1879 return Positions[optnum]; 1880 } 1881 1882 template <class... Mods> 1883 explicit bits(const Mods &... Ms) 1884 : Option(ZeroOrMore, NotHidden), Parser(*this) { 1885 apply(this, Ms...); 1886 done(); 1887 } 1888 1889 void setCallback( 1890 std::function<void(const typename ParserClass::parser_data_type &)> CB) { 1891 Callback = CB; 1892 } 1893 1894 std::function<void(const typename ParserClass::parser_data_type &)> Callback = 1895 [](const typename ParserClass::parser_data_type &) {}; 1896 }; 1897 1898 //===----------------------------------------------------------------------===// 1899 // Aliased command line option (alias this name to a preexisting name) 1900 // 1901 1902 class alias : public Option { 1903 Option *AliasFor; 1904 1905 bool handleOccurrence(unsigned pos, StringRef /*ArgName*/, 1906 StringRef Arg) override { 1907 return AliasFor->handleOccurrence(pos, AliasFor->ArgStr, Arg); 1908 } 1909 1910 bool addOccurrence(unsigned pos, StringRef /*ArgName*/, StringRef Value, 1911 bool MultiArg = false) override { 1912 return AliasFor->addOccurrence(pos, AliasFor->ArgStr, Value, MultiArg); 1913 } 1914 1915 // Handle printing stuff... 1916 size_t getOptionWidth() const override; 1917 void printOptionInfo(size_t GlobalWidth) const override; 1918 1919 // Aliases do not need to print their values. 1920 void printOptionValue(size_t /*GlobalWidth*/, bool /*Force*/) const override { 1921 } 1922 1923 void setDefault() override { AliasFor->setDefault(); } 1924 1925 ValueExpected getValueExpectedFlagDefault() const override { 1926 return AliasFor->getValueExpectedFlag(); 1927 } 1928 1929 void done() { 1930 if (!hasArgStr()) 1931 error("cl::alias must have argument name specified!"); 1932 if (!AliasFor) 1933 error("cl::alias must have an cl::aliasopt(option) specified!"); 1934 if (!Subs.empty()) 1935 error("cl::alias must not have cl::sub(), aliased option's cl::sub() will be used!"); 1936 Subs = AliasFor->Subs; 1937 Categories = AliasFor->Categories; 1938 addArgument(); 1939 } 1940 1941 public: 1942 // Command line options should not be copyable 1943 alias(const alias &) = delete; 1944 alias &operator=(const alias &) = delete; 1945 1946 void setAliasFor(Option &O) { 1947 if (AliasFor) 1948 error("cl::alias must only have one cl::aliasopt(...) specified!"); 1949 AliasFor = &O; 1950 } 1951 1952 template <class... Mods> 1953 explicit alias(const Mods &... Ms) 1954 : Option(Optional, Hidden), AliasFor(nullptr) { 1955 apply(this, Ms...); 1956 done(); 1957 } 1958 }; 1959 1960 // Modifier to set the option an alias aliases. 1961 struct aliasopt { 1962 Option &Opt; 1963 1964 explicit aliasopt(Option &O) : Opt(O) {} 1965 1966 void apply(alias &A) const { A.setAliasFor(Opt); } 1967 }; 1968 1969 // Provide additional help at the end of the normal help output. All occurrences 1970 // of cl::extrahelp will be accumulated and printed to stderr at the end of the 1971 // regular help, just before exit is called. 1972 struct extrahelp { 1973 StringRef morehelp; 1974 1975 explicit extrahelp(StringRef help); 1976 }; 1977 1978 void PrintVersionMessage(); 1979 1980 /// This function just prints the help message, exactly the same way as if the 1981 /// -help or -help-hidden option had been given on the command line. 1982 /// 1983 /// \param Hidden if true will print hidden options 1984 /// \param Categorized if true print options in categories 1985 void PrintHelpMessage(bool Hidden = false, bool Categorized = false); 1986 1987 //===----------------------------------------------------------------------===// 1988 // Public interface for accessing registered options. 1989 // 1990 1991 /// Use this to get a StringMap to all registered named options 1992 /// (e.g. -help). 1993 /// 1994 /// \return A reference to the StringMap used by the cl APIs to parse options. 1995 /// 1996 /// Access to unnamed arguments (i.e. positional) are not provided because 1997 /// it is expected that the client already has access to these. 1998 /// 1999 /// Typical usage: 2000 /// \code 2001 /// main(int argc,char* argv[]) { 2002 /// StringMap<llvm::cl::Option*> &opts = llvm::cl::getRegisteredOptions(); 2003 /// assert(opts.count("help") == 1) 2004 /// opts["help"]->setDescription("Show alphabetical help information") 2005 /// // More code 2006 /// llvm::cl::ParseCommandLineOptions(argc,argv); 2007 /// //More code 2008 /// } 2009 /// \endcode 2010 /// 2011 /// This interface is useful for modifying options in libraries that are out of 2012 /// the control of the client. The options should be modified before calling 2013 /// llvm::cl::ParseCommandLineOptions(). 2014 /// 2015 /// Hopefully this API can be deprecated soon. Any situation where options need 2016 /// to be modified by tools or libraries should be handled by sane APIs rather 2017 /// than just handing around a global list. 2018 StringMap<Option *> & 2019 getRegisteredOptions(SubCommand &Sub = SubCommand::getTopLevel()); 2020 2021 /// Use this to get all registered SubCommands from the provided parser. 2022 /// 2023 /// \return A range of all SubCommand pointers registered with the parser. 2024 /// 2025 /// Typical usage: 2026 /// \code 2027 /// main(int argc, char* argv[]) { 2028 /// llvm::cl::ParseCommandLineOptions(argc, argv); 2029 /// for (auto* S : llvm::cl::getRegisteredSubcommands()) { 2030 /// if (*S) { 2031 /// std::cout << "Executing subcommand: " << S->getName() << std::endl; 2032 /// // Execute some function based on the name... 2033 /// } 2034 /// } 2035 /// } 2036 /// \endcode 2037 /// 2038 /// This interface is useful for defining subcommands in libraries and 2039 /// the dispatch from a single point (like in the main function). 2040 iterator_range<typename SmallPtrSet<SubCommand *, 4>::iterator> 2041 getRegisteredSubcommands(); 2042 2043 //===----------------------------------------------------------------------===// 2044 // Standalone command line processing utilities. 2045 // 2046 2047 /// Tokenizes a command line that can contain escapes and quotes. 2048 // 2049 /// The quoting rules match those used by GCC and other tools that use 2050 /// libiberty's buildargv() or expandargv() utilities, and do not match bash. 2051 /// They differ from buildargv() on treatment of backslashes that do not escape 2052 /// a special character to make it possible to accept most Windows file paths. 2053 /// 2054 /// \param [in] Source The string to be split on whitespace with quotes. 2055 /// \param [in] Saver Delegates back to the caller for saving parsed strings. 2056 /// \param [in] MarkEOLs true if tokenizing a response file and you want end of 2057 /// lines and end of the response file to be marked with a nullptr string. 2058 /// \param [out] NewArgv All parsed strings are appended to NewArgv. 2059 void TokenizeGNUCommandLine(StringRef Source, StringSaver &Saver, 2060 SmallVectorImpl<const char *> &NewArgv, 2061 bool MarkEOLs = false); 2062 2063 /// Tokenizes a string of Windows command line arguments, which may contain 2064 /// quotes and escaped quotes. 2065 /// 2066 /// See MSDN docs for CommandLineToArgvW for information on the quoting rules. 2067 /// http://msdn.microsoft.com/en-us/library/windows/desktop/17w5ykft(v=vs.85).aspx 2068 /// 2069 /// For handling a full Windows command line including the executable name at 2070 /// the start, see TokenizeWindowsCommandLineFull below. 2071 /// 2072 /// \param [in] Source The string to be split on whitespace with quotes. 2073 /// \param [in] Saver Delegates back to the caller for saving parsed strings. 2074 /// \param [in] MarkEOLs true if tokenizing a response file and you want end of 2075 /// lines and end of the response file to be marked with a nullptr string. 2076 /// \param [out] NewArgv All parsed strings are appended to NewArgv. 2077 void TokenizeWindowsCommandLine(StringRef Source, StringSaver &Saver, 2078 SmallVectorImpl<const char *> &NewArgv, 2079 bool MarkEOLs = false); 2080 2081 /// Tokenizes a Windows command line while attempting to avoid copies. If no 2082 /// quoting or escaping was used, this produces substrings of the original 2083 /// string. If a token requires unquoting, it will be allocated with the 2084 /// StringSaver. 2085 void TokenizeWindowsCommandLineNoCopy(StringRef Source, StringSaver &Saver, 2086 SmallVectorImpl<StringRef> &NewArgv); 2087 2088 /// Tokenizes a Windows full command line, including command name at the start. 2089 /// 2090 /// This uses the same syntax rules as TokenizeWindowsCommandLine for all but 2091 /// the first token. But the first token is expected to be parsed as the 2092 /// executable file name in the way CreateProcess would do it, rather than the 2093 /// way the C library startup code would do it: CreateProcess does not consider 2094 /// that \ is ever an escape character (because " is not a valid filename char, 2095 /// hence there's never a need to escape it to be used literally). 2096 /// 2097 /// Parameters are the same as for TokenizeWindowsCommandLine. In particular, 2098 /// if you set MarkEOLs = true, then the first word of every line will be 2099 /// parsed using the special rules for command names, making this function 2100 /// suitable for parsing a file full of commands to execute. 2101 void TokenizeWindowsCommandLineFull(StringRef Source, StringSaver &Saver, 2102 SmallVectorImpl<const char *> &NewArgv, 2103 bool MarkEOLs = false); 2104 2105 /// String tokenization function type. Should be compatible with either 2106 /// Windows or Unix command line tokenizers. 2107 using TokenizerCallback = void (*)(StringRef Source, StringSaver &Saver, 2108 SmallVectorImpl<const char *> &NewArgv, 2109 bool MarkEOLs); 2110 2111 /// Tokenizes content of configuration file. 2112 /// 2113 /// \param [in] Source The string representing content of config file. 2114 /// \param [in] Saver Delegates back to the caller for saving parsed strings. 2115 /// \param [out] NewArgv All parsed strings are appended to NewArgv. 2116 /// \param [in] MarkEOLs Added for compatibility with TokenizerCallback. 2117 /// 2118 /// It works like TokenizeGNUCommandLine with ability to skip comment lines. 2119 /// 2120 void tokenizeConfigFile(StringRef Source, StringSaver &Saver, 2121 SmallVectorImpl<const char *> &NewArgv, 2122 bool MarkEOLs = false); 2123 2124 /// Contains options that control response file expansion. 2125 class ExpansionContext { 2126 /// Provides persistent storage for parsed strings. 2127 StringSaver Saver; 2128 2129 /// Tokenization strategy. Typically Unix or Windows. 2130 TokenizerCallback Tokenizer; 2131 2132 /// File system used for all file access when running the expansion. 2133 vfs::FileSystem *FS; 2134 2135 /// Path used to resolve relative rsp files. If empty, the file system 2136 /// current directory is used instead. 2137 StringRef CurrentDir; 2138 2139 /// Directories used for search of config files. 2140 ArrayRef<StringRef> SearchDirs; 2141 2142 /// True if names of nested response files must be resolved relative to 2143 /// including file. 2144 bool RelativeNames = false; 2145 2146 /// If true, mark end of lines and the end of the response file with nullptrs 2147 /// in the Argv vector. 2148 bool MarkEOLs = false; 2149 2150 /// If true, body of config file is expanded. 2151 bool InConfigFile = false; 2152 2153 llvm::Error expandResponseFile(StringRef FName, 2154 SmallVectorImpl<const char *> &NewArgv); 2155 2156 public: 2157 ExpansionContext(BumpPtrAllocator &A, TokenizerCallback T); 2158 2159 ExpansionContext &setMarkEOLs(bool X) { 2160 MarkEOLs = X; 2161 return *this; 2162 } 2163 2164 ExpansionContext &setRelativeNames(bool X) { 2165 RelativeNames = X; 2166 return *this; 2167 } 2168 2169 ExpansionContext &setCurrentDir(StringRef X) { 2170 CurrentDir = X; 2171 return *this; 2172 } 2173 2174 ExpansionContext &setSearchDirs(ArrayRef<StringRef> X) { 2175 SearchDirs = X; 2176 return *this; 2177 } 2178 2179 ExpansionContext &setVFS(vfs::FileSystem *X) { 2180 FS = X; 2181 return *this; 2182 } 2183 2184 /// Looks for the specified configuration file. 2185 /// 2186 /// \param[in] FileName Name of the file to search for. 2187 /// \param[out] FilePath File absolute path, if it was found. 2188 /// \return True if file was found. 2189 /// 2190 /// If the specified file name contains a directory separator, it is searched 2191 /// for by its absolute path. Otherwise looks for file sequentially in 2192 /// directories specified by SearchDirs field. 2193 bool findConfigFile(StringRef FileName, SmallVectorImpl<char> &FilePath); 2194 2195 /// Reads command line options from the given configuration file. 2196 /// 2197 /// \param [in] CfgFile Path to configuration file. 2198 /// \param [out] Argv Array to which the read options are added. 2199 /// \return true if the file was successfully read. 2200 /// 2201 /// It reads content of the specified file, tokenizes it and expands "@file" 2202 /// commands resolving file names in them relative to the directory where 2203 /// CfgFilename resides. It also expands "<CFGDIR>" to the base path of the 2204 /// current config file. 2205 Error readConfigFile(StringRef CfgFile, SmallVectorImpl<const char *> &Argv); 2206 2207 /// Expands constructs "@file" in the provided array of arguments recursively. 2208 Error expandResponseFiles(SmallVectorImpl<const char *> &Argv); 2209 }; 2210 2211 /// A convenience helper which concatenates the options specified by the 2212 /// environment variable EnvVar and command line options, then expands 2213 /// response files recursively. 2214 /// \return true if all @files were expanded successfully or there were none. 2215 bool expandResponseFiles(int Argc, const char *const *Argv, const char *EnvVar, 2216 SmallVectorImpl<const char *> &NewArgv); 2217 2218 /// A convenience helper which supports the typical use case of expansion 2219 /// function call. 2220 bool ExpandResponseFiles(StringSaver &Saver, TokenizerCallback Tokenizer, 2221 SmallVectorImpl<const char *> &Argv); 2222 2223 /// A convenience helper which concatenates the options specified by the 2224 /// environment variable EnvVar and command line options, then expands response 2225 /// files recursively. The tokenizer is a predefined GNU or Windows one. 2226 /// \return true if all @files were expanded successfully or there were none. 2227 bool expandResponseFiles(int Argc, const char *const *Argv, const char *EnvVar, 2228 StringSaver &Saver, 2229 SmallVectorImpl<const char *> &NewArgv); 2230 2231 /// Mark all options not part of this category as cl::ReallyHidden. 2232 /// 2233 /// \param Category the category of options to keep displaying 2234 /// 2235 /// Some tools (like clang-format) like to be able to hide all options that are 2236 /// not specific to the tool. This function allows a tool to specify a single 2237 /// option category to display in the -help output. 2238 void HideUnrelatedOptions(cl::OptionCategory &Category, 2239 SubCommand &Sub = SubCommand::getTopLevel()); 2240 2241 /// Mark all options not part of the categories as cl::ReallyHidden. 2242 /// 2243 /// \param Categories the categories of options to keep displaying. 2244 /// 2245 /// Some tools (like clang-format) like to be able to hide all options that are 2246 /// not specific to the tool. This function allows a tool to specify a single 2247 /// option category to display in the -help output. 2248 void HideUnrelatedOptions(ArrayRef<const cl::OptionCategory *> Categories, 2249 SubCommand &Sub = SubCommand::getTopLevel()); 2250 2251 /// Reset all command line options to a state that looks as if they have 2252 /// never appeared on the command line. This is useful for being able to parse 2253 /// a command line multiple times (especially useful for writing tests). 2254 void ResetAllOptionOccurrences(); 2255 2256 /// Reset the command line parser back to its initial state. This 2257 /// removes 2258 /// all options, categories, and subcommands and returns the parser to a state 2259 /// where no options are supported. 2260 void ResetCommandLineParser(); 2261 2262 /// Parses `Arg` into the option handler `Handler`. 2263 bool ProvidePositionalOption(Option *Handler, StringRef Arg, int i); 2264 2265 } // end namespace cl 2266 2267 } // end namespace llvm 2268 2269 #endif // LLVM_SUPPORT_COMMANDLINE_H 2270