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";
250 else if (O->getMiscFlags() &
cl::Sink)
254 O->error(
"Cannot specify more than one option with cl::ConsumeAfter!");
268 void addOption(
Option *O,
bool ProcessDefaultOption =
false) {
269 if (!ProcessDefaultOption && O->isDefaultOption()) {
273 forEachSubCommand(*O, [&](
SubCommand &SC) { addOption(O, &SC); });
278 O->getExtraOptionNames(OptionNames);
283 for (
auto Name : OptionNames) {
284 auto I =
Sub.OptionsMap.find(Name);
287 if (
I !=
Sub.OptionsMap.end() &&
I->second == O)
288 Sub.OptionsMap.erase(
I);
292 for (
auto *Opt =
Sub.PositionalOpts.begin();
293 Opt !=
Sub.PositionalOpts.end(); ++Opt) {
295 Sub.PositionalOpts.erase(Opt);
299 else if (O->getMiscFlags() &
cl::Sink)
300 for (
auto *Opt =
Sub.SinkOpts.begin(); Opt !=
Sub.SinkOpts.end(); ++Opt) {
302 Sub.SinkOpts.erase(Opt);
306 else if (O ==
Sub.ConsumeAfterOpt)
307 Sub.ConsumeAfterOpt =
nullptr;
310 void removeOption(
Option *O) {
311 forEachSubCommand(*O, [&](
SubCommand &SC) { removeOption(O, &SC); });
315 return (!
Sub.OptionsMap.empty() || !
Sub.PositionalOpts.empty() ||
316 nullptr !=
Sub.ConsumeAfterOpt);
319 bool hasOptions()
const {
320 for (
const auto *S : RegisteredSubCommands) {
327 bool hasNamedSubCommands()
const {
328 for (
const auto *S : RegisteredSubCommands)
329 if (!S->getName().empty())
334 SubCommand *getActiveSubCommand() {
return ActiveSubCommand; }
338 if (!
Sub.OptionsMap.insert(std::make_pair(NewName, O)).second) {
339 errs() << ProgramName <<
": CommandLine Error: Option '" << O->ArgStr
340 <<
"' registered more than once!\n";
343 Sub.OptionsMap.erase(O->ArgStr);
347 forEachSubCommand(*O,
348 [&](
SubCommand &SC) { updateArgStr(O, NewName, &SC); });
351 void printOptionValues();
358 "Duplicate option categories");
366 return (!
sub->getName().empty()) &&
367 (
Sub->getName() ==
sub->getName());
369 "Duplicate subcommands");
375 "SubCommand::getAll() should not be registered");
378 if ((O->isPositional() || O->isSink() || O->isConsumeAfter()) ||
382 addLiteralOption(*O,
sub,
E.first);
393 RegisteredSubCommands.
end());
397 ActiveSubCommand =
nullptr;
402 RegisteredOptionCategories.
clear();
405 RegisteredSubCommands.
clear();
411 DefaultOptions.
clear();
419 bool LongOptionsUseDoubleDash,
bool HaveDoubleDash) {
421 if (Opt && LongOptionsUseDoubleDash && !HaveDoubleDash && !
isGrouping(Opt))
432template <
typename T, T TrueVal, T FalseVal>
434 if (Arg ==
"" || Arg ==
"true" || Arg ==
"TRUE" || Arg ==
"True" ||
440 if (Arg ==
"false" || Arg ==
"FALSE" || Arg ==
"False" || Arg ==
"0") {
444 return O.error(
"'" + Arg +
445 "' is invalid value for boolean argument! Try 0 or 1");
457 : NumOccurrences(0), Occurrences(OccurrencesFlag), Value(0),
459 FullyInitialized(
false), Position(0), AdditionalVals(0) {
465 FullyInitialized =
true;
471 if (FullyInitialized)
497void OptionCategory::registerCategory() {
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();
650 bool MultiArg =
false) {
662 Val = Val.
substr(Pos + 1);
678 const char *
const *argv,
int &i) {
689 return Handler->
error(
"requires a value!");
691 assert(argv &&
"null check");
696 if (NumAdditionalVals > 0)
697 return Handler->
error(
"multi-valued option specified"
698 " with ValueDisallowed modifier!");
709 if (NumAdditionalVals == 0)
713 bool MultiArg =
false;
722 while (NumAdditionalVals > 0) {
724 return Handler->
error(
"not enough values!");
725 assert(argv &&
"null check");
748 bool (*Pred)(
const Option *),
750 auto OMI = OptionsMap.
find(Name);
751 if (OMI != OptionsMap.
end() && !Pred(OMI->second))
752 OMI = OptionsMap.
end();
757 while (OMI == OptionsMap.
end() && Name.size() > 1) {
758 Name = Name.drop_back();
759 OMI = OptionsMap.
find(Name);
760 if (OMI != OptionsMap.
end() && !Pred(OMI->second))
761 OMI = OptionsMap.
end();
764 if (OMI != OptionsMap.
end() && Pred(OMI->second)) {
791 assert(OptionsMap.
count(Arg) && OptionsMap.
find(Arg)->second == PGOpt);
801 if (MaybeValue[0] ==
'=') {
811 ErrorParsing |= PGOpt->
error(
"may not occur within a group!");
840 return C ==
' ' ||
C ==
'\t' ||
C ==
'\r' ||
C ==
'\n';
847static bool isQuote(
char C) {
return C ==
'\"' ||
C ==
'\''; }
853 bool InToken =
false;
854 for (
size_t I = 0, E = Src.size();
I != E; ++
I) {
859 if (MarkEOLs && Src[
I] ==
'\n')
871 if (
I + 1 < E &&
C ==
'\\') {
880 while (
I != E && Src[
I] !=
C) {
882 if (Src[
I] ==
'\\' &&
I + 1 != E)
896 if (MarkEOLs &&
C ==
'\n')
930 size_t E = Src.size();
931 int BackslashCount = 0;
936 }
while (
I !=
E && Src[
I] ==
'\\');
938 bool FollowedByDoubleQuote = (
I !=
E && Src[
I] ==
'"');
939 if (FollowedByDoubleQuote) {
940 Token.
append(BackslashCount / 2,
'\\');
941 if (BackslashCount % 2 == 0)
946 Token.
append(BackslashCount,
'\\');
964 bool AlwaysCopy,
function_ref<
void()> MarkEOL,
bool InitialCommandName) {
973 bool CommandName = InitialCommandName;
976 enum {
INIT, UNQUOTED, QUOTED } State =
INIT;
978 for (
size_t I = 0,
E = Src.size();
I <
E; ++
I) {
981 assert(Token.
empty() &&
"token should be empty in initial state");
1003 AddToken(AlwaysCopy ? Saver.
save(NormalChars) : NormalChars);
1004 if (
I <
E && Src[
I] ==
'\n') {
1006 CommandName = InitialCommandName;
1008 CommandName =
false;
1010 }
else if (Src[
I] ==
'\"') {
1011 Token += NormalChars;
1013 }
else if (Src[
I] ==
'\\') {
1014 assert(!CommandName &&
"or else we'd have treated it as a normal char");
1015 Token += NormalChars;
1029 AddToken(Saver.
save(Token.
str()));
1031 if (Src[
I] ==
'\n') {
1032 CommandName = InitialCommandName;
1035 CommandName =
false;
1038 }
else if (Src[
I] ==
'\"') {
1040 }
else if (Src[
I] ==
'\\' && !CommandName) {
1048 if (Src[
I] ==
'\"') {
1049 if (
I < (
E - 1) && Src[
I + 1] ==
'"') {
1058 }
else if (Src[
I] ==
'\\' && !CommandName) {
1068 AddToken(Saver.
save(Token.
str()));
1075 auto OnEOL = [&]() {
1080 true, OnEOL,
false);
1086 auto OnEOL = []() {};
1095 auto OnEOL = [&]() {
1106 for (
const char *Cur = Source.begin(); Cur != Source.end();) {
1115 while (Cur != Source.end() && *Cur !=
'\n')
1120 const char *Start = Cur;
1121 for (
const char *End = Source.end(); Cur != End; ++Cur) {
1123 if (Cur + 1 != End) {
1126 (*Cur ==
'\r' && (Cur + 1 != End) && Cur[1] ==
'\n')) {
1127 Line.append(Start, Cur - 1);
1133 }
else if (*Cur ==
'\n')
1137 Line.append(Start, Cur);
1145 return (S.
size() >= 3 && S[0] ==
'\xef' && S[1] ==
'\xbb' && S[2] ==
'\xbf');
1159 TokenPos = ArgString.
find(Token, StartPos)) {
1163 if (ResponseFile.
empty())
1167 ResponseFile.
append(BasePath);
1168 StartPos = TokenPos + Token.
size();
1171 if (!ResponseFile.
empty()) {
1174 if (!Remaining.
empty())
1181Error ExpansionContext::expandResponseFile(
1182 StringRef FName, SmallVectorImpl<const char *> &NewArgv) {
1184 llvm::ErrorOr<std::unique_ptr<MemoryBuffer>> MemBufOrErr =
1185 FS->getBufferForFile(FName);
1189 "': " +
EC.message());
1191 MemoryBuffer &MemBuf = *MemBufOrErr.
get();
1196 std::string UTF8Buf;
1200 "Could not convert UTF16 to UTF8");
1201 Str = StringRef(UTF8Buf);
1207 Str = StringRef(BufRef.data() + 3, BufRef.size() - 3);
1210 Tokenizer(Str, Saver, NewArgv, MarkEOLs);
1215 if (!RelativeNames && !InConfigFile)
1219 for (
const char *&Arg : NewArgv) {
1229 StringRef ArgStr(Arg);
1231 bool ConfigInclusion =
false;
1232 if (ArgStr.consume_front(
"@")) {
1236 }
else if (ArgStr.consume_front(
"--config=")) {
1238 ConfigInclusion =
true;
1244 SmallString<128> ResponseFile;
1247 SmallString<128> FilePath;
1250 std::make_error_code(std::errc::no_such_file_or_directory),
1251 "cannot not find configuration file: " + FileName);
1252 ResponseFile.
append(FilePath);
1254 ResponseFile.
append(BasePath);
1257 Arg = Saver.save(ResponseFile.
str()).
data();
1266 struct ResponseFileRecord {
1281 for (
unsigned I = 0;
I != Argv.
size();) {
1282 while (
I == FileStack.
back().End) {
1288 const char *Arg = Argv[
I];
1290 if (Arg ==
nullptr) {
1295 if (Arg[0] !=
'@') {
1300 const char *FName = Arg + 1;
1305 if (CurrentDir.empty()) {
1306 if (
auto CWD = FS->getCurrentWorkingDirectory()) {
1310 CWD.getError(),
Twine(
"cannot get absolute path for: ") + FName);
1313 CurrDir = CurrentDir;
1316 FName = CurrDir.
c_str();
1320 if (!Res || !Res->exists()) {
1321 std::error_code EC = Res.
getError();
1322 if (!InConfigFile) {
1333 "': " + EC.message());
1338 [FileStatus,
this](
const ResponseFileRecord &RFile) ->
ErrorOr<bool> {
1350 R.getError(),
Twine(
"recursive expansion of: '") +
F.File +
"'");
1353 Twine(
"cannot open file: ") +
F.File);
1360 if (
Error Err = expandResponseFile(FName, ExpandedArgv))
1363 for (ResponseFileRecord &
Record : FileStack) {
1394 Tokenize(*EnvValue, Saver, NewArgv,
false);
1397 NewArgv.
append(Argv + 1, Argv + Argc);
1418 : Saver(
A), Tokenizer(
T), FS(FS ? FS :
vfs::getRealFileSystem().
get()) {}
1424 auto Status = FS->status(Path);
1432 CfgFilePath = FileName;
1435 if (!FileExists(CfgFilePath))
1442 for (
const StringRef &Dir : SearchDirs) {
1448 if (FileExists(CfgFilePath)) {
1462 if (std::error_code EC = FS->makeAbsolute(AbsPath))
1464 EC,
Twine(
"cannot get absolute path for " + CfgFile));
1465 CfgFile = AbsPath.
str();
1467 InConfigFile =
true;
1468 RelativeNames =
true;
1469 if (
Error Err = expandResponseFile(CfgFile, Argv))
1478 bool LongOptionsUseDoubleDash) {
1487 if (std::optional<std::string> EnvValue =
1493 for (
int I = 1;
I < argc; ++
I)
1495 int NewArgc =
static_cast<int>(NewArgv.
size());
1499 NewArgc, &NewArgv[0], Overview, Errs, VFS, LongOptionsUseDoubleDash);
1503void CommandLineParser::ResetAllOptionOccurrences() {
1507 for (
auto *SC : RegisteredSubCommands) {
1511 Opts.
reserve(SC->OptionsMap.size());
1512 for (
auto &O : SC->OptionsMap)
1516 for (
Option *O : SC->PositionalOpts)
1518 for (
Option *O : SC->SinkOpts)
1520 if (SC->ConsumeAfterOpt)
1521 SC->ConsumeAfterOpt->reset();
1525bool CommandLineParser::ParseCommandLineOptions(
1528 assert(hasOptions() &&
"No options specified!");
1530 ProgramOverview = Overview;
1531 bool IgnoreErrors = Errs;
1536 bool ErrorParsing =
false;
1547 if (
Error Err = ECtx.expandResponseFiles(newArgv)) {
1548 *Errs <<
toString(std::move(Err)) <<
'\n';
1552 argc =
static_cast<int>(newArgv.size());
1558 unsigned NumPositionalRequired = 0;
1561 bool HasUnlimitedPositionals =
false;
1565 std::string NearestSubCommandString;
1566 bool MaybeNamedSubCommand =
1567 argc >= 2 && argv[FirstArg][0] !=
'-' && hasNamedSubCommands();
1568 if (MaybeNamedSubCommand) {
1572 LookupSubCommand(
StringRef(argv[FirstArg]), NearestSubCommandString);
1578 assert(ChosenSubCommand);
1581 auto &SinkOpts = ChosenSubCommand->
SinkOpts;
1582 auto &OptionsMap = ChosenSubCommand->
OptionsMap;
1584 for (
auto *O: DefaultOptions) {
1588 if (ConsumeAfterOpt) {
1589 assert(PositionalOpts.size() > 0 &&
1590 "Cannot specify cl::ConsumeAfter without a positional argument!");
1592 if (!PositionalOpts.empty()) {
1595 bool UnboundedFound =
false;
1596 for (
size_t i = 0, e = PositionalOpts.size(); i != e; ++i) {
1597 Option *Opt = PositionalOpts[i];
1599 ++NumPositionalRequired;
1600 else if (ConsumeAfterOpt) {
1603 if (PositionalOpts.size() > 1) {
1605 Opt->
error(
"error - this positional option will never be matched, "
1606 "because it does not Require a value, and a "
1607 "cl::ConsumeAfter option is active!");
1608 ErrorParsing =
true;
1610 }
else if (UnboundedFound && !Opt->
hasArgStr()) {
1616 Opt->
error(
"error - option can never match, because "
1617 "another positional argument will match an "
1618 "unbounded number of values, and this option"
1619 " does not require a value!");
1620 *Errs << ProgramName <<
": CommandLine Error: Option '" << Opt->
ArgStr
1621 <<
"' is all messed up!\n";
1622 *Errs << PositionalOpts.size();
1623 ErrorParsing =
true;
1627 HasUnlimitedPositionals = UnboundedFound || ConsumeAfterOpt;
1638 Option *ActivePositionalArg =
nullptr;
1641 bool DashDashFound =
false;
1642 for (
int i = FirstArg; i < argc; ++i) {
1643 Option *Handler =
nullptr;
1644 std::string NearestHandlerString;
1646 StringRef ArgName =
"";
1647 bool HaveDoubleDash =
false;
1653 if (argv[i][0] !=
'-' || argv[i][1] == 0 || DashDashFound) {
1655 if (ActivePositionalArg) {
1660 if (!PositionalOpts.empty()) {
1661 PositionalVals.
push_back(std::make_pair(StringRef(argv[i]), i));
1666 if (PositionalVals.
size() >= NumPositionalRequired && ConsumeAfterOpt) {
1667 for (++i; i < argc; ++i)
1668 PositionalVals.
push_back(std::make_pair(StringRef(argv[i]), i));
1675 }
else if (argv[i][0] ==
'-' && argv[i][1] ==
'-' && argv[i][2] == 0 &&
1677 DashDashFound =
true;
1679 }
else if (ActivePositionalArg &&
1684 ArgName = StringRef(argv[i] + 1);
1687 HaveDoubleDash =
true;
1689 Handler = LookupLongOption(*ChosenSubCommand, ArgName,
Value,
1690 LongOptionsUseDoubleDash, HaveDoubleDash);
1696 ArgName = StringRef(argv[i] + 1);
1699 HaveDoubleDash =
true;
1701 Handler = LookupLongOption(*ChosenSubCommand, ArgName,
Value,
1702 LongOptionsUseDoubleDash, HaveDoubleDash);
1709 LongOptionsUseDoubleDash, HaveDoubleDash);
1712 if (!Handler && !(LongOptionsUseDoubleDash && HaveDoubleDash))
1718 if (!Handler && SinkOpts.empty())
1723 if (!SinkOpts.empty()) {
1724 for (
Option *SinkOpt : SinkOpts)
1725 SinkOpt->addOccurrence(i,
"", StringRef(argv[i]));
1729 auto ReportUnknownArgument = [&](
bool IsArg,
1730 StringRef NearestArgumentName) {
1731 *Errs << ProgramName <<
": Unknown "
1732 << (IsArg ?
"command line argument" :
"subcommand") <<
" '"
1733 << argv[i] <<
"'. Try: '" << argv[0] <<
" --help'\n";
1735 if (NearestArgumentName.empty())
1738 *Errs << ProgramName <<
": Did you mean '";
1740 *Errs << PrintArg(NearestArgumentName, 0);
1742 *Errs << NearestArgumentName;
1746 if (i > 1 || !MaybeNamedSubCommand)
1747 ReportUnknownArgument(
true, NearestHandlerString);
1749 ReportUnknownArgument(
false, NearestSubCommandString);
1751 ErrorParsing =
true;
1759 Handler->
error(
"This argument does not take a value.\n"
1760 "\tInstead, it consumes any positional arguments until "
1761 "the next recognized option.", *Errs);
1762 ErrorParsing =
true;
1764 ActivePositionalArg = Handler;
1771 if (NumPositionalRequired > PositionalVals.
size()) {
1772 *Errs << ProgramName
1773 <<
": Not enough positional command line arguments specified!\n"
1774 <<
"Must specify at least " << NumPositionalRequired
1775 <<
" positional argument" << (NumPositionalRequired > 1 ?
"s" :
"")
1776 <<
": See: " << argv[0] <<
" --help\n";
1778 ErrorParsing =
true;
1779 }
else if (!HasUnlimitedPositionals &&
1780 PositionalVals.
size() > PositionalOpts.size()) {
1781 *Errs << ProgramName <<
": Too many positional arguments specified!\n"
1782 <<
"Can specify at most " << PositionalOpts.size()
1783 <<
" positional arguments: See: " << argv[0] <<
" --help\n";
1784 ErrorParsing =
true;
1786 }
else if (!ConsumeAfterOpt) {
1788 unsigned ValNo = 0, NumVals =
static_cast<unsigned>(PositionalVals.
size());
1789 for (
Option *Opt : PositionalOpts) {
1792 PositionalVals[ValNo].second);
1794 --NumPositionalRequired;
1802 while (NumVals - ValNo > NumPositionalRequired && !
Done) {
1810 PositionalVals[ValNo].second);
1815 "positional argument processing!");
1820 assert(ConsumeAfterOpt && NumPositionalRequired <= PositionalVals.
size());
1822 for (
Option *Opt : PositionalOpts)
1825 Opt, PositionalVals[ValNo].first, PositionalVals[ValNo].second);
1834 if (PositionalOpts.size() == 1 && ValNo == 0 && !PositionalVals.
empty()) {
1836 PositionalVals[ValNo].first,
1837 PositionalVals[ValNo].second);
1843 for (; ValNo != PositionalVals.
size(); ++ValNo)
1846 PositionalVals[ValNo].second);
1850 for (
const auto &Opt : OptionsMap) {
1855 Opt.second->
error(
"must be specified at least once!");
1856 ErrorParsing =
true;
1868 for (
int i = 0; i < argc; ++i)
dbgs() << argv[i] <<
' ';
1889 if (!ArgName.
data())
1891 if (ArgName.
empty())
1894 Errs <<
GlobalParser->ProgramName <<
": for the " << PrintArg(ArgName, 0);
1896 Errs <<
" option: " << Message <<
"\n";
1905 return handleOccurrence(pos, ArgName, Value);
1912 if (O.ValueStr.empty())
1927 size_t FirstLineIndentedBy) {
1928 assert(Indent >= FirstLineIndentedBy);
1929 std::pair<StringRef, StringRef> Split =
HelpStr.split(
'\n');
1932 while (!Split.second.empty()) {
1933 Split = Split.second.split(
'\n');
1934 outs().
indent(Indent) << Split.first <<
"\n";
1939 size_t FirstLineIndentedBy) {
1941 assert(BaseIndent >= FirstLineIndentedBy);
1942 std::pair<StringRef, StringRef> Split =
HelpStr.split(
'\n');
1943 outs().
indent(BaseIndent - FirstLineIndentedBy)
1945 while (!Split.second.empty()) {
1946 Split = Split.second.split(
'\n');
1947 outs().
indent(BaseIndent + ValHelpPrefix.
size()) << Split.first <<
"\n";
1952void alias::printOptionInfo(
size_t GlobalWidth)
const {
1968 if (!ValName.empty()) {
1969 size_t FormattingLen = 3;
1982 size_t GlobalWidth)
const {
1983 outs() << PrintArg(O.ArgStr);
1986 if (!ValName.empty()) {
1992 outs() << (O.ArgStr.size() == 1 ?
" <" :
"=<") <<
getValueStr(O, ValName)
2001 size_t GlobalWidth)
const {
2002 outs() << PrintArg(O.ArgStr);
2003 outs().
indent(GlobalWidth - O.ArgStr.size());
2023template <
typename FixedOrScalableQuantityT>
2026 FixedOrScalableQuantityT &
Value) {
2027 using ScalarTy =
typename FixedOrScalableQuantityT::ScalarTy;
2033 Value = FixedOrScalableQuantityT::getFixed(MinValue);
2039 return O.error(
"'" + Arg +
"' value invalid for " + ValueKind +
2042 Remainder = Remainder.
ltrim();
2044 return O.error(
"'" + Arg +
"' value invalid for " + ValueKind +
2047 Remainder = Remainder.
ltrim();
2049 return O.error(
"'" + Arg +
"' value invalid for " + ValueKind +
2052 Value = FixedOrScalableQuantityT::getScalable(MinValue);
2061 return O.error(
"'" + Arg +
"' value invalid for integer argument!");
2070 return O.error(
"'" + Arg +
"' value invalid for long argument!");
2079 return O.error(
"'" + Arg +
"' value invalid for llong argument!");
2089 return O.error(
"'" + Arg +
"' value invalid for uint argument!");
2096 unsigned long &
Value) {
2099 return O.error(
"'" + Arg +
"' value invalid for ulong argument!");
2107 unsigned long long &
Value) {
2110 return O.error(
"'" + Arg +
"' value invalid for ullong argument!");
2117 ElementCount &
Value) {
2126 return O.error(
"'" + Arg +
"' value invalid for floating point argument!");
2152 for (
unsigned i = 0; i != e; ++i) {
2168 return O.getValueExpectedFlag() !=
ValueOptional || !Name.empty() ||
2169 !Description.
empty();
2174 if (O.hasArgStr()) {
2186 size_t BaseSize = 0;
2197 size_t GlobalWidth)
const {
2198 if (O.hasArgStr()) {
2204 outs() << PrintArg(O.ArgStr);
2223 if (OptionName.
empty()) {
2228 if (!Description.
empty())
2234 if (!O.HelpStr.empty())
2235 outs() <<
" " << O.HelpStr <<
'\n';
2252 outs() <<
" " << PrintArg(O.ArgStr);
2253 outs().
indent(GlobalWidth - O.ArgStr.size());
2256 for (
unsigned i = 0; i != NumOpts; ++i) {
2264 for (
unsigned j = 0; j != NumOpts; ++j) {
2273 outs() <<
"= *unknown option value*\n";
2281 return OS << static_cast<int>(V);
2286#define PRINT_OPT_DIFF(T) \
2287 void parser<T>::printOptionDiff(const Option &O, T V, OptionValue<T> D, \
2288 size_t GlobalWidth) const { \
2289 printOptionName(O, GlobalWidth); \
2292 raw_string_ostream SS(Str); \
2295 outs() << "= " << Str; \
2296 size_t NumSpaces = \
2297 MaxOptWidth > Str.size() ? MaxOptWidth - Str.size() : 0; \
2298 outs().indent(NumSpaces) << " (default: "; \
2300 outs() << D.getValue(); \
2302 outs() << "*no default*"; \
2321 size_t GlobalWidth)
const {
2322 printOptionName(O, GlobalWidth);
2323 outs() <<
"= " << V;
2327 outs() <<
D.getValue();
2329 outs() <<
"*no default*";
2334 const Option &O, std::optional<StringRef> V,
2335 const OptionValue<std::optional<std::string>> &
D,
2336 size_t GlobalWidth)
const {
2337 printOptionName(O, GlobalWidth);
2338 outs() <<
"= " <<
V;
2339 size_t VSize =
V.has_value() ?
V.value().size() : 0;
2342 if (
D.hasValue() &&
D.getValue().has_value())
2343 outs() <<
D.getValue();
2345 outs() <<
"*no value*";
2351 size_t GlobalWidth)
const {
2353 outs() <<
"= *cannot print option value*\n";
2361 const std::pair<const char *, Option *> *
RHS) {
2362 return strcmp(
LHS->first,
RHS->first);
2366 const std::pair<const char *, SubCommand *> *
RHS) {
2367 return strcmp(
LHS->first,
RHS->first);
2376 for (
auto I = OptMap.
begin(),
E = OptMap.
end();
I !=
E; ++
I) {
2382 if (
I->second->getOptionHiddenFlag() ==
Hidden && !ShowHidden)
2386 if (!OptionSet.
insert(
I->second).second)
2390 std::pair<const char *, Option *>(
I->first.data(),
I->second));
2400 for (
auto *S : SubMap) {
2401 if (S->getName().empty())
2403 Subs.push_back(std::make_pair(S->getName().data(), S));
2412 const bool ShowHidden;
2413 using StrOptionPairVector =
2415 using StrSubCommandPairVector =
2418 virtual void printOptions(StrOptionPairVector &Opts,
size_t MaxArgLen) {
2419 for (
const auto &Opt : Opts)
2423 void printSubCommands(StrSubCommandPairVector &Subs,
size_t MaxSubLen) {
2424 for (
const auto &S : Subs) {
2425 outs() <<
" " << S.first;
2426 if (!S.second->getDescription().empty()) {
2428 outs() <<
" - " << S.second->getDescription();
2435 explicit HelpPrinter(
bool showHidden) : ShowHidden(showHidden) {}
2436 virtual ~HelpPrinter() =
default;
2439 void operator=(
bool Value) {
2450 auto &OptionsMap =
Sub->OptionsMap;
2451 auto &PositionalOpts =
Sub->PositionalOpts;
2452 auto &ConsumeAfterOpt =
Sub->ConsumeAfterOpt;
2454 StrOptionPairVector Opts;
2455 sortOpts(OptionsMap, Opts, ShowHidden);
2457 StrSubCommandPairVector Subs;
2466 outs() <<
" [subcommand]";
2467 outs() <<
" [options]";
2469 if (!
Sub->getDescription().empty()) {
2470 outs() <<
"SUBCOMMAND '" <<
Sub->getName()
2471 <<
"': " <<
Sub->getDescription() <<
"\n\n";
2477 for (
auto *Opt : PositionalOpts) {
2484 if (ConsumeAfterOpt)
2485 outs() <<
" " << ConsumeAfterOpt->HelpStr;
2489 size_t MaxSubLen = 0;
2490 for (
const auto &
Sub : Subs)
2491 MaxSubLen = std::max(MaxSubLen, strlen(
Sub.first));
2494 outs() <<
"SUBCOMMANDS:\n\n";
2495 printSubCommands(Subs, MaxSubLen);
2498 <<
" <subcommand> --help\" to get more help on a specific "
2505 size_t MaxArgLen = 0;
2506 for (
const auto &Opt : Opts)
2509 outs() <<
"OPTIONS:\n";
2510 printOptions(Opts, MaxArgLen);
2519class CategorizedHelpPrinter :
public HelpPrinter {
2521 explicit CategorizedHelpPrinter(
bool showHidden) : HelpPrinter(showHidden) {}
2527 static int OptionCategoryCompare(OptionCategory *
const *
A,
2528 OptionCategory *
const *
B) {
2529 return (*A)->getName().compare((*B)->getName());
2533 using HelpPrinter::operator=;
2536 void printOptions(StrOptionPairVector &Opts,
size_t MaxArgLen)
override {
2537 std::vector<OptionCategory *> SortedCategories;
2538 DenseMap<OptionCategory *, std::vector<Option *>> CategorizedOptions;
2546 assert(SortedCategories.size() > 0 &&
"No option categories registered!");
2548 OptionCategoryCompare);
2553 for (
const auto &
I : Opts) {
2554 Option *Opt =
I.second;
2555 for (OptionCategory *Cat : Opt->
Categories) {
2557 "Option has an unregistered category");
2558 CategorizedOptions[Cat].push_back(Opt);
2563 for (OptionCategory *Category : SortedCategories) {
2565 const auto &CategoryOptions = CategorizedOptions[Category];
2566 if (CategoryOptions.empty())
2571 outs() << Category->getName() <<
":\n";
2574 if (!Category->getDescription().empty())
2575 outs() << Category->getDescription() <<
"\n\n";
2580 for (
const Option *Opt : CategoryOptions)
2588class HelpPrinterWrapper {
2590 HelpPrinter &UncategorizedPrinter;
2591 CategorizedHelpPrinter &CategorizedPrinter;
2594 explicit HelpPrinterWrapper(HelpPrinter &UncategorizedPrinter,
2595 CategorizedHelpPrinter &CategorizedPrinter)
2596 : UncategorizedPrinter(UncategorizedPrinter),
2597 CategorizedPrinter(CategorizedPrinter) {}
2600 void operator=(
bool Value);
2605#if defined(__GNUC__)
2608# if defined(__OPTIMIZE__)
2609# define LLVM_IS_DEBUG_BUILD 0
2611# define LLVM_IS_DEBUG_BUILD 1
2613#elif defined(_MSC_VER)
2618# define LLVM_IS_DEBUG_BUILD 1
2620# define LLVM_IS_DEBUG_BUILD 0
2624# define LLVM_IS_DEBUG_BUILD 0
2628class VersionPrinter {
2630 void print(
const std::vector<VersionPrinterTy> &ExtraPrinters) {
2632#ifdef PACKAGE_VENDOR
2633 OS << PACKAGE_VENDOR <<
" ";
2635 OS <<
"LLVM (http://llvm.org/):\n ";
2637 OS << PACKAGE_NAME <<
" version " << PACKAGE_VERSION <<
"\n ";
2638#if LLVM_IS_DEBUG_BUILD
2639 OS <<
"DEBUG build";
2641 OS <<
"Optimized build";
2644 OS <<
" with assertions";
2650 if (!ExtraPrinters.empty()) {
2651 for (
const auto &
I : ExtraPrinters)
2655 void operator=(
bool OptionWasSpecified);
2658struct CommandLineCommonOptions {
2661 HelpPrinter UncategorizedNormalPrinter{
false};
2662 HelpPrinter UncategorizedHiddenPrinter{
true};
2663 CategorizedHelpPrinter CategorizedNormalPrinter{
false};
2664 CategorizedHelpPrinter CategorizedHiddenPrinter{
true};
2667 HelpPrinterWrapper WrappedNormalPrinter{UncategorizedNormalPrinter,
2668 CategorizedNormalPrinter};
2669 HelpPrinterWrapper WrappedHiddenPrinter{UncategorizedHiddenPrinter,
2670 CategorizedHiddenPrinter};
2680 "Display list of available options (--help-list-hidden for more)"),
2689 cl::desc(
"Display list of all available options"),
2701 cl::desc(
"Display available options (--help-hidden for more)"),
2712 cl::desc(
"Display all available options"),
2721 cl::desc(
"Print non-default options after command line parsing"),
2728 "print-all-options",
2729 cl::desc(
"Print all option values after command line parsing"),
2737 std::vector<VersionPrinterTy> ExtraVersionPrinters;
2740 VersionPrinter VersionPrinterInstance;
2743 "version",
cl::desc(
"Display the version of this program"),
2768 return GeneralCategory;
2771void VersionPrinter::operator=(
bool OptionWasSpecified) {
2772 if (!OptionWasSpecified)
2784void HelpPrinterWrapper::operator=(
bool Value) {
2791 if (
GlobalParser->RegisteredOptionCategories.size() > 1) {
2796 CategorizedPrinter =
true;
2798 UncategorizedPrinter =
true;
2805void CommandLineParser::printOptionValues() {
2810 sortOpts(ActiveSubCommand->OptionsMap, Opts,
true);
2813 size_t MaxArgLen = 0;
2814 for (
const auto &Opt : Opts)
2817 for (
const auto &Opt : Opts)
2823 if (!
Hidden && !Categorized)
2825 else if (!
Hidden && Categorized)
2827 else if (
Hidden && !Categorized)
2839#if LLVM_IS_DEBUG_BUILD
2845#ifdef EXPENSIVE_CHECKS
2846 "+expensive-checks",
2848#if __has_feature(address_sanitizer)
2851#if __has_feature(dataflow_sanitizer)
2854#if __has_feature(hwaddress_sanitizer)
2857#if __has_feature(memory_sanitizer)
2860#if __has_feature(thread_sanitizer)
2863#if __has_feature(undefined_behavior_sanitizer)
2866#ifdef LLVM_INTEGRATED_CRT_ALLOC
2867 "+alloc:" LLVM_INTEGRATED_CRT_ALLOC,
2875#if LLVM_VERSION_PRINTER_SHOW_BUILD_CONFIG
2876 OS <<
"Build config: ";
2900 return Sub.OptionsMap;
2910 for (
auto &
I :
Sub.OptionsMap) {
2911 bool Unrelated =
true;
2912 for (
auto &Cat :
I.second->Categories) {
2913 if (Cat == &Category || Cat == &
CommonOptions->GenericCategory)
2924 for (
auto &
I :
Sub.OptionsMap) {
2925 bool Unrelated =
true;
2926 for (
auto &Cat :
I.second->Categories) {
2942 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< 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 bool CommaSeparateAndAddOccurrence(Option *Handler, unsigned pos, StringRef ArgName, StringRef Value, bool MultiArg=false)
CommaSeparateAndAddOccurrence - A wrapper around Handler->addOccurrence() that does special handling ...
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 ManagedStatic< SubCommand > AllSubCommands
static bool parseDouble(Option &O, StringRef Arg, double &Value)
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 ManagedStatic< CommandLineParser > GlobalParser
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 LLVM_REQUIRE_CONSTANT_INITIALIZATION ManagedStatic< SubCommand > TopLevelSubCommand
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)
#define LLVM_REQUIRE_CONSTANT_INITIALIZATION
LLVM_REQUIRE_CONSTANT_INITIALIZATION - Apply this to globals to ensure that they are constant initial...
#define LLVM_EXPORT_TEMPLATE
static void Help(ArrayRef< StringRef > 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)
virtual bool addOccurrence(unsigned pos, StringRef ArgName, StringRef Value, bool MultiArg=false)
void setMiscFlag(enum MiscFlags M)
enum FormattingFlags getFormattingFlag() const
virtual void printOptionInfo(size_t GlobalWidth) const =0
enum NumOccurrencesFlag getNumOccurrencesFlag() const
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)
unsigned getNumAdditionalVals() const
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="")
SmallVector< Option *, 4 > SinkOpts
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.
@ C
The default llvm calling convention, compatible with C.
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.
FunctionAddr VTableAddr Value
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.
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.