Pass argc by value, not by reference, since it isn't modified.
[oota-llvm.git] / lib / Support / CommandLine.cpp
index cd903126f5bf85ddf0e7b1093dd837ed19640eb9..eed780437bb0b97416c42eb59e0c9990c1534a6d 100644 (file)
 #include "llvm/Config/config.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/ManagedStatic.h"
+#include "llvm/Support/Streams.h"
 #include "llvm/System/Path.h"
 #include <algorithm>
 #include <functional>
 #include <map>
+#include <ostream>
 #include <set>
-#include <iostream>
 #include <cstdlib>
 #include <cerrno>
 #include <cstring>
@@ -35,6 +36,7 @@ using namespace cl;
 // Template instantiations and anchors.
 //
 TEMPLATE_INSTANTIATION(class basic_parser<bool>);
+TEMPLATE_INSTANTIATION(class basic_parser<boolOrDefault>);
 TEMPLATE_INSTANTIATION(class basic_parser<int>);
 TEMPLATE_INSTANTIATION(class basic_parser<unsigned>);
 TEMPLATE_INSTANTIATION(class basic_parser<double>);
@@ -49,6 +51,7 @@ TEMPLATE_INSTANTIATION(class opt<bool>);
 void Option::anchor() {}
 void basic_parser_impl::anchor() {}
 void parser<bool>::anchor() {}
+void parser<boolOrDefault>::anchor() {}
 void parser<int>::anchor() {}
 void parser<unsigned>::anchor() {}
 void parser<double>::anchor() {}
@@ -57,8 +60,9 @@ void parser<std::string>::anchor() {}
 
 //===----------------------------------------------------------------------===//
 
-// Globals for name and overview of program
-static std::string ProgramName = "<premain>";
+// Globals for name and overview of program.  Program name is not a string to
+// avoid static ctor/dtor issues.
+static char ProgramName[80] = "<premain>";
 static const char *ProgramOverview = 0;
 
 // This collects additional help to be printed.
@@ -69,41 +73,94 @@ extrahelp::extrahelp(const char *Help)
   MoreHelp->push_back(Help);
 }
 
-//===----------------------------------------------------------------------===//
-// Basic, shared command line option processing machinery.
-//
+static bool OptionListChanged = false;
 
-static ManagedStatic<std::map<std::string, Option*> > Options;
-static ManagedStatic<std::vector<Option*> > PositionalOptions;
+// MarkOptionsChanged - Internal helper function.
+void cl::MarkOptionsChanged() {
+  OptionListChanged = true;
+}
+
+/// RegisteredOptionList - This is the list of the command line options that
+/// have statically constructed themselves.
+static Option *RegisteredOptionList = 0;
 
