31#include "llvm/Config/config.h"
53#define DEBUG_TYPE "commandline"
74#if !(defined(LLVM_ENABLE_LLVM_EXPORT_ANNOTATIONS) && defined(_MSC_VER))
91void GenericOptionValue::anchor() {}
92void OptionValue<boolOrDefault>::anchor() {}
93void OptionValue<std::string>::anchor() {}
94void Option::anchor() {}
129 size_t Len = ArgName.
size();
137 for (
size_t I = 0;
I < Pad; ++
I) {
157 OS <<
argPrefix(Arg.ArgName, Arg.Pad) << Arg.ArgName;
161class CommandLineParser {
165 std::string ProgramName;
169 std::vector<StringRef> MoreHelp;
181 size_t NumIndexedLibraries = 0;
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()) {
236 (RegisteredSubCommands.
contains(SC) &&
237 LibraryIndex.
contains(O->ArgStr))) {
238 errs() << ProgramName <<
": CommandLine Error: Option '" << O->ArgStr
239 <<
"' registered more than once!\n";
249 O->error(
"Cannot specify more than one option with cl::ConsumeAfter!");
263 void addOption(
Option *O) {
264 forEachSubCommand(*O, [&](
SubCommand &SC) { addOption(O, &SC); });
269 O->getExtraOptionNames(OptionNames);
274 for (
auto Name : OptionNames) {
275 auto I =
Sub.OptionsMap.find(Name);
278 if (
I !=
Sub.OptionsMap.end() &&
I->second == O)
279 Sub.OptionsMap.erase(
I);
283 for (
auto *Opt =
Sub.PositionalOpts.begin();
284 Opt !=
Sub.PositionalOpts.end(); ++Opt) {
286 Sub.PositionalOpts.erase(Opt);
290 else if (O ==
Sub.ConsumeAfterOpt)
291 Sub.ConsumeAfterOpt =
nullptr;
294 void removeOption(
Option *O) {
295 forEachSubCommand(*O, [&](
SubCommand &SC) { removeOption(O, &SC); });
299 return (!
Sub.OptionsMap.empty() || !
Sub.PositionalOpts.empty() ||
300 nullptr !=
Sub.ConsumeAfterOpt);
303 bool hasOptions()
const {
304 for (
const auto *S : RegisteredSubCommands) {
308 return !Libraries.
empty();
311 bool hasNamedSubCommands()
const {
312 for (
const auto *S : RegisteredSubCommands)
313 if (!S->getName().empty())
318 SubCommand *getActiveSubCommand() {
return ActiveSubCommand; }
322 if (!
Sub.OptionsMap.insert(std::make_pair(NewName, O)).second) {
323 errs() << ProgramName <<
": CommandLine Error: Option '" << O->ArgStr
324 <<
"' registered more than once!\n";
327 Sub.OptionsMap.erase(O->ArgStr);
331 forEachSubCommand(*O,
332 [&](
SubCommand &SC) { updateArgStr(O, NewName, &SC); });
335 void printOptionValues();
337 void indexLibraryOptions() {
338 bool HadErrors =
false;
339 for (; NumIndexedLibraries != Libraries.
size(); ++NumIndexedLibraries) {
343 auto [It, Inserted] = LibraryIndex.
try_emplace(Name, L);
344 if (Inserted ?
none_of(RegisteredSubCommands,
350 errs() << ProgramName <<
": CommandLine Error: Option '" << Name
351 <<
"' registered more than once!\n";
361 indexLibraryOptions();
362 return LibraryIndex.
lookup(Name);
370 "Duplicate option categories");
378 return (!
sub->getName().empty()) &&
379 (
Sub->getName() ==
sub->getName());
381 "Duplicate subcommands");
387 "SubCommand::getAll() should not be registered");
390 if (O->isPositional() || O->isConsumeAfter() || O->hasArgStr())
393 addLiteralOption(*O,
sub,
E.first);
404 RegisteredSubCommands.
end());
408 ActiveSubCommand =
nullptr;
413 RegisteredOptionCategories.
clear();
416 RegisteredSubCommands.
clear();
418 LibraryIndex.
clear();
419 NumIndexedLibraries = 0;
442 return *GlobalParser;
453 const char *
Saved[2];
454 unsigned NumArgs = std::min<size_t>(Args.size(), 2);
455 for (
unsigned J = 0; J != NumArgs; ++J)
465template <
typename T, T TrueVal, T FalseVal>
469 if (!Arg.
data() || Arg ==
"true" || Arg ==
"1") {
474 if (Arg ==
"false" || Arg ==
"0") {
478 return O.error(
"'" + Arg +
479 "' is invalid value for boolean argument! Try 0 or 1");
491 : NumOccurrences(0), Occurrences(OccurrencesFlag), Value(0),
493 FullyInitialized(
false), Position(0) {
499 FullyInitialized =
true;
505 if (FullyInitialized)
527void OptionCategory::registerCategory() {
538 return *TopLevelSubCommand;
544 return *AllSubCommands;
562SubCommand::operator
bool()
const {
580 size_t EqualPos = Arg.
find(
'=');
585 return Sub.OptionsMap.lookup(Arg);
591 auto I =
Sub.OptionsMap.find(Arg.
substr(0, EqualPos));
592 if (
I ==
Sub.OptionsMap.end())
600 Arg = Arg.
substr(0, EqualPos);
605 std::string &NearestString) {
610 for (
auto *S : RegisteredSubCommands) {
612 "SubCommand::getAll() is not expected in RegisteredSubCommands");
613 if (S->getName().empty())
616 if (S->getName() == Name)
619 if (!NearestMatch && S->getName().edit_distance(Name) < 2)
624 NearestString = NearestMatch->
getName();
635 std::string &NearestString) {
641 std::pair<StringRef, StringRef> SplitArg = Arg.
split(
'=');
647 unsigned BestDistance = 0;
648 for (
const auto &[
_, O] : OptionsMap) {
654 O->getExtraOptionNames(OptionNames);
660 for (
const auto &Name : OptionNames) {
662 Flag,
true, BestDistance);
663 if (!Best || Distance < BestDistance) {
665 BestDistance = Distance;
666 if (
RHS.empty() || !PermitValue)
667 NearestString = std::string(Name);
669 NearestString = (
Twine(Name) +
"=" +
RHS).str();
692 Val = Val.
substr(Pos + 1);
708 const char *
const *argv,
int &i) {
716 return Handler->
error(
"requires a value!");
718 assert(argv &&
"null check");
743 for (; !Name.empty(); Name = Name.drop_back()) {
745 if (O && (O->getFormattingFlag() ==
cl::Prefix ||
790 return C ==
' ' ||
C ==
'\t' ||
C ==
'\r' ||
C ==
'\n';
797static bool isQuote(
char C) {
return C ==
'\"' ||
C ==
'\''; }
803 bool InToken =
false;
804 for (
size_t I = 0, E = Src.size();
I != E; ++
I) {
809 if (MarkEOLs && Src[
I] ==
'\n')
821 if (
I + 1 < E &&
C ==
'\\') {
830 while (
I != E && Src[
I] !=
C) {
832 if (Src[
I] ==
'\\' &&
I + 1 != E)
846 if (MarkEOLs &&
C ==
'\n')
880 size_t E = Src.size();
881 int BackslashCount = 0;
886 }
while (
I !=
E && Src[
I] ==
'\\');
888 bool FollowedByDoubleQuote = (
I !=
E && Src[
I] ==
'"');
889 if (FollowedByDoubleQuote) {
890 Token.
append(BackslashCount / 2,
'\\');
891 if (BackslashCount % 2 == 0)
896 Token.
append(BackslashCount,
'\\');
914 bool AlwaysCopy,
function_ref<
void()> MarkEOL,
bool InitialCommandName) {
923 bool CommandName = InitialCommandName;
926 enum {
INIT, UNQUOTED, QUOTED } State =
INIT;
928 for (
size_t I = 0,
E = Src.size();
I <
E; ++
I) {
931 assert(Token.
empty() &&
"token should be empty in initial state");
953 AddToken(AlwaysCopy ? Saver.
save(NormalChars) : NormalChars);
954 if (
I <
E && Src[
I] ==
'\n') {
956 CommandName = InitialCommandName;
960 }
else if (Src[
I] ==
'\"') {
961 Token += NormalChars;
963 }
else if (Src[
I] ==
'\\') {
964 assert(!CommandName &&
"or else we'd have treated it as a normal char");
965 Token += NormalChars;
979 AddToken(Saver.
save(Token.
str()));
981 if (Src[
I] ==
'\n') {
982 CommandName = InitialCommandName;
988 }
else if (Src[
I] ==
'\"') {
990 }
else if (Src[
I] ==
'\\' && !CommandName) {
998 if (Src[
I] ==
'\"') {
999 if (
I < (
E - 1) && Src[
I + 1] ==
'"') {
1008 }
else if (Src[
I] ==
'\\' && !CommandName) {
1018 AddToken(Saver.
save(Token.
str()));
1025 auto OnEOL = [&]() {
1030 true, OnEOL,
false);
1036 auto OnEOL = []() {};
1045 auto OnEOL = [&]() {
1056 for (
const char *Cur = Source.begin(); Cur != Source.end();) {
1065 while (Cur != Source.end() && *Cur !=
'\n')
1073 const char *Start = Cur;
1074 const char *LineEnd =
nullptr;
1076 bool AtTokenStart =
true;
1077 for (
const char *
End = Source.end(); Cur !=
End; ++Cur) {
1080 if (Cur + 1 !=
End) {
1083 (*Cur ==
'\r' && (Cur + 1 !=
End) && Cur[1] ==
'\n')) {
1084 Line.append(Start, Cur - 1);
1092 AtTokenStart =
false;
1102 }
else if (
C ==
'#' && AtTokenStart) {
1104 while (Cur !=
End && *Cur !=
'\n')
1111 Line.append(Start, LineEnd ? LineEnd : Cur);
1119 return (S.
size() >= 3 && S[0] ==
'\xef' && S[1] ==
'\xbb' && S[2] ==
'\xbf');
1133 TokenPos = ArgString.
find(Token, StartPos)) {
1137 if (ResponseFile.
empty())
1141 ResponseFile.
append(BasePath);
1142 StartPos = TokenPos + Token.
size();
1145 if (!ResponseFile.
empty()) {
1148 if (!Remaining.
empty())
1155Error ExpansionContext::expandResponseFile(
1156 StringRef FName, SmallVectorImpl<const char *> &NewArgv) {
1158 llvm::ErrorOr<std::unique_ptr<MemoryBuffer>> MemBufOrErr =
1159 FS->getBufferForFile(FName);
1163 "': " +
EC.message());
1165 MemoryBuffer &MemBuf = *MemBufOrErr.
get();
1170 std::string UTF8Buf;
1174 "Could not convert UTF16 to UTF8");
1175 Str = StringRef(UTF8Buf);
1181 Str = StringRef(BufRef.data() + 3, BufRef.size() - 3);
1184 Tokenizer(Str, Saver, NewArgv, MarkEOLs);
1189 if (!RelativeNames && !InConfigFile)
1193 for (
const char *&Arg : NewArgv) {
1203 StringRef ArgStr(Arg);
1205 bool ConfigInclusion =
false;
1206 if (ArgStr.consume_front(
"@")) {
1210 }
else if (ArgStr.consume_front(
"--config=")) {
1212 ConfigInclusion =
true;
1218 SmallString<128> ResponseFile;
1221 SmallString<128> FilePath;
1224 std::make_error_code(std::errc::no_such_file_or_directory),
1225 "cannot not find configuration file: " + FileName);
1226 ResponseFile.
append(FilePath);
1228 ResponseFile.
append(BasePath);
1231 Arg = Saver.save(ResponseFile.
str()).
data();
1240 struct ResponseFileRecord {
1255 for (
unsigned I = 0;
I != Argv.
size();) {
1256 while (
I == FileStack.
back().End) {
1262 const char *Arg = Argv[
I];
1264 if (Arg ==
nullptr) {
1269 if (Arg[0] !=
'@') {
1274 const char *FName = Arg + 1;
1279 if (CurrentDir.empty()) {
1280 if (
auto CWD = FS->getCurrentWorkingDirectory()) {
1284 CWD.getError(),
Twine(
"cannot get absolute path for: ") + FName);
1287 CurrDir = CurrentDir;
1290 FName = CurrDir.
c_str();
1294 if (!Res || !Res->exists()) {
1295 std::error_code EC = Res.
getError();
1296 if (!InConfigFile) {
1307 "': " + EC.message());
1312 [FileStatus,
this](
const ResponseFileRecord &RFile) ->
ErrorOr<bool> {
1324 R.getError(),
Twine(
"recursive expansion of: '") +
F.File +
"'");
1327 Twine(
"cannot open file: ") +
F.File);
1334 if (
Error Err = expandResponseFile(FName, ExpandedArgv))
1337 for (ResponseFileRecord &
Record : FileStack) {
1368 Tokenize(*EnvValue, Saver, NewArgv,
false);
1371 NewArgv.
append(Argv + 1, Argv + Argc);
1392 : Saver(
A), Tokenizer(
T), FS(FS ? FS :
vfs::getRealFileSystem().
get()) {}
1398 auto Status = FS->status(Path);
1406 CfgFilePath = FileName;
1409 if (!FileExists(CfgFilePath))
1416 for (
const StringRef &Dir : SearchDirs) {
1422 if (FileExists(CfgFilePath)) {
1436 if (std::error_code EC = FS->makeAbsolute(AbsPath))
1438 EC,
Twine(
"cannot get absolute path for " + CfgFile));
1439 CfgFile = AbsPath.
str();
1441 InConfigFile =
true;
1442 RelativeNames =
true;
1443 if (
Error Err = expandResponseFile(CfgFile, Argv))
1453 const char *EnvVar) {
1462 if (std::optional<std::string> EnvValue =
1469 int NewArgc =
static_cast<int>(NewArgv.
size());
1472 return globalParser().ParseCommandLineOptions(NewArgc, &NewArgv[0], Overview,
1473 Errs, VFS, Context);
1492void CommandLineParser::ResetAllOptionOccurrences() {
1496 for (
auto *SC : RegisteredSubCommands) {
1500 Opts.
reserve(SC->OptionsMap.size());
1501 for (
auto &O : SC->OptionsMap)
1505 for (
Option *O : SC->PositionalOpts)
1507 if (SC->ConsumeAfterOpt)
1508 SC->ConsumeAfterOpt->reset();
1512 LibraryArgAlloc.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());
1546 indexLibraryOptions();
1549 unsigned NumPositionalRequired = 0;
1552 bool HasUnlimitedPositionals =
false;
1556 std::string NearestSubCommandString;
1557 bool MaybeNamedSubCommand =
1558 argc >= 2 && argv[FirstArg][0] !=
'-' && hasNamedSubCommands();
1559 if (MaybeNamedSubCommand) {
1563 LookupSubCommand(
StringRef(argv[FirstArg]), NearestSubCommandString);
1569 assert(ChosenSubCommand);
1572 auto &OptionsMap = ChosenSubCommand->
OptionsMap;
1574 if (ConsumeAfterOpt) {
1575 assert(PositionalOpts.size() > 0 &&
1576 "Cannot specify cl::ConsumeAfter without a positional argument!");
1578 if (!PositionalOpts.empty()) {
1581 bool UnboundedFound =
false;
1582 for (
size_t i = 0, e = PositionalOpts.size(); i != e; ++i) {
1583 Option *Opt = PositionalOpts[i];
1585 ++NumPositionalRequired;
1586 else if (ConsumeAfterOpt) {
1589 if (PositionalOpts.size() > 1) {
1591 Opt->
error(
"error - this positional option will never be matched, "
1592 "because it does not Require a value, and a "
1593 "cl::ConsumeAfter option is active!");
1594 ErrorParsing =
true;
1596 }
else if (UnboundedFound && !Opt->
hasArgStr()) {
1602 Opt->
error(
"error - option can never match, because "
1603 "another positional argument will match an "
1604 "unbounded number of values, and this option"
1605 " does not require a value!");
1606 *Errs << ProgramName <<
": CommandLine Error: Option '" << Opt->
ArgStr
1607 <<
"' is all messed up!\n";
1608 *Errs << PositionalOpts.size();
1609 ErrorParsing =
true;
1613 HasUnlimitedPositionals = UnboundedFound || ConsumeAfterOpt;
1624 Option *ActivePositionalArg =
nullptr;
1627 bool DashDashFound =
false;
1628 for (
int i = FirstArg; i < argc; ++i) {
1629 Option *Handler =
nullptr;
1630 std::string NearestHandlerString;
1632 StringRef ArgName =
"";
1638 if (argv[i][0] !=
'-' || argv[i][1] == 0 || DashDashFound) {
1640 if (ActivePositionalArg) {
1645 if (!PositionalOpts.empty()) {
1646 PositionalVals.
push_back(std::make_pair(StringRef(argv[i]), i));
1651 if (PositionalVals.
size() >= NumPositionalRequired && ConsumeAfterOpt) {
1652 for (++i; i < argc; ++i)
1653 PositionalVals.
push_back(std::make_pair(StringRef(argv[i]), i));
1660 }
else if (argv[i][0] ==
'-' && argv[i][1] ==
'-' && argv[i][2] == 0 &&
1662 DashDashFound =
true;
1664 }
else if (ActivePositionalArg &&
1669 ArgName = StringRef(argv[i] + 1);
1673 Handler = LookupOption(*ChosenSubCommand, ArgName,
Value);
1679 ArgName = StringRef(argv[i] + 1);
1683 Handler = LookupOption(*ChosenSubCommand, ArgName,
Value);
1693 ArrayRef<const char *> Rest(argv + i, argc - i);
1699 *Errs << ProgramName <<
": " <<
toString(std::move(
E)) <<
'\n';
1700 ErrorParsing =
true;
1718 auto ReportUnknownArgument = [&](
bool IsArg,
1719 StringRef NearestArgumentName) {
1720 *Errs << ProgramName <<
": Unknown "
1721 << (IsArg ?
"command line argument" :
"subcommand") <<
" '"
1722 << argv[i] <<
"'. Try: '" << argv[0] <<
" --help'\n";
1724 if (NearestArgumentName.empty())
1727 *Errs << ProgramName <<
": Did you mean '";
1729 *Errs << PrintArg(NearestArgumentName, 0);
1731 *Errs << NearestArgumentName;
1735 if (i > 1 || !MaybeNamedSubCommand)
1736 ReportUnknownArgument(
true, NearestHandlerString);
1738 ReportUnknownArgument(
false, NearestSubCommandString);
1740 ErrorParsing =
true;
1748 Handler->
error(
"This argument does not take a value.\n"
1749 "\tInstead, it consumes any positional arguments until "
1750 "the next recognized option.", *Errs);
1751 ErrorParsing =
true;
1753 ActivePositionalArg = Handler;
1760 if (NumPositionalRequired > PositionalVals.
size()) {
1761 *Errs << ProgramName
1762 <<
": Not enough positional command line arguments specified!\n"
1763 <<
"Must specify at least " << NumPositionalRequired
1764 <<
" positional argument" << (NumPositionalRequired > 1 ?
"s" :
"")
1765 <<
": See: " << argv[0] <<
" --help\n";
1767 ErrorParsing =
true;
1768 }
else if (!HasUnlimitedPositionals &&
1769 PositionalVals.
size() > PositionalOpts.size()) {
1770 *Errs << ProgramName <<
": Too many positional arguments specified!\n"
1771 <<
"Can specify at most " << PositionalOpts.size()
1772 <<
" positional arguments: See: " << argv[0] <<
" --help\n";
1773 ErrorParsing =
true;
1775 }
else if (!ConsumeAfterOpt) {
1777 unsigned ValNo = 0, NumVals =
static_cast<unsigned>(PositionalVals.
size());
1778 for (
Option *Opt : PositionalOpts) {
1781 PositionalVals[ValNo].second);
1783 --NumPositionalRequired;
1791 while (NumVals - ValNo > NumPositionalRequired && !
Done) {
1799 PositionalVals[ValNo].second);
1804 "positional argument processing!");
1809 assert(ConsumeAfterOpt && NumPositionalRequired <= PositionalVals.
size());
1811 for (
Option *Opt : PositionalOpts)
1814 Opt, PositionalVals[ValNo].first, PositionalVals[ValNo].second);
1823 if (PositionalOpts.size() == 1 && ValNo == 0 && !PositionalVals.
empty()) {
1825 PositionalVals[ValNo].first,
1826 PositionalVals[ValNo].second);
1832 for (; ValNo != PositionalVals.
size(); ++ValNo)
1835 PositionalVals[ValNo].second);
1839 for (
const auto &Opt : OptionsMap) {
1844 Opt.second->
error(
"must be specified at least once!");
1845 ErrorParsing =
true;
1857 for (
int i = 0; i < argc; ++i)
dbgs() << argv[i] <<
' ';
1878 if (!ArgName.
data())
1880 if (ArgName.
empty())
1883 Errs <<
globalParser().ProgramName <<
": for the " << PrintArg(ArgName, 0);
1885 Errs <<
" option: " << Message <<
"\n";
1891 return handleOccurrence(pos, ArgName, Value);
1898 if (O.ValueStr.empty())
1913 size_t FirstLineIndentedBy) {
1914 assert(Indent >= FirstLineIndentedBy);
1915 std::pair<StringRef, StringRef> Split =
HelpStr.split(
'\n');
1918 while (!Split.second.empty()) {
1919 Split = Split.second.split(
'\n');
1920 outs().
indent(Indent) << Split.first <<
"\n";
1925 size_t FirstLineIndentedBy) {
1927 assert(BaseIndent >= FirstLineIndentedBy);
1928 std::pair<StringRef, StringRef> Split =
HelpStr.split(
'\n');
1929 outs().
indent(BaseIndent - FirstLineIndentedBy)
1931 while (!Split.second.empty()) {
1932 Split = Split.second.split(
'\n');
1933 outs().
indent(BaseIndent + ValHelpPrefix.
size()) << Split.first <<
"\n";
1938void alias::printOptionInfo(
size_t GlobalWidth)
const {
1954 if (!ValName.empty()) {
1955 size_t FormattingLen = 3;
1968 size_t GlobalWidth)
const {
1969 outs() << PrintArg(O.ArgStr);
1972 if (!ValName.empty()) {
1978 outs() << (O.ArgStr.size() == 1 ?
" <" :
"=<") <<
getValueStr(O, ValName)
1987 size_t GlobalWidth)
const {
1988 outs() << PrintArg(O.ArgStr);
1989 outs().
indent(GlobalWidth - O.ArgStr.size());
2009template <
typename FixedOrScalableQuantityT>
2012 FixedOrScalableQuantityT &
Value) {
2013 using ScalarTy =
typename FixedOrScalableQuantityT::ScalarTy;
2019 Value = FixedOrScalableQuantityT::getFixed(MinValue);
2025 return O.error(
"'" + Arg +
"' value invalid for " + ValueKind +
2028 Remainder = Remainder.
ltrim();
2030 return O.error(
"'" + Arg +
"' value invalid for " + ValueKind +
2033 Remainder = Remainder.
ltrim();
2035 return O.error(
"'" + Arg +
"' value invalid for " + ValueKind +
2038 Value = FixedOrScalableQuantityT::getScalable(MinValue);
2047 return O.error(
"'" + Arg +
"' value invalid for integer argument!");
2056 return O.error(
"'" + Arg +
"' value invalid for long argument!");
2065 return O.error(
"'" + Arg +
"' value invalid for llong argument!");
2075 return O.error(
"'" + Arg +
"' value invalid for uint argument!");
2082 unsigned long &
Value) {
2085 return O.error(
"'" + Arg +
"' value invalid for ulong argument!");
2093 unsigned long long &
Value) {
2096 return O.error(
"'" + Arg +
"' value invalid for ullong argument!");
2103 ElementCount &
Value) {
2112 return O.error(
"'" + Arg +
"' value invalid for floating point argument!");
2138 for (
unsigned i = 0; i != e; ++i) {
2154 return O.getValueExpectedFlag() !=
ValueOptional || !Name.empty() ||
2155 !Description.
empty();
2160 if (O.hasArgStr()) {
2172 size_t BaseSize = 0;
2183 size_t GlobalWidth)
const {
2184 if (O.hasArgStr()) {
2190 outs() << PrintArg(O.ArgStr);
2209 if (OptionName.
empty()) {
2214 if (!Description.
empty())
2220 if (!O.HelpStr.empty())
2221 outs() <<
" " << O.HelpStr <<
'\n';
2238 outs() <<
" " << PrintArg(O.ArgStr);
2239 outs().
indent(GlobalWidth - O.ArgStr.size());
2242 for (
unsigned i = 0; i != NumOpts; ++i) {
2250 for (
unsigned j = 0; j != NumOpts; ++j) {
2259 outs() <<
"= *unknown option value*\n";
2267 return OS << static_cast<int>(V);
2272#define PRINT_OPT_DIFF(T) \
2273 void parser<T>::printOptionDiff(const Option &O, T V, OptionValue<T> D, \
2274 size_t GlobalWidth) const { \
2275 printOptionName(O, GlobalWidth); \
2278 raw_string_ostream SS(Str); \
2281 outs() << "= " << Str; \
2282 size_t NumSpaces = \
2283 MaxOptWidth > Str.size() ? MaxOptWidth - Str.size() : 0; \
2284 outs().indent(NumSpaces) << " (default: "; \
2286 outs() << D.getValue(); \
2288 outs() << "*no default*"; \
2307 size_t GlobalWidth)
const {
2308 printOptionName(O, GlobalWidth);
2309 outs() <<
"= " << V;
2313 outs() <<
D.getValue();
2315 outs() <<
"*no default*";
2320 const Option &O, std::optional<StringRef> V,
2321 const OptionValue<std::optional<std::string>> &
D,
2322 size_t GlobalWidth)
const {
2323 printOptionName(O, GlobalWidth);
2324 outs() <<
"= " <<
V;
2325 size_t VSize =
V.has_value() ?
V.value().size() : 0;
2328 if (
D.hasValue() &&
D.getValue().has_value())
2329 outs() <<
D.getValue();
2331 outs() <<
"*no value*";
2337 size_t GlobalWidth)
const {
2339 outs() <<
"= *cannot print option value*\n";
2347 const std::pair<const char *, Option *> *
RHS) {
2348 return strcmp(
LHS->first,
RHS->first);
2352 const std::pair<const char *, SubCommand *> *
RHS) {
2353 return strcmp(
LHS->first,
RHS->first);
2362 for (
auto I = OptMap.
begin(),
E = OptMap.
end();
I !=
E; ++
I) {
2368 if (
I->second->getOptionHiddenFlag() ==
Hidden && !ShowHidden)
2372 if (!OptionSet.
insert(
I->second).second)
2376 std::pair<const char *, Option *>(
I->first.data(),
I->second));
2386 for (
auto *S : SubMap) {
2387 if (S->getName().empty())
2389 Subs.push_back(std::make_pair(S->getName().data(), S));
2398 const bool ShowHidden;
2399 using StrOptionPairVector =
2401 using StrSubCommandPairVector =
2404 virtual void printOptions(StrOptionPairVector &Opts,
size_t MaxArgLen) {
2405 for (
const auto &Opt : Opts)
2409 void printSubCommands(StrSubCommandPairVector &Subs,
size_t MaxSubLen) {
2410 for (
const auto &S : Subs) {
2411 outs() <<
" " << S.first;
2412 if (!S.second->getDescription().empty()) {
2414 outs() <<
" - " << S.second->getDescription();
2421 explicit HelpPrinter(
bool showHidden) : ShowHidden(showHidden) {}
2422 virtual ~HelpPrinter() =
default;
2425 void operator=(
bool Value) {
2436 auto &OptionsMap =
Sub->OptionsMap;
2437 auto &PositionalOpts =
Sub->PositionalOpts;
2438 auto &ConsumeAfterOpt =
Sub->ConsumeAfterOpt;
2440 StrOptionPairVector Opts;
2441 sortOpts(OptionsMap, Opts, ShowHidden);
2443 StrSubCommandPairVector Subs;
2452 outs() <<
" [subcommand]";
2453 outs() <<
" [options]";
2455 if (!
Sub->getDescription().empty()) {
2456 outs() <<
"SUBCOMMAND '" <<
Sub->getName()
2457 <<
"': " <<
Sub->getDescription() <<
"\n\n";
2463 for (
auto *Opt : PositionalOpts) {
2470 if (ConsumeAfterOpt)
2471 outs() <<
" " << ConsumeAfterOpt->HelpStr;
2475 size_t MaxSubLen = 0;
2476 for (
const auto &
Sub : Subs)
2477 MaxSubLen = std::max(MaxSubLen, strlen(
Sub.first));
2480 outs() <<
"SUBCOMMANDS:\n\n";
2481 printSubCommands(Subs, MaxSubLen);
2484 <<
" <subcommand> --help\" to get more help on a specific "
2491 size_t MaxArgLen = 0;
2492 for (
const auto &Opt : Opts)
2499 [&](StringRef Spelling, StringRef MetaVar, StringRef
Help) {
2504 for (
const auto &[Name,
Help] : LibraryOpts)
2507 outs() <<
"OPTIONS:\n";
2508 printOptions(Opts, MaxArgLen);
2510 if (!LibraryOpts.empty())
2511 outs() <<
"\nLibrary options:\n\n";
2512 for (
const auto &[Name,
Help] : LibraryOpts) {
2513 outs() << PrintArg(Name);
2524class CategorizedHelpPrinter :
public HelpPrinter {
2526 explicit CategorizedHelpPrinter(
bool showHidden) : HelpPrinter(showHidden) {}
2532 static int OptionCategoryCompare(OptionCategory *
const *
A,
2533 OptionCategory *
const *
B) {
2534 return (*A)->getName().compare((*B)->getName());
2538 using HelpPrinter::operator=;
2541 void printOptions(StrOptionPairVector &Opts,
size_t MaxArgLen)
override {
2542 std::vector<OptionCategory *> SortedCategories;
2543 DenseMap<OptionCategory *, std::vector<Option *>> CategorizedOptions;
2551 assert(SortedCategories.size() > 0 &&
"No option categories registered!");
2553 OptionCategoryCompare);
2558 for (
const auto &
I : Opts) {
2559 Option *Opt =
I.second;
2560 for (OptionCategory *Cat : Opt->
Categories) {
2562 "Option has an unregistered category");
2563 CategorizedOptions[Cat].push_back(Opt);
2568 for (OptionCategory *Category : SortedCategories) {
2570 const auto &CategoryOptions = CategorizedOptions[Category];
2571 if (CategoryOptions.empty())
2576 outs() << Category->getName() <<
":\n";
2579 if (!Category->getDescription().empty())
2580 outs() << Category->getDescription() <<
"\n\n";
2585 for (
const Option *Opt : CategoryOptions)
2593class HelpPrinterWrapper {
2595 HelpPrinter &UncategorizedPrinter;
2596 CategorizedHelpPrinter &CategorizedPrinter;
2599 explicit HelpPrinterWrapper(HelpPrinter &UncategorizedPrinter,
2600 CategorizedHelpPrinter &CategorizedPrinter)
2601 : UncategorizedPrinter(UncategorizedPrinter),
2602 CategorizedPrinter(CategorizedPrinter) {}
2605 void operator=(
bool Value);
2610#if defined(__GNUC__)
2613# if defined(__OPTIMIZE__)
2614# define LLVM_IS_DEBUG_BUILD 0
2616# define LLVM_IS_DEBUG_BUILD 1
2618#elif defined(_MSC_VER)
2623# define LLVM_IS_DEBUG_BUILD 1
2625# define LLVM_IS_DEBUG_BUILD 0
2629# define LLVM_IS_DEBUG_BUILD 0
2633class VersionPrinter {
2635 void print(
const std::vector<VersionPrinterTy> &ExtraPrinters) {
2637#ifdef PACKAGE_VENDOR
2638 OS << PACKAGE_VENDOR <<
" ";
2640 OS <<
"LLVM (http://llvm.org/):\n ";
2642 OS << PACKAGE_NAME <<
" version " << PACKAGE_VERSION <<
"\n ";
2643#if LLVM_IS_DEBUG_BUILD
2644 OS <<
"DEBUG build";
2646 OS <<
"Optimized build";
2649 OS <<
" with assertions";
2655 if (!ExtraPrinters.empty()) {
2656 for (
const auto &
I : ExtraPrinters)
2660 void operator=(
bool OptionWasSpecified);
2663struct CommandLineCommonOptions {
2666 HelpPrinter UncategorizedNormalPrinter{
false};
2667 HelpPrinter UncategorizedHiddenPrinter{
true};
2668 CategorizedHelpPrinter CategorizedNormalPrinter{
false};
2669 CategorizedHelpPrinter CategorizedHiddenPrinter{
true};
2672 HelpPrinterWrapper WrappedNormalPrinter{UncategorizedNormalPrinter,
2673 CategorizedNormalPrinter};
2674 HelpPrinterWrapper WrappedHiddenPrinter{UncategorizedHiddenPrinter,
2675 CategorizedHiddenPrinter};
2685 "Display list of available options (--help-list-hidden for more)"),
2694 cl::desc(
"Display list of all available options"),
2706 cl::desc(
"Display available options (--help-hidden for more)"),
2716 cl::desc(
"Display all available options"),
2725 cl::desc(
"Print non-default options after command line parsing"),
2732 "print-all-options",
2733 cl::desc(
"Print all option values after command line parsing"),
2741 std::vector<VersionPrinterTy> ExtraVersionPrinters;
2744 VersionPrinter VersionPrinterInstance;
2747 "version",
cl::desc(
"Display the version of this program"),
2772 return GeneralCategory;
2775void VersionPrinter::operator=(
bool OptionWasSpecified) {
2776 if (!OptionWasSpecified)
2788void HelpPrinterWrapper::operator=(
bool Value) {
2795 if (
globalParser().RegisteredOptionCategories.size() > 1) {
2800 CategorizedPrinter =
true;
2802 UncategorizedPrinter =
true;
2809void CommandLineParser::printOptionValues() {
2814 sortOpts(ActiveSubCommand->OptionsMap, Opts,
true);
2817 size_t MaxArgLen = 0;
2818 for (
const auto &Opt : Opts)
2821 for (
const auto &Opt : Opts)
2827 if (!
Hidden && !Categorized)
2829 else if (!
Hidden && Categorized)
2831 else if (
Hidden && !Categorized)
2843#if LLVM_IS_DEBUG_BUILD
2849#ifdef EXPENSIVE_CHECKS
2850 "+expensive-checks",
2852#if __has_feature(address_sanitizer)
2855#if __has_feature(dataflow_sanitizer)
2858#if __has_feature(hwaddress_sanitizer)
2861#if __has_feature(memory_sanitizer)
2864#if __has_feature(thread_sanitizer)
2867#if __has_feature(undefined_behavior_sanitizer)
2870#ifdef LLVM_INTEGRATED_CRT_ALLOC
2871 "+alloc:" LLVM_INTEGRATED_CRT_ALLOC,
2879#if LLVM_VERSION_PRINTER_SHOW_BUILD_CONFIG
2880 OS <<
"Build config: ";
2904 return Sub.OptionsMap;
2914 for (
auto &
I :
Sub.OptionsMap) {
2915 bool Unrelated =
true;
2916 for (
auto &Cat :
I.second->Categories) {
2917 if (Cat == &Category || Cat == &
CommonOptions->GenericCategory)
2928 for (
auto &
I :
Sub.OptionsMap) {
2929 bool Unrelated =
true;
2930 for (
auto &Cat :
I.second->Categories) {
2951 for (
size_t I = 0, E = Args.size();
I != E;) {
2953 Name.consume_front(
"-");
2954 Name.consume_front(
"-");
2956 globalParser().lookupLibraryOption(Name.split(
'=').first);
2965 unsigned &Consumed) {
2966 auto [It, Inserted] = Values.try_emplace(L.global());
2968 It->second = L.copyGlobal(Alloc);
2977 const char *Overview) {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static StringRef OptionPrefix
static bool RequiresValue(const Option *O)
static int SubNameCompare(const std::pair< const char *, SubCommand * > *LHS, const std::pair< const char *, SubCommand * > *RHS)
static size_t argPlusPrefixesSize(StringRef ArgName, size_t Pad=DefaultPad)
static bool shouldPrintOption(StringRef Name, StringRef Description, const Option &O)
static bool parseDouble(Option &O, StringRef Arg, double &Value)
static CommandLineParser & globalParser()
static bool parseBool(Option &O, StringRef ArgName, StringRef Arg, T &Value)
static const size_t DefaultPad
static StringRef EmptyOption
static bool parseCommandLineOptionsImpl(LibraryOptionsContext *Context, ArrayRef< const char * > Args, StringRef Overview, raw_ostream *Errs, vfs::FileSystem *VFS, const char *EnvVar)
static Error parseLibraryOption(LibraryOptions &L, void *Opts, ArrayRef< const char * > Args, unsigned &Consumed, BumpPtrAllocator &Alloc, SmallVectorImpl< const char * > *Record=nullptr)
static bool hasUTF8ByteOrderMark(ArrayRef< char > S)
static void ExpandBasePaths(StringRef BasePath, StringSaver &Saver, const char *&Arg)
static SmallString< 8 > argPrefix(StringRef ArgName, size_t Pad=DefaultPad)
static StringRef ArgHelpPrefix
void opt_unsigned_anchor()
static bool isWindowsSpecialCharInCommandName(char C)
static StringRef getValueStr(const Option &O, StringRef DefaultMsg)
static Option * HandlePrefixedOption(StringRef &Arg, StringRef &Value, const OptionsMapTy &OptionsMap)
The specified argument string (which started with at least one '-') does not fully match an available...
static size_t getOptionPrefixesSize()
static bool ProvideOption(Option *Handler, StringRef ArgName, StringRef Value, int argc, const char *const *argv, int &i)
ProvideOption - For Value, this differentiates between an empty value ("") and a null value (StringRe...
static bool isQuote(char C)
static ManagedStatic< CommandLineCommonOptions > CommonOptions
static void initCommonOptions()
static void sortOpts(OptionsMapTy &OptMap, SmallVectorImpl< std::pair< const char *, Option * > > &Opts, bool ShowHidden)
DenseMap< StringRef, Option * > OptionsMapTy
static void tokenizeWindowsCommandLineImpl(StringRef Src, StringSaver &Saver, function_ref< void(StringRef)> AddToken, bool AlwaysCopy, function_ref< void()> MarkEOL, bool InitialCommandName)
static Option * findPrefixOption(StringRef Name, size_t &Length, const OptionsMapTy &OptionsMap)
static bool isWhitespace(char C)
static bool parseFixedOrScalableQuantity(Option &O, StringRef Arg, StringRef ValueKind, FixedOrScalableQuantityT &Value)
static size_t parseBackslash(StringRef Src, size_t I, SmallString< 128 > &Token)
Backslashes are interpreted in a rather complicated way in the Windows-style command line,...
static StringRef ArgPrefixLong
static void sortSubCommands(const SmallPtrSetImpl< SubCommand * > &SubMap, SmallVectorImpl< std::pair< const char *, SubCommand * > > &Subs)
#define PRINT_OPT_DIFF(T)
static bool isWhitespaceOrNull(char C)
static const size_t MaxOptWidth
static bool EatsUnboundedNumberOfValues(const Option *O)
static int OptNameCompare(const std::pair< const char *, Option * > *LHS, const std::pair< const char *, Option * > *RHS)
static Option * LookupNearestOption(StringRef Arg, const OptionsMapTy &OptionsMap, std::string &NearestString)
LookupNearestOption - Lookup the closest match to the option specified by the specified option on the...
static StringRef ArgPrefix
static bool isWindowsSpecialChar(char C)
static bool CommaSeparateAndAddOccurrence(Option *Handler, unsigned pos, StringRef ArgName, StringRef Value)
CommaSeparateAndAddOccurrence - A wrapper around Handler->addOccurrence() that does special handling ...
#define LLVM_EXPORT_TEMPLATE
Fixup Statepoint Caller Saved
static llvm::Error parse(GsymDataExtractor &Data, uint64_t BaseAddr, LineEntryCallback const &Callback)
static void Help(StringTable CPUNames, ArrayRef< SubtargetFeatureKV > FeatTable)
Display help for feature and mcpu choices.
Provides a library for accessing information about this process and other processes on the operating ...
This file defines the SmallPtrSet class.
This file defines the SmallString class.
Defines the virtual file system interface vfs::FileSystem.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Represents either an error or a value T.
std::error_code getError() const
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
ManagedStatic - This transparently changes the behavior of global statics to be lazily constructed on...
size_t getBufferSize() const
const char * getBufferEnd() const
const char * getBufferStart() const
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool erase(PtrType Ptr)
Remove pointer from the set.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
void assign(StringRef RHS)
Assign from a StringRef.
void append(StringRef RHS)
Append from a StringRef.
StringRef str() const
Explicit conversion to StringRef.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
static constexpr size_t npos
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
Check if the string is empty.
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
LLVM_ABI unsigned edit_distance(StringRef Other, bool AllowReplacements=true, unsigned MaxEditDistance=0) const
Determine the edit distance between this string and another string.
StringRef slice(size_t Start, size_t End) const
Return a reference to the substring from [Start, End).
constexpr size_t size() const
Get the string size.
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
StringRef ltrim(char Char) const
Return string with consecutive Char characters starting from the the left removed.
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
StringRef trim(char Char) const
Return string with consecutive Char characters starting from the left and right removed.
bool consume_front(char Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
Saves strings in the provided stable storage and returns a StringRef with a stable character pointer.
BumpPtrAllocator & getAllocator() const
StringRef save(const char *S)
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM Value Representation.
Contains options that control response file expansion.
LLVM_ABI ExpansionContext(BumpPtrAllocator &A, TokenizerCallback T, vfs::FileSystem *FS=nullptr)
LLVM_ABI bool findConfigFile(StringRef FileName, SmallVectorImpl< char > &FilePath)
Looks for the specified configuration file.
LLVM_ABI Error expandResponseFiles(SmallVectorImpl< const char * > &Argv)
Expands constructs "@file" in the provided array of arguments recursively.
LLVM_ABI Error readConfigFile(StringRef CfgFile, SmallVectorImpl< const char * > &Argv)
Reads command line options from the given configuration file.
Error parse(LibraryOptions &L, ArrayRef< const char * > Args, unsigned &Consumed)
void assign(const LibraryOptionsContext &Other)
The options of a library that declares them in TableGen rather than as cl::opt (see llvm/Option/Libra...
StringRef getName() const
SmallPtrSet< SubCommand *, 1 > Subs
int getNumOccurrences() const
enum ValueExpected getValueExpectedFlag() const
void addCategory(OptionCategory &C)
enum FormattingFlags getFormattingFlag() const
virtual void printOptionInfo(size_t GlobalWidth) const =0
enum NumOccurrencesFlag getNumOccurrencesFlag() const
virtual bool addOccurrence(unsigned pos, StringRef ArgName, StringRef Value)
SmallVector< OptionCategory *, 1 > Categories
bool error(const Twine &Message, StringRef ArgName=StringRef(), raw_ostream &Errs=llvm::errs())
void setArgStr(StringRef S)
unsigned getMiscFlags() const
virtual void setDefault()=0
virtual void printOptionValue(size_t GlobalWidth, bool Force) const =0
static void printEnumValHelpStr(StringRef HelpStr, size_t Indent, size_t FirstLineIndentedBy)
void removeArgument()
Unregisters this option from the CommandLine system.
static void printHelpStr(StringRef HelpStr, size_t Indent, size_t FirstLineIndentedBy)
virtual size_t getOptionWidth() const =0
Option(enum NumOccurrencesFlag OccurrencesFlag, enum OptionHidden Hidden)
StringRef getName() const
SubCommand(StringRef Name, StringRef Description="")
static LLVM_ABI SubCommand & getTopLevel()
LLVM_ABI void unregisterSubCommand()
static LLVM_ABI SubCommand & getAll()
DenseMap< StringRef, Option * > OptionsMap
LLVM_ABI void registerSubCommand()
SmallVector< Option *, 4 > PositionalOpts
void printOptionInfo(const Option &O, size_t GlobalWidth) const
virtual StringRef getValueName() const
void printOptionNoValue(const Option &O, size_t GlobalWidth) const
size_t getOptionWidth(const Option &O) const
void printOptionName(const Option &O, size_t GlobalWidth) const
virtual size_t getOptionWidth(const Option &O) const
virtual StringRef getDescription(unsigned N) const =0
virtual const GenericOptionValue & getOptionValue(unsigned N) const =0
virtual unsigned getNumOptions() const =0
virtual StringRef getOption(unsigned N) const =0
void printGenericOptionDiff(const Option &O, const GenericOptionValue &V, const GenericOptionValue &Default, size_t GlobalWidth) const
virtual void printOptionInfo(const Option &O, size_t GlobalWidth) const
unsigned findOption(StringRef Name)
bool parse(Option &O, StringRef ArgName, StringRef Arg, DataType &V)
An efficient, type-erasing, non-owning reference to a callable.
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
static LLVM_ABI std::optional< std::string > GetEnv(StringRef name)
The virtual file system interface.
The result of a status operation.
LLVM_ABI bool equivalent(const Status &Other) const
LLVM_C_ABI void LLVMParseCommandLineOptions(int argc, const char *const *argv, const char *Overview)
This function parses the given arguments using the LLVM command line parser.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr size_t NameSize
This namespace contains all of the command line option processing machinery.
LLVM_ABI iterator_range< SmallPtrSet< SubCommand *, 4 >::iterator > getRegisteredSubcommands()
Use this to get all registered SubCommands from the provided parser.
LLVM_ABI void PrintVersionMessage()
Utility function for printing version number.
LLVM_ABI bool ExpandResponseFiles(StringSaver &Saver, TokenizerCallback Tokenizer, SmallVectorImpl< const char * > &Argv)
A convenience helper which supports the typical use case of expansion function call.
LLVM_ABI void TokenizeWindowsCommandLine(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs=false)
Tokenizes a string of Windows command line arguments, which may contain quotes and escaped quotes.
LLVM_ABI OptionCategory & getGeneralCategory()
LLVM_ABI void addLibraryOptions(LibraryOptions &L)
Makes ParseCommandLineOptions recognize L's options.
LLVM_ABI void ResetAllOptionOccurrences()
Reset all command line options to a state that looks as if they have never appeared on the command li...
LLVM_ABI void SetVersionPrinter(VersionPrinterTy func)
===------------------------------------------------------------------—===// Override the default (LLV...
LLVM_ABI void tokenizeConfigFile(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs=false)
Tokenizes content of configuration file.
LLVM_ABI DenseMap< StringRef, Option * > & getRegisteredOptions(SubCommand &Sub=SubCommand::getTopLevel())
Use this to get a map of all registered named options (e.g.
LLVM_ABI bool expandResponseFiles(int Argc, const char *const *Argv, const char *EnvVar, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv)
A convenience helper which concatenates the options specified by the environment variable EnvVar and ...
LLVM_ABI void ResetCommandLineParser()
Reset the command line parser back to its initial state.
LLVM_ABI void PrintOptionValues()
LLVM_ABI void AddLiteralOption(Option &O, StringRef Name)
Adds a new option for parsing and provides the option it refers to.
void printOptionDiff(const Option &O, const generic_parser_base &P, const DT &V, const OptionValue< DT > &Default, size_t GlobalWidth)
LLVM_ABI void TokenizeWindowsCommandLineNoCopy(StringRef Source, StringSaver &Saver, SmallVectorImpl< StringRef > &NewArgv)
Tokenizes a Windows command line while attempting to avoid copies.
LLVM_ABI void printBuildConfig(raw_ostream &OS)
Prints the compiler build configuration.
void(*)(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs) TokenizerCallback
String tokenization function type.
LLVM_ABI bool ProvidePositionalOption(Option *Handler, StringRef Arg, int i)
Parses Arg into the option handler Handler.
static raw_ostream & operator<<(raw_ostream &OS, boolOrDefault V)
initializer< Ty > init(const Ty &Val)
std::function< void(raw_ostream &)> VersionPrinterTy
LLVM_ABI bool parseCommandLineOptions(LibraryOptionsContext &Context, ArrayRef< const char * > Args, StringRef Overview="", raw_ostream *Errs=nullptr, vfs::FileSystem *VFS=nullptr, const char *EnvVar=nullptr)
LLVM_ABI ArrayRef< StringRef > getCompilerBuildConfig()
An array of optional enabled settings in the LLVM build configuration, which may be of interest to co...
LocationClass< Ty > location(Ty &L)
LLVM_ABI bool ParseCommandLineOptions(int argc, const char *const *argv, StringRef Overview="", raw_ostream *Errs=nullptr, vfs::FileSystem *VFS=nullptr, const char *EnvVar=nullptr)
LLVM_ABI void HideUnrelatedOptions(cl::OptionCategory &Category, SubCommand &Sub=SubCommand::getTopLevel())
Mark all options not part of this category as cl::ReallyHidden.
LLVM_ABI void AddExtraVersionPrinter(VersionPrinterTy func)
===------------------------------------------------------------------—===// Add an extra printer to u...
LLVM_ABI void PrintHelpMessage(bool Hidden=false, bool Categorized=false)
This function just prints the help message, exactly the same way as if the -help or -help-hidden opti...
LLVM_ABI void TokenizeWindowsCommandLineFull(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs=false)
Tokenizes a Windows full command line, including command name at the start.
LLVM_ABI void TokenizeGNUCommandLine(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs=false)
Tokenizes a command line that can contain escapes and quotes.
LLVM_ABI StringRef parent_path(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get parent path.
LLVM_ABI bool has_parent_path(const Twine &path, Style style=Style::native)
Has parent path?
LLVM_ABI bool is_relative(const Twine &path, Style style=Style::native)
Is path relative?
LLVM_ABI StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
LLVM_ABI bool is_absolute(const Twine &path, Style style=Style::native)
Is path absolute?
LLVM_ABI void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
LLVM_ABI IntrusiveRefCntPtr< FileSystem > getRealFileSystem()
Gets an vfs::FileSystem for the 'real' file system, as seen by the operating system.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
void initWithColorOptions()
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
LLVM_ABI raw_fd_ostream & outs()
This returns a reference to a raw_fd_ostream for standard output.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
void interleaveComma(const Container &c, StreamT &os, UnaryFunctor each_fn)
LLVM_ABI bool hasUTF16ByteOrderMark(ArrayRef< char > SrcBytes)
Returns true if a blob of text starts with a UTF-16 big or little endian byte order mark.
void initDebugCounterOptions()
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
bool to_float(const Twine &T, float &Num)
@ no_such_file_or_directory
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
LLVM_ABI bool convertUTF16ToUTF8String(ArrayRef< char > SrcBytes, std::string &Out)
Converts a stream of raw bytes assumed to be UTF16 into a UTF8 std::string.
void initSignalsOptions()
void initStatisticOptions()
LLVM_ABI raw_ostream & nulls()
This returns a reference to a raw_ostream which simply discards output.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
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.
@ End
Run the machine verifier once, at the end of the pipeline.