31#include "llvm/Config/config.h"
52#define DEBUG_TYPE "commandline"
73#if !(defined(LLVM_ENABLE_LLVM_EXPORT_ANNOTATIONS) && defined(_MSC_VER))
90void GenericOptionValue::anchor() {}
91void OptionValue<boolOrDefault>::anchor() {}
92void OptionValue<std::string>::anchor() {}
93void Option::anchor() {}
128 size_t Len = ArgName.
size();
136 for (
size_t I = 0;
I < Pad; ++
I) {
156 OS <<
argPrefix(Arg.ArgName, Arg.Pad) << Arg.ArgName;
160class CommandLineParser {
164 std::string ProgramName;
168 std::vector<StringRef> MoreHelp;
185 if (Opt.
Subs.empty()) {
190 for (
auto *SC : RegisteredSubCommands)
195 for (
auto *SC : Opt.
Subs) {
197 "SubCommand::getAll() should not be used with other subcommands");
206 errs() << ProgramName <<
": CommandLine Error: Option '" << Name
207 <<
"' registered more than once!\n";
214 Opt, [&](
SubCommand &SC) { addLiteralOption(Opt, &SC, Name); });
218 bool HadErrors =
false;
219 if (O->hasArgStr()) {
222 errs() << ProgramName <<
": CommandLine Error: Option '" << O->ArgStr
223 <<
"' registered more than once!\n";
233 O->error(
"Cannot specify more than one option with cl::ConsumeAfter!");
247 void addOption(
Option *O) {
248 forEachSubCommand(*O, [&](
SubCommand &SC) { addOption(O, &SC); });
253 O->getExtraOptionNames(OptionNames);
258 for (
auto Name : OptionNames) {
259 auto I =
Sub.OptionsMap.find(Name);
262 if (
I !=
Sub.OptionsMap.end() &&
I->second == O)
263 Sub.OptionsMap.erase(
I);
267 for (
auto *Opt =
Sub.PositionalOpts.begin();
268 Opt !=
Sub.PositionalOpts.end(); ++Opt) {
270 Sub.PositionalOpts.erase(Opt);
274 else if (O ==
Sub.ConsumeAfterOpt)
275 Sub.ConsumeAfterOpt =
nullptr;
278 void removeOption(
Option *O) {
279 forEachSubCommand(*O, [&](
SubCommand &SC) { removeOption(O, &SC); });
283 return (!
Sub.OptionsMap.empty() || !
Sub.PositionalOpts.empty() ||
284 nullptr !=
Sub.ConsumeAfterOpt);
287 bool hasOptions()
const {
288 for (
const auto *S : RegisteredSubCommands) {
295 bool hasNamedSubCommands()
const {
296 for (
const auto *S : RegisteredSubCommands)
297 if (!S->getName().empty())
302 SubCommand *getActiveSubCommand() {
return ActiveSubCommand; }
306 if (!
Sub.OptionsMap.insert(std::make_pair(NewName, O)).second) {
307 errs() << ProgramName <<
": CommandLine Error: Option '" << O->ArgStr
308 <<
"' registered more than once!\n";
311 Sub.OptionsMap.erase(O->ArgStr);
315 forEachSubCommand(*O,
316 [&](
SubCommand &SC) { updateArgStr(O, NewName, &SC); });
319 void printOptionValues();
326 "Duplicate option categories");
334 return (!
sub->getName().empty()) &&
335 (
Sub->getName() ==
sub->getName());
337 "Duplicate subcommands");
343 "SubCommand::getAll() should not be registered");
346 if (O->isPositional() || O->isConsumeAfter() || O->hasArgStr())
349 addLiteralOption(*O,
sub,
E.first);
360 RegisteredSubCommands.
end());
364 ActiveSubCommand =
nullptr;
369 RegisteredOptionCategories.
clear();
372 RegisteredSubCommands.
clear();
395 return *GlobalParser;
398template <
typename T, T TrueVal, T FalseVal>
402 if (!Arg.
data() || Arg ==
"true" || Arg ==
"1") {
407 if (Arg ==
"false" || Arg ==
"0") {
411 return O.error(
"'" + Arg +
412 "' is invalid value for boolean argument! Try 0 or 1");
424 : NumOccurrences(0), Occurrences(OccurrencesFlag), Value(0),
426 FullyInitialized(
false), Position(0) {
432 FullyInitialized =
true;
438 if (FullyInitialized)
460void OptionCategory::registerCategory() {
471 return *TopLevelSubCommand;
477 return *AllSubCommands;
495SubCommand::operator
bool()
const {
513 size_t EqualPos = Arg.
find(
'=');
518 return Sub.OptionsMap.lookup(Arg);
524 auto I =
Sub.OptionsMap.find(Arg.
substr(0, EqualPos));
525 if (
I ==
Sub.OptionsMap.end())
533 Arg = Arg.
substr(0, EqualPos);
538 std::string &NearestString) {
543 for (
auto *S : RegisteredSubCommands) {
545 "SubCommand::getAll() is not expected in RegisteredSubCommands");
546 if (S->getName().empty())
549 if (S->getName() == Name)
552 if (!NearestMatch && S->getName().edit_distance(Name) < 2)
557 NearestString = NearestMatch->
getName();
568 std::string &NearestString) {
574 std::pair<StringRef, StringRef> SplitArg = Arg.
split(
'=');
580 unsigned BestDistance = 0;
581 for (
const auto &[
_, O] : OptionsMap) {
587 O->getExtraOptionNames(OptionNames);
593 for (
const auto &Name : OptionNames) {
595 Flag,
true, BestDistance);
596 if (!Best || Distance < BestDistance) {
598 BestDistance = Distance;
599 if (
RHS.empty() || !PermitValue)
600 NearestString = std::string(Name);
602 NearestString = (
Twine(Name) +
"=" +
RHS).str();
625 Val = Val.
substr(Pos + 1);
641 const char *
const *argv,
int &i) {
649 return Handler->
error(
"requires a value!");
651 assert(argv &&
"null check");
676 for (; !Name.empty(); Name = Name.drop_back()) {
678 if (O && (O->getFormattingFlag() ==
cl::Prefix ||
723 return C ==
' ' ||
C ==
'\t' ||
C ==
'\r' ||
C ==
'\n';
730static bool isQuote(
char C) {
return C ==
'\"' ||
C ==
'\''; }
736 bool InToken =
false;
737 for (
size_t I = 0, E = Src.size();
I != E; ++
I) {
742 if (MarkEOLs && Src[
I] ==
'\n')
754 if (
I + 1 < E &&
C ==
'\\') {
763 while (
I != E && Src[
I] !=
C) {
765 if (Src[
I] ==
'\\' &&
I + 1 != E)
779 if (MarkEOLs &&
C ==
'\n')
813 size_t E = Src.size();
814 int BackslashCount = 0;
819 }
while (
I !=
E && Src[
I] ==
'\\');
821 bool FollowedByDoubleQuote = (
I !=
E && Src[
I] ==
'"');
822 if (FollowedByDoubleQuote) {
823 Token.
append(BackslashCount / 2,
'\\');
824 if (BackslashCount % 2 == 0)
829 Token.
append(BackslashCount,
'\\');
847 bool AlwaysCopy,
function_ref<
void()> MarkEOL,
bool InitialCommandName) {
856 bool CommandName = InitialCommandName;
859 enum {
INIT, UNQUOTED, QUOTED } State =
INIT;
861 for (
size_t I = 0,
E = Src.size();
I <
E; ++
I) {
864 assert(Token.
empty() &&
"token should be empty in initial state");
886 AddToken(AlwaysCopy ? Saver.
save(NormalChars) : NormalChars);
887 if (
I <
E && Src[
I] ==
'\n') {
889 CommandName = InitialCommandName;
893 }
else if (Src[
I] ==
'\"') {
894 Token += NormalChars;
896 }
else if (Src[
I] ==
'\\') {
897 assert(!CommandName &&
"or else we'd have treated it as a normal char");
898 Token += NormalChars;
912 AddToken(Saver.
save(Token.
str()));
914 if (Src[
I] ==
'\n') {
915 CommandName = InitialCommandName;
921 }
else if (Src[
I] ==
'\"') {
923 }
else if (Src[
I] ==
'\\' && !CommandName) {
931 if (Src[
I] ==
'\"') {
932 if (
I < (
E - 1) && Src[
I + 1] ==
'"') {
941 }
else if (Src[
I] ==
'\\' && !CommandName) {
951 AddToken(Saver.
save(Token.
str()));
969 auto OnEOL = []() {};
989 for (
const char *Cur = Source.begin(); Cur != Source.end();) {
998 while (Cur != Source.end() && *Cur !=
'\n')
1003 const char *Start = Cur;
1004 for (
const char *End = Source.end(); Cur != End; ++Cur) {
1006 if (Cur + 1 != End) {
1009 (*Cur ==
'\r' && (Cur + 1 != End) && Cur[1] ==
'\n')) {
1010 Line.append(Start, Cur - 1);
1016 }
else if (*Cur ==
'\n')
1020 Line.append(Start, Cur);
1028 return (S.
size() >= 3 && S[0] ==
'\xef' && S[1] ==
'\xbb' && S[2] ==
'\xbf');
1042 TokenPos = ArgString.
find(Token, StartPos)) {
1046 if (ResponseFile.
empty())
1050 ResponseFile.
append(BasePath);
1051 StartPos = TokenPos + Token.
size();
1054 if (!ResponseFile.
empty()) {
1057 if (!Remaining.
empty())
1064Error ExpansionContext::expandResponseFile(
1065 StringRef FName, SmallVectorImpl<const char *> &NewArgv) {
1067 llvm::ErrorOr<std::unique_ptr<MemoryBuffer>> MemBufOrErr =
1068 FS->getBufferForFile(FName);
1072 "': " +
EC.message());
1074 MemoryBuffer &MemBuf = *MemBufOrErr.
get();
1079 std::string UTF8Buf;
1083 "Could not convert UTF16 to UTF8");
1084 Str = StringRef(UTF8Buf);
1090 Str = StringRef(BufRef.data() + 3, BufRef.size() - 3);
1093 Tokenizer(Str, Saver, NewArgv, MarkEOLs);
1098 if (!RelativeNames && !InConfigFile)
1102 for (
const char *&Arg : NewArgv) {
1112 StringRef ArgStr(Arg);
1114 bool ConfigInclusion =
false;
1115 if (ArgStr.consume_front(
"@")) {
1119 }
else if (ArgStr.consume_front(
"--config=")) {
1121 ConfigInclusion =
true;
1127 SmallString<128> ResponseFile;
1130 SmallString<128> FilePath;
1133 std::make_error_code(std::errc::no_such_file_or_directory),
1134 "cannot not find configuration file: " + FileName);
1135 ResponseFile.
append(FilePath);
1137 ResponseFile.
append(BasePath);
1140 Arg = Saver.save(ResponseFile.
str()).
data();
1149 struct ResponseFileRecord {
1164 for (
unsigned I = 0;
I != Argv.
size();) {
1165 while (
I == FileStack.
back().End) {
1171 const char *Arg = Argv[
I];
1173 if (Arg ==
nullptr) {
1178 if (Arg[0] !=
'@') {
1183 const char *FName = Arg + 1;
1188 if (CurrentDir.empty()) {
1189 if (
auto CWD = FS->getCurrentWorkingDirectory()) {
1193 CWD.getError(),
Twine(
"cannot get absolute path for: ") + FName);
1196 CurrDir = CurrentDir;
1199 FName = CurrDir.
c_str();
1203 if (!Res || !Res->exists()) {
1204 std::error_code EC = Res.
getError();
1205 if (!InConfigFile) {
1216 "': " + EC.message());
1221 [FileStatus,
this](
const ResponseFileRecord &RFile) ->
ErrorOr<bool> {
1233 R.getError(),
Twine(
"recursive expansion of: '") +
F.File +
"'");
1236 Twine(
"cannot open file: ") +
F.File);
1243 if (
Error Err = expandResponseFile(FName, ExpandedArgv))
1246 for (ResponseFileRecord &
Record : FileStack) {
1277 Tokenize(*EnvValue, Saver, NewArgv,
false);
1280 NewArgv.
append(Argv + 1, Argv + Argc);
1301 : Saver(
A), Tokenizer(
T), FS(FS ? FS :
vfs::getRealFileSystem().
get()) {}
1307 auto Status = FS->status(Path);
1315 CfgFilePath = FileName;
1318 if (!FileExists(CfgFilePath))
1325 for (
const StringRef &Dir : SearchDirs) {
1331 if (FileExists(CfgFilePath)) {
1345 if (std::error_code EC = FS->makeAbsolute(AbsPath))
1347 EC,
Twine(
"cannot get absolute path for " + CfgFile));
1348 CfgFile = AbsPath.
str();
1350 InConfigFile =
true;
1351 RelativeNames =
true;
1352 if (
Error Err = expandResponseFile(CfgFile, Argv))
1369 if (std::optional<std::string> EnvValue =
1375 for (
int I = 1;
I < argc; ++
I)
1377 int NewArgc =
static_cast<int>(NewArgv.
size());
1380 return globalParser().ParseCommandLineOptions(NewArgc, &NewArgv[0], Overview,
1385void CommandLineParser::ResetAllOptionOccurrences() {
1389 for (
auto *SC : RegisteredSubCommands) {
1393 Opts.
reserve(SC->OptionsMap.size());
1394 for (
auto &O : SC->OptionsMap)
1398 for (
Option *O : SC->PositionalOpts)
1400 if (SC->ConsumeAfterOpt)
1401 SC->ConsumeAfterOpt->reset();
1405bool CommandLineParser::ParseCommandLineOptions(
int argc,
1406 const char *
const *argv,
1410 assert(hasOptions() &&
"No options specified!");
1412 ProgramOverview = Overview;
1413 bool IgnoreErrors = Errs;
1418 bool ErrorParsing =
false;
1429 if (
Error Err = ECtx.expandResponseFiles(newArgv)) {
1430 *Errs <<
toString(std::move(Err)) <<
'\n';
1434 argc =
static_cast<int>(newArgv.size());
1440 unsigned NumPositionalRequired = 0;
1443 bool HasUnlimitedPositionals =
false;
1447 std::string NearestSubCommandString;
1448 bool MaybeNamedSubCommand =
1449 argc >= 2 && argv[FirstArg][0] !=
'-' && hasNamedSubCommands();
1450 if (MaybeNamedSubCommand) {
1454 LookupSubCommand(
StringRef(argv[FirstArg]), NearestSubCommandString);
1460 assert(ChosenSubCommand);
1463 auto &OptionsMap = ChosenSubCommand->
OptionsMap;
1465 if (ConsumeAfterOpt) {
1466 assert(PositionalOpts.size() > 0 &&
1467 "Cannot specify cl::ConsumeAfter without a positional argument!");
1469 if (!PositionalOpts.empty()) {
1472 bool UnboundedFound =
false;
1473 for (
size_t i = 0, e = PositionalOpts.size(); i != e; ++i) {
1474 Option *Opt = PositionalOpts[i];
1476 ++NumPositionalRequired;
1477 else if (ConsumeAfterOpt) {
1480 if (PositionalOpts.size() > 1) {
1482 Opt->
error(
"error - this positional option will never be matched, "
1483 "because it does not Require a value, and a "
1484 "cl::ConsumeAfter option is active!");
1485 ErrorParsing =
true;
1487 }
else if (UnboundedFound && !Opt->
hasArgStr()) {
1493 Opt->
error(
"error - option can never match, because "
1494 "another positional argument will match an "
1495 "unbounded number of values, and this option"
1496 " does not require a value!");
1497 *Errs << ProgramName <<
": CommandLine Error: Option '" << Opt->
ArgStr
1498 <<
"' is all messed up!\n";
1499 *Errs << PositionalOpts.size();
1500 ErrorParsing =
true;
1504 HasUnlimitedPositionals = UnboundedFound || ConsumeAfterOpt;
1515 Option *ActivePositionalArg =
nullptr;
1518 bool DashDashFound =
false;
1519 for (
int i = FirstArg; i < argc; ++i) {
1520 Option *Handler =
nullptr;
1521 std::string NearestHandlerString;
1523 StringRef ArgName =
"";
1529 if (argv[i][0] !=
'-' || argv[i][1] == 0 || DashDashFound) {
1531 if (ActivePositionalArg) {
1536 if (!PositionalOpts.empty()) {
1537 PositionalVals.
push_back(std::make_pair(StringRef(argv[i]), i));
1542 if (PositionalVals.
size() >= NumPositionalRequired && ConsumeAfterOpt) {
1543 for (++i; i < argc; ++i)
1544 PositionalVals.
push_back(std::make_pair(StringRef(argv[i]), i));
1551 }
else if (argv[i][0] ==
'-' && argv[i][1] ==
'-' && argv[i][2] == 0 &&
1553 DashDashFound =
true;
1555 }
else if (ActivePositionalArg &&
1560 ArgName = StringRef(argv[i] + 1);
1564 Handler = LookupOption(*ChosenSubCommand, ArgName,
Value);
1570 ArgName = StringRef(argv[i] + 1);
1574 Handler = LookupOption(*ChosenSubCommand, ArgName,
Value);
1593 auto ReportUnknownArgument = [&](
bool IsArg,
1594 StringRef NearestArgumentName) {
1595 *Errs << ProgramName <<
": Unknown "
1596 << (IsArg ?
"command line argument" :
"subcommand") <<
" '"
1597 << argv[i] <<
"'. Try: '" << argv[0] <<
" --help'\n";
1599 if (NearestArgumentName.empty())
1602 *Errs << ProgramName <<
": Did you mean '";
1604 *Errs << PrintArg(NearestArgumentName, 0);
1606 *Errs << NearestArgumentName;
1610 if (i > 1 || !MaybeNamedSubCommand)
1611 ReportUnknownArgument(
true, NearestHandlerString);
1613 ReportUnknownArgument(
false, NearestSubCommandString);
1615 ErrorParsing =
true;
1623 Handler->
error(
"This argument does not take a value.\n"
1624 "\tInstead, it consumes any positional arguments until "
1625 "the next recognized option.", *Errs);
1626 ErrorParsing =
true;
1628 ActivePositionalArg = Handler;
1635 if (NumPositionalRequired > PositionalVals.
size()) {
1636 *Errs << ProgramName
1637 <<
": Not enough positional command line arguments specified!\n"
1638 <<
"Must specify at least " << NumPositionalRequired
1639 <<
" positional argument" << (NumPositionalRequired > 1 ?
"s" :
"")
1640 <<
": See: " << argv[0] <<
" --help\n";
1642 ErrorParsing =
true;
1643 }
else if (!HasUnlimitedPositionals &&
1644 PositionalVals.
size() > PositionalOpts.size()) {
1645 *Errs << ProgramName <<
": Too many positional arguments specified!\n"
1646 <<
"Can specify at most " << PositionalOpts.size()
1647 <<
" positional arguments: See: " << argv[0] <<
" --help\n";
1648 ErrorParsing =
true;
1650 }
else if (!ConsumeAfterOpt) {
1652 unsigned ValNo = 0, NumVals =
static_cast<unsigned>(PositionalVals.
size());
1653 for (
Option *Opt : PositionalOpts) {
1656 PositionalVals[ValNo].second);
1658 --NumPositionalRequired;
1666 while (NumVals - ValNo > NumPositionalRequired && !
Done) {
1674 PositionalVals[ValNo].second);
1679 "positional argument processing!");
1684 assert(ConsumeAfterOpt && NumPositionalRequired <= PositionalVals.
size());
1686 for (
Option *Opt : PositionalOpts)
1689 Opt, PositionalVals[ValNo].first, PositionalVals[ValNo].second);
1698 if (PositionalOpts.size() == 1 && ValNo == 0 && !PositionalVals.
empty()) {
1700 PositionalVals[ValNo].first,
1701 PositionalVals[ValNo].second);
1707 for (; ValNo != PositionalVals.
size(); ++ValNo)
1710 PositionalVals[ValNo].second);
1714 for (
const auto &Opt : OptionsMap) {
1719 Opt.second->
error(
"must be specified at least once!");
1720 ErrorParsing =
true;
1732 for (
int i = 0; i < argc; ++i)
dbgs() << argv[i] <<
' ';
1753 if (!ArgName.
data())
1755 if (ArgName.
empty())
1758 Errs <<
globalParser().ProgramName <<
": for the " << PrintArg(ArgName, 0);
1760 Errs <<
" option: " << Message <<
"\n";
1766 return handleOccurrence(pos, ArgName, Value);
1773 if (O.ValueStr.empty())
1788 size_t FirstLineIndentedBy) {
1789 assert(Indent >= FirstLineIndentedBy);
1790 std::pair<StringRef, StringRef> Split =
HelpStr.split(
'\n');
1793 while (!Split.second.empty()) {
1794 Split = Split.second.split(
'\n');
1795 outs().
indent(Indent) << Split.first <<
"\n";
1800 size_t FirstLineIndentedBy) {
1802 assert(BaseIndent >= FirstLineIndentedBy);
1803 std::pair<StringRef, StringRef> Split =
HelpStr.split(
'\n');
1804 outs().
indent(BaseIndent - FirstLineIndentedBy)
1806 while (!Split.second.empty()) {
1807 Split = Split.second.split(
'\n');
1808 outs().
indent(BaseIndent + ValHelpPrefix.
size()) << Split.first <<
"\n";
1813void alias::printOptionInfo(
size_t GlobalWidth)
const {
1829 if (!ValName.empty()) {
1830 size_t FormattingLen = 3;
1843 size_t GlobalWidth)
const {
1844 outs() << PrintArg(O.ArgStr);
1847 if (!ValName.empty()) {
1853 outs() << (O.ArgStr.size() == 1 ?
" <" :
"=<") <<
getValueStr(O, ValName)
1862 size_t GlobalWidth)
const {
1863 outs() << PrintArg(O.ArgStr);
1864 outs().
indent(GlobalWidth - O.ArgStr.size());
1884template <
typename FixedOrScalableQuantityT>
1887 FixedOrScalableQuantityT &
Value) {
1888 using ScalarTy =
typename FixedOrScalableQuantityT::ScalarTy;
1894 Value = FixedOrScalableQuantityT::getFixed(MinValue);
1900 return O.error(
"'" + Arg +
"' value invalid for " + ValueKind +
1903 Remainder = Remainder.
ltrim();
1905 return O.error(
"'" + Arg +
"' value invalid for " + ValueKind +
1908 Remainder = Remainder.
ltrim();
1910 return O.error(
"'" + Arg +
"' value invalid for " + ValueKind +
1913 Value = FixedOrScalableQuantityT::getScalable(MinValue);
1922 return O.error(
"'" + Arg +
"' value invalid for integer argument!");
1931 return O.error(
"'" + Arg +
"' value invalid for long argument!");
1940 return O.error(
"'" + Arg +
"' value invalid for llong argument!");
1950 return O.error(
"'" + Arg +
"' value invalid for uint argument!");
1957 unsigned long &
Value) {
1960 return O.error(
"'" + Arg +
"' value invalid for ulong argument!");
1968 unsigned long long &
Value) {
1971 return O.error(
"'" + Arg +
"' value invalid for ullong argument!");
1978 ElementCount &
Value) {
1987 return O.error(
"'" + Arg +
"' value invalid for floating point argument!");
2013 for (
unsigned i = 0; i != e; ++i) {
2029 return O.getValueExpectedFlag() !=
ValueOptional || !Name.empty() ||
2030 !Description.
empty();
2035 if (O.hasArgStr()) {
2047 size_t BaseSize = 0;
2058 size_t GlobalWidth)
const {
2059 if (O.hasArgStr()) {
2065 outs() << PrintArg(O.ArgStr);
2084 if (OptionName.
empty()) {
2089 if (!Description.
empty())
2095 if (!O.HelpStr.empty())
2096 outs() <<
" " << O.HelpStr <<
'\n';
2113 outs() <<
" " << PrintArg(O.ArgStr);
2114 outs().
indent(GlobalWidth - O.ArgStr.size());
2117 for (
unsigned i = 0; i != NumOpts; ++i) {
2125 for (
unsigned j = 0; j != NumOpts; ++j) {
2134 outs() <<
"= *unknown option value*\n";
2142 return OS << static_cast<int>(V);
2147#define PRINT_OPT_DIFF(T) \
2148 void parser<T>::printOptionDiff(const Option &O, T V, OptionValue<T> D, \
2149 size_t GlobalWidth) const { \
2150 printOptionName(O, GlobalWidth); \
2153 raw_string_ostream SS(Str); \
2156 outs() << "= " << Str; \
2157 size_t NumSpaces = \
2158 MaxOptWidth > Str.size() ? MaxOptWidth - Str.size() : 0; \
2159 outs().indent(NumSpaces) << " (default: "; \
2161 outs() << D.getValue(); \
2163 outs() << "*no default*"; \
2182 size_t GlobalWidth)
const {
2183 printOptionName(O, GlobalWidth);
2184 outs() <<
"= " << V;
2188 outs() <<
D.getValue();
2190 outs() <<
"*no default*";
2195 const Option &O, std::optional<StringRef> V,
2196 const OptionValue<std::optional<std::string>> &
D,
2197 size_t GlobalWidth)
const {
2198 printOptionName(O, GlobalWidth);
2199 outs() <<
"= " <<
V;
2200 size_t VSize =
V.has_value() ?
V.value().size() : 0;
2203 if (
D.hasValue() &&
D.getValue().has_value())
2204 outs() <<
D.getValue();
2206 outs() <<
"*no value*";
2212 size_t GlobalWidth)
const {
2214 outs() <<
"= *cannot print option value*\n";
2222 const std::pair<const char *, Option *> *
RHS) {
2223 return strcmp(
LHS->first,
RHS->first);
2227 const std::pair<const char *, SubCommand *> *
RHS) {
2228 return strcmp(
LHS->first,
RHS->first);
2237 for (
auto I = OptMap.
begin(),
E = OptMap.
end();
I !=
E; ++
I) {
2243 if (
I->second->getOptionHiddenFlag() ==
Hidden && !ShowHidden)
2247 if (!OptionSet.
insert(
I->second).second)
2251 std::pair<const char *, Option *>(
I->first.data(),
I->second));
2261 for (
auto *S : SubMap) {
2262 if (S->getName().empty())
2264 Subs.push_back(std::make_pair(S->getName().data(), S));
2273 const bool ShowHidden;
2274 using StrOptionPairVector =
2276 using StrSubCommandPairVector =
2279 virtual void printOptions(StrOptionPairVector &Opts,
size_t MaxArgLen) {
2280 for (
const auto &Opt : Opts)
2284 void printSubCommands(StrSubCommandPairVector &Subs,
size_t MaxSubLen) {
2285 for (
const auto &S : Subs) {
2286 outs() <<
" " << S.first;
2287 if (!S.second->getDescription().empty()) {
2289 outs() <<
" - " << S.second->getDescription();
2296 explicit HelpPrinter(
bool showHidden) : ShowHidden(showHidden) {}
2297 virtual ~HelpPrinter() =
default;
2300 void operator=(
bool Value) {
2311 auto &OptionsMap =
Sub->OptionsMap;
2312 auto &PositionalOpts =
Sub->PositionalOpts;
2313 auto &ConsumeAfterOpt =
Sub->ConsumeAfterOpt;
2315 StrOptionPairVector Opts;
2316 sortOpts(OptionsMap, Opts, ShowHidden);
2318 StrSubCommandPairVector Subs;
2327 outs() <<
" [subcommand]";
2328 outs() <<
" [options]";
2330 if (!
Sub->getDescription().empty()) {
2331 outs() <<
"SUBCOMMAND '" <<
Sub->getName()
2332 <<
"': " <<
Sub->getDescription() <<
"\n\n";
2338 for (
auto *Opt : PositionalOpts) {
2345 if (ConsumeAfterOpt)
2346 outs() <<
" " << ConsumeAfterOpt->HelpStr;
2350 size_t MaxSubLen = 0;
2351 for (
const auto &
Sub : Subs)
2352 MaxSubLen = std::max(MaxSubLen, strlen(
Sub.first));
2355 outs() <<
"SUBCOMMANDS:\n\n";
2356 printSubCommands(Subs, MaxSubLen);
2359 <<
" <subcommand> --help\" to get more help on a specific "
2366 size_t MaxArgLen = 0;
2367 for (
const auto &Opt : Opts)
2370 outs() <<
"OPTIONS:\n";
2371 printOptions(Opts, MaxArgLen);
2380class CategorizedHelpPrinter :
public HelpPrinter {
2382 explicit CategorizedHelpPrinter(
bool showHidden) : HelpPrinter(showHidden) {}
2388 static int OptionCategoryCompare(OptionCategory *
const *
A,
2389 OptionCategory *
const *
B) {
2390 return (*A)->getName().compare((*B)->getName());
2394 using HelpPrinter::operator=;
2397 void printOptions(StrOptionPairVector &Opts,
size_t MaxArgLen)
override {
2398 std::vector<OptionCategory *> SortedCategories;
2399 DenseMap<OptionCategory *, std::vector<Option *>> CategorizedOptions;
2407 assert(SortedCategories.size() > 0 &&
"No option categories registered!");
2409 OptionCategoryCompare);
2414 for (
const auto &
I : Opts) {
2415 Option *Opt =
I.second;
2416 for (OptionCategory *Cat : Opt->
Categories) {
2418 "Option has an unregistered category");
2419 CategorizedOptions[Cat].push_back(Opt);
2424 for (OptionCategory *Category : SortedCategories) {
2426 const auto &CategoryOptions = CategorizedOptions[Category];
2427 if (CategoryOptions.empty())
2432 outs() << Category->getName() <<
":\n";
2435 if (!Category->getDescription().empty())
2436 outs() << Category->getDescription() <<
"\n\n";
2441 for (
const Option *Opt : CategoryOptions)
2449class HelpPrinterWrapper {
2451 HelpPrinter &UncategorizedPrinter;
2452 CategorizedHelpPrinter &CategorizedPrinter;
2455 explicit HelpPrinterWrapper(HelpPrinter &UncategorizedPrinter,
2456 CategorizedHelpPrinter &CategorizedPrinter)
2457 : UncategorizedPrinter(UncategorizedPrinter),
2458 CategorizedPrinter(CategorizedPrinter) {}
2461 void operator=(
bool Value);
2466#if defined(__GNUC__)
2469# if defined(__OPTIMIZE__)
2470# define LLVM_IS_DEBUG_BUILD 0
2472# define LLVM_IS_DEBUG_BUILD 1
2474#elif defined(_MSC_VER)
2479# define LLVM_IS_DEBUG_BUILD 1
2481# define LLVM_IS_DEBUG_BUILD 0
2485# define LLVM_IS_DEBUG_BUILD 0
2489class VersionPrinter {
2491 void print(
const std::vector<VersionPrinterTy> &ExtraPrinters) {
2493#ifdef PACKAGE_VENDOR
2494 OS << PACKAGE_VENDOR <<
" ";
2496 OS <<
"LLVM (http://llvm.org/):\n ";
2498 OS << PACKAGE_NAME <<
" version " << PACKAGE_VERSION <<
"\n ";
2499#if LLVM_IS_DEBUG_BUILD
2500 OS <<
"DEBUG build";
2502 OS <<
"Optimized build";
2505 OS <<
" with assertions";
2511 if (!ExtraPrinters.empty()) {
2512 for (
const auto &
I : ExtraPrinters)
2516 void operator=(
bool OptionWasSpecified);
2519struct CommandLineCommonOptions {
2522 HelpPrinter UncategorizedNormalPrinter{
false};
2523 HelpPrinter UncategorizedHiddenPrinter{
true};
2524 CategorizedHelpPrinter CategorizedNormalPrinter{
false};
2525 CategorizedHelpPrinter CategorizedHiddenPrinter{
true};
2528 HelpPrinterWrapper WrappedNormalPrinter{UncategorizedNormalPrinter,
2529 CategorizedNormalPrinter};
2530 HelpPrinterWrapper WrappedHiddenPrinter{UncategorizedHiddenPrinter,
2531 CategorizedHiddenPrinter};
2541 "Display list of available options (--help-list-hidden for more)"),
2550 cl::desc(
"Display list of all available options"),
2562 cl::desc(
"Display available options (--help-hidden for more)"),
2572 cl::desc(
"Display all available options"),
2581 cl::desc(
"Print non-default options after command line parsing"),
2588 "print-all-options",
2589 cl::desc(
"Print all option values after command line parsing"),
2597 std::vector<VersionPrinterTy> ExtraVersionPrinters;
2600 VersionPrinter VersionPrinterInstance;
2603 "version",
cl::desc(
"Display the version of this program"),
2628 return GeneralCategory;
2631void VersionPrinter::operator=(
bool OptionWasSpecified) {
2632 if (!OptionWasSpecified)
2644void HelpPrinterWrapper::operator=(
bool Value) {
2651 if (
globalParser().RegisteredOptionCategories.size() > 1) {
2656 CategorizedPrinter =
true;
2658 UncategorizedPrinter =
true;
2665void CommandLineParser::printOptionValues() {
2670 sortOpts(ActiveSubCommand->OptionsMap, Opts,
true);
2673 size_t MaxArgLen = 0;
2674 for (
const auto &Opt : Opts)
2677 for (
const auto &Opt : Opts)
2683 if (!
Hidden && !Categorized)
2685 else if (!
Hidden && Categorized)
2687 else if (
Hidden && !Categorized)
2699#if LLVM_IS_DEBUG_BUILD
2705#ifdef EXPENSIVE_CHECKS
2706 "+expensive-checks",
2708#if __has_feature(address_sanitizer)
2711#if __has_feature(dataflow_sanitizer)
2714#if __has_feature(hwaddress_sanitizer)
2717#if __has_feature(memory_sanitizer)
2720#if __has_feature(thread_sanitizer)
2723#if __has_feature(undefined_behavior_sanitizer)
2726#ifdef LLVM_INTEGRATED_CRT_ALLOC
2727 "+alloc:" LLVM_INTEGRATED_CRT_ALLOC,
2735#if LLVM_VERSION_PRINTER_SHOW_BUILD_CONFIG
2736 OS <<
"Build config: ";
2760 return Sub.OptionsMap;
2770 for (
auto &
I :
Sub.OptionsMap) {
2771 bool Unrelated =
true;
2772 for (
auto &Cat :
I.second->Categories) {
2773 if (Cat == &Category || Cat == &
CommonOptions->GenericCategory)
2784 for (
auto &
I :
Sub.OptionsMap) {
2785 bool Unrelated =
true;
2786 for (
auto &Cat :
I.second->Categories) {
2802 const char *Overview) {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static StringRef OptionPrefix
static bool RequiresValue(const Option *O)
static int SubNameCompare(const std::pair< const char *, SubCommand * > *LHS, const std::pair< const char *, SubCommand * > *RHS)
static size_t argPlusPrefixesSize(StringRef ArgName, size_t Pad=DefaultPad)
static bool shouldPrintOption(StringRef Name, StringRef Description, const Option &O)
static bool parseDouble(Option &O, StringRef Arg, double &Value)
static CommandLineParser & globalParser()
static bool parseBool(Option &O, StringRef ArgName, StringRef Arg, T &Value)
static const size_t DefaultPad
static StringRef EmptyOption
static bool hasUTF8ByteOrderMark(ArrayRef< char > S)
static void ExpandBasePaths(StringRef BasePath, StringSaver &Saver, const char *&Arg)
static SmallString< 8 > argPrefix(StringRef ArgName, size_t Pad=DefaultPad)
static StringRef ArgHelpPrefix
void opt_unsigned_anchor()
static bool isWindowsSpecialCharInCommandName(char C)
static StringRef getValueStr(const Option &O, StringRef DefaultMsg)
static Option * HandlePrefixedOption(StringRef &Arg, StringRef &Value, const OptionsMapTy &OptionsMap)
The specified argument string (which started with at least one '-') does not fully match an available...
static size_t getOptionPrefixesSize()
static bool ProvideOption(Option *Handler, StringRef ArgName, StringRef Value, int argc, const char *const *argv, int &i)
ProvideOption - For Value, this differentiates between an empty value ("") and a null value (StringRe...
static bool isQuote(char C)
static ManagedStatic< CommandLineCommonOptions > CommonOptions
static void initCommonOptions()
static void sortOpts(OptionsMapTy &OptMap, SmallVectorImpl< std::pair< const char *, Option * > > &Opts, bool ShowHidden)
DenseMap< StringRef, Option * > OptionsMapTy
static void tokenizeWindowsCommandLineImpl(StringRef Src, StringSaver &Saver, function_ref< void(StringRef)> AddToken, bool AlwaysCopy, function_ref< void()> MarkEOL, bool InitialCommandName)
static Option * findPrefixOption(StringRef Name, size_t &Length, const OptionsMapTy &OptionsMap)
static bool isWhitespace(char C)
static bool parseFixedOrScalableQuantity(Option &O, StringRef Arg, StringRef ValueKind, FixedOrScalableQuantityT &Value)
static size_t parseBackslash(StringRef Src, size_t I, SmallString< 128 > &Token)
Backslashes are interpreted in a rather complicated way in the Windows-style command line,...
static StringRef ArgPrefixLong
static void sortSubCommands(const SmallPtrSetImpl< SubCommand * > &SubMap, SmallVectorImpl< std::pair< const char *, SubCommand * > > &Subs)
#define PRINT_OPT_DIFF(T)
static bool isWhitespaceOrNull(char C)
static const size_t MaxOptWidth
static bool EatsUnboundedNumberOfValues(const Option *O)
static int OptNameCompare(const std::pair< const char *, Option * > *LHS, const std::pair< const char *, Option * > *RHS)
static Option * LookupNearestOption(StringRef Arg, const OptionsMapTy &OptionsMap, std::string &NearestString)
LookupNearestOption - Lookup the closest match to the option specified by the specified option on the...
static StringRef ArgPrefix
static bool isWindowsSpecialChar(char C)
static bool CommaSeparateAndAddOccurrence(Option *Handler, unsigned pos, StringRef ArgName, StringRef Value)
CommaSeparateAndAddOccurrence - A wrapper around Handler->addOccurrence() that does special handling ...
#define LLVM_EXPORT_TEMPLATE
static void Help(StringTable CPUNames, ArrayRef< SubtargetFeatureKV > FeatTable)
Display help for feature and mcpu choices.
Provides a library for accessing information about this process and other processes on the operating ...
This file defines the SmallPtrSet class.
This file defines the SmallString class.
Defines the virtual file system interface vfs::FileSystem.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
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)
Represents either an error or a value T.
std::error_code getError() const
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
ManagedStatic - This transparently changes the behavior of global statics to be lazily constructed on...
size_t getBufferSize() const
const char * getBufferEnd() const
const char * getBufferStart() const
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool erase(PtrType Ptr)
Remove pointer from the set.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
void assign(StringRef RHS)
Assign from a StringRef.
void append(StringRef RHS)
Append from a StringRef.
StringRef str() const
Explicit conversion to StringRef.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
static constexpr size_t npos
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
Check if the string is empty.
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
LLVM_ABI unsigned edit_distance(StringRef Other, bool AllowReplacements=true, unsigned MaxEditDistance=0) const
Determine the edit distance between this string and another string.
StringRef slice(size_t Start, size_t End) const
Return a reference to the substring from [Start, End).
constexpr size_t size() const
Get the string size.
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
StringRef ltrim(char Char) const
Return string with consecutive Char characters starting from the the left removed.
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
StringRef trim(char Char) const
Return string with consecutive Char characters starting from the left and right removed.
bool consume_front(char Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
Saves strings in the provided stable storage and returns a StringRef with a stable character pointer.
BumpPtrAllocator & getAllocator() const
StringRef save(const char *S)
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM Value Representation.
Contains options that control response file expansion.
LLVM_ABI ExpansionContext(BumpPtrAllocator &A, TokenizerCallback T, vfs::FileSystem *FS=nullptr)
LLVM_ABI bool findConfigFile(StringRef FileName, SmallVectorImpl< char > &FilePath)
Looks for the specified configuration file.
LLVM_ABI Error expandResponseFiles(SmallVectorImpl< const char * > &Argv)
Expands constructs "@file" in the provided array of arguments recursively.
LLVM_ABI Error readConfigFile(StringRef CfgFile, SmallVectorImpl< const char * > &Argv)
Reads command line options from the given configuration file.
StringRef getName() const
SmallPtrSet< SubCommand *, 1 > Subs
int getNumOccurrences() const
enum ValueExpected getValueExpectedFlag() const
void addCategory(OptionCategory &C)
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 ResetAllOptionOccurrences()
Reset all command line options to a state that looks as if they have never appeared on the command li...
LLVM_ABI void SetVersionPrinter(VersionPrinterTy func)
===------------------------------------------------------------------—===// Override the default (LLV...
LLVM_ABI void tokenizeConfigFile(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs=false)
Tokenizes content of configuration file.
LLVM_ABI DenseMap< StringRef, Option * > & getRegisteredOptions(SubCommand &Sub=SubCommand::getTopLevel())
Use this to get a map of all registered named options (e.g.
LLVM_ABI bool expandResponseFiles(int Argc, const char *const *Argv, const char *EnvVar, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv)
A convenience helper which concatenates the options specified by the environment variable EnvVar and ...
LLVM_ABI void ResetCommandLineParser()
Reset the command line parser back to its initial state.
LLVM_ABI void PrintOptionValues()
LLVM_ABI void AddLiteralOption(Option &O, StringRef Name)
Adds a new option for parsing and provides the option it refers to.
void printOptionDiff(const Option &O, const generic_parser_base &P, const DT &V, const OptionValue< DT > &Default, size_t GlobalWidth)
LLVM_ABI void TokenizeWindowsCommandLineNoCopy(StringRef Source, StringSaver &Saver, SmallVectorImpl< StringRef > &NewArgv)
Tokenizes a Windows command line while attempting to avoid copies.
LLVM_ABI void printBuildConfig(raw_ostream &OS)
Prints the compiler build configuration.
void(*)(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs) TokenizerCallback
String tokenization function type.
LLVM_ABI bool ProvidePositionalOption(Option *Handler, StringRef Arg, int i)
Parses Arg into the option handler Handler.
static raw_ostream & operator<<(raw_ostream &OS, boolOrDefault V)
initializer< Ty > init(const Ty &Val)
std::function< void(raw_ostream &)> VersionPrinterTy
LLVM_ABI ArrayRef< StringRef > getCompilerBuildConfig()
An array of optional enabled settings in the LLVM build configuration, which may be of interest to co...
LocationClass< Ty > location(Ty &L)
LLVM_ABI bool ParseCommandLineOptions(int argc, const char *const *argv, StringRef Overview="", raw_ostream *Errs=nullptr, vfs::FileSystem *VFS=nullptr, const char *EnvVar=nullptr)
LLVM_ABI void HideUnrelatedOptions(cl::OptionCategory &Category, SubCommand &Sub=SubCommand::getTopLevel())
Mark all options not part of this category as cl::ReallyHidden.
LLVM_ABI void AddExtraVersionPrinter(VersionPrinterTy func)
===------------------------------------------------------------------—===// Add an extra printer to u...
LLVM_ABI void PrintHelpMessage(bool Hidden=false, bool Categorized=false)
This function just prints the help message, exactly the same way as if the -help or -help-hidden opti...
LLVM_ABI void TokenizeWindowsCommandLineFull(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs=false)
Tokenizes a Windows full command line, including command name at the start.
LLVM_ABI void TokenizeGNUCommandLine(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs=false)
Tokenizes a command line that can contain escapes and quotes.
LLVM_ABI StringRef parent_path(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get parent path.
LLVM_ABI bool has_parent_path(const Twine &path, Style style=Style::native)
Has parent path?
LLVM_ABI bool is_relative(const Twine &path, Style style=Style::native)
Is path relative?
LLVM_ABI StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
LLVM_ABI bool is_absolute(const Twine &path, Style style=Style::native)
Is path absolute?
LLVM_ABI void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
LLVM_ABI IntrusiveRefCntPtr< FileSystem > getRealFileSystem()
Gets an vfs::FileSystem for the 'real' file system, as seen by the operating system.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
void initWithColorOptions()
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
LLVM_ABI raw_fd_ostream & outs()
This returns a reference to a raw_fd_ostream for standard output.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
void interleaveComma(const Container &c, StreamT &os, UnaryFunctor each_fn)
LLVM_ABI bool hasUTF16ByteOrderMark(ArrayRef< char > SrcBytes)
Returns true if a blob of text starts with a UTF-16 big or little endian byte order mark.
void initDebugCounterOptions()
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
bool to_float(const Twine &T, float &Num)
@ no_such_file_or_directory
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
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.