31#include "llvm/Config/config.h"
52#define DEBUG_TYPE "commandline"
73#if !(defined(LLVM_ENABLE_LLVM_EXPORT_ANNOTATIONS) && defined(_MSC_VER))
90void GenericOptionValue::anchor() {}
91void OptionValue<boolOrDefault>::anchor() {}
92void OptionValue<std::string>::anchor() {}
93void Option::anchor() {}
128 size_t Len = ArgName.
size();
136 for (
size_t I = 0;
I < Pad; ++
I) {
156 OS <<
argPrefix(Arg.ArgName, Arg.Pad) << Arg.ArgName;
160class CommandLineParser {
164 std::string ProgramName;
168 std::vector<StringRef> MoreHelp;
180 size_t NumIndexedLibraries = 0;
195 if (Opt.
Subs.empty()) {
200 for (
auto *SC : RegisteredSubCommands)
205 for (
auto *SC : Opt.
Subs) {
207 "SubCommand::getAll() should not be used with other subcommands");
216 errs() << ProgramName <<
": CommandLine Error: Option '" << Name
217 <<
"' registered more than once!\n";
224 Opt, [&](
SubCommand &SC) { addLiteralOption(Opt, &SC, Name); });
228 bool HadErrors =
false;
229 if (O->hasArgStr()) {
234 (RegisteredSubCommands.
contains(SC) &&
235 LibraryIndex.
contains(O->ArgStr))) {
236 errs() << ProgramName <<
": CommandLine Error: Option '" << O->ArgStr
237 <<
"' registered more than once!\n";
247 O->error(
"Cannot specify more than one option with cl::ConsumeAfter!");
261 void addOption(
Option *O) {
262 forEachSubCommand(*O, [&](
SubCommand &SC) { addOption(O, &SC); });
267 O->getExtraOptionNames(OptionNames);
272 for (
auto Name : OptionNames) {
273 auto I =
Sub.OptionsMap.find(Name);
276 if (
I !=
Sub.OptionsMap.end() &&
I->second == O)
277 Sub.OptionsMap.erase(
I);
281 for (
auto *Opt =
Sub.PositionalOpts.begin();
282 Opt !=
Sub.PositionalOpts.end(); ++Opt) {
284 Sub.PositionalOpts.erase(Opt);
288 else if (O ==
Sub.ConsumeAfterOpt)
289 Sub.ConsumeAfterOpt =
nullptr;
292 void removeOption(
Option *O) {
293 forEachSubCommand(*O, [&](
SubCommand &SC) { removeOption(O, &SC); });
297 return (!
Sub.OptionsMap.empty() || !
Sub.PositionalOpts.empty() ||
298 nullptr !=
Sub.ConsumeAfterOpt);
301 bool hasOptions()
const {
302 for (
const auto *S : RegisteredSubCommands) {
306 return !Libraries.
empty();
309 bool hasNamedSubCommands()
const {
310 for (
const auto *S : RegisteredSubCommands)
311 if (!S->getName().empty())
316 SubCommand *getActiveSubCommand() {
return ActiveSubCommand; }
320 if (!
Sub.OptionsMap.insert(std::make_pair(NewName, O)).second) {
321 errs() << ProgramName <<
": CommandLine Error: Option '" << O->ArgStr
322 <<
"' registered more than once!\n";
325 Sub.OptionsMap.erase(O->ArgStr);
329 forEachSubCommand(*O,
330 [&](
SubCommand &SC) { updateArgStr(O, NewName, &SC); });
333 void printOptionValues();
335 void indexLibraryOptions() {
336 bool HadErrors =
false;
337 for (; NumIndexedLibraries != Libraries.
size(); ++NumIndexedLibraries) {
341 auto [It, Inserted] = LibraryIndex.
try_emplace(Name, L);
342 if (Inserted ?
none_of(RegisteredSubCommands,
348 errs() << ProgramName <<
": CommandLine Error: Option '" << Name
349 <<
"' registered more than once!\n";
359 indexLibraryOptions();
360 return LibraryIndex.
lookup(Name);
368 "Duplicate option categories");
376 return (!
sub->getName().empty()) &&
377 (
Sub->getName() ==
sub->getName());
379 "Duplicate subcommands");
385 "SubCommand::getAll() should not be registered");
388 if (O->isPositional() || O->isConsumeAfter() || O->hasArgStr())
391 addLiteralOption(*O,
sub,
E.first);
402 RegisteredSubCommands.
end());
406 ActiveSubCommand =
nullptr;
411 RegisteredOptionCategories.
clear();
414 RegisteredSubCommands.
clear();
416 LibraryIndex.
clear();
417 NumIndexedLibraries = 0;
440 return *GlobalParser;
443template <
typename T, T TrueVal, T FalseVal>
447 if (!Arg.
data() || Arg ==
"true" || Arg ==
"1") {
452 if (Arg ==
"false" || Arg ==
"0") {
456 return O.error(
"'" + Arg +
457 "' is invalid value for boolean argument! Try 0 or 1");
469 : NumOccurrences(0), Occurrences(OccurrencesFlag), Value(0),
471 FullyInitialized(
false), Position(0) {
477 FullyInitialized =
true;
483 if (FullyInitialized)
505void OptionCategory::registerCategory() {
516 return *TopLevelSubCommand;
522 return *AllSubCommands;
540SubCommand::operator
bool()
const {
558 size_t EqualPos = Arg.
find(
'=');
563 return Sub.OptionsMap.lookup(Arg);
569 auto I =
Sub.OptionsMap.find(Arg.
substr(0, EqualPos));
570 if (
I ==
Sub.OptionsMap.end())
578 Arg = Arg.
substr(0, EqualPos);
583 std::string &NearestString) {
588 for (
auto *S : RegisteredSubCommands) {
590 "SubCommand::getAll() is not expected in RegisteredSubCommands");
591 if (S->getName().empty())
594 if (S->getName() == Name)
597 if (!NearestMatch && S->getName().edit_distance(Name) < 2)
602 NearestString = NearestMatch->
getName();
613 std::string &NearestString) {
619 std::pair<StringRef, StringRef> SplitArg = Arg.
split(
'=');
625 unsigned BestDistance = 0;
626 for (
const auto &[
_, O] : OptionsMap) {
632 O->getExtraOptionNames(OptionNames);
638 for (
const auto &Name : OptionNames) {
640 Flag,
true, BestDistance);
641 if (!Best || Distance < BestDistance) {
643 BestDistance = Distance;
644 if (
RHS.empty() || !PermitValue)
645 NearestString = std::string(Name);
647 NearestString = (
Twine(Name) +
"=" +
RHS).str();
670 Val = Val.
substr(Pos + 1);
686 const char *
const *argv,
int &i) {
694 return Handler->
error(
"requires a value!");
696 assert(argv &&
"null check");
721 for (; !Name.empty(); Name = Name.drop_back()) {
723 if (O && (O->getFormattingFlag() ==
cl::Prefix ||
768 return C ==
' ' ||
C ==
'\t' ||
C ==
'\r' ||
C ==
'\n';
775static bool isQuote(
char C) {
return C ==
'\"' ||
C ==
'\''; }
781 bool InToken =
false;
782 for (
size_t I = 0, E = Src.size();
I != E; ++
I) {
787 if (MarkEOLs && Src[
I] ==
'\n')
799 if (
I + 1 < E &&
C ==
'\\') {
808 while (
I != E && Src[
I] !=
C) {
810 if (Src[
I] ==
'\\' &&
I + 1 != E)
824 if (MarkEOLs &&
C ==
'\n')
858 size_t E = Src.size();
859 int BackslashCount = 0;
864 }
while (
I !=
E && Src[
I] ==
'\\');
866 bool FollowedByDoubleQuote = (
I !=
E && Src[
I] ==
'"');
867 if (FollowedByDoubleQuote) {
868 Token.
append(BackslashCount / 2,
'\\');
869 if (BackslashCount % 2 == 0)
874 Token.
append(BackslashCount,
'\\');
892 bool AlwaysCopy,
function_ref<
void()> MarkEOL,
bool InitialCommandName) {
901 bool CommandName = InitialCommandName;
904 enum {
INIT, UNQUOTED, QUOTED } State =
INIT;
906 for (
size_t I = 0,
E = Src.size();
I <
E; ++
I) {
909 assert(Token.
empty() &&
"token should be empty in initial state");
931 AddToken(AlwaysCopy ? Saver.
save(NormalChars) : NormalChars);
932 if (
I <
E && Src[
I] ==
'\n') {
934 CommandName = InitialCommandName;
938 }
else if (Src[
I] ==
'\"') {
939 Token += NormalChars;
941 }
else if (Src[
I] ==
'\\') {
942 assert(!CommandName &&
"or else we'd have treated it as a normal char");
943 Token += NormalChars;
957 AddToken(Saver.
save(Token.
str()));
959 if (Src[
I] ==
'\n') {
960 CommandName = InitialCommandName;
966 }
else if (Src[
I] ==
'\"') {
968 }
else if (Src[
I] ==
'\\' && !CommandName) {
976 if (Src[
I] ==
'\"') {
977 if (
I < (
E - 1) && Src[
I + 1] ==
'"') {
986 }
else if (Src[
I] ==
'\\' && !CommandName) {
996 AddToken(Saver.
save(Token.
str()));
1003 auto OnEOL = [&]() {
1008 true, OnEOL,
false);
1014 auto OnEOL = []() {};
1023 auto OnEOL = [&]() {
1034 for (
const char *Cur = Source.begin(); Cur != Source.end();) {
1043 while (Cur != Source.end() && *Cur !=
'\n')
1051 const char *Start = Cur;
1052 const char *LineEnd =
nullptr;
1054 bool AtTokenStart =
true;
1055 for (
const char *End = Source.end(); Cur != End; ++Cur) {
1058 if (Cur + 1 != End) {
1061 (*Cur ==
'\r' && (Cur + 1 != End) && Cur[1] ==
'\n')) {
1062 Line.append(Start, Cur - 1);
1070 AtTokenStart =
false;
1080 }
else if (
C ==
'#' && AtTokenStart) {
1082 while (Cur != End && *Cur !=
'\n')
1089 Line.append(Start, LineEnd ? LineEnd : Cur);
1097 return (S.
size() >= 3 && S[0] ==
'\xef' && S[1] ==
'\xbb' && S[2] ==
'\xbf');
1111 TokenPos = ArgString.
find(Token, StartPos)) {
1115 if (ResponseFile.
empty())
1119 ResponseFile.
append(BasePath);
1120 StartPos = TokenPos + Token.
size();
1123 if (!ResponseFile.
empty()) {
1126 if (!Remaining.
empty())
1133Error ExpansionContext::expandResponseFile(
1134 StringRef FName, SmallVectorImpl<const char *> &NewArgv) {
1136 llvm::ErrorOr<std::unique_ptr<MemoryBuffer>> MemBufOrErr =
1137 FS->getBufferForFile(FName);
1141 "': " +
EC.message());
1143 MemoryBuffer &MemBuf = *MemBufOrErr.
get();
1148 std::string UTF8Buf;
1152 "Could not convert UTF16 to UTF8");
1153 Str = StringRef(UTF8Buf);
1159 Str = StringRef(BufRef.data() + 3, BufRef.size() - 3);
1162 Tokenizer(Str, Saver, NewArgv, MarkEOLs);
1167 if (!RelativeNames && !InConfigFile)
1171 for (
const char *&Arg : NewArgv) {
1181 StringRef ArgStr(Arg);
1183 bool ConfigInclusion =
false;
1184 if (ArgStr.consume_front(
"@")) {
1188 }
else if (ArgStr.consume_front(
"--config=")) {
1190 ConfigInclusion =
true;
1196 SmallString<128> ResponseFile;
1199 SmallString<128> FilePath;
1202 std::make_error_code(std::errc::no_such_file_or_directory),
1203 "cannot not find configuration file: " + FileName);
1204 ResponseFile.
append(FilePath);
1206 ResponseFile.
append(BasePath);
1209 Arg = Saver.save(ResponseFile.
str()).
data();
1218 struct ResponseFileRecord {
1233 for (
unsigned I = 0;
I != Argv.
size();) {
1234 while (
I == FileStack.
back().End) {
1240 const char *Arg = Argv[
I];
1242 if (Arg ==
nullptr) {
1247 if (Arg[0] !=
'@') {
1252 const char *FName = Arg + 1;
1257 if (CurrentDir.empty()) {
1258 if (
auto CWD = FS->getCurrentWorkingDirectory()) {
1262 CWD.getError(),
Twine(
"cannot get absolute path for: ") + FName);
1265 CurrDir = CurrentDir;
1268 FName = CurrDir.
c_str();
1272 if (!Res || !Res->exists()) {
1273 std::error_code EC = Res.
getError();
1274 if (!InConfigFile) {
1285 "': " + EC.message());
1290 [FileStatus,
this](
const ResponseFileRecord &RFile) ->
ErrorOr<bool> {
1302 R.getError(),
Twine(
"recursive expansion of: '") +
F.File +
"'");
1305 Twine(
"cannot open file: ") +
F.File);
1312 if (
Error Err = expandResponseFile(FName, ExpandedArgv))
1315 for (ResponseFileRecord &
Record : FileStack) {
1346 Tokenize(*EnvValue, Saver, NewArgv,
false);
1349 NewArgv.
append(Argv + 1, Argv + Argc);
1370 : Saver(
A), Tokenizer(
T), FS(FS ? FS :
vfs::getRealFileSystem().
get()) {}
1376 auto Status = FS->status(Path);
1384 CfgFilePath = FileName;
1387 if (!FileExists(CfgFilePath))
1394 for (
const StringRef &Dir : SearchDirs) {
1400 if (FileExists(CfgFilePath)) {
1414 if (std::error_code EC = FS->makeAbsolute(AbsPath))
1416 EC,
Twine(
"cannot get absolute path for " + CfgFile));
1417 CfgFile = AbsPath.
str();
1419 InConfigFile =
true;
1420 RelativeNames =
true;
1421 if (
Error Err = expandResponseFile(CfgFile, Argv))
1438 if (std::optional<std::string> EnvValue =
1444 for (
int I = 1;
I < argc; ++
I)
1446 int NewArgc =
static_cast<int>(NewArgv.
size());
1449 return globalParser().ParseCommandLineOptions(NewArgc, &NewArgv[0], Overview,
1454void CommandLineParser::ResetAllOptionOccurrences() {
1458 for (
auto *SC : RegisteredSubCommands) {
1462 Opts.
reserve(SC->OptionsMap.size());
1463 for (
auto &O : SC->OptionsMap)
1467 for (
Option *O : SC->PositionalOpts)
1469 if (SC->ConsumeAfterOpt)
1470 SC->ConsumeAfterOpt->reset();
1474 LibraryArgAlloc.Reset();
1477bool CommandLineParser::ParseCommandLineOptions(
int argc,
1478 const char *
const *argv,
1482 assert(hasOptions() &&
"No options specified!");
1484 ProgramOverview = Overview;
1485 bool IgnoreErrors = Errs;
1490 bool ErrorParsing =
false;
1501 if (
Error Err = ECtx.expandResponseFiles(newArgv)) {
1502 *Errs <<
toString(std::move(Err)) <<
'\n';
1506 argc =
static_cast<int>(newArgv.size());
1510 indexLibraryOptions();
1513 unsigned NumPositionalRequired = 0;
1516 bool HasUnlimitedPositionals =
false;
1520 std::string NearestSubCommandString;
1521 bool MaybeNamedSubCommand =
1522 argc >= 2 && argv[FirstArg][0] !=
'-' && hasNamedSubCommands();
1523 if (MaybeNamedSubCommand) {
1527 LookupSubCommand(
StringRef(argv[FirstArg]), NearestSubCommandString);
1533 assert(ChosenSubCommand);
1536 auto &OptionsMap = ChosenSubCommand->
OptionsMap;
1538 if (ConsumeAfterOpt) {
1539 assert(PositionalOpts.size() > 0 &&
1540 "Cannot specify cl::ConsumeAfter without a positional argument!");
1542 if (!PositionalOpts.empty()) {
1545 bool UnboundedFound =
false;
1546 for (
size_t i = 0, e = PositionalOpts.size(); i != e; ++i) {
1547 Option *Opt = PositionalOpts[i];
1549 ++NumPositionalRequired;
1550 else if (ConsumeAfterOpt) {
1553 if (PositionalOpts.size() > 1) {
1555 Opt->
error(
"error - this positional option will never be matched, "
1556 "because it does not Require a value, and a "
1557 "cl::ConsumeAfter option is active!");
1558 ErrorParsing =
true;
1560 }
else if (UnboundedFound && !Opt->
hasArgStr()) {
1566 Opt->
error(
"error - option can never match, because "
1567 "another positional argument will match an "
1568 "unbounded number of values, and this option"
1569 " does not require a value!");
1570 *Errs << ProgramName <<
": CommandLine Error: Option '" << Opt->
ArgStr
1571 <<
"' is all messed up!\n";
1572 *Errs << PositionalOpts.size();
1573 ErrorParsing =
true;
1577 HasUnlimitedPositionals = UnboundedFound || ConsumeAfterOpt;
1588 Option *ActivePositionalArg =
nullptr;
1591 bool DashDashFound =
false;
1592 for (
int i = FirstArg; i < argc; ++i) {
1593 Option *Handler =
nullptr;
1594 std::string NearestHandlerString;
1596 StringRef ArgName =
"";
1602 if (argv[i][0] !=
'-' || argv[i][1] == 0 || DashDashFound) {
1604 if (ActivePositionalArg) {
1609 if (!PositionalOpts.empty()) {
1610 PositionalVals.
push_back(std::make_pair(StringRef(argv[i]), i));
1615 if (PositionalVals.
size() >= NumPositionalRequired && ConsumeAfterOpt) {
1616 for (++i; i < argc; ++i)
1617 PositionalVals.
push_back(std::make_pair(StringRef(argv[i]), i));
1624 }
else if (argv[i][0] ==
'-' && argv[i][1] ==
'-' && argv[i][2] == 0 &&
1626 DashDashFound =
true;
1628 }
else if (ActivePositionalArg &&
1633 ArgName = StringRef(argv[i] + 1);
1637 Handler = LookupOption(*ChosenSubCommand, ArgName,
Value);
1643 ArgName = StringRef(argv[i] + 1);
1647 Handler = LookupOption(*ChosenSubCommand, ArgName,
Value);
1658 StringSaver Saver(LibraryArgAlloc);
1659 const char *
Args[2];
1660 unsigned NumArgs = std::min(argc - i, 2);
1661 for (
unsigned J = 0; J != NumArgs; ++J)
1662 Args[J] = Saver.
save(argv[i + J]).
data();
1665 *Errs << ProgramName <<
": " <<
toString(std::move(
E)) <<
'\n';
1666 ErrorParsing =
true;
1684 auto ReportUnknownArgument = [&](
bool IsArg,
1685 StringRef NearestArgumentName) {
1686 *Errs << ProgramName <<
": Unknown "
1687 << (IsArg ?
"command line argument" :
"subcommand") <<
" '"
1688 << argv[i] <<
"'. Try: '" << argv[0] <<
" --help'\n";
1690 if (NearestArgumentName.empty())
1693 *Errs << ProgramName <<
": Did you mean '";
1695 *Errs << PrintArg(NearestArgumentName, 0);
1697 *Errs << NearestArgumentName;
1701 if (i > 1 || !MaybeNamedSubCommand)
1702 ReportUnknownArgument(
true, NearestHandlerString);
1704 ReportUnknownArgument(
false, NearestSubCommandString);
1706 ErrorParsing =
true;
1714 Handler->
error(
"This argument does not take a value.\n"
1715 "\tInstead, it consumes any positional arguments until "
1716 "the next recognized option.", *Errs);
1717 ErrorParsing =
true;
1719 ActivePositionalArg = Handler;
1726 if (NumPositionalRequired > PositionalVals.
size()) {
1727 *Errs << ProgramName
1728 <<
": Not enough positional command line arguments specified!\n"
1729 <<
"Must specify at least " << NumPositionalRequired
1730 <<
" positional argument" << (NumPositionalRequired > 1 ?
"s" :
"")
1731 <<
": See: " << argv[0] <<
" --help\n";
1733 ErrorParsing =
true;
1734 }
else if (!HasUnlimitedPositionals &&
1735 PositionalVals.
size() > PositionalOpts.size()) {
1736 *Errs << ProgramName <<
": Too many positional arguments specified!\n"
1737 <<
"Can specify at most " << PositionalOpts.size()
1738 <<
" positional arguments: See: " << argv[0] <<
" --help\n";
1739 ErrorParsing =
true;
1741 }
else if (!ConsumeAfterOpt) {
1743 unsigned ValNo = 0, NumVals =
static_cast<unsigned>(PositionalVals.
size());
1744 for (
Option *Opt : PositionalOpts) {
1747 PositionalVals[ValNo].second);
1749 --NumPositionalRequired;
1757 while (NumVals - ValNo > NumPositionalRequired && !
Done) {
1765 PositionalVals[ValNo].second);
1770 "positional argument processing!");
1775 assert(ConsumeAfterOpt && NumPositionalRequired <= PositionalVals.
size());
1777 for (
Option *Opt : PositionalOpts)
1780 Opt, PositionalVals[ValNo].first, PositionalVals[ValNo].second);
1789 if (PositionalOpts.size() == 1 && ValNo == 0 && !PositionalVals.
empty()) {
1791 PositionalVals[ValNo].first,
1792 PositionalVals[ValNo].second);
1798 for (; ValNo != PositionalVals.
size(); ++ValNo)
1801 PositionalVals[ValNo].second);
1805 for (
const auto &Opt : OptionsMap) {
1810 Opt.second->
error(
"must be specified at least once!");
1811 ErrorParsing =
true;
1823 for (
int i = 0; i < argc; ++i)
dbgs() << argv[i] <<
' ';
1844 if (!ArgName.
data())
1846 if (ArgName.
empty())
1849 Errs <<
globalParser().ProgramName <<
": for the " << PrintArg(ArgName, 0);
1851 Errs <<
" option: " << Message <<
"\n";
1857 return handleOccurrence(pos, ArgName, Value);
1864 if (O.ValueStr.empty())
1879 size_t FirstLineIndentedBy) {
1880 assert(Indent >= FirstLineIndentedBy);
1881 std::pair<StringRef, StringRef> Split =
HelpStr.split(
'\n');
1884 while (!Split.second.empty()) {
1885 Split = Split.second.split(
'\n');
1886 outs().
indent(Indent) << Split.first <<
"\n";
1891 size_t FirstLineIndentedBy) {
1893 assert(BaseIndent >= FirstLineIndentedBy);
1894 std::pair<StringRef, StringRef> Split =
HelpStr.split(
'\n');
1895 outs().
indent(BaseIndent - FirstLineIndentedBy)
1897 while (!Split.second.empty()) {
1898 Split = Split.second.split(
'\n');
1899 outs().
indent(BaseIndent + ValHelpPrefix.
size()) << Split.first <<
"\n";
1904void alias::printOptionInfo(
size_t GlobalWidth)
const {
1920 if (!ValName.empty()) {
1921 size_t FormattingLen = 3;
1934 size_t GlobalWidth)
const {
1935 outs() << PrintArg(O.ArgStr);
1938 if (!ValName.empty()) {
1944 outs() << (O.ArgStr.size() == 1 ?
" <" :
"=<") <<
getValueStr(O, ValName)
1953 size_t GlobalWidth)
const {
1954 outs() << PrintArg(O.ArgStr);
1955 outs().
indent(GlobalWidth - O.ArgStr.size());
1975template <
typename FixedOrScalableQuantityT>
1978 FixedOrScalableQuantityT &
Value) {
1979 using ScalarTy =
typename FixedOrScalableQuantityT::ScalarTy;
1985 Value = FixedOrScalableQuantityT::getFixed(MinValue);
1991 return O.error(
"'" + Arg +
"' value invalid for " + ValueKind +
1994 Remainder = Remainder.
ltrim();
1996 return O.error(
"'" + Arg +
"' value invalid for " + ValueKind +
1999 Remainder = Remainder.
ltrim();
2001 return O.error(
"'" + Arg +
"' value invalid for " + ValueKind +
2004 Value = FixedOrScalableQuantityT::getScalable(MinValue);
2013 return O.error(
"'" + Arg +
"' value invalid for integer argument!");
2022 return O.error(
"'" + Arg +
"' value invalid for long argument!");
2031 return O.error(
"'" + Arg +
"' value invalid for llong argument!");
2041 return O.error(
"'" + Arg +
"' value invalid for uint argument!");
2048 unsigned long &
Value) {
2051 return O.error(
"'" + Arg +
"' value invalid for ulong argument!");
2059 unsigned long long &
Value) {
2062 return O.error(
"'" + Arg +
"' value invalid for ullong argument!");
2069 ElementCount &
Value) {
2078 return O.error(
"'" + Arg +
"' value invalid for floating point argument!");
2104 for (
unsigned i = 0; i != e; ++i) {
2120 return O.getValueExpectedFlag() !=
ValueOptional || !Name.empty() ||
2121 !Description.
empty();
2126 if (O.hasArgStr()) {
2138 size_t BaseSize = 0;
2149 size_t GlobalWidth)
const {
2150 if (O.hasArgStr()) {
2156 outs() << PrintArg(O.ArgStr);
2175 if (OptionName.
empty()) {
2180 if (!Description.
empty())
2186 if (!O.HelpStr.empty())
2187 outs() <<
" " << O.HelpStr <<
'\n';
2204 outs() <<
" " << PrintArg(O.ArgStr);
2205 outs().
indent(GlobalWidth - O.ArgStr.size());
2208 for (
unsigned i = 0; i != NumOpts; ++i) {
2216 for (
unsigned j = 0; j != NumOpts; ++j) {
2225 outs() <<
"= *unknown option value*\n";
2233 return OS << static_cast<int>(V);
2238#define PRINT_OPT_DIFF(T) \
2239 void parser<T>::printOptionDiff(const Option &O, T V, OptionValue<T> D, \
2240 size_t GlobalWidth) const { \
2241 printOptionName(O, GlobalWidth); \
2244 raw_string_ostream SS(Str); \
2247 outs() << "= " << Str; \
2248 size_t NumSpaces = \
2249 MaxOptWidth > Str.size() ? MaxOptWidth - Str.size() : 0; \
2250 outs().indent(NumSpaces) << " (default: "; \
2252 outs() << D.getValue(); \
2254 outs() << "*no default*"; \
2273 size_t GlobalWidth)
const {
2274 printOptionName(O, GlobalWidth);
2275 outs() <<
"= " << V;
2279 outs() <<
D.getValue();
2281 outs() <<
"*no default*";
2286 const Option &O, std::optional<StringRef> V,
2287 const OptionValue<std::optional<std::string>> &
D,
2288 size_t GlobalWidth)
const {
2289 printOptionName(O, GlobalWidth);
2290 outs() <<
"= " <<
V;
2291 size_t VSize =
V.has_value() ?
V.value().size() : 0;
2294 if (
D.hasValue() &&
D.getValue().has_value())
2295 outs() <<
D.getValue();
2297 outs() <<
"*no value*";
2303 size_t GlobalWidth)
const {
2305 outs() <<
"= *cannot print option value*\n";
2313 const std::pair<const char *, Option *> *
RHS) {
2314 return strcmp(
LHS->first,
RHS->first);
2318 const std::pair<const char *, SubCommand *> *
RHS) {
2319 return strcmp(
LHS->first,
RHS->first);
2328 for (
auto I = OptMap.
begin(),
E = OptMap.
end();
I !=
E; ++
I) {
2334 if (
I->second->getOptionHiddenFlag() ==
Hidden && !ShowHidden)
2338 if (!OptionSet.
insert(
I->second).second)
2342 std::pair<const char *, Option *>(
I->first.data(),
I->second));
2352 for (
auto *S : SubMap) {
2353 if (S->getName().empty())
2355 Subs.push_back(std::make_pair(S->getName().data(), S));
2364 const bool ShowHidden;
2365 using StrOptionPairVector =
2367 using StrSubCommandPairVector =
2370 virtual void printOptions(StrOptionPairVector &Opts,
size_t MaxArgLen) {
2371 for (
const auto &Opt : Opts)
2375 void printSubCommands(StrSubCommandPairVector &Subs,
size_t MaxSubLen) {
2376 for (
const auto &S : Subs) {
2377 outs() <<
" " << S.first;
2378 if (!S.second->getDescription().empty()) {
2380 outs() <<
" - " << S.second->getDescription();
2387 explicit HelpPrinter(
bool showHidden) : ShowHidden(showHidden) {}
2388 virtual ~HelpPrinter() =
default;
2391 void operator=(
bool Value) {
2402 auto &OptionsMap =
Sub->OptionsMap;
2403 auto &PositionalOpts =
Sub->PositionalOpts;
2404 auto &ConsumeAfterOpt =
Sub->ConsumeAfterOpt;
2406 StrOptionPairVector Opts;
2407 sortOpts(OptionsMap, Opts, ShowHidden);
2409 StrSubCommandPairVector Subs;
2418 outs() <<
" [subcommand]";
2419 outs() <<
" [options]";
2421 if (!
Sub->getDescription().empty()) {
2422 outs() <<
"SUBCOMMAND '" <<
Sub->getName()
2423 <<
"': " <<
Sub->getDescription() <<
"\n\n";
2429 for (
auto *Opt : PositionalOpts) {
2436 if (ConsumeAfterOpt)
2437 outs() <<
" " << ConsumeAfterOpt->HelpStr;
2441 size_t MaxSubLen = 0;
2442 for (
const auto &
Sub : Subs)
2443 MaxSubLen = std::max(MaxSubLen, strlen(
Sub.first));
2446 outs() <<
"SUBCOMMANDS:\n\n";
2447 printSubCommands(Subs, MaxSubLen);
2450 <<
" <subcommand> --help\" to get more help on a specific "
2457 size_t MaxArgLen = 0;
2458 for (
const auto &Opt : Opts)
2465 [&](StringRef Spelling, StringRef MetaVar, StringRef
Help) {
2470 for (
const auto &[Name,
Help] : LibraryOpts)
2473 outs() <<
"OPTIONS:\n";
2474 printOptions(Opts, MaxArgLen);
2476 if (!LibraryOpts.empty())
2477 outs() <<
"\nLibrary options:\n\n";
2478 for (
const auto &[Name,
Help] : LibraryOpts) {
2479 outs() << PrintArg(Name);
2490class CategorizedHelpPrinter :
public HelpPrinter {
2492 explicit CategorizedHelpPrinter(
bool showHidden) : HelpPrinter(showHidden) {}
2498 static int OptionCategoryCompare(OptionCategory *
const *
A,
2499 OptionCategory *
const *
B) {
2500 return (*A)->getName().compare((*B)->getName());
2504 using HelpPrinter::operator=;
2507 void printOptions(StrOptionPairVector &Opts,
size_t MaxArgLen)
override {
2508 std::vector<OptionCategory *> SortedCategories;
2509 DenseMap<OptionCategory *, std::vector<Option *>> CategorizedOptions;
2517 assert(SortedCategories.size() > 0 &&
"No option categories registered!");
2519 OptionCategoryCompare);
2524 for (
const auto &
I : Opts) {
2525 Option *Opt =
I.second;
2526 for (OptionCategory *Cat : Opt->
Categories) {
2528 "Option has an unregistered category");
2529 CategorizedOptions[Cat].push_back(Opt);
2534 for (OptionCategory *Category : SortedCategories) {
2536 const auto &CategoryOptions = CategorizedOptions[Category];
2537 if (CategoryOptions.empty())
2542 outs() << Category->getName() <<
":\n";
2545 if (!Category->getDescription().empty())
2546 outs() << Category->getDescription() <<
"\n\n";
2551 for (
const Option *Opt : CategoryOptions)
2559class HelpPrinterWrapper {
2561 HelpPrinter &UncategorizedPrinter;
2562 CategorizedHelpPrinter &CategorizedPrinter;
2565 explicit HelpPrinterWrapper(HelpPrinter &UncategorizedPrinter,
2566 CategorizedHelpPrinter &CategorizedPrinter)
2567 : UncategorizedPrinter(UncategorizedPrinter),
2568 CategorizedPrinter(CategorizedPrinter) {}
2571 void operator=(
bool Value);
2576#if defined(__GNUC__)
2579# if defined(__OPTIMIZE__)
2580# define LLVM_IS_DEBUG_BUILD 0
2582# define LLVM_IS_DEBUG_BUILD 1
2584#elif defined(_MSC_VER)
2589# define LLVM_IS_DEBUG_BUILD 1
2591# define LLVM_IS_DEBUG_BUILD 0
2595# define LLVM_IS_DEBUG_BUILD 0
2599class VersionPrinter {
2601 void print(
const std::vector<VersionPrinterTy> &ExtraPrinters) {
2603#ifdef PACKAGE_VENDOR
2604 OS << PACKAGE_VENDOR <<
" ";
2606 OS <<
"LLVM (http://llvm.org/):\n ";
2608 OS << PACKAGE_NAME <<
" version " << PACKAGE_VERSION <<
"\n ";
2609#if LLVM_IS_DEBUG_BUILD
2610 OS <<
"DEBUG build";
2612 OS <<
"Optimized build";
2615 OS <<
" with assertions";
2621 if (!ExtraPrinters.empty()) {
2622 for (
const auto &
I : ExtraPrinters)
2626 void operator=(
bool OptionWasSpecified);
2629struct CommandLineCommonOptions {
2632 HelpPrinter UncategorizedNormalPrinter{
false};
2633 HelpPrinter UncategorizedHiddenPrinter{
true};
2634 CategorizedHelpPrinter CategorizedNormalPrinter{
false};
2635 CategorizedHelpPrinter CategorizedHiddenPrinter{
true};
2638 HelpPrinterWrapper WrappedNormalPrinter{UncategorizedNormalPrinter,
2639 CategorizedNormalPrinter};
2640 HelpPrinterWrapper WrappedHiddenPrinter{UncategorizedHiddenPrinter,
2641 CategorizedHiddenPrinter};
2651 "Display list of available options (--help-list-hidden for more)"),
2660 cl::desc(
"Display list of all available options"),
2672 cl::desc(
"Display available options (--help-hidden for more)"),
2682 cl::desc(
"Display all available options"),
2691 cl::desc(
"Print non-default options after command line parsing"),
2698 "print-all-options",
2699 cl::desc(
"Print all option values after command line parsing"),
2707 std::vector<VersionPrinterTy> ExtraVersionPrinters;
2710 VersionPrinter VersionPrinterInstance;
2713 "version",
cl::desc(
"Display the version of this program"),
2738 return GeneralCategory;
2741void VersionPrinter::operator=(
bool OptionWasSpecified) {
2742 if (!OptionWasSpecified)
2754void HelpPrinterWrapper::operator=(
bool Value) {
2761 if (
globalParser().RegisteredOptionCategories.size() > 1) {
2766 CategorizedPrinter =
true;
2768 UncategorizedPrinter =
true;
2775void CommandLineParser::printOptionValues() {
2780 sortOpts(ActiveSubCommand->OptionsMap, Opts,
true);
2783 size_t MaxArgLen = 0;
2784 for (
const auto &Opt : Opts)
2787 for (
const auto &Opt : Opts)
2793 if (!
Hidden && !Categorized)
2795 else if (!
Hidden && Categorized)
2797 else if (
Hidden && !Categorized)
2809#if LLVM_IS_DEBUG_BUILD
2815#ifdef EXPENSIVE_CHECKS
2816 "+expensive-checks",
2818#if __has_feature(address_sanitizer)
2821#if __has_feature(dataflow_sanitizer)
2824#if __has_feature(hwaddress_sanitizer)
2827#if __has_feature(memory_sanitizer)
2830#if __has_feature(thread_sanitizer)
2833#if __has_feature(undefined_behavior_sanitizer)
2836#ifdef LLVM_INTEGRATED_CRT_ALLOC
2837 "+alloc:" LLVM_INTEGRATED_CRT_ALLOC,
2845#if LLVM_VERSION_PRINTER_SHOW_BUILD_CONFIG
2846 OS <<
"Build config: ";
2870 return Sub.OptionsMap;
2880 for (
auto &
I :
Sub.OptionsMap) {
2881 bool Unrelated =
true;
2882 for (
auto &Cat :
I.second->Categories) {
2883 if (Cat == &Category || Cat == &
CommonOptions->GenericCategory)
2894 for (
auto &
I :
Sub.OptionsMap) {
2895 bool Unrelated =
true;
2896 for (
auto &Cat :
I.second->Categories) {
2917 const char *Overview) {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static StringRef OptionPrefix
static bool RequiresValue(const Option *O)
static int SubNameCompare(const std::pair< const char *, SubCommand * > *LHS, const std::pair< const char *, SubCommand * > *RHS)
static size_t argPlusPrefixesSize(StringRef ArgName, size_t Pad=DefaultPad)
static bool shouldPrintOption(StringRef Name, StringRef Description, const Option &O)
static bool parseDouble(Option &O, StringRef Arg, double &Value)
static CommandLineParser & globalParser()
static bool parseBool(Option &O, StringRef ArgName, StringRef Arg, T &Value)
static const size_t DefaultPad
static StringRef EmptyOption
static bool hasUTF8ByteOrderMark(ArrayRef< char > S)
static void ExpandBasePaths(StringRef BasePath, StringSaver &Saver, const char *&Arg)
static SmallString< 8 > argPrefix(StringRef ArgName, size_t Pad=DefaultPad)
static StringRef ArgHelpPrefix
void opt_unsigned_anchor()
static bool isWindowsSpecialCharInCommandName(char C)
static StringRef getValueStr(const Option &O, StringRef DefaultMsg)
static Option * HandlePrefixedOption(StringRef &Arg, StringRef &Value, const OptionsMapTy &OptionsMap)
The specified argument string (which started with at least one '-') does not fully match an available...
static size_t getOptionPrefixesSize()
static bool ProvideOption(Option *Handler, StringRef ArgName, StringRef Value, int argc, const char *const *argv, int &i)
ProvideOption - For Value, this differentiates between an empty value ("") and a null value (StringRe...
static bool isQuote(char C)
static ManagedStatic< CommandLineCommonOptions > CommonOptions
static void initCommonOptions()
static void sortOpts(OptionsMapTy &OptMap, SmallVectorImpl< std::pair< const char *, Option * > > &Opts, bool ShowHidden)
DenseMap< StringRef, Option * > OptionsMapTy
static void tokenizeWindowsCommandLineImpl(StringRef Src, StringSaver &Saver, function_ref< void(StringRef)> AddToken, bool AlwaysCopy, function_ref< void()> MarkEOL, bool InitialCommandName)
static Option * findPrefixOption(StringRef Name, size_t &Length, const OptionsMapTy &OptionsMap)
static bool isWhitespace(char C)
static bool parseFixedOrScalableQuantity(Option &O, StringRef Arg, StringRef ValueKind, FixedOrScalableQuantityT &Value)
static size_t parseBackslash(StringRef Src, size_t I, SmallString< 128 > &Token)
Backslashes are interpreted in a rather complicated way in the Windows-style command line,...
static StringRef ArgPrefixLong
static void sortSubCommands(const SmallPtrSetImpl< SubCommand * > &SubMap, SmallVectorImpl< std::pair< const char *, SubCommand * > > &Subs)
#define PRINT_OPT_DIFF(T)
static bool isWhitespaceOrNull(char C)
static const size_t MaxOptWidth
static bool EatsUnboundedNumberOfValues(const Option *O)
static int OptNameCompare(const std::pair< const char *, Option * > *LHS, const std::pair< const char *, Option * > *RHS)
static Option * LookupNearestOption(StringRef Arg, const OptionsMapTy &OptionsMap, std::string &NearestString)
LookupNearestOption - Lookup the closest match to the option specified by the specified option on the...
static StringRef ArgPrefix
static bool isWindowsSpecialChar(char C)
static bool CommaSeparateAndAddOccurrence(Option *Handler, unsigned pos, StringRef ArgName, StringRef Value)
CommaSeparateAndAddOccurrence - A wrapper around Handler->addOccurrence() that does special handling ...
#define LLVM_EXPORT_TEMPLATE
static void Help(StringTable CPUNames, ArrayRef< SubtargetFeatureKV > FeatTable)
Display help for feature and mcpu choices.
Provides a library for accessing information about this process and other processes on the operating ...
This file defines the SmallPtrSet class.
This file defines the SmallString class.
Defines the virtual file system interface vfs::FileSystem.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Represents either an error or a value T.
std::error_code getError() const
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
ManagedStatic - This transparently changes the behavior of global statics to be lazily constructed on...
size_t getBufferSize() const
const char * getBufferEnd() const
const char * getBufferStart() const
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool erase(PtrType Ptr)
Remove pointer from the set.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
void assign(StringRef RHS)
Assign from a StringRef.
void append(StringRef RHS)
Append from a StringRef.
StringRef str() const
Explicit conversion to StringRef.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
static constexpr size_t npos
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
Check if the string is empty.
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
LLVM_ABI unsigned edit_distance(StringRef Other, bool AllowReplacements=true, unsigned MaxEditDistance=0) const
Determine the edit distance between this string and another string.
StringRef slice(size_t Start, size_t End) const
Return a reference to the substring from [Start, End).
constexpr size_t size() const
Get the string size.
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
StringRef ltrim(char Char) const
Return string with consecutive Char characters starting from the the left removed.
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
StringRef trim(char Char) const
Return string with consecutive Char characters starting from the left and right removed.
bool consume_front(char Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
Saves strings in the provided stable storage and returns a StringRef with a stable character pointer.
BumpPtrAllocator & getAllocator() const
StringRef save(const char *S)
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM Value Representation.
Contains options that control response file expansion.
LLVM_ABI ExpansionContext(BumpPtrAllocator &A, TokenizerCallback T, vfs::FileSystem *FS=nullptr)
LLVM_ABI bool findConfigFile(StringRef FileName, SmallVectorImpl< char > &FilePath)
Looks for the specified configuration file.
LLVM_ABI Error expandResponseFiles(SmallVectorImpl< const char * > &Argv)
Expands constructs "@file" in the provided array of arguments recursively.
LLVM_ABI Error readConfigFile(StringRef CfgFile, SmallVectorImpl< const char * > &Argv)
Reads command line options from the given configuration file.
The options of a library that declares them in TableGen rather than as cl::opt (see llvm/Option/Libra...
StringRef getName() const
SmallPtrSet< SubCommand *, 1 > Subs
int getNumOccurrences() const
enum ValueExpected getValueExpectedFlag() const
void addCategory(OptionCategory &C)
enum FormattingFlags getFormattingFlag() const
virtual void printOptionInfo(size_t GlobalWidth) const =0
enum NumOccurrencesFlag getNumOccurrencesFlag() const
virtual bool addOccurrence(unsigned pos, StringRef ArgName, StringRef Value)
SmallVector< OptionCategory *, 1 > Categories
bool error(const Twine &Message, StringRef ArgName=StringRef(), raw_ostream &Errs=llvm::errs())
void setArgStr(StringRef S)
unsigned getMiscFlags() const
virtual void setDefault()=0
virtual void printOptionValue(size_t GlobalWidth, bool Force) const =0
static void printEnumValHelpStr(StringRef HelpStr, size_t Indent, size_t FirstLineIndentedBy)
void removeArgument()
Unregisters this option from the CommandLine system.
static void printHelpStr(StringRef HelpStr, size_t Indent, size_t FirstLineIndentedBy)
virtual size_t getOptionWidth() const =0
Option(enum NumOccurrencesFlag OccurrencesFlag, enum OptionHidden Hidden)
StringRef getName() const
SubCommand(StringRef Name, StringRef Description="")
static LLVM_ABI SubCommand & getTopLevel()
LLVM_ABI void unregisterSubCommand()
static LLVM_ABI SubCommand & getAll()
DenseMap< StringRef, Option * > OptionsMap
LLVM_ABI void registerSubCommand()
SmallVector< Option *, 4 > PositionalOpts
void printOptionInfo(const Option &O, size_t GlobalWidth) const
virtual StringRef getValueName() const
void printOptionNoValue(const Option &O, size_t GlobalWidth) const
size_t getOptionWidth(const Option &O) const
void printOptionName(const Option &O, size_t GlobalWidth) const
virtual size_t getOptionWidth(const Option &O) const
virtual StringRef getDescription(unsigned N) const =0
virtual const GenericOptionValue & getOptionValue(unsigned N) const =0
virtual unsigned getNumOptions() const =0
virtual StringRef getOption(unsigned N) const =0
void printGenericOptionDiff(const Option &O, const GenericOptionValue &V, const GenericOptionValue &Default, size_t GlobalWidth) const
virtual void printOptionInfo(const Option &O, size_t GlobalWidth) const
unsigned findOption(StringRef Name)
bool parse(Option &O, StringRef ArgName, StringRef Arg, DataType &V)
An efficient, type-erasing, non-owning reference to a callable.
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
static LLVM_ABI std::optional< std::string > GetEnv(StringRef name)
The virtual file system interface.
The result of a status operation.
LLVM_ABI bool equivalent(const Status &Other) const
LLVM_C_ABI void LLVMParseCommandLineOptions(int argc, const char *const *argv, const char *Overview)
This function parses the given arguments using the LLVM command line parser.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr size_t NameSize
This namespace contains all of the command line option processing machinery.
LLVM_ABI iterator_range< SmallPtrSet< SubCommand *, 4 >::iterator > getRegisteredSubcommands()
Use this to get all registered SubCommands from the provided parser.
LLVM_ABI void PrintVersionMessage()
Utility function for printing version number.
LLVM_ABI bool ExpandResponseFiles(StringSaver &Saver, TokenizerCallback Tokenizer, SmallVectorImpl< const char * > &Argv)
A convenience helper which supports the typical use case of expansion function call.
LLVM_ABI void TokenizeWindowsCommandLine(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs=false)
Tokenizes a string of Windows command line arguments, which may contain quotes and escaped quotes.
LLVM_ABI OptionCategory & getGeneralCategory()
LLVM_ABI void addLibraryOptions(LibraryOptions &L)
Makes ParseCommandLineOptions recognize L's options.
LLVM_ABI void ResetAllOptionOccurrences()
Reset all command line options to a state that looks as if they have never appeared on the command li...
LLVM_ABI void SetVersionPrinter(VersionPrinterTy func)
===------------------------------------------------------------------—===// Override the default (LLV...
LLVM_ABI void tokenizeConfigFile(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs=false)
Tokenizes content of configuration file.
LLVM_ABI DenseMap< StringRef, Option * > & getRegisteredOptions(SubCommand &Sub=SubCommand::getTopLevel())
Use this to get a map of all registered named options (e.g.
LLVM_ABI bool expandResponseFiles(int Argc, const char *const *Argv, const char *EnvVar, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv)
A convenience helper which concatenates the options specified by the environment variable EnvVar and ...
LLVM_ABI void ResetCommandLineParser()
Reset the command line parser back to its initial state.
LLVM_ABI void PrintOptionValues()
LLVM_ABI void AddLiteralOption(Option &O, StringRef Name)
Adds a new option for parsing and provides the option it refers to.
void printOptionDiff(const Option &O, const generic_parser_base &P, const DT &V, const OptionValue< DT > &Default, size_t GlobalWidth)
LLVM_ABI void TokenizeWindowsCommandLineNoCopy(StringRef Source, StringSaver &Saver, SmallVectorImpl< StringRef > &NewArgv)
Tokenizes a Windows command line while attempting to avoid copies.
LLVM_ABI void printBuildConfig(raw_ostream &OS)
Prints the compiler build configuration.
void(*)(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs) TokenizerCallback
String tokenization function type.
LLVM_ABI bool ProvidePositionalOption(Option *Handler, StringRef Arg, int i)
Parses Arg into the option handler Handler.
static raw_ostream & operator<<(raw_ostream &OS, boolOrDefault V)
initializer< Ty > init(const Ty &Val)
std::function< void(raw_ostream &)> VersionPrinterTy
LLVM_ABI ArrayRef< StringRef > getCompilerBuildConfig()
An array of optional enabled settings in the LLVM build configuration, which may be of interest to co...
LocationClass< Ty > location(Ty &L)
LLVM_ABI bool ParseCommandLineOptions(int argc, const char *const *argv, StringRef Overview="", raw_ostream *Errs=nullptr, vfs::FileSystem *VFS=nullptr, const char *EnvVar=nullptr)
LLVM_ABI void HideUnrelatedOptions(cl::OptionCategory &Category, SubCommand &Sub=SubCommand::getTopLevel())
Mark all options not part of this category as cl::ReallyHidden.
LLVM_ABI void AddExtraVersionPrinter(VersionPrinterTy func)
===------------------------------------------------------------------—===// Add an extra printer to u...
LLVM_ABI void PrintHelpMessage(bool Hidden=false, bool Categorized=false)
This function just prints the help message, exactly the same way as if the -help or -help-hidden opti...
LLVM_ABI void TokenizeWindowsCommandLineFull(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs=false)
Tokenizes a Windows full command line, including command name at the start.
LLVM_ABI void TokenizeGNUCommandLine(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs=false)
Tokenizes a command line that can contain escapes and quotes.
LLVM_ABI StringRef parent_path(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get parent path.
LLVM_ABI bool has_parent_path(const Twine &path, Style style=Style::native)
Has parent path?
LLVM_ABI bool is_relative(const Twine &path, Style style=Style::native)
Is path relative?
LLVM_ABI StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
LLVM_ABI bool is_absolute(const Twine &path, Style style=Style::native)
Is path absolute?
LLVM_ABI void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
LLVM_ABI IntrusiveRefCntPtr< FileSystem > getRealFileSystem()
Gets an vfs::FileSystem for the 'real' file system, as seen by the operating system.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
void initWithColorOptions()
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
LLVM_ABI raw_fd_ostream & outs()
This returns a reference to a raw_fd_ostream for standard output.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
void interleaveComma(const Container &c, StreamT &os, UnaryFunctor each_fn)
LLVM_ABI bool hasUTF16ByteOrderMark(ArrayRef< char > SrcBytes)
Returns true if a blob of text starts with a UTF-16 big or little endian byte order mark.
void initDebugCounterOptions()
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
bool to_float(const Twine &T, float &Num)
@ no_such_file_or_directory
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
LLVM_ABI bool convertUTF16ToUTF8String(ArrayRef< char > SrcBytes, std::string &Out)
Converts a stream of raw bytes assumed to be UTF16 into a UTF8 std::string.
void initSignalsOptions()
void initStatisticOptions()
LLVM_ABI raw_ostream & nulls()
This returns a reference to a raw_ostream which simply discards output.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
void initRandomSeedOptions()
@ Sub
Subtraction of integers.
void initGraphWriterOptions()
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
ArrayRef(const T &OneElt) -> ArrayRef< T >
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
void array_pod_sort(IteratorTy Start, IteratorTy End)
array_pod_sort - This sorts an array with the specified start and end extent.
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.