-static Option *getOption(const std::string &Str) {
-  std::map<std::string,Option*>::iterator I = Options->find(Str);
-  return I != Options->end() ? I->second : 0;
+void Option::addArgument() {
+  assert(NextRegistered == 0 && "argument multiply registered!");
+  
+  NextRegistered = RegisteredOptionList;
+  RegisteredOptionList = this;
+  MarkOptionsChanged();
 }
 
-static void AddArgument(const char *ArgName, Option *Opt) {
-  if (getOption(ArgName)) {
-    std::cerr << ProgramName << ": CommandLine Error: Argument '"
-              << ArgName << "' defined more than once!\n";
-  } else {
-    // Add argument to the argument map!
-    (*Options)[ArgName] = Opt;
+
+//===----------------------------------------------------------------------===//
+// Basic, shared command line option processing machinery.
+//
+
+/// GetOptionInfo - Scan the list of registered options, turning them into data
+/// structures that are easier to handle.
+static void GetOptionInfo(std::vector<Option*> &PositionalOpts,
+                          std::map<std::string, Option*> &OptionsMap) {
+  std::vector<const char*> OptionNames;
+  Option *CAOpt = 0;  // The ConsumeAfter option if it exists.
+  for (Option *O = RegisteredOptionList; O; O = O->getNextRegisteredOption()) {
+    // If this option wants to handle multiple option names, get the full set.
+    // This handles enum options like "-O1 -O2" etc.
+    O->getExtraOptionNames(OptionNames);
+    if (O->ArgStr[0])
+      OptionNames.push_back(O->ArgStr);
+    
+    // Handle named options.
+    for (unsigned i = 0, e = OptionNames.size(); i != e; ++i) {
+      // Add argument to the argument map!
+      if (!OptionsMap.insert(std::pair<std::string,Option*>(OptionNames[i],
+                                                            O)).second) {
+        cerr << ProgramName << ": CommandLine Error: Argument '"
+             << OptionNames[0] << "' defined more than once!\n";
+      }
+    }
+    
+    OptionNames.clear();
+    
+    // Remember information about positional options.
+    if (O->getFormattingFlag() == cl::Positional)
+      PositionalOpts.push_back(O);
+    else if (O->getNumOccurrencesFlag() == cl::ConsumeAfter) {
+      if (CAOpt)
+        O->error("Cannot specify more than one option with cl::ConsumeAfter!");
+      CAOpt = O;
+    }
   }
+  
+  if (CAOpt)
+    PositionalOpts.push_back(CAOpt);
+  
+  // Make sure that they are in order of registration not backwards.
+  std::reverse(PositionalOpts.begin(), PositionalOpts.end());
 }
 
-// RemoveArgument - It's possible that the argument is no longer in the map if
-// options have already been processed and the map has been deleted!
-//
-static void RemoveArgument(const char *ArgName, Option *Opt) {
-  if (Options->empty()) return;
 
-#ifndef NDEBUG
-  // This disgusting HACK is brought to you courtesy of GCC 3.3.2, which ICE's
-  // If we pass ArgName directly into getOption here.
-  std::string Tmp = ArgName;
-  assert(getOption(Tmp) == Opt && "Arg not in map!");
-#endif
-  Options->erase(ArgName);
+/// LookupOption - Lookup the option specified by the specified option on the
+/// command line.  If there is a value specified (after an equal sign) return
+/// that as well.
+static Option *LookupOption(const char *&Arg, const char *&Value,
+                            std::map<std::string, Option*> &OptionsMap) {
+  while (*Arg == '-') ++Arg;  // Eat leading dashes
+  
+  const char *ArgEnd = Arg;
+  while (*ArgEnd && *ArgEnd != '=')
+    ++ArgEnd; // Scan till end of argument name.
+  
+  if (*ArgEnd == '=')  // If we have an equals sign...
+    Value = ArgEnd+1;  // Get the value, not the equals
+  
+  
+  if (*Arg == 0) return 0;
+  
+  // Look up the option.
+  std::map<std::string, Option*>::iterator I =
+    OptionsMap.find(std::string(Arg, ArgEnd));
+  return I != OptionsMap.end() ? I->second : 0;
 }
 
 static inline bool ProvideOption(Option *Handler, const char *ArgName,
@@ -128,9 +185,9 @@ static inline bool ProvideOption(Option *Handler, const char *ArgName,
   case ValueOptional:
     break;
   default:
-    std::cerr << ProgramName
-              << ": Bad ValueMask flag! CommandLine usage error:"
-              << Handler->getValueExpectedFlag() << "\n";
+    cerr << ProgramName
+         << ": Bad ValueMask flag! CommandLine usage error:"
+         << Handler->getValueExpectedFlag() << "\n";
     abort();
     break;
   }
@@ -161,27 +218,28 @@ static inline bool isPrefixedOrGrouping(const Option *O) {
 // otherwise return null.
 //
 static Option *getOptionPred(std::string Name, unsigned &Length,
-                             bool (*Pred)(const Option*)) {
+                             bool (*Pred)(const Option*),
+                             std::map<std::string, Option*> &OptionsMap) {
 
-  Option *Op = getOption(Name);
-  if (Op && Pred(Op)) {
+  std::map<std::string, Option*>::iterator OMI = OptionsMap.find(Name);
+  if (OMI != OptionsMap.end() && Pred(OMI->second)) {
     Length = Name.length();
-    return Op;
+    return OMI->second;
   }
 
   if (Name.size() == 1) return 0;
   do {
     Name.erase(Name.end()-1, Name.end());   // Chop off the last character...
-    Op = getOption(Name);
+    OMI = OptionsMap.find(Name);
 
     // Loop while we haven't found an option and Name still has at least two
     // characters in it (so that the next iteration will not be the empty
     // string...
-  } while ((Op == 0 || !Pred(Op)) && Name.size() > 1);
+  } while ((OMI == OptionsMap.end() || !Pred(OMI->second)) && Name.size() > 1);
 
-  if (Op && Pred(Op)) {
+  if (OMI != OptionsMap.end() && Pred(OMI->second)) {
     Length = Name.length();
-    return Op;             // Found one!
+    return OMI->second;    // Found one!
   }
   return 0;                // No option found!
 }
@@ -274,42 +332,25 @@ void cl::ParseEnvironmentOptions(const char *progName, const char *envVar,
     free (*i);
 }
 
-/// LookupOption - Lookup the option specified by the specified option on the
-/// command line.  If there is a value specified (after an equal sign) return
-/// that as well.
-static Option *LookupOption(const char *&Arg, const char *&Value) {
-  while (*Arg == '-') ++Arg;  // Eat leading dashes
-
-  const char *ArgEnd = Arg;
-  while (*ArgEnd && *ArgEnd != '=')
-    ++ArgEnd; // Scan till end of argument name.
-
-  if (*ArgEnd == '=')  // If we have an equals sign...
-    Value = ArgEnd+1;  // Get the value, not the equals
-
-
-  if (*Arg == 0) return 0;
-
-  // Look up the option.
-  std::map<std::string, Option*> &Opts = *Options;
-  std::map<std::string, Option*>::iterator I =
-    Opts.find(std::string(Arg, ArgEnd));
-  return (I != Opts.end()) ? I->second : 0;
-}
-
-void cl::ParseCommandLineOptions(int &argc, char **argv,
+void cl::ParseCommandLineOptions(int argc, char **argv,
                                  const char *Overview) {
-  assert((!Options->empty() || !PositionalOptions->empty()) &&
-         "No options specified, or ParseCommandLineOptions called more"
-         " than once!");
+  // Process all registered options.
+  std::vector<Option*> PositionalOpts;
+  std::map<std::string, Option*> Opts;
+  GetOptionInfo(PositionalOpts, Opts);
+  
+  assert((!Opts.empty() || !PositionalOpts.empty()) &&
+         "No options specified!");
   sys::Path progname(argv[0]);
-  ProgramName = sys::Path(argv[0]).getLast();
+
+  // Copy the program name into ProgName, making sure not to overflow it.
+  std::string ProgName = sys::Path(argv[0]).getLast();
+  if (ProgName.size() > 79) ProgName.resize(79);
+  strcpy(ProgramName, ProgName.c_str());
+  
   ProgramOverview = Overview;
   bool ErrorParsing = false;
 
-  std::map<std::string, Option*> &Opts = *Options;
-  std::vector<Option*> &PositionalOpts = *PositionalOptions;
-
   // Check out the positional arguments to collect information about them.
   unsigned NumPositionalRequired = 0;
   
@@ -371,6 +412,16 @@ void cl::ParseCommandLineOptions(int &argc, char **argv,
     const char *Value = 0;
     const char *ArgName = "";
 
+    // If the option list changed, this means that some command line
+    // option has just been registered or deregistered.  This can occur in
+    // response to things like -load, etc.  If this happens, rescan the options.
+    if (OptionListChanged) {
+      PositionalOpts.clear();
+      Opts.clear();
+      GetOptionInfo(PositionalOpts, Opts);
+      OptionListChanged = false;
+    }
+    
     // Check to see if this is a positional argument.  This argument is
     // considered to be positional if it doesn't start with '-', if it is "-"
     // itself, or if we have seen "--" already.
@@ -406,7 +457,7 @@ void cl::ParseCommandLineOptions(int &argc, char **argv,
       // option is another positional argument.  If so, treat it as an argument,
       // otherwise feed it to the eating positional.
       ArgName = argv[i]+1;
-      Handler = LookupOption(ArgName, Value);
+      Handler = LookupOption(ArgName, Value, Opts);
       if (!Handler || Handler->getFormattingFlag() != cl::Positional) {
         ProvidePositionalOption(ActivePositionalArg, argv[i], i);
         continue;  // We are done!
@@ -414,14 +465,15 @@ void cl::ParseCommandLineOptions(int &argc, char **argv,
 
     } else {     // We start with a '-', must be an argument...
       ArgName = argv[i]+1;
-      Handler = LookupOption(ArgName, Value);
+      Handler = LookupOption(ArgName, Value, Opts);
 
       // Check to see if this "option" is really a prefixed or grouped argument.
       if (Handler == 0) {
         std::string RealName(ArgName);
         if (RealName.size() > 1) {
           unsigned Length = 0;
-          Option *PGOpt = getOptionPred(RealName, Length, isPrefixedOrGrouping);
+          Option *PGOpt = getOptionPred(RealName, Length, isPrefixedOrGrouping,
+                                        Opts);
 
           // If the option is a prefixed option, then the value is simply the
           // rest of the name...  so fall through to later processing, by
@@ -452,7 +504,7 @@ void cl::ParseCommandLineOptions(int &argc, char **argv,
                                             0, 0, 0, Dummy);
 
               // Get the next grouping option...
-              PGOpt = getOptionPred(RealName, Length, isGrouping);
+              PGOpt = getOptionPred(RealName, Length, isGrouping, Opts);
             } while (PGOpt && Length != RealName.size());
 
             Handler = PGOpt; // Ate all of the options.
@@ -462,8 +514,8 @@ void cl::ParseCommandLineOptions(int &argc, char **argv,
     }
 
     if (Handler == 0) {
-      std::cerr << ProgramName << ": Unknown command line argument '"
-                  << argv[i] << "'.  Try: '" << argv[0] << " --help'\n";
+      cerr << ProgramName << ": Unknown command line argument '"
+           << argv[i] << "'.  Try: '" << argv[0] << " --help'\n";
       ErrorParsing = true;
       continue;
     }
@@ -499,18 +551,18 @@ void cl::ParseCommandLineOptions(int &argc, char **argv,
 
   // Check and handle positional arguments now...
   if (NumPositionalRequired > PositionalVals.size()) {
-    std::cerr << ProgramName
-              << ": Not enough positional command line arguments specified!\n"
-              << "Must specify at least " << NumPositionalRequired
-              << " positional arguments: See: " << argv[0] << " --help\n";
+    cerr << ProgramName
+         << ": Not enough positional command line arguments specified!\n"
+         << "Must specify at least " << NumPositionalRequired
+         << " positional arguments: See: " << argv[0] << " --help\n";
     
     ErrorParsing = true;
   } else if (!HasUnlimitedPositionals
              && PositionalVals.size() > PositionalOpts.size()) {
-    std::cerr << ProgramName
-              << ": Too many positional arguments specified!\n"
-              << "Can specify at most " << PositionalOpts.size()
-              << " positional arguments: See: " << argv[0] << " --help\n";
+    cerr << ProgramName
+         << ": Too many positional arguments specified!\n"
+         << "Can specify at most " << PositionalOpts.size()
+         << " positional arguments: See: " << argv[0] << " --help\n";
     ErrorParsing = true;
 
   } else if (ConsumeAfterOpt == 0) {
@@ -611,11 +663,11 @@ void cl::ParseCommandLineOptions(int &argc, char **argv,
 bool Option::error(std::string Message, const char *ArgName) {
   if (ArgName == 0) ArgName = ArgStr;
   if (ArgName[0] == 0)
-    std::cerr << HelpStr;  // Be nice for positional arguments
+    cerr << HelpStr;  // Be nice for positional arguments
   else
-    std::cerr << ProgramName << ": for the -" << ArgName;
+    cerr << ProgramName << ": for the -" << ArgName;
   
-  std::cerr << " option: " << Message << "\n";
+  cerr << " option: " << Message << "\n";
   return true;
 }
 
@@ -641,39 +693,6 @@ bool Option::addOccurrence(unsigned pos, const char *ArgName,
   return handleOccurrence(pos, ArgName, Value);
 }
 
-// addArgument - Tell the system that this Option subclass will handle all
-// occurrences of -ArgStr on the command line.
-//
-void Option::addArgument(const char *ArgStr) {
-  if (ArgStr[0])
-    AddArgument(ArgStr, this);
-
-  if (getFormattingFlag() == Positional)
-    PositionalOptions->push_back(this);
-  else if (getNumOccurrencesFlag() == ConsumeAfter) {
-    if (!PositionalOptions->empty() &&
-        PositionalOptions->front()->getNumOccurrencesFlag() == ConsumeAfter)
-      error("Cannot specify more than one option with cl::ConsumeAfter!");
-    PositionalOptions->insert(PositionalOptions->begin(), this);
-  }
-}
-
-void Option::removeArgument(const char *ArgStr) {
-  if (ArgStr[0])
-    RemoveArgument(ArgStr, this);
-
-  if (getFormattingFlag() == Positional) {
-    std::vector<Option*>::iterator I =
-      std::find(PositionalOptions->begin(), PositionalOptions->end(), this);
-    assert(I != PositionalOptions->end() && "Arg not registered!");
-    PositionalOptions->erase(I);
-  } else if (getNumOccurrencesFlag() == ConsumeAfter) {
-    assert(!PositionalOptions->empty() && (*PositionalOptions)[0] == this &&
-           "Arg not registered correctly!");
-    PositionalOptions->erase(PositionalOptions->begin());
-  }
-}
-
 
 // getValueStr - Get the value description string, using "DefaultMsg" if nothing
 // has been specified yet.
@@ -695,8 +714,8 @@ unsigned alias::getOptionWidth() const {
 // Print out the option for the alias.
 void alias::printOptionInfo(unsigned GlobalWidth) const {
   unsigned L = std::strlen(ArgStr);
-  std::cout << "  -" << ArgStr << std::string(GlobalWidth-L-6, ' ') << " - "
-            << HelpStr << "\n";
+  cout << "  -" << ArgStr << std::string(GlobalWidth-L-6, ' ') << " - "
+       << HelpStr << "\n";
 }
 
 
@@ -722,13 +741,13 @@ unsigned basic_parser_impl::getOptionWidth(const Option &O) const {
 //
 void basic_parser_impl::printOptionInfo(const Option &O,
                                         unsigned GlobalWidth) const {
-  std::cout << "  -" << O.ArgStr;
+  cout << "  -" << O.ArgStr;
 
   if (const char *ValName = getValueName())
-    std::cout << "=<" << getValueStr(O, ValName) << ">";
+    cout << "=<" << getValueStr(O, ValName) << ">";
 
-  std::cout << std::string(GlobalWidth-getOptionWidth(O), ' ') << " - "
-            << O.HelpStr << "\n";
+  cout << std::string(GlobalWidth-getOptionWidth(O), ' ') << " - "
+       << O.HelpStr << "\n";
 }
 
 
@@ -750,6 +769,22 @@ bool parser<bool>::parse(Option &O, const char *ArgName,
   return false;
 }
 
+// parser<boolOrDefault> implementation
+//
+bool parser<boolOrDefault>::parse(Option &O, const char *ArgName,
+                         const std::string &Arg, boolOrDefault &Value) {
+  if (Arg == "" || Arg == "true" || Arg == "TRUE" || Arg == "True" ||
+      Arg == "1") {
+    Value = BOU_TRUE;
+  } else if (Arg == "false" || Arg == "FALSE" || Arg == "False" || Arg == "0") {
+    Value = BOU_FALSE;
+  } else {
+    return O.error(": '" + Arg +
+                   "' is invalid value for boolean argument! Try 0 or 1");
+  }
+  return false;
+}
+
 // parser<int> implementation
 //
 bool parser<int>::parse(Option &O, const char *ArgName,
@@ -844,21 +879,21 @@ void generic_parser_base::printOptionInfo(const Option &O,
                                           unsigned GlobalWidth) const {
   if (O.hasArgStr()) {
     unsigned L = std::strlen(O.ArgStr);
-    std::cout << "  -" << O.ArgStr << std::string(GlobalWidth-L-6, ' ')
-              << " - " << O.HelpStr << "\n";
+    cout << "  -" << O.ArgStr << std::string(GlobalWidth-L-6, ' ')
+         << " - " << O.HelpStr << "\n";
 
     for (unsigned i = 0, e = getNumOptions(); i != e; ++i) {
       unsigned NumSpaces = GlobalWidth-strlen(getOption(i))-8;
-      std::cout << "    =" << getOption(i) << std::string(NumSpaces, ' ')
-                << " - " << getDescription(i) << "\n";
+      cout << "    =" << getOption(i) << std::string(NumSpaces, ' ')
+           << " - " << getDescription(i) << "\n";
     }
   } else {
     if (O.HelpStr[0])
-      std::cout << "  " << O.HelpStr << "\n";
+      cout << "  " << O.HelpStr << "\n";
     for (unsigned i = 0, e = getNumOptions(); i != e; ++i) {
       unsigned L = std::strlen(getOption(i));
-      std::cout << "    -" << getOption(i) << std::string(GlobalWidth-L-8, ' ')
-                << " - " << getDescription(i) << "\n";
+      cout << "    -" << getOption(i) << std::string(GlobalWidth-L-8, ' ')
+           << " - " << getDescription(i) << "\n";
     }
   }
 }
@@ -891,9 +926,14 @@ public:
   void operator=(bool Value) {
     if (Value == false) return;
 
+    // Get all the options.
+    std::vector<Option*> PositionalOpts;
+    std::map<std::string, Option*> OptMap;
+    GetOptionInfo(PositionalOpts, OptMap);
+    
     // Copy Options into a vector so we can sort them as we like...
     std::vector<std::pair<std::string, Option*> > Opts;
-    copy(Options->begin(), Options->end(), std::back_inserter(Opts));
+    copy(OptMap.begin(), OptMap.end(), std::back_inserter(Opts));
 
     // Eliminate Hidden or ReallyHidden arguments, depending on ShowHidden
     Opts.erase(std::remove_if(Opts.begin(), Opts.end(),
@@ -911,44 +951,43 @@ public:
     }
 
     if (ProgramOverview)
-      std::cout << "OVERVIEW:" << ProgramOverview << "\n";
+      cout << "OVERVIEW: " << ProgramOverview << "\n";
 
-    std::cout << "USAGE: " << ProgramName << " [options]";
+    cout << "USAGE: " << ProgramName << " [options]";
 
     // Print out the positional options.
-    std::vector<Option*> &PosOpts = *PositionalOptions;
     Option *CAOpt = 0;   // The cl::ConsumeAfter option, if it exists...
-    if (!PosOpts.empty() && PosOpts[0]->getNumOccurrencesFlag() == ConsumeAfter)
-      CAOpt = PosOpts[0];
-
-    for (unsigned i = CAOpt != 0, e = PosOpts.size(); i != e; ++i) {
-      if (PosOpts[i]->ArgStr[0])
-        std::cout << " --" << PosOpts[i]->ArgStr;
-      std::cout << " " << PosOpts[i]->HelpStr;
+    if (!PositionalOpts.empty() && 
+        PositionalOpts[0]->getNumOccurrencesFlag() == ConsumeAfter)
+      CAOpt = PositionalOpts[0];
+
+    for (unsigned i = CAOpt != 0, e = PositionalOpts.size(); i != e; ++i) {
+      if (PositionalOpts[i]->ArgStr[0])
+        cout << " --" << PositionalOpts[i]->ArgStr;
+      cout << " " << PositionalOpts[i]->HelpStr;
     }
 
     // Print the consume after option info if it exists...
-    if (CAOpt) std::cout << " " << CAOpt->HelpStr;
+    if (CAOpt) cout << " " << CAOpt->HelpStr;
 
-    std::cout << "\n\n";
+    cout << "\n\n";
 
     // Compute the maximum argument length...
     MaxArgLen = 0;
     for (unsigned i = 0, e = Opts.size(); i != e; ++i)
       MaxArgLen = std::max(MaxArgLen, Opts[i].second->getOptionWidth());
 
-    std::cout << "OPTIONS:\n";
+    cout << "OPTIONS:\n";
     for (unsigned i = 0, e = Opts.size(); i != e; ++i)
       Opts[i].second->printOptionInfo(MaxArgLen);
 
     // Print any extra help the user has declared.
     for (std::vector<const char *>::iterator I = MoreHelp->begin(),
           E = MoreHelp->end(); I != E; ++I)
-      std::cout << *I;
+      cout << *I;
     MoreHelp->clear();
 
     // Halt the program since help information was printed
-    Options->clear();  // Don't bother making option dtors remove from map.
     exit(1);
   }
 };
@@ -973,25 +1012,27 @@ static void (*OverrideVersionPrinter)() = 0;
 namespace {
 class VersionPrinter {
 public:
-  void operator=(bool OptionWasSpecified) {
-    if (OptionWasSpecified) {
-      if (OverrideVersionPrinter == 0) {
-        std::cout << "Low Level Virtual Machine (http://llvm.org/):\n";
-        std::cout << "  " << PACKAGE_NAME << " version " << PACKAGE_VERSION;
+  void print() {
+        cout << "Low Level Virtual Machine (http://llvm.org/):\n";
+        cout << "  " << PACKAGE_NAME << " version " << PACKAGE_VERSION;
 #ifdef LLVM_VERSION_INFO
-        std::cout << LLVM_VERSION_INFO;
+        cout << LLVM_VERSION_INFO;
 #endif
-        std::cout << "\n  ";
+        cout << "\n  ";
 #ifndef __OPTIMIZE__
-        std::cout << "DEBUG build";
+        cout << "DEBUG build";
 #else
-        std::cout << "Optimized build";
+        cout << "Optimized build";
 #endif
 #ifndef NDEBUG
-        std::cout << " with assertions";
+        cout << " with assertions";
 #endif
-        std::cout << ".\n";
-        Options->clear();  // Don't bother making option dtors remove from map.
+        cout << ".\n";
+  }
+  void operator=(bool OptionWasSpecified) {
+    if (OptionWasSpecified) {
+      if (OverrideVersionPrinter == 0) {
+        print();
         exit(1);
       } else {
         (*OverrideVersionPrinter)();
@@ -1021,6 +1062,11 @@ void cl::PrintHelpMessage() {
   NormalPrinter = true;
 }
 
+/// Utility function for printing version number.
+void cl::PrintVersionMessage() {
+  VersionPrinterInstance.print();
+}
+
 void cl::SetVersionPrinter(void (*func)()) {
   OverrideVersionPrinter = func;
 }