1 //===-- CommandLine.cpp - Command line parser implementation --------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This class implements a command line argument processor that is useful when
11 // creating a tool. It provides a simple, minimalistic interface that is easily
12 // extensible and supports nonlocal (library) command line options.
14 // Note that rather than trying to figure out what this code does, you could try
15 // reading the library documentation located in docs/CommandLine.html
17 //===----------------------------------------------------------------------===//
19 #include "llvm/Config/config.h"
20 #include "llvm/ADT/OwningPtr.h"
21 #include "llvm/Support/CommandLine.h"
22 #include "llvm/Support/ErrorHandling.h"
23 #include "llvm/Support/MemoryBuffer.h"
24 #include "llvm/Support/ManagedStatic.h"
25 #include "llvm/Support/Streams.h"
26 #include "llvm/Target/TargetRegistry.h"
27 #include "llvm/System/Path.h"
40 //===----------------------------------------------------------------------===//
41 // Template instantiations and anchors.
43 TEMPLATE_INSTANTIATION(class basic_parser
<bool>);
44 TEMPLATE_INSTANTIATION(class basic_parser
<boolOrDefault
>);
45 TEMPLATE_INSTANTIATION(class basic_parser
<int>);
46 TEMPLATE_INSTANTIATION(class basic_parser
<unsigned>);
47 TEMPLATE_INSTANTIATION(class basic_parser
<double>);
48 TEMPLATE_INSTANTIATION(class basic_parser
<float>);
49 TEMPLATE_INSTANTIATION(class basic_parser
<std::string
>);
50 TEMPLATE_INSTANTIATION(class basic_parser
<char>);
52 TEMPLATE_INSTANTIATION(class opt
<unsigned>);
53 TEMPLATE_INSTANTIATION(class opt
<int>);
54 TEMPLATE_INSTANTIATION(class opt
<std::string
>);
55 TEMPLATE_INSTANTIATION(class opt
<char>);
56 TEMPLATE_INSTANTIATION(class opt
<bool>);
58 void Option::anchor() {}
59 void basic_parser_impl::anchor() {}
60 void parser
<bool>::anchor() {}
61 void parser
<boolOrDefault
>::anchor() {}
62 void parser
<int>::anchor() {}
63 void parser
<unsigned>::anchor() {}
64 void parser
<double>::anchor() {}
65 void parser
<float>::anchor() {}
66 void parser
<std::string
>::anchor() {}
67 void parser
<char>::anchor() {}
69 //===----------------------------------------------------------------------===//
71 // Globals for name and overview of program. Program name is not a string to
72 // avoid static ctor/dtor issues.
73 static char ProgramName
[80] = "<premain>";
74 static const char *ProgramOverview
= 0;
76 // This collects additional help to be printed.
77 static ManagedStatic
<std::vector
<const char*> > MoreHelp
;
79 extrahelp::extrahelp(const char *Help
)
81 MoreHelp
->push_back(Help
);
84 static bool OptionListChanged
= false;
86 // MarkOptionsChanged - Internal helper function.
87 void cl::MarkOptionsChanged() {
88 OptionListChanged
= true;
91 /// RegisteredOptionList - This is the list of the command line options that
92 /// have statically constructed themselves.
93 static Option
*RegisteredOptionList
= 0;
95 void Option::addArgument() {
96 assert(NextRegistered
== 0 && "argument multiply registered!");
98 NextRegistered
= RegisteredOptionList
;
99 RegisteredOptionList
= this;
100 MarkOptionsChanged();
104 //===----------------------------------------------------------------------===//
105 // Basic, shared command line option processing machinery.
108 /// GetOptionInfo - Scan the list of registered options, turning them into data
109 /// structures that are easier to handle.
110 static void GetOptionInfo(std::vector
<Option
*> &PositionalOpts
,
111 std::vector
<Option
*> &SinkOpts
,
112 std::map
<std::string
, Option
*> &OptionsMap
) {
113 std::vector
<const char*> OptionNames
;
114 Option
*CAOpt
= 0; // The ConsumeAfter option if it exists.
115 for (Option
*O
= RegisteredOptionList
; O
; O
= O
->getNextRegisteredOption()) {
116 // If this option wants to handle multiple option names, get the full set.
117 // This handles enum options like "-O1 -O2" etc.
118 O
->getExtraOptionNames(OptionNames
);
120 OptionNames
.push_back(O
->ArgStr
);
122 // Handle named options.
123 for (size_t i
= 0, e
= OptionNames
.size(); i
!= e
; ++i
) {
124 // Add argument to the argument map!
125 if (!OptionsMap
.insert(std::pair
<std::string
,Option
*>(OptionNames
[i
],
127 cerr
<< ProgramName
<< ": CommandLine Error: Argument '"
128 << OptionNames
[i
] << "' defined more than once!\n";
134 // Remember information about positional options.
135 if (O
->getFormattingFlag() == cl::Positional
)
136 PositionalOpts
.push_back(O
);
137 else if (O
->getMiscFlags() & cl::Sink
) // Remember sink options
138 SinkOpts
.push_back(O
);
139 else if (O
->getNumOccurrencesFlag() == cl::ConsumeAfter
) {
141 O
->error("Cannot specify more than one option with cl::ConsumeAfter!");
147 PositionalOpts
.push_back(CAOpt
);
149 // Make sure that they are in order of registration not backwards.
150 std::reverse(PositionalOpts
.begin(), PositionalOpts
.end());
154 /// LookupOption - Lookup the option specified by the specified option on the
155 /// command line. If there is a value specified (after an equal sign) return
157 static Option
*LookupOption(const char *&Arg
, const char *&Value
,
158 std::map
<std::string
, Option
*> &OptionsMap
) {
159 while (*Arg
== '-') ++Arg
; // Eat leading dashes
161 const char *ArgEnd
= Arg
;
162 while (*ArgEnd
&& *ArgEnd
!= '=')
163 ++ArgEnd
; // Scan till end of argument name.
165 if (*ArgEnd
== '=') // If we have an equals sign...
166 Value
= ArgEnd
+1; // Get the value, not the equals
169 if (*Arg
== 0) return 0;
171 // Look up the option.
172 std::map
<std::string
, Option
*>::iterator I
=
173 OptionsMap
.find(std::string(Arg
, ArgEnd
));
174 return I
!= OptionsMap
.end() ? I
->second
: 0;
177 static inline bool ProvideOption(Option
*Handler
, const char *ArgName
,
178 const char *Value
, int argc
, char **argv
,
180 // Is this a multi-argument option?
181 unsigned NumAdditionalVals
= Handler
->getNumAdditionalVals();
183 // Enforce value requirements
184 switch (Handler
->getValueExpectedFlag()) {
186 if (Value
== 0) { // No value specified?
187 if (i
+1 < argc
) { // Steal the next argument, like for '-o filename'
190 return Handler
->error(" requires a value!");
194 case ValueDisallowed
:
195 if (NumAdditionalVals
> 0)
196 return Handler
->error(": multi-valued option specified"
197 " with ValueDisallowed modifier!");
200 return Handler
->error(" does not allow a value! '" +
201 std::string(Value
) + "' specified.");
207 << ": Bad ValueMask flag! CommandLine usage error:"
208 << Handler
->getValueExpectedFlag() << "\n";
212 // If this isn't a multi-arg option, just run the handler.
213 if (NumAdditionalVals
== 0) {
214 return Handler
->addOccurrence(i
, ArgName
, Value
? Value
: "");
216 // If it is, run the handle several times.
218 bool MultiArg
= false;
221 if (Handler
->addOccurrence(i
, ArgName
, Value
, MultiArg
))
227 while (NumAdditionalVals
> 0) {
232 return Handler
->error(": not enough values!");
234 if (Handler
->addOccurrence(i
, ArgName
, Value
, MultiArg
))
243 static bool ProvidePositionalOption(Option
*Handler
, const std::string
&Arg
,
246 return ProvideOption(Handler
, Handler
->ArgStr
, Arg
.c_str(), 0, 0, Dummy
);
250 // Option predicates...
251 static inline bool isGrouping(const Option
*O
) {
252 return O
->getFormattingFlag() == cl::Grouping
;
254 static inline bool isPrefixedOrGrouping(const Option
*O
) {
255 return isGrouping(O
) || O
->getFormattingFlag() == cl::Prefix
;
258 // getOptionPred - Check to see if there are any options that satisfy the
259 // specified predicate with names that are the prefixes in Name. This is
260 // checked by progressively stripping characters off of the name, checking to
261 // see if there options that satisfy the predicate. If we find one, return it,
262 // otherwise return null.
264 static Option
*getOptionPred(std::string Name
, size_t &Length
,
265 bool (*Pred
)(const Option
*),
266 std::map
<std::string
, Option
*> &OptionsMap
) {
268 std::map
<std::string
, Option
*>::iterator OMI
= OptionsMap
.find(Name
);
269 if (OMI
!= OptionsMap
.end() && Pred(OMI
->second
)) {
270 Length
= Name
.length();
274 if (Name
.size() == 1) return 0;
276 Name
.erase(Name
.end()-1, Name
.end()); // Chop off the last character...
277 OMI
= OptionsMap
.find(Name
);
279 // Loop while we haven't found an option and Name still has at least two
280 // characters in it (so that the next iteration will not be the empty
282 } while ((OMI
== OptionsMap
.end() || !Pred(OMI
->second
)) && Name
.size() > 1);
284 if (OMI
!= OptionsMap
.end() && Pred(OMI
->second
)) {
285 Length
= Name
.length();
286 return OMI
->second
; // Found one!
288 return 0; // No option found!
291 static bool RequiresValue(const Option
*O
) {
292 return O
->getNumOccurrencesFlag() == cl::Required
||
293 O
->getNumOccurrencesFlag() == cl::OneOrMore
;
296 static bool EatsUnboundedNumberOfValues(const Option
*O
) {
297 return O
->getNumOccurrencesFlag() == cl::ZeroOrMore
||
298 O
->getNumOccurrencesFlag() == cl::OneOrMore
;
301 /// ParseCStringVector - Break INPUT up wherever one or more
302 /// whitespace characters are found, and store the resulting tokens in
303 /// OUTPUT. The tokens stored in OUTPUT are dynamically allocated
304 /// using strdup (), so it is the caller's responsibility to free ()
307 static void ParseCStringVector(std::vector
<char *> &output
,
309 // Characters which will be treated as token separators:
310 static const char *const delims
= " \v\f\t\r\n";
312 std::string
work (input
);
313 // Skip past any delims at head of input string.
314 size_t pos
= work
.find_first_not_of (delims
);
315 // If the string consists entirely of delims, then exit early.
316 if (pos
== std::string::npos
) return;
317 // Otherwise, jump forward to beginning of first word.
318 work
= work
.substr (pos
);
319 // Find position of first delimiter.
320 pos
= work
.find_first_of (delims
);
322 while (!work
.empty() && pos
!= std::string::npos
) {
323 // Everything from 0 to POS is the next word to copy.
324 output
.push_back (strdup (work
.substr (0,pos
).c_str ()));
325 // Is there another word in the string?
326 size_t nextpos
= work
.find_first_not_of (delims
, pos
+ 1);
327 if (nextpos
!= std::string::npos
) {
328 // Yes? Then remove delims from beginning ...
329 work
= work
.substr (work
.find_first_not_of (delims
, pos
+ 1));
330 // and find the end of the word.
331 pos
= work
.find_first_of (delims
);
333 // No? (Remainder of string is delims.) End the loop.
335 pos
= std::string::npos
;
339 // If `input' ended with non-delim char, then we'll get here with
340 // the last word of `input' in `work'; copy it now.
341 if (!work
.empty ()) {
342 output
.push_back (strdup (work
.c_str ()));
346 /// ParseEnvironmentOptions - An alternative entry point to the
347 /// CommandLine library, which allows you to read the program's name
348 /// from the caller (as PROGNAME) and its command-line arguments from
349 /// an environment variable (whose name is given in ENVVAR).
351 void cl::ParseEnvironmentOptions(const char *progName
, const char *envVar
,
352 const char *Overview
, bool ReadResponseFiles
) {
354 assert(progName
&& "Program name not specified");
355 assert(envVar
&& "Environment variable name missing");
357 // Get the environment variable they want us to parse options out of.
358 const char *envValue
= getenv(envVar
);
362 // Get program's "name", which we wouldn't know without the caller
364 std::vector
<char*> newArgv
;
365 newArgv
.push_back(strdup(progName
));
367 // Parse the value of the environment variable into a "command line"
368 // and hand it off to ParseCommandLineOptions().
369 ParseCStringVector(newArgv
, envValue
);
370 int newArgc
= static_cast<int>(newArgv
.size());
371 ParseCommandLineOptions(newArgc
, &newArgv
[0], Overview
, ReadResponseFiles
);
373 // Free all the strdup()ed strings.
374 for (std::vector
<char*>::iterator i
= newArgv
.begin(), e
= newArgv
.end();
380 /// ExpandResponseFiles - Copy the contents of argv into newArgv,
381 /// substituting the contents of the response files for the arguments
383 static void ExpandResponseFiles(int argc
, char** argv
,
384 std::vector
<char*>& newArgv
) {
385 for (int i
= 1; i
!= argc
; ++i
) {
390 sys::PathWithStatus
respFile(++arg
);
392 // Check that the response file is not empty (mmap'ing empty
393 // files can be problematic).
394 const sys::FileStatus
*FileStat
= respFile
.getFileStatus();
395 if (FileStat
&& FileStat
->getSize() != 0) {
397 // Mmap the response file into memory.
398 OwningPtr
<MemoryBuffer
>
399 respFilePtr(MemoryBuffer::getFile(respFile
.c_str()));
401 // If we could open the file, parse its contents, otherwise
402 // pass the @file option verbatim.
404 // TODO: we should also support recursive loading of response files,
405 // since this is how gcc behaves. (From their man page: "The file may
406 // itself contain additional @file options; any such options will be
407 // processed recursively.")
409 if (respFilePtr
!= 0) {
410 ParseCStringVector(newArgv
, respFilePtr
->getBufferStart());
415 newArgv
.push_back(strdup(arg
));
419 void cl::ParseCommandLineOptions(int argc
, char **argv
,
420 const char *Overview
, bool ReadResponseFiles
) {
421 // Process all registered options.
422 std::vector
<Option
*> PositionalOpts
;
423 std::vector
<Option
*> SinkOpts
;
424 std::map
<std::string
, Option
*> Opts
;
425 GetOptionInfo(PositionalOpts
, SinkOpts
, Opts
);
427 assert((!Opts
.empty() || !PositionalOpts
.empty()) &&
428 "No options specified!");
430 // Expand response files.
431 std::vector
<char*> newArgv
;
432 if (ReadResponseFiles
) {
433 newArgv
.push_back(strdup(argv
[0]));
434 ExpandResponseFiles(argc
, argv
, newArgv
);
436 argc
= static_cast<int>(newArgv
.size());
439 // Copy the program name into ProgName, making sure not to overflow it.
440 std::string ProgName
= sys::Path(argv
[0]).getLast();
441 if (ProgName
.size() > 79) ProgName
.resize(79);
442 strcpy(ProgramName
, ProgName
.c_str());
444 ProgramOverview
= Overview
;
445 bool ErrorParsing
= false;
447 // Check out the positional arguments to collect information about them.
448 unsigned NumPositionalRequired
= 0;
450 // Determine whether or not there are an unlimited number of positionals
451 bool HasUnlimitedPositionals
= false;
453 Option
*ConsumeAfterOpt
= 0;
454 if (!PositionalOpts
.empty()) {
455 if (PositionalOpts
[0]->getNumOccurrencesFlag() == cl::ConsumeAfter
) {
456 assert(PositionalOpts
.size() > 1 &&
457 "Cannot specify cl::ConsumeAfter without a positional argument!");
458 ConsumeAfterOpt
= PositionalOpts
[0];
461 // Calculate how many positional values are _required_.
462 bool UnboundedFound
= false;
463 for (size_t i
= ConsumeAfterOpt
!= 0, e
= PositionalOpts
.size();
465 Option
*Opt
= PositionalOpts
[i
];
466 if (RequiresValue(Opt
))
467 ++NumPositionalRequired
;
468 else if (ConsumeAfterOpt
) {
469 // ConsumeAfter cannot be combined with "optional" positional options
470 // unless there is only one positional argument...
471 if (PositionalOpts
.size() > 2)
473 Opt
->error(" error - this positional option will never be matched, "
474 "because it does not Require a value, and a "
475 "cl::ConsumeAfter option is active!");
476 } else if (UnboundedFound
&& !Opt
->ArgStr
[0]) {
477 // This option does not "require" a value... Make sure this option is
478 // not specified after an option that eats all extra arguments, or this
479 // one will never get any!
481 ErrorParsing
|= Opt
->error(" error - option can never match, because "
482 "another positional argument will match an "
483 "unbounded number of values, and this option"
484 " does not require a value!");
486 UnboundedFound
|= EatsUnboundedNumberOfValues(Opt
);
488 HasUnlimitedPositionals
= UnboundedFound
|| ConsumeAfterOpt
;
491 // PositionalVals - A vector of "positional" arguments we accumulate into
492 // the process at the end...
494 std::vector
<std::pair
<std::string
,unsigned> > PositionalVals
;
496 // If the program has named positional arguments, and the name has been run
497 // across, keep track of which positional argument was named. Otherwise put
498 // the positional args into the PositionalVals list...
499 Option
*ActivePositionalArg
= 0;
501 // Loop over all of the arguments... processing them.
502 bool DashDashFound
= false; // Have we read '--'?
503 for (int i
= 1; i
< argc
; ++i
) {
505 const char *Value
= 0;
506 const char *ArgName
= "";
508 // If the option list changed, this means that some command line
509 // option has just been registered or deregistered. This can occur in
510 // response to things like -load, etc. If this happens, rescan the options.
511 if (OptionListChanged
) {
512 PositionalOpts
.clear();
515 GetOptionInfo(PositionalOpts
, SinkOpts
, Opts
);
516 OptionListChanged
= false;
519 // Check to see if this is a positional argument. This argument is
520 // considered to be positional if it doesn't start with '-', if it is "-"
521 // itself, or if we have seen "--" already.
523 if (argv
[i
][0] != '-' || argv
[i
][1] == 0 || DashDashFound
) {
524 // Positional argument!
525 if (ActivePositionalArg
) {
526 ProvidePositionalOption(ActivePositionalArg
, argv
[i
], i
);
527 continue; // We are done!
528 } else if (!PositionalOpts
.empty()) {
529 PositionalVals
.push_back(std::make_pair(argv
[i
],i
));
531 // All of the positional arguments have been fulfulled, give the rest to
532 // the consume after option... if it's specified...
534 if (PositionalVals
.size() >= NumPositionalRequired
&&
535 ConsumeAfterOpt
!= 0) {
536 for (++i
; i
< argc
; ++i
)
537 PositionalVals
.push_back(std::make_pair(argv
[i
],i
));
538 break; // Handle outside of the argument processing loop...
541 // Delay processing positional arguments until the end...
544 } else if (argv
[i
][0] == '-' && argv
[i
][1] == '-' && argv
[i
][2] == 0 &&
546 DashDashFound
= true; // This is the mythical "--"?
547 continue; // Don't try to process it as an argument itself.
548 } else if (ActivePositionalArg
&&
549 (ActivePositionalArg
->getMiscFlags() & PositionalEatsArgs
)) {
550 // If there is a positional argument eating options, check to see if this
551 // option is another positional argument. If so, treat it as an argument,
552 // otherwise feed it to the eating positional.
554 Handler
= LookupOption(ArgName
, Value
, Opts
);
555 if (!Handler
|| Handler
->getFormattingFlag() != cl::Positional
) {
556 ProvidePositionalOption(ActivePositionalArg
, argv
[i
], i
);
557 continue; // We are done!
560 } else { // We start with a '-', must be an argument...
562 Handler
= LookupOption(ArgName
, Value
, Opts
);
564 // Check to see if this "option" is really a prefixed or grouped argument.
566 std::string
RealName(ArgName
);
567 if (RealName
.size() > 1) {
569 Option
*PGOpt
= getOptionPred(RealName
, Length
, isPrefixedOrGrouping
,
572 // If the option is a prefixed option, then the value is simply the
573 // rest of the name... so fall through to later processing, by
574 // setting up the argument name flags and value fields.
576 if (PGOpt
&& PGOpt
->getFormattingFlag() == cl::Prefix
) {
577 Value
= ArgName
+Length
;
578 assert(Opts
.find(std::string(ArgName
, Value
)) != Opts
.end() &&
579 Opts
.find(std::string(ArgName
, Value
))->second
== PGOpt
);
582 // This must be a grouped option... handle them now.
583 assert(isGrouping(PGOpt
) && "Broken getOptionPred!");
586 // Move current arg name out of RealName into RealArgName...
587 std::string
RealArgName(RealName
.begin(),
588 RealName
.begin() + Length
);
589 RealName
.erase(RealName
.begin(), RealName
.begin() + Length
);
591 // Because ValueRequired is an invalid flag for grouped arguments,
592 // we don't need to pass argc/argv in...
594 assert(PGOpt
->getValueExpectedFlag() != cl::ValueRequired
&&
595 "Option can not be cl::Grouping AND cl::ValueRequired!");
597 ErrorParsing
|= ProvideOption(PGOpt
, RealArgName
.c_str(),
600 // Get the next grouping option...
601 PGOpt
= getOptionPred(RealName
, Length
, isGrouping
, Opts
);
602 } while (PGOpt
&& Length
!= RealName
.size());
604 Handler
= PGOpt
; // Ate all of the options.
611 if (SinkOpts
.empty()) {
612 cerr
<< ProgramName
<< ": Unknown command line argument '"
613 << argv
[i
] << "'. Try: '" << argv
[0] << " --help'\n";
616 for (std::vector
<Option
*>::iterator I
= SinkOpts
.begin(),
617 E
= SinkOpts
.end(); I
!= E
; ++I
)
618 (*I
)->addOccurrence(i
, "", argv
[i
]);
623 // Check to see if this option accepts a comma separated list of values. If
624 // it does, we have to split up the value into multiple values...
625 if (Value
&& Handler
->getMiscFlags() & CommaSeparated
) {
626 std::string
Val(Value
);
627 std::string::size_type Pos
= Val
.find(',');
629 while (Pos
!= std::string::npos
) {
630 // Process the portion before the comma...
631 ErrorParsing
|= ProvideOption(Handler
, ArgName
,
632 std::string(Val
.begin(),
633 Val
.begin()+Pos
).c_str(),
635 // Erase the portion before the comma, AND the comma...
636 Val
.erase(Val
.begin(), Val
.begin()+Pos
+1);
637 Value
+= Pos
+1; // Increment the original value pointer as well...
639 // Check for another comma...
644 // If this is a named positional argument, just remember that it is the
646 if (Handler
->getFormattingFlag() == cl::Positional
)
647 ActivePositionalArg
= Handler
;
649 ErrorParsing
|= ProvideOption(Handler
, ArgName
, Value
, argc
, argv
, i
);
652 // Check and handle positional arguments now...
653 if (NumPositionalRequired
> PositionalVals
.size()) {
655 << ": Not enough positional command line arguments specified!\n"
656 << "Must specify at least " << NumPositionalRequired
657 << " positional arguments: See: " << argv
[0] << " --help\n";
660 } else if (!HasUnlimitedPositionals
661 && PositionalVals
.size() > PositionalOpts
.size()) {
663 << ": Too many positional arguments specified!\n"
664 << "Can specify at most " << PositionalOpts
.size()
665 << " positional arguments: See: " << argv
[0] << " --help\n";
668 } else if (ConsumeAfterOpt
== 0) {
669 // Positional args have already been handled if ConsumeAfter is specified...
670 unsigned ValNo
= 0, NumVals
= static_cast<unsigned>(PositionalVals
.size());
671 for (size_t i
= 0, e
= PositionalOpts
.size(); i
!= e
; ++i
) {
672 if (RequiresValue(PositionalOpts
[i
])) {
673 ProvidePositionalOption(PositionalOpts
[i
], PositionalVals
[ValNo
].first
,
674 PositionalVals
[ValNo
].second
);
676 --NumPositionalRequired
; // We fulfilled our duty...
679 // If we _can_ give this option more arguments, do so now, as long as we
680 // do not give it values that others need. 'Done' controls whether the
681 // option even _WANTS_ any more.
683 bool Done
= PositionalOpts
[i
]->getNumOccurrencesFlag() == cl::Required
;
684 while (NumVals
-ValNo
> NumPositionalRequired
&& !Done
) {
685 switch (PositionalOpts
[i
]->getNumOccurrencesFlag()) {
687 Done
= true; // Optional arguments want _at most_ one value
689 case cl::ZeroOrMore
: // Zero or more will take all they can get...
690 case cl::OneOrMore
: // One or more will take all they can get...
691 ProvidePositionalOption(PositionalOpts
[i
],
692 PositionalVals
[ValNo
].first
,
693 PositionalVals
[ValNo
].second
);
697 llvm_unreachable("Internal error, unexpected NumOccurrences flag in "
698 "positional argument processing!");
703 assert(ConsumeAfterOpt
&& NumPositionalRequired
<= PositionalVals
.size());
705 for (size_t j
= 1, e
= PositionalOpts
.size(); j
!= e
; ++j
)
706 if (RequiresValue(PositionalOpts
[j
])) {
707 ErrorParsing
|= ProvidePositionalOption(PositionalOpts
[j
],
708 PositionalVals
[ValNo
].first
,
709 PositionalVals
[ValNo
].second
);
713 // Handle the case where there is just one positional option, and it's
714 // optional. In this case, we want to give JUST THE FIRST option to the
715 // positional option and keep the rest for the consume after. The above
716 // loop would have assigned no values to positional options in this case.
718 if (PositionalOpts
.size() == 2 && ValNo
== 0 && !PositionalVals
.empty()) {
719 ErrorParsing
|= ProvidePositionalOption(PositionalOpts
[1],
720 PositionalVals
[ValNo
].first
,
721 PositionalVals
[ValNo
].second
);
725 // Handle over all of the rest of the arguments to the
726 // cl::ConsumeAfter command line option...
727 for (; ValNo
!= PositionalVals
.size(); ++ValNo
)
728 ErrorParsing
|= ProvidePositionalOption(ConsumeAfterOpt
,
729 PositionalVals
[ValNo
].first
,
730 PositionalVals
[ValNo
].second
);
733 // Loop over args and make sure all required args are specified!
734 for (std::map
<std::string
, Option
*>::iterator I
= Opts
.begin(),
735 E
= Opts
.end(); I
!= E
; ++I
) {
736 switch (I
->second
->getNumOccurrencesFlag()) {
739 if (I
->second
->getNumOccurrences() == 0) {
740 I
->second
->error(" must be specified at least once!");
749 // Free all of the memory allocated to the map. Command line options may only
750 // be processed once!
752 PositionalOpts
.clear();
755 // Free the memory allocated by ExpandResponseFiles.
756 if (ReadResponseFiles
) {
757 // Free all the strdup()ed strings.
758 for (std::vector
<char*>::iterator i
= newArgv
.begin(), e
= newArgv
.end();
763 // If we had an error processing our arguments, don't let the program execute
764 if (ErrorParsing
) exit(1);
767 //===----------------------------------------------------------------------===//
768 // Option Base class implementation
771 bool Option::error(std::string Message
, const char *ArgName
) {
772 if (ArgName
== 0) ArgName
= ArgStr
;
774 cerr
<< HelpStr
; // Be nice for positional arguments
776 cerr
<< ProgramName
<< ": for the -" << ArgName
;
778 cerr
<< " option: " << Message
<< "\n";
782 bool Option::addOccurrence(unsigned pos
, const char *ArgName
,
783 const std::string
&Value
,
786 NumOccurrences
++; // Increment the number of times we have been seen
788 switch (getNumOccurrencesFlag()) {
790 if (NumOccurrences
> 1)
791 return error(": may only occur zero or one times!", ArgName
);
794 if (NumOccurrences
> 1)
795 return error(": must occur exactly one time!", ArgName
);
799 case ConsumeAfter
: break;
800 default: return error(": bad num occurrences flag value!");
803 return handleOccurrence(pos
, ArgName
, Value
);
807 // getValueStr - Get the value description string, using "DefaultMsg" if nothing
808 // has been specified yet.
810 static const char *getValueStr(const Option
&O
, const char *DefaultMsg
) {
811 if (O
.ValueStr
[0] == 0) return DefaultMsg
;
815 //===----------------------------------------------------------------------===//
816 // cl::alias class implementation
819 // Return the width of the option tag for printing...
820 size_t alias::getOptionWidth() const {
821 return std::strlen(ArgStr
)+6;
824 // Print out the option for the alias.
825 void alias::printOptionInfo(size_t GlobalWidth
) const {
826 size_t L
= std::strlen(ArgStr
);
827 cerr
<< " -" << ArgStr
<< std::string(GlobalWidth
-L
-6, ' ') << " - "
833 //===----------------------------------------------------------------------===//
834 // Parser Implementation code...
837 // basic_parser implementation
840 // Return the width of the option tag for printing...
841 size_t basic_parser_impl::getOptionWidth(const Option
&O
) const {
842 size_t Len
= std::strlen(O
.ArgStr
);
843 if (const char *ValName
= getValueName())
844 Len
+= std::strlen(getValueStr(O
, ValName
))+3;
849 // printOptionInfo - Print out information about this option. The
850 // to-be-maintained width is specified.
852 void basic_parser_impl::printOptionInfo(const Option
&O
,
853 size_t GlobalWidth
) const {
854 cout
<< " -" << O
.ArgStr
;
856 if (const char *ValName
= getValueName())
857 cout
<< "=<" << getValueStr(O
, ValName
) << ">";
859 cout
<< std::string(GlobalWidth
-getOptionWidth(O
), ' ') << " - "
860 << O
.HelpStr
<< "\n";
866 // parser<bool> implementation
868 bool parser
<bool>::parse(Option
&O
, const char *ArgName
,
869 const std::string
&Arg
, bool &Value
) {
870 if (Arg
== "" || Arg
== "true" || Arg
== "TRUE" || Arg
== "True" ||
873 } else if (Arg
== "false" || Arg
== "FALSE" || Arg
== "False" || Arg
== "0") {
876 return O
.error(": '" + Arg
+
877 "' is invalid value for boolean argument! Try 0 or 1");
882 // parser<boolOrDefault> implementation
884 bool parser
<boolOrDefault
>::parse(Option
&O
, const char *ArgName
,
885 const std::string
&Arg
, boolOrDefault
&Value
) {
886 if (Arg
== "" || Arg
== "true" || Arg
== "TRUE" || Arg
== "True" ||
889 } else if (Arg
== "false" || Arg
== "FALSE"
890 || Arg
== "False" || Arg
== "0") {
893 return O
.error(": '" + Arg
+
894 "' is invalid value for boolean argument! Try 0 or 1");
899 // parser<int> implementation
901 bool parser
<int>::parse(Option
&O
, const char *ArgName
,
902 const std::string
&Arg
, int &Value
) {
904 Value
= (int)strtol(Arg
.c_str(), &End
, 0);
906 return O
.error(": '" + Arg
+ "' value invalid for integer argument!");
910 // parser<unsigned> implementation
912 bool parser
<unsigned>::parse(Option
&O
, const char *ArgName
,
913 const std::string
&Arg
, unsigned &Value
) {
916 unsigned long V
= strtoul(Arg
.c_str(), &End
, 0);
918 if (((V
== ULONG_MAX
) && (errno
== ERANGE
))
921 return O
.error(": '" + Arg
+ "' value invalid for uint argument!");
925 // parser<double>/parser<float> implementation
927 static bool parseDouble(Option
&O
, const std::string
&Arg
, double &Value
) {
928 const char *ArgStart
= Arg
.c_str();
930 Value
= strtod(ArgStart
, &End
);
932 return O
.error(": '" +Arg
+ "' value invalid for floating point argument!");
936 bool parser
<double>::parse(Option
&O
, const char *AN
,
937 const std::string
&Arg
, double &Val
) {
938 return parseDouble(O
, Arg
, Val
);
941 bool parser
<float>::parse(Option
&O
, const char *AN
,
942 const std::string
&Arg
, float &Val
) {
944 if (parseDouble(O
, Arg
, dVal
))
952 // generic_parser_base implementation
955 // findOption - Return the option number corresponding to the specified
956 // argument string. If the option is not found, getNumOptions() is returned.
958 unsigned generic_parser_base::findOption(const char *Name
) {
959 unsigned i
= 0, e
= getNumOptions();
963 if (getOption(i
) == N
)
971 // Return the width of the option tag for printing...
972 size_t generic_parser_base::getOptionWidth(const Option
&O
) const {
974 size_t Size
= std::strlen(O
.ArgStr
)+6;
975 for (unsigned i
= 0, e
= getNumOptions(); i
!= e
; ++i
)
976 Size
= std::max(Size
, std::strlen(getOption(i
))+8);
980 for (unsigned i
= 0, e
= getNumOptions(); i
!= e
; ++i
)
981 BaseSize
= std::max(BaseSize
, std::strlen(getOption(i
))+8);
986 // printOptionInfo - Print out information about this option. The
987 // to-be-maintained width is specified.
989 void generic_parser_base::printOptionInfo(const Option
&O
,
990 size_t GlobalWidth
) const {
992 size_t L
= std::strlen(O
.ArgStr
);
993 cout
<< " -" << O
.ArgStr
<< std::string(GlobalWidth
-L
-6, ' ')
994 << " - " << O
.HelpStr
<< "\n";
996 for (unsigned i
= 0, e
= getNumOptions(); i
!= e
; ++i
) {
997 size_t NumSpaces
= GlobalWidth
-strlen(getOption(i
))-8;
998 cout
<< " =" << getOption(i
) << std::string(NumSpaces
, ' ')
999 << " - " << getDescription(i
) << "\n";
1003 cout
<< " " << O
.HelpStr
<< "\n";
1004 for (unsigned i
= 0, e
= getNumOptions(); i
!= e
; ++i
) {
1005 size_t L
= std::strlen(getOption(i
));
1006 cout
<< " -" << getOption(i
) << std::string(GlobalWidth
-L
-8, ' ')
1007 << " - " << getDescription(i
) << "\n";
1013 //===----------------------------------------------------------------------===//
1014 // --help and --help-hidden option implementation
1021 const Option
*EmptyArg
;
1022 const bool ShowHidden
;
1024 // isHidden/isReallyHidden - Predicates to be used to filter down arg lists.
1025 inline static bool isHidden(std::pair
<std::string
, Option
*> &OptPair
) {
1026 return OptPair
.second
->getOptionHiddenFlag() >= Hidden
;
1028 inline static bool isReallyHidden(std::pair
<std::string
, Option
*> &OptPair
) {
1029 return OptPair
.second
->getOptionHiddenFlag() == ReallyHidden
;
1033 explicit HelpPrinter(bool showHidden
) : ShowHidden(showHidden
) {
1037 void operator=(bool Value
) {
1038 if (Value
== false) return;
1040 // Get all the options.
1041 std::vector
<Option
*> PositionalOpts
;
1042 std::vector
<Option
*> SinkOpts
;
1043 std::map
<std::string
, Option
*> OptMap
;
1044 GetOptionInfo(PositionalOpts
, SinkOpts
, OptMap
);
1046 // Copy Options into a vector so we can sort them as we like...
1047 std::vector
<std::pair
<std::string
, Option
*> > Opts
;
1048 copy(OptMap
.begin(), OptMap
.end(), std::back_inserter(Opts
));
1050 // Eliminate Hidden or ReallyHidden arguments, depending on ShowHidden
1051 Opts
.erase(std::remove_if(Opts
.begin(), Opts
.end(),
1052 std::ptr_fun(ShowHidden
? isReallyHidden
: isHidden
)),
1055 // Eliminate duplicate entries in table (from enum flags options, f.e.)
1056 { // Give OptionSet a scope
1057 std::set
<Option
*> OptionSet
;
1058 for (unsigned i
= 0; i
!= Opts
.size(); ++i
)
1059 if (OptionSet
.count(Opts
[i
].second
) == 0)
1060 OptionSet
.insert(Opts
[i
].second
); // Add new entry to set
1062 Opts
.erase(Opts
.begin()+i
--); // Erase duplicate
1065 if (ProgramOverview
)
1066 cout
<< "OVERVIEW: " << ProgramOverview
<< "\n";
1068 cout
<< "USAGE: " << ProgramName
<< " [options]";
1070 // Print out the positional options.
1071 Option
*CAOpt
= 0; // The cl::ConsumeAfter option, if it exists...
1072 if (!PositionalOpts
.empty() &&
1073 PositionalOpts
[0]->getNumOccurrencesFlag() == ConsumeAfter
)
1074 CAOpt
= PositionalOpts
[0];
1076 for (size_t i
= CAOpt
!= 0, e
= PositionalOpts
.size(); i
!= e
; ++i
) {
1077 if (PositionalOpts
[i
]->ArgStr
[0])
1078 cout
<< " --" << PositionalOpts
[i
]->ArgStr
;
1079 cout
<< " " << PositionalOpts
[i
]->HelpStr
;
1082 // Print the consume after option info if it exists...
1083 if (CAOpt
) cout
<< " " << CAOpt
->HelpStr
;
1087 // Compute the maximum argument length...
1089 for (size_t i
= 0, e
= Opts
.size(); i
!= e
; ++i
)
1090 MaxArgLen
= std::max(MaxArgLen
, Opts
[i
].second
->getOptionWidth());
1092 cout
<< "OPTIONS:\n";
1093 for (size_t i
= 0, e
= Opts
.size(); i
!= e
; ++i
)
1094 Opts
[i
].second
->printOptionInfo(MaxArgLen
);
1096 // Print any extra help the user has declared.
1097 for (std::vector
<const char *>::iterator I
= MoreHelp
->begin(),
1098 E
= MoreHelp
->end(); I
!= E
; ++I
)
1102 // Halt the program since help information was printed
1106 } // End anonymous namespace
1108 // Define the two HelpPrinter instances that are used to print out help, or
1111 static HelpPrinter
NormalPrinter(false);
1112 static HelpPrinter
HiddenPrinter(true);
1114 static cl::opt
<HelpPrinter
, true, parser
<bool> >
1115 HOp("help", cl::desc("Display available options (--help-hidden for more)"),
1116 cl::location(NormalPrinter
), cl::ValueDisallowed
);
1118 static cl::opt
<HelpPrinter
, true, parser
<bool> >
1119 HHOp("help-hidden", cl::desc("Display all available options"),
1120 cl::location(HiddenPrinter
), cl::Hidden
, cl::ValueDisallowed
);
1122 static void (*OverrideVersionPrinter
)() = 0;
1125 class VersionPrinter
{
1128 cout
<< "Low Level Virtual Machine (http://llvm.org/):\n";
1129 cout
<< " " << PACKAGE_NAME
<< " version " << PACKAGE_VERSION
;
1130 #ifdef LLVM_VERSION_INFO
1131 cout
<< LLVM_VERSION_INFO
;
1134 #ifndef __OPTIMIZE__
1135 cout
<< "DEBUG build";
1137 cout
<< "Optimized build";
1140 cout
<< " with assertions";
1143 cout
<< " Built " << __DATE__
<< "(" << __TIME__
<< ").\n";
1145 cout
<< " Registered Targets:\n";
1148 for (TargetRegistry::iterator it
= TargetRegistry::begin(),
1149 ie
= TargetRegistry::end(); it
!= ie
; ++it
)
1150 Width
= std::max(Width
, ::strlen(it
->getName()));
1152 unsigned NumTargets
= 0;
1153 for (TargetRegistry::iterator it
= TargetRegistry::begin(),
1154 ie
= TargetRegistry::end(); it
!= ie
; ++it
, ++NumTargets
) {
1155 cout
<< " " << it
->getName()
1156 << std::string(Width
- ::strlen(it
->getName()), ' ') << " - "
1157 << it
->getShortDescription() << "\n";
1160 cout
<< " (none)\n";
1162 void operator=(bool OptionWasSpecified
) {
1163 if (OptionWasSpecified
) {
1164 if (OverrideVersionPrinter
== 0) {
1168 (*OverrideVersionPrinter
)();
1174 } // End anonymous namespace
1177 // Define the --version option that prints out the LLVM version for the tool
1178 static VersionPrinter VersionPrinterInstance
;
1180 static cl::opt
<VersionPrinter
, true, parser
<bool> >
1181 VersOp("version", cl::desc("Display the version of this program"),
1182 cl::location(VersionPrinterInstance
), cl::ValueDisallowed
);
1184 // Utility function for printing the help message.
1185 void cl::PrintHelpMessage() {
1186 // This looks weird, but it actually prints the help message. The
1187 // NormalPrinter variable is a HelpPrinter and the help gets printed when
1188 // its operator= is invoked. That's because the "normal" usages of the
1189 // help printer is to be assigned true/false depending on whether the
1190 // --help option was given or not. Since we're circumventing that we have
1191 // to make it look like --help was given, so we assign true.
1192 NormalPrinter
= true;
1195 /// Utility function for printing version number.
1196 void cl::PrintVersionMessage() {
1197 VersionPrinterInstance
.print();
1200 void cl::SetVersionPrinter(void (*func
)()) {
1201 OverrideVersionPrinter
= func
;