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) {
165 OS <<
argPrefix(Arg.ArgName, Arg.Pad) << Arg.ArgName;
169class CommandLineParser {
173 std::string ProgramName;
177 std::vector<StringRef> MoreHelp;
197 bool LongOptionsUseDoubleDash =
false);
200 if (Opt.
Subs.empty()) {
205 for (
auto *SC : RegisteredSubCommands)
210 for (
auto *SC : Opt.
Subs) {
212 "SubCommand::getAll() should not be used with other subcommands");
221 errs() << ProgramName <<
": CommandLine Error: Option '" << Name
222 <<
"' registered more than once!\n";
229 Opt, [&](
SubCommand &SC) { addLiteralOption(Opt, &SC, Name); });
233 bool HadErrors =
false;
234 if (O->hasArgStr()) {
241 errs() << ProgramName <<
": CommandLine Error: Option '" << O->ArgStr
242 <<
"' registered more than once!\n";
252 O->error(
"Cannot specify more than one option with cl::ConsumeAfter!");
266 void addOption(
Option *O,
bool ProcessDefaultOption =
false) {
267 if (!ProcessDefaultOption && O->isDefaultOption()) {
271 forEachSubCommand(*O, [&](
SubCommand &SC) { addOption(O, &SC); });
276 O->getExtraOptionNames(OptionNames);
281 for (
auto Name : OptionNames) {
282 auto I =
Sub.OptionsMap.find(Name);
285 if (
I !=
Sub.OptionsMap.end() &&
I->second == O)
286 Sub.OptionsMap.erase(
I);
290 for (
auto *Opt =
Sub.PositionalOpts.begin();
291 Opt !=
Sub.PositionalOpts.end(); ++Opt) {
293 Sub.PositionalOpts.erase(Opt);
297 else if (O ==
Sub.ConsumeAfterOpt)
298 Sub.ConsumeAfterOpt =
nullptr;
301 void removeOption(
Option *O) {
302 forEachSubCommand(*O, [&](
SubCommand &SC) { removeOption(O, &SC); });
306 return (!
Sub.OptionsMap.empty() || !
Sub.PositionalOpts.empty() ||
307 nullptr !=
Sub.ConsumeAfterOpt);
310 bool hasOptions()
const {
311 for (
const auto *S : RegisteredSubCommands) {
318 bool hasNamedSubCommands()
const {
319 for (
const auto *S : RegisteredSubCommands)
320 if (!S->getName().empty())
325 SubCommand *getActiveSubCommand() {
return ActiveSubCommand; }
329 if (!
Sub.OptionsMap.insert(std::make_pair(NewName, O)).second) {
330 errs() << ProgramName <<
": CommandLine Error: Option '" << O->ArgStr
331 <<
"' registered more than once!\n";
334 Sub.OptionsMap.erase(O->ArgStr);
338 forEachSubCommand(*O,
339 [&](
SubCommand &SC) { updateArgStr(O, NewName, &SC); });
342 void printOptionValues();
349 "Duplicate option categories");
357 return (!
sub->getName().empty()) &&
358 (
Sub->getName() ==
sub->getName());
360 "Duplicate subcommands");
366 "SubCommand::getAll() should not be registered");
369 if (O->isPositional() || O->isConsumeAfter() || O->hasArgStr())
372 addLiteralOption(*O,
sub,
E.first);
383 RegisteredSubCommands.
end());
387 ActiveSubCommand =
nullptr;
392 RegisteredOptionCategories.
clear();
395 RegisteredSubCommands.
clear();
401 DefaultOptions.
clear();
409 bool LongOptionsUseDoubleDash,
bool HaveDoubleDash) {
411 if (Opt && LongOptionsUseDoubleDash && !HaveDoubleDash && !
isGrouping(Opt))
427 return *GlobalParser;
430template <
typename T, T TrueVal, T FalseVal>
434 if (!Arg.
data() || Arg ==
"true" || Arg ==
"1") {
439 if (Arg ==
"false" || Arg ==
"0") {
443 return O.error(
"'" + Arg +
444 "' is invalid value for boolean argument! Try 0 or 1");
456 : NumOccurrences(0), Occurrences(OccurrencesFlag), Value(0),
458 FullyInitialized(
false), Position(0) {
464 FullyInitialized =
true;
470 if (FullyInitialized)
496void OptionCategory::registerCategory() {
507 return *TopLevelSubCommand;
513 return *AllSubCommands;
531SubCommand::operator
bool()
const {
549 size_t EqualPos = Arg.
find(
'=');
554 return Sub.OptionsMap.lookup(Arg);
560 auto I =
Sub.OptionsMap.find(Arg.
substr(0, EqualPos));
561 if (
I ==
Sub.OptionsMap.end())
569 Arg = Arg.
substr(0, EqualPos);
574 std::string &NearestString) {
579 for (
auto *S : RegisteredSubCommands) {
581 "SubCommand::getAll() is not expected in RegisteredSubCommands");
582 if (S->getName().empty())
585 if (S->getName() == Name)
588 if (!NearestMatch && S->getName().edit_distance(Name) < 2)
593 NearestString = NearestMatch->
getName();
604 std::string &NearestString) {
610 std::pair<StringRef, StringRef> SplitArg = Arg.
split(
'=');
616 unsigned BestDistance = 0;
617 for (
const auto &[
_, O] : OptionsMap) {
623 O->getExtraOptionNames(OptionNames);
629 for (
const auto &Name : OptionNames) {
631 Flag,
true, BestDistance);
632 if (!Best || Distance < BestDistance) {
634 BestDistance = Distance;
635 if (
RHS.empty() || !PermitValue)
636 NearestString = std::string(Name);
638 NearestString = (
Twine(Name) +
"=" +
RHS).str();
661 Val = Val.
substr(Pos + 1);
677 const char *
const *argv,
int &i) {
685 return Handler->
error(
"requires a value!");
687 assert(argv &&
"null check");
715 bool (*Pred)(
const Option *),
717 auto OMI = OptionsMap.
find(Name);
718 if (OMI != OptionsMap.
end() && !Pred(OMI->second))
719 OMI = OptionsMap.
end();
724 while (OMI == OptionsMap.
end() && Name.size() > 1) {
725 Name = Name.drop_back();
726 OMI = OptionsMap.
find(Name);
727 if (OMI != OptionsMap.
end() && !Pred(OMI->second))
728 OMI = OptionsMap.
end();
731 if (OMI != OptionsMap.
end() && Pred(OMI->second)) {
758 assert(OptionsMap.
count(Arg) && OptionsMap.
find(Arg)->second == PGOpt);
768 if (MaybeValue[0] ==
'=') {
778 ErrorParsing |= PGOpt->
error(
"may not occur within a group!");
807 return C ==
' ' ||
C ==
'\t' ||
C ==
'\r' ||
C ==
'\n';
814static bool isQuote(
char C) {
return C ==
'\"' ||
C ==
'\''; }
820 bool InToken =
false;
821 for (
size_t I = 0, E = Src.size();
I != E; ++
I) {
826 if (MarkEOLs && Src[
I] ==
'\n')
838 if (
I + 1 < E &&
C ==
'\\') {
847 while (
I != E && Src[
I] !=
C) {
849 if (Src[
I] ==
'\\' &&
I + 1 != E)
863 if (MarkEOLs &&
C ==
'\n')
897 size_t E = Src.size();
898 int BackslashCount = 0;
903 }
while (
I !=
E && Src[
I] ==
'\\');
905 bool FollowedByDoubleQuote = (
I !=
E && Src[
I] ==
'"');
906 if (FollowedByDoubleQuote) {
907 Token.
append(BackslashCount / 2,
'\\');
908 if (BackslashCount % 2 == 0)
913 Token.
append(BackslashCount,
'\\');
931 bool AlwaysCopy,
function_ref<
void()> MarkEOL,
bool InitialCommandName) {
940 bool CommandName = InitialCommandName;
943 enum {
INIT, UNQUOTED, QUOTED } State =
INIT;
945 for (
size_t I = 0,
E = Src.size();
I <
E; ++
I) {
948 assert(Token.
empty() &&
"token should be empty in initial state");
970 AddToken(AlwaysCopy ? Saver.
save(NormalChars) : NormalChars);
971 if (
I <
E && Src[
I] ==
'\n') {
973 CommandName = InitialCommandName;
977 }
else if (Src[
I] ==
'\"') {
978 Token += NormalChars;
980 }
else if (Src[
I] ==
'\\') {
981 assert(!CommandName &&
"or else we'd have treated it as a normal char");
982 Token += NormalChars;
996 AddToken(Saver.
save(Token.
str()));
998 if (Src[
I] ==
'\n') {
999 CommandName = InitialCommandName;
1002 CommandName =
false;
1005 }
else if (Src[
I] ==
'\"') {
1007 }
else if (Src[
I] ==
'\\' && !CommandName) {
1015 if (Src[
I] ==
'\"') {
1016 if (
I < (
E - 1) && Src[
I + 1] ==
'"') {
1025 }
else if (Src[
I] ==
'\\' && !CommandName) {
1035 AddToken(Saver.
save(Token.
str()));
1042 auto OnEOL = [&]() {
1047 true, OnEOL,
false);
1053 auto OnEOL = []() {};
1062 auto OnEOL = [&]() {
1073 for (
const char *Cur = Source.begin(); Cur != Source.end();) {
1082 while (Cur != Source.end() && *Cur !=
'\n')
1087 const char *Start = Cur;
1088 for (
const char *End = Source.end(); Cur != End; ++Cur) {
1090 if (Cur + 1 != End) {
1093 (*Cur ==
'\r' && (Cur + 1 != End) && Cur[1] ==
'\n')) {
1094 Line.append(Start, Cur - 1);
1100 }
else if (*Cur ==
'\n')
1104 Line.append(Start, Cur);
1112 return (S.
size() >= 3 && S[0] ==
'\xef' && S[1] ==
'\xbb' && S[2] ==
'\xbf');
1126 TokenPos = ArgString.
find(Token, StartPos)) {
1130 if (ResponseFile.
empty())
1134 ResponseFile.
append(BasePath);
1135 StartPos = TokenPos + Token.
size();
1138 if (!ResponseFile.
empty()) {
1141 if (!Remaining.
empty())
1148Error ExpansionContext::expandResponseFile(
1149 StringRef FName, SmallVectorImpl<const char *> &NewArgv) {
1151 llvm::ErrorOr<std::unique_ptr<MemoryBuffer>> MemBufOrErr =
1152 FS->getBufferForFile(FName);
1156 "': " +
EC.message());
1158 MemoryBuffer &MemBuf = *MemBufOrErr.
get();
1163 std::string UTF8Buf;
1167 "Could not convert UTF16 to UTF8");
1168 Str = StringRef(UTF8Buf);
1174 Str = StringRef(BufRef.data() + 3, BufRef.size() - 3);
1177 Tokenizer(Str, Saver, NewArgv, MarkEOLs);
1182 if (!RelativeNames && !InConfigFile)
1186 for (
const char *&Arg : NewArgv) {
1196 StringRef ArgStr(Arg);
1198 bool ConfigInclusion =
false;
1199 if (ArgStr.consume_front(
"@")) {
1203 }
else if (ArgStr.consume_front(
"--config=")) {
1205 ConfigInclusion =
true;
1211 SmallString<128> ResponseFile;
1214 SmallString<128> FilePath;
1217 std::make_error_code(std::errc::no_such_file_or_directory),
1218 "cannot not find configuration file: " + FileName);
1219 ResponseFile.
append(FilePath);
1221 ResponseFile.
append(BasePath);
1224 Arg = Saver.save(ResponseFile.
str()).
data();
1233 struct ResponseFileRecord {
1248 for (
unsigned I = 0;
I != Argv.
size();) {
1249 while (
I == FileStack.
back().End) {
1255 const char *Arg = Argv[
I];
1257 if (Arg ==
nullptr) {
1262 if (Arg[0] !=
'@') {
1267 const char *FName = Arg + 1;
1272 if (CurrentDir.empty()) {
1273 if (
auto CWD = FS->getCurrentWorkingDirectory()) {
1277 CWD.getError(),
Twine(
"cannot get absolute path for: ") + FName);
1280 CurrDir = CurrentDir;
1283 FName = CurrDir.
c_str();
1287 if (!Res || !Res->exists()) {
1288 std::error_code EC = Res.
getError();
1289 if (!InConfigFile) {
1300 "': " + EC.message());
1305 [FileStatus,
this](
const ResponseFileRecord &RFile) ->
ErrorOr<bool> {
1317 R.getError(),
Twine(
"recursive expansion of: '") +
F.File +
"'");
1320 Twine(
"cannot open file: ") +
F.File);
1327 if (
Error Err = expandResponseFile(FName, ExpandedArgv))
1330 for (ResponseFileRecord &
Record : FileStack) {
1361 Tokenize(*EnvValue, Saver, NewArgv,
false);
1364 NewArgv.
append(Argv + 1, Argv + Argc);
1385 : Saver(
A), Tokenizer(
T), FS(FS ? FS :
vfs::getRealFileSystem().
get()) {}
1391 auto Status = FS->status(Path);
1399 CfgFilePath = FileName;
1402 if (!FileExists(CfgFilePath))
1409 for (
const StringRef &Dir : SearchDirs) {
1415 if (FileExists(CfgFilePath)) {
1429 if (std::error_code EC = FS->makeAbsolute(AbsPath))
1431 EC,
Twine(
"cannot get absolute path for " + CfgFile));
1432 CfgFile = AbsPath.
str();
1434 InConfigFile =
true;
1435 RelativeNames =
true;
1436 if (
Error Err = expandResponseFile(CfgFile, Argv))
1445 bool LongOptionsUseDoubleDash) {
1454 if (std::optional<std::string> EnvValue =
1460 for (
int I = 1;
I < argc; ++
I)
1462 int NewArgc =
static_cast<int>(NewArgv.
size());
1466 NewArgc, &NewArgv[0], Overview, Errs, VFS, LongOptionsUseDoubleDash);
1470void CommandLineParser::ResetAllOptionOccurrences() {
1474 for (
auto *SC : RegisteredSubCommands) {
1478 Opts.
reserve(SC->OptionsMap.size());
1479 for (
auto &O : SC->OptionsMap)
1483 for (
Option *O : SC->PositionalOpts)
1485 if (SC->ConsumeAfterOpt)
1486 SC->ConsumeAfterOpt->reset();
1490bool CommandLineParser::ParseCommandLineOptions(
1493 assert(hasOptions() &&
"No options specified!");
1495 ProgramOverview = Overview;
1496 bool IgnoreErrors = Errs;
1501 bool ErrorParsing =
false;
1512 if (
Error Err = ECtx.expandResponseFiles(newArgv)) {
1513 *Errs <<
toString(std::move(Err)) <<
'\n';
1517 argc =
static_cast<int>(newArgv.size());
1523 unsigned NumPositionalRequired = 0;
1526 bool HasUnlimitedPositionals =
false;
1530 std::string NearestSubCommandString;
1531 bool MaybeNamedSubCommand =
1532 argc >= 2 && argv[FirstArg][0] !=
'-' && hasNamedSubCommands();
1533 if (MaybeNamedSubCommand) {
1537 LookupSubCommand(
StringRef(argv[FirstArg]), NearestSubCommandString);
1543 assert(ChosenSubCommand);
1546 auto &OptionsMap = ChosenSubCommand->
OptionsMap;
1548 for (
auto *O: DefaultOptions) {
1552 if (ConsumeAfterOpt) {
1553 assert(PositionalOpts.size() > 0 &&
1554 "Cannot specify cl::ConsumeAfter without a positional argument!");
1556 if (!PositionalOpts.empty()) {
1559 bool UnboundedFound =
false;
1560 for (
size_t i = 0, e = PositionalOpts.size(); i != e; ++i) {
1561 Option *Opt = PositionalOpts[i];
1563 ++NumPositionalRequired;
1564 else if (ConsumeAfterOpt) {
1567 if (PositionalOpts.size() > 1) {
1569 Opt->
error(
"error - this positional option will never be matched, "
1570 "because it does not Require a value, and a "
1571 "cl::ConsumeAfter option is active!");
1572 ErrorParsing =
true;
1574 }
else if (UnboundedFound && !Opt->
hasArgStr()) {
1580 Opt->
error(
"error - option can never match, because "
1581 "another positional argument will match an "
1582 "unbounded number of values, and this option"
1583 " does not require a value!");
1584 *Errs << ProgramName <<
": CommandLine Error: Option '" << Opt->
ArgStr
1585 <<
"' is all messed up!\n";
1586 *Errs << PositionalOpts.size();
1587 ErrorParsing =
true;
1591 HasUnlimitedPositionals = UnboundedFound || ConsumeAfterOpt;
1602 Option *ActivePositionalArg =
nullptr;
1605 bool DashDashFound =
false;
1606 for (
int i = FirstArg; i < argc; ++i) {
1607 Option *Handler =
nullptr;
1608 std::string NearestHandlerString;
1610 StringRef ArgName =
"";
1611 bool HaveDoubleDash =
false;
1617 if (argv[i][0] !=
'-' || argv[i][1] == 0 || DashDashFound) {
1619 if (ActivePositionalArg) {
1624 if (!PositionalOpts.empty()) {
1625 PositionalVals.
push_back(std::make_pair(StringRef(argv[i]), i));
1630 if (PositionalVals.
size() >= NumPositionalRequired && ConsumeAfterOpt) {
1631 for (++i; i < argc; ++i)
1632 PositionalVals.
push_back(std::make_pair(StringRef(argv[i]), i));
1639 }
else if (argv[i][0] ==
'-' && argv[i][1] ==
'-' && argv[i][2] == 0 &&
1641 DashDashFound =
true;
1643 }
else if (ActivePositionalArg &&
1648 ArgName = StringRef(argv[i] + 1);
1651 HaveDoubleDash =
true;
1653 Handler = LookupLongOption(*ChosenSubCommand, ArgName,
Value,
1654 LongOptionsUseDoubleDash, HaveDoubleDash);
1660 ArgName = StringRef(argv[i] + 1);
1663 HaveDoubleDash =
true;
1665 Handler = LookupLongOption(*ChosenSubCommand, ArgName,
Value,
1666 LongOptionsUseDoubleDash, HaveDoubleDash);
1673 LongOptionsUseDoubleDash, HaveDoubleDash);
1676 if (!Handler && !(LongOptionsUseDoubleDash && HaveDoubleDash))
1687 auto ReportUnknownArgument = [&](
bool IsArg,
1688 StringRef NearestArgumentName) {
1689 *Errs << ProgramName <<
": Unknown "
1690 << (IsArg ?
"command line argument" :
"subcommand") <<
" '"
1691 << argv[i] <<
"'. Try: '" << argv[0] <<
" --help'\n";
1693 if (NearestArgumentName.empty())
1696 *Errs << ProgramName <<
": Did you mean '";
1698 *Errs << PrintArg(NearestArgumentName, 0);
1700 *Errs << NearestArgumentName;
1704 if (i > 1 || !MaybeNamedSubCommand)
1705 ReportUnknownArgument(
true, NearestHandlerString);
1707 ReportUnknownArgument(
false, NearestSubCommandString);
1709 ErrorParsing =
true;
1717 Handler->
error(
"This argument does not take a value.\n"
1718 "\tInstead, it consumes any positional arguments until "
1719 "the next recognized option.", *Errs);
1720 ErrorParsing =
true;
1722 ActivePositionalArg = Handler;
1729 if (NumPositionalRequired > PositionalVals.
size()) {
1730 *Errs << ProgramName
1731 <<
": Not enough positional command line arguments specified!\n"
1732 <<
"Must specify at least " << NumPositionalRequired
1733 <<
" positional argument" << (NumPositionalRequired > 1 ?
"s" :
"")
1734 <<
": See: " << argv[0] <<
" --help\n";
1736 ErrorParsing =
true;
1737 }
else if (!HasUnlimitedPositionals &&
1738 PositionalVals.
size() > PositionalOpts.size()) {
1739 *Errs << ProgramName <<
": Too many positional arguments specified!\n"
1740 <<
"Can specify at most " << PositionalOpts.size()
1741 <<
" positional arguments: See: " << argv[0] <<
" --help\n";
1742 ErrorParsing =
true;
1744 }
else if (!ConsumeAfterOpt) {
1746 unsigned ValNo = 0, NumVals =
static_cast<unsigned>(PositionalVals.
size());
1747 for (
Option *Opt : PositionalOpts) {
1750 PositionalVals[ValNo].second);
1752 --NumPositionalRequired;
1760 while (NumVals - ValNo > NumPositionalRequired && !
Done) {
1768 PositionalVals[ValNo].second);
1773 "positional argument processing!");
1778 assert(ConsumeAfterOpt && NumPositionalRequired <= PositionalVals.
size());
1780 for (
Option *Opt : PositionalOpts)
1783 Opt, PositionalVals[ValNo].first, PositionalVals[ValNo].second);
1792 if (PositionalOpts.size() == 1 && ValNo == 0 && !PositionalVals.
empty()) {
1794 PositionalVals[ValNo].first,
1795 PositionalVals[ValNo].second);
1801 for (; ValNo != PositionalVals.
size(); ++ValNo)
1804 PositionalVals[ValNo].second);
1808 for (
const auto &Opt : OptionsMap) {
1813 Opt.second->
error(
"must be specified at least once!");
1814 ErrorParsing =
true;
1826 for (
int i = 0; i < argc; ++i)
dbgs() << argv[i] <<
' ';
1847 if (!ArgName.
data())
1849 if (ArgName.
empty())
1852 Errs <<
globalParser().ProgramName <<
": for the " << PrintArg(ArgName, 0);
1854 Errs <<
" option: " << Message <<
"\n";
1860 return handleOccurrence(pos, ArgName, Value);
1867 if (O.ValueStr.empty())
1882 size_t FirstLineIndentedBy) {
1883 assert(Indent >= FirstLineIndentedBy);
1884 std::pair<StringRef, StringRef> Split =
HelpStr.split(
'\n');
1887 while (!Split.second.empty()) {
1888 Split = Split.second.split(
'\n');
1889 outs().
indent(Indent) << Split.first <<
"\n";
1894 size_t FirstLineIndentedBy) {
1896 assert(BaseIndent >= FirstLineIndentedBy);
1897 std::pair<StringRef, StringRef> Split =
HelpStr.split(
'\n');
1898 outs().
indent(BaseIndent - FirstLineIndentedBy)
1900 while (!Split.second.empty()) {
1901 Split = Split.second.split(
'\n');
1902 outs().
indent(BaseIndent + ValHelpPrefix.
size()) << Split.first <<
"\n";
1907void alias::printOptionInfo(
size_t GlobalWidth)
const {
1923 if (!ValName.empty()) {
1924 size_t FormattingLen = 3;
1937 size_t GlobalWidth)
const {
1938 outs() << PrintArg(O.ArgStr);
1941 if (!ValName.empty()) {
1947 outs() << (O.ArgStr.size() == 1 ?
" <" :
"=<") <<
getValueStr(O, ValName)
1956 size_t GlobalWidth)
const {
1957 outs() << PrintArg(O.ArgStr);
1958 outs().
indent(GlobalWidth - O.ArgStr.size());
1978template <
typename FixedOrScalableQuantityT>
1981 FixedOrScalableQuantityT &
Value) {
1982 using ScalarTy =
typename FixedOrScalableQuantityT::ScalarTy;
1988 Value = FixedOrScalableQuantityT::getFixed(MinValue);
1994 return O.error(
"'" + Arg +
"' value invalid for " + ValueKind +
1997 Remainder = Remainder.
ltrim();
1999 return O.error(
"'" + Arg +
"' value invalid for " + ValueKind +
2002 Remainder = Remainder.
ltrim();
2004 return O.error(
"'" + Arg +
"' value invalid for " + ValueKind +
2007 Value = FixedOrScalableQuantityT::getScalable(MinValue);
2016 return O.error(
"'" + Arg +
"' value invalid for integer argument!");
2025 return O.error(
"'" + Arg +
"' value invalid for long argument!");
2034 return O.error(
"'" + Arg +
"' value invalid for llong argument!");
2044 return O.error(
"'" + Arg +
"' value invalid for uint argument!");
2051 unsigned long &
Value) {
2054 return O.error(
"'" + Arg +
"' value invalid for ulong argument!");
2062 unsigned long long &
Value) {
2065 return O.error(
"'" + Arg +
"' value invalid for ullong argument!");
2072 ElementCount &
Value) {
2081 return O.error(
"'" + Arg +
"' value invalid for floating point argument!");
2107 for (
unsigned i = 0; i != e; ++i) {
2123 return O.getValueExpectedFlag() !=
ValueOptional || !Name.empty() ||
2124 !Description.
empty();
2129 if (O.hasArgStr()) {
2141 size_t BaseSize = 0;
2152 size_t GlobalWidth)
const {
2153 if (O.hasArgStr()) {
2159 outs() << PrintArg(O.ArgStr);
2178 if (OptionName.
empty()) {
2183 if (!Description.
empty())
2189 if (!O.HelpStr.empty())
2190 outs() <<
" " << O.HelpStr <<
'\n';
2207 outs() <<
" " << PrintArg(O.ArgStr);
2208 outs().
indent(GlobalWidth - O.ArgStr.size());
2211 for (
unsigned i = 0; i != NumOpts; ++i) {
2219 for (
unsigned j = 0; j != NumOpts; ++j) {
2228 outs() <<
"= *unknown option value*\n";
2236 return OS << static_cast<int>(V);
2241#define PRINT_OPT_DIFF(T) \
2242 void parser<T>::printOptionDiff(const Option &O, T V, OptionValue<T> D, \
2243 size_t GlobalWidth) const { \
2244 printOptionName(O, GlobalWidth); \
2247 raw_string_ostream SS(Str); \
2250 outs() << "= " << Str; \
2251 size_t NumSpaces = \
2252 MaxOptWidth > Str.size() ? MaxOptWidth - Str.size() : 0; \
2253 outs().indent(NumSpaces) << " (default: "; \
2255 outs() << D.getValue(); \
2257 outs() << "*no default*"; \
2276 size_t GlobalWidth)
const {
2277 printOptionName(O, GlobalWidth);
2278 outs() <<
"= " << V;
2282 outs() <<
D.getValue();
2284 outs() <<
"*no default*";
2289 const Option &O, std::optional<StringRef> V,
2290 const OptionValue<std::optional<std::string>> &
D,
2291 size_t GlobalWidth)
const {
2292 printOptionName(O, GlobalWidth);
2293 outs() <<
"= " <<
V;
2294 size_t VSize =
V.has_value() ?
V.value().size() : 0;
2297 if (
D.hasValue() &&
D.getValue().has_value())
2298 outs() <<
D.getValue();
2300 outs() <<
"*no value*";
2306 size_t GlobalWidth)
const {
2308 outs() <<
"= *cannot print option value*\n";
2316 const std::pair<const char *, Option *> *
RHS) {
2317 return strcmp(
LHS->first,
RHS->first);
2321 const std::pair<const char *, SubCommand *> *
RHS) {
2322 return strcmp(
LHS->first,
RHS->first);
2331 for (
auto I = OptMap.
begin(),
E = OptMap.
end();
I !=
E; ++
I) {
2337 if (
I->second->getOptionHiddenFlag() ==
Hidden && !ShowHidden)
2341 if (!OptionSet.
insert(
I->second).second)
2345 std::pair<const char *, Option *>(
I->first.data(),
I->second));
2355 for (
auto *S : SubMap) {
2356 if (S->getName().empty())
2358 Subs.push_back(std::make_pair(S->getName().data(), S));
2367 const bool ShowHidden;
2368 using StrOptionPairVector =
2370 using StrSubCommandPairVector =
2373 virtual void printOptions(StrOptionPairVector &Opts,
size_t MaxArgLen) {
2374 for (
const auto &Opt : Opts)
2378 void printSubCommands(StrSubCommandPairVector &Subs,
size_t MaxSubLen) {
2379 for (
const auto &S : Subs) {
2380 outs() <<
" " << S.first;
2381 if (!S.second->getDescription().empty()) {
2383 outs() <<
" - " << S.second->getDescription();
2390 explicit HelpPrinter(
bool showHidden) : ShowHidden(showHidden) {}
2391 virtual ~HelpPrinter() =
default;
2394 void operator=(
bool Value) {
2405 auto &OptionsMap =
Sub->OptionsMap;
2406 auto &PositionalOpts =
Sub->PositionalOpts;
2407 auto &ConsumeAfterOpt =
Sub->ConsumeAfterOpt;
2409 StrOptionPairVector Opts;
2410 sortOpts(OptionsMap, Opts, ShowHidden);
2412 StrSubCommandPairVector Subs;
2421 outs() <<
" [subcommand]";
2422 outs() <<
" [options]";
2424 if (!
Sub->getDescription().empty()) {
2425 outs() <<
"SUBCOMMAND '" <<
Sub->getName()
2426 <<
"': " <<
Sub->getDescription() <<
"\n\n";
2432 for (
auto *Opt : PositionalOpts) {
2439 if (ConsumeAfterOpt)
2440 outs() <<
" " << ConsumeAfterOpt->HelpStr;
2444 size_t MaxSubLen = 0;
2445 for (
const auto &
Sub : Subs)
2446 MaxSubLen = std::max(MaxSubLen, strlen(
Sub.first));
2449 outs() <<
"SUBCOMMANDS:\n\n";
2450 printSubCommands(Subs, MaxSubLen);
2453 <<
" <subcommand> --help\" to get more help on a specific "
2460 size_t MaxArgLen = 0;
2461 for (
const auto &Opt : Opts)
2464 outs() <<
"OPTIONS:\n";
2465 printOptions(Opts, MaxArgLen);
2474class CategorizedHelpPrinter :
public HelpPrinter {
2476 explicit CategorizedHelpPrinter(
bool showHidden) : HelpPrinter(showHidden) {}
2482 static int OptionCategoryCompare(OptionCategory *
const *
A,
2483 OptionCategory *
const *
B) {
2484 return (*A)->getName().compare((*B)->getName());
2488 using HelpPrinter::operator=;
2491 void printOptions(StrOptionPairVector &Opts,
size_t MaxArgLen)
override {
2492 std::vector<OptionCategory *> SortedCategories;
2493 DenseMap<OptionCategory *, std::vector<Option *>> CategorizedOptions;
2501 assert(SortedCategories.size() > 0 &&
"No option categories registered!");
2503 OptionCategoryCompare);
2508 for (
const auto &
I : Opts) {
2509 Option *Opt =
I.second;
2510 for (OptionCategory *Cat : Opt->
Categories) {
2512 "Option has an unregistered category");
2513 CategorizedOptions[Cat].push_back(Opt);
2518 for (OptionCategory *Category : SortedCategories) {
2520 const auto &CategoryOptions = CategorizedOptions[Category];
2521 if (CategoryOptions.empty())
2526 outs() << Category->getName() <<
":\n";
2529 if (!Category->getDescription().empty())
2530 outs() << Category->getDescription() <<
"\n\n";
2535 for (
const Option *Opt : CategoryOptions)
2543class HelpPrinterWrapper {
2545 HelpPrinter &UncategorizedPrinter;
2546 CategorizedHelpPrinter &CategorizedPrinter;
2549 explicit HelpPrinterWrapper(HelpPrinter &UncategorizedPrinter,
2550 CategorizedHelpPrinter &CategorizedPrinter)
2551 : UncategorizedPrinter(UncategorizedPrinter),
2552 CategorizedPrinter(CategorizedPrinter) {}
2555 void operator=(
bool Value);
2560#if defined(__GNUC__)
2563# if defined(__OPTIMIZE__)
2564# define LLVM_IS_DEBUG_BUILD 0
2566# define LLVM_IS_DEBUG_BUILD 1
2568#elif defined(_MSC_VER)
2573# define LLVM_IS_DEBUG_BUILD 1
2575# define LLVM_IS_DEBUG_BUILD 0
2579# define LLVM_IS_DEBUG_BUILD 0
2583class VersionPrinter {
2585 void print(
const std::vector<VersionPrinterTy> &ExtraPrinters) {
2587#ifdef PACKAGE_VENDOR
2588 OS << PACKAGE_VENDOR <<
" ";
2590 OS <<
"LLVM (http://llvm.org/):\n ";
2592 OS << PACKAGE_NAME <<
" version " << PACKAGE_VERSION <<
"\n ";
2593#if LLVM_IS_DEBUG_BUILD
2594 OS <<
"DEBUG build";
2596 OS <<
"Optimized build";
2599 OS <<
" with assertions";
2605 if (!ExtraPrinters.empty()) {
2606 for (
const auto &
I : ExtraPrinters)
2610 void operator=(
bool OptionWasSpecified);
2613struct CommandLineCommonOptions {
2616 HelpPrinter UncategorizedNormalPrinter{
false};
2617 HelpPrinter UncategorizedHiddenPrinter{
true};
2618 CategorizedHelpPrinter CategorizedNormalPrinter{
false};
2619 CategorizedHelpPrinter CategorizedHiddenPrinter{
true};
2622 HelpPrinterWrapper WrappedNormalPrinter{UncategorizedNormalPrinter,
2623 CategorizedNormalPrinter};
2624 HelpPrinterWrapper WrappedHiddenPrinter{UncategorizedHiddenPrinter,
2625 CategorizedHiddenPrinter};
2635 "Display list of available options (--help-list-hidden for more)"),
2644 cl::desc(
"Display list of all available options"),
2656 cl::desc(
"Display available options (--help-hidden for more)"),
2667 cl::desc(
"Display all available options"),
2676 cl::desc(
"Print non-default options after command line parsing"),
2683 "print-all-options",
2684 cl::desc(
"Print all option values after command line parsing"),
2692 std::vector<VersionPrinterTy> ExtraVersionPrinters;
2695 VersionPrinter VersionPrinterInstance;
2698 "version",
cl::desc(
"Display the version of this program"),
2723 return GeneralCategory;
2726void VersionPrinter::operator=(
bool OptionWasSpecified) {
2727 if (!OptionWasSpecified)
2739void HelpPrinterWrapper::operator=(
bool Value) {
2746 if (
globalParser().RegisteredOptionCategories.size() > 1) {
2751 CategorizedPrinter =
true;
2753 UncategorizedPrinter =
true;
2760void CommandLineParser::printOptionValues() {
2765 sortOpts(ActiveSubCommand->OptionsMap, Opts,
true);
2768 size_t MaxArgLen = 0;
2769 for (
const auto &Opt : Opts)
2772 for (
const auto &Opt : Opts)
2778 if (!
Hidden && !Categorized)
2780 else if (!
Hidden && Categorized)
2782 else if (
Hidden && !Categorized)
2794#if LLVM_IS_DEBUG_BUILD
2800#ifdef EXPENSIVE_CHECKS
2801 "+expensive-checks",
2803#if __has_feature(address_sanitizer)
2806#if __has_feature(dataflow_sanitizer)
2809#if __has_feature(hwaddress_sanitizer)
2812#if __has_feature(memory_sanitizer)
2815#if __has_feature(thread_sanitizer)
2818#if __has_feature(undefined_behavior_sanitizer)
2821#ifdef LLVM_INTEGRATED_CRT_ALLOC
2822 "+alloc:" LLVM_INTEGRATED_CRT_ALLOC,
2830#if LLVM_VERSION_PRINTER_SHOW_BUILD_CONFIG
2831 OS <<
"Build config: ";
2855 return Sub.OptionsMap;
2865 for (
auto &
I :
Sub.OptionsMap) {
2866 bool Unrelated =
true;
2867 for (
auto &Cat :
I.second->Categories) {
2868 if (Cat == &Category || Cat == &
CommonOptions->GenericCategory)
2879 for (
auto &
I :
Sub.OptionsMap) {
2880 bool Unrelated =
true;
2881 for (
auto &Cat :
I.second->Categories) {
2897 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 isPrefixedOrGrouping(const Option *O)
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 Option * getOptionPred(StringRef Name, size_t &Length, bool(*Pred)(const Option *), const OptionsMapTy &OptionsMap)
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 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 Option * HandlePrefixedOrGroupedOption(StringRef &Arg, StringRef &Value, bool &ErrorParsing, const OptionsMapTy &OptionsMap)
HandlePrefixedOrGroupedOption - The specified argument string (which started with at least one '-') d...
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 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 isGrouping(const Option *O)
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.
iterator find(const_arg_type_t< KeyT > Val)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
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.
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)
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.
StringRef getName() const
SmallPtrSet< SubCommand *, 1 > Subs
int getNumOccurrences() const
enum ValueExpected getValueExpectedFlag() const
void addCategory(OptionCategory &C)
void setMiscFlag(enum MiscFlags M)
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)
bool isDefaultOption() const
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 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 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 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)
LLVM_ABI bool expandResponseFiles(int Argc, const char *const *Argv, const char *EnvVar, SmallVectorImpl< const char * > &NewArgv)
A convenience helper which concatenates the options specified by the environment variable EnvVar and ...
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 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 bool ParseCommandLineOptions(int argc, const char *const *argv, StringRef Overview="", raw_ostream *Errs=nullptr, vfs::FileSystem *VFS=nullptr, const char *EnvVar=nullptr, bool LongOptionsUseDoubleDash=false)
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)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
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.
@ Default
The result value is uniform if and only if all operands are uniform.