LLVM: lib/Support/CommandLine.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
19
21
31#include "llvm/Config/config.h"
45#include
46#include
47#include
48using namespace llvm;
49using namespace cl;
50
51#define DEBUG_TYPE "commandline"
52
53
54
55
56namespace llvm {
57namespace cl {
70
71#if !(defined(LLVM_ENABLE_LLVM_EXPORT_ANNOTATIONS) && defined(_MSC_VER))
72
73
74
75
77#endif
78
83
84}
85}
86
87
88void GenericOptionValue::anchor() {}
89void OptionValue::anchor() {}
90void OptionValuestd::string::anchor() {}
91void Option::anchor() {}
106
107
108
109
110
115
116
117
119
123
125 size_t Len = ArgName.size();
126 if (Len == 1)
129}
130
133 for (size_t I = 0; I < Pad; ++I) {
134 Prefix.push_back(' ');
135 }
138}
139
140
148
149
150namespace {
151
152class PrintArg {
153 StringRef ArgName;
154 size_t Pad;
155public:
156 PrintArg(StringRef ArgName, size_t Pad = DefaultPad) : ArgName(ArgName), Pad(Pad) {}
157 friend raw_ostream &operator<<(raw_ostream &OS, const PrintArg &);
158};
159
160raw_ostream &operator<<(raw_ostream &OS, const PrintArg& Arg) {
161 OS << argPrefix(Arg.ArgName, Arg.Pad) << Arg.ArgName;
162 return OS;
163}
164
165class CommandLineParser {
166public:
167
168
169 std::string ProgramName;
170 StringRef ProgramOverview;
171
172
173 std::vector MoreHelp;
174
175
176
177
179
180
181 SmallPtrSet<OptionCategory *, 16> RegisteredOptionCategories;
182
183
184 SmallPtrSet<SubCommand *, 4> RegisteredSubCommands;
185
187
189
191 StringRef Overview, raw_ostream *Errs = nullptr,
192 vfs::FileSystem *VFS = nullptr,
193 bool LongOptionsUseDoubleDash = false);
194
195 void forEachSubCommand(Option &Opt, function_ref<void(SubCommand &)> Action) {
196 if (Opt.Subs.empty()) {
198 return;
199 }
201 for (auto *SC : RegisteredSubCommands)
202 Action(*SC);
204 return;
205 }
206 for (auto *SC : Opt.Subs) {
208 "SubCommand::getAll() should not be used with other subcommands");
209 Action(*SC);
210 }
211 }
212
213 void addLiteralOption(Option &Opt, SubCommand *SC, StringRef Name) {
215 return;
216 if (!SC->OptionsMap.insert(std::make_pair(Name, &Opt)).second) {
217 errs() << ProgramName << ": CommandLine Error: Option '" << Name
218 << "' registered more than once!\n";
219 report_fatal_error("inconsistency in registered CommandLine options");
220 }
221 }
222
223 void addLiteralOption(Option &Opt, StringRef Name) {
224 forEachSubCommand(
225 Opt, [&](SubCommand &SC) { addLiteralOption(Opt, &SC, Name); });
226 }
227
228 void addOption(Option *O, SubCommand *SC) {
229 bool HadErrors = false;
230 if (O->hasArgStr()) {
231
232 if (O->isDefaultOption() && SC->OptionsMap.contains(O->ArgStr))
233 return;
234
235
236 if (!SC->OptionsMap.insert(std::make_pair(O->ArgStr, O)).second) {
237 errs() << ProgramName << ": CommandLine Error: Option '" << O->ArgStr
238 << "' registered more than once!\n";
239 HadErrors = true;
240 }
241 }
242
243
246 else if (O->getMiscFlags() & cl::Sink)
250 O->error("Cannot specify more than one option with cl::ConsumeAfter!");
251 HadErrors = true;
252 }
254 }
255
256
257
258
259
260 if (HadErrors)
261 report_fatal_error("inconsistency in registered CommandLine options");
262 }
263
264 void addOption(Option *O, bool ProcessDefaultOption = false) {
265 if (!ProcessDefaultOption && O->isDefaultOption()) {
267 return;
268 }
269 forEachSubCommand(*O, [&](SubCommand &SC) { addOption(O, &SC); });
270 }
271
272 void removeOption(Option *O, SubCommand *SC) {
273 SmallVector<StringRef, 16> OptionNames;
274 O->getExtraOptionNames(OptionNames);
275 if (O->hasArgStr())
277
278 SubCommand &Sub = *SC;
280 for (auto Name : OptionNames) {
281 auto I = Sub.OptionsMap.find(Name);
282 if (I != End && I->getValue() == O)
284 }
285
287 for (auto *Opt = Sub.PositionalOpts.begin();
288 Opt != Sub.PositionalOpts.end(); ++Opt) {
289 if (*Opt == O) {
290 Sub.PositionalOpts.erase(Opt);
291 break;
292 }
293 }
294 else if (O->getMiscFlags() & cl::Sink)
295 for (auto *Opt = Sub.SinkOpts.begin(); Opt != Sub.SinkOpts.end(); ++Opt) {
296 if (*Opt == O) {
297 Sub.SinkOpts.erase(Opt);
298 break;
299 }
300 }
301 else if (O == Sub.ConsumeAfterOpt)
302 Sub.ConsumeAfterOpt = nullptr;
303 }
304
305 void removeOption(Option *O) {
306 forEachSubCommand(*O, [&](SubCommand &SC) { removeOption(O, &SC); });
307 }
308
309 bool hasOptions(const SubCommand &Sub) const {
310 return (.OptionsMap.empty() ||
.PositionalOpts.empty() ||
311 nullptr != Sub.ConsumeAfterOpt);
312 }
313
314 bool hasOptions() const {
315 for (const auto *S : RegisteredSubCommands) {
316 if (hasOptions(*S))
317 return true;
318 }
319 return false;
320 }
321
322 bool hasNamedSubCommands() const {
323 for (const auto *S : RegisteredSubCommands)
324 if (!S->getName().empty())
325 return true;
326 return false;
327 }
328
329 SubCommand *getActiveSubCommand() { return ActiveSubCommand; }
330
331 void updateArgStr(Option *O, StringRef NewName, SubCommand *SC) {
332 SubCommand &Sub = *SC;
333 if (.OptionsMap.insert(std::make_pair(NewName, O)).second) {
334 errs() << ProgramName << ": CommandLine Error: Option '" << O->ArgStr
335 << "' registered more than once!\n";
336 report_fatal_error("inconsistency in registered CommandLine options");
337 }
339 }
340
341 void updateArgStr(Option *O, StringRef NewName) {
342 forEachSubCommand(*O,
343 [&](SubCommand &SC) { updateArgStr(O, NewName, &SC); });
344 }
345
346 void printOptionValues();
347
348 void registerCategory(OptionCategory *cat) {
350 [cat](const OptionCategory *Category) {
352 }) == 0 &&
353 "Duplicate option categories");
354
355 RegisteredOptionCategories.insert(cat);
356 }
357
358 void registerSubCommand(SubCommand *sub) {
360 [sub](const SubCommand *Sub) {
361 return (->getName().empty()) &&
362 (Sub->getName() == sub->getName());
363 }) == 0 &&
364 "Duplicate subcommands");
365 RegisteredSubCommands.insert(sub);
366
367
368
370 "SubCommand::getAll() should not be registered");
373 if ((O->isPositional() || O->isSink() || O->isConsumeAfter()) ||
374 O->hasArgStr())
375 addOption(O, sub);
376 else
377 addLiteralOption(*O, sub, E.first());
378 }
379 }
380
381 void unregisterSubCommand(SubCommand *sub) {
382 RegisteredSubCommands.erase(sub);
383 }
384
385 iterator_range<SmallPtrSet<SubCommand *, 4>::iterator>
387 return make_range(RegisteredSubCommands.begin(),
388 RegisteredSubCommands.end());
389 }
390
391 void reset() {
392 ActiveSubCommand = nullptr;
393 ProgramName.clear();
394 ProgramOverview = StringRef();
395
396 MoreHelp.clear();
397 RegisteredOptionCategories.clear();
398
400 RegisteredSubCommands.clear();
401
405
406 DefaultOptions.clear();
407 }
408
409private:
410 SubCommand *ActiveSubCommand = nullptr;
411
412 Option *LookupOption(SubCommand &Sub, StringRef &Arg, StringRef &Value);
413 Option *LookupLongOption(SubCommand &Sub, StringRef &Arg, StringRef &Value,
414 bool LongOptionsUseDoubleDash, bool HaveDoubleDash) {
416 if (Opt && LongOptionsUseDoubleDash && !HaveDoubleDash && (Opt))
417 return nullptr;
418 return Opt;
419 }
420 SubCommand *LookupSubCommand(StringRef Name, std::string &NearestString);
421};
422
423}
424
426
427template <typename T, T TrueVal, T FalseVal>
429 if (Arg == "" || Arg == "true" || Arg == "TRUE" || Arg == "True" ||
430 Arg == "1") {
432 return false;
433 }
434
435 if (Arg == "false" || Arg == "FALSE" || Arg == "False" || Arg == "0") {
436 Value = FalseVal;
437 return false;
438 }
439 return O.error("'" + Arg +
440 "' is invalid value for boolean argument! Try 0 or 1");
441}
442
446
450
453 FullyInitialized = true;
454}
455
457
459 if (FullyInitialized)
463 if (ArgStr.size() == 1)
465}
466
468 assert(.empty() && "Categories cannot be empty.");
469
470
471
476}
477
479 NumOccurrences = 0;
483}
484
485void OptionCategory::registerCategory() {
487}
488
489
490
491
492
495
496
498
500
502
506
510
518
519SubCommand::operator bool() const {
520 return (GlobalParser->getActiveSubCommand() == this);
521}
522
523
524
525
526
527
528
529
532
534 return nullptr;
536
537 size_t EqualPos = Arg.find('=');
538
539
541
542 return Sub.OptionsMap.lookup(Arg);
543 }
544
545
546
547
548 auto I = Sub.OptionsMap.find(Arg.substr(0, EqualPos));
549 if (I == Sub.OptionsMap.end())
550 return nullptr;
551
552 auto *O = I->second;
554 return nullptr;
555
557 Arg = Arg.substr(0, EqualPos);
558 return I->second;
559}
560
562 std::string &NearestString) {
563 if (Name.empty())
565
567 for (auto *S : RegisteredSubCommands) {
569 "SubCommand::getAll() is not expected in RegisteredSubCommands");
570 if (S->getName().empty())
571 continue;
572
573 if (S->getName() == Name)
574 return S;
575
576 if (!NearestMatch && S->getName().edit_distance(Name) < 2)
577 NearestMatch = S;
578 }
579
580 if (NearestMatch)
581 NearestString = NearestMatch->getName();
582
584}
585
586
587
588
589
592 std::string &NearestString) {
593
595 return nullptr;
596
597
598 std::pair<StringRef, StringRef> SplitArg = Arg.split('=');
599 StringRef &LHS = SplitArg.first;
601
602
603 Option *Best = nullptr;
604 unsigned BestDistance = 0;
605 for (const auto &[_, O] : OptionsMap) {
606
607 if (O->getOptionHiddenFlag() == ReallyHidden)
608 continue;
609
611 O->getExtraOptionNames(OptionNames);
612 if (O->hasArgStr())
613 OptionNames.push_back(O->ArgStr);
614
617 for (const auto &Name : OptionNames) {
619 Flag, true, BestDistance);
620 if (!Best || Distance < BestDistance) {
621 Best = O;
622 BestDistance = Distance;
623 if (RHS.empty() || !PermitValue)
624 NearestString = std::string(Name);
625 else
626 NearestString = (Twine(Name) + "=" + RHS).str();
627 }
628 }
629 }
630
631 return Best;
632}
633
634
635
638 bool MultiArg = false) {
639
640
644
646
648 return true;
649
650 Val = Val.substr(Pos + 1);
651
652 Pos = Val.find(',');
653 }
654
656 }
657
659}
660
661
662
663
666 const char *const *argv, int &i) {
667
669
670
673 if (.data()) {
674
675
677 return Handler->error("requires a value!");
678
679 assert(argv && "null check");
681 }
682 break;
684 if (NumAdditionalVals > 0)
685 return Handler->error("multi-valued option specified"
686 " with ValueDisallowed modifier!");
687
688 if (Value.data())
689 return Handler->error("does not allow a value! '" + Twine(Value) +
690 "' specified.");
691 break;
693 break;
694 }
695
696
697 if (NumAdditionalVals == 0)
699
700
701 bool MultiArg = false;
702
703 if (Value.data()) {
705 return true;
706 --NumAdditionalVals;
707 MultiArg = true;
708 }
709
710 while (NumAdditionalVals > 0) {
711 if (i + 1 >= argc)
712 return Handler->error("not enough values!");
713 assert(argv && "null check");
715
717 return true;
718 MultiArg = true;
719 --NumAdditionalVals;
720 }
721 return false;
722}
723
728
729
730
731
732
733
734
736 bool (*Pred)(const Option *),
739 if (OMI != OptionsMap.end() && !Pred(OMI->getValue()))
740 OMI = OptionsMap.end();
741
742
743
744
745 while (OMI == OptionsMap.end() && Name.size() > 1) {
746 Name = Name.drop_back();
747 OMI = OptionsMap.find(Name);
748 if (OMI != OptionsMap.end() && !Pred(OMI->getValue()))
749 OMI = OptionsMap.end();
750 }
751
752 if (OMI != OptionsMap.end() && Pred(OMI->second)) {
753 Length = Name.size();
754 return OMI->second;
755 }
756 return nullptr;
757}
758
759
760
761
762
765 bool &ErrorParsing,
767 if (Arg.size() == 1)
768 return nullptr;
769
770
773 if (!PGOpt)
774 return nullptr;
775
776 do {
780 assert(OptionsMap.count(Arg) && OptionsMap.find(Arg)->second == PGOpt);
781
782
783
786 Value = MaybeValue;
787 return PGOpt;
788 }
789
790 if (MaybeValue[0] == '=') {
792 return PGOpt;
793 }
794
795
797
798
800 ErrorParsing |= PGOpt->error("may not occur within a group!");
801 return nullptr;
802 }
803
804
805
806 int Dummy = 0;
808
809
810 Arg = MaybeValue;
812 } while (PGOpt);
813
814
815 return nullptr;
816}
817
819 return O->getNumOccurrencesFlag() == cl::Required ||
821}
822
827
829 return C == ' ' || C == '\t' || C == '\r' || C == '\n';
830}
831
835
836static bool isQuote(char C) { return C == '\"' || C == '\''; }
837
840 bool MarkEOLs) {
842 for (size_t I = 0, E = Src.size(); I != E; ++I) {
843
844 if (Token.empty()) {
846
847 if (MarkEOLs && Src[I] == '\n')
849 ++I;
850 }
851 if (I == E)
852 break;
853 }
854
856
857
858 if (I + 1 < E && C == '\\') {
859 ++I;
861 continue;
862 }
863
864
866 ++I;
867 while (I != E && Src[I] != C) {
868
869 if (Src[I] == '\\' && I + 1 != E)
870 ++I;
872 ++I;
873 }
874 if (I == E)
875 break;
876 continue;
877 }
878
879
881 if (!Token.empty())
883
884 if (MarkEOLs && C == '\n')
887 continue;
888 }
889
890
892 }
893
894
895 if (!Token.empty())
897}
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
917 size_t E = Src.size();
918 int BackslashCount = 0;
919
920 do {
921 ++I;
922 ++BackslashCount;
923 } while (I != E && Src[I] == '\\');
924
925 bool FollowedByDoubleQuote = (I != E && Src[I] == '"');
926 if (FollowedByDoubleQuote) {
927 Token.append(BackslashCount / 2, '\\');
928 if (BackslashCount % 2 == 0)
929 return I - 1;
931 return I;
932 }
933 Token.append(BackslashCount, '\\');
934 return I - 1;
935}
936
937
938
939
946
947
948
951 bool AlwaysCopy, function_ref<void()> MarkEOL, bool InitialCommandName) {
953
954
955
956
957
958
959
960 bool CommandName = InitialCommandName;
961
962
963 enum { INIT, UNQUOTED, QUOTED } State = INIT;
964
965 for (size_t I = 0, E = Src.size(); I < E; ++I) {
966 switch (State) {
968 assert(Token.empty() && "token should be empty in initial state");
969
971 if (Src[I] == '\n')
972 MarkEOL();
973 ++I;
974 }
975
977 break;
978 size_t Start = I;
979 if (CommandName) {
981 ++I;
982 } else {
984 ++I;
985 }
988
989
990 AddToken(AlwaysCopy ? Saver.save(NormalChars) : NormalChars);
991 if (I < E && Src[I] == '\n') {
992 MarkEOL();
993 CommandName = InitialCommandName;
994 } else {
995 CommandName = false;
996 }
997 } else if (Src[I] == '\"') {
998 Token += NormalChars;
999 State = QUOTED;
1000 } else if (Src[I] == '\\') {
1001 assert(!CommandName && "or else we'd have treated it as a normal char");
1002 Token += NormalChars;
1004 State = UNQUOTED;
1005 } else {
1007 }
1008 break;
1009 }
1010
1011 case UNQUOTED:
1013
1014
1015
1016 AddToken(Saver.save(Token.str()));
1018 if (Src[I] == '\n') {
1019 CommandName = InitialCommandName;
1020 MarkEOL();
1021 } else {
1022 CommandName = false;
1023 }
1024 State = INIT;
1025 } else if (Src[I] == '\"') {
1026 State = QUOTED;
1027 } else if (Src[I] == '\\' && !CommandName) {
1029 } else {
1031 }
1032 break;
1033
1034 case QUOTED:
1035 if (Src[I] == '\"') {
1036 if (I < (E - 1) && Src[I + 1] == '"') {
1037
1038
1040 ++I;
1041 } else {
1042
1043 State = UNQUOTED;
1044 }
1045 } else if (Src[I] == '\\' && !CommandName) {
1047 } else {
1049 }
1050 break;
1051 }
1052 }
1053
1054 if (State != INIT)
1055 AddToken(Saver.save(Token.str()));
1056}
1057
1060 bool MarkEOLs) {
1061 auto AddToken = [&](StringRef Tok) { NewArgv.push_back(Tok.data()); };
1062 auto OnEOL = [&]() {
1063 if (MarkEOLs)
1065 };
1067 true, OnEOL, false);
1068}
1069
1073 auto OnEOL = []() {};
1075 OnEOL, false);
1076}
1077
1080 bool MarkEOLs) {
1081 auto AddToken = [&](StringRef Tok) { NewArgv.push_back(Tok.data()); };
1082 auto OnEOL = [&]() {
1083 if (MarkEOLs)
1085 };
1087 true, OnEOL, true);
1088}
1089
1092 bool MarkEOLs) {
1093 for (const char *Cur = Source.begin(); Cur != Source.end();) {
1095
1097 while (Cur != Source.end() && isWhitespace(*Cur))
1098 ++Cur;
1099 continue;
1100 }
1101 if (*Cur == '#') {
1102 while (Cur != Source.end() && *Cur != '\n')
1103 ++Cur;
1104 continue;
1105 }
1106
1107 const char *Start = Cur;
1108 for (const char *End = Source.end(); Cur != End; ++Cur) {
1109 if (*Cur == '\\') {
1110 if (Cur + 1 != End) {
1111 ++Cur;
1112 if (*Cur == '\n' ||
1113 (*Cur == '\r' && (Cur + 1 != End) && Cur[1] == '\n')) {
1114 Line.append(Start, Cur - 1);
1115 if (*Cur == '\r')
1116 ++Cur;
1117 Start = Cur + 1;
1118 }
1119 }
1120 } else if (*Cur == '\n')
1121 break;
1122 }
1123
1124 Line.append(Start, Cur);
1126 }
1127}
1128
1129
1130
1132 return (S.size() >= 3 && S[0] == '\xef' && S[1] == '\xbb' && S[2] == '\xbf');
1133}
1134
1135
1137 const char *&Arg) {
1141
1146 TokenPos = ArgString.find(Token, StartPos)) {
1147
1148
1149 const StringRef LHS = ArgString.substr(StartPos, TokenPos - StartPos);
1150 if (ResponseFile.empty())
1151 ResponseFile = LHS;
1152 else
1154 ResponseFile.append(BasePath);
1155 StartPos = TokenPos + Token.size();
1156 }
1157
1158 if (!ResponseFile.empty()) {
1159
1161 if (!Remaining.empty())
1163 Arg = Saver.save(ResponseFile.str()).data();
1164 }
1165}
1166
1167
1168Error ExpansionContext::expandResponseFile(
1169 StringRef FName, SmallVectorImpl<const char *> &NewArgv) {
1171 llvm::ErrorOr<std::unique_ptr> MemBufOrErr =
1172 FS->getBufferForFile(FName);
1173 if (!MemBufOrErr) {
1174 std::error_code EC = MemBufOrErr.getError();
1176 "': " + EC.message());
1177 }
1178 MemoryBuffer &MemBuf = *MemBufOrErr.get();
1180
1181
1183 std::string UTF8Buf;
1187 "Could not convert UTF16 to UTF8");
1188 Str = StringRef(UTF8Buf);
1189 }
1190
1191
1192
1194 Str = StringRef(BufRef.data() + 3, BufRef.size() - 3);
1195
1196
1197 Tokenizer(Str, Saver, NewArgv, MarkEOLs);
1198
1199
1200
1201
1202 if (!RelativeNames && !InConfigFile)
1204
1206 for (const char *&Arg : NewArgv) {
1207 if (!Arg)
1208 continue;
1209
1210
1211 if (InConfigFile)
1213
1214
1215
1216 StringRef ArgStr(Arg);
1217 StringRef FileName;
1218 bool ConfigInclusion = false;
1219 if (ArgStr.consume_front("@")) {
1220 FileName = ArgStr;
1222 continue;
1223 } else if (ArgStr.consume_front("--config=")) {
1224 FileName = ArgStr;
1225 ConfigInclusion = true;
1226 } else {
1227 continue;
1228 }
1229
1230
1231 SmallString<128> ResponseFile;
1234 SmallString<128> FilePath;
1237 std::make_error_code(std::errc::no_such_file_or_directory),
1238 "cannot not find configuration file: " + FileName);
1239 ResponseFile.append(FilePath);
1240 } else {
1241 ResponseFile.append(BasePath);
1243 }
1244 Arg = Saver.save(ResponseFile.str()).data();
1245 }
1247}
1248
1249
1250
1253 struct ResponseFileRecord {
1254 std::string File;
1255 size_t End;
1256 };
1257
1258
1259
1260
1262
1263
1264
1266
1267
1268 for (unsigned I = 0; I != Argv.size();) {
1269 while (I == FileStack.back().End) {
1270
1271
1273 }
1274
1275 const char *Arg = Argv[I];
1276
1277 if (Arg == nullptr) {
1278 ++I;
1279 continue;
1280 }
1281
1282 if (Arg[0] != '@') {
1283 ++I;
1284 continue;
1285 }
1286
1287 const char *FName = Arg + 1;
1288
1289
1292 if (CurrentDir.empty()) {
1293 if (auto CWD = FS->getCurrentWorkingDirectory()) {
1294 CurrDir = *CWD;
1295 } else {
1297 CWD.getError(), Twine("cannot get absolute path for: ") + FName);
1298 }
1299 } else {
1300 CurrDir = CurrentDir;
1301 }
1303 FName = CurrDir.c_str();
1304 }
1305
1307 if (!Res || !Res->exists()) {
1308 std::error_code EC = Res.getError();
1309 if (!InConfigFile) {
1310
1311
1313 ++I;
1314 continue;
1315 }
1316 }
1317 if (!EC)
1320 "': " + EC.message());
1321 }
1323
1324 auto IsEquivalent =
1325 [FileStatus, this](const ResponseFileRecord &RFile) -> ErrorOr {
1327 if (!RHS)
1330 };
1331
1332
1333 for (const auto &F : drop_begin(FileStack)) {
1335 if (R.get())
1337 R.getError(), Twine("recursive expansion of: '") + F.File + "'");
1338 } else {
1340 Twine("cannot open file: ") + F.File);
1341 }
1342 }
1343
1344
1345
1347 if (Error Err = expandResponseFile(FName, ExpandedArgv))
1348 return Err;
1349
1350 for (ResponseFileRecord &Record : FileStack) {
1351
1352
1353 Record.End += ExpandedArgv.size() - 1;
1354 }
1355
1356 FileStack.push_back({FName, I + ExpandedArgv.size()});
1359 }
1360
1361
1362
1363
1364
1365
1366 assert(FileStack.size() > 0 && Argv.size() == FileStack.back().End);
1368}
1369
1373#ifdef _WIN32
1375#else
1377#endif
1378
1379 if (EnvVar)
1381 Tokenize(*EnvValue, Saver, NewArgv, false);
1382
1383
1384 NewArgv.append(Argv + 1, Argv + Argc);
1388 return false;
1389 }
1390 return true;
1391}
1392
1398 return false;
1399 }
1400 return true;
1401}
1402
1405 : Saver(A), Tokenizer(T), FS(FS ? FS : vfs::getRealFileSystem().get()) {}
1406
1410 const auto FileExists = [this](SmallString<128> Path) -> bool {
1411 auto Status = FS->status(Path);
1414 };
1415
1416
1417
1419 CfgFilePath = FileName;
1421 return false;
1422 if (!FileExists(CfgFilePath))
1423 return false;
1424 FilePath.assign(CfgFilePath.begin(), CfgFilePath.end());
1425 return true;
1426 }
1427
1428
1429 for (const StringRef &Dir : SearchDirs) {
1430 if (Dir.empty())
1431 continue;
1432 CfgFilePath.assign(Dir);
1435 if (FileExists(CfgFilePath)) {
1436 FilePath.assign(CfgFilePath.begin(), CfgFilePath.end());
1437 return true;
1438 }
1439 }
1440
1441 return false;
1442}
1443
1448 AbsPath.assign(CfgFile);
1449 if (std::error_code EC = FS->makeAbsolute(AbsPath))
1451 EC, Twine("cannot get absolute path for " + CfgFile));
1452 CfgFile = AbsPath.str();
1453 }
1454 InConfigFile = true;
1455 RelativeNames = true;
1456 if (Error Err = expandResponseFile(CfgFile, Argv))
1457 return Err;
1459}
1460
1465 bool LongOptionsUseDoubleDash) {
1471
1472
1473 if (EnvVar) {
1474 if (std::optionalstd::string EnvValue =
1477 }
1478
1479
1480 for (int I = 1; I < argc; ++I)
1482 int NewArgc = static_cast<int>(NewArgv.size());
1483
1484
1485 return GlobalParser->ParseCommandLineOptions(
1486 NewArgc, &NewArgv[0], Overview, Errs, VFS, LongOptionsUseDoubleDash);
1487}
1488
1489
1490void CommandLineParser::ResetAllOptionOccurrences() {
1491
1492
1493
1494 for (auto *SC : RegisteredSubCommands) {
1496 O.second->reset();
1498 O->reset();
1500 O->reset();
1503 }
1504}
1505
1506bool CommandLineParser::ParseCommandLineOptions(
1509 assert(hasOptions() && "No options specified!");
1510
1511 ProgramOverview = Overview;
1512 bool IgnoreErrors = Errs;
1513 if (!Errs)
1514 Errs = &errs();
1515 if (!VFS)
1517 bool ErrorParsing = false;
1518
1519
1522#ifdef _WIN32
1524#else
1526#endif
1528 if (Error Err = ECtx.expandResponseFiles(newArgv)) {
1529 *Errs << toString(std::move(Err)) << '\n';
1530 return false;
1531 }
1532 argv = &newArgv[0];
1533 argc = static_cast<int>(newArgv.size());
1534
1535
1537
1538
1539 unsigned NumPositionalRequired = 0;
1540
1541
1542 bool HasUnlimitedPositionals = false;
1543
1544 int FirstArg = 1;
1546 std::string NearestSubCommandString;
1547 bool MaybeNamedSubCommand =
1548 argc >= 2 && argv[FirstArg][0] != '-' && hasNamedSubCommands();
1549 if (MaybeNamedSubCommand) {
1550
1551
1552 ChosenSubCommand =
1553 LookupSubCommand(StringRef(argv[FirstArg]), NearestSubCommandString);
1555 FirstArg = 2;
1556 }
1557 GlobalParser->ActiveSubCommand = ChosenSubCommand;
1558
1559 assert(ChosenSubCommand);
1560 auto &ConsumeAfterOpt = ChosenSubCommand->ConsumeAfterOpt;
1561 auto &PositionalOpts = ChosenSubCommand->PositionalOpts;
1562 auto &SinkOpts = ChosenSubCommand->SinkOpts;
1563 auto &OptionsMap = ChosenSubCommand->OptionsMap;
1564
1565 for (auto *O: DefaultOptions) {
1566 addOption(O, true);
1567 }
1568
1569 if (ConsumeAfterOpt) {
1570 assert(PositionalOpts.size() > 0 &&
1571 "Cannot specify cl::ConsumeAfter without a positional argument!");
1572 }
1573 if (!PositionalOpts.empty()) {
1574
1575
1576 bool UnboundedFound = false;
1577 for (size_t i = 0, e = PositionalOpts.size(); i != e; ++i) {
1578 Option *Opt = PositionalOpts[i];
1580 ++NumPositionalRequired;
1581 else if (ConsumeAfterOpt) {
1582
1583
1584 if (PositionalOpts.size() > 1) {
1585 if (!IgnoreErrors)
1586 Opt->error("error - this positional option will never be matched, "
1587 "because it does not Require a value, and a "
1588 "cl::ConsumeAfter option is active!");
1589 ErrorParsing = true;
1590 }
1591 } else if (UnboundedFound && !Opt->hasArgStr()) {
1592
1593
1594
1595
1596 if (!IgnoreErrors)
1597 Opt->error("error - option can never match, because "
1598 "another positional argument will match an "
1599 "unbounded number of values, and this option"
1600 " does not require a value!");
1601 *Errs << ProgramName << ": CommandLine Error: Option '" << Opt->ArgStr
1602 << "' is all messed up!\n";
1603 *Errs << PositionalOpts.size();
1604 ErrorParsing = true;
1605 }
1607 }
1608 HasUnlimitedPositionals = UnboundedFound || ConsumeAfterOpt;
1609 }
1610
1611
1612
1613
1615
1616
1617
1618
1619 Option *ActivePositionalArg = nullptr;
1620
1621
1622 bool DashDashFound = false;
1623 for (int i = FirstArg; i < argc; ++i) {
1624 Option *Handler = nullptr;
1625 std::string NearestHandlerString;
1626 StringRef Value;
1627 StringRef ArgName = "";
1628 bool HaveDoubleDash = false;
1629
1630
1631
1632
1633
1634 if (argv[i][0] != '-' || argv[i][1] == 0 || DashDashFound) {
1635
1636 if (ActivePositionalArg) {
1638 continue;
1639 }
1640
1641 if (!PositionalOpts.empty()) {
1642 PositionalVals.push_back(std::make_pair(StringRef(argv[i]), i));
1643
1644
1645
1646
1647 if (PositionalVals.size() >= NumPositionalRequired && ConsumeAfterOpt) {
1648 for (++i; i < argc; ++i)
1649 PositionalVals.push_back(std::make_pair(StringRef(argv[i]), i));
1650 break;
1651 }
1652
1653
1654 continue;
1655 }
1656 } else if (argv[i][0] == '-' && argv[i][1] == '-' && argv[i][2] == 0 &&
1657 !DashDashFound) {
1658 DashDashFound = true;
1659 continue;
1660 } else if (ActivePositionalArg &&
1662
1663
1664
1665 ArgName = StringRef(argv[i] + 1);
1666
1668 HaveDoubleDash = true;
1669
1670 Handler = LookupLongOption(*ChosenSubCommand, ArgName, Value,
1671 LongOptionsUseDoubleDash, HaveDoubleDash);
1674 continue;
1675 }
1676 } else {
1677 ArgName = StringRef(argv[i] + 1);
1678
1680 HaveDoubleDash = true;
1681
1682 Handler = LookupLongOption(*ChosenSubCommand, ArgName, Value,
1683 LongOptionsUseDoubleDash, HaveDoubleDash);
1684
1685
1686
1687
1690 LongOptionsUseDoubleDash, HaveDoubleDash);
1691
1692
1693 if (!Handler && !(LongOptionsUseDoubleDash && HaveDoubleDash))
1695 OptionsMap);
1696
1697
1698
1699 if (!Handler && SinkOpts.empty())
1701 }
1702
1703 if (!Handler) {
1704 if (!SinkOpts.empty()) {
1705 for (Option *SinkOpt : SinkOpts)
1706 SinkOpt->addOccurrence(i, "", StringRef(argv[i]));
1707 continue;
1708 }
1709
1710 auto ReportUnknownArgument = [&](bool IsArg,
1711 StringRef NearestArgumentName) {
1712 *Errs << ProgramName << ": Unknown "
1713 << (IsArg ? "command line argument" : "subcommand") << " '"
1714 << argv[i] << "'. Try: '" << argv[0] << " --help'\n";
1715
1716 if (NearestArgumentName.empty())
1717 return;
1718
1719 *Errs << ProgramName << ": Did you mean '";
1720 if (IsArg)
1721 *Errs << PrintArg(NearestArgumentName, 0);
1722 else
1723 *Errs << NearestArgumentName;
1724 *Errs << "'?\n";
1725 };
1726
1727 if (i > 1 || !MaybeNamedSubCommand)
1728 ReportUnknownArgument(true, NearestHandlerString);
1729 else
1730 ReportUnknownArgument(false, NearestSubCommandString);
1731
1732 ErrorParsing = true;
1733 continue;
1734 }
1735
1736
1737
1740 Handler->error("This argument does not take a value.\n"
1741 "\tInstead, it consumes any positional arguments until "
1742 "the next recognized option.", *Errs);
1743 ErrorParsing = true;
1744 }
1745 ActivePositionalArg = Handler;
1746 }
1747 else
1748 ErrorParsing |= ProvideOption(Handler, ArgName, Value, argc, argv, i);
1749 }
1750
1751
1752 if (NumPositionalRequired > PositionalVals.size()) {
1753 *Errs << ProgramName
1754 << ": Not enough positional command line arguments specified!\n"
1755 << "Must specify at least " << NumPositionalRequired
1756 << " positional argument" << (NumPositionalRequired > 1 ? "s" : "")
1757 << ": See: " << argv[0] << " --help\n";
1758
1759 ErrorParsing = true;
1760 } else if (!HasUnlimitedPositionals &&
1761 PositionalVals.size() > PositionalOpts.size()) {
1762 *Errs << ProgramName << ": Too many positional arguments specified!\n"
1763 << "Can specify at most " << PositionalOpts.size()
1764 << " positional arguments: See: " << argv[0] << " --help\n";
1765 ErrorParsing = true;
1766
1767 } else if (!ConsumeAfterOpt) {
1768
1769 unsigned ValNo = 0, NumVals = static_cast<unsigned>(PositionalVals.size());
1770 for (Option *Opt : PositionalOpts) {
1773 PositionalVals[ValNo].second);
1774 ValNo++;
1775 --NumPositionalRequired;
1776 }
1777
1778
1779
1780
1781
1783 while (NumVals - ValNo > NumPositionalRequired && ) {
1786 Done = true;
1787 [[fallthrough]];
1788 case cl::ZeroOrMore:
1789 case cl::OneOrMore:
1791 PositionalVals[ValNo].second);
1792 ValNo++;
1793 break;
1794 default:
1795 llvm_unreachable("Internal error, unexpected NumOccurrences flag in "
1796 "positional argument processing!");
1797 }
1798 }
1799 }
1800 } else {
1801 assert(ConsumeAfterOpt && NumPositionalRequired <= PositionalVals.size());
1802 unsigned ValNo = 0;
1803 for (Option *Opt : PositionalOpts)
1806 Opt, PositionalVals[ValNo].first, PositionalVals[ValNo].second);
1807 ValNo++;
1808 }
1809
1810
1811
1812
1813
1814
1815 if (PositionalOpts.size() == 1 && ValNo == 0 && !PositionalVals.empty()) {
1817 PositionalVals[ValNo].first,
1818 PositionalVals[ValNo].second);
1819 ValNo++;
1820 }
1821
1822
1823
1824 for (; ValNo != PositionalVals.size(); ++ValNo)
1825 ErrorParsing |=
1827 PositionalVals[ValNo].second);
1828 }
1829
1830
1831 for (const auto &Opt : OptionsMap) {
1836 Opt.second->error("must be specified at least once!");
1837 ErrorParsing = true;
1838 }
1839 [[fallthrough]];
1840 default:
1841 break;
1842 }
1843 }
1844
1845
1846
1847
1849 for (int i = 0; i < argc; ++i) dbgs() << argv[i] << ' ';
1850 dbgs() << '\n';);
1851
1852
1853
1854 MoreHelp.clear();
1855
1856
1857 if (ErrorParsing) {
1858 if (!IgnoreErrors)
1859 exit(1);
1860 return false;
1861 }
1862 return true;
1863}
1864
1865
1866
1867
1868
1870 if (!ArgName.data())
1872 if (ArgName.empty())
1873 Errs << HelpStr;
1874 else
1875 Errs << GlobalParser->ProgramName << ": for the " << PrintArg(ArgName, 0);
1876
1877 Errs << " option: " << Message << "\n";
1878 return true;
1879}
1880
1882 bool MultiArg) {
1883 if (!MultiArg)
1884 NumOccurrences++;
1885
1886 return handleOccurrence(pos, ArgName, Value);
1887}
1888
1889
1890
1891
1893 if (O.ValueStr.empty())
1894 return DefaultMsg;
1895 return O.ValueStr;
1896}
1897
1898
1899
1900
1901
1902
1905}
1906
1908 size_t FirstLineIndentedBy) {
1909 assert(Indent >= FirstLineIndentedBy);
1910 std::pair<StringRef, StringRef> Split = HelpStr.split('\n');
1911 outs().indent(Indent - FirstLineIndentedBy)
1913 while (!Split.second.empty()) {
1914 Split = Split.second.split('\n');
1915 outs().indent(Indent) << Split.first << "\n";
1916 }
1917}
1918
1920 size_t FirstLineIndentedBy) {
1921 const StringRef ValHelpPrefix = " ";
1922 assert(BaseIndent >= FirstLineIndentedBy);
1923 std::pair<StringRef, StringRef> Split = HelpStr.split('\n');
1924 outs().indent(BaseIndent - FirstLineIndentedBy)
1925 << ArgHelpPrefix << ValHelpPrefix << Split.first << "\n";
1926 while (!Split.second.empty()) {
1927 Split = Split.second.split('\n');
1928 outs().indent(BaseIndent + ValHelpPrefix.size()) << Split.first << "\n";
1929 }
1930}
1931
1932
1933void alias::printOptionInfo(size_t GlobalWidth) const {
1936}
1937
1938
1939
1940
1941
1942
1943
1944
1945
1949 if (!ValName.empty()) {
1950 size_t FormattingLen = 3;
1952 FormattingLen = 6;
1954 }
1955
1956 return Len;
1957}
1958
1959
1960
1961
1963 size_t GlobalWidth) const {
1964 outs() << PrintArg(O.ArgStr);
1965
1967 if (!ValName.empty()) {
1970 } else if (O.getValueExpectedFlag() == ValueOptional)
1972 else {
1973 outs() << (O.ArgStr.size() == 1 ? " <" : "=<") << getValueStr(O, ValName)
1974 << '>';
1975 }
1976 }
1977
1979}
1980
1982 size_t GlobalWidth) const {
1983 outs() << PrintArg(O.ArgStr);
1984 outs().indent(GlobalWidth - O.ArgStr.size());
1985}
1986
1987
1988
1992}
1993
1994
1995
1999}
2000
2001
2002
2006 return O.error("'" + Arg + "' value invalid for integer argument!");
2007 return false;
2008}
2009
2010
2011
2015 return O.error("'" + Arg + "' value invalid for long argument!");
2016 return false;
2017}
2018
2019
2020
2022 long long &Value) {
2024 return O.error("'" + Arg + "' value invalid for llong argument!");
2025 return false;
2026}
2027
2028
2029
2031 unsigned &Value) {
2032
2034 return O.error("'" + Arg + "' value invalid for uint argument!");
2035 return false;
2036}
2037
2038
2039
2041 unsigned long &Value) {
2042
2044 return O.error("'" + Arg + "' value invalid for ulong argument!");
2045 return false;
2046}
2047
2048
2049
2051 StringRef Arg,
2052 unsigned long long &Value) {
2053
2055 return O.error("'" + Arg + "' value invalid for ullong argument!");
2056 return false;
2057}
2058
2059
2060
2063 return false;
2064 return O.error("'" + Arg + "' value invalid for floating point argument!");
2065}
2066
2068 double &Val) {
2070}
2071
2073 float &Val) {
2074 double dVal;
2076 return true;
2077 Val = (float)dVal;
2078 return false;
2079}
2080
2081
2082
2083
2084
2085
2086
2089
2090 for (unsigned i = 0; i != e; ++i) {
2092 return i;
2093 }
2094 return e;
2095}
2096
2103
2106 return O.getValueExpectedFlag() != ValueOptional || !Name.empty() ||
2107 !Description.empty();
2108}
2109
2110
2112 if (O.hasArgStr()) {
2113 size_t Size =
2115 for (unsigned i = 0, e = getNumOptions(); i != e; ++i) {
2118 continue;
2121 }
2122 return Size;
2123 } else {
2124 size_t BaseSize = 0;
2125 for (unsigned i = 0, e = getNumOptions(); i != e; ++i)
2126 BaseSize = std::max(BaseSize, getOption(i).size() + 8);
2127 return BaseSize;
2128 }
2129}
2130
2131
2132
2133
2135 size_t GlobalWidth) const {
2136 if (O.hasArgStr()) {
2137
2138
2139 if (O.getValueExpectedFlag() == ValueOptional) {
2140 for (unsigned i = 0, e = getNumOptions(); i != e; ++i) {
2142 outs() << PrintArg(O.ArgStr);
2145 break;
2146 }
2147 }
2148 }
2149
2150 outs() << PrintArg(O.ArgStr) << EqValue;
2154 for (unsigned i = 0, e = getNumOptions(); i != e; ++i) {
2158 continue;
2161 if (OptionName.empty()) {
2165 }
2166 if (!Description.empty())
2168 else
2169 outs() << '\n';
2170 }
2171 } else {
2172 if (!O.HelpStr.empty())
2173 outs() << " " << O.HelpStr << '\n';
2174 for (unsigned i = 0, e = getNumOptions(); i != e; ++i) {
2178 }
2179 }
2180}
2181
2182static const size_t MaxOptWidth = 8;
2183
2184
2185
2186
2190 outs() << " " << PrintArg(O.ArgStr);
2191 outs().indent(GlobalWidth - O.ArgStr.size());
2192
2194 for (unsigned i = 0; i != NumOpts; ++i) {
2196 continue;
2197
2201 outs().indent(NumSpaces) << " (default: ";
2202 for (unsigned j = 0; j != NumOpts; ++j) {
2204 continue;
2206 break;
2207 }
2208 outs() << ")\n";
2209 return;
2210 }
2211 outs() << "= *unknown option value*\n";
2212}
2213
2214
2215
2216#define PRINT_OPT_DIFF(T) \
2217 void parser::printOptionDiff(const Option &O, T V, OptionValue D, \
2218 size_t GlobalWidth) const { \
2219 printOptionName(O, GlobalWidth); \
2220 std::string Str; \
2221 { \
2222 raw_string_ostream SS(Str); \
2223 SS << V; \
2224 } \
2225 outs() << "= " << Str; \
2226 size_t NumSpaces = \
2227 MaxOptWidth > Str.size() ? MaxOptWidth - Str.size() : 0; \
2228 outs().indent(NumSpaces) << " (default: "; \
2229 if (D.hasValue()) \
2230 outs() << D.getValue(); \
2231 else \
2232 outs() << "*no default*"; \
2233 outs() << ")\n"; \
2234 }
2235
2247
2250 size_t GlobalWidth) const {
2251 printOptionName(O, GlobalWidth);
2252 outs() << "= " << V;
2254 outs().indent(NumSpaces) << " (default: ";
2255 if (D.hasValue())
2257 else
2258 outs() << "*no default*";
2259 outs() << ")\n";
2260}
2261
2263 const Option &O, std::optional V,
2264 const OptionValue<std::optionalstd::string> &D,
2265 size_t GlobalWidth) const {
2266 printOptionName(O, GlobalWidth);
2268 size_t VSize = V.has_value() ? V.value().size() : 0;
2270 outs().indent(NumSpaces) << " (default: ";
2271 if (D.hasValue() && D.getValue().has_value())
2273 else
2274 outs() << "*no value*";
2275 outs() << ")\n";
2276}
2277
2278
2280 size_t GlobalWidth) const {
2282 outs() << "= *cannot print option value*\n";
2283}
2284
2285
2286
2287
2288
2290 const std::pair<const char *, Option *> *RHS) {
2291 return strcmp(LHS->first, RHS->first);
2292}
2293
2295 const std::pair<const char *, SubCommand *> *RHS) {
2296 return strcmp(LHS->first, RHS->first);
2297}
2298
2299
2301 SmallVectorImpl<std::pair<const char *, Option *>> &Opts,
2302 bool ShowHidden) {
2304
2307
2308 if (I->second->getOptionHiddenFlag() == ReallyHidden)
2309 continue;
2310
2311
2312 if (I->second->getOptionHiddenFlag() == Hidden && !ShowHidden)
2313 continue;
2314
2315
2316 if (!OptionSet.insert(I->second).second)
2317 continue;
2318
2319 Opts.push_back(
2320 std::pair<const char *, Option *>(I->getKey().data(), I->second));
2321 }
2322
2323
2325}
2326
2327static void
2329 SmallVectorImpl<std::pair<const char *, SubCommand *>> &Subs) {
2330 for (auto *S : SubMap) {
2331 if (S->getName().empty())
2332 continue;
2333 Subs.push_back(std::make_pair(S->getName().data(), S));
2334 }
2336}
2337
2338namespace {
2339
2340class HelpPrinter {
2341protected:
2342 const bool ShowHidden;
2343 using StrOptionPairVector =
2345 using StrSubCommandPairVector =
2347
2348 virtual void printOptions(StrOptionPairVector &Opts, size_t MaxArgLen) {
2349 for (const auto &Opt : Opts)
2351 }
2352
2353 void printSubCommands(StrSubCommandPairVector &Subs, size_t MaxSubLen) {
2354 for (const auto &S : Subs) {
2355 outs() << " " << S.first;
2356 if (!S.second->getDescription().empty()) {
2357 outs().indent(MaxSubLen - strlen(S.first));
2358 outs() << " - " << S.second->getDescription();
2359 }
2360 outs() << "\n";
2361 }
2362 }
2363
2364public:
2365 explicit HelpPrinter(bool showHidden) : ShowHidden(showHidden) {}
2366 virtual ~HelpPrinter() = default;
2367
2368
2369 void operator=(bool Value) {
2371 return;
2372 printHelp();
2373
2374
2375 exit(0);
2376 }
2377
2378 void printHelp() {
2380 auto &OptionsMap = Sub->OptionsMap;
2381 auto &PositionalOpts = Sub->PositionalOpts;
2382 auto &ConsumeAfterOpt = Sub->ConsumeAfterOpt;
2383
2384 StrOptionPairVector Opts;
2385 sortOpts(OptionsMap, Opts, ShowHidden);
2386
2387 StrSubCommandPairVector Subs;
2389
2391 outs() << "OVERVIEW: " << GlobalParser->ProgramOverview << "\n";
2392
2395 if (!Subs.empty())
2396 outs() << " [subcommand]";
2397 outs() << " [options]";
2398 } else {
2399 if (->getDescription().empty()) {
2400 outs() << "SUBCOMMAND '" << Sub->getName()
2401 << "': " << Sub->getDescription() << "\n\n";
2402 }
2403 outs() << "USAGE: " << GlobalParser->ProgramName << " " << Sub->getName()
2404 << " [options]";
2405 }
2406
2407 for (auto *Opt : PositionalOpts) {
2411 }
2412
2413
2414 if (ConsumeAfterOpt)
2415 outs() << " " << ConsumeAfterOpt->HelpStr;
2416
2418
2419 size_t MaxSubLen = 0;
2420 for (const auto &Sub : Subs)
2421 MaxSubLen = std::max(MaxSubLen, strlen(Sub.first));
2422
2423 outs() << "\n\n";
2424 outs() << "SUBCOMMANDS:\n\n";
2425 printSubCommands(Subs, MaxSubLen);
2426 outs() << "\n";
2428 << " --help\" to get more help on a specific "
2429 "subcommand";
2430 }
2431
2432 outs() << "\n\n";
2433
2434
2435 size_t MaxArgLen = 0;
2436 for (const auto &Opt : Opts)
2437 MaxArgLen = std::max(MaxArgLen, Opt.second->getOptionWidth());
2438
2439 outs() << "OPTIONS:\n";
2440 printOptions(Opts, MaxArgLen);
2441
2442
2446 }
2447};
2448
2449class CategorizedHelpPrinter : public HelpPrinter {
2450public:
2451 explicit CategorizedHelpPrinter(bool showHidden) : HelpPrinter(showHidden) {}
2452
2453
2454
2455
2456
2457 static int OptionCategoryCompare(OptionCategory *const *A,
2458 OptionCategory *const *B) {
2459 return (*A)->getName().compare((*B)->getName());
2460 }
2461
2462
2463 using HelpPrinter::operator=;
2464
2465protected:
2466 void printOptions(StrOptionPairVector &Opts, size_t MaxArgLen) override {
2467 std::vector<OptionCategory *> SortedCategories;
2468 DenseMap<OptionCategory *, std::vector<Option *>> CategorizedOptions;
2469
2470
2471
2474
2475
2476 assert(SortedCategories.size() > 0 && "No option categories registered!");
2477 array_pod_sort(SortedCategories.begin(), SortedCategories.end(),
2478 OptionCategoryCompare);
2479
2480
2481
2482
2483 for (const auto &I : Opts) {
2485 for (OptionCategory *Cat : Opt->Categories) {
2487 "Option has an unregistered category");
2488 CategorizedOptions[Cat].push_back(Opt);
2489 }
2490 }
2491
2492
2493 for (OptionCategory *Category : SortedCategories) {
2494
2495 const auto &CategoryOptions = CategorizedOptions[Category];
2496 if (CategoryOptions.empty())
2497 continue;
2498
2499
2500 outs() << "\n";
2502
2503
2506 else
2507 outs() << "\n";
2508
2509
2510 for (const Option *Opt : CategoryOptions)
2512 }
2513 }
2514};
2515
2516
2517
2518class HelpPrinterWrapper {
2519private:
2520 HelpPrinter &UncategorizedPrinter;
2521 CategorizedHelpPrinter &CategorizedPrinter;
2522
2523public:
2524 explicit HelpPrinterWrapper(HelpPrinter &UncategorizedPrinter,
2525 CategorizedHelpPrinter &CategorizedPrinter)
2526 : UncategorizedPrinter(UncategorizedPrinter),
2527 CategorizedPrinter(CategorizedPrinter) {}
2528
2529
2530 void operator=(bool Value);
2531};
2532
2533}
2534
2535#if defined(__GNUC__)
2536
2537
2538# if defined(__OPTIMIZE__)
2539# define LLVM_IS_DEBUG_BUILD 0
2540# else
2541# define LLVM_IS_DEBUG_BUILD 1
2542# endif
2543#elif defined(_MSC_VER)
2544
2545
2546
2547# if defined(_DEBUG)
2548# define LLVM_IS_DEBUG_BUILD 1
2549# else
2550# define LLVM_IS_DEBUG_BUILD 0
2551# endif
2552#else
2553
2554# define LLVM_IS_DEBUG_BUILD 0
2555#endif
2556
2557namespace {
2558class VersionPrinter {
2559public:
2560 void print(std::vector ExtraPrinters = {}) {
2562#ifdef PACKAGE_VENDOR
2563 OS << PACKAGE_VENDOR << " ";
2564#else
2565 OS << "LLVM (http://llvm.org/):\\n ";
2566#endif
2567 OS << PACKAGE_NAME << " version " << PACKAGE_VERSION << "\n ";
2568#if LLVM_IS_DEBUG_BUILD
2569 OS << "DEBUG build";
2570#else
2571 OS << "Optimized build";
2572#endif
2573#ifndef NDEBUG
2574 OS << " with assertions";
2575#endif
2576 OS << ".\n";
2577
2578
2579
2580 if (!ExtraPrinters.empty()) {
2581 for (const auto &I : ExtraPrinters)
2583 }
2584 }
2585 void operator=(bool OptionWasSpecified);
2586};
2587
2588struct CommandLineCommonOptions {
2589
2590
2591 HelpPrinter UncategorizedNormalPrinter{false};
2592 HelpPrinter UncategorizedHiddenPrinter{true};
2593 CategorizedHelpPrinter CategorizedNormalPrinter{false};
2594 CategorizedHelpPrinter CategorizedHiddenPrinter{true};
2595
2596
2597 HelpPrinterWrapper WrappedNormalPrinter{UncategorizedNormalPrinter,
2598 CategorizedNormalPrinter};
2599 HelpPrinterWrapper WrappedHiddenPrinter{UncategorizedHiddenPrinter,
2600 CategorizedHiddenPrinter};
2601
2603
2604
2605
2606
2608 "help-list",
2610 "Display list of available options (--help-list-hidden for more)"),
2614 cl::cat(GenericCategory),
2616
2618 "help-list-hidden",
2619 cl::desc("Display list of all available options"),
2623 cl::cat(GenericCategory),
2625
2626
2627
2628
2630 "help",
2631 cl::desc("Display available options (--help-hidden for more)"),
2634 cl::cat(GenericCategory),
2636
2639
2641 "help-hidden",
2642 cl::desc("Display all available options"),
2646 cl::cat(GenericCategory),
2648
2650 "print-options",
2651 cl::desc("Print non-default options after command line parsing"),
2654 cl::cat(GenericCategory),
2656
2658 "print-all-options",
2659 cl::desc("Print all option values after command line parsing"),
2662 cl::cat(GenericCategory),
2664
2666
2667 std::vector ExtraVersionPrinters;
2668
2669
2670 VersionPrinter VersionPrinterInstance;
2671
2673 "version", cl::desc("Display the version of this program"),
2675 cl::cat(GenericCategory)};
2676};
2677}
2678
2679
2680
2682
2694
2696
2697 static OptionCategory GeneralCategory{"General options"};
2698 return GeneralCategory;
2699}
2700
2701void VersionPrinter::operator=(bool OptionWasSpecified) {
2702 if (!OptionWasSpecified)
2703 return;
2704
2705 if (CommonOptions->OverrideVersionPrinter != nullptr) {
2707 exit(0);
2708 }
2710
2711 exit(0);
2712}
2713
2714void HelpPrinterWrapper::operator=(bool Value) {
2716 return;
2717
2718
2719
2720
2721 if (GlobalParser->RegisteredOptionCategories.size() > 1) {
2722
2723
2725
2726 CategorizedPrinter = true;
2727 } else {
2728 UncategorizedPrinter = true;
2729 }
2730}
2731
2732
2734
2735void CommandLineParser::printOptionValues() {
2737 return;
2738
2741
2742
2743 size_t MaxArgLen = 0;
2744 for (const auto &Opt : Opts)
2745 MaxArgLen = std::max(MaxArgLen, Opt.second->getOptionWidth());
2746
2747 for (const auto &Opt : Opts)
2749}
2750
2751
2753 if ( && !Categorized)
2754 CommonOptions->UncategorizedNormalPrinter.printHelp();
2755 else if ( && Categorized)
2756 CommonOptions->CategorizedNormalPrinter.printHelp();
2757 else if (Hidden && !Categorized)
2758 CommonOptions->UncategorizedHiddenPrinter.printHelp();
2759 else
2760 CommonOptions->CategorizedHiddenPrinter.printHelp();
2761}
2762
2764 static const StringRef Config[] = {
2765
2766
2767 "",
2768
2769#if LLVM_IS_DEBUG_BUILD
2770 "+unoptimized",
2771#endif
2772#ifndef NDEBUG
2773 "+assertions",
2774#endif
2775#ifdef EXPENSIVE_CHECKS
2776 "+expensive-checks",
2777#endif
2778#if __has_feature(address_sanitizer)
2779 "+asan",
2780#endif
2781#if __has_feature(dataflow_sanitizer)
2782 "+dfsan",
2783#endif
2784#if __has_feature(hwaddress_sanitizer)
2785 "+hwasan",
2786#endif
2787#if __has_feature(memory_sanitizer)
2788 "+msan",
2789#endif
2790#if __has_feature(thread_sanitizer)
2791 "+tsan",
2792#endif
2793#if __has_feature(undefined_behavior_sanitizer)
2794 "+ubsan",
2795#endif
2796 };
2798}
2799
2800
2802#if LLVM_VERSION_PRINTER_SHOW_BUILD_CONFIG
2803 OS << "Build config: ";
2805 OS << '\n';
2806#endif
2807}
2808
2809
2813
2817
2821
2824 auto &Subs = GlobalParser->RegisteredSubCommands;
2825 (void)Subs;
2827 return Sub.OptionsMap;
2828}
2829
2834
2837 for (auto &I : Sub.OptionsMap) {
2838 bool Unrelated = true;
2839 for (auto &Cat : I.second->Categories) {
2840 if (Cat == &Category || Cat == &CommonOptions->GenericCategory)
2841 Unrelated = false;
2842 }
2843 if (Unrelated)
2845 }
2846}
2847
2851 for (auto &I : Sub.OptionsMap) {
2852 bool Unrelated = true;
2853 for (auto &Cat : I.second->Categories) {
2856 Unrelated = false;
2857 }
2858 if (Unrelated)
2860 }
2861}
2862
2866}
2867
2869 const char *Overview) {
2872}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static bool CommaSeparateAndAddOccurrence(Option *Handler, unsigned pos, StringRef ArgName, StringRef Value, bool MultiArg=false)
CommaSeparateAndAddOccurrence - A wrapper around Handler->addOccurrence() that does special handling ...
Definition CommandLine.cpp:636
void opt_bool_anchor()
Definition CommandLine.cpp:111
static StringRef OptionPrefix
Definition CommandLine.cpp:2099
static bool RequiresValue(const Option *O)
Definition CommandLine.cpp:818
static int SubNameCompare(const std::pair< const char *, SubCommand * > *LHS, const std::pair< const char *, SubCommand * > *RHS)
Definition CommandLine.cpp:2294
static size_t argPlusPrefixesSize(StringRef ArgName, size_t Pad=DefaultPad)
Definition CommandLine.cpp:124
static bool isPrefixedOrGrouping(const Option *O)
Definition CommandLine.cpp:144
static bool shouldPrintOption(StringRef Name, StringRef Description, const Option &O)
Definition CommandLine.cpp:2104
static ManagedStatic< SubCommand > AllSubCommands
Definition CommandLine.cpp:497
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...
Definition CommandLine.cpp:764
static bool parseDouble(Option &O, StringRef Arg, double &Value)
Definition CommandLine.cpp:2061
static bool parseBool(Option &O, StringRef ArgName, StringRef Arg, T &Value)
Definition CommandLine.cpp:428
static const size_t DefaultPad
Definition CommandLine.cpp:118
static StringRef EmptyOption
Definition CommandLine.cpp:2098
static bool hasUTF8ByteOrderMark(ArrayRef< char > S)
Definition CommandLine.cpp:1131
static ManagedStatic< CommandLineParser > GlobalParser
Definition CommandLine.cpp:425
static void ExpandBasePaths(StringRef BasePath, StringSaver &Saver, const char *&Arg)
Definition CommandLine.cpp:1136
static SmallString< 8 > argPrefix(StringRef ArgName, size_t Pad=DefaultPad)
Definition CommandLine.cpp:131
static StringRef ArgHelpPrefix
Definition CommandLine.cpp:122
void opt_unsigned_anchor()
Definition CommandLine.cpp:114
static bool isWindowsSpecialCharInCommandName(char C)
Definition CommandLine.cpp:943
static Option * getOptionPred(StringRef Name, size_t &Length, bool(*Pred)(const Option *), const StringMap< Option * > &OptionsMap)
Definition CommandLine.cpp:735
static StringRef getValueStr(const Option &O, StringRef DefaultMsg)
Definition CommandLine.cpp:1892
static size_t getOptionPrefixesSize()
Definition CommandLine.cpp:2100
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...
Definition CommandLine.cpp:664
static bool isQuote(char C)
Definition CommandLine.cpp:836
static ManagedStatic< CommandLineCommonOptions > CommonOptions
Definition CommandLine.cpp:2681
static void initCommonOptions()
Definition CommandLine.cpp:2683
void opt_char_anchor()
Definition CommandLine.cpp:112
static void tokenizeWindowsCommandLineImpl(StringRef Src, StringSaver &Saver, function_ref< void(StringRef)> AddToken, bool AlwaysCopy, function_ref< void()> MarkEOL, bool InitialCommandName)
Definition CommandLine.cpp:949
static bool isWhitespace(char C)
Definition CommandLine.cpp:828
static LLVM_REQUIRE_CONSTANT_INITIALIZATION ManagedStatic< SubCommand > TopLevelSubCommand
Definition CommandLine.cpp:494
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,...
Definition CommandLine.cpp:916
static StringRef ArgPrefixLong
Definition CommandLine.cpp:121
static void sortSubCommands(const SmallPtrSetImpl< SubCommand * > &SubMap, SmallVectorImpl< std::pair< const char *, SubCommand * > > &Subs)
Definition CommandLine.cpp:2328
#define PRINT_OPT_DIFF(T)
Definition CommandLine.cpp:2216
static bool isWhitespaceOrNull(char C)
Definition CommandLine.cpp:832
static StringRef EqValue
Definition CommandLine.cpp:2097
static const size_t MaxOptWidth
Definition CommandLine.cpp:2182
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...
Definition CommandLine.cpp:590
static bool EatsUnboundedNumberOfValues(const Option *O)
Definition CommandLine.cpp:823
static int OptNameCompare(const std::pair< const char *, Option * > *LHS, const std::pair< const char *, Option * > *RHS)
Definition CommandLine.cpp:2289
void opt_int_anchor()
Definition CommandLine.cpp:113
static void sortOpts(StringMap< Option * > &OptMap, SmallVectorImpl< std::pair< const char *, Option * > > &Opts, bool ShowHidden)
Definition CommandLine.cpp:2300
static StringRef ArgPrefix
Definition CommandLine.cpp:120
static bool isWindowsSpecialChar(char C)
Definition CommandLine.cpp:940
static bool isGrouping(const Option *O)
Definition CommandLine.cpp:141
#define LLVM_REQUIRE_CONSTANT_INITIALIZATION
LLVM_REQUIRE_CONSTANT_INITIALIZATION - Apply this to globals to ensure that they are constant initial...
#define LLVM_EXPORT_TEMPLATE
static void Help(ArrayRef< StringRef > CPUNames, ArrayRef< SubtargetFeatureKV > FeatTable)
Display help for feature and mcpu choices.
Provides a library for accessing information about this process and other processes on the operating ...
This file defines the SmallPtrSet class.
This file defines the SmallString class.
Defines the virtual file system interface vfs::FileSystem.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
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...
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)
StringMapIterBase< ValueTy, false > iterator
size_type count(StringRef Key) const
count - Return 1 if the element is in the map, 0 otherwise.
StringMapIterBase< ValueTy, true > const_iterator
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.
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
empty - 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
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.
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)
Definition CommandLine.cpp:1403
LLVM_ABI bool findConfigFile(StringRef FileName, SmallVectorImpl< char > &FilePath)
Looks for the specified configuration file.
Definition CommandLine.cpp:1407
LLVM_ABI Error expandResponseFiles(SmallVectorImpl< const char * > &Argv)
Expands constructs "@file" in the provided array of arguments recursively.
Definition CommandLine.cpp:1251
LLVM_ABI Error readConfigFile(StringRef CfgFile, SmallVectorImpl< const char * > &Argv)
Reads command line options from the given configuration file.
Definition CommandLine.cpp:1444
StringRef getDescription() const
StringRef getName() const
SmallPtrSet< SubCommand *, 1 > Subs
int getNumOccurrences() const
enum ValueExpected getValueExpectedFlag() const
void addCategory(OptionCategory &C)
Definition CommandLine.cpp:467
virtual bool addOccurrence(unsigned pos, StringRef ArgName, StringRef Value, bool MultiArg=false)
Definition CommandLine.cpp:1881
void setMiscFlag(enum MiscFlags M)
enum FormattingFlags getFormattingFlag() const
virtual void printOptionInfo(size_t GlobalWidth) const =0
enum NumOccurrencesFlag getNumOccurrencesFlag() const
void reset()
Definition CommandLine.cpp:478
SmallVector< OptionCategory *, 1 > Categories
void addArgument()
Definition CommandLine.cpp:451
bool error(const Twine &Message, StringRef ArgName=StringRef(), raw_ostream &Errs=llvm::errs())
Definition CommandLine.cpp:1869
void setArgStr(StringRef S)
Definition CommandLine.cpp:458
bool isDefaultOption() const
unsigned getMiscFlags() const
virtual void setDefault()=0
virtual void printOptionValue(size_t GlobalWidth, bool Force) const =0
static void printEnumValHelpStr(StringRef HelpStr, size_t Indent, size_t FirstLineIndentedBy)
Definition CommandLine.cpp:1919
unsigned getNumAdditionalVals() const
void removeArgument()
Unregisters this option from the CommandLine system.
Definition CommandLine.cpp:456
static void printHelpStr(StringRef HelpStr, size_t Indent, size_t FirstLineIndentedBy)
Definition CommandLine.cpp:1907
virtual size_t getOptionWidth() const =0
StringRef getName() const
SubCommand(StringRef Name, StringRef Description="")
SmallVector< Option *, 4 > SinkOpts
static LLVM_ABI SubCommand & getTopLevel()
Definition CommandLine.cpp:499
LLVM_ABI void unregisterSubCommand()
Definition CommandLine.cpp:507
static LLVM_ABI SubCommand & getAll()
Definition CommandLine.cpp:501
LLVM_ABI void reset()
Definition CommandLine.cpp:511
LLVM_ABI void registerSubCommand()
Definition CommandLine.cpp:503
SmallVector< Option *, 4 > PositionalOpts
StringMap< Option * > OptionsMap
void printOptionInfo(const Option &O, size_t GlobalWidth) const
Definition CommandLine.cpp:1962
virtual void anchor()
Definition CommandLine.cpp:92
virtual StringRef getValueName() const
void printOptionNoValue(const Option &O, size_t GlobalWidth) const
Definition CommandLine.cpp:2279
size_t getOptionWidth(const Option &O) const
Definition CommandLine.cpp:1946
void printOptionName(const Option &O, size_t GlobalWidth) const
Definition CommandLine.cpp:1981
virtual size_t getOptionWidth(const Option &O) const
Definition CommandLine.cpp:2111
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
Definition CommandLine.cpp:2187
virtual void printOptionInfo(const Option &O, size_t GlobalWidth) const
Definition CommandLine.cpp:2134
unsigned findOption(StringRef Name)
Definition CommandLine.cpp:2087
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.
Definition CommandLine.cpp:2868
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
constexpr size_t NameSize
This namespace contains all of the command line option processing machinery.
LLVM_ABI iterator_range< SmallPtrSet< SubCommand *, 4 >::iterator > getRegisteredSubcommands()
Use this to get all registered SubCommands from the provided parser.
Definition CommandLine.cpp:2831
LLVM_ABI void PrintVersionMessage()
Utility function for printing version number.
Definition CommandLine.cpp:2810
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.
Definition CommandLine.cpp:1393
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.
Definition CommandLine.cpp:1058
LLVM_ABI OptionCategory & getGeneralCategory()
Definition CommandLine.cpp:2695
LLVM_ABI void ResetAllOptionOccurrences()
Reset all command line options to a state that looks as if they have never appeared on the command li...
Definition CommandLine.cpp:1490
LLVM_ABI void SetVersionPrinter(VersionPrinterTy func)
===------------------------------------------------------------------—===// Override the default (LLV...
Definition CommandLine.cpp:2814
LLVM_ABI void tokenizeConfigFile(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs=false)
Tokenizes content of configuration file.
Definition CommandLine.cpp:1090
LLVM_ABI StringMap< Option * > & getRegisteredOptions(SubCommand &Sub=SubCommand::getTopLevel())
Use this to get a StringMap to all registered named options (e.g.
Definition CommandLine.cpp:2822
LLVM_ABI void ResetCommandLineParser()
Reset the command line parser back to its initial state.
Definition CommandLine.cpp:2863
LLVM_ABI void PrintOptionValues()
Definition CommandLine.cpp:2733
LLVM_ABI void AddLiteralOption(Option &O, StringRef Name)
Adds a new option for parsing and provides the option it refers to.
Definition CommandLine.cpp:443
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.
Definition CommandLine.cpp:1070
LLVM_ABI void printBuildConfig(raw_ostream &OS)
Prints the compiler build configuration.
Definition CommandLine.cpp:2801
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.
Definition CommandLine.cpp:724
LLVM_ABI bool expandResponseFiles(int Argc, const char *const *Argv, const char *EnvVar, SmallVectorImpl< const char * > &NewArgv)
A convenience helper which concatenates the options specified by the environment variable EnvVar and ...
initializer< Ty > init(const Ty &Val)
std::function< void(raw_ostream &)> VersionPrinterTy
LLVM_ABI ArrayRef< StringRef > getCompilerBuildConfig()
An array of optional enabled settings in the LLVM build configuration, which may be of interest to co...
Definition CommandLine.cpp:2763
LocationClass< Ty > location(Ty &L)
LLVM_ABI void HideUnrelatedOptions(cl::OptionCategory &Category, SubCommand &Sub=SubCommand::getTopLevel())
Mark all options not part of this category as cl::ReallyHidden.
Definition CommandLine.cpp:2835
LLVM_ABI void AddExtraVersionPrinter(VersionPrinterTy func)
===------------------------------------------------------------------—===// Add an extra printer to u...
Definition CommandLine.cpp:2818
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...
Definition CommandLine.cpp:2752
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.
Definition CommandLine.cpp:1078
LLVM_ABI bool ParseCommandLineOptions(int argc, const char *const *argv, StringRef Overview="", raw_ostream *Errs=nullptr, vfs::FileSystem *VFS=nullptr, const char *EnvVar=nullptr, bool LongOptionsUseDoubleDash=false)
Definition CommandLine.cpp:1462
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.
Definition CommandLine.cpp:838
LLVM_ABI StringRef parent_path(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get parent path.
LLVM_ABI bool has_parent_path(const Twine &path, Style style=Style::native)
Has parent path?
LLVM_ABI bool is_relative(const Twine &path, Style style=Style::native)
Is path relative?
LLVM_ABI StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
LLVM_ABI bool is_absolute(const Twine &path, Style style=Style::native)
Is path absolute?
LLVM_ABI void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
LLVM_ABI IntrusiveRefCntPtr< FileSystem > getRealFileSystem()
Gets an vfs::FileSystem for the 'real' file system, as seen by the operating system.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
FunctionAddr VTableAddr Value
void initWithColorOptions()
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
LLVM_ABI raw_fd_ostream & outs()
This returns a reference to a raw_fd_ostream for standard output.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
void interleaveComma(const Container &c, StreamT &os, UnaryFunctor each_fn)
LLVM_ABI bool hasUTF16ByteOrderMark(ArrayRef< char > SrcBytes)
Returns true if a blob of text starts with a UTF-16 big or little endian byte order mark.
void initDebugCounterOptions()
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
bool to_float(const Twine &T, float &Num)
@ no_such_file_or_directory
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
LLVM_ABI bool convertUTF16ToUTF8String(ArrayRef< char > SrcBytes, std::string &Out)
Converts a stream of raw bytes assumed to be UTF16 into a UTF8 std::string.
void initSignalsOptions()
void initStatisticOptions()
LLVM_ABI raw_ostream & nulls()
This returns a reference to a raw_ostream which simply discards output.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
void initRandomSeedOptions()
@ Sub
Subtraction of integers.
void initGraphWriterOptions()
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
ArrayRef(const T &OneElt) -> ArrayRef< T >
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
void array_pod_sort(IteratorTy Start, IteratorTy End)
array_pod_sort - This sorts an array with the specified start and end extent.
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
@ Default
The result values are uniform if and only if all operands are uniform.