31#include "llvm/Config/config.h"
50#define DEBUG_TYPE "commandline"
79void GenericOptionValue::anchor() {}
82void Option::anchor() {}
106 size_t Len = ArgName.
size();
114 for (
size_t I = 0;
I < Pad; ++
I) {
142 OS <<
argPrefix(Arg.ArgName, Arg.Pad) << Arg.ArgName;
146class CommandLineParser {
150 std::string ProgramName;
154 std::vector<StringRef> MoreHelp;
173 bool LongOptionsUseDoubleDash =
false);
176 if (Opt.
Subs.empty()) {
181 for (
auto *SC : RegisteredSubCommands)
186 for (
auto *SC : Opt.
Subs) {
188 "SubCommand::getAll() should not be used with other subcommands");
196 if (!
SC->OptionsMap.insert(std::make_pair(
Name, &Opt)).second) {
197 errs() << ProgramName <<
": CommandLine Error: Option '" <<
Name
198 <<
"' registered more than once!\n";
209 bool HadErrors =
false;
210 if (
O->hasArgStr()) {
212 if (
O->isDefaultOption() &&
SC->OptionsMap.contains(
O->ArgStr))
216 if (!
SC->OptionsMap.insert(std::make_pair(
O->ArgStr, O)).second) {
217 errs() << ProgramName <<
": CommandLine Error: Option '" <<
O->ArgStr
218 <<
"' registered more than once!\n";
225 SC->PositionalOpts.push_back(O);
227 SC->SinkOpts.push_back(O);
229 if (
SC->ConsumeAfterOpt) {
230 O->error(
"Cannot specify more than one option with cl::ConsumeAfter!");
233 SC->ConsumeAfterOpt =
O;
244 void addOption(
Option *O,
bool ProcessDefaultOption =
false) {
245 if (!ProcessDefaultOption &&
O->isDefaultOption()) {
249 forEachSubCommand(*O, [&](
SubCommand &SC) { addOption(O, &SC); });
254 O->getExtraOptionNames(OptionNames);
260 for (
auto Name : OptionNames) {
262 if (
I !=
End &&
I->getValue() == O)
285 void removeOption(
Option *O) {
286 forEachSubCommand(*O, [&](
SubCommand &SC) { removeOption(O, &SC); });
289 bool hasOptions(
const SubCommand &Sub)
const {
294 bool hasOptions()
const {
295 for (
const auto *S : RegisteredSubCommands) {
302 bool hasNamedSubCommands()
const {
303 for (
const auto *S : RegisteredSubCommands)
304 if (!S->getName().empty())
309 SubCommand *getActiveSubCommand() {
return ActiveSubCommand; }
313 if (!Sub.
OptionsMap.insert(std::make_pair(NewName, O)).second) {
314 errs() << ProgramName <<
": CommandLine Error: Option '" <<
O->ArgStr
315 <<
"' registered more than once!\n";
322 forEachSubCommand(*O,
323 [&](
SubCommand &SC) { updateArgStr(O, NewName, &SC); });
326 void printOptionValues();
333 "Duplicate option categories");
341 return (!
sub->getName().empty()) &&
344 "Duplicate subcommands");
345 RegisteredSubCommands.insert(
sub);
350 "SubCommand::getAll() should not be registered");
353 if ((
O->isPositional() ||
O->isSink() ||
O->isConsumeAfter()) ||
357 addLiteralOption(*O,
sub, E.first());
362 RegisteredSubCommands.erase(
sub);
367 return make_range(RegisteredSubCommands.begin(),
368 RegisteredSubCommands.end());
372 ActiveSubCommand =
nullptr;
377 RegisteredOptionCategories.
clear();
380 RegisteredSubCommands.clear();
386 DefaultOptions.
clear();
394 bool LongOptionsUseDoubleDash,
bool HaveDoubleDash) {
396 if (Opt && LongOptionsUseDoubleDash && !HaveDoubleDash && !
isGrouping(Opt))
407template <
typename T, T TrueVal, T FalseVal>
409 if (Arg ==
"" || Arg ==
"true" || Arg ==
"TRUE" || Arg ==
"True" ||
415 if (Arg ==
"false" || Arg ==
"FALSE" || Arg ==
"False" || Arg ==
"0") {
419 return O.error(
"'" + Arg +
420 "' is invalid value for boolean argument! Try 0 or 1");
433 FullyInitialized =
true;
439 if (FullyInitialized)
465void OptionCategory::registerCategory() {
499SubCommand::operator
bool()
const {
517 size_t EqualPos = Arg.
find(
'=');
537 Arg = Arg.
substr(0, EqualPos);
542 std::string &NearestString) {
547 for (
auto *S : RegisteredSubCommands) {
549 "SubCommand::getAll() is not expected in RegisteredSubCommands");
550 if (S->getName().empty())
553 if (S->getName() ==
Name)
556 if (!NearestMatch && S->getName().edit_distance(
Name) < 2)
561 NearestString = NearestMatch->
getName();
572 std::string &NearestString) {
578 std::pair<StringRef, StringRef> SplitArg = Arg.
split(
'=');
584 unsigned BestDistance = 0;
586 ie = OptionsMap.
end();
594 O->getExtraOptionNames(OptionNames);
600 for (
const auto &
Name : OptionNames) {
602 Flag,
true, BestDistance);
603 if (!Best || Distance < BestDistance) {
605 BestDistance = Distance;
606 if (
RHS.empty() || !PermitValue)
607 NearestString = std::string(
Name);
621 bool MultiArg =
false) {
633 Val = Val.
substr(Pos + 1);
649 const char *
const *argv,
int &i) {
660 return Handler->
error(
"requires a value!");
662 assert(argv &&
"null check");
667 if (NumAdditionalVals > 0)
668 return Handler->
error(
"multi-valued option specified"
669 " with ValueDisallowed modifier!");
680 if (NumAdditionalVals == 0)
684 bool MultiArg =
false;
693 while (NumAdditionalVals > 0) {
695 return Handler->
error(
"not enough values!");
696 assert(argv &&
"null check");
719 bool (*Pred)(
const Option *),
722 if (OMI != OptionsMap.
end() && !Pred(OMI->getValue()))
723 OMI = OptionsMap.
end();
728 while (OMI == OptionsMap.
end() &&
Name.size() > 1) {
731 if (OMI != OptionsMap.
end() && !Pred(OMI->getValue()))
732 OMI = OptionsMap.
end();
735 if (OMI != OptionsMap.
end() && Pred(OMI->second)) {
763 assert(OptionsMap.
count(Arg) && OptionsMap.
find(Arg)->second == PGOpt);
773 if (MaybeValue[0] ==
'=') {
783 ErrorParsing |= PGOpt->
error(
"may not occur within a group!");
812 return C ==
' ' ||
C ==
'\t' ||
C ==
'\r' ||
C ==
'\n';
819static bool isQuote(
char C) {
return C ==
'\"' ||
C ==
'\''; }
825 for (
size_t I = 0, E = Src.size();
I != E; ++
I) {
830 if (MarkEOLs && Src[
I] ==
'\n')
841 if (
I + 1 < E &&
C ==
'\\') {
850 while (
I != E && Src[
I] !=
C) {
852 if (Src[
I] ==
'\\' &&
I + 1 != E)
867 if (MarkEOLs &&
C ==
'\n')
900 size_t E = Src.size();
901 int BackslashCount = 0;
906 }
while (
I != E && Src[
I] ==
'\\');
908 bool FollowedByDoubleQuote = (
I != E && Src[
I] ==
'"');
909 if (FollowedByDoubleQuote) {
910 Token.
append(BackslashCount / 2,
'\\');
911 if (BackslashCount % 2 == 0)
916 Token.
append(BackslashCount,
'\\');
934 bool AlwaysCopy,
function_ref<
void()> MarkEOL,
bool InitialCommandName) {
943 bool CommandName = InitialCommandName;
946 enum {
INIT, UNQUOTED, QUOTED } State =
INIT;
948 for (
size_t I = 0, E = Src.size();
I < E; ++
I) {
951 assert(Token.
empty() &&
"token should be empty in initial state");
973 AddToken(AlwaysCopy ? Saver.
save(NormalChars) : NormalChars);
974 if (
I < E && Src[
I] ==
'\n') {
976 CommandName = InitialCommandName;
980 }
else if (Src[
I] ==
'\"') {
981 Token += NormalChars;
983 }
else if (Src[
I] ==
'\\') {
984 assert(!CommandName &&
"or else we'd have treated it as a normal char");
985 Token += NormalChars;
999 AddToken(Saver.
save(Token.
str()));
1001 if (Src[
I] ==
'\n') {
1002 CommandName = InitialCommandName;
1005 CommandName =
false;
1008 }
else if (Src[
I] ==
'\"') {
1010 }
else if (Src[
I] ==
'\\' && !CommandName) {
1018 if (Src[
I] ==
'\"') {
1019 if (
I < (E - 1) && Src[
I + 1] ==
'"') {
1028 }
else if (Src[
I] ==
'\\' && !CommandName) {
1038 AddToken(Saver.
save(Token.
str()));
1045 auto OnEOL = [&]() {
1050 true, OnEOL,
false);
1056 auto OnEOL = []() {};
1065 auto OnEOL = [&]() {
1076 for (
const char *Cur = Source.begin(); Cur != Source.end();) {
1085 while (Cur != Source.end() && *Cur !=
'\n')
1090 const char *Start = Cur;
1091 for (
const char *
End = Source.end(); Cur !=
End; ++Cur) {
1093 if (Cur + 1 !=
End) {
1096 (*Cur ==
'\r' && (Cur + 1 !=
End) && Cur[1] ==
'\n')) {
1097 Line.append(Start, Cur - 1);
1103 }
else if (*Cur ==
'\n')
1107 Line.append(Start, Cur);
1115 return (S.
size() >= 3 && S[0] ==
'\xef' && S[1] ==
'\xbb' && S[2] ==
'\xbf');
1129 TokenPos = ArgString.
find(Token, StartPos)) {
1133 if (ResponseFile.
empty())
1137 ResponseFile.
append(BasePath);
1138 StartPos = TokenPos + Token.
size();
1141 if (!ResponseFile.
empty()) {
1144 if (!Remaining.
empty())
1151Error ExpansionContext::expandResponseFile(
1159 "': " +
EC.message());
1166 std::string UTF8Buf;
1170 "Could not convert UTF16 to UTF8");
1177 Str =
StringRef(BufRef.data() + 3, BufRef.size() - 3);
1180 Tokenizer(Str, Saver, NewArgv, MarkEOLs);
1185 if (!RelativeNames && !InConfigFile)
1189 for (
const char *&Arg : NewArgv) {
1201 bool ConfigInclusion =
false;
1202 if (ArgStr.consume_front(
"@")) {
1206 }
else if (ArgStr.consume_front(
"--config=")) {
1208 ConfigInclusion =
true;
1220 std::make_error_code(std::errc::no_such_file_or_directory),
1221 "cannot not find configuration file: " + FileName);
1222 ResponseFile.
append(FilePath);
1224 ResponseFile.
append(BasePath);
1236 struct ResponseFileRecord {
1251 for (
unsigned I = 0;
I != Argv.
size();) {
1252 while (
I == FileStack.
back().End) {
1258 const char *Arg = Argv[
I];
1260 if (Arg ==
nullptr) {
1265 if (Arg[0] !=
'@') {
1270 const char *FName = Arg + 1;
1275 if (CurrentDir.
empty()) {
1280 CWD.getError(),
Twine(
"cannot get absolute path for: ") + FName);
1283 CurrDir = CurrentDir;
1286 FName = CurrDir.
c_str();
1290 if (!Res || !Res->exists()) {
1291 std::error_code EC = Res.
getError();
1292 if (!InConfigFile) {
1303 "': " + EC.message());
1308 [FileStatus,
this](
const ResponseFileRecord &RFile) ->
ErrorOr<bool> {
1311 return RHS.getError();
1320 R.getError(),
Twine(
"recursive expansion of: '") +
F.File +
"'");
1323 Twine(
"cannot open file: ") +
F.File);
1330 if (
Error Err = expandResponseFile(FName, ExpandedArgv))
1333 for (ResponseFileRecord &
Record : FileStack) {
1339 FileStack.push_back({FName,
I + ExpandedArgv.
size()});
1364 Tokenize(*EnvValue, Saver, NewArgv,
false);
1367 NewArgv.
append(Argv + 1, Argv + Argc);
1387 : Saver(
A), Tokenizer(
T), FS(vfs::getRealFileSystem().
get()) {}
1401 CfgFilePath = FileName;
1404 if (!FileExists(CfgFilePath))
1411 for (
const StringRef &Dir : SearchDirs) {
1417 if (FileExists(CfgFilePath)) {
1432 return make_error<StringError>(
1433 EC,
Twine(
"cannot get absolute path for " + CfgFile));
1434 CfgFile = AbsPath.
str();
1436 InConfigFile =
true;
1437 RelativeNames =
true;
1438 if (
Error Err = expandResponseFile(CfgFile, Argv))
1447 bool LongOptionsUseDoubleDash) {
1456 if (std::optional<std::string> EnvValue =
1462 for (
int I = 1;
I < argc; ++
I)
1464 int NewArgc =
static_cast<int>(NewArgv.
size());
1467 return GlobalParser->ParseCommandLineOptions(NewArgc, &NewArgv[0], Overview,
1468 Errs, LongOptionsUseDoubleDash);
1472void CommandLineParser::ResetAllOptionOccurrences() {
1476 for (
auto *SC : RegisteredSubCommands) {
1477 for (
auto &O : SC->OptionsMap)
1479 for (
Option *O : SC->PositionalOpts)
1481 for (
Option *O : SC->SinkOpts)
1483 if (SC->ConsumeAfterOpt)
1484 SC->ConsumeAfterOpt->reset();
1488bool CommandLineParser::ParseCommandLineOptions(
int argc,
1489 const char *
const *argv,
1492 bool LongOptionsUseDoubleDash) {
1493 assert(hasOptions() &&
"No options specified!");
1495 ProgramOverview = Overview;
1496 bool IgnoreErrors = Errs;
1499 bool ErrorParsing =
false;
1510 if (
Error Err = ECtx.expandResponseFiles(newArgv)) {
1511 *Errs <<
toString(std::move(Err)) <<
'\n';
1515 argc =
static_cast<int>(newArgv.size());
1521 unsigned NumPositionalRequired = 0;
1524 bool HasUnlimitedPositionals =
false;
1528 std::string NearestSubCommandString;
1529 bool MaybeNamedSubCommand =
1530 argc >= 2 && argv[FirstArg][0] !=
'-' && hasNamedSubCommands();
1531 if (MaybeNamedSubCommand) {
1535 LookupSubCommand(
StringRef(argv[FirstArg]), NearestSubCommandString);
1541 assert(ChosenSubCommand);
1544 auto &SinkOpts = ChosenSubCommand->
SinkOpts;
1545 auto &OptionsMap = ChosenSubCommand->
OptionsMap;
1547 for (
auto *O: DefaultOptions) {
1551 if (ConsumeAfterOpt) {
1552 assert(PositionalOpts.size() > 0 &&
1553 "Cannot specify cl::ConsumeAfter without a positional argument!");
1555 if (!PositionalOpts.empty()) {
1558 bool UnboundedFound =
false;
1559 for (
size_t i = 0, e = PositionalOpts.size(); i != e; ++i) {
1560 Option *Opt = PositionalOpts[i];
1562 ++NumPositionalRequired;
1563 else if (ConsumeAfterOpt) {
1566 if (PositionalOpts.size() > 1) {
1568 Opt->
error(
"error - this positional option will never be matched, "
1569 "because it does not Require a value, and a "
1570 "cl::ConsumeAfter option is active!");
1571 ErrorParsing =
true;
1573 }
else if (UnboundedFound && !Opt->
hasArgStr()) {
1579 Opt->
error(
"error - option can never match, because "
1580 "another positional argument will match an "
1581 "unbounded number of values, and this option"
1582 " does not require a value!");
1583 *Errs << ProgramName <<
": CommandLine Error: Option '" << Opt->
ArgStr
1584 <<
"' is all messed up!\n";
1585 *Errs << PositionalOpts.size();
1586 ErrorParsing =
true;
1590 HasUnlimitedPositionals = UnboundedFound || ConsumeAfterOpt;
1601 Option *ActivePositionalArg =
nullptr;
1604 bool DashDashFound =
false;
1605 for (
int i = FirstArg; i < argc; ++i) {
1606 Option *Handler =
nullptr;
1607 std::string NearestHandlerString;
1610 bool HaveDoubleDash =
false;
1616 if (argv[i][0] !=
'-' || argv[i][1] == 0 || DashDashFound) {
1618 if (ActivePositionalArg) {
1623 if (!PositionalOpts.empty()) {
1629 if (PositionalVals.
size() >= NumPositionalRequired && ConsumeAfterOpt) {
1630 for (++i; i < argc; ++i)
1638 }
else if (argv[i][0] ==
'-' && argv[i][1] ==
'-' && argv[i][2] == 0 &&
1640 DashDashFound =
true;
1642 }
else if (ActivePositionalArg &&
1650 HaveDoubleDash =
true;
1652 Handler = LookupLongOption(*ChosenSubCommand, ArgName,
Value,
1653 LongOptionsUseDoubleDash, HaveDoubleDash);
1662 HaveDoubleDash =
true;
1664 Handler = LookupLongOption(*ChosenSubCommand, ArgName,
Value,
1665 LongOptionsUseDoubleDash, HaveDoubleDash);
1672 LongOptionsUseDoubleDash, HaveDoubleDash);
1675 if (!Handler && !(LongOptionsUseDoubleDash && HaveDoubleDash))
1681 if (!Handler && SinkOpts.empty())
1686 if (!SinkOpts.empty()) {
1687 for (
Option *SinkOpt : SinkOpts)
1688 SinkOpt->addOccurrence(i,
"",
StringRef(argv[i]));
1692 auto ReportUnknownArgument = [&](
bool IsArg,
1694 *Errs << ProgramName <<
": Unknown "
1695 << (IsArg ?
"command line argument" :
"subcommand") <<
" '"
1696 << argv[i] <<
"'. Try: '" << argv[0] <<
" --help'\n";
1698 if (NearestArgumentName.empty())
1701 *Errs << ProgramName <<
": Did you mean '";
1703 *Errs << PrintArg(NearestArgumentName, 0);
1705 *Errs << NearestArgumentName;
1709 if (i > 1 || !MaybeNamedSubCommand)
1710 ReportUnknownArgument(
true, NearestHandlerString);
1712 ReportUnknownArgument(
false, NearestSubCommandString);
1714 ErrorParsing =
true;
1722 Handler->
error(
"This argument does not take a value.\n"
1723 "\tInstead, it consumes any positional arguments until "
1724 "the next recognized option.", *Errs);
1725 ErrorParsing =
true;
1727 ActivePositionalArg = Handler;
1734 if (NumPositionalRequired > PositionalVals.
size()) {
1735 *Errs << ProgramName
1736 <<
": Not enough positional command line arguments specified!\n"
1737 <<
"Must specify at least " << NumPositionalRequired
1738 <<
" positional argument" << (NumPositionalRequired > 1 ?
"s" :
"")
1739 <<
": See: " << argv[0] <<
" --help\n";
1741 ErrorParsing =
true;
1742 }
else if (!HasUnlimitedPositionals &&
1743 PositionalVals.
size() > PositionalOpts.size()) {
1744 *Errs << ProgramName <<
": Too many positional arguments specified!\n"
1745 <<
"Can specify at most " << PositionalOpts.size()
1746 <<
" positional arguments: See: " << argv[0] <<
" --help\n";
1747 ErrorParsing =
true;
1749 }
else if (!ConsumeAfterOpt) {
1751 unsigned ValNo = 0, NumVals =
static_cast<unsigned>(PositionalVals.
size());
1752 for (
Option *Opt : PositionalOpts) {
1755 PositionalVals[ValNo].second);
1757 --NumPositionalRequired;
1765 while (NumVals - ValNo > NumPositionalRequired && !
Done) {
1773 PositionalVals[ValNo].second);
1778 "positional argument processing!");
1783 assert(ConsumeAfterOpt && NumPositionalRequired <= PositionalVals.
size());
1785 for (
Option *Opt : PositionalOpts)
1788 Opt, PositionalVals[ValNo].first, PositionalVals[ValNo].second);
1797 if (PositionalOpts.size() == 1 && ValNo == 0 && !PositionalVals.
empty()) {
1799 PositionalVals[ValNo].first,
1800 PositionalVals[ValNo].second);
1806 for (; ValNo != PositionalVals.
size(); ++ValNo)
1809 PositionalVals[ValNo].second);
1813 for (
const auto &Opt : OptionsMap) {
1818 Opt.second->
error(
"must be specified at least once!");
1819 ErrorParsing =
true;
1831 for (
int i = 0; i < argc; ++i)
dbgs() << argv[i] <<
' ';
1852 if (!ArgName.
data())
1854 if (ArgName.
empty())
1857 Errs <<
GlobalParser->ProgramName <<
": for the " << PrintArg(ArgName, 0);
1859 Errs <<
" option: " << Message <<
"\n";
1868 return handleOccurrence(pos, ArgName,
Value);
1875 if (O.ValueStr.empty())
1885size_t alias::getOptionWidth()
const {
1890 size_t FirstLineIndentedBy) {
1891 assert(Indent >= FirstLineIndentedBy);
1892 std::pair<StringRef, StringRef> Split =
HelpStr.
split(
'\n');
1895 while (!Split.second.empty()) {
1896 Split = Split.second.split(
'\n');
1897 outs().
indent(Indent) << Split.first <<
"\n";
1902 size_t FirstLineIndentedBy) {
1904 assert(BaseIndent >= FirstLineIndentedBy);
1905 std::pair<StringRef, StringRef> Split =
HelpStr.
split(
'\n');
1906 outs().
indent(BaseIndent - FirstLineIndentedBy)
1908 while (!Split.second.empty()) {
1909 Split = Split.second.split(
'\n');
1910 outs().
indent(BaseIndent + ValHelpPrefix.
size()) << Split.first <<
"\n";
1915void alias::printOptionInfo(
size_t GlobalWidth)
const {
1931 if (!ValName.empty()) {
1932 size_t FormattingLen = 3;
1945 size_t GlobalWidth)
const {
1946 outs() << PrintArg(O.ArgStr);
1949 if (!ValName.empty()) {
1955 outs() << (O.ArgStr.size() == 1 ?
" <" :
"=<") <<
getValueStr(O, ValName)
1964 size_t GlobalWidth)
const {
1965 outs() << PrintArg(O.ArgStr);
1966 outs().
indent(GlobalWidth - O.ArgStr.size());
1973 return parseBool<bool, true, false>(O, ArgName, Arg,
Value);
1980 return parseBool<boolOrDefault, BOU_TRUE, BOU_FALSE>(O, ArgName, Arg,
Value);
1988 return O.error(
"'" + Arg +
"' value invalid for integer argument!");
1997 return O.error(
"'" + Arg +
"' value invalid for long argument!");
2006 return O.error(
"'" + Arg +
"' value invalid for llong argument!");
2016 return O.error(
"'" + Arg +
"' value invalid for uint argument!");
2023 unsigned long &
Value) {
2026 return O.error(
"'" + Arg +
"' value invalid for ulong argument!");
2034 unsigned long long &
Value) {
2037 return O.error(
"'" + Arg +
"' value invalid for ullong argument!");
2044 if (to_float(Arg,
Value))
2046 return O.error(
"'" + Arg +
"' value invalid for floating point argument!");
2072 for (
unsigned i = 0; i != e; ++i) {
2089 !Description.
empty();
2094 if (O.hasArgStr()) {
2106 size_t BaseSize = 0;
2117 size_t GlobalWidth)
const {
2118 if (O.hasArgStr()) {
2124 outs() << PrintArg(O.ArgStr);
2143 if (OptionName.
empty()) {
2148 if (!Description.
empty())
2154 if (!O.HelpStr.empty())
2155 outs() <<
" " << O.HelpStr <<
'\n';
2172 outs() <<
" " << PrintArg(O.ArgStr);
2173 outs().
indent(GlobalWidth - O.ArgStr.size());
2176 for (
unsigned i = 0; i != NumOpts; ++i) {
2184 for (
unsigned j = 0; j != NumOpts; ++j) {
2193 outs() <<
"= *unknown option value*\n";
2198#define PRINT_OPT_DIFF(T) \
2199 void parser<T>::printOptionDiff(const Option &O, T V, OptionValue<T> D, \
2200 size_t GlobalWidth) const { \
2201 printOptionName(O, GlobalWidth); \
2204 raw_string_ostream SS(Str); \
2207 outs() << "= " << Str; \
2208 size_t NumSpaces = \
2209 MaxOptWidth > Str.size() ? MaxOptWidth - Str.size() : 0; \
2210 outs().indent(NumSpaces) << " (default: "; \
2212 outs() << D.getValue(); \
2214 outs() << "*no default*"; \
2232 size_t GlobalWidth)
const {
2233 printOptionName(O, GlobalWidth);
2234 outs() <<
"= " << V;
2238 outs() <<
D.getValue();
2240 outs() <<
"*no default*";
2246 size_t GlobalWidth)
const {
2248 outs() <<
"= *cannot print option value*\n";
2256 const std::pair<const char *, Option *> *RHS) {
2257 return strcmp(
LHS->first,
RHS->first);
2261 const std::pair<const char *, SubCommand *> *RHS) {
2262 return strcmp(
LHS->first,
RHS->first);
2278 if (
I->second->getOptionHiddenFlag() ==
Hidden && !ShowHidden)
2282 if (!OptionSet.
insert(
I->second).second)
2286 std::pair<const char *, Option *>(
I->getKey().data(),
I->second));
2296 for (
auto *S : SubMap) {
2297 if (S->getName().empty())
2299 Subs.push_back(std::make_pair(S->getName().data(), S));
2308 const bool ShowHidden;
2310 StrOptionPairVector;
2312 StrSubCommandPairVector;
2314 virtual void printOptions(StrOptionPairVector &Opts,
size_t MaxArgLen) {
2315 for (
size_t i = 0, e = Opts.size(); i != e; ++i)
2316 Opts[i].second->printOptionInfo(MaxArgLen);
2319 void printSubCommands(StrSubCommandPairVector &Subs,
size_t MaxSubLen) {
2320 for (
const auto &S : Subs) {
2321 outs() <<
" " << S.first;
2322 if (!S.second->getDescription().empty()) {
2324 outs() <<
" - " << S.second->getDescription();
2331 explicit HelpPrinter(
bool showHidden) : ShowHidden(showHidden) {}
2332 virtual ~HelpPrinter() =
default;
2335 void operator=(
bool Value) {
2350 StrOptionPairVector Opts;
2351 sortOpts(OptionsMap, Opts, ShowHidden);
2353 StrSubCommandPairVector Subs;
2362 outs() <<
" [subcommand]";
2363 outs() <<
" [options]";
2373 for (
auto *Opt : PositionalOpts) {
2380 if (ConsumeAfterOpt)
2381 outs() <<
" " << ConsumeAfterOpt->HelpStr;
2385 size_t MaxSubLen = 0;
2386 for (
size_t i = 0, e = Subs.size(); i != e; ++i)
2387 MaxSubLen = std::max(MaxSubLen, strlen(Subs[i].first));
2390 outs() <<
"SUBCOMMANDS:\n\n";
2391 printSubCommands(Subs, MaxSubLen);
2394 <<
" <subcommand> --help\" to get more help on a specific "
2401 size_t MaxArgLen = 0;
2402 for (
size_t i = 0, e = Opts.size(); i != e; ++i)
2403 MaxArgLen = std::max(MaxArgLen, Opts[i].second->getOptionWidth());
2405 outs() <<
"OPTIONS:\n";
2406 printOptions(Opts, MaxArgLen);
2415class CategorizedHelpPrinter :
public HelpPrinter {
2417 explicit CategorizedHelpPrinter(
bool showHidden) : HelpPrinter(showHidden) {}
2425 return (*A)->getName().compare((*B)->getName());
2429 using HelpPrinter::operator=;
2432 void printOptions(StrOptionPairVector &Opts,
size_t MaxArgLen)
override {
2433 std::vector<OptionCategory *> SortedCategories;
2439 SortedCategories.push_back(Category);
2442 assert(SortedCategories.size() > 0 &&
"No option categories registered!");
2444 OptionCategoryCompare);
2449 for (
size_t I = 0,
E = Opts.size();
I !=
E; ++
I) {
2453 "Option has an unregistered category");
2454 CategorizedOptions[Cat].push_back(Opt);
2461 const auto &CategoryOptions = CategorizedOptions[Category];
2462 if (CategoryOptions.empty())
2476 for (
const Option *Opt : CategoryOptions)
2484class HelpPrinterWrapper {
2486 HelpPrinter &UncategorizedPrinter;
2487 CategorizedHelpPrinter &CategorizedPrinter;
2490 explicit HelpPrinterWrapper(HelpPrinter &UncategorizedPrinter,
2491 CategorizedHelpPrinter &CategorizedPrinter)
2492 : UncategorizedPrinter(UncategorizedPrinter),
2493 CategorizedPrinter(CategorizedPrinter) {}
2496 void operator=(
bool Value);
2501#if defined(__GNUC__)
2504# if defined(__OPTIMIZE__)
2505# define LLVM_IS_DEBUG_BUILD 0
2507# define LLVM_IS_DEBUG_BUILD 1
2509#elif defined(_MSC_VER)
2514# define LLVM_IS_DEBUG_BUILD 1
2516# define LLVM_IS_DEBUG_BUILD 0
2520# define LLVM_IS_DEBUG_BUILD 0
2524class VersionPrinter {
2526 void print(std::vector<VersionPrinterTy> ExtraPrinters = {}) {
2528#ifdef PACKAGE_VENDOR
2529 OS << PACKAGE_VENDOR <<
" ";
2531 OS <<
"LLVM (http://llvm.org/):\n ";
2533 OS << PACKAGE_NAME <<
" version " << PACKAGE_VERSION <<
"\n ";
2534#if LLVM_IS_DEBUG_BUILD
2535 OS <<
"DEBUG build";
2537 OS <<
"Optimized build";
2540 OS <<
" with assertions";
2546 if (!ExtraPrinters.empty()) {
2547 for (
const auto &
I : ExtraPrinters)
2551 void operator=(
bool OptionWasSpecified);
2554struct CommandLineCommonOptions {
2557 HelpPrinter UncategorizedNormalPrinter{
false};
2558 HelpPrinter UncategorizedHiddenPrinter{
true};
2559 CategorizedHelpPrinter CategorizedNormalPrinter{
false};
2560 CategorizedHelpPrinter CategorizedHiddenPrinter{
true};
2563 HelpPrinterWrapper WrappedNormalPrinter{UncategorizedNormalPrinter,
2564 CategorizedNormalPrinter};
2565 HelpPrinterWrapper WrappedHiddenPrinter{UncategorizedHiddenPrinter,
2566 CategorizedHiddenPrinter};
2576 "Display list of available options (--help-list-hidden for more)"),
2585 cl::desc(
"Display list of all available options"),
2597 cl::desc(
"Display available options (--help-hidden for more)"),
2608 cl::desc(
"Display all available options"),
2617 cl::desc(
"Print non-default options after command line parsing"),
2624 "print-all-options",
2625 cl::desc(
"Print all option values after command line parsing"),
2633 std::vector<VersionPrinterTy> ExtraVersionPrinters;
2636 VersionPrinter VersionPrinterInstance;
2639 "version",
cl::desc(
"Display the version of this program"),
2665 return GeneralCategory;
2668void VersionPrinter::operator=(
bool OptionWasSpecified) {
2669 if (!OptionWasSpecified)
2681void HelpPrinterWrapper::operator=(
bool Value) {
2688 if (
GlobalParser->RegisteredOptionCategories.size() > 1) {
2693 CategorizedPrinter =
true;
2695 UncategorizedPrinter =
true;
2701void CommandLineParser::printOptionValues() {
2709 size_t MaxArgLen = 0;
2710 for (
size_t i = 0, e = Opts.
size(); i != e; ++i)
2711 MaxArgLen = std::max(MaxArgLen, Opts[i].second->getOptionWidth());
2713 for (
size_t i = 0, e = Opts.
size(); i != e; ++i)
2714 Opts[i].second->printOptionValue(MaxArgLen,
CommonOptions->PrintAllOptions);
2719 if (!
Hidden && !Categorized)
2721 else if (!
Hidden && Categorized)
2723 else if (
Hidden && !Categorized)
2735#if LLVM_IS_DEBUG_BUILD
2741#ifdef EXPENSIVE_CHECKS
2742 "+expensive-checks",
2744#if __has_feature(address_sanitizer)
2747#if __has_feature(dataflow_sanitizer)
2750#if __has_feature(hwaddress_sanitizer)
2753#if __has_feature(memory_sanitizer)
2756#if __has_feature(thread_sanitizer)
2759#if __has_feature(undefined_behavior_sanitizer)
2768#if LLVM_VERSION_PRINTER_SHOW_BUILD_CONFIG
2769 OS <<
"Build config: ";
2792 assert(Subs.contains(&Sub));
2804 bool Unrelated =
true;
2805 for (
auto &Cat :
I.second->Categories) {
2806 if (Cat == &Category || Cat == &
CommonOptions->GenericCategory)
2818 bool Unrelated =
true;
2819 for (
auto &Cat :
I.second->Categories) {
2835 const char *Overview) {
This file defines the StringMap class.
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
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 bool CommaSeparateAndAddOccurrence(Option *Handler, unsigned pos, StringRef ArgName, StringRef Value, bool MultiArg=false)
CommaSeparateAndAddOccurrence - A wrapper around Handler->addOccurrence() that does special handling ...
static StringRef OptionPrefix
static bool RequiresValue(const Option *O)
static int SubNameCompare(const std::pair< const char *, SubCommand * > *LHS, const std::pair< const char *, SubCommand * > *RHS)
static size_t argPlusPrefixesSize(StringRef ArgName, size_t Pad=DefaultPad)
static bool isPrefixedOrGrouping(const Option *O)
static bool shouldPrintOption(StringRef Name, StringRef Description, const Option &O)
static ManagedStatic< SubCommand > AllSubCommands
static Option * HandlePrefixedOrGroupedOption(StringRef &Arg, StringRef &Value, bool &ErrorParsing, const StringMap< Option * > &OptionsMap)
HandlePrefixedOrGroupedOption - The specified argument string (which started with at least one '-') d...
static bool parseDouble(Option &O, StringRef Arg, double &Value)
static bool parseBool(Option &O, StringRef ArgName, StringRef Arg, T &Value)
static const size_t DefaultPad
static StringRef EmptyOption
static bool hasUTF8ByteOrderMark(ArrayRef< char > S)
static ManagedStatic< CommandLineParser > GlobalParser
static void ExpandBasePaths(StringRef BasePath, StringSaver &Saver, const char *&Arg)
static SmallString< 8 > argPrefix(StringRef ArgName, size_t Pad=DefaultPad)
static StringRef ArgHelpPrefix
static bool isWindowsSpecialCharInCommandName(char C)
static Option * getOptionPred(StringRef Name, size_t &Length, bool(*Pred)(const Option *), const StringMap< Option * > &OptionsMap)
static StringRef getValueStr(const Option &O, StringRef DefaultMsg)
static size_t getOptionPrefixesSize()
static bool ProvideOption(Option *Handler, StringRef ArgName, StringRef Value, int argc, const char *const *argv, int &i)
ProvideOption - For Value, this differentiates between an empty value ("") and a null value (StringRe...
static bool isQuote(char C)
static ManagedStatic< CommandLineCommonOptions > CommonOptions
static void initCommonOptions()
static void tokenizeWindowsCommandLineImpl(StringRef Src, StringSaver &Saver, function_ref< void(StringRef)> AddToken, bool AlwaysCopy, function_ref< void()> MarkEOL, bool InitialCommandName)
static bool isWhitespace(char C)
static LLVM_REQUIRE_CONSTANT_INITIALIZATION ManagedStatic< SubCommand > TopLevelSubCommand
static size_t parseBackslash(StringRef Src, size_t I, SmallString< 128 > &Token)
Backslashes are interpreted in a rather complicated way in the Windows-style command line,...
static StringRef ArgPrefixLong
static void sortSubCommands(const SmallPtrSetImpl< SubCommand * > &SubMap, SmallVectorImpl< std::pair< const char *, SubCommand * > > &Subs)
#define PRINT_OPT_DIFF(T)
static bool isWhitespaceOrNull(char C)
static const size_t MaxOptWidth
static Option * LookupNearestOption(StringRef Arg, const StringMap< Option * > &OptionsMap, std::string &NearestString)
LookupNearestOption - Lookup the closest match to the option specified by the specified option on the...
static bool EatsUnboundedNumberOfValues(const Option *O)
static int OptNameCompare(const std::pair< const char *, Option * > *LHS, const std::pair< const char *, Option * > *RHS)
static void sortOpts(StringMap< Option * > &OptMap, SmallVectorImpl< std::pair< const char *, Option * > > &Opts, bool ShowHidden)
static StringRef ArgPrefix
static bool isWindowsSpecialChar(char C)
static bool isGrouping(const Option *O)
#define LLVM_REQUIRE_CONSTANT_INITIALIZATION
LLVM_REQUIRE_CONSTANT_INITIALIZATION - Apply this to globals to ensure that they are constant initial...
static void Help(ArrayRef< SubtargetSubTypeKV > CPUTable, 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 ...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallPtrSet class.
This file defines the SmallString class.
Defines the virtual file system interface vfs::FileSystem.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
ArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
size_t size() const
size - Get the array size.
Allocate memory in an ever growing pool, as if by bump-pointer.
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...
This interface provides simple read-only access to a block of memory, and provides simple methods for...
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...
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)
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...
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
iterator find(StringRef Key)
size_type count(StringRef Key) const
count - Return 1 if the element is in the map, 0 otherwise.
StringRef - 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.
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
empty - Check if the string is empty.
unsigned edit_distance(StringRef Other, bool AllowReplacements=true, unsigned MaxEditDistance=0) const
Determine the edit distance between this string and another string.
constexpr size_t size() const
size - Get the string size.
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
bool consume_front(StringRef Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
static constexpr size_t npos
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.
bool findConfigFile(StringRef FileName, SmallVectorImpl< char > &FilePath)
Looks for the specified configuration file.
ExpansionContext(BumpPtrAllocator &A, TokenizerCallback T)
Error expandResponseFiles(SmallVectorImpl< const char * > &Argv)
Expands constructs "@file" in the provided array of arguments recursively.
Error readConfigFile(StringRef CfgFile, SmallVectorImpl< const char * > &Argv)
Reads command line options from the given configuration file.
StringRef getDescription() const
StringRef getName() const
SmallPtrSet< SubCommand *, 1 > Subs
int getNumOccurrences() const
enum ValueExpected getValueExpectedFlag() const
void addCategory(OptionCategory &C)
virtual bool addOccurrence(unsigned pos, StringRef ArgName, StringRef Value, bool MultiArg=false)
void setMiscFlag(enum MiscFlags M)
enum FormattingFlags getFormattingFlag() const
virtual void printOptionInfo(size_t GlobalWidth) const =0
enum NumOccurrencesFlag getNumOccurrencesFlag() const
SmallVector< OptionCategory *, 1 > Categories
bool error(const Twine &Message, StringRef ArgName=StringRef(), raw_ostream &Errs=llvm::errs())
void setArgStr(StringRef S)
bool isDefaultOption() const
unsigned getMiscFlags() const
virtual void setDefault()=0
static void printEnumValHelpStr(StringRef HelpStr, size_t Indent, size_t FirstLineIndentedBy)
unsigned getNumAdditionalVals() const
void removeArgument()
Unregisters this option from the CommandLine system.
static void printHelpStr(StringRef HelpStr, size_t Indent, size_t FirstLineIndentedBy)
StringRef getName() const
SmallVector< Option *, 4 > SinkOpts
static SubCommand & getTopLevel()
void unregisterSubCommand()
static SubCommand & getAll()
void registerSubCommand()
SmallVector< Option *, 4 > PositionalOpts
StringMap< Option * > OptionsMap
StringRef getDescription() const
void printOptionInfo(const Option &O, size_t GlobalWidth) const
virtual StringRef getValueName() const
void printOptionNoValue(const Option &O, size_t GlobalWidth) const
size_t getOptionWidth(const Option &O) const
void printOptionName(const Option &O, size_t GlobalWidth) const
virtual size_t getOptionWidth(const Option &O) const
virtual StringRef getDescription(unsigned N) const =0
virtual const GenericOptionValue & getOptionValue(unsigned N) const =0
virtual unsigned getNumOptions() const =0
virtual StringRef getOption(unsigned N) const =0
void printOptionDiff(const Option &O, const AnyOptionValue &V, const AnyOptionValue &Default, size_t GlobalWidth) const
void printGenericOptionDiff(const Option &O, const GenericOptionValue &V, const GenericOptionValue &Default, size_t GlobalWidth) const
virtual void printOptionInfo(const Option &O, size_t GlobalWidth) const
unsigned findOption(StringRef Name)
bool parse(Option &O, StringRef ArgName, StringRef Arg, DataType &V)
An efficient, type-erasing, non-owning reference to a callable.
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
static std::optional< std::string > GetEnv(StringRef name)
virtual llvm::ErrorOr< std::string > getCurrentWorkingDirectory() const =0
Get the working directory of this file system.
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(const Twine &Name, int64_t FileSize=-1, bool RequiresNullTerminator=true, bool IsVolatile=false)
This is a convenience method that opens a file, gets its content and then closes the file.
virtual std::error_code makeAbsolute(SmallVectorImpl< char > &Path) const
Make Path an absolute path.
virtual llvm::ErrorOr< Status > status(const Twine &Path)=0
Get the status of the entry at Path, if one exists.
The result of a status operation.
bool equivalent(const Status &Other) const
void LLVMParseCommandLineOptions(int argc, const char *const *argv, const char *Overview)
This function parses the given arguments using the LLVM command line parser.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
@ SC
CHAIN = SC CHAIN, Imm128 - System call.
ManagedStatic< cl::opt< FnT >, OptCreatorT > Action
constexpr size_t NameSize
std::function< void(raw_ostream &)> VersionPrinterTy
void(*)(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs) TokenizerCallback
String tokenization function type.
void PrintVersionMessage()
Utility function for printing version number.
bool ExpandResponseFiles(StringSaver &Saver, TokenizerCallback Tokenizer, SmallVectorImpl< const char * > &Argv)
A convenience helper which supports the typical use case of expansion function call.
bool expandResponseFiles(int Argc, const char *const *Argv, const char *EnvVar, SmallVectorImpl< const char * > &NewArgv)
A convenience helper which concatenates the options specified by the environment variable EnvVar and ...
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.
OptionCategory & getGeneralCategory()
void ResetAllOptionOccurrences()
Reset all command line options to a state that looks as if they have never appeared on the command li...
void SetVersionPrinter(VersionPrinterTy func)
===------------------------------------------------------------------—===// Override the default (LLV...
void tokenizeConfigFile(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs=false)
Tokenizes content of configuration file.
StringMap< Option * > & getRegisteredOptions(SubCommand &Sub=SubCommand::getTopLevel())
Use this to get a StringMap to all registered named options (e.g.
void ResetCommandLineParser()
Reset the command line parser back to its initial state.
bool ParseCommandLineOptions(int argc, const char *const *argv, StringRef Overview="", raw_ostream *Errs=nullptr, const char *EnvVar=nullptr, bool LongOptionsUseDoubleDash=false)
iterator_range< typename SmallPtrSet< SubCommand *, 4 >::iterator > getRegisteredSubcommands()
Use this to get all registered SubCommands from the provided parser.
void AddLiteralOption(Option &O, StringRef Name)
Adds a new option for parsing and provides the option it refers to.
void TokenizeWindowsCommandLineNoCopy(StringRef Source, StringSaver &Saver, SmallVectorImpl< StringRef > &NewArgv)
Tokenizes a Windows command line while attempting to avoid copies.
void printBuildConfig(raw_ostream &OS)
Prints the compiler build configuration.
bool ProvidePositionalOption(Option *Handler, StringRef Arg, int i)
Parses Arg into the option handler Handler.
initializer< Ty > init(const Ty &Val)
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)
void HideUnrelatedOptions(cl::OptionCategory &Category, SubCommand &Sub=SubCommand::getTopLevel())
Mark all options not part of this category as cl::ReallyHidden.
void AddExtraVersionPrinter(VersionPrinterTy func)
===------------------------------------------------------------------—===// Add an extra printer to u...
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...
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.
void TokenizeGNUCommandLine(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs=false)
Tokenizes a command line that can contain escapes and quotes.
std::optional< const char * > toString(const std::optional< DWARFFormValue > &V)
Take an optional DWARFFormValue and try to extract a string value from it.
bool has_parent_path(const Twine &path, Style style=Style::native)
Has parent path?
bool is_relative(const Twine &path, Style style=Style::native)
Is path relative?
StringRef filename(StringRef path, Style style=Style::native)
Get filename.
StringRef parent_path(StringRef path, Style style=Style::native)
Get parent path.
bool is_absolute(const Twine &path, Style style=Style::native)
Is path absolute?
void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
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.
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 interleaveComma(const Container &c, StreamT &os, UnaryFunctor each_fn)
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.
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr)
@ no_such_file_or_directory
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
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 initTypeSizeOptions()
void initStatisticOptions()
raw_ostream & nulls()
This returns a reference to a raw_ostream which simply discards output.
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
void initRandomSeedOptions()
void initGraphWriterOptions()
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
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.
@ Default
The result values are uniform if and only if all operands are uniform.