31#include "llvm/Config/config.h"
51#define DEBUG_TYPE "commandline"
71#if !(defined(LLVM_ENABLE_LLVM_EXPORT_ANNOTATIONS) && defined(_MSC_VER))
88void GenericOptionValue::anchor() {}
89void OptionValue<boolOrDefault>::anchor() {}
90void OptionValue<std::string>::anchor() {}
91void Option::anchor() {}
125 size_t Len = ArgName.
size();
133 for (
size_t I = 0;
I < Pad; ++
I) {
162 OS <<
argPrefix(Arg.ArgName, Arg.Pad) << Arg.ArgName;
166class CommandLineParser {
170 std::string ProgramName;
174 std::vector<StringRef> MoreHelp;
194 bool LongOptionsUseDoubleDash =
false);
197 if (Opt.
Subs.empty()) {
202 for (
auto *SC : RegisteredSubCommands)
207 for (
auto *SC : Opt.
Subs) {
209 "SubCommand::getAll() should not be used with other subcommands");
218 errs() << ProgramName <<
": CommandLine Error: Option '" << Name
219 <<
"' registered more than once!\n";
226 Opt, [&](
SubCommand &SC) { addLiteralOption(Opt, &SC, Name); });
230 bool HadErrors =
false;
231 if (O->hasArgStr()) {
238 errs() << ProgramName <<
": CommandLine Error: Option '" << O->ArgStr
239 <<
"' registered more than once!\n";
247 else if (O->getMiscFlags() &
cl::Sink)
251 O->error(
"Cannot specify more than one option with cl::ConsumeAfter!");
265 void addOption(
Option *O,
bool ProcessDefaultOption =
false) {
266 if (!ProcessDefaultOption && O->isDefaultOption()) {
270 forEachSubCommand(*O, [&](
SubCommand &SC) { addOption(O, &SC); });
275 O->getExtraOptionNames(OptionNames);
280 for (
auto Name : OptionNames) {
281 auto I =
Sub.OptionsMap.find(Name);
284 if (
I !=
Sub.OptionsMap.end() &&
I->second == O)
285 Sub.OptionsMap.erase(
I);
289 for (
auto *Opt =
Sub.PositionalOpts.begin();
290 Opt !=
Sub.PositionalOpts.end(); ++Opt) {
292 Sub.PositionalOpts.erase(Opt);
296 else if (O->getMiscFlags() &
cl::Sink)
297 for (
auto *Opt =
Sub.SinkOpts.begin(); Opt !=
Sub.SinkOpts.end(); ++Opt) {
299 Sub.SinkOpts.erase(Opt);
303 else if (O ==
Sub.ConsumeAfterOpt)
304 Sub.ConsumeAfterOpt =
nullptr;
307 void removeOption(
Option *O) {
308 forEachSubCommand(*O, [&](
SubCommand &SC) { removeOption(O, &SC); });
312 return (!
Sub.OptionsMap.empty() || !
Sub.PositionalOpts.empty() ||
313 nullptr !=
Sub.ConsumeAfterOpt);
316 bool hasOptions()
const {
317 for (
const auto *S : RegisteredSubCommands) {
324 bool hasNamedSubCommands()
const {
325 for (
const auto *S : RegisteredSubCommands)
326 if (!S->getName().empty())
331 SubCommand *getActiveSubCommand() {
return ActiveSubCommand; }
335 if (!
Sub.OptionsMap.insert(std::make_pair(NewName, O)).second) {
336 errs() << ProgramName <<
": CommandLine Error: Option '" << O->ArgStr
337 <<
"' registered more than once!\n";
340 Sub.OptionsMap.erase(O->ArgStr);
344 forEachSubCommand(*O,
345 [&](
SubCommand &SC) { updateArgStr(O, NewName, &SC); });
348 void printOptionValues();
355 "Duplicate option categories");
363 return (!
sub->getName().empty()) &&
364 (
Sub->getName() ==
sub->getName());
366 "Duplicate subcommands");
372 "SubCommand::getAll() should not be registered");
375 if ((O->isPositional() || O->isSink() || O->isConsumeAfter()) ||
379 addLiteralOption(*O,
sub,
E.first);
390 RegisteredSubCommands.
end());
394 ActiveSubCommand =
nullptr;
399 RegisteredOptionCategories.
clear();
402 RegisteredSubCommands.
clear();
408 DefaultOptions.
clear();
416 bool LongOptionsUseDoubleDash,
bool HaveDoubleDash) {
418 if (Opt && LongOptionsUseDoubleDash && !HaveDoubleDash && !
isGrouping(Opt))
429template <
typename T, T TrueVal, T FalseVal>
431 if (Arg ==
"" || Arg ==
"true" || Arg ==
"TRUE" || Arg ==
"True" ||
437 if (Arg ==
"false" || Arg ==
"FALSE" || Arg ==
"False" || Arg ==
"0") {
441 return O.error(
"'" + Arg +
442 "' is invalid value for boolean argument! Try 0 or 1");
455 FullyInitialized =
true;
461 if (FullyInitialized)
487void OptionCategory::registerCategory() {
521SubCommand::operator
bool()
const {
539 size_t EqualPos = Arg.
find(
'=');
544 return Sub.OptionsMap.lookup(Arg);
550 auto I =
Sub.OptionsMap.find(Arg.
substr(0, EqualPos));
551 if (
I ==
Sub.OptionsMap.end())
559 Arg = Arg.
substr(0, EqualPos);
564 std::string &NearestString) {
569 for (
auto *S : RegisteredSubCommands) {
571 "SubCommand::getAll() is not expected in RegisteredSubCommands");
572 if (S->getName().empty())
575 if (S->getName() == Name)
578 if (!NearestMatch && S->getName().edit_distance(Name) < 2)
583 NearestString = NearestMatch->
getName();
594 std::string &NearestString) {
600 std::pair<StringRef, StringRef> SplitArg = Arg.
split(
'=');
606 unsigned BestDistance = 0;
607 for (
const auto &[
_, O] : OptionsMap) {
613 O->getExtraOptionNames(OptionNames);
619 for (
const auto &Name : OptionNames) {
621 Flag,
true, BestDistance);
622 if (!Best || Distance < BestDistance) {
624 BestDistance = Distance;
625 if (
RHS.empty() || !PermitValue)
626 NearestString = std::string(Name);
628 NearestString = (
Twine(Name) +
"=" +
RHS).str();
640 bool MultiArg =
false) {
652 Val = Val.
substr(Pos + 1);
668 const char *
const *argv,
int &i) {
679 return Handler->
error(
"requires a value!");
681 assert(argv &&
"null check");
686 if (NumAdditionalVals > 0)
687 return Handler->
error(
"multi-valued option specified"
688 " with ValueDisallowed modifier!");
699 if (NumAdditionalVals == 0)
703 bool MultiArg =
false;
712 while (NumAdditionalVals > 0) {
714 return Handler->
error(
"not enough values!");
715 assert(argv &&
"null check");
738 bool (*Pred)(
const Option *),
740 auto OMI = OptionsMap.
find(Name);
741 if (OMI != OptionsMap.
end() && !Pred(OMI->second))
742 OMI = OptionsMap.
end();
747 while (OMI == OptionsMap.
end() && Name.size() > 1) {
748 Name = Name.drop_back();
749 OMI = OptionsMap.
find(Name);
750 if (OMI != OptionsMap.
end() && !Pred(OMI->second))
751 OMI = OptionsMap.
end();
754 if (OMI != OptionsMap.
end() && Pred(OMI->second)) {
781 assert(OptionsMap.
count(Arg) && OptionsMap.
find(Arg)->second == PGOpt);
791 if (MaybeValue[0] ==
'=') {
801 ErrorParsing |= PGOpt->
error(
"may not occur within a group!");
830 return C ==
' ' ||
C ==
'\t' ||
C ==
'\r' ||
C ==
'\n';
837static bool isQuote(
char C) {
return C ==
'\"' ||
C ==
'\''; }
843 bool InToken =
false;
844 for (
size_t I = 0, E = Src.size();
I != E; ++
I) {
849 if (MarkEOLs && Src[
I] ==
'\n')
861 if (
I + 1 < E &&
C ==
'\\') {
870 while (
I != E && Src[
I] !=
C) {
872 if (Src[
I] ==
'\\' &&
I + 1 != E)
886 if (MarkEOLs &&
C ==
'\n')
920 size_t E = Src.size();
921 int BackslashCount = 0;
926 }
while (
I !=
E && Src[
I] ==
'\\');
928 bool FollowedByDoubleQuote = (
I !=
E && Src[
I] ==
'"');
929 if (FollowedByDoubleQuote) {
930 Token.
append(BackslashCount / 2,
'\\');
931 if (BackslashCount % 2 == 0)
936 Token.
append(BackslashCount,
'\\');
954 bool AlwaysCopy,
function_ref<
void()> MarkEOL,
bool InitialCommandName) {
963 bool CommandName = InitialCommandName;
966 enum {
INIT, UNQUOTED, QUOTED } State =
INIT;
968 for (
size_t I = 0,
E = Src.size();
I <
E; ++
I) {
971 assert(Token.
empty() &&
"token should be empty in initial state");
993 AddToken(AlwaysCopy ? Saver.
save(NormalChars) : NormalChars);
994 if (
I <
E && Src[
I] ==
'\n') {
996 CommandName = InitialCommandName;
1000 }
else if (Src[
I] ==
'\"') {
1001 Token += NormalChars;
1003 }
else if (Src[
I] ==
'\\') {
1004 assert(!CommandName &&
"or else we'd have treated it as a normal char");
1005 Token += NormalChars;
1019 AddToken(Saver.
save(Token.
str()));
1021 if (Src[
I] ==
'\n') {
1022 CommandName = InitialCommandName;
1025 CommandName =
false;
1028 }
else if (Src[
I] ==
'\"') {
1030 }
else if (Src[
I] ==
'\\' && !CommandName) {
1038 if (Src[
I] ==
'\"') {
1039 if (
I < (
E - 1) && Src[
I + 1] ==
'"') {
1048 }
else if (Src[
I] ==
'\\' && !CommandName) {
1058 AddToken(Saver.
save(Token.
str()));
1065 auto OnEOL = [&]() {
1070 true, OnEOL,
false);
1076 auto OnEOL = []() {};
1085 auto OnEOL = [&]() {
1096 for (
const char *Cur = Source.begin(); Cur != Source.end();) {
1105 while (Cur != Source.end() && *Cur !=
'\n')
1110 const char *Start = Cur;
1111 for (
const char *End = Source.end(); Cur != End; ++Cur) {
1113 if (Cur + 1 != End) {
1116 (*Cur ==
'\r' && (Cur + 1 != End) && Cur[1] ==
'\n')) {
1117 Line.append(Start, Cur - 1);
1123 }
else if (*Cur ==
'\n')
1127 Line.append(Start, Cur);
1135 return (S.
size() >= 3 && S[0] ==
'\xef' && S[1] ==
'\xbb' && S[2] ==
'\xbf');
1149 TokenPos = ArgString.
find(Token, StartPos)) {
1153 if (ResponseFile.
empty())
1157 ResponseFile.
append(BasePath);
1158 StartPos = TokenPos + Token.
size();
1161 if (!ResponseFile.
empty()) {
1164 if (!Remaining.
empty())
1171Error ExpansionContext::expandResponseFile(
1172 StringRef FName, SmallVectorImpl<const char *> &NewArgv) {
1174 llvm::ErrorOr<std::unique_ptr<MemoryBuffer>> MemBufOrErr =
1175 FS->getBufferForFile(FName);
1179 "': " +
EC.message());
1181 MemoryBuffer &MemBuf = *MemBufOrErr.
get();
1186 std::string UTF8Buf;
1190 "Could not convert UTF16 to UTF8");
1191 Str = StringRef(UTF8Buf);
1197 Str = StringRef(BufRef.data() + 3, BufRef.size() - 3);
1200 Tokenizer(Str, Saver, NewArgv, MarkEOLs);
1205 if (!RelativeNames && !InConfigFile)
1209 for (
const char *&Arg : NewArgv) {
1219 StringRef ArgStr(Arg);
1221 bool ConfigInclusion =
false;
1222 if (ArgStr.consume_front(
"@")) {
1226 }
else if (ArgStr.consume_front(
"--config=")) {
1228 ConfigInclusion =
true;
1234 SmallString<128> ResponseFile;
1237 SmallString<128> FilePath;
1240 std::make_error_code(std::errc::no_such_file_or_directory),
1241 "cannot not find configuration file: " + FileName);
1242 ResponseFile.
append(FilePath);
1244 ResponseFile.
append(BasePath);
1247 Arg = Saver.save(ResponseFile.
str()).
data();
1256 struct ResponseFileRecord {
1271 for (
unsigned I = 0;
I != Argv.
size();) {
1272 while (
I == FileStack.
back().End) {
1278 const char *Arg = Argv[
I];
1280 if (Arg ==
nullptr) {
1285 if (Arg[0] !=
'@') {
1290 const char *FName = Arg + 1;
1295 if (CurrentDir.empty()) {
1296 if (
auto CWD = FS->getCurrentWorkingDirectory()) {
1300 CWD.getError(),
Twine(
"cannot get absolute path for: ") + FName);
1303 CurrDir = CurrentDir;
1306 FName = CurrDir.
c_str();
1310 if (!Res || !Res->exists()) {
1311 std::error_code EC = Res.
getError();
1312 if (!InConfigFile) {
1323 "': " + EC.message());
1328 [FileStatus,
this](
const ResponseFileRecord &RFile) ->
ErrorOr<bool> {
1340 R.getError(),
Twine(
"recursive expansion of: '") +
F.File +
"'");
1343 Twine(
"cannot open file: ") +
F.File);
1350 if (
Error Err = expandResponseFile(FName, ExpandedArgv))
1353 for (ResponseFileRecord &
Record : FileStack) {
1384 Tokenize(*EnvValue, Saver, NewArgv,
false);
1387 NewArgv.
append(Argv + 1, Argv + Argc);
1408 : Saver(
A), Tokenizer(
T), FS(FS ? FS :
vfs::getRealFileSystem().
get()) {}
1414 auto Status = FS->status(Path);
1422 CfgFilePath = FileName;
1425 if (!FileExists(CfgFilePath))
1432 for (
const StringRef &Dir : SearchDirs) {
1438 if (FileExists(CfgFilePath)) {
1452 if (std::error_code EC = FS->makeAbsolute(AbsPath))
1454 EC,
Twine(
"cannot get absolute path for " + CfgFile));
1455 CfgFile = AbsPath.
str();
1457 InConfigFile =
true;
1458 RelativeNames =
true;
1459 if (
Error Err = expandResponseFile(CfgFile, Argv))
1468 bool LongOptionsUseDoubleDash) {
1477 if (std::optional<std::string> EnvValue =
1483 for (
int I = 1;
I < argc; ++
I)
1485 int NewArgc =
static_cast<int>(NewArgv.
size());
1489 NewArgc, &NewArgv[0], Overview, Errs, VFS, LongOptionsUseDoubleDash);
1493void CommandLineParser::ResetAllOptionOccurrences() {
1497 for (
auto *SC : RegisteredSubCommands) {
1501 Opts.
reserve(SC->OptionsMap.size());
1502 for (
auto &O : SC->OptionsMap)
1506 for (
Option *O : SC->PositionalOpts)
1508 for (
Option *O : SC->SinkOpts)
1510 if (SC->ConsumeAfterOpt)
1511 SC->ConsumeAfterOpt->reset();
1515bool CommandLineParser::ParseCommandLineOptions(
1518 assert(hasOptions() &&
"No options specified!");
1520 ProgramOverview = Overview;
1521 bool IgnoreErrors = Errs;
1526 bool ErrorParsing =
false;
1537 if (
Error Err = ECtx.expandResponseFiles(newArgv)) {
1538 *Errs <<
toString(std::move(Err)) <<
'\n';
1542 argc =
static_cast<int>(newArgv.size());
1548 unsigned NumPositionalRequired = 0;
1551 bool HasUnlimitedPositionals =
false;
1555 std::string NearestSubCommandString;
1556 bool MaybeNamedSubCommand =
1557 argc >= 2 && argv[FirstArg][0] !=
'-' && hasNamedSubCommands();
1558 if (MaybeNamedSubCommand) {
1562 LookupSubCommand(
StringRef(argv[FirstArg]), NearestSubCommandString);
1568 assert(ChosenSubCommand);
1571 auto &SinkOpts = ChosenSubCommand->
SinkOpts;
1572 auto &OptionsMap = ChosenSubCommand->
OptionsMap;
1574 for (
auto *O: DefaultOptions) {
1578 if (ConsumeAfterOpt) {
1579 assert(PositionalOpts.size() > 0 &&
1580 "Cannot specify cl::ConsumeAfter without a positional argument!");
1582 if (!PositionalOpts.empty()) {
1585 bool UnboundedFound =
false;
1586 for (
size_t i = 0, e = PositionalOpts.size(); i != e; ++i) {
1587 Option *Opt = PositionalOpts[i];
1589 ++NumPositionalRequired;
1590 else if (ConsumeAfterOpt) {
1593 if (PositionalOpts.size() > 1) {
1595 Opt->
error(
"error - this positional option will never be matched, "
1596 "because it does not Require a value, and a "
1597 "cl::ConsumeAfter option is active!");
1598 ErrorParsing =
true;
1600 }
else if (UnboundedFound && !Opt->
hasArgStr()) {
1606 Opt->
error(
"error - option can never match, because "
1607 "another positional argument will match an "
1608 "unbounded number of values, and this option"
1609 " does not require a value!");
1610 *Errs << ProgramName <<
": CommandLine Error: Option '" << Opt->
ArgStr
1611 <<
"' is all messed up!\n";
1612 *Errs << PositionalOpts.size();
1613 ErrorParsing =
true;
1617 HasUnlimitedPositionals = UnboundedFound || ConsumeAfterOpt;
1628 Option *ActivePositionalArg =
nullptr;
1631 bool DashDashFound =
false;
1632 for (
int i = FirstArg; i < argc; ++i) {
1633 Option *Handler =
nullptr;
1634 std::string NearestHandlerString;
1636 StringRef ArgName =
"";
1637 bool HaveDoubleDash =
false;
1643 if (argv[i][0] !=
'-' || argv[i][1] == 0 || DashDashFound) {
1645 if (ActivePositionalArg) {
1650 if (!PositionalOpts.empty()) {
1651 PositionalVals.
push_back(std::make_pair(StringRef(argv[i]), i));
1656 if (PositionalVals.
size() >= NumPositionalRequired && ConsumeAfterOpt) {
1657 for (++i; i < argc; ++i)
1658 PositionalVals.
push_back(std::make_pair(StringRef(argv[i]), i));
1665 }
else if (argv[i][0] ==
'-' && argv[i][1] ==
'-' && argv[i][2] == 0 &&
1667 DashDashFound =
true;
1669 }
else if (ActivePositionalArg &&
1674 ArgName = StringRef(argv[i] + 1);
1677 HaveDoubleDash =
true;
1679 Handler = LookupLongOption(*ChosenSubCommand, ArgName,
Value,
1680 LongOptionsUseDoubleDash, HaveDoubleDash);
1686 ArgName = StringRef(argv[i] + 1);
1689 HaveDoubleDash =
true;
1691 Handler = LookupLongOption(*ChosenSubCommand, ArgName,
Value,
1692 LongOptionsUseDoubleDash, HaveDoubleDash);
1699 LongOptionsUseDoubleDash, HaveDoubleDash);
1702 if (!Handler && !(LongOptionsUseDoubleDash && HaveDoubleDash))
1708 if (!Handler && SinkOpts.empty())
1713 if (!SinkOpts.empty()) {
1714 for (
Option *SinkOpt : SinkOpts)
1715 SinkOpt->addOccurrence(i,
"", StringRef(argv[i]));
1719 auto ReportUnknownArgument = [&](
bool IsArg,
1720 StringRef NearestArgumentName) {
1721 *Errs << ProgramName <<
": Unknown "
1722 << (IsArg ?
"command line argument" :
"subcommand") <<
" '"
1723 << argv[i] <<
"'. Try: '" << argv[0] <<
" --help'\n";
1725 if (NearestArgumentName.empty())
1728 *Errs << ProgramName <<
": Did you mean '";
1730 *Errs << PrintArg(NearestArgumentName, 0);
1732 *Errs << NearestArgumentName;
1736 if (i > 1 || !MaybeNamedSubCommand)
1737 ReportUnknownArgument(
true, NearestHandlerString);
1739 ReportUnknownArgument(
false, NearestSubCommandString);
1741 ErrorParsing =
true;
1749 Handler->
error(
"This argument does not take a value.\n"
1750 "\tInstead, it consumes any positional arguments until "
1751 "the next recognized option.", *Errs);
1752 ErrorParsing =
true;
1754 ActivePositionalArg = Handler;
1761 if (NumPositionalRequired > PositionalVals.
size()) {
1762 *Errs << ProgramName
1763 <<
": Not enough positional command line arguments specified!\n"
1764 <<
"Must specify at least " << NumPositionalRequired
1765 <<
" positional argument" << (NumPositionalRequired > 1 ?
"s" :
"")
1766 <<
": See: " << argv[0] <<
" --help\n";
1768 ErrorParsing =
true;
1769 }
else if (!HasUnlimitedPositionals &&
1770 PositionalVals.
size() > PositionalOpts.size()) {
1771 *Errs << ProgramName <<
": Too many positional arguments specified!\n"
1772 <<
"Can specify at most " << PositionalOpts.size()
1773 <<
" positional arguments: See: " << argv[0] <<
" --help\n";
1774 ErrorParsing =
true;
1776 }
else if (!ConsumeAfterOpt) {
1778 unsigned ValNo = 0, NumVals =
static_cast<unsigned>(PositionalVals.
size());
1779 for (
Option *Opt : PositionalOpts) {
1782 PositionalVals[ValNo].second);
1784 --NumPositionalRequired;
1792 while (NumVals - ValNo > NumPositionalRequired && !
Done) {
1800 PositionalVals[ValNo].second);
1805 "positional argument processing!");
1810 assert(ConsumeAfterOpt && NumPositionalRequired <= PositionalVals.
size());
1812 for (
Option *Opt : PositionalOpts)
1815 Opt, PositionalVals[ValNo].first, PositionalVals[ValNo].second);
1824 if (PositionalOpts.size() == 1 && ValNo == 0 && !PositionalVals.
empty()) {
1826 PositionalVals[ValNo].first,
1827 PositionalVals[ValNo].second);
1833 for (; ValNo != PositionalVals.
size(); ++ValNo)
1836 PositionalVals[ValNo].second);
1840 for (
const auto &Opt : OptionsMap) {
1845 Opt.second->
error(
"must be specified at least once!");
1846 ErrorParsing =
true;
1858 for (
int i = 0; i < argc; ++i)
dbgs() << argv[i] <<
' ';
1879 if (!ArgName.
data())
1881 if (ArgName.
empty())
1884 Errs <<
GlobalParser->ProgramName <<
": for the " << PrintArg(ArgName, 0);
1886 Errs <<
" option: " << Message <<
"\n";
1895 return handleOccurrence(pos, ArgName, Value);
1902 if (O.ValueStr.empty())
1917 size_t FirstLineIndentedBy) {
1918 assert(Indent >= FirstLineIndentedBy);
1919 std::pair<StringRef, StringRef> Split =
HelpStr.split(
'\n');
1922 while (!Split.second.empty()) {
1923 Split = Split.second.split(
'\n');
1924 outs().
indent(Indent) << Split.first <<
"\n";
1929 size_t FirstLineIndentedBy) {
1931 assert(BaseIndent >= FirstLineIndentedBy);
1932 std::pair<StringRef, StringRef> Split =
HelpStr.split(
'\n');
1933 outs().
indent(BaseIndent - FirstLineIndentedBy)
1935 while (!Split.second.empty()) {
1936 Split = Split.second.split(
'\n');
1937 outs().
indent(BaseIndent + ValHelpPrefix.
size()) << Split.first <<
"\n";
1942void alias::printOptionInfo(
size_t GlobalWidth)
const {
1958 if (!ValName.empty()) {
1959 size_t FormattingLen = 3;
1972 size_t GlobalWidth)
const {
1973 outs() << PrintArg(O.ArgStr);
1976 if (!ValName.empty()) {
1982 outs() << (O.ArgStr.size() == 1 ?
" <" :
"=<") <<
getValueStr(O, ValName)
1991 size_t GlobalWidth)
const {
1992 outs() << PrintArg(O.ArgStr);
1993 outs().
indent(GlobalWidth - O.ArgStr.size());
2015 return O.error(
"'" + Arg +
"' value invalid for integer argument!");
2024 return O.error(
"'" + Arg +
"' value invalid for long argument!");
2033 return O.error(
"'" + Arg +
"' value invalid for llong argument!");
2043 return O.error(
"'" + Arg +
"' value invalid for uint argument!");
2050 unsigned long &
Value) {
2053 return O.error(
"'" + Arg +
"' value invalid for ulong argument!");
2061 unsigned long long &
Value) {
2064 return O.error(
"'" + Arg +
"' value invalid for ullong argument!");
2073 return O.error(
"'" + Arg +
"' value invalid for floating point argument!");
2099 for (
unsigned i = 0; i != e; ++i) {
2115 return O.getValueExpectedFlag() !=
ValueOptional || !Name.empty() ||
2116 !Description.
empty();
2121 if (O.hasArgStr()) {
2133 size_t BaseSize = 0;
2144 size_t GlobalWidth)
const {
2145 if (O.hasArgStr()) {
2151 outs() << PrintArg(O.ArgStr);
2170 if (OptionName.
empty()) {
2175 if (!Description.
empty())
2181 if (!O.HelpStr.empty())
2182 outs() <<
" " << O.HelpStr <<
'\n';
2199 outs() <<
" " << PrintArg(O.ArgStr);
2200 outs().
indent(GlobalWidth - O.ArgStr.size());
2203 for (
unsigned i = 0; i != NumOpts; ++i) {
2211 for (
unsigned j = 0; j != NumOpts; ++j) {
2220 outs() <<
"= *unknown option value*\n";
2225#define PRINT_OPT_DIFF(T) \
2226 void parser<T>::printOptionDiff(const Option &O, T V, OptionValue<T> D, \
2227 size_t GlobalWidth) const { \
2228 printOptionName(O, GlobalWidth); \
2231 raw_string_ostream SS(Str); \
2234 outs() << "= " << Str; \
2235 size_t NumSpaces = \
2236 MaxOptWidth > Str.size() ? MaxOptWidth - Str.size() : 0; \
2237 outs().indent(NumSpaces) << " (default: "; \
2239 outs() << D.getValue(); \
2241 outs() << "*no default*"; \
2259 size_t GlobalWidth)
const {
2260 printOptionName(O, GlobalWidth);
2261 outs() <<
"= " << V;
2265 outs() <<
D.getValue();
2267 outs() <<
"*no default*";
2272 const Option &O, std::optional<StringRef> V,
2274 size_t GlobalWidth)
const {
2275 printOptionName(O, GlobalWidth);
2276 outs() <<
"= " <<
V;
2277 size_t VSize =
V.has_value() ?
V.value().size() : 0;
2280 if (
D.hasValue() &&
D.getValue().has_value())
2281 outs() <<
D.getValue();
2283 outs() <<
"*no value*";
2289 size_t GlobalWidth)
const {
2291 outs() <<
"= *cannot print option value*\n";
2299 const std::pair<const char *, Option *> *
RHS) {
2300 return strcmp(
LHS->first,
RHS->first);
2304 const std::pair<const char *, SubCommand *> *
RHS) {
2305 return strcmp(
LHS->first,
RHS->first);
2314 for (
auto I = OptMap.
begin(),
E = OptMap.
end();
I !=
E; ++
I) {
2320 if (
I->second->getOptionHiddenFlag() ==
Hidden && !ShowHidden)
2324 if (!OptionSet.
insert(
I->second).second)
2328 std::pair<const char *, Option *>(
I->first.data(),
I->second));
2338 for (
auto *S : SubMap) {
2339 if (S->getName().empty())
2341 Subs.push_back(std::make_pair(S->getName().data(), S));
2350 const bool ShowHidden;
2351 using StrOptionPairVector =
2353 using StrSubCommandPairVector =
2356 virtual void printOptions(StrOptionPairVector &Opts,
size_t MaxArgLen) {
2357 for (
const auto &Opt : Opts)
2361 void printSubCommands(StrSubCommandPairVector &Subs,
size_t MaxSubLen) {
2362 for (
const auto &S : Subs) {
2363 outs() <<
" " << S.first;
2364 if (!S.second->getDescription().empty()) {
2366 outs() <<
" - " << S.second->getDescription();
2373 explicit HelpPrinter(
bool showHidden) : ShowHidden(showHidden) {}
2374 virtual ~HelpPrinter() =
default;
2377 void operator=(
bool Value) {
2388 auto &OptionsMap =
Sub->OptionsMap;
2389 auto &PositionalOpts =
Sub->PositionalOpts;
2390 auto &ConsumeAfterOpt =
Sub->ConsumeAfterOpt;
2392 StrOptionPairVector Opts;
2393 sortOpts(OptionsMap, Opts, ShowHidden);
2395 StrSubCommandPairVector Subs;
2404 outs() <<
" [subcommand]";
2405 outs() <<
" [options]";
2407 if (!
Sub->getDescription().empty()) {
2408 outs() <<
"SUBCOMMAND '" <<
Sub->getName()
2409 <<
"': " <<
Sub->getDescription() <<
"\n\n";
2415 for (
auto *Opt : PositionalOpts) {
2422 if (ConsumeAfterOpt)
2423 outs() <<
" " << ConsumeAfterOpt->HelpStr;
2427 size_t MaxSubLen = 0;
2428 for (
const auto &
Sub : Subs)
2429 MaxSubLen = std::max(MaxSubLen, strlen(
Sub.first));
2432 outs() <<
"SUBCOMMANDS:\n\n";
2433 printSubCommands(Subs, MaxSubLen);
2436 <<
" <subcommand> --help\" to get more help on a specific "
2443 size_t MaxArgLen = 0;
2444 for (
const auto &Opt : Opts)
2447 outs() <<
"OPTIONS:\n";
2448 printOptions(Opts, MaxArgLen);
2457class CategorizedHelpPrinter :
public HelpPrinter {
2459 explicit CategorizedHelpPrinter(
bool showHidden) : HelpPrinter(showHidden) {}
2465 static int OptionCategoryCompare(OptionCategory *
const *
A,
2466 OptionCategory *
const *
B) {
2467 return (*A)->getName().compare((*B)->getName());
2471 using HelpPrinter::operator=;
2474 void printOptions(StrOptionPairVector &Opts,
size_t MaxArgLen)
override {
2475 std::vector<OptionCategory *> SortedCategories;
2476 DenseMap<OptionCategory *, std::vector<Option *>> CategorizedOptions;
2484 assert(SortedCategories.size() > 0 &&
"No option categories registered!");
2486 OptionCategoryCompare);
2491 for (
const auto &
I : Opts) {
2492 Option *Opt =
I.second;
2493 for (OptionCategory *Cat : Opt->
Categories) {
2495 "Option has an unregistered category");
2496 CategorizedOptions[Cat].push_back(Opt);
2501 for (OptionCategory *Category : SortedCategories) {
2503 const auto &CategoryOptions = CategorizedOptions[Category];
2504 if (CategoryOptions.empty())
2509 outs() << Category->getName() <<
":\n";
2512 if (!Category->getDescription().empty())
2513 outs() << Category->getDescription() <<
"\n\n";
2518 for (
const Option *Opt : CategoryOptions)
2526class HelpPrinterWrapper {
2528 HelpPrinter &UncategorizedPrinter;
2529 CategorizedHelpPrinter &CategorizedPrinter;
2532 explicit HelpPrinterWrapper(HelpPrinter &UncategorizedPrinter,
2533 CategorizedHelpPrinter &CategorizedPrinter)
2534 : UncategorizedPrinter(UncategorizedPrinter),
2535 CategorizedPrinter(CategorizedPrinter) {}
2538 void operator=(
bool Value);
2543#if defined(__GNUC__)
2546# if defined(__OPTIMIZE__)
2547# define LLVM_IS_DEBUG_BUILD 0
2549# define LLVM_IS_DEBUG_BUILD 1
2551#elif defined(_MSC_VER)
2556# define LLVM_IS_DEBUG_BUILD 1
2558# define LLVM_IS_DEBUG_BUILD 0
2562# define LLVM_IS_DEBUG_BUILD 0
2566class VersionPrinter {
2568 void print(
const std::vector<VersionPrinterTy> &ExtraPrinters) {
2570#ifdef PACKAGE_VENDOR
2571 OS << PACKAGE_VENDOR <<
" ";
2573 OS <<
"LLVM (http://llvm.org/):\n ";
2575 OS << PACKAGE_NAME <<
" version " << PACKAGE_VERSION <<
"\n ";
2576#if LLVM_IS_DEBUG_BUILD
2577 OS <<
"DEBUG build";
2579 OS <<
"Optimized build";
2582 OS <<
" with assertions";
2588 if (!ExtraPrinters.empty()) {
2589 for (
const auto &
I : ExtraPrinters)
2593 void operator=(
bool OptionWasSpecified);
2596struct CommandLineCommonOptions {
2599 HelpPrinter UncategorizedNormalPrinter{
false};
2600 HelpPrinter UncategorizedHiddenPrinter{
true};
2601 CategorizedHelpPrinter CategorizedNormalPrinter{
false};
2602 CategorizedHelpPrinter CategorizedHiddenPrinter{
true};
2605 HelpPrinterWrapper WrappedNormalPrinter{UncategorizedNormalPrinter,
2606 CategorizedNormalPrinter};
2607 HelpPrinterWrapper WrappedHiddenPrinter{UncategorizedHiddenPrinter,
2608 CategorizedHiddenPrinter};
2618 "Display list of available options (--help-list-hidden for more)"),
2627 cl::desc(
"Display list of all available options"),
2639 cl::desc(
"Display available options (--help-hidden for more)"),
2650 cl::desc(
"Display all available options"),
2659 cl::desc(
"Print non-default options after command line parsing"),
2666 "print-all-options",
2667 cl::desc(
"Print all option values after command line parsing"),
2675 std::vector<VersionPrinterTy> ExtraVersionPrinters;
2678 VersionPrinter VersionPrinterInstance;
2681 "version",
cl::desc(
"Display the version of this program"),
2706 return GeneralCategory;
2709void VersionPrinter::operator=(
bool OptionWasSpecified) {
2710 if (!OptionWasSpecified)
2722void HelpPrinterWrapper::operator=(
bool Value) {
2729 if (
GlobalParser->RegisteredOptionCategories.size() > 1) {
2734 CategorizedPrinter =
true;
2736 UncategorizedPrinter =
true;
2743void CommandLineParser::printOptionValues() {
2748 sortOpts(ActiveSubCommand->OptionsMap, Opts,
true);
2751 size_t MaxArgLen = 0;
2752 for (
const auto &Opt : Opts)
2755 for (
const auto &Opt : Opts)
2761 if (!
Hidden && !Categorized)
2763 else if (!
Hidden && Categorized)
2765 else if (
Hidden && !Categorized)
2777#if LLVM_IS_DEBUG_BUILD
2783#ifdef EXPENSIVE_CHECKS
2784 "+expensive-checks",
2786#if __has_feature(address_sanitizer)
2789#if __has_feature(dataflow_sanitizer)
2792#if __has_feature(hwaddress_sanitizer)
2795#if __has_feature(memory_sanitizer)
2798#if __has_feature(thread_sanitizer)
2801#if __has_feature(undefined_behavior_sanitizer)
2810#if LLVM_VERSION_PRINTER_SHOW_BUILD_CONFIG
2811 OS <<
"Build config: ";
2835 return Sub.OptionsMap;
2845 for (
auto &
I :
Sub.OptionsMap) {
2846 bool Unrelated =
true;
2847 for (
auto &Cat :
I.second->Categories) {
2848 if (Cat == &Category || Cat == &
CommonOptions->GenericCategory)
2859 for (
auto &
I :
Sub.OptionsMap) {
2860 bool Unrelated =
true;
2861 for (
auto &Cat :
I.second->Categories) {
2877 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 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).
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
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
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 printOptionDiff(const Option &O, const AnyOptionValue &V, const AnyOptionValue &Default, size_t GlobalWidth) const
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.
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()
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
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.