Support for multi-valued options in CommandLine
[oota-llvm.git] / lib / Support / CommandLine.cpp
1 //===-- CommandLine.cpp - Command line parser implementation --------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
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.
13 //
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
16 //
17 //===----------------------------------------------------------------------===//
18
19 #include "llvm/Config/config.h"
20 #include "llvm/ADT/OwningPtr.h"
21 #include "llvm/Support/CommandLine.h"
22 #include "llvm/Support/MemoryBuffer.h"
23 #include "llvm/Support/ManagedStatic.h"
24 #include "llvm/Support/Streams.h"
25 #include "llvm/System/Path.h"
26 #include <algorithm>
27 #include <functional>
28 #include <map>
29 #include <ostream>
30 #include <set>
31 #include <cstdlib>
32 #include <cerrno>
33 #include <cstring>
34 #include <climits>
35 using namespace llvm;
36 using namespace cl;
37
38 //===----------------------------------------------------------------------===//
39 // Template instantiations and anchors.
40 //
41 TEMPLATE_INSTANTIATION(class basic_parser<bool>);
42 TEMPLATE_INSTANTIATION(class basic_parser<boolOrDefault>);
43 TEMPLATE_INSTANTIATION(class basic_parser<int>);
44 TEMPLATE_INSTANTIATION(class basic_parser<unsigned>);
45 TEMPLATE_INSTANTIATION(class basic_parser<double>);
46 TEMPLATE_INSTANTIATION(class basic_parser<float>);
47 TEMPLATE_INSTANTIATION(class basic_parser<std::string>);
48
49 TEMPLATE_INSTANTIATION(class opt<unsigned>);
50 TEMPLATE_INSTANTIATION(class opt<int>);
51 TEMPLATE_INSTANTIATION(class opt<std::string>);
52 TEMPLATE_INSTANTIATION(class opt<bool>);
53
54 void Option::anchor() {}
55 void basic_parser_impl::anchor() {}
56 void parser<bool>::anchor() {}
57 void parser<boolOrDefault>::anchor() {}
58 void parser<int>::anchor() {}
59 void parser<unsigned>::anchor() {}
60 void parser<double>::anchor() {}
61 void parser<float>::anchor() {}
62 void parser<std::string>::anchor() {}
63
64 //===----------------------------------------------------------------------===//
65
66 // Globals for name and overview of program.  Program name is not a string to
67 // avoid static ctor/dtor issues.
68 static char ProgramName[80] = "<premain>";
69 static const char *ProgramOverview = 0;
70
71 // This collects additional help to be printed.
72 static ManagedStatic<std::vector<const char*> > MoreHelp;
73
74 extrahelp::extrahelp(const char *Help)
75   : morehelp(Help) {
76   MoreHelp->push_back(Help);
77 }
78
79 static bool OptionListChanged = false;
80
81 // MarkOptionsChanged - Internal helper function.
82 void cl::MarkOptionsChanged() {
83   OptionListChanged = true;
84 }
85
86 /// RegisteredOptionList - This is the list of the command line options that
87 /// have statically constructed themselves.
88 static Option *RegisteredOptionList = 0;
89
90 void Option::addArgument() {
91   assert(NextRegistered == 0 && "argument multiply registered!");
92
93   NextRegistered = RegisteredOptionList;
94   RegisteredOptionList = this;
95   MarkOptionsChanged();
96 }
97
98
99 //===----------------------------------------------------------------------===//
100 // Basic, shared command line option processing machinery.
101 //
102
103 /// GetOptionInfo - Scan the list of registered options, turning them into data
104 /// structures that are easier to handle.
105 static void GetOptionInfo(std::vector<Option*> &PositionalOpts,
106                           std::vector<Option*> &SinkOpts,
107                           std::map<std::string, Option*> &OptionsMap) {
108   std::vector<const char*> OptionNames;
109   Option *CAOpt = 0;  // The ConsumeAfter option if it exists.
110   for (Option *O = RegisteredOptionList; O; O = O->getNextRegisteredOption()) {
111     // If this option wants to handle multiple option names, get the full set.
112     // This handles enum options like "-O1 -O2" etc.
113     O->getExtraOptionNames(OptionNames);
114     if (O->ArgStr[0])
115       OptionNames.push_back(O->ArgStr);
116
117     // Handle named options.
118     for (size_t i = 0, e = OptionNames.size(); i != e; ++i) {
119       // Add argument to the argument map!
120       if (!OptionsMap.insert(std::pair<std::string,Option*>(OptionNames[i],
121                                                             O)).second) {
122         cerr << ProgramName << ": CommandLine Error: Argument '"
123              << OptionNames[i] << "' defined more than once!\n";
124       }
125     }
126
127     OptionNames.clear();
128
129     // Remember information about positional options.
130     if (O->getFormattingFlag() == cl::Positional)
131       PositionalOpts.push_back(O);
132     else if (O->getMiscFlags() & cl::Sink) // Remember sink options
133       SinkOpts.push_back(O);
134     else if (O->getNumOccurrencesFlag() == cl::ConsumeAfter) {
135       if (CAOpt)
136         O->error("Cannot specify more than one option with cl::ConsumeAfter!");
137       CAOpt = O;
138     }
139   }
140
141   if (CAOpt)
142     PositionalOpts.push_back(CAOpt);
143
144   // Make sure that they are in order of registration not backwards.
145   std::reverse(PositionalOpts.begin(), PositionalOpts.end());
146 }
147
148
149 /// LookupOption - Lookup the option specified by the specified option on the
150 /// command line.  If there is a value specified (after an equal sign) return
151 /// that as well.
152 static Option *LookupOption(const char *&Arg, const char *&Value,
153                             std::map<std::string, Option*> &OptionsMap) {
154   while (*Arg == '-') ++Arg;  // Eat leading dashes
155
156   const char *ArgEnd = Arg;
157   while (*ArgEnd && *ArgEnd != '=')
158     ++ArgEnd; // Scan till end of argument name.
159
160   if (*ArgEnd == '=')  // If we have an equals sign...
161     Value = ArgEnd+1;  // Get the value, not the equals
162
163
164   if (*Arg == 0) return 0;
165
166   // Look up the option.
167   std::map<std::string, Option*>::iterator I =
168     OptionsMap.find(std::string(Arg, ArgEnd));
169   return I != OptionsMap.end() ? I->second : 0;
170 }
171
172 static inline bool ProvideOption(Option *Handler, const char *ArgName,
173                                  const char *Value, int argc, char **argv,
174                                  int &i) {
175   // Is this a multi-argument option?
176   unsigned NumAdditionalVals = Handler->getNumAdditionalVals();
177
178   // Enforce value requirements
179   switch (Handler->getValueExpectedFlag()) {
180   case ValueRequired:
181     if (Value == 0) {       // No value specified?
182       if (i+1 < argc) {     // Steal the next argument, like for '-o filename'
183         Value = argv[++i];
184       } else {
185         return Handler->error(" requires a value!");
186       }
187     }
188     break;
189   case ValueDisallowed:
190     if (NumAdditionalVals > 0)
191       return Handler->error(": multi-valued option specified"
192       " with ValueDisallowed modifier!");
193
194     if (Value)
195       return Handler->error(" does not allow a value! '" +
196                             std::string(Value) + "' specified.");
197     break;
198   case ValueOptional:
199     break;
200   default:
201     cerr << ProgramName
202          << ": Bad ValueMask flag! CommandLine usage error:"
203          << Handler->getValueExpectedFlag() << "\n";
204     abort();
205     break;
206   }
207
208   // If this isn't a multi-arg option, just run the handler.
209   if (NumAdditionalVals == 0) {
210     return Handler->addOccurrence(i, ArgName, Value ? Value : "");
211   }
212   // If it is, run the handle several times.
213   else {
214     bool MultiArg = false;
215
216     if (Value) {
217       if (Handler->addOccurrence(i, ArgName, Value, MultiArg))
218         return true;
219       --NumAdditionalVals;
220       MultiArg = true;
221     }
222
223     while (NumAdditionalVals > 0) {
224
225       if (i+1 < argc) {
226         Value = argv[++i];
227       } else {
228         return Handler->error(": not enough values!");
229       }
230       if (Handler->addOccurrence(i, ArgName, Value, MultiArg))
231         return true;
232       MultiArg = true;
233       --NumAdditionalVals;
234     }
235     return false;
236   }
237 }
238
239 static bool ProvidePositionalOption(Option *Handler, const std::string &Arg,
240                                     int i) {
241   int Dummy = i;
242   return ProvideOption(Handler, Handler->ArgStr, Arg.c_str(), 0, 0, Dummy);
243 }
244
245
246 // Option predicates...
247 static inline bool isGrouping(const Option *O) {
248   return O->getFormattingFlag() == cl::Grouping;
249 }
250 static inline bool isPrefixedOrGrouping(const Option *O) {
251   return isGrouping(O) || O->getFormattingFlag() == cl::Prefix;
252 }
253
254 // getOptionPred - Check to see if there are any options that satisfy the
255 // specified predicate with names that are the prefixes in Name.  This is
256 // checked by progressively stripping characters off of the name, checking to
257 // see if there options that satisfy the predicate.  If we find one, return it,
258 // otherwise return null.
259 //
260 static Option *getOptionPred(std::string Name, size_t &Length,
261                              bool (*Pred)(const Option*),
262                              std::map<std::string, Option*> &OptionsMap) {
263
264   std::map<std::string, Option*>::iterator OMI = OptionsMap.find(Name);
265   if (OMI != OptionsMap.end() && Pred(OMI->second)) {
266     Length = Name.length();
267     return OMI->second;
268   }
269
270   if (Name.size() == 1) return 0;
271   do {
272     Name.erase(Name.end()-1, Name.end());   // Chop off the last character...
273     OMI = OptionsMap.find(Name);
274
275     // Loop while we haven't found an option and Name still has at least two
276     // characters in it (so that the next iteration will not be the empty
277     // string...
278   } while ((OMI == OptionsMap.end() || !Pred(OMI->second)) && Name.size() > 1);
279
280   if (OMI != OptionsMap.end() && Pred(OMI->second)) {
281     Length = Name.length();
282     return OMI->second;    // Found one!
283   }
284   return 0;                // No option found!
285 }
286
287 static bool RequiresValue(const Option *O) {
288   return O->getNumOccurrencesFlag() == cl::Required ||
289          O->getNumOccurrencesFlag() == cl::OneOrMore;
290 }
291
292 static bool EatsUnboundedNumberOfValues(const Option *O) {
293   return O->getNumOccurrencesFlag() == cl::ZeroOrMore ||
294          O->getNumOccurrencesFlag() == cl::OneOrMore;
295 }
296
297 /// ParseCStringVector - Break INPUT up wherever one or more
298 /// whitespace characters are found, and store the resulting tokens in
299 /// OUTPUT. The tokens stored in OUTPUT are dynamically allocated
300 /// using strdup (), so it is the caller's responsibility to free ()
301 /// them later.
302 ///
303 static void ParseCStringVector(std::vector<char *> &output,
304                                const char *input) {
305   // Characters which will be treated as token separators:
306   static const char *const delims = " \v\f\t\r\n";
307
308   std::string work (input);
309   // Skip past any delims at head of input string.
310   size_t pos = work.find_first_not_of (delims);
311   // If the string consists entirely of delims, then exit early.
312   if (pos == std::string::npos) return;
313   // Otherwise, jump forward to beginning of first word.
314   work = work.substr (pos);
315   // Find position of first delimiter.
316   pos = work.find_first_of (delims);
317
318   while (!work.empty() && pos != std::string::npos) {
319     // Everything from 0 to POS is the next word to copy.
320     output.push_back (strdup (work.substr (0,pos).c_str ()));
321     // Is there another word in the string?
322     size_t nextpos = work.find_first_not_of (delims, pos + 1);
323     if (nextpos != std::string::npos) {
324       // Yes? Then remove delims from beginning ...
325       work = work.substr (work.find_first_not_of (delims, pos + 1));
326       // and find the end of the word.
327       pos = work.find_first_of (delims);
328     } else {
329       // No? (Remainder of string is delims.) End the loop.
330       work = "";
331       pos = std::string::npos;
332     }
333   }
334
335   // If `input' ended with non-delim char, then we'll get here with
336   // the last word of `input' in `work'; copy it now.
337   if (!work.empty ()) {
338     output.push_back (strdup (work.c_str ()));
339   }
340 }
341
342 /// ParseEnvironmentOptions - An alternative entry point to the
343 /// CommandLine library, which allows you to read the program's name
344 /// from the caller (as PROGNAME) and its command-line arguments from
345 /// an environment variable (whose name is given in ENVVAR).
346 ///
347 void cl::ParseEnvironmentOptions(const char *progName, const char *envVar,
348                                  const char *Overview, bool ReadResponseFiles) {
349   // Check args.
350   assert(progName && "Program name not specified");
351   assert(envVar && "Environment variable name missing");
352
353   // Get the environment variable they want us to parse options out of.
354   const char *envValue = getenv(envVar);
355   if (!envValue)
356     return;
357
358   // Get program's "name", which we wouldn't know without the caller
359   // telling us.
360   std::vector<char*> newArgv;
361   newArgv.push_back(strdup(progName));
362
363   // Parse the value of the environment variable into a "command line"
364   // and hand it off to ParseCommandLineOptions().
365   ParseCStringVector(newArgv, envValue);
366   int newArgc = static_cast<int>(newArgv.size());
367   ParseCommandLineOptions(newArgc, &newArgv[0], Overview, ReadResponseFiles);
368
369   // Free all the strdup()ed strings.
370   for (std::vector<char*>::iterator i = newArgv.begin(), e = newArgv.end();
371        i != e; ++i)
372     free (*i);
373 }
374
375
376 /// ExpandResponseFiles - Copy the contents of argv into newArgv,
377 /// substituting the contents of the response files for the arguments
378 /// of type @file.
379 static void ExpandResponseFiles(int argc, char** argv,
380                                 std::vector<char*>& newArgv) {
381   for (int i = 1; i != argc; ++i) {
382     char* arg = argv[i];
383
384     if (arg[0] == '@') {
385
386       sys::PathWithStatus respFile(++arg);
387
388       // Check that the response file is not empty (mmap'ing empty
389       // files can be problematic).
390       const sys::FileStatus *FileStat = respFile.getFileStatus();
391       if (!FileStat)
392         continue;
393       if (FileStat->getSize() == 0)
394         continue;
395
396       // Mmap the response file into memory.
397       OwningPtr<MemoryBuffer>
398         respFilePtr(MemoryBuffer::getFile(respFile.c_str()));
399
400       if (respFilePtr == 0)
401         continue;
402
403       ParseCStringVector(newArgv, respFilePtr->getBufferStart());
404     }
405     else {
406       newArgv.push_back(strdup(arg));
407     }
408   }
409 }
410
411 void cl::ParseCommandLineOptions(int argc, char **argv,
412                                  const char *Overview, bool ReadResponseFiles) {
413   // Process all registered options.
414   std::vector<Option*> PositionalOpts;
415   std::vector<Option*> SinkOpts;
416   std::map<std::string, Option*> Opts;
417   GetOptionInfo(PositionalOpts, SinkOpts, Opts);
418
419   assert((!Opts.empty() || !PositionalOpts.empty()) &&
420          "No options specified!");
421
422   // Expand response files.
423   std::vector<char*> newArgv;
424   if (ReadResponseFiles) {
425     newArgv.push_back(strdup(argv[0]));
426     ExpandResponseFiles(argc, argv, newArgv);
427     argv = &newArgv[0];
428     argc = static_cast<int>(newArgv.size());
429   }
430
431   // Copy the program name into ProgName, making sure not to overflow it.
432   std::string ProgName = sys::Path(argv[0]).getLast();
433   if (ProgName.size() > 79) ProgName.resize(79);
434   strcpy(ProgramName, ProgName.c_str());
435
436   ProgramOverview = Overview;
437   bool ErrorParsing = false;
438
439   // Check out the positional arguments to collect information about them.
440   unsigned NumPositionalRequired = 0;
441
442   // Determine whether or not there are an unlimited number of positionals
443   bool HasUnlimitedPositionals = false;
444
445   Option *ConsumeAfterOpt = 0;
446   if (!PositionalOpts.empty()) {
447     if (PositionalOpts[0]->getNumOccurrencesFlag() == cl::ConsumeAfter) {
448       assert(PositionalOpts.size() > 1 &&
449              "Cannot specify cl::ConsumeAfter without a positional argument!");
450       ConsumeAfterOpt = PositionalOpts[0];
451     }
452
453     // Calculate how many positional values are _required_.
454     bool UnboundedFound = false;
455     for (size_t i = ConsumeAfterOpt != 0, e = PositionalOpts.size();
456          i != e; ++i) {
457       Option *Opt = PositionalOpts[i];
458       if (RequiresValue(Opt))
459         ++NumPositionalRequired;
460       else if (ConsumeAfterOpt) {
461         // ConsumeAfter cannot be combined with "optional" positional options
462         // unless there is only one positional argument...
463         if (PositionalOpts.size() > 2)
464           ErrorParsing |=
465             Opt->error(" error - this positional option will never be matched, "
466                        "because it does not Require a value, and a "
467                        "cl::ConsumeAfter option is active!");
468       } else if (UnboundedFound && !Opt->ArgStr[0]) {
469         // This option does not "require" a value...  Make sure this option is
470         // not specified after an option that eats all extra arguments, or this
471         // one will never get any!
472         //
473         ErrorParsing |= Opt->error(" error - option can never match, because "
474                                    "another positional argument will match an "
475                                    "unbounded number of values, and this option"
476                                    " does not require a value!");
477       }
478       UnboundedFound |= EatsUnboundedNumberOfValues(Opt);
479     }
480     HasUnlimitedPositionals = UnboundedFound || ConsumeAfterOpt;
481   }
482
483   // PositionalVals - A vector of "positional" arguments we accumulate into
484   // the process at the end...
485   //
486   std::vector<std::pair<std::string,unsigned> > PositionalVals;
487
488   // If the program has named positional arguments, and the name has been run
489   // across, keep track of which positional argument was named.  Otherwise put
490   // the positional args into the PositionalVals list...
491   Option *ActivePositionalArg = 0;
492
493   // Loop over all of the arguments... processing them.
494   bool DashDashFound = false;  // Have we read '--'?
495   for (int i = 1; i < argc; ++i) {
496     Option *Handler = 0;
497     const char *Value = 0;
498     const char *ArgName = "";
499
500     // If the option list changed, this means that some command line
501     // option has just been registered or deregistered.  This can occur in
502     // response to things like -load, etc.  If this happens, rescan the options.
503     if (OptionListChanged) {
504       PositionalOpts.clear();
505       SinkOpts.clear();
506       Opts.clear();
507       GetOptionInfo(PositionalOpts, SinkOpts, Opts);
508       OptionListChanged = false;
509     }
510
511     // Check to see if this is a positional argument.  This argument is
512     // considered to be positional if it doesn't start with '-', if it is "-"
513     // itself, or if we have seen "--" already.
514     //
515     if (argv[i][0] != '-' || argv[i][1] == 0 || DashDashFound) {
516       // Positional argument!
517       if (ActivePositionalArg) {
518         ProvidePositionalOption(ActivePositionalArg, argv[i], i);
519         continue;  // We are done!
520       } else if (!PositionalOpts.empty()) {
521         PositionalVals.push_back(std::make_pair(argv[i],i));
522
523         // All of the positional arguments have been fulfulled, give the rest to
524         // the consume after option... if it's specified...
525         //
526         if (PositionalVals.size() >= NumPositionalRequired &&
527             ConsumeAfterOpt != 0) {
528           for (++i; i < argc; ++i)
529             PositionalVals.push_back(std::make_pair(argv[i],i));
530           break;   // Handle outside of the argument processing loop...
531         }
532
533         // Delay processing positional arguments until the end...
534         continue;
535       }
536     } else if (argv[i][0] == '-' && argv[i][1] == '-' && argv[i][2] == 0 &&
537                !DashDashFound) {
538       DashDashFound = true;  // This is the mythical "--"?
539       continue;              // Don't try to process it as an argument itself.
540     } else if (ActivePositionalArg &&
541                (ActivePositionalArg->getMiscFlags() & PositionalEatsArgs)) {
542       // If there is a positional argument eating options, check to see if this
543       // option is another positional argument.  If so, treat it as an argument,
544       // otherwise feed it to the eating positional.
545       ArgName = argv[i]+1;
546       Handler = LookupOption(ArgName, Value, Opts);
547       if (!Handler || Handler->getFormattingFlag() != cl::Positional) {
548         ProvidePositionalOption(ActivePositionalArg, argv[i], i);
549         continue;  // We are done!
550       }
551
552     } else {     // We start with a '-', must be an argument...
553       ArgName = argv[i]+1;
554       Handler = LookupOption(ArgName, Value, Opts);
555
556       // Check to see if this "option" is really a prefixed or grouped argument.
557       if (Handler == 0) {
558         std::string RealName(ArgName);
559         if (RealName.size() > 1) {
560           size_t Length = 0;
561           Option *PGOpt = getOptionPred(RealName, Length, isPrefixedOrGrouping,
562                                         Opts);
563
564           // If the option is a prefixed option, then the value is simply the
565           // rest of the name...  so fall through to later processing, by
566           // setting up the argument name flags and value fields.
567           //
568           if (PGOpt && PGOpt->getFormattingFlag() == cl::Prefix) {
569             Value = ArgName+Length;
570             assert(Opts.find(std::string(ArgName, Value)) != Opts.end() &&
571                    Opts.find(std::string(ArgName, Value))->second == PGOpt);
572             Handler = PGOpt;
573           } else if (PGOpt) {
574             // This must be a grouped option... handle them now.
575             assert(isGrouping(PGOpt) && "Broken getOptionPred!");
576
577             do {
578               // Move current arg name out of RealName into RealArgName...
579               std::string RealArgName(RealName.begin(),
580                                       RealName.begin() + Length);
581               RealName.erase(RealName.begin(), RealName.begin() + Length);
582
583               // Because ValueRequired is an invalid flag for grouped arguments,
584               // we don't need to pass argc/argv in...
585               //
586               assert(PGOpt->getValueExpectedFlag() != cl::ValueRequired &&
587                      "Option can not be cl::Grouping AND cl::ValueRequired!");
588               int Dummy;
589               ErrorParsing |= ProvideOption(PGOpt, RealArgName.c_str(),
590                                             0, 0, 0, Dummy);
591
592               // Get the next grouping option...
593               PGOpt = getOptionPred(RealName, Length, isGrouping, Opts);
594             } while (PGOpt && Length != RealName.size());
595
596             Handler = PGOpt; // Ate all of the options.
597           }
598         }
599       }
600     }
601
602     if (Handler == 0) {
603       if (SinkOpts.empty()) {
604         cerr << ProgramName << ": Unknown command line argument '"
605              << argv[i] << "'.  Try: '" << argv[0] << " --help'\n";
606         ErrorParsing = true;
607       } else {
608         for (std::vector<Option*>::iterator I = SinkOpts.begin(),
609                E = SinkOpts.end(); I != E ; ++I)
610           (*I)->addOccurrence(i, "", argv[i]);
611       }
612       continue;
613     }
614
615     // Check to see if this option accepts a comma separated list of values.  If
616     // it does, we have to split up the value into multiple values...
617     if (Value && Handler->getMiscFlags() & CommaSeparated) {
618       std::string Val(Value);
619       std::string::size_type Pos = Val.find(',');
620
621       while (Pos != std::string::npos) {
622         // Process the portion before the comma...
623         ErrorParsing |= ProvideOption(Handler, ArgName,
624                                       std::string(Val.begin(),
625                                                   Val.begin()+Pos).c_str(),
626                                       argc, argv, i);
627         // Erase the portion before the comma, AND the comma...
628         Val.erase(Val.begin(), Val.begin()+Pos+1);
629         Value += Pos+1;  // Increment the original value pointer as well...
630
631         // Check for another comma...
632         Pos = Val.find(',');
633       }
634     }
635
636     // If this is a named positional argument, just remember that it is the
637     // active one...
638     if (Handler->getFormattingFlag() == cl::Positional)
639       ActivePositionalArg = Handler;
640     else
641       ErrorParsing |= ProvideOption(Handler, ArgName, Value, argc, argv, i);
642   }
643
644   // Check and handle positional arguments now...
645   if (NumPositionalRequired > PositionalVals.size()) {
646     cerr << ProgramName
647          << ": Not enough positional command line arguments specified!\n"
648          << "Must specify at least " << NumPositionalRequired
649          << " positional arguments: See: " << argv[0] << " --help\n";
650
651     ErrorParsing = true;
652   } else if (!HasUnlimitedPositionals
653              && PositionalVals.size() > PositionalOpts.size()) {
654     cerr << ProgramName
655          << ": Too many positional arguments specified!\n"
656          << "Can specify at most " << PositionalOpts.size()
657          << " positional arguments: See: " << argv[0] << " --help\n";
658     ErrorParsing = true;
659
660   } else if (ConsumeAfterOpt == 0) {
661     // Positional args have already been handled if ConsumeAfter is specified...
662     unsigned ValNo = 0, NumVals = static_cast<unsigned>(PositionalVals.size());
663     for (size_t i = 0, e = PositionalOpts.size(); i != e; ++i) {
664       if (RequiresValue(PositionalOpts[i])) {
665         ProvidePositionalOption(PositionalOpts[i], PositionalVals[ValNo].first,
666                                 PositionalVals[ValNo].second);
667         ValNo++;
668         --NumPositionalRequired;  // We fulfilled our duty...
669       }
670
671       // If we _can_ give this option more arguments, do so now, as long as we
672       // do not give it values that others need.  'Done' controls whether the
673       // option even _WANTS_ any more.
674       //
675       bool Done = PositionalOpts[i]->getNumOccurrencesFlag() == cl::Required;
676       while (NumVals-ValNo > NumPositionalRequired && !Done) {
677         switch (PositionalOpts[i]->getNumOccurrencesFlag()) {
678         case cl::Optional:
679           Done = true;          // Optional arguments want _at most_ one value
680           // FALL THROUGH
681         case cl::ZeroOrMore:    // Zero or more will take all they can get...
682         case cl::OneOrMore:     // One or more will take all they can get...
683           ProvidePositionalOption(PositionalOpts[i],
684                                   PositionalVals[ValNo].first,
685                                   PositionalVals[ValNo].second);
686           ValNo++;
687           break;
688         default:
689           assert(0 && "Internal error, unexpected NumOccurrences flag in "
690                  "positional argument processing!");
691         }
692       }
693     }
694   } else {
695     assert(ConsumeAfterOpt && NumPositionalRequired <= PositionalVals.size());
696     unsigned ValNo = 0;
697     for (size_t j = 1, e = PositionalOpts.size(); j != e; ++j)
698       if (RequiresValue(PositionalOpts[j])) {
699         ErrorParsing |= ProvidePositionalOption(PositionalOpts[j],
700                                                 PositionalVals[ValNo].first,
701                                                 PositionalVals[ValNo].second);
702         ValNo++;
703       }
704
705     // Handle the case where there is just one positional option, and it's
706     // optional.  In this case, we want to give JUST THE FIRST option to the
707     // positional option and keep the rest for the consume after.  The above
708     // loop would have assigned no values to positional options in this case.
709     //
710     if (PositionalOpts.size() == 2 && ValNo == 0 && !PositionalVals.empty()) {
711       ErrorParsing |= ProvidePositionalOption(PositionalOpts[1],
712                                               PositionalVals[ValNo].first,
713                                               PositionalVals[ValNo].second);
714       ValNo++;
715     }
716
717     // Handle over all of the rest of the arguments to the
718     // cl::ConsumeAfter command line option...
719     for (; ValNo != PositionalVals.size(); ++ValNo)
720       ErrorParsing |= ProvidePositionalOption(ConsumeAfterOpt,
721                                               PositionalVals[ValNo].first,
722                                               PositionalVals[ValNo].second);
723   }
724
725   // Loop over args and make sure all required args are specified!
726   for (std::map<std::string, Option*>::iterator I = Opts.begin(),
727          E = Opts.end(); I != E; ++I) {
728     switch (I->second->getNumOccurrencesFlag()) {
729     case Required:
730     case OneOrMore:
731       if (I->second->getNumOccurrences() == 0) {
732         I->second->error(" must be specified at least once!");
733         ErrorParsing = true;
734       }
735       // Fall through
736     default:
737       break;
738     }
739   }
740
741   // Free all of the memory allocated to the map.  Command line options may only
742   // be processed once!
743   Opts.clear();
744   PositionalOpts.clear();
745   MoreHelp->clear();
746
747   // Free the memory allocated by ExpandResponseFiles.
748   if (ReadResponseFiles) {
749     // Free all the strdup()ed strings.
750     for (std::vector<char*>::iterator i = newArgv.begin(), e = newArgv.end();
751          i != e; ++i)
752       free (*i);
753   }
754
755   // If we had an error processing our arguments, don't let the program execute
756   if (ErrorParsing) exit(1);
757 }
758
759 //===----------------------------------------------------------------------===//
760 // Option Base class implementation
761 //
762
763 bool Option::error(std::string Message, const char *ArgName) {
764   if (ArgName == 0) ArgName = ArgStr;
765   if (ArgName[0] == 0)
766     cerr << HelpStr;  // Be nice for positional arguments
767   else
768     cerr << ProgramName << ": for the -" << ArgName;
769
770   cerr << " option: " << Message << "\n";
771   return true;
772 }
773
774 bool Option::addOccurrence(unsigned pos, const char *ArgName,
775                            const std::string &Value,
776                            bool MultiArg) {
777   if (!MultiArg)
778     NumOccurrences++;   // Increment the number of times we have been seen
779
780   switch (getNumOccurrencesFlag()) {
781   case Optional:
782     if (NumOccurrences > 1)
783       return error(": may only occur zero or one times!", ArgName);
784     break;
785   case Required:
786     if (NumOccurrences > 1)
787       return error(": must occur exactly one time!", ArgName);
788     // Fall through
789   case OneOrMore:
790   case ZeroOrMore:
791   case ConsumeAfter: break;
792   default: return error(": bad num occurrences flag value!");
793   }
794
795   return handleOccurrence(pos, ArgName, Value);
796 }
797
798
799 // getValueStr - Get the value description string, using "DefaultMsg" if nothing
800 // has been specified yet.
801 //
802 static const char *getValueStr(const Option &O, const char *DefaultMsg) {
803   if (O.ValueStr[0] == 0) return DefaultMsg;
804   return O.ValueStr;
805 }
806
807 //===----------------------------------------------------------------------===//
808 // cl::alias class implementation
809 //
810
811 // Return the width of the option tag for printing...
812 size_t alias::getOptionWidth() const {
813   return std::strlen(ArgStr)+6;
814 }
815
816 // Print out the option for the alias.
817 void alias::printOptionInfo(size_t GlobalWidth) const {
818   size_t L = std::strlen(ArgStr);
819   cout << "  -" << ArgStr << std::string(GlobalWidth-L-6, ' ') << " - "
820        << HelpStr << "\n";
821 }
822
823
824
825 //===----------------------------------------------------------------------===//
826 // Parser Implementation code...
827 //
828
829 // basic_parser implementation
830 //
831
832 // Return the width of the option tag for printing...
833 size_t basic_parser_impl::getOptionWidth(const Option &O) const {
834   size_t Len = std::strlen(O.ArgStr);
835   if (const char *ValName = getValueName())
836     Len += std::strlen(getValueStr(O, ValName))+3;
837
838   return Len + 6;
839 }
840
841 // printOptionInfo - Print out information about this option.  The
842 // to-be-maintained width is specified.
843 //
844 void basic_parser_impl::printOptionInfo(const Option &O,
845                                         size_t GlobalWidth) const {
846   cout << "  -" << O.ArgStr;
847
848   if (const char *ValName = getValueName())
849     cout << "=<" << getValueStr(O, ValName) << ">";
850
851   cout << std::string(GlobalWidth-getOptionWidth(O), ' ') << " - "
852        << O.HelpStr << "\n";
853 }
854
855
856
857
858 // parser<bool> implementation
859 //
860 bool parser<bool>::parse(Option &O, const char *ArgName,
861                          const std::string &Arg, bool &Value) {
862   if (Arg == "" || Arg == "true" || Arg == "TRUE" || Arg == "True" ||
863       Arg == "1") {
864     Value = true;
865   } else if (Arg == "false" || Arg == "FALSE" || Arg == "False" || Arg == "0") {
866     Value = false;
867   } else {
868     return O.error(": '" + Arg +
869                    "' is invalid value for boolean argument! Try 0 or 1");
870   }
871   return false;
872 }
873
874 // parser<boolOrDefault> implementation
875 //
876 bool parser<boolOrDefault>::parse(Option &O, const char *ArgName,
877                          const std::string &Arg, boolOrDefault &Value) {
878   if (Arg == "" || Arg == "true" || Arg == "TRUE" || Arg == "True" ||
879       Arg == "1") {
880     Value = BOU_TRUE;
881   } else if (Arg == "false" || Arg == "FALSE" || Arg == "False" || Arg == "0") {
882     Value = BOU_FALSE;
883   } else {
884     return O.error(": '" + Arg +
885                    "' is invalid value for boolean argument! Try 0 or 1");
886   }
887   return false;
888 }
889
890 // parser<int> implementation
891 //
892 bool parser<int>::parse(Option &O, const char *ArgName,
893                         const std::string &Arg, int &Value) {
894   char *End;
895   Value = (int)strtol(Arg.c_str(), &End, 0);
896   if (*End != 0)
897     return O.error(": '" + Arg + "' value invalid for integer argument!");
898   return false;
899 }
900
901 // parser<unsigned> implementation
902 //
903 bool parser<unsigned>::parse(Option &O, const char *ArgName,
904                              const std::string &Arg, unsigned &Value) {
905   char *End;
906   errno = 0;
907   unsigned long V = strtoul(Arg.c_str(), &End, 0);
908   Value = (unsigned)V;
909   if (((V == ULONG_MAX) && (errno == ERANGE))
910       || (*End != 0)
911       || (Value != V))
912     return O.error(": '" + Arg + "' value invalid for uint argument!");
913   return false;
914 }
915
916 // parser<double>/parser<float> implementation
917 //
918 static bool parseDouble(Option &O, const std::string &Arg, double &Value) {
919   const char *ArgStart = Arg.c_str();
920   char *End;
921   Value = strtod(ArgStart, &End);
922   if (*End != 0)
923     return O.error(": '" +Arg+ "' value invalid for floating point argument!");
924   return false;
925 }
926
927 bool parser<double>::parse(Option &O, const char *AN,
928                            const std::string &Arg, double &Val) {
929   return parseDouble(O, Arg, Val);
930 }
931
932 bool parser<float>::parse(Option &O, const char *AN,
933                           const std::string &Arg, float &Val) {
934   double dVal;
935   if (parseDouble(O, Arg, dVal))
936     return true;
937   Val = (float)dVal;
938   return false;
939 }
940
941
942
943 // generic_parser_base implementation
944 //
945
946 // findOption - Return the option number corresponding to the specified
947 // argument string.  If the option is not found, getNumOptions() is returned.
948 //
949 unsigned generic_parser_base::findOption(const char *Name) {
950   unsigned i = 0, e = getNumOptions();
951   std::string N(Name);
952
953   while (i != e)
954     if (getOption(i) == N)
955       return i;
956     else
957       ++i;
958   return e;
959 }
960
961
962 // Return the width of the option tag for printing...
963 size_t generic_parser_base::getOptionWidth(const Option &O) const {
964   if (O.hasArgStr()) {
965     size_t Size = std::strlen(O.ArgStr)+6;
966     for (unsigned i = 0, e = getNumOptions(); i != e; ++i)
967       Size = std::max(Size, std::strlen(getOption(i))+8);
968     return Size;
969   } else {
970     size_t BaseSize = 0;
971     for (unsigned i = 0, e = getNumOptions(); i != e; ++i)
972       BaseSize = std::max(BaseSize, std::strlen(getOption(i))+8);
973     return BaseSize;
974   }
975 }
976
977 // printOptionInfo - Print out information about this option.  The
978 // to-be-maintained width is specified.
979 //
980 void generic_parser_base::printOptionInfo(const Option &O,
981                                           size_t GlobalWidth) const {
982   if (O.hasArgStr()) {
983     size_t L = std::strlen(O.ArgStr);
984     cout << "  -" << O.ArgStr << std::string(GlobalWidth-L-6, ' ')
985          << " - " << O.HelpStr << "\n";
986
987     for (unsigned i = 0, e = getNumOptions(); i != e; ++i) {
988       size_t NumSpaces = GlobalWidth-strlen(getOption(i))-8;
989       cout << "    =" << getOption(i) << std::string(NumSpaces, ' ')
990            << " -   " << getDescription(i) << "\n";
991     }
992   } else {
993     if (O.HelpStr[0])
994       cout << "  " << O.HelpStr << "\n";
995     for (unsigned i = 0, e = getNumOptions(); i != e; ++i) {
996       size_t L = std::strlen(getOption(i));
997       cout << "    -" << getOption(i) << std::string(GlobalWidth-L-8, ' ')
998            << " - " << getDescription(i) << "\n";
999     }
1000   }
1001 }
1002
1003
1004 //===----------------------------------------------------------------------===//
1005 // --help and --help-hidden option implementation
1006 //
1007
1008 namespace {
1009
1010 class HelpPrinter {
1011   size_t MaxArgLen;
1012   const Option *EmptyArg;
1013   const bool ShowHidden;
1014
1015   // isHidden/isReallyHidden - Predicates to be used to filter down arg lists.
1016   inline static bool isHidden(std::pair<std::string, Option *> &OptPair) {
1017     return OptPair.second->getOptionHiddenFlag() >= Hidden;
1018   }
1019   inline static bool isReallyHidden(std::pair<std::string, Option *> &OptPair) {
1020     return OptPair.second->getOptionHiddenFlag() == ReallyHidden;
1021   }
1022
1023 public:
1024   explicit HelpPrinter(bool showHidden) : ShowHidden(showHidden) {
1025     EmptyArg = 0;
1026   }
1027
1028   void operator=(bool Value) {
1029     if (Value == false) return;
1030
1031     // Get all the options.
1032     std::vector<Option*> PositionalOpts;
1033     std::vector<Option*> SinkOpts;
1034     std::map<std::string, Option*> OptMap;
1035     GetOptionInfo(PositionalOpts, SinkOpts, OptMap);
1036
1037     // Copy Options into a vector so we can sort them as we like...
1038     std::vector<std::pair<std::string, Option*> > Opts;
1039     copy(OptMap.begin(), OptMap.end(), std::back_inserter(Opts));
1040
1041     // Eliminate Hidden or ReallyHidden arguments, depending on ShowHidden
1042     Opts.erase(std::remove_if(Opts.begin(), Opts.end(),
1043                           std::ptr_fun(ShowHidden ? isReallyHidden : isHidden)),
1044                Opts.end());
1045
1046     // Eliminate duplicate entries in table (from enum flags options, f.e.)
1047     {  // Give OptionSet a scope
1048       std::set<Option*> OptionSet;
1049       for (unsigned i = 0; i != Opts.size(); ++i)
1050         if (OptionSet.count(Opts[i].second) == 0)
1051           OptionSet.insert(Opts[i].second);   // Add new entry to set
1052         else
1053           Opts.erase(Opts.begin()+i--);    // Erase duplicate
1054     }
1055
1056     if (ProgramOverview)
1057       cout << "OVERVIEW: " << ProgramOverview << "\n";
1058
1059     cout << "USAGE: " << ProgramName << " [options]";
1060
1061     // Print out the positional options.
1062     Option *CAOpt = 0;   // The cl::ConsumeAfter option, if it exists...
1063     if (!PositionalOpts.empty() &&
1064         PositionalOpts[0]->getNumOccurrencesFlag() == ConsumeAfter)
1065       CAOpt = PositionalOpts[0];
1066
1067     for (size_t i = CAOpt != 0, e = PositionalOpts.size(); i != e; ++i) {
1068       if (PositionalOpts[i]->ArgStr[0])
1069         cout << " --" << PositionalOpts[i]->ArgStr;
1070       cout << " " << PositionalOpts[i]->HelpStr;
1071     }
1072
1073     // Print the consume after option info if it exists...
1074     if (CAOpt) cout << " " << CAOpt->HelpStr;
1075
1076     cout << "\n\n";
1077
1078     // Compute the maximum argument length...
1079     MaxArgLen = 0;
1080     for (size_t i = 0, e = Opts.size(); i != e; ++i)
1081       MaxArgLen = std::max(MaxArgLen, Opts[i].second->getOptionWidth());
1082
1083     cout << "OPTIONS:\n";
1084     for (size_t i = 0, e = Opts.size(); i != e; ++i)
1085       Opts[i].second->printOptionInfo(MaxArgLen);
1086
1087     // Print any extra help the user has declared.
1088     for (std::vector<const char *>::iterator I = MoreHelp->begin(),
1089           E = MoreHelp->end(); I != E; ++I)
1090       cout << *I;
1091     MoreHelp->clear();
1092
1093     // Halt the program since help information was printed
1094     exit(1);
1095   }
1096 };
1097 } // End anonymous namespace
1098
1099 // Define the two HelpPrinter instances that are used to print out help, or
1100 // help-hidden...
1101 //
1102 static HelpPrinter NormalPrinter(false);
1103 static HelpPrinter HiddenPrinter(true);
1104
1105 static cl::opt<HelpPrinter, true, parser<bool> >
1106 HOp("help", cl::desc("Display available options (--help-hidden for more)"),
1107     cl::location(NormalPrinter), cl::ValueDisallowed);
1108
1109 static cl::opt<HelpPrinter, true, parser<bool> >
1110 HHOp("help-hidden", cl::desc("Display all available options"),
1111      cl::location(HiddenPrinter), cl::Hidden, cl::ValueDisallowed);
1112
1113 static void (*OverrideVersionPrinter)() = 0;
1114
1115 namespace {
1116 class VersionPrinter {
1117 public:
1118   void print() {
1119         cout << "Low Level Virtual Machine (http://llvm.org/):\n";
1120         cout << "  " << PACKAGE_NAME << " version " << PACKAGE_VERSION;
1121 #ifdef LLVM_VERSION_INFO
1122         cout << LLVM_VERSION_INFO;
1123 #endif
1124         cout << "\n  ";
1125 #ifndef __OPTIMIZE__
1126         cout << "DEBUG build";
1127 #else
1128         cout << "Optimized build";
1129 #endif
1130 #ifndef NDEBUG
1131         cout << " with assertions";
1132 #endif
1133         cout << ".\n";
1134         cout << "  Built " << __DATE__ << "(" << __TIME__ << ").\n";
1135   }
1136   void operator=(bool OptionWasSpecified) {
1137     if (OptionWasSpecified) {
1138       if (OverrideVersionPrinter == 0) {
1139         print();
1140         exit(1);
1141       } else {
1142         (*OverrideVersionPrinter)();
1143         exit(1);
1144       }
1145     }
1146   }
1147 };
1148 } // End anonymous namespace
1149
1150
1151 // Define the --version option that prints out the LLVM version for the tool
1152 static VersionPrinter VersionPrinterInstance;
1153
1154 static cl::opt<VersionPrinter, true, parser<bool> >
1155 VersOp("version", cl::desc("Display the version of this program"),
1156     cl::location(VersionPrinterInstance), cl::ValueDisallowed);
1157
1158 // Utility function for printing the help message.
1159 void cl::PrintHelpMessage() {
1160   // This looks weird, but it actually prints the help message. The
1161   // NormalPrinter variable is a HelpPrinter and the help gets printed when
1162   // its operator= is invoked. That's because the "normal" usages of the
1163   // help printer is to be assigned true/false depending on whether the
1164   // --help option was given or not. Since we're circumventing that we have
1165   // to make it look like --help was given, so we assign true.
1166   NormalPrinter = true;
1167 }
1168
1169 /// Utility function for printing version number.
1170 void cl::PrintVersionMessage() {
1171   VersionPrinterInstance.print();
1172 }
1173
1174 void cl::SetVersionPrinter(void (*func)()) {
1175   OverrideVersionPrinter = func;
1176 }