Movatterモバイル変換


[0]ホーム

URL:


LLVM 20.0.0git
CommandLine.cpp
Go to the documentation of this file.
1//===-- CommandLine.cpp - Command line parser implementation --------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This class implements a command line argument processor that is useful when
10// creating a tool. It provides a simple, minimalistic interface that is easily
11// extensible and supports nonlocal (library) command line options.
12//
13// Note that rather than trying to figure out what this code does, you could try
14// reading the library documentation located in docs/CommandLine.html
15//
16//===----------------------------------------------------------------------===//
17
18#include "llvm/Support/CommandLine.h"
19
20#include "DebugOptions.h"
21
22#include "llvm-c/Support.h"
23#include "llvm/ADT/ArrayRef.h"
24#include "llvm/ADT/STLFunctionalExtras.h"
25#include "llvm/ADT/SmallPtrSet.h"
26#include "llvm/ADT/SmallString.h"
27#include "llvm/ADT/StringExtras.h"
28#include "llvm/ADT/StringMap.h"
29#include "llvm/ADT/StringRef.h"
30#include "llvm/ADT/Twine.h"
31#include "llvm/Config/config.h"
32#include "llvm/Support/ConvertUTF.h"
33#include "llvm/Support/Debug.h"
34#include "llvm/Support/Error.h"
35#include "llvm/Support/ErrorHandling.h"
36#include "llvm/Support/FileSystem.h"
37#include "llvm/Support/ManagedStatic.h"
38#include "llvm/Support/MemoryBuffer.h"
39#include "llvm/Support/Path.h"
40#include "llvm/Support/Process.h"
41#include "llvm/Support/StringSaver.h"
42#include "llvm/Support/VirtualFileSystem.h"
43#include "llvm/Support/raw_ostream.h"
44#include <cstdlib>
45#include <optional>
46#include <string>
47using namespacellvm;
48using namespacecl;
49
50#define DEBUG_TYPE "commandline"
51
52//===----------------------------------------------------------------------===//
53// Template instantiations and anchors.
54//
55namespacellvm {
56namespacecl {
57templateclassbasic_parser<bool>;
58templateclassbasic_parser<boolOrDefault>;
59templateclassbasic_parser<int>;
60templateclassbasic_parser<long>;
61templateclassbasic_parser<long long>;
62templateclassbasic_parser<unsigned>;
63templateclassbasic_parser<unsigned long>;
64templateclassbasic_parser<unsigned long long>;
65templateclassbasic_parser<double>;
66templateclassbasic_parser<float>;
67templateclassbasic_parser<std::string>;
68templateclassbasic_parser<char>;
69
70templateclassopt<unsigned>;
71templateclassopt<int>;
72templateclassopt<std::string>;
73templateclassopt<char>;
74templateclassopt<bool>;
75}// namespace cl
76}// namespace llvm
77
78// Pin the vtables to this file.
79void GenericOptionValue::anchor() {}
80voidOptionValue<boolOrDefault>::anchor() {}
81voidOptionValue<std::string>::anchor() {}
82void Option::anchor() {}
83voidbasic_parser_impl::anchor() {}
84voidparser<bool>::anchor() {}
85voidparser<boolOrDefault>::anchor() {}
86voidparser<int>::anchor() {}
87voidparser<long>::anchor() {}
88voidparser<long long>::anchor() {}
89voidparser<unsigned>::anchor() {}
90voidparser<unsigned long>::anchor() {}
91voidparser<unsigned long long>::anchor() {}
92voidparser<double>::anchor() {}
93voidparser<float>::anchor() {}
94voidparser<std::string>::anchor() {}
95voidparser<char>::anchor() {}
96
97//===----------------------------------------------------------------------===//
98
99conststaticsize_tDefaultPad = 2;
100
101staticStringRefArgPrefix ="-";
102staticStringRefArgPrefixLong ="--";
103staticStringRefArgHelpPrefix =" - ";
104
105staticsize_targPlusPrefixesSize(StringRef ArgName,size_t Pad =DefaultPad) {
106size_t Len = ArgName.size();
107if (Len == 1)
108return Len + Pad +ArgPrefix.size() +ArgHelpPrefix.size();
109return Len + Pad +ArgPrefixLong.size() +ArgHelpPrefix.size();
110}
111
112staticSmallString<8>argPrefix(StringRef ArgName,size_t Pad =DefaultPad) {
113SmallString<8>Prefix;
114for (size_tI = 0;I < Pad; ++I) {
115Prefix.push_back(' ');
116 }
117Prefix.append(ArgName.size() > 1 ?ArgPrefixLong :ArgPrefix);
118returnPrefix;
119}
120
121// Option predicates...
122staticinlineboolisGrouping(constOption *O) {
123return O->getMiscFlags() &cl::Grouping;
124}
125staticinlineboolisPrefixedOrGrouping(constOption *O) {
126returnisGrouping(O) || O->getFormattingFlag() ==cl::Prefix ||
127 O->getFormattingFlag() ==cl::AlwaysPrefix;
128}
129
130
131namespace{
132
133classPrintArg {
134StringRef ArgName;
135size_t Pad;
136public:
137 PrintArg(StringRef ArgName,size_t Pad =DefaultPad) : ArgName(ArgName), Pad(Pad) {}
138friendraw_ostream &operator<<(raw_ostream &OS,const PrintArg &);
139};
140
141raw_ostream &operator<<(raw_ostream &OS,const PrintArg& Arg) {
142OS <<argPrefix(Arg.ArgName, Arg.Pad) << Arg.ArgName;
143returnOS;
144}
145
146classCommandLineParser {
147public:
148// Globals for name and overview of program. Program name is not a string to
149// avoid static ctor/dtor issues.
150 std::string ProgramName;
151StringRef ProgramOverview;
152
153// This collects additional help to be printed.
154 std::vector<StringRef> MoreHelp;
155
156// This collects Options added with the cl::DefaultOption flag. Since they can
157// be overridden, they are not added to the appropriate SubCommands until
158// ParseCommandLineOptions actually runs.
159SmallVector<Option*, 4> DefaultOptions;
160
161// This collects the different option categories that have been registered.
162SmallPtrSet<OptionCategory *, 16> RegisteredOptionCategories;
163
164// This collects the different subcommands that have been registered.
165SmallPtrSet<SubCommand *, 4> RegisteredSubCommands;
166
167 CommandLineParser() { registerSubCommand(&SubCommand::getTopLevel()); }
168
169voidResetAllOptionOccurrences();
170
171boolParseCommandLineOptions(int argc,constchar *const *argv,
172StringRef Overview,raw_ostream *Errs =nullptr,
173bool LongOptionsUseDoubleDash =false);
174
175void forEachSubCommand(Option &Opt,function_ref<void(SubCommand &)> Action) {
176if (Opt.Subs.empty()) {
177 Action(SubCommand::getTopLevel());
178return;
179 }
180if (Opt.Subs.size() == 1 && *Opt.Subs.begin() == &SubCommand::getAll()) {
181for (auto *SC : RegisteredSubCommands)
182 Action(*SC);
183 Action(SubCommand::getAll());
184return;
185 }
186for (auto *SC : Opt.Subs) {
187assert(SC != &SubCommand::getAll() &&
188"SubCommand::getAll() should not be used with other subcommands");
189 Action(*SC);
190 }
191 }
192
193void addLiteralOption(Option &Opt,SubCommand *SC,StringRefName) {
194if (Opt.hasArgStr())
195return;
196if (!SC->OptionsMap.insert(std::make_pair(Name, &Opt)).second) {
197errs() << ProgramName <<": CommandLine Error: Option '" <<Name
198 <<"' registered more than once!\n";
199report_fatal_error("inconsistency in registered CommandLine options");
200 }
201 }
202
203void addLiteralOption(Option &Opt,StringRefName) {
204 forEachSubCommand(
205 Opt, [&](SubCommand &SC) { addLiteralOption(Opt, &SC,Name); });
206 }
207
208void addOption(Option *O,SubCommand *SC) {
209bool HadErrors =false;
210if (O->hasArgStr()) {
211// If it's a DefaultOption, check to make sure it isn't already there.
212if (O->isDefaultOption() &&SC->OptionsMap.contains(O->ArgStr))
213return;
214
215// Add argument to the argument map!
216if (!SC->OptionsMap.insert(std::make_pair(O->ArgStr, O)).second) {
217errs() << ProgramName <<": CommandLine Error: Option '" <<O->ArgStr
218 <<"' registered more than once!\n";
219 HadErrors =true;
220 }
221 }
222
223// Remember information about positional options.
224if (O->getFormattingFlag() ==cl::Positional)
225SC->PositionalOpts.push_back(O);
226elseif (O->getMiscFlags() &cl::Sink)// Remember sink options
227SC->SinkOpts.push_back(O);
228elseif (O->getNumOccurrencesFlag() ==cl::ConsumeAfter) {
229if (SC->ConsumeAfterOpt) {
230O->error("Cannot specify more than one option with cl::ConsumeAfter!");
231 HadErrors =true;
232 }
233SC->ConsumeAfterOpt =O;
234 }
235
236// Fail hard if there were errors. These are strictly unrecoverable and
237// indicate serious issues such as conflicting option names or an
238// incorrectly
239// linked LLVM distribution.
240if (HadErrors)
241report_fatal_error("inconsistency in registered CommandLine options");
242 }
243
244void addOption(Option *O,bool ProcessDefaultOption =false) {
245if (!ProcessDefaultOption &&O->isDefaultOption()) {
246 DefaultOptions.push_back(O);
247return;
248 }
249 forEachSubCommand(*O, [&](SubCommand &SC) { addOption(O, &SC); });
250 }
251
252void removeOption(Option *O,SubCommand *SC) {
253SmallVector<StringRef, 16> OptionNames;
254O->getExtraOptionNames(OptionNames);
255if (O->hasArgStr())
256 OptionNames.push_back(O->ArgStr);
257
258SubCommand &Sub = *SC;
259autoEnd = Sub.OptionsMap.end();
260for (autoName : OptionNames) {
261autoI = Sub.OptionsMap.find(Name);
262if (I !=End &&I->getValue() == O)
263 Sub.OptionsMap.erase(I);
264 }
265
266if (O->getFormattingFlag() ==cl::Positional)
267for (auto *Opt = Sub.PositionalOpts.begin();
268 Opt != Sub.PositionalOpts.end(); ++Opt) {
269if (*Opt == O) {
270 Sub.PositionalOpts.erase(Opt);
271break;
272 }
273 }
274elseif (O->getMiscFlags() &cl::Sink)
275for (auto *Opt = Sub.SinkOpts.begin(); Opt != Sub.SinkOpts.end(); ++Opt) {
276if (*Opt == O) {
277 Sub.SinkOpts.erase(Opt);
278break;
279 }
280 }
281elseif (O == Sub.ConsumeAfterOpt)
282 Sub.ConsumeAfterOpt =nullptr;
283 }
284
285void removeOption(Option *O) {
286 forEachSubCommand(*O, [&](SubCommand &SC) { removeOption(O, &SC); });
287 }
288
289bool hasOptions(constSubCommand &Sub) const{
290return (!Sub.OptionsMap.empty() || !Sub.PositionalOpts.empty() ||
291nullptr != Sub.ConsumeAfterOpt);
292 }
293
294bool hasOptions() const{
295for (constauto *S : RegisteredSubCommands) {
296if (hasOptions(*S))
297returntrue;
298 }
299returnfalse;
300 }
301
302bool hasNamedSubCommands() const{
303for (constauto *S : RegisteredSubCommands)
304if (!S->getName().empty())
305returntrue;
306returnfalse;
307 }
308
309SubCommand *getActiveSubCommand() {return ActiveSubCommand; }
310
311void updateArgStr(Option *O,StringRef NewName,SubCommand *SC) {
312SubCommand &Sub = *SC;
313if (!Sub.OptionsMap.insert(std::make_pair(NewName, O)).second) {
314errs() << ProgramName <<": CommandLine Error: Option '" <<O->ArgStr
315 <<"' registered more than once!\n";
316report_fatal_error("inconsistency in registered CommandLine options");
317 }
318 Sub.OptionsMap.erase(O->ArgStr);
319 }
320
321void updateArgStr(Option *O,StringRef NewName) {
322 forEachSubCommand(*O,
323 [&](SubCommand &SC) { updateArgStr(O, NewName, &SC); });
324 }
325
326void printOptionValues();
327
328void registerCategory(OptionCategory *cat) {
329assert(count_if(RegisteredOptionCategories,
330 [cat](constOptionCategory *Category) {
331returncat->getName() == Category->getName();
332 }) == 0 &&
333"Duplicate option categories");
334
335 RegisteredOptionCategories.insert(cat);
336 }
337
338void registerSubCommand(SubCommand *sub) {
339assert(count_if(RegisteredSubCommands,
340 [sub](constSubCommand *Sub) {
341return (!sub->getName().empty()) &&
342 (Sub->getName() ==sub->getName());
343 }) == 0 &&
344"Duplicate subcommands");
345 RegisteredSubCommands.insert(sub);
346
347// For all options that have been registered for all subcommands, add the
348// option to this subcommand now.
349assert(sub != &SubCommand::getAll() &&
350"SubCommand::getAll() should not be registered");
351for (auto &E :SubCommand::getAll().OptionsMap) {
352Option *O = E.second;
353if ((O->isPositional() ||O->isSink() ||O->isConsumeAfter()) ||
354O->hasArgStr())
355 addOption(O,sub);
356else
357 addLiteralOption(*O,sub, E.first());
358 }
359 }
360
361void unregisterSubCommand(SubCommand *sub) {
362 RegisteredSubCommands.erase(sub);
363 }
364
365iterator_range<typename SmallPtrSet<SubCommand *, 4>::iterator>
366getRegisteredSubcommands() {
367returnmake_range(RegisteredSubCommands.begin(),
368 RegisteredSubCommands.end());
369 }
370
371void reset() {
372 ActiveSubCommand =nullptr;
373 ProgramName.clear();
374 ProgramOverview =StringRef();
375
376 MoreHelp.clear();
377 RegisteredOptionCategories.clear();
378
379ResetAllOptionOccurrences();
380 RegisteredSubCommands.clear();
381
382SubCommand::getTopLevel().reset();
383SubCommand::getAll().reset();
384 registerSubCommand(&SubCommand::getTopLevel());
385
386 DefaultOptions.clear();
387 }
388
389private:
390SubCommand *ActiveSubCommand =nullptr;
391
392Option *LookupOption(SubCommand &Sub,StringRef &Arg,StringRef &Value);
393Option *LookupLongOption(SubCommand &Sub,StringRef &Arg,StringRef &Value,
394bool LongOptionsUseDoubleDash,bool HaveDoubleDash) {
395Option *Opt = LookupOption(Sub, Arg,Value);
396if (Opt && LongOptionsUseDoubleDash && !HaveDoubleDash && !isGrouping(Opt))
397returnnullptr;
398return Opt;
399 }
400SubCommand *LookupSubCommand(StringRefName, std::string &NearestString);
401};
402
403}// namespace
404
405staticManagedStatic<CommandLineParser>GlobalParser;
406
407template <typename T, T TrueVal, T FalseVal>
408staticboolparseBool(Option &O,StringRef ArgName,StringRef Arg,T &Value) {
409if (Arg =="" || Arg =="true" || Arg =="TRUE" || Arg =="True" ||
410 Arg =="1") {
411Value = TrueVal;
412returnfalse;
413 }
414
415if (Arg =="false" || Arg =="FALSE" || Arg =="False" || Arg =="0") {
416Value = FalseVal;
417returnfalse;
418 }
419return O.error("'" + Arg +
420"' is invalid value for boolean argument! Try 0 or 1");
421}
422
423voidcl::AddLiteralOption(Option &O,StringRefName) {
424GlobalParser->addLiteralOption(O,Name);
425}
426
427extrahelp::extrahelp(StringRefHelp) : morehelp(Help) {
428GlobalParser->MoreHelp.push_back(Help);
429}
430
431voidOption::addArgument() {
432GlobalParser->addOption(this);
433 FullyInitialized =true;
434}
435
436voidOption::removeArgument() {GlobalParser->removeOption(this); }
437
438voidOption::setArgStr(StringRef S) {
439if (FullyInitialized)
440GlobalParser->updateArgStr(this, S);
441assert(!S.starts_with("-") &&"Option can't start with '-");
442ArgStr = S;
443if (ArgStr.size() == 1)
444setMiscFlag(Grouping);
445}
446
447voidOption::addCategory(OptionCategory &C) {
448assert(!Categories.empty() &&"Categories cannot be empty.");
449// Maintain backward compatibility by replacing the default GeneralCategory
450// if it's still set. Otherwise, just add the new one. The GeneralCategory
451// must be explicitly added if you want multiple categories that include it.
452if (&C != &getGeneralCategory() &&Categories[0] == &getGeneralCategory())
453Categories[0] = &C;
454elseif (!is_contained(Categories, &C))
455Categories.push_back(&C);
456}
457
458voidOption::reset() {
459 NumOccurrences = 0;
460setDefault();
461if (isDefaultOption())
462removeArgument();
463}
464
465void OptionCategory::registerCategory() {
466GlobalParser->registerCategory(this);
467}
468
469// A special subcommand representing no subcommand. It is particularly important
470// that this ManagedStatic uses constant initailization and not dynamic
471// initialization because it is referenced from cl::opt constructors, which run
472// dynamically in an arbitrary order.
473LLVM_REQUIRE_CONSTANT_INITIALIZATION
474staticManagedStatic<SubCommand>TopLevelSubCommand;
475
476// A special subcommand that can be used to put an option into all subcommands.
477staticManagedStatic<SubCommand>AllSubCommands;
478
479SubCommand &SubCommand::getTopLevel() {return *TopLevelSubCommand; }
480
481SubCommand &SubCommand::getAll() {return *AllSubCommands; }
482
483voidSubCommand::registerSubCommand() {
484GlobalParser->registerSubCommand(this);
485}
486
487voidSubCommand::unregisterSubCommand() {
488GlobalParser->unregisterSubCommand(this);
489}
490
491voidSubCommand::reset() {
492PositionalOpts.clear();
493SinkOpts.clear();
494OptionsMap.clear();
495
496ConsumeAfterOpt =nullptr;
497}
498
499SubCommand::operatorbool() const{
500return (GlobalParser->getActiveSubCommand() ==this);
501}
502
503//===----------------------------------------------------------------------===//
504// Basic, shared command line option processing machinery.
505//
506
507/// LookupOption - Lookup the option specified by the specified option on the
508/// command line. If there is a value specified (after an equal sign) return
509/// that as well. This assumes that leading dashes have already been stripped.
510Option *CommandLineParser::LookupOption(SubCommand &Sub,StringRef &Arg,
511StringRef &Value) {
512// Reject all dashes.
513if (Arg.empty())
514returnnullptr;
515assert(&Sub != &SubCommand::getAll());
516
517size_t EqualPos = Arg.find('=');
518
519// If we have an equals sign, remember the value.
520if (EqualPos ==StringRef::npos) {
521// Look up the option.
522return Sub.OptionsMap.lookup(Arg);
523 }
524
525// If the argument before the = is a valid option name and the option allows
526// non-prefix form (ie is not AlwaysPrefix), we match. If not, signal match
527// failure by returning nullptr.
528autoI = Sub.OptionsMap.find(Arg.substr(0, EqualPos));
529if (I == Sub.OptionsMap.end())
530returnnullptr;
531
532auto *O =I->second;
533if (O->getFormattingFlag() ==cl::AlwaysPrefix)
534returnnullptr;
535
536Value = Arg.substr(EqualPos + 1);
537 Arg = Arg.substr(0, EqualPos);
538returnI->second;
539}
540
541SubCommand *CommandLineParser::LookupSubCommand(StringRefName,
542 std::string &NearestString) {
543if (Name.empty())
544return &SubCommand::getTopLevel();
545// Find a subcommand with the edit distance == 1.
546SubCommand *NearestMatch =nullptr;
547for (auto *S : RegisteredSubCommands) {
548assert(S != &SubCommand::getAll() &&
549"SubCommand::getAll() is not expected in RegisteredSubCommands");
550if (S->getName().empty())
551continue;
552
553if (S->getName() ==Name)
554return S;
555
556if (!NearestMatch && S->getName().edit_distance(Name) < 2)
557 NearestMatch = S;
558 }
559
560if (NearestMatch)
561 NearestString = NearestMatch->getName();
562
563return &SubCommand::getTopLevel();
564}
565
566/// LookupNearestOption - Lookup the closest match to the option specified by
567/// the specified option on the command line. If there is a value specified
568/// (after an equal sign) return that as well. This assumes that leading dashes
569/// have already been stripped.
570staticOption *LookupNearestOption(StringRef Arg,
571constStringMap<Option *> &OptionsMap,
572 std::string &NearestString) {
573// Reject all dashes.
574if (Arg.empty())
575returnnullptr;
576
577// Split on any equal sign.
578 std::pair<StringRef, StringRef> SplitArg = Arg.split('=');
579StringRef &LHS = SplitArg.first;// LHS == Arg when no '=' is present.
580StringRef &RHS = SplitArg.second;
581
582// Find the closest match.
583Option *Best =nullptr;
584unsigned BestDistance = 0;
585for (StringMap<Option *>::const_iterator it = OptionsMap.begin(),
586 ie = OptionsMap.end();
587 it != ie; ++it) {
588Option *O = it->second;
589// Do not suggest really hidden options (not shown in any help).
590if (O->getOptionHiddenFlag() ==ReallyHidden)
591continue;
592
593SmallVector<StringRef, 16> OptionNames;
594 O->getExtraOptionNames(OptionNames);
595if (O->hasArgStr())
596 OptionNames.push_back(O->ArgStr);
597
598bool PermitValue = O->getValueExpectedFlag() !=cl::ValueDisallowed;
599StringRef Flag = PermitValue ?LHS : Arg;
600for (constauto &Name : OptionNames) {
601unsigned Distance =StringRef(Name).edit_distance(
602 Flag,/*AllowReplacements=*/true,/*MaxEditDistance=*/BestDistance);
603if (!Best || Distance < BestDistance) {
604 Best = O;
605 BestDistance = Distance;
606if (RHS.empty() || !PermitValue)
607 NearestString = std::string(Name);
608else
609 NearestString = (Twine(Name) +"=" +RHS).str();
610 }
611 }
612 }
613
614return Best;
615}
616
617/// CommaSeparateAndAddOccurrence - A wrapper around Handler->addOccurrence()
618/// that does special handling of cl::CommaSeparated options.
619staticboolCommaSeparateAndAddOccurrence(Option *Handler,unsigned pos,
620StringRef ArgName,StringRefValue,
621bool MultiArg =false) {
622// Check to see if this option accepts a comma separated list of values. If
623// it does, we have to split up the value into multiple values.
624if (Handler->getMiscFlags() &CommaSeparated) {
625StringRef Val(Value);
626StringRef::size_type Pos = Val.find(',');
627
628while (Pos !=StringRef::npos) {
629// Process the portion before the comma.
630if (Handler->addOccurrence(pos, ArgName, Val.substr(0, Pos), MultiArg))
631returntrue;
632// Erase the portion before the comma, AND the comma.
633 Val = Val.substr(Pos + 1);
634// Check for another comma.
635 Pos = Val.find(',');
636 }
637
638Value = Val;
639 }
640
641return Handler->addOccurrence(pos, ArgName,Value, MultiArg);
642}
643
644/// ProvideOption - For Value, this differentiates between an empty value ("")
645/// and a null value (StringRef()). The later is accepted for arguments that
646/// don't allow a value (-foo) the former is rejected (-foo=).
647staticinlineboolProvideOption(Option *Handler,StringRef ArgName,
648StringRefValue,int argc,
649constchar *const *argv,int &i) {
650// Is this a multi-argument option?
651unsigned NumAdditionalVals = Handler->getNumAdditionalVals();
652
653// Enforce value requirements
654switch (Handler->getValueExpectedFlag()) {
655caseValueRequired:
656if (!Value.data()) {// No value specified?
657// If no other argument or the option only supports prefix form, we
658// cannot look at the next argument.
659if (i + 1 >= argc || Handler->getFormattingFlag() ==cl::AlwaysPrefix)
660return Handler->error("requires a value!");
661// Steal the next argument, like for '-o filename'
662assert(argv &&"null check");
663Value =StringRef(argv[++i]);
664 }
665break;
666caseValueDisallowed:
667if (NumAdditionalVals > 0)
668return Handler->error("multi-valued option specified"
669" with ValueDisallowed modifier!");
670
671if (Value.data())
672return Handler->error("does not allow a value! '" +Twine(Value) +
673"' specified.");
674break;
675caseValueOptional:
676break;
677 }
678
679// If this isn't a multi-arg option, just run the handler.
680if (NumAdditionalVals == 0)
681returnCommaSeparateAndAddOccurrence(Handler, i, ArgName,Value);
682
683// If it is, run the handle several times.
684bool MultiArg =false;
685
686if (Value.data()) {
687if (CommaSeparateAndAddOccurrence(Handler, i, ArgName,Value, MultiArg))
688returntrue;
689 --NumAdditionalVals;
690 MultiArg =true;
691 }
692
693while (NumAdditionalVals > 0) {
694if (i + 1 >= argc)
695return Handler->error("not enough values!");
696assert(argv &&"null check");
697Value =StringRef(argv[++i]);
698
699if (CommaSeparateAndAddOccurrence(Handler, i, ArgName,Value, MultiArg))
700returntrue;
701 MultiArg =true;
702 --NumAdditionalVals;
703 }
704returnfalse;
705}
706
707boolllvm::cl::ProvidePositionalOption(Option *Handler,StringRef Arg,int i) {
708int Dummy = i;
709returnProvideOption(Handler, Handler->ArgStr, Arg, 0,nullptr, Dummy);
710}
711
712// getOptionPred - Check to see if there are any options that satisfy the
713// specified predicate with names that are the prefixes in Name. This is
714// checked by progressively stripping characters off of the name, checking to
715// see if there options that satisfy the predicate. If we find one, return it,
716// otherwise return null.
717//
718staticOption *getOptionPred(StringRefName,size_t &Length,
719bool (*Pred)(constOption *),
720constStringMap<Option *> &OptionsMap) {
721StringMap<Option *>::const_iterator OMI = OptionsMap.find(Name);
722if (OMI != OptionsMap.end() && !Pred(OMI->getValue()))
723 OMI = OptionsMap.end();
724
725// Loop while we haven't found an option and Name still has at least two
726// characters in it (so that the next iteration will not be the empty
727// string.
728while (OMI == OptionsMap.end() &&Name.size() > 1) {
729Name =Name.substr(0,Name.size() - 1);// Chop off the last character.
730 OMI = OptionsMap.find(Name);
731if (OMI != OptionsMap.end() && !Pred(OMI->getValue()))
732 OMI = OptionsMap.end();
733 }
734
735if (OMI != OptionsMap.end() && Pred(OMI->second)) {
736Length =Name.size();
737return OMI->second;// Found one!
738 }
739returnnullptr;// No option found!
740}
741
742/// HandlePrefixedOrGroupedOption - The specified argument string (which started
743/// with at least one '-') does not fully match an available option. Check to
744/// see if this is a prefix or grouped option. If so, split arg into output an
745/// Arg/Value pair and return the Option to parse it with.
746staticOption *
747HandlePrefixedOrGroupedOption(StringRef &Arg,StringRef &Value,
748bool &ErrorParsing,
749constStringMap<Option *> &OptionsMap) {
750if (Arg.size() == 1)
751returnnullptr;
752
753// Do the lookup!
754size_tLength = 0;
755Option *PGOpt =getOptionPred(Arg,Length,isPrefixedOrGrouping, OptionsMap);
756if (!PGOpt)
757returnnullptr;
758
759do {
760StringRef MaybeValue =
761 (Length < Arg.size()) ? Arg.substr(Length) :StringRef();
762 Arg = Arg.substr(0,Length);
763assert(OptionsMap.count(Arg) && OptionsMap.find(Arg)->second == PGOpt);
764
765// cl::Prefix options do not preserve '=' when used separately.
766// The behavior for them with grouped options should be the same.
767if (MaybeValue.empty() || PGOpt->getFormattingFlag() ==cl::AlwaysPrefix ||
768 (PGOpt->getFormattingFlag() ==cl::Prefix && MaybeValue[0] !='=')) {
769Value = MaybeValue;
770return PGOpt;
771 }
772
773if (MaybeValue[0] =='=') {
774Value = MaybeValue.substr(1);
775return PGOpt;
776 }
777
778// This must be a grouped option.
779assert(isGrouping(PGOpt) &&"Broken getOptionPred!");
780
781// Grouping options inside a group can't have values.
782if (PGOpt->getValueExpectedFlag() ==cl::ValueRequired) {
783 ErrorParsing |= PGOpt->error("may not occur within a group!");
784returnnullptr;
785 }
786
787// Because the value for the option is not required, we don't need to pass
788// argc/argv in.
789int Dummy = 0;
790 ErrorParsing |=ProvideOption(PGOpt, Arg,StringRef(), 0,nullptr, Dummy);
791
792// Get the next grouping option.
793 Arg = MaybeValue;
794 PGOpt =getOptionPred(Arg,Length,isGrouping, OptionsMap);
795 }while (PGOpt);
796
797// We could not find a grouping option in the remainder of Arg.
798returnnullptr;
799}
800
801staticboolRequiresValue(constOption *O) {
802return O->getNumOccurrencesFlag() ==cl::Required ||
803 O->getNumOccurrencesFlag() ==cl::OneOrMore;
804}
805
806staticboolEatsUnboundedNumberOfValues(constOption *O) {
807return O->getNumOccurrencesFlag() ==cl::ZeroOrMore ||
808 O->getNumOccurrencesFlag() ==cl::OneOrMore;
809}
810
811staticboolisWhitespace(charC) {
812returnC ==' ' ||C =='\t' ||C =='\r' ||C =='\n';
813}
814
815staticboolisWhitespaceOrNull(charC) {
816returnisWhitespace(C) ||C =='\0';
817}
818
819staticboolisQuote(charC) {returnC =='\"' ||C =='\''; }
820
821voidcl::TokenizeGNUCommandLine(StringRef Src,StringSaver &Saver,
822SmallVectorImpl<const char *> &NewArgv,
823bool MarkEOLs) {
824SmallString<128> Token;
825for (size_tI = 0, E = Src.size();I != E; ++I) {
826// Consume runs of whitespace.
827if (Token.empty()) {
828while (I != E &&isWhitespace(Src[I])) {
829// Mark the end of lines in response files.
830if (MarkEOLs && Src[I] =='\n')
831 NewArgv.push_back(nullptr);
832 ++I;
833 }
834if (I == E)
835break;
836 }
837
838charC = Src[I];
839
840// Backslash escapes the next character.
841if (I + 1 < E &&C =='\\') {
842 ++I;// Skip the escape.
843 Token.push_back(Src[I]);
844continue;
845 }
846
847// Consume a quoted string.
848if (isQuote(C)) {
849 ++I;
850while (I != E && Src[I] !=C) {
851// Backslash escapes the next character.
852if (Src[I] =='\\' &&I + 1 != E)
853 ++I;
854 Token.push_back(Src[I]);
855 ++I;
856 }
857if (I == E)
858break;
859continue;
860 }
861
862// End the token if this is whitespace.
863if (isWhitespace(C)) {
864if (!Token.empty())
865 NewArgv.push_back(Saver.save(Token.str()).data());
866// Mark the end of lines in response files.
867if (MarkEOLs &&C =='\n')
868 NewArgv.push_back(nullptr);
869 Token.clear();
870continue;
871 }
872
873// This is a normal character. Append it.
874 Token.push_back(C);
875 }
876
877// Append the last token after hitting EOF with no whitespace.
878if (!Token.empty())
879 NewArgv.push_back(Saver.save(Token.str()).data());
880}
881
882/// Backslashes are interpreted in a rather complicated way in the Windows-style
883/// command line, because backslashes are used both to separate path and to
884/// escape double quote. This method consumes runs of backslashes as well as the
885/// following double quote if it's escaped.
886///
887/// * If an even number of backslashes is followed by a double quote, one
888/// backslash is output for every pair of backslashes, and the last double
889/// quote remains unconsumed. The double quote will later be interpreted as
890/// the start or end of a quoted string in the main loop outside of this
891/// function.
892///
893/// * If an odd number of backslashes is followed by a double quote, one
894/// backslash is output for every pair of backslashes, and a double quote is
895/// output for the last pair of backslash-double quote. The double quote is
896/// consumed in this case.
897///
898/// * Otherwise, backslashes are interpreted literally.
899staticsize_tparseBackslash(StringRef Src,size_tI,SmallString<128> &Token) {
900size_t E = Src.size();
901int BackslashCount = 0;
902// Skip the backslashes.
903do {
904 ++I;
905 ++BackslashCount;
906 }while (I != E && Src[I] =='\\');
907
908bool FollowedByDoubleQuote = (I != E && Src[I] =='"');
909if (FollowedByDoubleQuote) {
910 Token.append(BackslashCount / 2,'\\');
911if (BackslashCount % 2 == 0)
912returnI - 1;
913 Token.push_back('"');
914returnI;
915 }
916 Token.append(BackslashCount,'\\');
917returnI - 1;
918}
919
920// Windows treats whitespace, double quotes, and backslashes specially, except
921// when parsing the first token of a full command line, in which case
922// backslashes are not special.
923staticboolisWindowsSpecialChar(charC) {
924returnisWhitespaceOrNull(C) ||C =='\\' ||C =='\"';
925}
926staticboolisWindowsSpecialCharInCommandName(charC) {
927returnisWhitespaceOrNull(C) ||C =='\"';
928}
929
930// Windows tokenization implementation. The implementation is designed to be
931// inlined and specialized for the two user entry points.
932staticinlinevoidtokenizeWindowsCommandLineImpl(
933StringRef Src,StringSaver &Saver,function_ref<void(StringRef)> AddToken,
934bool AlwaysCopy,function_ref<void()> MarkEOL,bool InitialCommandName) {
935SmallString<128> Token;
936
937// Sometimes, this function will be handling a full command line including an
938// executable pathname at the start. In that situation, the initial pathname
939// needs different handling from the following arguments, because when
940// CreateProcess or cmd.exe scans the pathname, it doesn't treat \ as
941// escaping the quote character, whereas when libc scans the rest of the
942// command line, it does.
943bool CommandName = InitialCommandName;
944
945// Try to do as much work inside the state machine as possible.
946enum {INIT, UNQUOTED, QUOTED } State =INIT;
947
948for (size_tI = 0, E = Src.size();I < E; ++I) {
949switch (State) {
950caseINIT: {
951assert(Token.empty() &&"token should be empty in initial state");
952// Eat whitespace before a token.
953while (I < E &&isWhitespaceOrNull(Src[I])) {
954if (Src[I] =='\n')
955 MarkEOL();
956 ++I;
957 }
958// Stop if this was trailing whitespace.
959if (I >= E)
960break;
961size_t Start =I;
962if (CommandName) {
963while (I < E && !isWindowsSpecialCharInCommandName(Src[I]))
964 ++I;
965 }else {
966while (I < E && !isWindowsSpecialChar(Src[I]))
967 ++I;
968 }
969StringRef NormalChars = Src.slice(Start,I);
970if (I >= E ||isWhitespaceOrNull(Src[I])) {
971// No special characters: slice out the substring and start the next
972// token. Copy the string if the caller asks us to.
973 AddToken(AlwaysCopy ? Saver.save(NormalChars) : NormalChars);
974if (I < E && Src[I] =='\n') {
975 MarkEOL();
976 CommandName = InitialCommandName;
977 }else {
978 CommandName =false;
979 }
980 }elseif (Src[I] =='\"') {
981 Token += NormalChars;
982 State = QUOTED;
983 }elseif (Src[I] =='\\') {
984assert(!CommandName &&"or else we'd have treated it as a normal char");
985 Token += NormalChars;
986I =parseBackslash(Src,I, Token);
987 State = UNQUOTED;
988 }else {
989llvm_unreachable("unexpected special character");
990 }
991break;
992 }
993
994case UNQUOTED:
995if (isWhitespaceOrNull(Src[I])) {
996// Whitespace means the end of the token. If we are in this state, the
997// token must have contained a special character, so we must copy the
998// token.
999 AddToken(Saver.save(Token.str()));
1000 Token.clear();
1001if (Src[I] =='\n') {
1002 CommandName = InitialCommandName;
1003 MarkEOL();
1004 }else {
1005 CommandName =false;
1006 }
1007 State =INIT;
1008 }elseif (Src[I] =='\"') {
1009 State = QUOTED;
1010 }elseif (Src[I] =='\\' && !CommandName) {
1011I =parseBackslash(Src,I, Token);
1012 }else {
1013 Token.push_back(Src[I]);
1014 }
1015break;
1016
1017case QUOTED:
1018if (Src[I] =='\"') {
1019if (I < (E - 1) && Src[I + 1] =='"') {
1020// Consecutive double-quotes inside a quoted string implies one
1021// double-quote.
1022 Token.push_back('"');
1023 ++I;
1024 }else {
1025// Otherwise, end the quoted portion and return to the unquoted state.
1026 State = UNQUOTED;
1027 }
1028 }elseif (Src[I] =='\\' && !CommandName) {
1029I =parseBackslash(Src,I, Token);
1030 }else {
1031 Token.push_back(Src[I]);
1032 }
1033break;
1034 }
1035 }
1036
1037if (State !=INIT)
1038 AddToken(Saver.save(Token.str()));
1039}
1040
1041voidcl::TokenizeWindowsCommandLine(StringRef Src,StringSaver &Saver,
1042SmallVectorImpl<const char *> &NewArgv,
1043bool MarkEOLs) {
1044auto AddToken = [&](StringRef Tok) { NewArgv.push_back(Tok.data()); };
1045auto OnEOL = [&]() {
1046if (MarkEOLs)
1047 NewArgv.push_back(nullptr);
1048 };
1049tokenizeWindowsCommandLineImpl(Src, Saver, AddToken,
1050/*AlwaysCopy=*/true, OnEOL,false);
1051}
1052
1053voidcl::TokenizeWindowsCommandLineNoCopy(StringRef Src,StringSaver &Saver,
1054SmallVectorImpl<StringRef> &NewArgv) {
1055auto AddToken = [&](StringRef Tok) { NewArgv.push_back(Tok); };
1056auto OnEOL = []() {};
1057tokenizeWindowsCommandLineImpl(Src, Saver, AddToken,/*AlwaysCopy=*/false,
1058 OnEOL,false);
1059}
1060
1061voidcl::TokenizeWindowsCommandLineFull(StringRef Src,StringSaver &Saver,
1062SmallVectorImpl<const char *> &NewArgv,
1063bool MarkEOLs) {
1064auto AddToken = [&](StringRef Tok) { NewArgv.push_back(Tok.data()); };
1065auto OnEOL = [&]() {
1066if (MarkEOLs)
1067 NewArgv.push_back(nullptr);
1068 };
1069tokenizeWindowsCommandLineImpl(Src, Saver, AddToken,
1070/*AlwaysCopy=*/true, OnEOL,true);
1071}
1072
1073voidcl::tokenizeConfigFile(StringRef Source,StringSaver &Saver,
1074SmallVectorImpl<const char *> &NewArgv,
1075bool MarkEOLs) {
1076for (constchar *Cur = Source.begin(); Cur != Source.end();) {
1077SmallString<128> Line;
1078// Check for comment line.
1079if (isWhitespace(*Cur)) {
1080while (Cur != Source.end() &&isWhitespace(*Cur))
1081 ++Cur;
1082continue;
1083 }
1084if (*Cur =='#') {
1085while (Cur != Source.end() && *Cur !='\n')
1086 ++Cur;
1087continue;
1088 }
1089// Find end of the current line.
1090constchar *Start = Cur;
1091for (constchar *End = Source.end(); Cur !=End; ++Cur) {
1092if (*Cur =='\\') {
1093if (Cur + 1 !=End) {
1094 ++Cur;
1095if (*Cur =='\n' ||
1096 (*Cur =='\r' && (Cur + 1 !=End) && Cur[1] =='\n')) {
1097 Line.append(Start, Cur - 1);
1098if (*Cur =='\r')
1099 ++Cur;
1100 Start = Cur + 1;
1101 }
1102 }
1103 }elseif (*Cur =='\n')
1104break;
1105 }
1106// Tokenize line.
1107 Line.append(Start, Cur);
1108cl::TokenizeGNUCommandLine(Line, Saver, NewArgv, MarkEOLs);
1109 }
1110}
1111
1112// It is called byte order marker but the UTF-8 BOM is actually not affected
1113// by the host system's endianness.
1114staticboolhasUTF8ByteOrderMark(ArrayRef<char> S) {
1115return (S.size() >= 3 && S[0] =='\xef' && S[1] =='\xbb' && S[2] =='\xbf');
1116}
1117
1118// Substitute <CFGDIR> with the file's base path.
1119staticvoidExpandBasePaths(StringRef BasePath,StringSaver &Saver,
1120constchar *&Arg) {
1121assert(sys::path::is_absolute(BasePath));
1122constexprStringLiteral Token("<CFGDIR>");
1123constStringRef ArgString(Arg);
1124
1125SmallString<128> ResponseFile;
1126StringRef::size_type StartPos = 0;
1127for (StringRef::size_type TokenPos = ArgString.find(Token);
1128 TokenPos !=StringRef::npos;
1129 TokenPos = ArgString.find(Token, StartPos)) {
1130// Token may appear more than once per arg (e.g. comma-separated linker
1131// args). Support by using path-append on any subsequent appearances.
1132constStringRefLHS = ArgString.substr(StartPos, TokenPos - StartPos);
1133if (ResponseFile.empty())
1134 ResponseFile =LHS;
1135else
1136llvm::sys::path::append(ResponseFile,LHS);
1137 ResponseFile.append(BasePath);
1138 StartPos = TokenPos + Token.size();
1139 }
1140
1141if (!ResponseFile.empty()) {
1142// Path-append the remaining arg substring if at least one token appeared.
1143constStringRef Remaining = ArgString.substr(StartPos);
1144if (!Remaining.empty())
1145llvm::sys::path::append(ResponseFile, Remaining);
1146 Arg = Saver.save(ResponseFile.str()).data();
1147 }
1148}
1149
1150// FName must be an absolute path.
1151Error ExpansionContext::expandResponseFile(
1152StringRef FName,SmallVectorImpl<const char *> &NewArgv) {
1153assert(sys::path::is_absolute(FName));
1154llvm::ErrorOr<std::unique_ptr<MemoryBuffer>> MemBufOrErr =
1155 FS->getBufferForFile(FName);
1156if (!MemBufOrErr) {
1157 std::error_codeEC = MemBufOrErr.getError();
1158returnllvm::createStringError(EC,Twine("cannot not open file '") + FName +
1159"': " +EC.message());
1160 }
1161MemoryBuffer &MemBuf = *MemBufOrErr.get();
1162StringRef Str(MemBuf.getBufferStart(), MemBuf.getBufferSize());
1163
1164// If we have a UTF-16 byte order mark, convert to UTF-8 for parsing.
1165ArrayRef<char> BufRef(MemBuf.getBufferStart(), MemBuf.getBufferEnd());
1166 std::string UTF8Buf;
1167if (hasUTF16ByteOrderMark(BufRef)) {
1168if (!convertUTF16ToUTF8String(BufRef, UTF8Buf))
1169returnllvm::createStringError(std::errc::illegal_byte_sequence,
1170"Could not convert UTF16 to UTF8");
1171 Str =StringRef(UTF8Buf);
1172 }
1173// If we see UTF-8 BOM sequence at the beginning of a file, we shall remove
1174// these bytes before parsing.
1175// Reference: http://en.wikipedia.org/wiki/UTF-8#Byte_order_mark
1176elseif (hasUTF8ByteOrderMark(BufRef))
1177 Str =StringRef(BufRef.data() + 3, BufRef.size() - 3);
1178
1179// Tokenize the contents into NewArgv.
1180 Tokenizer(Str, Saver, NewArgv, MarkEOLs);
1181
1182// Expanded file content may require additional transformations, like using
1183// absolute paths instead of relative in '@file' constructs or expanding
1184// macros.
1185if (!RelativeNames && !InConfigFile)
1186returnError::success();
1187
1188StringRef BasePath =llvm::sys::path::parent_path(FName);
1189for (constchar *&Arg : NewArgv) {
1190if (!Arg)
1191continue;
1192
1193// Substitute <CFGDIR> with the file's base path.
1194if (InConfigFile)
1195ExpandBasePaths(BasePath, Saver, Arg);
1196
1197// Discover the case, when argument should be transformed into '@file' and
1198// evaluate 'file' for it.
1199StringRef ArgStr(Arg);
1200StringRef FileName;
1201bool ConfigInclusion =false;
1202if (ArgStr.consume_front("@")) {
1203 FileName = ArgStr;
1204if (!llvm::sys::path::is_relative(FileName))
1205continue;
1206 }elseif (ArgStr.consume_front("--config=")) {
1207 FileName = ArgStr;
1208 ConfigInclusion =true;
1209 }else {
1210continue;
1211 }
1212
1213// Update expansion construct.
1214SmallString<128> ResponseFile;
1215 ResponseFile.push_back('@');
1216if (ConfigInclusion && !llvm::sys::path::has_parent_path(FileName)) {
1217SmallString<128> FilePath;
1218if (!findConfigFile(FileName, FilePath))
1219returncreateStringError(
1220 std::make_error_code(std::errc::no_such_file_or_directory),
1221"cannot not find configuration file: " + FileName);
1222 ResponseFile.append(FilePath);
1223 }else {
1224 ResponseFile.append(BasePath);
1225llvm::sys::path::append(ResponseFile, FileName);
1226 }
1227 Arg = Saver.save(ResponseFile.str()).data();
1228 }
1229returnError::success();
1230}
1231
1232/// Expand response files on a command line recursively using the given
1233/// StringSaver and tokenization strategy.
1234ErrorExpansionContext::expandResponseFiles(
1235SmallVectorImpl<const char *> &Argv) {
1236structResponseFileRecord {
1237 std::string File;
1238size_tEnd;
1239 };
1240
1241// To detect recursive response files, we maintain a stack of files and the
1242// position of the last argument in the file. This position is updated
1243// dynamically as we recursively expand files.
1244SmallVector<ResponseFileRecord, 3> FileStack;
1245
1246// Push a dummy entry that represents the initial command line, removing
1247// the need to check for an empty list.
1248 FileStack.push_back({"", Argv.size()});
1249
1250// Don't cache Argv.size() because it can change.
1251for (unsignedI = 0;I != Argv.size();) {
1252while (I == FileStack.back().End) {
1253// Passing the end of a file's argument list, so we can remove it from the
1254// stack.
1255 FileStack.pop_back();
1256 }
1257
1258constchar *Arg = Argv[I];
1259// Check if it is an EOL marker
1260if (Arg ==nullptr) {
1261 ++I;
1262continue;
1263 }
1264
1265if (Arg[0] !='@') {
1266 ++I;
1267continue;
1268 }
1269
1270constchar *FName = Arg + 1;
1271// Note that CurrentDir is only used for top-level rsp files, the rest will
1272// always have an absolute path deduced from the containing file.
1273SmallString<128> CurrDir;
1274if (llvm::sys::path::is_relative(FName)) {
1275if (CurrentDir.empty()) {
1276if (auto CWD = FS->getCurrentWorkingDirectory()) {
1277 CurrDir = *CWD;
1278 }else {
1279returncreateStringError(
1280 CWD.getError(),Twine("cannot get absolute path for: ") + FName);
1281 }
1282 }else {
1283 CurrDir = CurrentDir;
1284 }
1285llvm::sys::path::append(CurrDir, FName);
1286 FName = CurrDir.c_str();
1287 }
1288
1289ErrorOr<llvm::vfs::Status> Res = FS->status(FName);
1290if (!Res || !Res->exists()) {
1291 std::error_code EC = Res.getError();
1292if (!InConfigFile) {
1293// If the specified file does not exist, leave '@file' unexpanded, as
1294// libiberty does.
1295if (!EC || EC ==llvm::errc::no_such_file_or_directory) {
1296 ++I;
1297continue;
1298 }
1299 }
1300if (!EC)
1301 EC =llvm::errc::no_such_file_or_directory;
1302returncreateStringError(EC,Twine("cannot not open file '") + FName +
1303"': " + EC.message());
1304 }
1305constllvm::vfs::Status &FileStatus = Res.get();
1306
1307auto IsEquivalent =
1308 [FileStatus,this](const ResponseFileRecord &RFile) ->ErrorOr<bool> {
1309ErrorOr<llvm::vfs::Status>RHS = FS->status(RFile.File);
1310if (!RHS)
1311returnRHS.getError();
1312return FileStatus.equivalent(*RHS);
1313 };
1314
1315// Check for recursive response files.
1316for (constauto &F :drop_begin(FileStack)) {
1317if (ErrorOr<bool> R = IsEquivalent(F)) {
1318if (R.get())
1319returncreateStringError(
1320 R.getError(),Twine("recursive expansion of: '") +F.File +"'");
1321 }else {
1322returncreateStringError(R.getError(),
1323Twine("cannot open file: ") +F.File);
1324 }
1325 }
1326
1327// Replace this response file argument with the tokenization of its
1328// contents. Nested response files are expanded in subsequent iterations.
1329SmallVector<const char *, 0> ExpandedArgv;
1330if (Error Err = expandResponseFile(FName, ExpandedArgv))
1331return Err;
1332
1333for (ResponseFileRecord &Record : FileStack) {
1334// Increase the end of all active records by the number of newly expanded
1335// arguments, minus the response file itself.
1336Record.End += ExpandedArgv.size() - 1;
1337 }
1338
1339 FileStack.push_back({FName,I + ExpandedArgv.size()});
1340 Argv.erase(Argv.begin() +I);
1341 Argv.insert(Argv.begin() +I, ExpandedArgv.begin(), ExpandedArgv.end());
1342 }
1343
1344// If successful, the top of the file stack will mark the end of the Argv
1345// stream. A failure here indicates a bug in the stack popping logic above.
1346// Note that FileStack may have more than one element at this point because we
1347// don't have a chance to pop the stack when encountering recursive files at
1348// the end of the stream, so seeing that doesn't indicate a bug.
1349assert(FileStack.size() > 0 && Argv.size() == FileStack.back().End);
1350returnError::success();
1351}
1352
1353boolcl::expandResponseFiles(int Argc,constchar *const *Argv,
1354constchar *EnvVar,StringSaver &Saver,
1355SmallVectorImpl<const char *> &NewArgv) {
1356#ifdef _WIN32
1357auto Tokenize =cl::TokenizeWindowsCommandLine;
1358#else
1359auto Tokenize =cl::TokenizeGNUCommandLine;
1360#endif
1361// The environment variable specifies initial options.
1362if (EnvVar)
1363if (std::optional<std::string> EnvValue =sys::Process::GetEnv(EnvVar))
1364 Tokenize(*EnvValue, Saver, NewArgv,/*MarkEOLs=*/false);
1365
1366// Command line options can override the environment variable.
1367 NewArgv.append(Argv + 1, Argv + Argc);
1368ExpansionContext ECtx(Saver.getAllocator(), Tokenize);
1369if (Error Err = ECtx.expandResponseFiles(NewArgv)) {
1370errs() <<toString(std::move(Err)) <<'\n';
1371returnfalse;
1372 }
1373returntrue;
1374}
1375
1376boolcl::ExpandResponseFiles(StringSaver &Saver,TokenizerCallback Tokenizer,
1377SmallVectorImpl<const char *> &Argv) {
1378ExpansionContext ECtx(Saver.getAllocator(), Tokenizer);
1379if (Error Err = ECtx.expandResponseFiles(Argv)) {
1380errs() <<toString(std::move(Err)) <<'\n';
1381returnfalse;
1382 }
1383returntrue;
1384}
1385
1386ExpansionContext::ExpansionContext(BumpPtrAllocator &A,TokenizerCallbackT)
1387 : Saver(A), Tokenizer(T), FS(vfs::getRealFileSystem().get()) {}
1388
1389boolExpansionContext::findConfigFile(StringRef FileName,
1390SmallVectorImpl<char> &FilePath) {
1391SmallString<128> CfgFilePath;
1392constauto FileExists = [this](SmallString<128> Path) ->bool {
1393autoStatus = FS->status(Path);
1394returnStatus &&
1395Status->getType() ==llvm::sys::fs::file_type::regular_file;
1396 };
1397
1398// If file name contains directory separator, treat it as a path to
1399// configuration file.
1400if (llvm::sys::path::has_parent_path(FileName)) {
1401 CfgFilePath = FileName;
1402if (llvm::sys::path::is_relative(FileName) && FS->makeAbsolute(CfgFilePath))
1403returnfalse;
1404if (!FileExists(CfgFilePath))
1405returnfalse;
1406 FilePath.assign(CfgFilePath.begin(), CfgFilePath.end());
1407returntrue;
1408 }
1409
1410// Look for the file in search directories.
1411for (constStringRef &Dir : SearchDirs) {
1412if (Dir.empty())
1413continue;
1414 CfgFilePath.assign(Dir);
1415llvm::sys::path::append(CfgFilePath, FileName);
1416llvm::sys::path::native(CfgFilePath);
1417if (FileExists(CfgFilePath)) {
1418 FilePath.assign(CfgFilePath.begin(), CfgFilePath.end());
1419returntrue;
1420 }
1421 }
1422
1423returnfalse;
1424}
1425
1426ErrorExpansionContext::readConfigFile(StringRef CfgFile,
1427SmallVectorImpl<const char *> &Argv) {
1428SmallString<128> AbsPath;
1429if (sys::path::is_relative(CfgFile)) {
1430 AbsPath.assign(CfgFile);
1431if (std::error_code EC = FS->makeAbsolute(AbsPath))
1432return make_error<StringError>(
1433 EC,Twine("cannot get absolute path for " + CfgFile));
1434 CfgFile = AbsPath.str();
1435 }
1436 InConfigFile =true;
1437 RelativeNames =true;
1438if (Error Err = expandResponseFile(CfgFile, Argv))
1439return Err;
1440returnexpandResponseFiles(Argv);
1441}
1442
1443staticvoidinitCommonOptions();
1444boolcl::ParseCommandLineOptions(int argc,constchar *const *argv,
1445StringRef Overview,raw_ostream *Errs,
1446constchar *EnvVar,
1447bool LongOptionsUseDoubleDash) {
1448initCommonOptions();
1449SmallVector<const char *, 20> NewArgv;
1450BumpPtrAllocatorA;
1451StringSaver Saver(A);
1452 NewArgv.push_back(argv[0]);
1453
1454// Parse options from environment variable.
1455if (EnvVar) {
1456if (std::optional<std::string> EnvValue =
1457sys::Process::GetEnv(StringRef(EnvVar)))
1458TokenizeGNUCommandLine(*EnvValue, Saver, NewArgv);
1459 }
1460
1461// Append options from command line.
1462for (intI = 1;I < argc; ++I)
1463 NewArgv.push_back(argv[I]);
1464int NewArgc =static_cast<int>(NewArgv.size());
1465
1466// Parse all options.
1467returnGlobalParser->ParseCommandLineOptions(NewArgc, &NewArgv[0], Overview,
1468 Errs, LongOptionsUseDoubleDash);
1469}
1470
1471/// Reset all options at least once, so that we can parse different options.
1472void CommandLineParser::ResetAllOptionOccurrences() {
1473// Reset all option values to look like they have never been seen before.
1474// Options might be reset twice (they can be reference in both OptionsMap
1475// and one of the other members), but that does not harm.
1476for (auto *SC : RegisteredSubCommands) {
1477for (auto &O : SC->OptionsMap)
1478 O.second->reset();
1479for (Option *O : SC->PositionalOpts)
1480 O->reset();
1481for (Option *O : SC->SinkOpts)
1482 O->reset();
1483if (SC->ConsumeAfterOpt)
1484 SC->ConsumeAfterOpt->reset();
1485 }
1486}
1487
1488bool CommandLineParser::ParseCommandLineOptions(int argc,
1489constchar *const *argv,
1490StringRef Overview,
1491raw_ostream *Errs,
1492bool LongOptionsUseDoubleDash) {
1493assert(hasOptions() &&"No options specified!");
1494
1495 ProgramOverview = Overview;
1496bool IgnoreErrors = Errs;
1497if (!Errs)
1498 Errs = &errs();
1499bool ErrorParsing =false;
1500
1501// Expand response files.
1502SmallVector<const char *, 20> newArgv(argv, argv + argc);
1503BumpPtrAllocatorA;
1504#ifdef _WIN32
1505auto Tokenize =cl::TokenizeWindowsCommandLine;
1506#else
1507auto Tokenize =cl::TokenizeGNUCommandLine;
1508#endif
1509ExpansionContext ECtx(A, Tokenize);
1510if (Error Err = ECtx.expandResponseFiles(newArgv)) {
1511 *Errs <<toString(std::move(Err)) <<'\n';
1512returnfalse;
1513 }
1514 argv = &newArgv[0];
1515 argc =static_cast<int>(newArgv.size());
1516
1517// Copy the program name into ProgName, making sure not to overflow it.
1518 ProgramName = std::string(sys::path::filename(StringRef(argv[0])));
1519
1520// Check out the positional arguments to collect information about them.
1521unsigned NumPositionalRequired = 0;
1522
1523// Determine whether or not there are an unlimited number of positionals
1524bool HasUnlimitedPositionals =false;
1525
1526int FirstArg = 1;
1527SubCommand *ChosenSubCommand = &SubCommand::getTopLevel();
1528 std::string NearestSubCommandString;
1529bool MaybeNamedSubCommand =
1530 argc >= 2 && argv[FirstArg][0] !='-' && hasNamedSubCommands();
1531if (MaybeNamedSubCommand) {
1532// If the first argument specifies a valid subcommand, start processing
1533// options from the second argument.
1534 ChosenSubCommand =
1535 LookupSubCommand(StringRef(argv[FirstArg]), NearestSubCommandString);
1536if (ChosenSubCommand != &SubCommand::getTopLevel())
1537 FirstArg = 2;
1538 }
1539GlobalParser->ActiveSubCommand = ChosenSubCommand;
1540
1541assert(ChosenSubCommand);
1542auto &ConsumeAfterOpt = ChosenSubCommand->ConsumeAfterOpt;
1543auto &PositionalOpts = ChosenSubCommand->PositionalOpts;
1544auto &SinkOpts = ChosenSubCommand->SinkOpts;
1545auto &OptionsMap = ChosenSubCommand->OptionsMap;
1546
1547for (auto *O: DefaultOptions) {
1548 addOption(O,true);
1549 }
1550
1551if (ConsumeAfterOpt) {
1552assert(PositionalOpts.size() > 0 &&
1553"Cannot specify cl::ConsumeAfter without a positional argument!");
1554 }
1555if (!PositionalOpts.empty()) {
1556
1557// Calculate how many positional values are _required_.
1558bool UnboundedFound =false;
1559for (size_t i = 0, e = PositionalOpts.size(); i != e; ++i) {
1560Option *Opt = PositionalOpts[i];
1561if (RequiresValue(Opt))
1562 ++NumPositionalRequired;
1563elseif (ConsumeAfterOpt) {
1564// ConsumeAfter cannot be combined with "optional" positional options
1565// unless there is only one positional argument...
1566if (PositionalOpts.size() > 1) {
1567if (!IgnoreErrors)
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;
1572 }
1573 }elseif (UnboundedFound && !Opt->hasArgStr()) {
1574// This option does not "require" a value... Make sure this option is
1575// not specified after an option that eats all extra arguments, or this
1576// one will never get any!
1577//
1578if (!IgnoreErrors)
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;
1587 }
1588 UnboundedFound |=EatsUnboundedNumberOfValues(Opt);
1589 }
1590 HasUnlimitedPositionals = UnboundedFound || ConsumeAfterOpt;
1591 }
1592
1593// PositionalVals - A vector of "positional" arguments we accumulate into
1594// the process at the end.
1595//
1596SmallVector<std::pair<StringRef, unsigned>, 4> PositionalVals;
1597
1598// If the program has named positional arguments, and the name has been run
1599// across, keep track of which positional argument was named. Otherwise put
1600// the positional args into the PositionalVals list...
1601Option *ActivePositionalArg =nullptr;
1602
1603// Loop over all of the arguments... processing them.
1604bool DashDashFound =false;// Have we read '--'?
1605for (int i = FirstArg; i < argc; ++i) {
1606Option *Handler =nullptr;
1607 std::string NearestHandlerString;
1608StringRefValue;
1609StringRef ArgName ="";
1610bool HaveDoubleDash =false;
1611
1612// Check to see if this is a positional argument. This argument is
1613// considered to be positional if it doesn't start with '-', if it is "-"
1614// itself, or if we have seen "--" already.
1615//
1616if (argv[i][0] !='-' || argv[i][1] == 0 || DashDashFound) {
1617// Positional argument!
1618if (ActivePositionalArg) {
1619ProvidePositionalOption(ActivePositionalArg,StringRef(argv[i]), i);
1620continue;// We are done!
1621 }
1622
1623if (!PositionalOpts.empty()) {
1624 PositionalVals.push_back(std::make_pair(StringRef(argv[i]), i));
1625
1626// All of the positional arguments have been fulfulled, give the rest to
1627// the consume after option... if it's specified...
1628//
1629if (PositionalVals.size() >= NumPositionalRequired && ConsumeAfterOpt) {
1630for (++i; i < argc; ++i)
1631 PositionalVals.push_back(std::make_pair(StringRef(argv[i]), i));
1632break;// Handle outside of the argument processing loop...
1633 }
1634
1635// Delay processing positional arguments until the end...
1636continue;
1637 }
1638 }elseif (argv[i][0] =='-' && argv[i][1] =='-' && argv[i][2] == 0 &&
1639 !DashDashFound) {
1640 DashDashFound =true;// This is the mythical "--"?
1641continue;// Don't try to process it as an argument itself.
1642 }elseif (ActivePositionalArg &&
1643 (ActivePositionalArg->getMiscFlags() &PositionalEatsArgs)) {
1644// If there is a positional argument eating options, check to see if this
1645// option is another positional argument. If so, treat it as an argument,
1646// otherwise feed it to the eating positional.
1647 ArgName =StringRef(argv[i] + 1);
1648// Eat second dash.
1649if (ArgName.consume_front("-"))
1650 HaveDoubleDash =true;
1651
1652 Handler = LookupLongOption(*ChosenSubCommand, ArgName,Value,
1653 LongOptionsUseDoubleDash, HaveDoubleDash);
1654if (!Handler || Handler->getFormattingFlag() !=cl::Positional) {
1655ProvidePositionalOption(ActivePositionalArg,StringRef(argv[i]), i);
1656continue;// We are done!
1657 }
1658 }else {// We start with a '-', must be an argument.
1659 ArgName =StringRef(argv[i] + 1);
1660// Eat second dash.
1661if (ArgName.consume_front("-"))
1662 HaveDoubleDash =true;
1663
1664 Handler = LookupLongOption(*ChosenSubCommand, ArgName,Value,
1665 LongOptionsUseDoubleDash, HaveDoubleDash);
1666
1667// If Handler is not found in a specialized subcommand, look up handler
1668// in the top-level subcommand.
1669// cl::opt without cl::sub belongs to top-level subcommand.
1670if (!Handler && ChosenSubCommand != &SubCommand::getTopLevel())
1671 Handler = LookupLongOption(SubCommand::getTopLevel(), ArgName,Value,
1672 LongOptionsUseDoubleDash, HaveDoubleDash);
1673
1674// Check to see if this "option" is really a prefixed or grouped argument.
1675if (!Handler && !(LongOptionsUseDoubleDash && HaveDoubleDash))
1676 Handler =HandlePrefixedOrGroupedOption(ArgName,Value, ErrorParsing,
1677 OptionsMap);
1678
1679// Otherwise, look for the closest available option to report to the user
1680// in the upcoming error.
1681if (!Handler && SinkOpts.empty())
1682LookupNearestOption(ArgName, OptionsMap, NearestHandlerString);
1683 }
1684
1685if (!Handler) {
1686if (!SinkOpts.empty()) {
1687for (Option *SinkOpt : SinkOpts)
1688 SinkOpt->addOccurrence(i,"",StringRef(argv[i]));
1689continue;
1690 }
1691
1692auto ReportUnknownArgument = [&](bool IsArg,
1693StringRef NearestArgumentName) {
1694 *Errs << ProgramName <<": Unknown "
1695 << (IsArg ?"command line argument" :"subcommand") <<" '"
1696 << argv[i] <<"'. Try: '" << argv[0] <<" --help'\n";
1697
1698if (NearestArgumentName.empty())
1699return;
1700
1701 *Errs << ProgramName <<": Did you mean '";
1702if (IsArg)
1703 *Errs << PrintArg(NearestArgumentName, 0);
1704else
1705 *Errs << NearestArgumentName;
1706 *Errs <<"'?\n";
1707 };
1708
1709if (i > 1 || !MaybeNamedSubCommand)
1710 ReportUnknownArgument(/*IsArg=*/true, NearestHandlerString);
1711else
1712 ReportUnknownArgument(/*IsArg=*/false, NearestSubCommandString);
1713
1714 ErrorParsing =true;
1715continue;
1716 }
1717
1718// If this is a named positional argument, just remember that it is the
1719// active one...
1720if (Handler->getFormattingFlag() ==cl::Positional) {
1721if ((Handler->getMiscFlags() &PositionalEatsArgs) && !Value.empty()) {
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;
1726 }
1727 ActivePositionalArg = Handler;
1728 }
1729else
1730 ErrorParsing |=ProvideOption(Handler, ArgName,Value, argc, argv, i);
1731 }
1732
1733// Check and handle positional arguments now...
1734if (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";
1740
1741 ErrorParsing =true;
1742 }elseif (!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;
1748
1749 }elseif (!ConsumeAfterOpt) {
1750// Positional args have already been handled if ConsumeAfter is specified.
1751unsigned ValNo = 0, NumVals =static_cast<unsigned>(PositionalVals.size());
1752for (Option *Opt : PositionalOpts) {
1753if (RequiresValue(Opt)) {
1754ProvidePositionalOption(Opt, PositionalVals[ValNo].first,
1755 PositionalVals[ValNo].second);
1756 ValNo++;
1757 --NumPositionalRequired;// We fulfilled our duty...
1758 }
1759
1760// If we _can_ give this option more arguments, do so now, as long as we
1761// do not give it values that others need. 'Done' controls whether the
1762// option even _WANTS_ any more.
1763//
1764boolDone = Opt->getNumOccurrencesFlag() ==cl::Required;
1765while (NumVals - ValNo > NumPositionalRequired && !Done) {
1766switch (Opt->getNumOccurrencesFlag()) {
1767casecl::Optional:
1768Done =true;// Optional arguments want _at most_ one value
1769 [[fallthrough]];
1770casecl::ZeroOrMore:// Zero or more will take all they can get...
1771casecl::OneOrMore:// One or more will take all they can get...
1772ProvidePositionalOption(Opt, PositionalVals[ValNo].first,
1773 PositionalVals[ValNo].second);
1774 ValNo++;
1775break;
1776default:
1777llvm_unreachable("Internal error, unexpected NumOccurrences flag in "
1778"positional argument processing!");
1779 }
1780 }
1781 }
1782 }else {
1783assert(ConsumeAfterOpt && NumPositionalRequired <= PositionalVals.size());
1784unsigned ValNo = 0;
1785for (Option *Opt : PositionalOpts)
1786if (RequiresValue(Opt)) {
1787 ErrorParsing |=ProvidePositionalOption(
1788 Opt, PositionalVals[ValNo].first, PositionalVals[ValNo].second);
1789 ValNo++;
1790 }
1791
1792// Handle the case where there is just one positional option, and it's
1793// optional. In this case, we want to give JUST THE FIRST option to the
1794// positional option and keep the rest for the consume after. The above
1795// loop would have assigned no values to positional options in this case.
1796//
1797if (PositionalOpts.size() == 1 && ValNo == 0 && !PositionalVals.empty()) {
1798 ErrorParsing |=ProvidePositionalOption(PositionalOpts[0],
1799 PositionalVals[ValNo].first,
1800 PositionalVals[ValNo].second);
1801 ValNo++;
1802 }
1803
1804// Handle over all of the rest of the arguments to the
1805// cl::ConsumeAfter command line option...
1806for (; ValNo != PositionalVals.size(); ++ValNo)
1807 ErrorParsing |=
1808ProvidePositionalOption(ConsumeAfterOpt, PositionalVals[ValNo].first,
1809 PositionalVals[ValNo].second);
1810 }
1811
1812// Loop over args and make sure all required args are specified!
1813for (constauto &Opt : OptionsMap) {
1814switch (Opt.second->getNumOccurrencesFlag()) {
1815caseRequired:
1816caseOneOrMore:
1817if (Opt.second->getNumOccurrences() == 0) {
1818 Opt.second->error("must be specified at least once!");
1819 ErrorParsing =true;
1820 }
1821 [[fallthrough]];
1822default:
1823break;
1824 }
1825 }
1826
1827// Now that we know if -debug is specified, we can use it.
1828// Note that if ReadResponseFiles == true, this must be done before the
1829// memory allocated for the expanded command line is free()d below.
1830LLVM_DEBUG(dbgs() <<"Args: ";
1831for (int i = 0; i < argc; ++i)dbgs() << argv[i] <<' ';
1832dbgs() <<'\n';);
1833
1834// Free all of the memory allocated to the map. Command line options may only
1835// be processed once!
1836 MoreHelp.clear();
1837
1838// If we had an error processing our arguments, don't let the program execute
1839if (ErrorParsing) {
1840if (!IgnoreErrors)
1841 exit(1);
1842returnfalse;
1843 }
1844returntrue;
1845}
1846
1847//===----------------------------------------------------------------------===//
1848// Option Base class implementation
1849//
1850
1851boolOption::error(constTwine &Message,StringRef ArgName,raw_ostream &Errs) {
1852if (!ArgName.data())
1853 ArgName =ArgStr;
1854if (ArgName.empty())
1855 Errs <<HelpStr;// Be nice for positional arguments
1856else
1857 Errs <<GlobalParser->ProgramName <<": for the " << PrintArg(ArgName, 0);
1858
1859 Errs <<" option: " << Message <<"\n";
1860returntrue;
1861}
1862
1863boolOption::addOccurrence(unsigned pos,StringRef ArgName,StringRefValue,
1864bool MultiArg) {
1865if (!MultiArg)
1866 NumOccurrences++;// Increment the number of times we have been seen
1867
1868return handleOccurrence(pos, ArgName,Value);
1869}
1870
1871// getValueStr - Get the value description string, using "DefaultMsg" if nothing
1872// has been specified yet.
1873//
1874staticStringRefgetValueStr(constOption &O,StringRef DefaultMsg) {
1875if (O.ValueStr.empty())
1876return DefaultMsg;
1877return O.ValueStr;
1878}
1879
1880//===----------------------------------------------------------------------===//
1881// cl::alias class implementation
1882//
1883
1884// Return the width of the option tag for printing...
1885size_t alias::getOptionWidth() const{
1886returnargPlusPrefixesSize(ArgStr);
1887}
1888
1889voidOption::printHelpStr(StringRef HelpStr,size_t Indent,
1890size_t FirstLineIndentedBy) {
1891assert(Indent >= FirstLineIndentedBy);
1892 std::pair<StringRef, StringRef> Split =HelpStr.split('\n');
1893outs().indent(Indent - FirstLineIndentedBy)
1894 <<ArgHelpPrefix << Split.first <<"\n";
1895while (!Split.second.empty()) {
1896 Split = Split.second.split('\n');
1897outs().indent(Indent) << Split.first <<"\n";
1898 }
1899}
1900
1901voidOption::printEnumValHelpStr(StringRef HelpStr,size_t BaseIndent,
1902size_t FirstLineIndentedBy) {
1903constStringRef ValHelpPrefix =" ";
1904assert(BaseIndent >= FirstLineIndentedBy);
1905 std::pair<StringRef, StringRef> Split =HelpStr.split('\n');
1906outs().indent(BaseIndent - FirstLineIndentedBy)
1907 <<ArgHelpPrefix << ValHelpPrefix << Split.first <<"\n";
1908while (!Split.second.empty()) {
1909 Split = Split.second.split('\n');
1910outs().indent(BaseIndent + ValHelpPrefix.size()) << Split.first <<"\n";
1911 }
1912}
1913
1914// Print out the option for the alias.
1915void alias::printOptionInfo(size_t GlobalWidth) const{
1916outs() << PrintArg(ArgStr);
1917printHelpStr(HelpStr, GlobalWidth,argPlusPrefixesSize(ArgStr));
1918}
1919
1920//===----------------------------------------------------------------------===//
1921// Parser Implementation code...
1922//
1923
1924// basic_parser implementation
1925//
1926
1927// Return the width of the option tag for printing...
1928size_tbasic_parser_impl::getOptionWidth(constOption &O) const{
1929size_t Len =argPlusPrefixesSize(O.ArgStr);
1930auto ValName =getValueName();
1931if (!ValName.empty()) {
1932size_t FormattingLen = 3;
1933if (O.getMiscFlags() &PositionalEatsArgs)
1934 FormattingLen = 6;
1935 Len +=getValueStr(O, ValName).size() + FormattingLen;
1936 }
1937
1938return Len;
1939}
1940
1941// printOptionInfo - Print out information about this option. The
1942// to-be-maintained width is specified.
1943//
1944voidbasic_parser_impl::printOptionInfo(constOption &O,
1945size_t GlobalWidth) const{
1946outs() << PrintArg(O.ArgStr);
1947
1948auto ValName =getValueName();
1949if (!ValName.empty()) {
1950if (O.getMiscFlags() &PositionalEatsArgs) {
1951outs() <<" <" <<getValueStr(O, ValName) <<">...";
1952 }elseif (O.getValueExpectedFlag() ==ValueOptional)
1953outs() <<"[=<" <<getValueStr(O, ValName) <<">]";
1954else {
1955outs() << (O.ArgStr.size() == 1 ?" <" :"=<") <<getValueStr(O, ValName)
1956 <<'>';
1957 }
1958 }
1959
1960Option::printHelpStr(O.HelpStr, GlobalWidth,getOptionWidth(O));
1961}
1962
1963voidbasic_parser_impl::printOptionName(constOption &O,
1964size_t GlobalWidth) const{
1965outs() << PrintArg(O.ArgStr);
1966outs().indent(GlobalWidth - O.ArgStr.size());
1967}
1968
1969// parser<bool> implementation
1970//
1971boolparser<bool>::parse(Option &O,StringRef ArgName,StringRef Arg,
1972bool &Value) {
1973return parseBool<bool, true, false>(O, ArgName, Arg,Value);
1974}
1975
1976// parser<boolOrDefault> implementation
1977//
1978boolparser<boolOrDefault>::parse(Option &O,StringRef ArgName,StringRef Arg,
1979boolOrDefault &Value) {
1980return parseBool<boolOrDefault, BOU_TRUE, BOU_FALSE>(O, ArgName, Arg,Value);
1981}
1982
1983// parser<int> implementation
1984//
1985boolparser<int>::parse(Option &O,StringRef ArgName,StringRef Arg,
1986int &Value) {
1987if (Arg.getAsInteger(0,Value))
1988return O.error("'" + Arg +"' value invalid for integer argument!");
1989returnfalse;
1990}
1991
1992// parser<long> implementation
1993//
1994boolparser<long>::parse(Option &O,StringRef ArgName,StringRef Arg,
1995long &Value) {
1996if (Arg.getAsInteger(0,Value))
1997returnO.error("'" + Arg +"' value invalid for long argument!");
1998returnfalse;
1999}
2000
2001// parser<long long> implementation
2002//
2003boolparser<long long>::parse(Option &O,StringRef ArgName,StringRef Arg,
2004longlong &Value) {
2005if (Arg.getAsInteger(0,Value))
2006returnO.error("'" + Arg +"' value invalid for llong argument!");
2007returnfalse;
2008}
2009
2010// parser<unsigned> implementation
2011//
2012boolparser<unsigned>::parse(Option &O,StringRef ArgName,StringRef Arg,
2013unsigned &Value) {
2014
2015if (Arg.getAsInteger(0,Value))
2016returnO.error("'" + Arg +"' value invalid for uint argument!");
2017returnfalse;
2018}
2019
2020// parser<unsigned long> implementation
2021//
2022boolparser<unsigned long>::parse(Option &O,StringRef ArgName,StringRef Arg,
2023unsignedlong &Value) {
2024
2025if (Arg.getAsInteger(0,Value))
2026returnO.error("'" + Arg +"' value invalid for ulong argument!");
2027returnfalse;
2028}
2029
2030// parser<unsigned long long> implementation
2031//
2032boolparser<unsigned long long>::parse(Option &O,StringRef ArgName,
2033StringRef Arg,
2034unsignedlonglong &Value) {
2035
2036if (Arg.getAsInteger(0,Value))
2037returnO.error("'" + Arg +"' value invalid for ullong argument!");
2038returnfalse;
2039}
2040
2041// parser<double>/parser<float> implementation
2042//
2043staticboolparseDouble(Option &O,StringRef Arg,double &Value) {
2044if (to_float(Arg,Value))
2045returnfalse;
2046return O.error("'" + Arg +"' value invalid for floating point argument!");
2047}
2048
2049boolparser<double>::parse(Option &O,StringRef ArgName,StringRef Arg,
2050double &Val) {
2051returnparseDouble(O, Arg, Val);
2052}
2053
2054boolparser<float>::parse(Option &O,StringRef ArgName,StringRef Arg,
2055float &Val) {
2056double dVal;
2057if (parseDouble(O, Arg, dVal))
2058returntrue;
2059 Val = (float)dVal;
2060returnfalse;
2061}
2062
2063// generic_parser_base implementation
2064//
2065
2066// findOption - Return the option number corresponding to the specified
2067// argument string. If the option is not found, getNumOptions() is returned.
2068//
2069unsignedgeneric_parser_base::findOption(StringRefName) {
2070unsigned e =getNumOptions();
2071
2072for (unsigned i = 0; i != e; ++i) {
2073if (getOption(i) ==Name)
2074return i;
2075 }
2076return e;
2077}
2078
2079staticStringRefEqValue ="=<value>";
2080staticStringRefEmptyOption ="<empty>";
2081staticStringRefOptionPrefix =" =";
2082staticsize_tgetOptionPrefixesSize() {
2083returnOptionPrefix.size() +ArgHelpPrefix.size();
2084}
2085
2086staticboolshouldPrintOption(StringRefName,StringRef Description,
2087constOption &O) {
2088return O.getValueExpectedFlag() !=ValueOptional || !Name.empty() ||
2089 !Description.empty();
2090}
2091
2092// Return the width of the option tag for printing...
2093size_tgeneric_parser_base::getOptionWidth(constOption &O) const{
2094if (O.hasArgStr()) {
2095size_tSize =
2096argPlusPrefixesSize(O.ArgStr) +EqValue.size();
2097for (unsigned i = 0, e =getNumOptions(); i != e; ++i) {
2098StringRefName =getOption(i);
2099if (!shouldPrintOption(Name,getDescription(i), O))
2100continue;
2101size_tNameSize =Name.empty() ?EmptyOption.size() :Name.size();
2102Size = std::max(Size,NameSize +getOptionPrefixesSize());
2103 }
2104returnSize;
2105 }else {
2106size_t BaseSize = 0;
2107for (unsigned i = 0, e =getNumOptions(); i != e; ++i)
2108 BaseSize = std::max(BaseSize,getOption(i).size() + 8);
2109return BaseSize;
2110 }
2111}
2112
2113// printOptionInfo - Print out information about this option. The
2114// to-be-maintained width is specified.
2115//
2116voidgeneric_parser_base::printOptionInfo(constOption &O,
2117size_t GlobalWidth) const{
2118if (O.hasArgStr()) {
2119// When the value is optional, first print a line just describing the
2120// option without values.
2121if (O.getValueExpectedFlag() ==ValueOptional) {
2122for (unsigned i = 0, e =getNumOptions(); i != e; ++i) {
2123if (getOption(i).empty()) {
2124outs() << PrintArg(O.ArgStr);
2125Option::printHelpStr(O.HelpStr, GlobalWidth,
2126argPlusPrefixesSize(O.ArgStr));
2127break;
2128 }
2129 }
2130 }
2131
2132outs() << PrintArg(O.ArgStr) <<EqValue;
2133Option::printHelpStr(O.HelpStr, GlobalWidth,
2134EqValue.size() +
2135argPlusPrefixesSize(O.ArgStr));
2136for (unsigned i = 0, e =getNumOptions(); i != e; ++i) {
2137StringRef OptionName =getOption(i);
2138StringRef Description =getDescription(i);
2139if (!shouldPrintOption(OptionName, Description, O))
2140continue;
2141size_t FirstLineIndent = OptionName.size() +getOptionPrefixesSize();
2142outs() <<OptionPrefix << OptionName;
2143if (OptionName.empty()) {
2144outs() <<EmptyOption;
2145assert(FirstLineIndent >=EmptyOption.size());
2146 FirstLineIndent +=EmptyOption.size();
2147 }
2148if (!Description.empty())
2149Option::printEnumValHelpStr(Description, GlobalWidth, FirstLineIndent);
2150else
2151outs() <<'\n';
2152 }
2153 }else {
2154if (!O.HelpStr.empty())
2155outs() <<" " << O.HelpStr <<'\n';
2156for (unsigned i = 0, e =getNumOptions(); i != e; ++i) {
2157StringRefOption =getOption(i);
2158outs() <<" " << PrintArg(Option);
2159Option::printHelpStr(getDescription(i), GlobalWidth,Option.size() + 8);
2160 }
2161 }
2162}
2163
2164staticconstsize_tMaxOptWidth = 8;// arbitrary spacing for printOptionDiff
2165
2166// printGenericOptionDiff - Print the value of this option and it's default.
2167//
2168// "Generic" options have each value mapped to a name.
2169voidgeneric_parser_base::printGenericOptionDiff(
2170constOption &O,constGenericOptionValue &Value,
2171constGenericOptionValue &Default,size_t GlobalWidth) const{
2172outs() <<" " << PrintArg(O.ArgStr);
2173outs().indent(GlobalWidth - O.ArgStr.size());
2174
2175unsigned NumOpts =getNumOptions();
2176for (unsigned i = 0; i != NumOpts; ++i) {
2177if (!Value.compare(getOptionValue(i)))
2178continue;
2179
2180outs() <<"= " <<getOption(i);
2181size_t L =getOption(i).size();
2182size_t NumSpaces =MaxOptWidth > L ?MaxOptWidth - L : 0;
2183outs().indent(NumSpaces) <<" (default: ";
2184for (unsigned j = 0; j != NumOpts; ++j) {
2185if (!Default.compare(getOptionValue(j)))
2186continue;
2187outs() <<getOption(j);
2188break;
2189 }
2190outs() <<")\n";
2191return;
2192 }
2193outs() <<"= *unknown option value*\n";
2194}
2195
2196// printOptionDiff - Specializations for printing basic value types.
2197//
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); \
2202 std::string Str; \
2203 { \
2204 raw_string_ostream SS(Str); \
2205 SS << V; \
2206 } \
2207 outs() << "= " << Str; \
2208 size_t NumSpaces = \
2209 MaxOptWidth > Str.size() ? MaxOptWidth - Str.size() : 0; \
2210 outs().indent(NumSpaces) << " (default: "; \
2211 if (D.hasValue()) \
2212 outs() << D.getValue(); \
2213 else \
2214 outs() << "*no default*"; \
2215 outs() << ")\n"; \
2216 }
2217
2218PRINT_OPT_DIFF(bool)
2219PRINT_OPT_DIFF(boolOrDefault)
2220PRINT_OPT_DIFF(int)
2221PRINT_OPT_DIFF(long)
2222PRINT_OPT_DIFF(longlong)
2223PRINT_OPT_DIFF(unsigned)
2224PRINT_OPT_DIFF(unsignedlong)
2225PRINT_OPT_DIFF(unsignedlonglong)
2226PRINT_OPT_DIFF(double)
2227PRINT_OPT_DIFF(float)
2228PRINT_OPT_DIFF(char)
2229
2230voidparser<std::string>::printOptionDiff(constOption &O,StringRef V,
2231constOptionValue<std::string> &D,
2232size_t GlobalWidth) const{
2233 printOptionName(O, GlobalWidth);
2234outs() <<"= " << V;
2235size_t NumSpaces =MaxOptWidth > V.size() ?MaxOptWidth - V.size() : 0;
2236outs().indent(NumSpaces) <<" (default: ";
2237if (D.hasValue())
2238outs() <<D.getValue();
2239else
2240outs() <<"*no default*";
2241outs() <<")\n";
2242}
2243
2244// Print a placeholder for options that don't yet support printOptionDiff().
2245voidbasic_parser_impl::printOptionNoValue(constOption &O,
2246size_t GlobalWidth) const{
2247printOptionName(O, GlobalWidth);
2248outs() <<"= *cannot print option value*\n";
2249}
2250
2251//===----------------------------------------------------------------------===//
2252// -help and -help-hidden option implementation
2253//
2254
2255staticintOptNameCompare(const std::pair<const char *, Option *> *LHS,
2256const std::pair<const char *, Option *> *RHS) {
2257return strcmp(LHS->first,RHS->first);
2258}
2259
2260staticintSubNameCompare(const std::pair<const char *, SubCommand *> *LHS,
2261const std::pair<const char *, SubCommand *> *RHS) {
2262return strcmp(LHS->first,RHS->first);
2263}
2264
2265// Copy Options into a vector so we can sort them as we like.
2266staticvoidsortOpts(StringMap<Option *> &OptMap,
2267SmallVectorImpl<std::pair<const char *, Option *>> &Opts,
2268bool ShowHidden) {
2269SmallPtrSet<Option *, 32> OptionSet;// Duplicate option detection.
2270
2271for (StringMap<Option *>::iteratorI = OptMap.begin(), E = OptMap.end();
2272I != E; ++I) {
2273// Ignore really-hidden options.
2274if (I->second->getOptionHiddenFlag() ==ReallyHidden)
2275continue;
2276
2277// Unless showhidden is set, ignore hidden flags.
2278if (I->second->getOptionHiddenFlag() ==Hidden && !ShowHidden)
2279continue;
2280
2281// If we've already seen this option, don't add it to the list again.
2282if (!OptionSet.insert(I->second).second)
2283continue;
2284
2285 Opts.push_back(
2286 std::pair<const char *, Option *>(I->getKey().data(),I->second));
2287 }
2288
2289// Sort the options list alphabetically.
2290array_pod_sort(Opts.begin(), Opts.end(),OptNameCompare);
2291}
2292
2293staticvoid
2294sortSubCommands(constSmallPtrSetImpl<SubCommand *> &SubMap,
2295SmallVectorImpl<std::pair<const char *, SubCommand *>> &Subs) {
2296for (auto *S : SubMap) {
2297if (S->getName().empty())
2298continue;
2299 Subs.push_back(std::make_pair(S->getName().data(), S));
2300 }
2301array_pod_sort(Subs.begin(), Subs.end(),SubNameCompare);
2302}
2303
2304namespace{
2305
2306classHelpPrinter {
2307protected:
2308constbool ShowHidden;
2309typedefSmallVector<std::pair<const char *, Option *>, 128>
2310 StrOptionPairVector;
2311typedefSmallVector<std::pair<const char *, SubCommand *>, 128>
2312 StrSubCommandPairVector;
2313// Print the options. Opts is assumed to be alphabetically sorted.
2314virtualvoid printOptions(StrOptionPairVector &Opts,size_t MaxArgLen) {
2315for (size_t i = 0, e = Opts.size(); i != e; ++i)
2316 Opts[i].second->printOptionInfo(MaxArgLen);
2317 }
2318
2319void printSubCommands(StrSubCommandPairVector &Subs,size_t MaxSubLen) {
2320for (constauto &S : Subs) {
2321outs() <<" " << S.first;
2322if (!S.second->getDescription().empty()) {
2323outs().indent(MaxSubLen - strlen(S.first));
2324outs() <<" - " << S.second->getDescription();
2325 }
2326outs() <<"\n";
2327 }
2328 }
2329
2330public:
2331explicit HelpPrinter(bool showHidden) : ShowHidden(showHidden) {}
2332virtual ~HelpPrinter() =default;
2333
2334// Invoke the printer.
2335void operator=(boolValue) {
2336if (!Value)
2337return;
2338 printHelp();
2339
2340// Halt the program since help information was printed
2341 exit(0);
2342 }
2343
2344void printHelp() {
2345SubCommand *Sub =GlobalParser->getActiveSubCommand();
2346auto &OptionsMap = Sub->OptionsMap;
2347auto &PositionalOpts = Sub->PositionalOpts;
2348auto &ConsumeAfterOpt = Sub->ConsumeAfterOpt;
2349
2350 StrOptionPairVector Opts;
2351sortOpts(OptionsMap, Opts, ShowHidden);
2352
2353 StrSubCommandPairVector Subs;
2354sortSubCommands(GlobalParser->RegisteredSubCommands, Subs);
2355
2356if (!GlobalParser->ProgramOverview.empty())
2357outs() <<"OVERVIEW: " <<GlobalParser->ProgramOverview <<"\n";
2358
2359if (Sub == &SubCommand::getTopLevel()) {
2360outs() <<"USAGE: " <<GlobalParser->ProgramName;
2361if (!Subs.empty())
2362outs() <<" [subcommand]";
2363outs() <<" [options]";
2364 }else {
2365if (!Sub->getDescription().empty()) {
2366outs() <<"SUBCOMMAND '" << Sub->getName()
2367 <<"': " << Sub->getDescription() <<"\n\n";
2368 }
2369outs() <<"USAGE: " <<GlobalParser->ProgramName <<" " << Sub->getName()
2370 <<" [options]";
2371 }
2372
2373for (auto *Opt : PositionalOpts) {
2374if (Opt->hasArgStr())
2375outs() <<" --" << Opt->ArgStr;
2376outs() <<" " << Opt->HelpStr;
2377 }
2378
2379// Print the consume after option info if it exists...
2380if (ConsumeAfterOpt)
2381outs() <<" " << ConsumeAfterOpt->HelpStr;
2382
2383if (Sub == &SubCommand::getTopLevel() && !Subs.empty()) {
2384// Compute the maximum subcommand length...
2385size_t MaxSubLen = 0;
2386for (size_t i = 0, e = Subs.size(); i != e; ++i)
2387 MaxSubLen = std::max(MaxSubLen, strlen(Subs[i].first));
2388
2389outs() <<"\n\n";
2390outs() <<"SUBCOMMANDS:\n\n";
2391 printSubCommands(Subs, MaxSubLen);
2392outs() <<"\n";
2393outs() <<" Type \"" <<GlobalParser->ProgramName
2394 <<" <subcommand> --help\" to get more help on a specific "
2395"subcommand";
2396 }
2397
2398outs() <<"\n\n";
2399
2400// Compute the maximum argument length...
2401size_t MaxArgLen = 0;
2402for (size_t i = 0, e = Opts.size(); i != e; ++i)
2403 MaxArgLen = std::max(MaxArgLen, Opts[i].second->getOptionWidth());
2404
2405outs() <<"OPTIONS:\n";
2406 printOptions(Opts, MaxArgLen);
2407
2408// Print any extra help the user has declared.
2409for (constauto &I :GlobalParser->MoreHelp)
2410outs() <<I;
2411GlobalParser->MoreHelp.clear();
2412 }
2413};
2414
2415classCategorizedHelpPrinter :public HelpPrinter {
2416public:
2417explicit CategorizedHelpPrinter(bool showHidden) : HelpPrinter(showHidden) {}
2418
2419// Helper function for printOptions().
2420// It shall return a negative value if A's name should be lexicographically
2421// ordered before B's name. It returns a value greater than zero if B's name
2422// should be ordered before A's name, and it returns 0 otherwise.
2423staticint OptionCategoryCompare(OptionCategory *const *A,
2424OptionCategory *const *B) {
2425return (*A)->getName().compare((*B)->getName());
2426 }
2427
2428// Make sure we inherit our base class's operator=()
2429usingHelpPrinter::operator=;
2430
2431protected:
2432void printOptions(StrOptionPairVector &Opts,size_t MaxArgLen) override{
2433 std::vector<OptionCategory *> SortedCategories;
2434DenseMap<OptionCategory *, std::vector<Option *>> CategorizedOptions;
2435
2436// Collect registered option categories into vector in preparation for
2437// sorting.
2438for (OptionCategory *Category :GlobalParser->RegisteredOptionCategories)
2439 SortedCategories.push_back(Category);
2440
2441// Sort the different option categories alphabetically.
2442assert(SortedCategories.size() > 0 &&"No option categories registered!");
2443array_pod_sort(SortedCategories.begin(), SortedCategories.end(),
2444 OptionCategoryCompare);
2445
2446// Walk through pre-sorted options and assign into categories.
2447// Because the options are already alphabetically sorted the
2448// options within categories will also be alphabetically sorted.
2449for (size_tI = 0,E = Opts.size();I !=E; ++I) {
2450Option *Opt = Opts[I].second;
2451for (auto &Cat : Opt->Categories) {
2452assert(llvm::is_contained(SortedCategories, Cat) &&
2453"Option has an unregistered category");
2454 CategorizedOptions[Cat].push_back(Opt);
2455 }
2456 }
2457
2458// Now do printing.
2459for (OptionCategory *Category : SortedCategories) {
2460// Hide empty categories for --help, but show for --help-hidden.
2461constauto &CategoryOptions = CategorizedOptions[Category];
2462if (CategoryOptions.empty())
2463continue;
2464
2465// Print category information.
2466outs() <<"\n";
2467outs() << Category->getName() <<":\n";
2468
2469// Check if description is set.
2470if (!Category->getDescription().empty())
2471outs() << Category->getDescription() <<"\n\n";
2472else
2473outs() <<"\n";
2474
2475// Loop over the options in the category and print.
2476for (constOption *Opt : CategoryOptions)
2477 Opt->printOptionInfo(MaxArgLen);
2478 }
2479 }
2480};
2481
2482// This wraps the Uncategorizing and Categorizing printers and decides
2483// at run time which should be invoked.
2484classHelpPrinterWrapper {
2485private:
2486 HelpPrinter &UncategorizedPrinter;
2487 CategorizedHelpPrinter &CategorizedPrinter;
2488
2489public:
2490explicit HelpPrinterWrapper(HelpPrinter &UncategorizedPrinter,
2491 CategorizedHelpPrinter &CategorizedPrinter)
2492 : UncategorizedPrinter(UncategorizedPrinter),
2493 CategorizedPrinter(CategorizedPrinter) {}
2494
2495// Invoke the printer.
2496void operator=(boolValue);
2497};
2498
2499}// End anonymous namespace
2500
2501#if defined(__GNUC__)
2502// GCC and GCC-compatible compilers define __OPTIMIZE__ when optimizations are
2503// enabled.
2504# if defined(__OPTIMIZE__)
2505# define LLVM_IS_DEBUG_BUILD 0
2506# else
2507# define LLVM_IS_DEBUG_BUILD 1
2508# endif
2509#elif defined(_MSC_VER)
2510// MSVC doesn't have a predefined macro indicating if optimizations are enabled.
2511// Use _DEBUG instead. This macro actually corresponds to the choice between
2512// debug and release CRTs, but it is a reasonable proxy.
2513# if defined(_DEBUG)
2514# define LLVM_IS_DEBUG_BUILD 1
2515# else
2516# define LLVM_IS_DEBUG_BUILD 0
2517# endif
2518#else
2519// Otherwise, for an unknown compiler, assume this is an optimized build.
2520# define LLVM_IS_DEBUG_BUILD 0
2521#endif
2522
2523namespace{
2524classVersionPrinter {
2525public:
2526voidprint(std::vector<VersionPrinterTy> ExtraPrinters = {}) {
2527raw_ostream &OS =outs();
2528#ifdef PACKAGE_VENDOR
2529OS << PACKAGE_VENDOR <<" ";
2530#else
2531OS <<"LLVM (http://llvm.org/):\n ";
2532#endif
2533OS << PACKAGE_NAME <<" version " << PACKAGE_VERSION <<"\n ";
2534#if LLVM_IS_DEBUG_BUILD
2535OS <<"DEBUG build";
2536#else
2537OS <<"Optimized build";
2538#endif
2539#ifndef NDEBUG
2540OS <<" with assertions";
2541#endif
2542OS <<".\n";
2543
2544// Iterate over any registered extra printers and call them to add further
2545// information.
2546if (!ExtraPrinters.empty()) {
2547for (constauto &I : ExtraPrinters)
2548I(outs());
2549 }
2550 }
2551void operator=(bool OptionWasSpecified);
2552};
2553
2554structCommandLineCommonOptions {
2555// Declare the four HelpPrinter instances that are used to print out help, or
2556// help-hidden as an uncategorized list or in categories.
2557 HelpPrinter UncategorizedNormalPrinter{false};
2558 HelpPrinter UncategorizedHiddenPrinter{true};
2559 CategorizedHelpPrinter CategorizedNormalPrinter{false};
2560 CategorizedHelpPrinter CategorizedHiddenPrinter{true};
2561// Declare HelpPrinter wrappers that will decide whether or not to invoke
2562// a categorizing help printer
2563 HelpPrinterWrapper WrappedNormalPrinter{UncategorizedNormalPrinter,
2564 CategorizedNormalPrinter};
2565 HelpPrinterWrapper WrappedHiddenPrinter{UncategorizedHiddenPrinter,
2566 CategorizedHiddenPrinter};
2567// Define a category for generic options that all tools should have.
2568cl::OptionCategory GenericCategory{"Generic Options"};
2569
2570// Define uncategorized help printers.
2571// --help-list is hidden by default because if Option categories are being
2572// used then --help behaves the same as --help-list.
2573cl::opt<HelpPrinter, true, parser<bool>> HLOp{
2574"help-list",
2575cl::desc(
2576"Display list of available options (--help-list-hidden for more)"),
2577cl::location(UncategorizedNormalPrinter),
2578cl::Hidden,
2579cl::ValueDisallowed,
2580cl::cat(GenericCategory),
2581cl::sub(SubCommand::getAll())};
2582
2583cl::opt<HelpPrinter, true, parser<bool>> HLHOp{
2584"help-list-hidden",
2585cl::desc("Display list of all available options"),
2586cl::location(UncategorizedHiddenPrinter),
2587cl::Hidden,
2588cl::ValueDisallowed,
2589cl::cat(GenericCategory),
2590cl::sub(SubCommand::getAll())};
2591
2592// Define uncategorized/categorized help printers. These printers change their
2593// behaviour at runtime depending on whether one or more Option categories
2594// have been declared.
2595cl::opt<HelpPrinterWrapper, true, parser<bool>> HOp{
2596"help",
2597cl::desc("Display available options (--help-hidden for more)"),
2598cl::location(WrappedNormalPrinter),
2599cl::ValueDisallowed,
2600cl::cat(GenericCategory),
2601cl::sub(SubCommand::getAll())};
2602
2603cl::alias HOpA{"h",cl::desc("Alias for --help"),cl::aliasopt(HOp),
2604cl::DefaultOption};
2605
2606cl::opt<HelpPrinterWrapper, true, parser<bool>> HHOp{
2607"help-hidden",
2608cl::desc("Display all available options"),
2609cl::location(WrappedHiddenPrinter),
2610cl::Hidden,
2611cl::ValueDisallowed,
2612cl::cat(GenericCategory),
2613cl::sub(SubCommand::getAll())};
2614
2615cl::opt<bool> PrintOptions{
2616"print-options",
2617cl::desc("Print non-default options after command line parsing"),
2618cl::Hidden,
2619cl::init(false),
2620cl::cat(GenericCategory),
2621cl::sub(SubCommand::getAll())};
2622
2623cl::opt<bool> PrintAllOptions{
2624"print-all-options",
2625cl::desc("Print all option values after command line parsing"),
2626cl::Hidden,
2627cl::init(false),
2628cl::cat(GenericCategory),
2629cl::sub(SubCommand::getAll())};
2630
2631VersionPrinterTy OverrideVersionPrinter =nullptr;
2632
2633 std::vector<VersionPrinterTy> ExtraVersionPrinters;
2634
2635// Define the --version option that prints out the LLVM version for the tool
2636 VersionPrinter VersionPrinterInstance;
2637
2638cl::opt<VersionPrinter, true, parser<bool>> VersOp{
2639"version",cl::desc("Display the version of this program"),
2640cl::location(VersionPrinterInstance),cl::ValueDisallowed,
2641cl::cat(GenericCategory)};
2642};
2643}// End anonymous namespace
2644
2645// Lazy-initialized global instance of options controlling the command-line
2646// parser and general handling.
2647staticManagedStatic<CommandLineCommonOptions>CommonOptions;
2648
2649staticvoidinitCommonOptions() {
2650 *CommonOptions;
2651initDebugCounterOptions();
2652initGraphWriterOptions();
2653initSignalsOptions();
2654initStatisticOptions();
2655initTimerOptions();
2656initTypeSizeOptions();
2657initWithColorOptions();
2658initDebugOptions();
2659initRandomSeedOptions();
2660}
2661
2662OptionCategory &cl::getGeneralCategory() {
2663// Initialise the general option category.
2664staticOptionCategory GeneralCategory{"General options"};
2665return GeneralCategory;
2666}
2667
2668void VersionPrinter::operator=(bool OptionWasSpecified) {
2669if (!OptionWasSpecified)
2670return;
2671
2672if (CommonOptions->OverrideVersionPrinter !=nullptr) {
2673CommonOptions->OverrideVersionPrinter(outs());
2674 exit(0);
2675 }
2676print(CommonOptions->ExtraVersionPrinters);
2677
2678 exit(0);
2679}
2680
2681void HelpPrinterWrapper::operator=(boolValue) {
2682if (!Value)
2683return;
2684
2685// Decide which printer to invoke. If more than one option category is
2686// registered then it is useful to show the categorized help instead of
2687// uncategorized help.
2688if (GlobalParser->RegisteredOptionCategories.size() > 1) {
2689// unhide --help-list option so user can have uncategorized output if they
2690// want it.
2691CommonOptions->HLOp.setHiddenFlag(NotHidden);
2692
2693 CategorizedPrinter =true;// Invoke categorized printer
2694 }else
2695 UncategorizedPrinter =true;// Invoke uncategorized printer
2696}
2697
2698// Print the value of each option.
2699voidcl::PrintOptionValues() {GlobalParser->printOptionValues(); }
2700
2701void CommandLineParser::printOptionValues() {
2702if (!CommonOptions->PrintOptions && !CommonOptions->PrintAllOptions)
2703return;
2704
2705SmallVector<std::pair<const char *, Option *>, 128> Opts;
2706sortOpts(ActiveSubCommand->OptionsMap, Opts,/*ShowHidden*/true);
2707
2708// Compute the maximum argument length...
2709size_t MaxArgLen = 0;
2710for (size_t i = 0, e = Opts.size(); i != e; ++i)
2711 MaxArgLen = std::max(MaxArgLen, Opts[i].second->getOptionWidth());
2712
2713for (size_t i = 0, e = Opts.size(); i != e; ++i)
2714 Opts[i].second->printOptionValue(MaxArgLen,CommonOptions->PrintAllOptions);
2715}
2716
2717// Utility function for printing the help message.
2718voidcl::PrintHelpMessage(boolHidden,bool Categorized) {
2719if (!Hidden && !Categorized)
2720CommonOptions->UncategorizedNormalPrinter.printHelp();
2721elseif (!Hidden && Categorized)
2722CommonOptions->CategorizedNormalPrinter.printHelp();
2723elseif (Hidden && !Categorized)
2724CommonOptions->UncategorizedHiddenPrinter.printHelp();
2725else
2726CommonOptions->CategorizedHiddenPrinter.printHelp();
2727}
2728
2729ArrayRef<StringRef>cl::getCompilerBuildConfig() {
2730staticconstStringRefConfig[] = {
2731// Placeholder to ensure the array always has elements, since it's an
2732// error to have a zero-sized array. Slice this off before returning.
2733"",
2734// Actual compiler build config feature list:
2735#if LLVM_IS_DEBUG_BUILD
2736"+unoptimized",
2737#endif
2738#ifndef NDEBUG
2739"+assertions",
2740#endif
2741#ifdef EXPENSIVE_CHECKS
2742"+expensive-checks",
2743#endif
2744#if __has_feature(address_sanitizer)
2745"+asan",
2746#endif
2747#if __has_feature(dataflow_sanitizer)
2748"+dfsan",
2749#endif
2750#if __has_feature(hwaddress_sanitizer)
2751"+hwasan",
2752#endif
2753#if __has_feature(memory_sanitizer)
2754"+msan",
2755#endif
2756#if __has_feature(thread_sanitizer)
2757"+tsan",
2758#endif
2759#if __has_feature(undefined_behavior_sanitizer)
2760"+ubsan",
2761#endif
2762 };
2763returnArrayRef(Config).drop_front(1);
2764}
2765
2766// Utility function for printing the build config.
2767voidcl::printBuildConfig(raw_ostream &OS) {
2768#if LLVM_VERSION_PRINTER_SHOW_BUILD_CONFIG
2769OS <<"Build config: ";
2770llvm::interleaveComma(cl::getCompilerBuildConfig(),OS);
2771OS <<'\n';
2772#endif
2773}
2774
2775/// Utility function for printing version number.
2776voidcl::PrintVersionMessage() {
2777CommonOptions->VersionPrinterInstance.print(CommonOptions->ExtraVersionPrinters);
2778}
2779
2780voidcl::SetVersionPrinter(VersionPrinterTyfunc) {
2781CommonOptions->OverrideVersionPrinter =func;
2782}
2783
2784voidcl::AddExtraVersionPrinter(VersionPrinterTyfunc) {
2785CommonOptions->ExtraVersionPrinters.push_back(func);
2786}
2787
2788StringMap<Option *> &cl::getRegisteredOptions(SubCommand &Sub) {
2789initCommonOptions();
2790auto &Subs =GlobalParser->RegisteredSubCommands;
2791 (void)Subs;
2792assert(Subs.contains(&Sub));
2793return Sub.OptionsMap;
2794}
2795
2796iterator_range<typename SmallPtrSet<SubCommand *, 4>::iterator>
2797cl::getRegisteredSubcommands() {
2798returnGlobalParser->getRegisteredSubcommands();
2799}
2800
2801voidcl::HideUnrelatedOptions(cl::OptionCategory &Category,SubCommand &Sub) {
2802initCommonOptions();
2803for (auto &I : Sub.OptionsMap) {
2804bool Unrelated =true;
2805for (auto &Cat :I.second->Categories) {
2806if (Cat == &Category || Cat == &CommonOptions->GenericCategory)
2807 Unrelated =false;
2808 }
2809if (Unrelated)
2810I.second->setHiddenFlag(cl::ReallyHidden);
2811 }
2812}
2813
2814voidcl::HideUnrelatedOptions(ArrayRef<const cl::OptionCategory *> Categories,
2815SubCommand &Sub) {
2816initCommonOptions();
2817for (auto &I : Sub.OptionsMap) {
2818bool Unrelated =true;
2819for (auto &Cat :I.second->Categories) {
2820if (is_contained(Categories, Cat) ||
2821 Cat == &CommonOptions->GenericCategory)
2822 Unrelated =false;
2823 }
2824if (Unrelated)
2825I.second->setHiddenFlag(cl::ReallyHidden);
2826 }
2827}
2828
2829voidcl::ResetCommandLineParser() {GlobalParser->reset(); }
2830voidcl::ResetAllOptionOccurrences() {
2831GlobalParser->ResetAllOptionOccurrences();
2832}
2833
2834voidLLVMParseCommandLineOptions(int argc,constchar *const *argv,
2835constchar *Overview) {
2836llvm::cl::ParseCommandLineOptions(argc, argv,StringRef(Overview),
2837 &llvm::nulls());
2838}
StringMap.h
This file defines the StringMap class.
print
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
Definition:ArchiveWriter.cpp:205
ArrayRef.h
B
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
A
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
D
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
E
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
CommaSeparateAndAddOccurrence
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:619
OptionPrefix
static StringRef OptionPrefix
Definition:CommandLine.cpp:2081
RequiresValue
static bool RequiresValue(const Option *O)
Definition:CommandLine.cpp:801
SubNameCompare
static int SubNameCompare(const std::pair< const char *, SubCommand * > *LHS, const std::pair< const char *, SubCommand * > *RHS)
Definition:CommandLine.cpp:2260
argPlusPrefixesSize
static size_t argPlusPrefixesSize(StringRef ArgName, size_t Pad=DefaultPad)
Definition:CommandLine.cpp:105
isPrefixedOrGrouping
static bool isPrefixedOrGrouping(const Option *O)
Definition:CommandLine.cpp:125
shouldPrintOption
static bool shouldPrintOption(StringRef Name, StringRef Description, const Option &O)
Definition:CommandLine.cpp:2086
AllSubCommands
static ManagedStatic< SubCommand > AllSubCommands
Definition:CommandLine.cpp:477
HandlePrefixedOrGroupedOption
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:747
parseDouble
static bool parseDouble(Option &O, StringRef Arg, double &Value)
Definition:CommandLine.cpp:2043
parseBool
static bool parseBool(Option &O, StringRef ArgName, StringRef Arg, T &Value)
Definition:CommandLine.cpp:408
DefaultPad
static const size_t DefaultPad
Definition:CommandLine.cpp:99
EmptyOption
static StringRef EmptyOption
Definition:CommandLine.cpp:2080
hasUTF8ByteOrderMark
static bool hasUTF8ByteOrderMark(ArrayRef< char > S)
Definition:CommandLine.cpp:1114
GlobalParser
static ManagedStatic< CommandLineParser > GlobalParser
Definition:CommandLine.cpp:405
ExpandBasePaths
static void ExpandBasePaths(StringRef BasePath, StringSaver &Saver, const char *&Arg)
Definition:CommandLine.cpp:1119
argPrefix
static SmallString< 8 > argPrefix(StringRef ArgName, size_t Pad=DefaultPad)
Definition:CommandLine.cpp:112
ArgHelpPrefix
static StringRef ArgHelpPrefix
Definition:CommandLine.cpp:103
isWindowsSpecialCharInCommandName
static bool isWindowsSpecialCharInCommandName(char C)
Definition:CommandLine.cpp:926
getOptionPred
static Option * getOptionPred(StringRef Name, size_t &Length, bool(*Pred)(const Option *), const StringMap< Option * > &OptionsMap)
Definition:CommandLine.cpp:718
getValueStr
static StringRef getValueStr(const Option &O, StringRef DefaultMsg)
Definition:CommandLine.cpp:1874
getOptionPrefixesSize
static size_t getOptionPrefixesSize()
Definition:CommandLine.cpp:2082
ProvideOption
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:647
isQuote
static bool isQuote(char C)
Definition:CommandLine.cpp:819
CommonOptions
static ManagedStatic< CommandLineCommonOptions > CommonOptions
Definition:CommandLine.cpp:2647
initCommonOptions
static void initCommonOptions()
Definition:CommandLine.cpp:2649
tokenizeWindowsCommandLineImpl
static void tokenizeWindowsCommandLineImpl(StringRef Src, StringSaver &Saver, function_ref< void(StringRef)> AddToken, bool AlwaysCopy, function_ref< void()> MarkEOL, bool InitialCommandName)
Definition:CommandLine.cpp:932
isWhitespace
static bool isWhitespace(char C)
Definition:CommandLine.cpp:811
TopLevelSubCommand
static LLVM_REQUIRE_CONSTANT_INITIALIZATION ManagedStatic< SubCommand > TopLevelSubCommand
Definition:CommandLine.cpp:474
parseBackslash
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:899
ArgPrefixLong
static StringRef ArgPrefixLong
Definition:CommandLine.cpp:102
sortSubCommands
static void sortSubCommands(const SmallPtrSetImpl< SubCommand * > &SubMap, SmallVectorImpl< std::pair< const char *, SubCommand * > > &Subs)
Definition:CommandLine.cpp:2294
PRINT_OPT_DIFF
#define PRINT_OPT_DIFF(T)
Definition:CommandLine.cpp:2198
isWhitespaceOrNull
static bool isWhitespaceOrNull(char C)
Definition:CommandLine.cpp:815
EqValue
static StringRef EqValue
Definition:CommandLine.cpp:2079
MaxOptWidth
static const size_t MaxOptWidth
Definition:CommandLine.cpp:2164
LookupNearestOption
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:570
EatsUnboundedNumberOfValues
static bool EatsUnboundedNumberOfValues(const Option *O)
Definition:CommandLine.cpp:806
OptNameCompare
static int OptNameCompare(const std::pair< const char *, Option * > *LHS, const std::pair< const char *, Option * > *RHS)
Definition:CommandLine.cpp:2255
sortOpts
static void sortOpts(StringMap< Option * > &OptMap, SmallVectorImpl< std::pair< const char *, Option * > > &Opts, bool ShowHidden)
Definition:CommandLine.cpp:2266
ArgPrefix
static StringRef ArgPrefix
Definition:CommandLine.cpp:101
isWindowsSpecialChar
static bool isWindowsSpecialChar(char C)
Definition:CommandLine.cpp:923
isGrouping
static bool isGrouping(const Option *O)
Definition:CommandLine.cpp:122
CommandLine.h
LLVM_REQUIRE_CONSTANT_INITIALIZATION
#define LLVM_REQUIRE_CONSTANT_INITIALIZATION
LLVM_REQUIRE_CONSTANT_INITIALIZATION - Apply this to globals to ensure that they are constant initial...
Definition:Compiler.h:397
ConvertUTF.h
DebugOptions.h
Debug.h
LLVM_DEBUG
#define LLVM_DEBUG(...)
Definition:Debug.h:106
Name
std::string Name
Definition:ELFObjHandler.cpp:77
Size
uint64_t Size
Definition:ELFObjHandler.cpp:81
End
bool End
Definition:ELF_riscv.cpp:480
Config
RelaxConfig Config
Definition:ELF_riscv.cpp:506
FileSystem.h
func
global merge func
Definition:GlobalMergeFunctions.cpp:622
Help
static void Help(ArrayRef< StringRef > CPUNames, ArrayRef< SubtargetFeatureKV > FeatTable)
Display help for feature and mcpu choices.
Definition:MCSubtargetInfo.cpp:103
F
#define F(x, y, z)
Definition:MD5.cpp:55
I
#define I(x, y, z)
Definition:MD5.cpp:58
ManagedStatic.h
MemoryBuffer.h
Path.h
Process.h
Provides a library for accessing information about this process and other processes on the operating ...
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
STLFunctionalExtras.h
OS
raw_pwrite_stream & OS
Definition:SampleProfWriter.cpp:51
SmallPtrSet.h
This file defines the SmallPtrSet class.
SmallString.h
This file defines the SmallString class.
StringExtras.h
This file contains some functions that are useful when dealing with strings.
StringRef.h
StringSaver.h
Twine.h
VirtualFileSystem.h
Defines the virtual file system interface vfs::FileSystem.
RHS
Value * RHS
Definition:X86PartialReduction.cpp:74
LHS
Value * LHS
Definition:X86PartialReduction.cpp:73
StringMapConstIterator< ValueTy >
T
bool
llvm::ArrayRef
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition:ArrayRef.h:41
llvm::ArrayRef::drop_front
ArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
Definition:ArrayRef.h:207
llvm::ArrayRef::size
size_t size() const
size - Get the array size.
Definition:ArrayRef.h:168
llvm::BumpPtrAllocatorImpl
Allocate memory in an ever growing pool, as if by bump-pointer.
Definition:Allocator.h:66
llvm::DenseMap
Definition:DenseMap.h:727
llvm::ErrorOr
Represents either an error or a value T.
Definition:ErrorOr.h:56
llvm::ErrorOr::get
reference get()
Definition:ErrorOr.h:149
llvm::ErrorOr::getError
std::error_code getError() const
Definition:ErrorOr.h:152
llvm::Error
Lightweight error class with error context and mandatory checking.
Definition:Error.h:160
llvm::Error::success
static ErrorSuccess success()
Create a success value.
Definition:Error.h:337
llvm::ManagedStatic
ManagedStatic - This transparently changes the behavior of global statics to be lazily constructed on...
Definition:ManagedStatic.h:83
llvm::MemoryBuffer
This interface provides simple read-only access to a block of memory, and provides simple methods for...
Definition:MemoryBuffer.h:51
llvm::MemoryBuffer::getBufferSize
size_t getBufferSize() const
Definition:MemoryBuffer.h:68
llvm::MemoryBuffer::getBufferEnd
const char * getBufferEnd() const
Definition:MemoryBuffer.h:67
llvm::MemoryBuffer::getBufferStart
const char * getBufferStart() const
Definition:MemoryBuffer.h:66
llvm::Record
Definition:Record.h:1596
llvm::SmallPtrSetImplBase::clear
void clear()
Definition:SmallPtrSet.h:97
llvm::SmallPtrSetImpl
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
Definition:SmallPtrSet.h:363
llvm::SmallPtrSetImpl::insert
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition:SmallPtrSet.h:384
llvm::SmallPtrSet
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition:SmallPtrSet.h:519
llvm::SmallString
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition:SmallString.h:26
llvm::SmallString::assign
void assign(StringRef RHS)
Assign from a StringRef.
Definition:SmallString.h:51
llvm::SmallString::append
void append(StringRef RHS)
Append from a StringRef.
Definition:SmallString.h:68
llvm::SmallString::c_str
const char * c_str()
Definition:SmallString.h:259
llvm::SmallString::str
StringRef str() const
Explicit conversion to StringRef.
Definition:SmallString.h:254
llvm::SmallVectorBase::empty
bool empty() const
Definition:SmallVector.h:81
llvm::SmallVectorBase::size
size_t size() const
Definition:SmallVector.h:78
llvm::SmallVectorImpl
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition:SmallVector.h:573
llvm::SmallVectorImpl::assign
void assign(size_type NumElts, ValueParamT Elt)
Definition:SmallVector.h:704
llvm::SmallVectorImpl::erase
iterator erase(const_iterator CI)
Definition:SmallVector.h:737
llvm::SmallVectorImpl::append
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
Definition:SmallVector.h:683
llvm::SmallVectorImpl::insert
iterator insert(iterator I, T &&Elt)
Definition:SmallVector.h:805
llvm::SmallVectorImpl::clear
void clear()
Definition:SmallVector.h:610
llvm::SmallVectorTemplateBase::pop_back
void pop_back()
Definition:SmallVector.h:425
llvm::SmallVectorTemplateBase::push_back
void push_back(const T &Elt)
Definition:SmallVector.h:413
llvm::SmallVectorTemplateCommon::end
iterator end()
Definition:SmallVector.h:269
llvm::SmallVectorTemplateCommon::begin
iterator begin()
Definition:SmallVector.h:267
llvm::SmallVectorTemplateCommon::back
reference back()
Definition:SmallVector.h:308
llvm::SmallVector
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition:SmallVector.h:1196
llvm::StringLiteral
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
Definition:StringRef.h:853
llvm::StringMapIterator
Definition:StringMap.h:496
llvm::StringMap
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition:StringMap.h:128
llvm::StringMap::end
iterator end()
Definition:StringMap.h:220
llvm::StringMap::begin
iterator begin()
Definition:StringMap.h:219
llvm::StringMap::find
iterator find(StringRef Key)
Definition:StringMap.h:233
llvm::StringMap::count
size_type count(StringRef Key) const
count - Return 1 if the element is in the map, 0 otherwise.
Definition:StringMap.h:276
llvm::StringRef
StringRef - Represent a constant reference to a string, i.e.
Definition:StringRef.h:51
llvm::StringRef::split
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
Definition:StringRef.h:700
llvm::StringRef::getAsInteger
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
Definition:StringRef.h:470
llvm::StringRef::substr
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition:StringRef.h:571
llvm::StringRef::starts_with
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition:StringRef.h:265
llvm::StringRef::empty
constexpr bool empty() const
empty - Check if the string is empty.
Definition:StringRef.h:147
llvm::StringRef::edit_distance
unsigned edit_distance(StringRef Other, bool AllowReplacements=true, unsigned MaxEditDistance=0) const
Determine the edit distance between this string and another string.
Definition:StringRef.cpp:94
llvm::StringRef::size_type
size_t size_type
Definition:StringRef.h:57
llvm::StringRef::size
constexpr size_t size() const
size - Get the string size.
Definition:StringRef.h:150
llvm::StringRef::data
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition:StringRef.h:144
llvm::StringRef::consume_front
bool consume_front(StringRef Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
Definition:StringRef.h:635
llvm::StringRef::find
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
Definition:StringRef.h:297
llvm::StringRef::npos
static constexpr size_t npos
Definition:StringRef.h:53
llvm::StringSaver
Saves strings in the provided stable storage and returns a StringRef with a stable character pointer.
Definition:StringSaver.h:21
llvm::StringSaver::getAllocator
BumpPtrAllocator & getAllocator() const
Definition:StringSaver.h:27
llvm::StringSaver::save
StringRef save(const char *S)
Definition:StringSaver.h:30
llvm::Twine
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition:Twine.h:81
llvm::Value
LLVM Value Representation.
Definition:Value.h:74
llvm::cl::ExpansionContext
Contains options that control response file expansion.
Definition:CommandLine.h:2146
llvm::cl::ExpansionContext::findConfigFile
bool findConfigFile(StringRef FileName, SmallVectorImpl< char > &FilePath)
Looks for the specified configuration file.
Definition:CommandLine.cpp:1389
llvm::cl::ExpansionContext::ExpansionContext
ExpansionContext(BumpPtrAllocator &A, TokenizerCallback T)
Definition:CommandLine.cpp:1386
llvm::cl::ExpansionContext::expandResponseFiles
Error expandResponseFiles(SmallVectorImpl< const char * > &Argv)
Expands constructs "@file" in the provided array of arguments recursively.
Definition:CommandLine.cpp:1234
llvm::cl::ExpansionContext::readConfigFile
Error readConfigFile(StringRef CfgFile, SmallVectorImpl< const char * > &Argv)
Reads command line options from the given configuration file.
Definition:CommandLine.cpp:1426
llvm::cl::OptionCategory
Definition:CommandLine.h:179
llvm::cl::OptionCategory::getDescription
StringRef getDescription() const
Definition:CommandLine.h:194
llvm::cl::OptionCategory::getName
StringRef getName() const
Definition:CommandLine.h:193
llvm::cl::Option
Definition:CommandLine.h:250
llvm::cl::Option::Subs
SmallPtrSet< SubCommand *, 1 > Subs
Definition:CommandLine.h:287
llvm::cl::Option::ArgStr
StringRef ArgStr
Definition:CommandLine.h:282
llvm::cl::Option::getNumOccurrences
int getNumOccurrences() const
Definition:CommandLine.h:399
llvm::cl::Option::getValueExpectedFlag
enum ValueExpected getValueExpectedFlag() const
Definition:CommandLine.h:293
llvm::cl::Option::addCategory
void addCategory(OptionCategory &C)
Definition:CommandLine.cpp:447
llvm::cl::Option::addOccurrence
virtual bool addOccurrence(unsigned pos, StringRef ArgName, StringRef Value, bool MultiArg=false)
Definition:CommandLine.cpp:1863
llvm::cl::Option::setMiscFlag
void setMiscFlag(enum MiscFlags M)
Definition:CommandLine.h:329
llvm::cl::Option::getFormattingFlag
enum FormattingFlags getFormattingFlag() const
Definition:CommandLine.h:301
llvm::cl::Option::printOptionInfo
virtual void printOptionInfo(size_t GlobalWidth) const =0
llvm::cl::Option::getNumOccurrencesFlag
enum NumOccurrencesFlag getNumOccurrencesFlag() const
Definition:CommandLine.h:289
llvm::cl::Option::reset
void reset()
Definition:CommandLine.cpp:458
llvm::cl::Option::Categories
SmallVector< OptionCategory *, 1 > Categories
Definition:CommandLine.h:286
llvm::cl::Option::addArgument
void addArgument()
Definition:CommandLine.cpp:431
llvm::cl::Option::error
bool error(const Twine &Message, StringRef ArgName=StringRef(), raw_ostream &Errs=llvm::errs())
Definition:CommandLine.cpp:1851
llvm::cl::Option::setArgStr
void setArgStr(StringRef S)
Definition:CommandLine.cpp:438
llvm::cl::Option::hasArgStr
bool hasArgStr() const
Definition:CommandLine.h:310
llvm::cl::Option::isDefaultOption
bool isDefaultOption() const
Definition:CommandLine.h:313
llvm::cl::Option::getMiscFlags
unsigned getMiscFlags() const
Definition:CommandLine.h:305
llvm::cl::Option::setDefault
virtual void setDefault()=0
llvm::cl::Option::printEnumValHelpStr
static void printEnumValHelpStr(StringRef HelpStr, size_t Indent, size_t FirstLineIndentedBy)
Definition:CommandLine.cpp:1901
llvm::cl::Option::getNumAdditionalVals
unsigned getNumAdditionalVals() const
Definition:CommandLine.h:307
llvm::cl::Option::removeArgument
void removeArgument()
Unregisters this option from the CommandLine system.
Definition:CommandLine.cpp:436
llvm::cl::Option::printHelpStr
static void printHelpStr(StringRef HelpStr, size_t Indent, size_t FirstLineIndentedBy)
Definition:CommandLine.cpp:1889
llvm::cl::Option::HelpStr
StringRef HelpStr
Definition:CommandLine.h:283
llvm::cl::SubCommand
Definition:CommandLine.h:202
llvm::cl::SubCommand::getName
StringRef getName() const
Definition:CommandLine.h:229
llvm::cl::SubCommand::SinkOpts
SmallVector< Option *, 4 > SinkOpts
Definition:CommandLine.h:233
llvm::cl::SubCommand::getTopLevel
static SubCommand & getTopLevel()
Definition:CommandLine.cpp:479
llvm::cl::SubCommand::unregisterSubCommand
void unregisterSubCommand()
Definition:CommandLine.cpp:487
llvm::cl::SubCommand::getAll
static SubCommand & getAll()
Definition:CommandLine.cpp:481
llvm::cl::SubCommand::reset
void reset()
Definition:CommandLine.cpp:491
llvm::cl::SubCommand::registerSubCommand
void registerSubCommand()
Definition:CommandLine.cpp:483
llvm::cl::SubCommand::ConsumeAfterOpt
Option * ConsumeAfterOpt
Definition:CommandLine.h:236
llvm::cl::SubCommand::PositionalOpts
SmallVector< Option *, 4 > PositionalOpts
Definition:CommandLine.h:232
llvm::cl::SubCommand::OptionsMap
StringMap< Option * > OptionsMap
Definition:CommandLine.h:234
llvm::cl::SubCommand::getDescription
StringRef getDescription() const
Definition:CommandLine.h:230
llvm::cl::alias
Definition:CommandLine.h:1913
llvm::cl::basic_parser_impl::printOptionInfo
void printOptionInfo(const Option &O, size_t GlobalWidth) const
Definition:CommandLine.cpp:1944
llvm::cl::basic_parser_impl::anchor
virtual void anchor()
Definition:CommandLine.cpp:83
llvm::cl::basic_parser_impl::getValueName
virtual StringRef getValueName() const
Definition:CommandLine.h:919
llvm::cl::basic_parser_impl::printOptionNoValue
void printOptionNoValue(const Option &O, size_t GlobalWidth) const
Definition:CommandLine.cpp:2245
llvm::cl::basic_parser_impl::getOptionWidth
size_t getOptionWidth(const Option &O) const
Definition:CommandLine.cpp:1928
llvm::cl::basic_parser_impl::printOptionName
void printOptionName(const Option &O, size_t GlobalWidth) const
Definition:CommandLine.cpp:1963
llvm::cl::basic_parser
Definition:CommandLine.h:932
llvm::cl::generic_parser_base::getOptionWidth
virtual size_t getOptionWidth(const Option &O) const
Definition:CommandLine.cpp:2093
llvm::cl::generic_parser_base::getDescription
virtual StringRef getDescription(unsigned N) const =0
llvm::cl::generic_parser_base::getOptionValue
virtual const GenericOptionValue & getOptionValue(unsigned N) const =0
llvm::cl::generic_parser_base::getNumOptions
virtual unsigned getNumOptions() const =0
llvm::cl::generic_parser_base::getOption
virtual StringRef getOption(unsigned N) const =0
llvm::cl::generic_parser_base::printOptionDiff
void printOptionDiff(const Option &O, const AnyOptionValue &V, const AnyOptionValue &Default, size_t GlobalWidth) const
Definition:CommandLine.h:773
llvm::cl::generic_parser_base::printGenericOptionDiff
void printGenericOptionDiff(const Option &O, const GenericOptionValue &V, const GenericOptionValue &Default, size_t GlobalWidth) const
Definition:CommandLine.cpp:2169
llvm::cl::generic_parser_base::printOptionInfo
virtual void printOptionInfo(const Option &O, size_t GlobalWidth) const
Definition:CommandLine.cpp:2116
llvm::cl::generic_parser_base::findOption
unsigned findOption(StringRef Name)
Definition:CommandLine.cpp:2069
llvm::cl::opt
Definition:CommandLine.h:1423
llvm::cl::parser
Definition:CommandLine.h:823
llvm::cl::parser::parse
bool parse(Option &O, StringRef ArgName, StringRef Arg, DataType &V)
Definition:CommandLine.h:852
llvm::function_ref
An efficient, type-erasing, non-owning reference to a callable.
Definition:STLFunctionalExtras.h:37
llvm::iterator_range
A range adaptor for a pair of iterators.
Definition:iterator_range.h:42
llvm::raw_ostream
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition:raw_ostream.h:52
llvm::raw_ostream::indent
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
Definition:raw_ostream.cpp:495
llvm::sys::Process::GetEnv
static std::optional< std::string > GetEnv(StringRef name)
llvm::vfs::FileSystem::getCurrentWorkingDirectory
virtual llvm::ErrorOr< std::string > getCurrentWorkingDirectory() const =0
Get the working directory of this file system.
llvm::vfs::FileSystem::makeAbsolute
virtual std::error_code makeAbsolute(SmallVectorImpl< char > &Path) const
Make Path an absolute path.
Definition:VirtualFileSystem.cpp:128
llvm::vfs::FileSystem::getBufferForFile
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(const Twine &Name, int64_t FileSize=-1, bool RequiresNullTerminator=true, bool IsVolatile=false, bool IsText=true)
This is a convenience method that opens a file, gets its content and then closes the file.
Definition:VirtualFileSystem.cpp:118
llvm::vfs::FileSystem::status
virtual llvm::ErrorOr< Status > status(const Twine &Path)=0
Get the status of the entry at Path, if one exists.
llvm::vfs::Status
The result of a status operation.
Definition:VirtualFileSystem.h:48
llvm::vfs::Status::equivalent
bool equivalent(const Status &Other) const
Definition:VirtualFileSystem.cpp:92
LLVMParseCommandLineOptions
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:2834
Support.h
ErrorHandling.h
llvm_unreachable
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Definition:ErrorHandling.h:143
Error.h
llvm::CallingConv::C
@ C
The default llvm calling convention, compatible with C.
Definition:CallingConv.h:34
llvm::PPCISD::SC
@ SC
CHAIN = SC CHAIN, Imm128 - System call.
Definition:PPCISelLowering.h:429
llvm::RISCVFenceField::O
@ O
Definition:RISCVBaseInfo.h:372
llvm::XCOFF::NameSize
constexpr size_t NameSize
Definition:XCOFF.h:29
llvm::cl::VersionPrinterTy
std::function< void(raw_ostream &)> VersionPrinterTy
Definition:CommandLine.h:75
llvm::cl::TokenizerCallback
void(*)(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs) TokenizerCallback
String tokenization function type.
Definition:CommandLine.h:2130
llvm::cl::PrintVersionMessage
void PrintVersionMessage()
Utility function for printing version number.
Definition:CommandLine.cpp:2776
llvm::cl::ExpandResponseFiles
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:1376
llvm::cl::expandResponseFiles
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 ...
llvm::cl::TokenizeWindowsCommandLine
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:1041
llvm::cl::getGeneralCategory
OptionCategory & getGeneralCategory()
Definition:CommandLine.cpp:2662
llvm::cl::ConsumeAfter
@ ConsumeAfter
Definition:CommandLine.h:125
llvm::cl::ZeroOrMore
@ ZeroOrMore
Definition:CommandLine.h:114
llvm::cl::Optional
@ Optional
Definition:CommandLine.h:113
llvm::cl::OneOrMore
@ OneOrMore
Definition:CommandLine.h:116
llvm::cl::Required
@ Required
Definition:CommandLine.h:115
llvm::cl::ValueOptional
@ ValueOptional
Definition:CommandLine.h:130
llvm::cl::ValueDisallowed
@ ValueDisallowed
Definition:CommandLine.h:132
llvm::cl::ValueRequired
@ ValueRequired
Definition:CommandLine.h:131
llvm::cl::ResetAllOptionOccurrences
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:1472
llvm::cl::SetVersionPrinter
void SetVersionPrinter(VersionPrinterTy func)
===------------------------------------------------------------------—===// Override the default (LLV...
Definition:CommandLine.cpp:2780
llvm::cl::tokenizeConfigFile
void tokenizeConfigFile(StringRef Source, StringSaver &Saver, SmallVectorImpl< const char * > &NewArgv, bool MarkEOLs=false)
Tokenizes content of configuration file.
Definition:CommandLine.cpp:1073
llvm::cl::Hidden
@ Hidden
Definition:CommandLine.h:137
llvm::cl::NotHidden
@ NotHidden
Definition:CommandLine.h:136
llvm::cl::ReallyHidden
@ ReallyHidden
Definition:CommandLine.h:138
llvm::cl::getRegisteredOptions
StringMap< Option * > & getRegisteredOptions(SubCommand &Sub=SubCommand::getTopLevel())
Use this to get a StringMap to all registered named options (e.g.
Definition:CommandLine.cpp:2788
llvm::cl::ResetCommandLineParser
void ResetCommandLineParser()
Reset the command line parser back to its initial state.
Definition:CommandLine.cpp:2829
llvm::cl::ParseCommandLineOptions
bool ParseCommandLineOptions(int argc, const char *const *argv, StringRef Overview="", raw_ostream *Errs=nullptr, const char *EnvVar=nullptr, bool LongOptionsUseDoubleDash=false)
Definition:CommandLine.cpp:1444
llvm::cl::PrintOptionValues
void PrintOptionValues()
Definition:CommandLine.cpp:2699
llvm::cl::getRegisteredSubcommands
iterator_range< typename SmallPtrSet< SubCommand *, 4 >::iterator > getRegisteredSubcommands()
Use this to get all registered SubCommands from the provided parser.
Definition:CommandLine.cpp:2797
llvm::cl::AddLiteralOption
void AddLiteralOption(Option &O, StringRef Name)
Adds a new option for parsing and provides the option it refers to.
Definition:CommandLine.cpp:423
llvm::cl::TokenizeWindowsCommandLineNoCopy
void TokenizeWindowsCommandLineNoCopy(StringRef Source, StringSaver &Saver, SmallVectorImpl< StringRef > &NewArgv)
Tokenizes a Windows command line while attempting to avoid copies.
Definition:CommandLine.cpp:1053
llvm::cl::boolOrDefault
boolOrDefault
Definition:CommandLine.h:637
llvm::cl::printBuildConfig
void printBuildConfig(raw_ostream &OS)
Prints the compiler build configuration.
Definition:CommandLine.cpp:2767
llvm::cl::ProvidePositionalOption
bool ProvidePositionalOption(Option *Handler, StringRef Arg, int i)
Parses Arg into the option handler Handler.
Definition:CommandLine.cpp:707
llvm::cl::init
initializer< Ty > init(const Ty &Val)
Definition:CommandLine.h:443
llvm::cl::Sink
@ Sink
Definition:CommandLine.h:165
llvm::cl::CommaSeparated
@ CommaSeparated
Definition:CommandLine.h:163
llvm::cl::Grouping
@ Grouping
Definition:CommandLine.h:171
llvm::cl::DefaultOption
@ DefaultOption
Definition:CommandLine.h:174
llvm::cl::PositionalEatsArgs
@ PositionalEatsArgs
Definition:CommandLine.h:164
llvm::cl::getCompilerBuildConfig
ArrayRef< StringRef > getCompilerBuildConfig()
An array of optional enabled settings in the LLVM build configuration, which may be of interest to co...
Definition:CommandLine.cpp:2729
llvm::cl::location
LocationClass< Ty > location(Ty &L)
Definition:CommandLine.h:463
llvm::cl::HideUnrelatedOptions
void HideUnrelatedOptions(cl::OptionCategory &Category, SubCommand &Sub=SubCommand::getTopLevel())
Mark all options not part of this category as cl::ReallyHidden.
Definition:CommandLine.cpp:2801
llvm::cl::AddExtraVersionPrinter
void AddExtraVersionPrinter(VersionPrinterTy func)
===------------------------------------------------------------------—===// Add an extra printer to u...
Definition:CommandLine.cpp:2784
llvm::cl::PrintHelpMessage
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:2718
llvm::cl::TokenizeWindowsCommandLineFull
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:1061
llvm::cl::Positional
@ Positional
Definition:CommandLine.h:157
llvm::cl::Prefix
@ Prefix
Definition:CommandLine.h:158
llvm::cl::AlwaysPrefix
@ AlwaysPrefix
Definition:CommandLine.h:159
llvm::cl::TokenizeGNUCommandLine
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:821
llvm::codeview::CompileSym2Flags::EC
@ EC
llvm::sys::fs::file_type::regular_file
@ regular_file
llvm::sys::path::parent_path
StringRef parent_path(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get parent path.
Definition:Path.cpp:467
llvm::sys::path::has_parent_path
bool has_parent_path(const Twine &path, Style style=Style::native)
Has parent path?
Definition:Path.cpp:650
llvm::sys::path::Style::native
@ native
llvm::sys::path::is_relative
bool is_relative(const Twine &path, Style style=Style::native)
Is path relative?
Definition:Path.cpp:699
llvm::sys::path::filename
StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
Definition:Path.cpp:577
llvm::sys::path::is_absolute
bool is_absolute(const Twine &path, Style style=Style::native)
Is path absolute?
Definition:Path.cpp:671
llvm::sys::path::append
void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
Definition:Path.cpp:456
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition:AddressRanges.h:18
llvm::drop_begin
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition:STLExtras.h:329
llvm::Length
@ Length
Definition:DWP.cpp:480
llvm::initWithColorOptions
void initWithColorOptions()
Definition:WithColor.cpp:34
llvm::size
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.
Definition:STLExtras.h:1697
llvm::Done
@ Done
Definition:Threading.h:60
llvm::outs
raw_fd_ostream & outs()
This returns a reference to a raw_fd_ostream for standard output.
Definition:raw_ostream.cpp:895
llvm::make_range
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
Definition:iterator_range.h:77
llvm::initDebugOptions
void initDebugOptions()
Definition:Debug.cpp:145
llvm::interleaveComma
void interleaveComma(const Container &c, StreamT &os, UnaryFunctor each_fn)
Definition:STLExtras.h:2207
llvm::hasUTF16ByteOrderMark
bool hasUTF16ByteOrderMark(ArrayRef< char > SrcBytes)
Returns true if a blob of text starts with a UTF-16 big or little endian byte order mark.
Definition:ConvertUTFWrapper.cpp:78
llvm::initDebugCounterOptions
void initDebugCounterOptions()
Definition:DebugCounter.cpp:163
llvm::createStringError
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
Definition:Error.h:1291
llvm::print
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr)
Definition:GCNRegPressure.cpp:227
llvm::errc::no_such_file_or_directory
@ no_such_file_or_directory
llvm::get
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
Definition:PointerIntPair.h:270
llvm::dbgs
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition:Debug.cpp:163
llvm::report_fatal_error
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition:Error.cpp:167
llvm::convertUTF16ToUTF8String
bool convertUTF16ToUTF8String(ArrayRef< char > SrcBytes, std::string &Out)
Converts a stream of raw bytes assumed to be UTF16 into a UTF8 std::string.
Definition:ConvertUTFWrapper.cpp:83
llvm::initSignalsOptions
void initSignalsOptions()
Definition:Signals.cpp:64
llvm::initTypeSizeOptions
void initTypeSizeOptions()
Definition:TypeSize.cpp:34
llvm::initStatisticOptions
void initStatisticOptions()
Definition:Statistic.cpp:49
llvm::nulls
raw_ostream & nulls()
This returns a reference to a raw_ostream which simply discards output.
Definition:raw_ostream.cpp:918
llvm::initTimerOptions
void initTimerOptions()
Definition:Timer.cpp:545
llvm::errs
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
Definition:raw_ostream.cpp:907
llvm::initRandomSeedOptions
void initRandomSeedOptions()
Definition:RandomNumberGenerator.cpp:43
llvm::initGraphWriterOptions
void initGraphWriterOptions()
Definition:GraphWriter.cpp:53
llvm::operator<<
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
Definition:APFixedPoint.h:303
llvm::count_if
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...
Definition:STLExtras.h:1945
llvm::is_contained
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition:STLExtras.h:1903
llvm::toString
const char * toString(DWARFSectionKind Kind)
Definition:DWARFUnitIndex.h:67
llvm::array_pod_sort
void array_pod_sort(IteratorTy Start, IteratorTy End)
array_pod_sort - This sorts an array with the specified start and end extent.
Definition:STLExtras.h:1624
llvm::InstructionUniformity::Default
@ Default
The result values are uniform if and only if all operands are uniform.
raw_ostream.h
INIT
#define INIT(o, n)
Definition:regexec.c:120
Status
Definition:SIModeRegister.cpp:29
llvm::cl::GenericOptionValue
Definition:CommandLine.h:532
llvm::cl::OptionValue
Definition:CommandLine.h:624
llvm::cl::aliasopt
Definition:CommandLine.h:1972
llvm::cl::cat
Definition:CommandLine.h:468
llvm::cl::desc
Definition:CommandLine.h:409
llvm::cl::extrahelp::extrahelp
extrahelp(StringRef help)
Definition:CommandLine.cpp:427
llvm::cl::sub
Definition:CommandLine.h:477

Generated on Thu Jul 17 2025 12:37:26 for LLVM by doxygen 1.9.6
[8]ページ先頭

©2009-2025 Movatter.jp