CommandLine.h revision de551f91d8816632a76a065084caab9fab6aacff
1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer//===- llvm/Support/CommandLine.h - Command line handler --------*- C++ -*-===//
263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman//
3b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//                     The LLVM Compiler Infrastructure
4b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman//
8b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//===----------------------------------------------------------------------===//
9cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//
10cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// This class implements a command line argument processor that is useful when
11cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// creating a tool.  It provides a simple, minimalistic interface that is easily
12cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// extensible and supports nonlocal (library) command line options.
13cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//
14331de23705a719514e37c211f327379688f81b0dChris Lattner// Note that rather than trying to figure out what this code does, you should
15331de23705a719514e37c211f327379688f81b0dChris Lattner// read the library documentation located in docs/CommandLine.html or looks at
16331de23705a719514e37c211f327379688f81b0dChris Lattner// the many example usages in tools/*/*.cpp
17cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//
18cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===//
19cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#ifndef LLVM_SUPPORT_COMMANDLINE_H
21551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#define LLVM_SUPPORT_COMMANDLINE_H
22cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
23551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/type_traits.h"
2466c5fd6c537269eaef0f630fa14360dcaff6a295Jeff Cohen#include "llvm/Support/DataTypes.h"
257422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner#include "llvm/Support/Compiler.h"
263b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner#include "llvm/ADT/SmallVector.h"
27630fcb86785f96501126e52009619b475403dc62Misha Brukman#include <cassert>
28de551f91d8816632a76a065084caab9fab6aacffDan Gohman#include <climits>
29630fcb86785f96501126e52009619b475403dc62Misha Brukman#include <cstdarg>
30cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner#include <string>
31cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner#include <utility>
32630fcb86785f96501126e52009619b475403dc62Misha Brukman#include <vector>
33be583b914d8156b99d3da264d5adca37fee8dbc9John Criswell
34d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
357b3d73b7ecbecf423c3766e596b6086767444363Chris Lattner
36bf0ac3fe69aa9e1bfcffec36ea53dadbb97c6b4dChris Lattner/// cl Namespace - This namespace contains all of the command line option
37bf0ac3fe69aa9e1bfcffec36ea53dadbb97c6b4dChris Lattner/// processing machinery.  It is intentionally a short name to make qualified
38bf0ac3fe69aa9e1bfcffec36ea53dadbb97c6b4dChris Lattner/// usage concise.
39bf0ac3fe69aa9e1bfcffec36ea53dadbb97c6b4dChris Lattnernamespace cl {
40cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
41cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===//
42331de23705a719514e37c211f327379688f81b0dChris Lattner// ParseCommandLineOptions - Command line option processing entry point.
43cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//
449a5263241d40d493445d7f386b4d76be088c3ac1Dan Gohmanvoid ParseCommandLineOptions(int argc, char **argv,
45beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov                             const char *Overview = 0,
46beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov                             bool ReadResponseFiles = false);
47cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
48cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===//
4906b06c5f00acffdab8c59e3dc5baca3eacca172aBrian Gaeke// ParseEnvironmentOptions - Environment variable option processing alternate
5006b06c5f00acffdab8c59e3dc5baca3eacca172aBrian Gaeke//                           entry point.
5106b06c5f00acffdab8c59e3dc5baca3eacca172aBrian Gaeke//
52c48ef2ae36e2169872a828a5399ccd1993837915Brian Gaekevoid ParseEnvironmentOptions(const char *progName, const char *envvar,
53beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov                             const char *Overview = 0,
54beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov                             bool ReadResponseFiles = false);
5506b06c5f00acffdab8c59e3dc5baca3eacca172aBrian Gaeke
56515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencer///===---------------------------------------------------------------------===//
57515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencer/// SetVersionPrinter - Override the default (LLVM specific) version printer
58515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencer///                     used to print out the version when --version is given
593ab264a985de3d86e0d1f5716f6d633fd8538618Dan Gohman///                     on the command line. This allows other systems using the
60515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencer///                     CommandLine utilities to print their own version string.
61515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencervoid SetVersionPrinter(void (*func)());
62515b5b379f3508f36f647bfdafce409e28a3d90bReid Spencer
6369d6f1358ca8c442a65fd8d5900f7296fbb2762dChris Lattner
6469d6f1358ca8c442a65fd8d5900f7296fbb2762dChris Lattner// MarkOptionsChanged - Internal helper function.
6569d6f1358ca8c442a65fd8d5900f7296fbb2762dChris Lattnervoid MarkOptionsChanged();
6669d6f1358ca8c442a65fd8d5900f7296fbb2762dChris Lattner
6706b06c5f00acffdab8c59e3dc5baca3eacca172aBrian Gaeke//===----------------------------------------------------------------------===//
68331de23705a719514e37c211f327379688f81b0dChris Lattner// Flags permitted to be passed to command line arguments
69331de23705a719514e37c211f327379688f81b0dChris Lattner//
70cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
711e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencerenum NumOccurrences {          // Flags for the number of occurrences allowed
72b5c520bfb6505caaa6ad8468b372530d44c8b253Misha Brukman  Optional        = 0x01,      // Zero or One occurrence
73b5c520bfb6505caaa6ad8468b372530d44c8b253Misha Brukman  ZeroOrMore      = 0x02,      // Zero or more occurrences allowed
74b5c520bfb6505caaa6ad8468b372530d44c8b253Misha Brukman  Required        = 0x03,      // One occurrence required
75b5c520bfb6505caaa6ad8468b372530d44c8b253Misha Brukman  OneOrMore       = 0x04,      // One or more occurrences required
76cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
77331de23705a719514e37c211f327379688f81b0dChris Lattner  // ConsumeAfter - Indicates that this option is fed anything that follows the
78331de23705a719514e37c211f327379688f81b0dChris Lattner  // last positional argument required by the application (it is an error if
79331de23705a719514e37c211f327379688f81b0dChris Lattner  // there are zero positional arguments, and a ConsumeAfter option is used).
80331de23705a719514e37c211f327379688f81b0dChris Lattner  // Thus, for example, all arguments to LLI are processed until a filename is
81331de23705a719514e37c211f327379688f81b0dChris Lattner  // found.  Once a filename is found, all of the succeeding arguments are
82331de23705a719514e37c211f327379688f81b0dChris Lattner  // passed, unprocessed, to the ConsumeAfter option.
83cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  //
84cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  ConsumeAfter    = 0x05,
85cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
8640f44f1f58f823994b7f4ec4005887c3955fb1e7Chris Lattner  OccurrencesMask  = 0x07
87cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner};
88cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
89cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerenum ValueExpected {           // Is a value required for the option?
90b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner  ValueOptional   = 0x08,      // The value can appear... or not
91cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  ValueRequired   = 0x10,      // The value is required to appear!
92cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  ValueDisallowed = 0x18,      // A value may not be specified (for flags)
9340f44f1f58f823994b7f4ec4005887c3955fb1e7Chris Lattner  ValueMask       = 0x18
94cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner};
95cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
96cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerenum OptionHidden {            // Control whether -help shows this option
97cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  NotHidden       = 0x20,      // Option included in --help & --help-hidden
98cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  Hidden          = 0x40,      // -help doesn't, but --help-hidden does
99cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  ReallyHidden    = 0x60,      // Neither --help nor --help-hidden show this arg
10040f44f1f58f823994b7f4ec4005887c3955fb1e7Chris Lattner  HiddenMask      = 0x60
101cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner};
102cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
103331de23705a719514e37c211f327379688f81b0dChris Lattner// Formatting flags - This controls special features that the option might have
104331de23705a719514e37c211f327379688f81b0dChris Lattner// that cause it to be parsed differently...
105331de23705a719514e37c211f327379688f81b0dChris Lattner//
106331de23705a719514e37c211f327379688f81b0dChris Lattner// Prefix - This option allows arguments that are otherwise unrecognized to be
107331de23705a719514e37c211f327379688f81b0dChris Lattner// matched by options that are a prefix of the actual value.  This is useful for
108331de23705a719514e37c211f327379688f81b0dChris Lattner// cases like a linker, where options are typically of the form '-lfoo' or
109331de23705a719514e37c211f327379688f81b0dChris Lattner// '-L../../include' where -l or -L are the actual flags.  When prefix is
110331de23705a719514e37c211f327379688f81b0dChris Lattner// enabled, and used, the value for the flag comes from the suffix of the
111331de23705a719514e37c211f327379688f81b0dChris Lattner// argument.
112331de23705a719514e37c211f327379688f81b0dChris Lattner//
113331de23705a719514e37c211f327379688f81b0dChris Lattner// Grouping - With this option enabled, multiple letter options are allowed to
114331de23705a719514e37c211f327379688f81b0dChris Lattner// bunch together with only a single hyphen for the whole group.  This allows
115331de23705a719514e37c211f327379688f81b0dChris Lattner// emulation of the behavior that ls uses for example: ls -la === ls -l -a
116331de23705a719514e37c211f327379688f81b0dChris Lattner//
117331de23705a719514e37c211f327379688f81b0dChris Lattner
118331de23705a719514e37c211f327379688f81b0dChris Lattnerenum FormattingFlags {
119331de23705a719514e37c211f327379688f81b0dChris Lattner  NormalFormatting = 0x000,     // Nothing special
120331de23705a719514e37c211f327379688f81b0dChris Lattner  Positional       = 0x080,     // Is a positional argument, no '-' required
121331de23705a719514e37c211f327379688f81b0dChris Lattner  Prefix           = 0x100,     // Can this option directly prefix its value?
122331de23705a719514e37c211f327379688f81b0dChris Lattner  Grouping         = 0x180,     // Can this option group with other options?
12340f44f1f58f823994b7f4ec4005887c3955fb1e7Chris Lattner  FormattingMask   = 0x180      // Union of the above flags.
124331de23705a719514e37c211f327379688f81b0dChris Lattner};
125331de23705a719514e37c211f327379688f81b0dChris Lattner
1261e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencerenum MiscFlags {               // Miscellaneous flags to adjust argument
1271e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer  CommaSeparated     = 0x200,  // Should this cl::list split between commas?
1281e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer  PositionalEatsArgs = 0x400,  // Should this positional cl::list eat -args?
129d57160d097d6cdb966e5c851215acbd2bf1aa236Anton Korobeynikov  Sink               = 0x800,  // Should this cl::list eat all unknown options?
130d64e0eb094a108bdcdf51328425904042aa6122bMike Stump  AllowInverse	     = 0x1000, // Can this option take a -Xno- form?
131d64e0eb094a108bdcdf51328425904042aa6122bMike Stump  MiscMask           = 0x1E00  // Union of the above flags.
132b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner};
133b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner
134b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner
135cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
136cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===//
137cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner// Option Base class
138cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//
139331de23705a719514e37c211f327379688f81b0dChris Lattnerclass alias;
140cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerclass Option {
141331de23705a719514e37c211f327379688f81b0dChris Lattner  friend class alias;
142cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
143dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukman  // handleOccurrences - Overriden by subclasses to handle the value passed into
144cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  // an argument.  Should return true if there was an error processing the
145cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  // argument and the program should exit.
146cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  //
14763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman  virtual bool handleOccurrence(unsigned pos, const char *ArgName,
1481e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer                                const std::string &Arg) = 0;
149cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
150cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  virtual enum ValueExpected getValueExpectedFlagDefault() const {
15163b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman    return ValueOptional;
152cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  }
153beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov
154433fd76e51e9bd9a4933e2c1775a7410928112c8Chris Lattner  // Out of line virtual function to provide home for the class.
155433fd76e51e9bd9a4933e2c1775a7410928112c8Chris Lattner  virtual void anchor();
156beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov
1579878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  int NumOccurrences;     // The number of times specified
1589878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  int Flags;              // Flags for the argument
1599878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  unsigned Position;      // Position of last occurrence of the option
1607059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov  unsigned AdditionalVals;// Greater than 0 for multi-valued option.
1619878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  Option *NextRegistered; // Singly linked list of registered options.
162cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic:
1639878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  const char *ArgStr;     // The argument string itself (ex: "help", "o")
1649878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  const char *HelpStr;    // The descriptive text message for --help
1659878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  const char *ValueStr;   // String describing what the value of this option is
166cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
167dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukman  inline enum NumOccurrences getNumOccurrencesFlag() const {
168f6143ef556ed01311d2043d38421302479f7866cChris Lattner    return static_cast<enum NumOccurrences>(Flags & OccurrencesMask);
169cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  }
170cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  inline enum ValueExpected getValueExpectedFlag() const {
171cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner    int VE = Flags & ValueMask;
1728b70b78ba489b090d9866e6a4084ab1e8613b527Chris Lattner    return VE ? static_cast<enum ValueExpected>(VE)
1738b70b78ba489b090d9866e6a4084ab1e8613b527Chris Lattner              : getValueExpectedFlagDefault();
174cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  }
175cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  inline enum OptionHidden getOptionHiddenFlag() const {
176f6143ef556ed01311d2043d38421302479f7866cChris Lattner    return static_cast<enum OptionHidden>(Flags & HiddenMask);
177cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  }
178331de23705a719514e37c211f327379688f81b0dChris Lattner  inline enum FormattingFlags getFormattingFlag() const {
179f6143ef556ed01311d2043d38421302479f7866cChris Lattner    return static_cast<enum FormattingFlags>(Flags & FormattingMask);
180331de23705a719514e37c211f327379688f81b0dChris Lattner  }
181b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner  inline unsigned getMiscFlags() const {
182b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner    return Flags & MiscMask;
183b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner  }
1841e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer  inline unsigned getPosition() const { return Position; }
1857059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov  inline unsigned getNumAdditionalVals() const { return AdditionalVals; }
186331de23705a719514e37c211f327379688f81b0dChris Lattner
187331de23705a719514e37c211f327379688f81b0dChris Lattner  // hasArgStr - Return true if the argstr != ""
188331de23705a719514e37c211f327379688f81b0dChris Lattner  bool hasArgStr() const { return ArgStr[0] != 0; }
189331de23705a719514e37c211f327379688f81b0dChris Lattner
190331de23705a719514e37c211f327379688f81b0dChris Lattner  //-------------------------------------------------------------------------===
191331de23705a719514e37c211f327379688f81b0dChris Lattner  // Accessor functions set by OptionModifiers
192331de23705a719514e37c211f327379688f81b0dChris Lattner  //
193331de23705a719514e37c211f327379688f81b0dChris Lattner  void setArgStr(const char *S) { ArgStr = S; }
194331de23705a719514e37c211f327379688f81b0dChris Lattner  void setDescription(const char *S) { HelpStr = S; }
195331de23705a719514e37c211f327379688f81b0dChris Lattner  void setValueStr(const char *S) { ValueStr = S; }
196331de23705a719514e37c211f327379688f81b0dChris Lattner
197331de23705a719514e37c211f327379688f81b0dChris Lattner  void setFlag(unsigned Flag, unsigned FlagMask) {
198f3799d6317e38a996dcea50143cbc15543d8f5c4Chris Lattner    Flags &= ~FlagMask;
199331de23705a719514e37c211f327379688f81b0dChris Lattner    Flags |= Flag;
200331de23705a719514e37c211f327379688f81b0dChris Lattner  }
201331de23705a719514e37c211f327379688f81b0dChris Lattner
202dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukman  void setNumOccurrencesFlag(enum NumOccurrences Val) {
203dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukman    setFlag(Val, OccurrencesMask);
204331de23705a719514e37c211f327379688f81b0dChris Lattner  }
205331de23705a719514e37c211f327379688f81b0dChris Lattner  void setValueExpectedFlag(enum ValueExpected Val) { setFlag(Val, ValueMask); }
206331de23705a719514e37c211f327379688f81b0dChris Lattner  void setHiddenFlag(enum OptionHidden Val) { setFlag(Val, HiddenMask); }
207331de23705a719514e37c211f327379688f81b0dChris Lattner  void setFormattingFlag(enum FormattingFlags V) { setFlag(V, FormattingMask); }
208b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner  void setMiscFlag(enum MiscFlags M) { setFlag(M, M); }
2091e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer  void setPosition(unsigned pos) { Position = pos; }
210cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerprotected:
21127e9d457d4047cf0051e17d9ca39740875d11440Dan Gohman  explicit Option(unsigned DefaultFlags)
212f6143ef556ed01311d2043d38421302479f7866cChris Lattner    : NumOccurrences(0), Flags(DefaultFlags | NormalFormatting), Position(0),
2137059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov      AdditionalVals(0), NextRegistered(0),
2147059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov      ArgStr(""), HelpStr(""), ValueStr("") {
215f6143ef556ed01311d2043d38421302479f7866cChris Lattner    assert(getNumOccurrencesFlag() != 0 &&
216f6143ef556ed01311d2043d38421302479f7866cChris Lattner           getOptionHiddenFlag() != 0 && "Not all default flags specified!");
217f6143ef556ed01311d2043d38421302479f7866cChris Lattner  }
218cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
2197059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov  inline void setNumAdditionalVals(unsigned n)
2207059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov  { AdditionalVals = n; }
221cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic:
2229878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  // addArgument - Register this argument with the commandline system.
223331de23705a719514e37c211f327379688f81b0dChris Lattner  //
2249878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  void addArgument();
225beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov
2269878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  Option *getNextRegisteredOption() const { return NextRegistered; }
227331de23705a719514e37c211f327379688f81b0dChris Lattner
228cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  // Return the width of the option tag for printing...
22934cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  virtual size_t getOptionWidth() const = 0;
230cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
23163b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman  // printOptionInfo - Print out information about this option.  The
232cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  // to-be-maintained width is specified.
233cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  //
23434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  virtual void printOptionInfo(size_t GlobalWidth) const = 0;
235cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
23613d57320bd212483463d4f8992d5787b29eda5dfBill Wendling  virtual void getExtraOptionNames(std::vector<const char*> &) {}
237beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov
238dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukman  // addOccurrence - Wrapper around handleOccurrence that enforces Flags
239cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  //
24063b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman  bool addOccurrence(unsigned pos, const char *ArgName,
2417059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov                     const std::string &Value, bool MultiArg = false);
242cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
243cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  // Prints option name followed by message.  Always returns true.
244697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  bool error(std::string Message, const char *ArgName = 0);
245cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
246cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic:
247dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukman  inline int getNumOccurrences() const { return NumOccurrences; }
248cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  virtual ~Option() {}
249cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner};
250cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
251cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
252cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===//
253331de23705a719514e37c211f327379688f81b0dChris Lattner// Command line option modifiers that can be used to modify the behavior of
254331de23705a719514e37c211f327379688f81b0dChris Lattner// command line option parsers...
255cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//
256331de23705a719514e37c211f327379688f81b0dChris Lattner
257331de23705a719514e37c211f327379688f81b0dChris Lattner// desc - Modifier to set the description shown in the --help output...
258331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct desc {
259331de23705a719514e37c211f327379688f81b0dChris Lattner  const char *Desc;
260331de23705a719514e37c211f327379688f81b0dChris Lattner  desc(const char *Str) : Desc(Str) {}
261331de23705a719514e37c211f327379688f81b0dChris Lattner  void apply(Option &O) const { O.setDescription(Desc); }
262331de23705a719514e37c211f327379688f81b0dChris Lattner};
263331de23705a719514e37c211f327379688f81b0dChris Lattner
264331de23705a719514e37c211f327379688f81b0dChris Lattner// value_desc - Modifier to set the value description shown in the --help
265331de23705a719514e37c211f327379688f81b0dChris Lattner// output...
266331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct value_desc {
267331de23705a719514e37c211f327379688f81b0dChris Lattner  const char *Desc;
268331de23705a719514e37c211f327379688f81b0dChris Lattner  value_desc(const char *Str) : Desc(Str) {}
269331de23705a719514e37c211f327379688f81b0dChris Lattner  void apply(Option &O) const { O.setValueStr(Desc); }
270331de23705a719514e37c211f327379688f81b0dChris Lattner};
271331de23705a719514e37c211f327379688f81b0dChris Lattner
272331de23705a719514e37c211f327379688f81b0dChris Lattner// init - Specify a default (initial) value for the command line argument, if
273331de23705a719514e37c211f327379688f81b0dChris Lattner// the default constructor for the argument type does not give you what you
274331de23705a719514e37c211f327379688f81b0dChris Lattner// want.  This is only valid on "opt" arguments, not on "list" arguments.
275331de23705a719514e37c211f327379688f81b0dChris Lattner//
276331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Ty>
277331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct initializer {
278331de23705a719514e37c211f327379688f81b0dChris Lattner  const Ty &Init;
279331de23705a719514e37c211f327379688f81b0dChris Lattner  initializer(const Ty &Val) : Init(Val) {}
280331de23705a719514e37c211f327379688f81b0dChris Lattner
281331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class Opt>
282331de23705a719514e37c211f327379688f81b0dChris Lattner  void apply(Opt &O) const { O.setInitialValue(Init); }
283cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner};
284cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
285331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Ty>
286331de23705a719514e37c211f327379688f81b0dChris Lattnerinitializer<Ty> init(const Ty &Val) {
287331de23705a719514e37c211f327379688f81b0dChris Lattner  return initializer<Ty>(Val);
288331de23705a719514e37c211f327379688f81b0dChris Lattner}
289331de23705a719514e37c211f327379688f81b0dChris Lattner
290331de23705a719514e37c211f327379688f81b0dChris Lattner
291331de23705a719514e37c211f327379688f81b0dChris Lattner// location - Allow the user to specify which external variable they want to
292331de23705a719514e37c211f327379688f81b0dChris Lattner// store the results of the command line argument processing into, if they don't
293331de23705a719514e37c211f327379688f81b0dChris Lattner// want to store it in the option itself.
294331de23705a719514e37c211f327379688f81b0dChris Lattner//
295331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Ty>
296331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct LocationClass {
297331de23705a719514e37c211f327379688f81b0dChris Lattner  Ty &Loc;
298331de23705a719514e37c211f327379688f81b0dChris Lattner  LocationClass(Ty &L) : Loc(L) {}
299331de23705a719514e37c211f327379688f81b0dChris Lattner
300331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class Opt>
301331de23705a719514e37c211f327379688f81b0dChris Lattner  void apply(Opt &O) const { O.setLocation(O, Loc); }
302331de23705a719514e37c211f327379688f81b0dChris Lattner};
303331de23705a719514e37c211f327379688f81b0dChris Lattner
304331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Ty>
305331de23705a719514e37c211f327379688f81b0dChris LattnerLocationClass<Ty> location(Ty &L) { return LocationClass<Ty>(L); }
306331de23705a719514e37c211f327379688f81b0dChris Lattner
307331de23705a719514e37c211f327379688f81b0dChris Lattner
308cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===//
309331de23705a719514e37c211f327379688f81b0dChris Lattner// Enum valued command line option
310cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//
311f8063f91227712cc726fca385dd8b88bf6400c84Reid Spencer#define clEnumVal(ENUMVAL, DESC) #ENUMVAL, int(ENUMVAL), DESC
312f8063f91227712cc726fca385dd8b88bf6400c84Reid Spencer#define clEnumValN(ENUMVAL, FLAGNAME, DESC) FLAGNAME, int(ENUMVAL), DESC
313f8063f91227712cc726fca385dd8b88bf6400c84Reid Spencer#define clEnumValEnd (reinterpret_cast<void*>(0))
314331de23705a719514e37c211f327379688f81b0dChris Lattner
315331de23705a719514e37c211f327379688f81b0dChris Lattner// values - For custom data types, allow specifying a group of values together
316331de23705a719514e37c211f327379688f81b0dChris Lattner// as the values that go into the mapping that the option handler uses.  Note
317331de23705a719514e37c211f327379688f81b0dChris Lattner// that the values list must always have a 0 at the end of the list to indicate
318331de23705a719514e37c211f327379688f81b0dChris Lattner// that the list has ended.
319331de23705a719514e37c211f327379688f81b0dChris Lattner//
320331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType>
321331de23705a719514e37c211f327379688f81b0dChris Lattnerclass ValuesClass {
322331de23705a719514e37c211f327379688f81b0dChris Lattner  // Use a vector instead of a map, because the lists should be short,
323331de23705a719514e37c211f327379688f81b0dChris Lattner  // the overhead is less, and most importantly, it keeps them in the order
324331de23705a719514e37c211f327379688f81b0dChris Lattner  // inserted so we can print our option out nicely.
3253b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner  SmallVector<std::pair<const char *, std::pair<int, const char *> >,4> Values;
326331de23705a719514e37c211f327379688f81b0dChris Lattner  void processValues(va_list Vals);
327cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic:
32863b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman  ValuesClass(const char *EnumName, DataType Val, const char *Desc,
329331de23705a719514e37c211f327379688f81b0dChris Lattner              va_list ValueArgs) {
330331de23705a719514e37c211f327379688f81b0dChris Lattner    // Insert the first value, which is required.
331331de23705a719514e37c211f327379688f81b0dChris Lattner    Values.push_back(std::make_pair(EnumName, std::make_pair(Val, Desc)));
332331de23705a719514e37c211f327379688f81b0dChris Lattner
333331de23705a719514e37c211f327379688f81b0dChris Lattner    // Process the varargs portion of the values...
33413d57320bd212483463d4f8992d5787b29eda5dfBill Wendling    while (const char *enumName = va_arg(ValueArgs, const char *)) {
3358b70b78ba489b090d9866e6a4084ab1e8613b527Chris Lattner      DataType EnumVal = static_cast<DataType>(va_arg(ValueArgs, int));
336331de23705a719514e37c211f327379688f81b0dChris Lattner      const char *EnumDesc = va_arg(ValueArgs, const char *);
33713d57320bd212483463d4f8992d5787b29eda5dfBill Wendling      Values.push_back(std::make_pair(enumName,      // Add value to value map
338331de23705a719514e37c211f327379688f81b0dChris Lattner                                      std::make_pair(EnumVal, EnumDesc)));
339331de23705a719514e37c211f327379688f81b0dChris Lattner    }
34071fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner  }
34171fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner
342331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class Opt>
343331de23705a719514e37c211f327379688f81b0dChris Lattner  void apply(Opt &O) const {
34434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng    for (unsigned i = 0, e = static_cast<unsigned>(Values.size());
34534cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng         i != e; ++i)
346331de23705a719514e37c211f327379688f81b0dChris Lattner      O.getParser().addLiteralOption(Values[i].first, Values[i].second.first,
347331de23705a719514e37c211f327379688f81b0dChris Lattner                                     Values[i].second.second);
34871fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner  }
349cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner};
350cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
351331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType>
352beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail GlushenkovValuesClass<DataType> END_WITH_NULL values(const char *Arg, DataType Val,
353a542b4c133de5da974632e9623ee4b426ebb3353Chris Lattner                                           const char *Desc, ...) {
354331de23705a719514e37c211f327379688f81b0dChris Lattner    va_list ValueArgs;
355331de23705a719514e37c211f327379688f81b0dChris Lattner    va_start(ValueArgs, Desc);
356331de23705a719514e37c211f327379688f81b0dChris Lattner    ValuesClass<DataType> Vals(Arg, Val, Desc, ValueArgs);
357331de23705a719514e37c211f327379688f81b0dChris Lattner    va_end(ValueArgs);
358331de23705a719514e37c211f327379688f81b0dChris Lattner    return Vals;
359331de23705a719514e37c211f327379688f81b0dChris Lattner}
360cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
361cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
362cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===//
363331de23705a719514e37c211f327379688f81b0dChris Lattner// parser class - Parameterizable parser for different data types.  By default,
364331de23705a719514e37c211f327379688f81b0dChris Lattner// known data types (string, int, bool) have specialized parsers, that do what
365331de23705a719514e37c211f327379688f81b0dChris Lattner// you would expect.  The default parser, used for data types that are not
366331de23705a719514e37c211f327379688f81b0dChris Lattner// built-in, uses a mapping table to map specific options to values, which is
367331de23705a719514e37c211f327379688f81b0dChris Lattner// used, among other things, to handle enum types.
368331de23705a719514e37c211f327379688f81b0dChris Lattner
369331de23705a719514e37c211f327379688f81b0dChris Lattner//--------------------------------------------------
370331de23705a719514e37c211f327379688f81b0dChris Lattner// generic_parser_base - This class holds all the non-generic code that we do
371331de23705a719514e37c211f327379688f81b0dChris Lattner// not need replicated for every instance of the generic parser.  This also
372331de23705a719514e37c211f327379688f81b0dChris Lattner// allows us to put stuff into CommandLine.cpp
373cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//
374331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct generic_parser_base {
375331de23705a719514e37c211f327379688f81b0dChris Lattner  virtual ~generic_parser_base() {}  // Base class should have virtual-dtor
376331de23705a719514e37c211f327379688f81b0dChris Lattner
377331de23705a719514e37c211f327379688f81b0dChris Lattner  // getNumOptions - Virtual function implemented by generic subclass to
378331de23705a719514e37c211f327379688f81b0dChris Lattner  // indicate how many entries are in Values.
379331de23705a719514e37c211f327379688f81b0dChris Lattner  //
380331de23705a719514e37c211f327379688f81b0dChris Lattner  virtual unsigned getNumOptions() const = 0;
381331de23705a719514e37c211f327379688f81b0dChris Lattner
382331de23705a719514e37c211f327379688f81b0dChris Lattner  // getOption - Return option name N.
383331de23705a719514e37c211f327379688f81b0dChris Lattner  virtual const char *getOption(unsigned N) const = 0;
38463b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman
385331de23705a719514e37c211f327379688f81b0dChris Lattner  // getDescription - Return description N
386331de23705a719514e37c211f327379688f81b0dChris Lattner  virtual const char *getDescription(unsigned N) const = 0;
387331de23705a719514e37c211f327379688f81b0dChris Lattner
388331de23705a719514e37c211f327379688f81b0dChris Lattner  // Return the width of the option tag for printing...
38934cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  virtual size_t getOptionWidth(const Option &O) const;
390331de23705a719514e37c211f327379688f81b0dChris Lattner
39163b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman  // printOptionInfo - Print out information about this option.  The
392331de23705a719514e37c211f327379688f81b0dChris Lattner  // to-be-maintained width is specified.
393331de23705a719514e37c211f327379688f81b0dChris Lattner  //
39434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  virtual void printOptionInfo(const Option &O, size_t GlobalWidth) const;
395331de23705a719514e37c211f327379688f81b0dChris Lattner
396331de23705a719514e37c211f327379688f81b0dChris Lattner  void initialize(Option &O) {
397331de23705a719514e37c211f327379688f81b0dChris Lattner    // All of the modifiers for the option have been processed by now, so the
398331de23705a719514e37c211f327379688f81b0dChris Lattner    // argstr field should be stable, copy it down now.
399331de23705a719514e37c211f327379688f81b0dChris Lattner    //
400331de23705a719514e37c211f327379688f81b0dChris Lattner    hasArgStr = O.hasArgStr();
4019878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  }
402beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov
4039878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  void getExtraOptionNames(std::vector<const char*> &OptionNames) {
404331de23705a719514e37c211f327379688f81b0dChris Lattner    // If there has been no argstr specified, that means that we need to add an
405331de23705a719514e37c211f327379688f81b0dChris Lattner    // argument for every possible option.  This ensures that our options are
406331de23705a719514e37c211f327379688f81b0dChris Lattner    // vectored to us.
407331de23705a719514e37c211f327379688f81b0dChris Lattner    if (!hasArgStr)
408331de23705a719514e37c211f327379688f81b0dChris Lattner      for (unsigned i = 0, e = getNumOptions(); i != e; ++i)
4099878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner        OptionNames.push_back(getOption(i));
410cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  }
411cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
4129878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner
413331de23705a719514e37c211f327379688f81b0dChris Lattner  enum ValueExpected getValueExpectedFlagDefault() const {
414331de23705a719514e37c211f327379688f81b0dChris Lattner    // If there is an ArgStr specified, then we are of the form:
415331de23705a719514e37c211f327379688f81b0dChris Lattner    //
416331de23705a719514e37c211f327379688f81b0dChris Lattner    //    -opt=O2   or   -opt O2  or  -optO2
417331de23705a719514e37c211f327379688f81b0dChris Lattner    //
418331de23705a719514e37c211f327379688f81b0dChris Lattner    // In which case, the value is required.  Otherwise if an arg str has not
419331de23705a719514e37c211f327379688f81b0dChris Lattner    // been specified, we are of the form:
420331de23705a719514e37c211f327379688f81b0dChris Lattner    //
421bc0e998c497446f5448425b3cbd7f8f19a458764Misha Brukman    //    -O2 or O2 or -la (where -l and -a are separate options)
422331de23705a719514e37c211f327379688f81b0dChris Lattner    //
423331de23705a719514e37c211f327379688f81b0dChris Lattner    // If this is the case, we cannot allow a value.
424331de23705a719514e37c211f327379688f81b0dChris Lattner    //
425331de23705a719514e37c211f327379688f81b0dChris Lattner    if (hasArgStr)
426331de23705a719514e37c211f327379688f81b0dChris Lattner      return ValueRequired;
427331de23705a719514e37c211f327379688f81b0dChris Lattner    else
428331de23705a719514e37c211f327379688f81b0dChris Lattner      return ValueDisallowed;
429331de23705a719514e37c211f327379688f81b0dChris Lattner  }
430cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
431af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner  // findOption - Return the option number corresponding to the specified
432af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner  // argument string.  If the option is not found, getNumOptions() is returned.
433af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner  //
434af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner  unsigned findOption(const char *Name);
435af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner
436331de23705a719514e37c211f327379688f81b0dChris Lattnerprotected:
437331de23705a719514e37c211f327379688f81b0dChris Lattner  bool hasArgStr;
438331de23705a719514e37c211f327379688f81b0dChris Lattner};
439331de23705a719514e37c211f327379688f81b0dChris Lattner
440331de23705a719514e37c211f327379688f81b0dChris Lattner// Default parser implementation - This implementation depends on having a
441331de23705a719514e37c211f327379688f81b0dChris Lattner// mapping of recognized options to values of some sort.  In addition to this,
442331de23705a719514e37c211f327379688f81b0dChris Lattner// each entry in the mapping also tracks a help message that is printed with the
443331de23705a719514e37c211f327379688f81b0dChris Lattner// command line option for --help.  Because this is a simple mapping parser, the
444331de23705a719514e37c211f327379688f81b0dChris Lattner// data type can be any unsupported type.
445cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//
446331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate <class DataType>
447331de23705a719514e37c211f327379688f81b0dChris Lattnerclass parser : public generic_parser_base {
448af7e82184d7d77e426056c7c233e860baeebe80fChris Lattnerprotected:
4493b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner  SmallVector<std::pair<const char *,
4503b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner                        std::pair<DataType, const char *> >, 8> Values;
451af7e82184d7d77e426056c7c233e860baeebe80fChris Lattnerpublic:
452d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  typedef DataType parser_data_type;
453331de23705a719514e37c211f327379688f81b0dChris Lattner
454331de23705a719514e37c211f327379688f81b0dChris Lattner  // Implement virtual functions needed by generic_parser_base
455f8063f91227712cc726fca385dd8b88bf6400c84Reid Spencer  unsigned getNumOptions() const { return unsigned(Values.size()); }
456331de23705a719514e37c211f327379688f81b0dChris Lattner  const char *getOption(unsigned N) const { return Values[N].first; }
457331de23705a719514e37c211f327379688f81b0dChris Lattner  const char *getDescription(unsigned N) const {
458331de23705a719514e37c211f327379688f81b0dChris Lattner    return Values[N].second.second;
459cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  }
460331de23705a719514e37c211f327379688f81b0dChris Lattner
461d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  // parse - Return true on error.
46263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman  bool parse(Option &O, const char *ArgName, const std::string &Arg,
463d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner             DataType &V) {
4647f4dd472e35569efefbeffef096c490075e3e824Chris Lattner    std::string ArgVal;
465331de23705a719514e37c211f327379688f81b0dChris Lattner    if (hasArgStr)
466331de23705a719514e37c211f327379688f81b0dChris Lattner      ArgVal = Arg;
467331de23705a719514e37c211f327379688f81b0dChris Lattner    else
468331de23705a719514e37c211f327379688f81b0dChris Lattner      ArgVal = ArgName;
469331de23705a719514e37c211f327379688f81b0dChris Lattner
47034cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng    for (unsigned i = 0, e = static_cast<unsigned>(Values.size());
47134cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng         i != e; ++i)
472331de23705a719514e37c211f327379688f81b0dChris Lattner      if (ArgVal == Values[i].first) {
473d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner        V = Values[i].second.first;
474331de23705a719514e37c211f327379688f81b0dChris Lattner        return false;
475331de23705a719514e37c211f327379688f81b0dChris Lattner      }
476331de23705a719514e37c211f327379688f81b0dChris Lattner
477331de23705a719514e37c211f327379688f81b0dChris Lattner    return O.error(": Cannot find option named '" + ArgVal + "'!");
478331de23705a719514e37c211f327379688f81b0dChris Lattner  }
479cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
4803b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner  /// addLiteralOption - Add an entry to the mapping table.
4813b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner  ///
482331de23705a719514e37c211f327379688f81b0dChris Lattner  template <class DT>
483331de23705a719514e37c211f327379688f81b0dChris Lattner  void addLiteralOption(const char *Name, const DT &V, const char *HelpStr) {
484af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner    assert(findOption(Name) == Values.size() && "Option already exists!");
4858b70b78ba489b090d9866e6a4084ab1e8613b527Chris Lattner    Values.push_back(std::make_pair(Name,
4868b70b78ba489b090d9866e6a4084ab1e8613b527Chris Lattner                             std::make_pair(static_cast<DataType>(V),HelpStr)));
48769d6f1358ca8c442a65fd8d5900f7296fbb2762dChris Lattner    MarkOptionsChanged();
488cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  }
489af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner
4903b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner  /// removeLiteralOption - Remove the specified option.
4913b6078f584d856b3b0fb4dc3c4255502e605be1eChris Lattner  ///
492af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner  void removeLiteralOption(const char *Name) {
493af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner    unsigned N = findOption(Name);
494af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner    assert(N != Values.size() && "Option not found!");
495af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner    Values.erase(Values.begin()+N);
496af7e82184d7d77e426056c7c233e860baeebe80fChris Lattner  }
497cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner};
498cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
499331de23705a719514e37c211f327379688f81b0dChris Lattner//--------------------------------------------------
500d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// basic_parser - Super class of parsers to provide boilerplate code
501cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//
502d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattnerstruct basic_parser_impl {  // non-template implementation of basic_parser<t>
503d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  virtual ~basic_parser_impl() {}
504331de23705a719514e37c211f327379688f81b0dChris Lattner
505331de23705a719514e37c211f327379688f81b0dChris Lattner  enum ValueExpected getValueExpectedFlagDefault() const {
506d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner    return ValueRequired;
507cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  }
50863b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman
50913d57320bd212483463d4f8992d5787b29eda5dfBill Wendling  void getExtraOptionNames(std::vector<const char*> &) {}
5109878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner
51113d57320bd212483463d4f8992d5787b29eda5dfBill Wendling  void initialize(Option &) {}
51263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman
513331de23705a719514e37c211f327379688f81b0dChris Lattner  // Return the width of the option tag for printing...
51434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  size_t getOptionWidth(const Option &O) const;
51563b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman
516d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  // printOptionInfo - Print out information about this option.  The
517331de23705a719514e37c211f327379688f81b0dChris Lattner  // to-be-maintained width is specified.
518331de23705a719514e37c211f327379688f81b0dChris Lattner  //
51934cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  void printOptionInfo(const Option &O, size_t GlobalWidth) const;
520d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner
521d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  // getValueName - Overload in subclass to provide a better default value.
522d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  virtual const char *getValueName() const { return "value"; }
5237422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner
5247422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner  // An out-of-line virtual method to provide a 'home' for this class.
5257422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner  virtual void anchor();
526d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner};
527d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner
528d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// basic_parser - The real basic parser is just a template wrapper that provides
529d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// a typedef for the provided data type.
530d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner//
531d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattnertemplate<class DataType>
532d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattnerstruct basic_parser : public basic_parser_impl {
533d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  typedef DataType parser_data_type;
534cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner};
535cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
536331de23705a719514e37c211f327379688f81b0dChris Lattner//--------------------------------------------------
537d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// parser<bool>
538cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//
539331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<>
5401fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<bool> : public basic_parser<bool> {
541d485e885f04eaaafc9c0ce2555c6bd853b7c18a3Misha Brukman  bool IsInvertible;	// Should we synthesize a -xno- style option?
542d64e0eb094a108bdcdf51328425904042aa6122bMike Stump  const char *ArgStr;
5431fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
544e8b64106ecf1057c7506d44ec8f64b5c83ee51c7Chris Lattner  void getExtraOptionNames(std::vector<const char*> &OptionNames);
545e8b64106ecf1057c7506d44ec8f64b5c83ee51c7Chris Lattner
546331de23705a719514e37c211f327379688f81b0dChris Lattner  // parse - Return true on error.
547d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  bool parse(Option &O, const char *ArgName, const std::string &Arg, bool &Val);
548cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
549d64e0eb094a108bdcdf51328425904042aa6122bMike Stump  template <class Opt>
550d64e0eb094a108bdcdf51328425904042aa6122bMike Stump  void initialize(Opt &O) {
551d485e885f04eaaafc9c0ce2555c6bd853b7c18a3Misha Brukman    IsInvertible = (O.getMiscFlags() & llvm::cl::AllowInverse);
552d64e0eb094a108bdcdf51328425904042aa6122bMike Stump    ArgStr = O.ArgStr;
553d64e0eb094a108bdcdf51328425904042aa6122bMike Stump  }
554d64e0eb094a108bdcdf51328425904042aa6122bMike Stump
555331de23705a719514e37c211f327379688f81b0dChris Lattner  enum ValueExpected getValueExpectedFlagDefault() const {
55663b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman    return ValueOptional;
557331de23705a719514e37c211f327379688f81b0dChris Lattner  }
558331de23705a719514e37c211f327379688f81b0dChris Lattner
5597422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner  // getValueName - Do not print =<value> at all.
560d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  virtual const char *getValueName() const { return 0; }
561beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov
5627422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner  // An out-of-line virtual method to provide a 'home' for this class.
5637422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner  virtual void anchor();
564331de23705a719514e37c211f327379688f81b0dChris Lattner};
565cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
5667422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<bool>);
5677422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner
56881da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen//--------------------------------------------------
56981da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen// parser<boolOrDefault>
57081da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesenenum boolOrDefault { BOU_UNSET, BOU_TRUE, BOU_FALSE };
57181da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesentemplate<>
57281da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesenclass parser<boolOrDefault> : public basic_parser<boolOrDefault> {
57381da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesenpublic:
57481da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen  // parse - Return true on error.
575beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov  bool parse(Option &O, const char *ArgName, const std::string &Arg,
57681da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen             boolOrDefault &Val);
57781da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen
57881da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen  enum ValueExpected getValueExpectedFlagDefault() const {
57981da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen    return ValueOptional;
58081da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen  }
58181da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen
58281da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen  // getValueName - Do not print =<value> at all.
58381da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen  virtual const char *getValueName() const { return 0; }
584beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov
58581da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen  // An out-of-line virtual method to provide a 'home' for this class.
58681da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen  virtual void anchor();
58781da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen};
58881da02b553b86868637f27b89c6e919c31ed5b51Dale Johannesen
58981da02b553b86868637f27b89c6e919c31ed5b51Dale JohannesenEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<boolOrDefault>);
590cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
591331de23705a719514e37c211f327379688f81b0dChris Lattner//--------------------------------------------------
592d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// parser<int>
593331de23705a719514e37c211f327379688f81b0dChris Lattner//
594331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<>
5951fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<int> : public basic_parser<int> {
5961fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
597331de23705a719514e37c211f327379688f81b0dChris Lattner  // parse - Return true on error.
598d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  bool parse(Option &O, const char *ArgName, const std::string &Arg, int &Val);
599cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
600d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  // getValueName - Overload in subclass to provide a better default value.
601d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  virtual const char *getValueName() const { return "int"; }
6027422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner
6037422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner  // An out-of-line virtual method to provide a 'home' for this class.
6047422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner  virtual void anchor();
605d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner};
606cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
6077422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<int>);
6087422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner
609cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
610d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner//--------------------------------------------------
611d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner// parser<unsigned>
612d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner//
613d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattnertemplate<>
6141fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<unsigned> : public basic_parser<unsigned> {
6151fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
616d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner  // parse - Return true on error.
6171e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer  bool parse(Option &O, const char *AN, const std::string &Arg, unsigned &Val);
618d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner
619d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner  // getValueName - Overload in subclass to provide a better default value.
620d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner  virtual const char *getValueName() const { return "uint"; }
6217422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner
6227422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner  // An out-of-line virtual method to provide a 'home' for this class.
6237422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner  virtual void anchor();
624d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner};
625d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner
6267422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<unsigned>);
627d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner
628d2a6fc397ee982936dee7dd5692b1481bcd9fe8fChris Lattner//--------------------------------------------------
629d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// parser<double>
630d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner//
631d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattnertemplate<>
6321fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<double> : public basic_parser<double> {
6331fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
634d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  // parse - Return true on error.
635d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  bool parse(Option &O, const char *AN, const std::string &Arg, double &Val);
636cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
637d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  // getValueName - Overload in subclass to provide a better default value.
638d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  virtual const char *getValueName() const { return "number"; }
6397422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner
6407422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner  // An out-of-line virtual method to provide a 'home' for this class.
6417422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner  virtual void anchor();
642cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner};
643cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
6447422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<double>);
645331de23705a719514e37c211f327379688f81b0dChris Lattner
646d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner//--------------------------------------------------
647d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner// parser<float>
648d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner//
649d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattnertemplate<>
6501fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<float> : public basic_parser<float> {
6511fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
652d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  // parse - Return true on error.
653d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  bool parse(Option &O, const char *AN, const std::string &Arg, float &Val);
654d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner
655d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  // getValueName - Overload in subclass to provide a better default value.
656d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  virtual const char *getValueName() const { return "number"; }
6577422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner
6587422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner  // An out-of-line virtual method to provide a 'home' for this class.
6597422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner  virtual void anchor();
660d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner};
661331de23705a719514e37c211f327379688f81b0dChris Lattner
6627422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<float>);
663331de23705a719514e37c211f327379688f81b0dChris Lattner
664331de23705a719514e37c211f327379688f81b0dChris Lattner//--------------------------------------------------
6657f4dd472e35569efefbeffef096c490075e3e824Chris Lattner// parser<std::string>
666331de23705a719514e37c211f327379688f81b0dChris Lattner//
667331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<>
6681fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass parser<std::string> : public basic_parser<std::string> {
6691fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
670331de23705a719514e37c211f327379688f81b0dChris Lattner  // parse - Return true on error.
67113d57320bd212483463d4f8992d5787b29eda5dfBill Wendling  bool parse(Option &, const char *, const std::string &Arg,
672d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner             std::string &Value) {
673d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner    Value = Arg;
674331de23705a719514e37c211f327379688f81b0dChris Lattner    return false;
675331de23705a719514e37c211f327379688f81b0dChris Lattner  }
676331de23705a719514e37c211f327379688f81b0dChris Lattner
677d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  // getValueName - Overload in subclass to provide a better default value.
678d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner  virtual const char *getValueName() const { return "string"; }
6797422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner
6807422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner  // An out-of-line virtual method to provide a 'home' for this class.
6817422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner  virtual void anchor();
682331de23705a719514e37c211f327379688f81b0dChris Lattner};
683331de23705a719514e37c211f327379688f81b0dChris Lattner
6847422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class basic_parser<std::string>);
6857422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner
686331de23705a719514e37c211f327379688f81b0dChris Lattner//===----------------------------------------------------------------------===//
687331de23705a719514e37c211f327379688f81b0dChris Lattner// applicator class - This class is used because we must use partial
688331de23705a719514e37c211f327379688f81b0dChris Lattner// specialization to handle literal string arguments specially (const char* does
689331de23705a719514e37c211f327379688f81b0dChris Lattner// not correctly respond to the apply method).  Because the syntax to use this
690331de23705a719514e37c211f327379688f81b0dChris Lattner// is a pain, we have the 'apply' method below to handle the nastiness...
691331de23705a719514e37c211f327379688f81b0dChris Lattner//
692331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Mod> struct applicator {
693331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class Opt>
694331de23705a719514e37c211f327379688f81b0dChris Lattner  static void opt(const Mod &M, Opt &O) { M.apply(O); }
695331de23705a719514e37c211f327379688f81b0dChris Lattner};
696331de23705a719514e37c211f327379688f81b0dChris Lattner
697331de23705a719514e37c211f327379688f81b0dChris Lattner// Handle const char* as a special case...
698331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<unsigned n> struct applicator<char[n]> {
699331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class Opt>
700331de23705a719514e37c211f327379688f81b0dChris Lattner  static void opt(const char *Str, Opt &O) { O.setArgStr(Str); }
701331de23705a719514e37c211f327379688f81b0dChris Lattner};
7024042332d4a8ba8e4d2b3a6d87a3af81fc73a0f98Chris Lattnertemplate<unsigned n> struct applicator<const char[n]> {
7034042332d4a8ba8e4d2b3a6d87a3af81fc73a0f98Chris Lattner  template<class Opt>
7044042332d4a8ba8e4d2b3a6d87a3af81fc73a0f98Chris Lattner  static void opt(const char *Str, Opt &O) { O.setArgStr(Str); }
7054042332d4a8ba8e4d2b3a6d87a3af81fc73a0f98Chris Lattner};
706331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> struct applicator<const char*> {
707331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class Opt>
708331de23705a719514e37c211f327379688f81b0dChris Lattner  static void opt(const char *Str, Opt &O) { O.setArgStr(Str); }
709331de23705a719514e37c211f327379688f81b0dChris Lattner};
710331de23705a719514e37c211f327379688f81b0dChris Lattner
711dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukmantemplate<> struct applicator<NumOccurrences> {
712dd6cb6a43b78732f1a136583ccca4e715bae7d71Misha Brukman  static void opt(NumOccurrences NO, Option &O) { O.setNumOccurrencesFlag(NO); }
713331de23705a719514e37c211f327379688f81b0dChris Lattner};
714331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> struct applicator<ValueExpected> {
715331de23705a719514e37c211f327379688f81b0dChris Lattner  static void opt(ValueExpected VE, Option &O) { O.setValueExpectedFlag(VE); }
716331de23705a719514e37c211f327379688f81b0dChris Lattner};
717331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> struct applicator<OptionHidden> {
718331de23705a719514e37c211f327379688f81b0dChris Lattner  static void opt(OptionHidden OH, Option &O) { O.setHiddenFlag(OH); }
719331de23705a719514e37c211f327379688f81b0dChris Lattner};
720331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<> struct applicator<FormattingFlags> {
721331de23705a719514e37c211f327379688f81b0dChris Lattner  static void opt(FormattingFlags FF, Option &O) { O.setFormattingFlag(FF); }
722331de23705a719514e37c211f327379688f81b0dChris Lattner};
723b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattnertemplate<> struct applicator<MiscFlags> {
724b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner  static void opt(MiscFlags MF, Option &O) { O.setMiscFlag(MF); }
725b3b729b69b311468025ff1e25b3499fcbd83454aChris Lattner};
726331de23705a719514e37c211f327379688f81b0dChris Lattner
727331de23705a719514e37c211f327379688f81b0dChris Lattner// apply method - Apply a modifier to an option in a type safe way.
728331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class Mod, class Opt>
729331de23705a719514e37c211f327379688f81b0dChris Lattnervoid apply(const Mod &M, Opt *O) {
730331de23705a719514e37c211f327379688f81b0dChris Lattner  applicator<Mod>::opt(M, *O);
731331de23705a719514e37c211f327379688f81b0dChris Lattner}
732331de23705a719514e37c211f327379688f81b0dChris Lattner
733331de23705a719514e37c211f327379688f81b0dChris Lattner
734331de23705a719514e37c211f327379688f81b0dChris Lattner//===----------------------------------------------------------------------===//
735331de23705a719514e37c211f327379688f81b0dChris Lattner// opt_storage class
736331de23705a719514e37c211f327379688f81b0dChris Lattner
737331de23705a719514e37c211f327379688f81b0dChris Lattner// Default storage class definition: external storage.  This implementation
738331de23705a719514e37c211f327379688f81b0dChris Lattner// assumes the user will specify a variable to store the data into with the
739331de23705a719514e37c211f327379688f81b0dChris Lattner// cl::location(x) modifier.
740331de23705a719514e37c211f327379688f81b0dChris Lattner//
741331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType, bool ExternalStorage, bool isClass>
742331de23705a719514e37c211f327379688f81b0dChris Lattnerclass opt_storage {
743331de23705a719514e37c211f327379688f81b0dChris Lattner  DataType *Location;   // Where to store the object...
744331de23705a719514e37c211f327379688f81b0dChris Lattner
74531fd5a571eb8048a1084dd8e20a49dd0785de11aBill Wendling  void check() const {
746331de23705a719514e37c211f327379688f81b0dChris Lattner    assert(Location != 0 && "cl::location(...) not specified for a command "
7473c7eb1f2ea231c046367023576311fbc4b1270e3Chris Lattner           "line option with external storage, "
7483c7eb1f2ea231c046367023576311fbc4b1270e3Chris Lattner           "or cl::init specified before cl::location()!!");
749331de23705a719514e37c211f327379688f81b0dChris Lattner  }
750cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic:
751331de23705a719514e37c211f327379688f81b0dChris Lattner  opt_storage() : Location(0) {}
752331de23705a719514e37c211f327379688f81b0dChris Lattner
753331de23705a719514e37c211f327379688f81b0dChris Lattner  bool setLocation(Option &O, DataType &L) {
754331de23705a719514e37c211f327379688f81b0dChris Lattner    if (Location)
755331de23705a719514e37c211f327379688f81b0dChris Lattner      return O.error(": cl::location(x) specified more than once!");
756331de23705a719514e37c211f327379688f81b0dChris Lattner    Location = &L;
757331de23705a719514e37c211f327379688f81b0dChris Lattner    return false;
758cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  }
759cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
760331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class T>
761331de23705a719514e37c211f327379688f81b0dChris Lattner  void setValue(const T &V) {
762331de23705a719514e37c211f327379688f81b0dChris Lattner    check();
763331de23705a719514e37c211f327379688f81b0dChris Lattner    *Location = V;
76471fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner  }
76571fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner
766331de23705a719514e37c211f327379688f81b0dChris Lattner  DataType &getValue() { check(); return *Location; }
767331de23705a719514e37c211f327379688f81b0dChris Lattner  const DataType &getValue() const { check(); return *Location; }
768331de23705a719514e37c211f327379688f81b0dChris Lattner};
769331de23705a719514e37c211f327379688f81b0dChris Lattner
770331de23705a719514e37c211f327379688f81b0dChris Lattner
771331de23705a719514e37c211f327379688f81b0dChris Lattner// Define how to hold a class type object, such as a string.  Since we can
772331de23705a719514e37c211f327379688f81b0dChris Lattner// inherit from a class, we do so.  This makes us exactly compatible with the
773331de23705a719514e37c211f327379688f81b0dChris Lattner// object in all cases that it is used.
774331de23705a719514e37c211f327379688f81b0dChris Lattner//
775331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType>
7761fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass opt_storage<DataType,false,true> : public DataType {
7771fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
778331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class T>
779331de23705a719514e37c211f327379688f81b0dChris Lattner  void setValue(const T &V) { DataType::operator=(V); }
780331de23705a719514e37c211f327379688f81b0dChris Lattner
781331de23705a719514e37c211f327379688f81b0dChris Lattner  DataType &getValue() { return *this; }
782331de23705a719514e37c211f327379688f81b0dChris Lattner  const DataType &getValue() const { return *this; }
783331de23705a719514e37c211f327379688f81b0dChris Lattner};
784331de23705a719514e37c211f327379688f81b0dChris Lattner
785331de23705a719514e37c211f327379688f81b0dChris Lattner// Define a partial specialization to handle things we cannot inherit from.  In
786331de23705a719514e37c211f327379688f81b0dChris Lattner// this case, we store an instance through containment, and overload operators
787331de23705a719514e37c211f327379688f81b0dChris Lattner// to get at the value.
788331de23705a719514e37c211f327379688f81b0dChris Lattner//
789331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType>
7901fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass opt_storage<DataType, false, false> {
7911fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
792331de23705a719514e37c211f327379688f81b0dChris Lattner  DataType Value;
793331de23705a719514e37c211f327379688f81b0dChris Lattner
794331de23705a719514e37c211f327379688f81b0dChris Lattner  // Make sure we initialize the value with the default constructor for the
795331de23705a719514e37c211f327379688f81b0dChris Lattner  // type.
796331de23705a719514e37c211f327379688f81b0dChris Lattner  opt_storage() : Value(DataType()) {}
797331de23705a719514e37c211f327379688f81b0dChris Lattner
798331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class T>
799331de23705a719514e37c211f327379688f81b0dChris Lattner  void setValue(const T &V) { Value = V; }
800331de23705a719514e37c211f327379688f81b0dChris Lattner  DataType &getValue() { return Value; }
801331de23705a719514e37c211f327379688f81b0dChris Lattner  DataType getValue() const { return Value; }
8026a4dd24a995072c9c6f1ae45f19f94010d8389fbChris Lattner
8036a4dd24a995072c9c6f1ae45f19f94010d8389fbChris Lattner  // If the datatype is a pointer, support -> on it.
8046a4dd24a995072c9c6f1ae45f19f94010d8389fbChris Lattner  DataType operator->() const { return Value; }
805cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner};
806cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
807cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
808cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===//
809331de23705a719514e37c211f327379688f81b0dChris Lattner// opt - A scalar command line option.
810cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//
811331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate <class DataType, bool ExternalStorage = false,
812331de23705a719514e37c211f327379688f81b0dChris Lattner          class ParserClass = parser<DataType> >
81363b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukmanclass opt : public Option,
814331de23705a719514e37c211f327379688f81b0dChris Lattner            public opt_storage<DataType, ExternalStorage,
8157b3d73b7ecbecf423c3766e596b6086767444363Chris Lattner                               is_class<DataType>::value> {
816331de23705a719514e37c211f327379688f81b0dChris Lattner  ParserClass Parser;
817331de23705a719514e37c211f327379688f81b0dChris Lattner
81863b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman  virtual bool handleOccurrence(unsigned pos, const char *ArgName,
8191e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer                                const std::string &Arg) {
8209eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen    typename ParserClass::parser_data_type Val =
821e6ad5ea996673f76b62e495d268c8bf7c9b0d205Chris Lattner       typename ParserClass::parser_data_type();
822d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner    if (Parser.parse(*this, ArgName, Arg, Val))
823d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner      return true;                            // Parse error!
82448fe63526e35ddaee7e98879596a569911f41319Sebastian Redl    this->setValue(Val);
82548fe63526e35ddaee7e98879596a569911f41319Sebastian Redl    this->setPosition(pos);
826d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner    return false;
827331de23705a719514e37c211f327379688f81b0dChris Lattner  }
828331de23705a719514e37c211f327379688f81b0dChris Lattner
829cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  virtual enum ValueExpected getValueExpectedFlagDefault() const {
830331de23705a719514e37c211f327379688f81b0dChris Lattner    return Parser.getValueExpectedFlagDefault();
831cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  }
8329878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  virtual void getExtraOptionNames(std::vector<const char*> &OptionNames) {
8339878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner    return Parser.getExtraOptionNames(OptionNames);
8349878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  }
835cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
836331de23705a719514e37c211f327379688f81b0dChris Lattner  // Forward printing stuff to the parser...
83734cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  virtual size_t getOptionWidth() const {return Parser.getOptionWidth(*this);}
83834cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  virtual void printOptionInfo(size_t GlobalWidth) const {
839331de23705a719514e37c211f327379688f81b0dChris Lattner    Parser.printOptionInfo(*this, GlobalWidth);
840331de23705a719514e37c211f327379688f81b0dChris Lattner  }
841cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
842331de23705a719514e37c211f327379688f81b0dChris Lattner  void done() {
8439878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner    addArgument();
844331de23705a719514e37c211f327379688f81b0dChris Lattner    Parser.initialize(*this);
845331de23705a719514e37c211f327379688f81b0dChris Lattner  }
846331de23705a719514e37c211f327379688f81b0dChris Lattnerpublic:
847331de23705a719514e37c211f327379688f81b0dChris Lattner  // setInitialValue - Used by the cl::init modifier...
84831a6db0f2c94852e6dba7ca1e7f8df395cb3ad05Chris Lattner  void setInitialValue(const DataType &V) { this->setValue(V); }
849331de23705a719514e37c211f327379688f81b0dChris Lattner
850331de23705a719514e37c211f327379688f81b0dChris Lattner  ParserClass &getParser() { return Parser; }
851331de23705a719514e37c211f327379688f81b0dChris Lattner
85231a6db0f2c94852e6dba7ca1e7f8df395cb3ad05Chris Lattner  operator DataType() const { return this->getValue(); }
853331de23705a719514e37c211f327379688f81b0dChris Lattner
854331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class T>
85531a6db0f2c94852e6dba7ca1e7f8df395cb3ad05Chris Lattner  DataType &operator=(const T &Val) {
85631a6db0f2c94852e6dba7ca1e7f8df395cb3ad05Chris Lattner    this->setValue(Val);
85731a6db0f2c94852e6dba7ca1e7f8df395cb3ad05Chris Lattner    return this->getValue();
85831a6db0f2c94852e6dba7ca1e7f8df395cb3ad05Chris Lattner  }
859331de23705a719514e37c211f327379688f81b0dChris Lattner
860331de23705a719514e37c211f327379688f81b0dChris Lattner  // One option...
861331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t>
862cdf2b3b2f88d6f961b664e3f67a8ee37b46b0d27Dan Gohman  explicit opt(const M0t &M0) : Option(Optional | NotHidden) {
863331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this);
864331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
865331de23705a719514e37c211f327379688f81b0dChris Lattner  }
866331de23705a719514e37c211f327379688f81b0dChris Lattner
867331de23705a719514e37c211f327379688f81b0dChris Lattner  // Two options...
868331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t>
869f6143ef556ed01311d2043d38421302479f7866cChris Lattner  opt(const M0t &M0, const M1t &M1) : Option(Optional | NotHidden) {
870331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this);
871331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
872331de23705a719514e37c211f327379688f81b0dChris Lattner  }
873331de23705a719514e37c211f327379688f81b0dChris Lattner
874331de23705a719514e37c211f327379688f81b0dChris Lattner  // Three options...
875331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t, class M2t>
876f6143ef556ed01311d2043d38421302479f7866cChris Lattner  opt(const M0t &M0, const M1t &M1,
877f6143ef556ed01311d2043d38421302479f7866cChris Lattner      const M2t &M2) : Option(Optional | NotHidden) {
878331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this); apply(M2, this);
879331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
880331de23705a719514e37c211f327379688f81b0dChris Lattner  }
881331de23705a719514e37c211f327379688f81b0dChris Lattner  // Four options...
882331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t, class M2t, class M3t>
8836e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner  opt(const M0t &M0, const M1t &M1, const M2t &M2,
884f6143ef556ed01311d2043d38421302479f7866cChris Lattner      const M3t &M3) : Option(Optional | NotHidden) {
885331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
886331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
887331de23705a719514e37c211f327379688f81b0dChris Lattner  }
888331de23705a719514e37c211f327379688f81b0dChris Lattner  // Five options...
889331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t, class M2t, class M3t, class M4t>
890331de23705a719514e37c211f327379688f81b0dChris Lattner  opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
891f6143ef556ed01311d2043d38421302479f7866cChris Lattner      const M4t &M4) : Option(Optional | NotHidden) {
892331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
893331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M4, this);
894331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
895331de23705a719514e37c211f327379688f81b0dChris Lattner  }
896331de23705a719514e37c211f327379688f81b0dChris Lattner  // Six options...
897331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t, class M2t, class M3t,
898331de23705a719514e37c211f327379688f81b0dChris Lattner           class M4t, class M5t>
899331de23705a719514e37c211f327379688f81b0dChris Lattner  opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
900f6143ef556ed01311d2043d38421302479f7866cChris Lattner      const M4t &M4, const M5t &M5) : Option(Optional | NotHidden) {
901331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
902331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M4, this); apply(M5, this);
903331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
904331de23705a719514e37c211f327379688f81b0dChris Lattner  }
905331de23705a719514e37c211f327379688f81b0dChris Lattner  // Seven options...
906331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t, class M2t, class M3t,
907331de23705a719514e37c211f327379688f81b0dChris Lattner           class M4t, class M5t, class M6t>
908331de23705a719514e37c211f327379688f81b0dChris Lattner  opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
909f6143ef556ed01311d2043d38421302479f7866cChris Lattner      const M4t &M4, const M5t &M5,
910f6143ef556ed01311d2043d38421302479f7866cChris Lattner      const M6t &M6) : Option(Optional | NotHidden) {
911331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
912331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M4, this); apply(M5, this); apply(M6, this);
913331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
914331de23705a719514e37c211f327379688f81b0dChris Lattner  }
915331de23705a719514e37c211f327379688f81b0dChris Lattner  // Eight options...
916331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t, class M2t, class M3t,
917331de23705a719514e37c211f327379688f81b0dChris Lattner           class M4t, class M5t, class M6t, class M7t>
918331de23705a719514e37c211f327379688f81b0dChris Lattner  opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
9196e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner      const M4t &M4, const M5t &M5, const M6t &M6,
920f6143ef556ed01311d2043d38421302479f7866cChris Lattner      const M7t &M7) : Option(Optional | NotHidden) {
921331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
922331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M4, this); apply(M5, this); apply(M6, this); apply(M7, this);
923331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
924331de23705a719514e37c211f327379688f81b0dChris Lattner  }
925cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner};
926cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
9277422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class opt<unsigned>);
9287422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class opt<int>);
9297422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class opt<std::string>);
9307422a761008ef63152417c5e69ddc31252fb6b10Chris LattnerEXTERN_TEMPLATE_INSTANTIATION(class opt<bool>);
9317422a761008ef63152417c5e69ddc31252fb6b10Chris Lattner
932331de23705a719514e37c211f327379688f81b0dChris Lattner//===----------------------------------------------------------------------===//
933331de23705a719514e37c211f327379688f81b0dChris Lattner// list_storage class
934331de23705a719514e37c211f327379688f81b0dChris Lattner
935331de23705a719514e37c211f327379688f81b0dChris Lattner// Default storage class definition: external storage.  This implementation
936331de23705a719514e37c211f327379688f81b0dChris Lattner// assumes the user will specify a variable to store the data into with the
937331de23705a719514e37c211f327379688f81b0dChris Lattner// cl::location(x) modifier.
938331de23705a719514e37c211f327379688f81b0dChris Lattner//
939331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType, class StorageClass>
940331de23705a719514e37c211f327379688f81b0dChris Lattnerclass list_storage {
941331de23705a719514e37c211f327379688f81b0dChris Lattner  StorageClass *Location;   // Where to store the object...
94271fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner
943cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic:
944331de23705a719514e37c211f327379688f81b0dChris Lattner  list_storage() : Location(0) {}
945331de23705a719514e37c211f327379688f81b0dChris Lattner
946331de23705a719514e37c211f327379688f81b0dChris Lattner  bool setLocation(Option &O, StorageClass &L) {
947331de23705a719514e37c211f327379688f81b0dChris Lattner    if (Location)
948331de23705a719514e37c211f327379688f81b0dChris Lattner      return O.error(": cl::location(x) specified more than once!");
949331de23705a719514e37c211f327379688f81b0dChris Lattner    Location = &L;
950331de23705a719514e37c211f327379688f81b0dChris Lattner    return false;
95171fb71628ab3f5280a7f4602f52ba365bca31f29Chris Lattner  }
952331de23705a719514e37c211f327379688f81b0dChris Lattner
953331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class T>
954331de23705a719514e37c211f327379688f81b0dChris Lattner  void addValue(const T &V) {
955331de23705a719514e37c211f327379688f81b0dChris Lattner    assert(Location != 0 && "cl::location(...) not specified for a command "
956331de23705a719514e37c211f327379688f81b0dChris Lattner           "line option with external storage!");
957331de23705a719514e37c211f327379688f81b0dChris Lattner    Location->push_back(V);
958cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  }
959331de23705a719514e37c211f327379688f81b0dChris Lattner};
960331de23705a719514e37c211f327379688f81b0dChris Lattner
961331de23705a719514e37c211f327379688f81b0dChris Lattner
962331de23705a719514e37c211f327379688f81b0dChris Lattner// Define how to hold a class type object, such as a string.  Since we can
963331de23705a719514e37c211f327379688f81b0dChris Lattner// inherit from a class, we do so.  This makes us exactly compatible with the
964331de23705a719514e37c211f327379688f81b0dChris Lattner// object in all cases that it is used.
965331de23705a719514e37c211f327379688f81b0dChris Lattner//
966331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate<class DataType>
9671fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass list_storage<DataType, bool> : public std::vector<DataType> {
9681fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic:
969331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class T>
970331de23705a719514e37c211f327379688f81b0dChris Lattner  void addValue(const T &V) { push_back(V); }
971cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner};
972cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
973cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
974cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//===----------------------------------------------------------------------===//
975331de23705a719514e37c211f327379688f81b0dChris Lattner// list - A list of command line options.
976cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner//
977331de23705a719514e37c211f327379688f81b0dChris Lattnertemplate <class DataType, class Storage = bool,
978331de23705a719514e37c211f327379688f81b0dChris Lattner          class ParserClass = parser<DataType> >
979331de23705a719514e37c211f327379688f81b0dChris Lattnerclass list : public Option, public list_storage<DataType, Storage> {
9801e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer  std::vector<unsigned> Positions;
981331de23705a719514e37c211f327379688f81b0dChris Lattner  ParserClass Parser;
982331de23705a719514e37c211f327379688f81b0dChris Lattner
983cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  virtual enum ValueExpected getValueExpectedFlagDefault() const {
984331de23705a719514e37c211f327379688f81b0dChris Lattner    return Parser.getValueExpectedFlagDefault();
985cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner  }
9869878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  virtual void getExtraOptionNames(std::vector<const char*> &OptionNames) {
9879878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner    return Parser.getExtraOptionNames(OptionNames);
9889878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  }
989beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov
99063b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman  virtual bool handleOccurrence(unsigned pos, const char *ArgName,
9911e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer                                const std::string &Arg) {
9928a207c16d2eb44ebcf94b13b0db047e46b7b0d30Reid Spencer    typename ParserClass::parser_data_type Val =
9938a207c16d2eb44ebcf94b13b0db047e46b7b0d30Reid Spencer      typename ParserClass::parser_data_type();
994d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner    if (Parser.parse(*this, ArgName, Arg, Val))
995d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner      return true;  // Parse Error!
996d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner    addValue(Val);
9971e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer    setPosition(pos);
9981e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer    Positions.push_back(pos);
999d23a35bc2b6db436b1d396872d26b49420890c3bChris Lattner    return false;
1000331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1001cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
1002331de23705a719514e37c211f327379688f81b0dChris Lattner  // Forward printing stuff to the parser...
100334cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  virtual size_t getOptionWidth() const {return Parser.getOptionWidth(*this);}
100434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  virtual void printOptionInfo(size_t GlobalWidth) const {
1005331de23705a719514e37c211f327379688f81b0dChris Lattner    Parser.printOptionInfo(*this, GlobalWidth);
1006331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1007cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
1008331de23705a719514e37c211f327379688f81b0dChris Lattner  void done() {
10099878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner    addArgument();
1010331de23705a719514e37c211f327379688f81b0dChris Lattner    Parser.initialize(*this);
1011331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1012cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic:
1013331de23705a719514e37c211f327379688f81b0dChris Lattner  ParserClass &getParser() { return Parser; }
1014331de23705a719514e37c211f327379688f81b0dChris Lattner
101563b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman  unsigned getPosition(unsigned optnum) const {
10161e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer    assert(optnum < this->size() && "Invalid option index");
101763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman    return Positions[optnum];
10181e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer  }
10191e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer
10207059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov  void setNumAdditionalVals(unsigned n) {
10217059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov    Option::setNumAdditionalVals(n);
10227059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov  }
10237059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov
1024331de23705a719514e37c211f327379688f81b0dChris Lattner  // One option...
1025331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t>
1026cdf2b3b2f88d6f961b664e3f67a8ee37b46b0d27Dan Gohman  explicit list(const M0t &M0) : Option(ZeroOrMore | NotHidden) {
1027331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this);
1028331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
1029331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1030331de23705a719514e37c211f327379688f81b0dChris Lattner  // Two options...
1031331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t>
1032f6143ef556ed01311d2043d38421302479f7866cChris Lattner  list(const M0t &M0, const M1t &M1) : Option(ZeroOrMore | NotHidden) {
1033331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this);
1034331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
1035331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1036331de23705a719514e37c211f327379688f81b0dChris Lattner  // Three options...
1037331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t, class M2t>
1038f6143ef556ed01311d2043d38421302479f7866cChris Lattner  list(const M0t &M0, const M1t &M1, const M2t &M2)
1039f6143ef556ed01311d2043d38421302479f7866cChris Lattner    : Option(ZeroOrMore | NotHidden) {
1040331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this); apply(M2, this);
1041331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
1042331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1043331de23705a719514e37c211f327379688f81b0dChris Lattner  // Four options...
1044331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t, class M2t, class M3t>
10456e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner  list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3)
1046f6143ef556ed01311d2043d38421302479f7866cChris Lattner    : Option(ZeroOrMore | NotHidden) {
1047331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
1048331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
1049331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1050331de23705a719514e37c211f327379688f81b0dChris Lattner  // Five options...
1051331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t, class M2t, class M3t, class M4t>
1052331de23705a719514e37c211f327379688f81b0dChris Lattner  list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
1053f6143ef556ed01311d2043d38421302479f7866cChris Lattner       const M4t &M4) : Option(ZeroOrMore | NotHidden) {
1054331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
1055331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M4, this);
1056331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
1057331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1058331de23705a719514e37c211f327379688f81b0dChris Lattner  // Six options...
1059331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t, class M2t, class M3t,
1060331de23705a719514e37c211f327379688f81b0dChris Lattner           class M4t, class M5t>
1061331de23705a719514e37c211f327379688f81b0dChris Lattner  list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
1062f6143ef556ed01311d2043d38421302479f7866cChris Lattner       const M4t &M4, const M5t &M5) : Option(ZeroOrMore | NotHidden) {
1063331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
1064331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M4, this); apply(M5, this);
1065331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
1066331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1067331de23705a719514e37c211f327379688f81b0dChris Lattner  // Seven options...
1068331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t, class M2t, class M3t,
1069331de23705a719514e37c211f327379688f81b0dChris Lattner           class M4t, class M5t, class M6t>
1070331de23705a719514e37c211f327379688f81b0dChris Lattner  list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
1071f6143ef556ed01311d2043d38421302479f7866cChris Lattner       const M4t &M4, const M5t &M5, const M6t &M6)
1072f6143ef556ed01311d2043d38421302479f7866cChris Lattner    : Option(ZeroOrMore | NotHidden) {
1073331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
1074331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M4, this); apply(M5, this); apply(M6, this);
1075331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
1076331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1077331de23705a719514e37c211f327379688f81b0dChris Lattner  // Eight options...
1078331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t, class M2t, class M3t,
1079331de23705a719514e37c211f327379688f81b0dChris Lattner           class M4t, class M5t, class M6t, class M7t>
1080331de23705a719514e37c211f327379688f81b0dChris Lattner  list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
10816e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner       const M4t &M4, const M5t &M5, const M6t &M6,
1082f6143ef556ed01311d2043d38421302479f7866cChris Lattner       const M7t &M7) : Option(ZeroOrMore | NotHidden) {
1083331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
1084331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M4, this); apply(M5, this); apply(M6, this); apply(M7, this);
1085331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
1086331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1087cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner};
1088cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
10897059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov// multi_arg - Modifier to set the number of additional values.
10907059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkovstruct multi_val {
10917059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov  unsigned AdditionalVals;
10927059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov  explicit multi_val(unsigned N) : AdditionalVals(N) {}
10937059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov
10947059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov  template <typename D, typename S, typename P>
10957059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov  void apply(list<D, S, P> &L) const { L.setNumAdditionalVals(AdditionalVals); }
10967059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov};
10977059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov
10987059d47a6e1a378232dce3e47b51434dec0ea608Mikhail Glushenkov
1099331de23705a719514e37c211f327379688f81b0dChris Lattner//===----------------------------------------------------------------------===//
1100eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// bits_storage class
1101eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey
1102eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// Default storage class definition: external storage.  This implementation
1103eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// assumes the user will specify a variable to store the data into with the
1104eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// cl::location(x) modifier.
1105eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey//
1106eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeytemplate<class DataType, class StorageClass>
1107eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeyclass bits_storage {
1108a2860651e8567fe8d8af3968955845b0755f50d0Jim Laskey  unsigned *Location;   // Where to store the bits...
1109beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov
1110eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  template<class T>
1111eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  static unsigned Bit(const T &V) {
11123e41da29fb74a4f2a43a1539b612b2fb11bef375Reid Spencer    unsigned BitPos = reinterpret_cast<unsigned>(V);
1113de551f91d8816632a76a065084caab9fab6aacffDan Gohman    assert(BitPos < sizeof(unsigned) * CHAR_BIT &&
1114eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey          "enum exceeds width of bit vector!");
1115eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    return 1 << BitPos;
1116eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1117eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey
1118eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeypublic:
1119eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  bits_storage() : Location(0) {}
1120eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey
1121a2860651e8567fe8d8af3968955845b0755f50d0Jim Laskey  bool setLocation(Option &O, unsigned &L) {
1122eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    if (Location)
1123eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey      return O.error(": cl::location(x) specified more than once!");
1124eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    Location = &L;
1125eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    return false;
1126eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1127eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey
1128eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  template<class T>
1129eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  void addValue(const T &V) {
1130eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    assert(Location != 0 && "cl::location(...) not specified for a command "
1131eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey           "line option with external storage!");
1132eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    *Location |= Bit(V);
1133eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1134beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov
1135a2860651e8567fe8d8af3968955845b0755f50d0Jim Laskey  unsigned getBits() { return *Location; }
1136beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov
1137eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  template<class T>
1138eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  bool isSet(const T &V) {
1139eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    return (*Location & Bit(V)) != 0;
1140eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1141eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey};
1142eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey
1143eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey
1144beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov// Define how to hold bits.  Since we can inherit from a class, we do so.
1145eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// This makes us exactly compatible with the bits in all cases that it is used.
1146eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey//
1147eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeytemplate<class DataType>
1148eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeyclass bits_storage<DataType, bool> {
1149a2860651e8567fe8d8af3968955845b0755f50d0Jim Laskey  unsigned Bits;   // Where to store the bits...
1150beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov
1151eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  template<class T>
1152eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  static unsigned Bit(const T &V) {
11533e41da29fb74a4f2a43a1539b612b2fb11bef375Reid Spencer    unsigned BitPos = reinterpret_cast<unsigned>(V);
1154de551f91d8816632a76a065084caab9fab6aacffDan Gohman    assert(BitPos < sizeof(unsigned) * CHAR_BIT &&
1155eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey          "enum exceeds width of bit vector!");
1156eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    return 1 << BitPos;
1157eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1158beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov
1159eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeypublic:
1160eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  template<class T>
1161eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  void addValue(const T &V) {
1162eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    Bits |=  Bit(V);
1163eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1164beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov
1165a2860651e8567fe8d8af3968955845b0755f50d0Jim Laskey  unsigned getBits() { return Bits; }
1166beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov
1167eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  template<class T>
1168eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  bool isSet(const T &V) {
1169eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    return (Bits & Bit(V)) != 0;
1170eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1171eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey};
1172eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey
1173eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey
1174eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey//===----------------------------------------------------------------------===//
1175eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey// bits - A bit vector of command options.
1176eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey//
1177eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeytemplate <class DataType, class Storage = bool,
1178eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey          class ParserClass = parser<DataType> >
1179eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeyclass bits : public Option, public bits_storage<DataType, Storage> {
1180eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  std::vector<unsigned> Positions;
1181eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  ParserClass Parser;
1182eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey
1183eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  virtual enum ValueExpected getValueExpectedFlagDefault() const {
1184eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    return Parser.getValueExpectedFlagDefault();
1185eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
11869878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  virtual void getExtraOptionNames(std::vector<const char*> &OptionNames) {
11879878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner    return Parser.getExtraOptionNames(OptionNames);
11889878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner  }
1189beb4d8293d5311c4581fd3d914f865e358af53a5Mikhail Glushenkov
1190eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  virtual bool handleOccurrence(unsigned pos, const char *ArgName,
1191eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey                                const std::string &Arg) {
1192eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    typename ParserClass::parser_data_type Val =
1193eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey      typename ParserClass::parser_data_type();
1194eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    if (Parser.parse(*this, ArgName, Arg, Val))
1195eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey      return true;  // Parse Error!
1196eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    addValue(Val);
1197eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    setPosition(pos);
1198eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    Positions.push_back(pos);
1199eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    return false;
1200eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1201eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey
1202eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  // Forward printing stuff to the parser...
120334cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  virtual size_t getOptionWidth() const {return Parser.getOptionWidth(*this);}
120434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  virtual void printOptionInfo(size_t GlobalWidth) const {
1205eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    Parser.printOptionInfo(*this, GlobalWidth);
1206eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1207eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey
1208eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  void done() {
12099878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner    addArgument();
1210eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    Parser.initialize(*this);
1211eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1212eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskeypublic:
1213eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  ParserClass &getParser() { return Parser; }
1214eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey
1215eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  unsigned getPosition(unsigned optnum) const {
1216eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    assert(optnum < this->size() && "Invalid option index");
1217eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    return Positions[optnum];
1218eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1219eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey
1220eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  // One option...
1221eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  template<class M0t>
1222cdf2b3b2f88d6f961b664e3f67a8ee37b46b0d27Dan Gohman  explicit bits(const M0t &M0) : Option(ZeroOrMore | NotHidden) {
1223eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    apply(M0, this);
1224eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    done();
1225eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1226eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  // Two options...
1227eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  template<class M0t, class M1t>
1228f6143ef556ed01311d2043d38421302479f7866cChris Lattner  bits(const M0t &M0, const M1t &M1) : Option(ZeroOrMore | NotHidden) {
1229eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    apply(M0, this); apply(M1, this);
1230eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    done();
1231eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1232eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  // Three options...
1233eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  template<class M0t, class M1t, class M2t>
1234f6143ef556ed01311d2043d38421302479f7866cChris Lattner  bits(const M0t &M0, const M1t &M1, const M2t &M2)
1235f6143ef556ed01311d2043d38421302479f7866cChris Lattner    : Option(ZeroOrMore | NotHidden) {
1236eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    apply(M0, this); apply(M1, this); apply(M2, this);
1237eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    done();
1238eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1239eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  // Four options...
1240eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  template<class M0t, class M1t, class M2t, class M3t>
1241f6143ef556ed01311d2043d38421302479f7866cChris Lattner  bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3)
1242f6143ef556ed01311d2043d38421302479f7866cChris Lattner    : Option(ZeroOrMore | NotHidden) {
1243eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
1244eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    done();
1245eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1246eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  // Five options...
1247eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  template<class M0t, class M1t, class M2t, class M3t, class M4t>
1248eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
1249f6143ef556ed01311d2043d38421302479f7866cChris Lattner       const M4t &M4) : Option(ZeroOrMore | NotHidden) {
1250eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
1251eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    apply(M4, this);
1252eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    done();
1253eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1254eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  // Six options...
1255eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  template<class M0t, class M1t, class M2t, class M3t,
1256eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey           class M4t, class M5t>
1257eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
1258f6143ef556ed01311d2043d38421302479f7866cChris Lattner       const M4t &M4, const M5t &M5) : Option(ZeroOrMore | NotHidden) {
1259eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
1260eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    apply(M4, this); apply(M5, this);
1261eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    done();
1262eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1263eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  // Seven options...
1264eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  template<class M0t, class M1t, class M2t, class M3t,
1265eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey           class M4t, class M5t, class M6t>
1266eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
1267f6143ef556ed01311d2043d38421302479f7866cChris Lattner       const M4t &M4, const M5t &M5, const M6t &M6)
1268f6143ef556ed01311d2043d38421302479f7866cChris Lattner    : Option(ZeroOrMore | NotHidden) {
1269eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
1270eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    apply(M4, this); apply(M5, this); apply(M6, this);
1271eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    done();
1272eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1273eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  // Eight options...
1274eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  template<class M0t, class M1t, class M2t, class M3t,
1275eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey           class M4t, class M5t, class M6t, class M7t>
1276eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
12776e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner       const M4t &M4, const M5t &M5, const M6t &M6,
1278f6143ef556ed01311d2043d38421302479f7866cChris Lattner       const M7t &M7) : Option(ZeroOrMore | NotHidden) {
1279eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
1280eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    apply(M4, this); apply(M5, this); apply(M6, this); apply(M7, this);
1281eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey    done();
1282eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey  }
1283eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey};
1284eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey
1285eb0c36d173591f24f29eeb1e9ec7d174b140d511Jim Laskey//===----------------------------------------------------------------------===//
1286331de23705a719514e37c211f327379688f81b0dChris Lattner// Aliased command line option (alias this name to a preexisting name)
1287331de23705a719514e37c211f327379688f81b0dChris Lattner//
1288331de23705a719514e37c211f327379688f81b0dChris Lattner
1289331de23705a719514e37c211f327379688f81b0dChris Lattnerclass alias : public Option {
1290331de23705a719514e37c211f327379688f81b0dChris Lattner  Option *AliasFor;
12910008f654bf08dc631a1abaa175dd08f1fd1be75eSteve Naroff  virtual bool handleOccurrence(unsigned pos, const char * /*ArgName*/,
12921e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer                                const std::string &Arg) {
12931e13fd23d34e53b63cb08c0fe54f0857757ec200Reid Spencer    return AliasFor->handleOccurrence(pos, AliasFor->ArgStr, Arg);
1294331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1295331de23705a719514e37c211f327379688f81b0dChris Lattner  // Handle printing stuff...
129634cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  virtual size_t getOptionWidth() const;
129734cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  virtual void printOptionInfo(size_t GlobalWidth) const;
1298331de23705a719514e37c211f327379688f81b0dChris Lattner
1299331de23705a719514e37c211f327379688f81b0dChris Lattner  void done() {
1300331de23705a719514e37c211f327379688f81b0dChris Lattner    if (!hasArgStr())
1301331de23705a719514e37c211f327379688f81b0dChris Lattner      error(": cl::alias must have argument name specified!");
1302331de23705a719514e37c211f327379688f81b0dChris Lattner    if (AliasFor == 0)
1303331de23705a719514e37c211f327379688f81b0dChris Lattner      error(": cl::alias must have an cl::aliasopt(option) specified!");
13049878d6ae3a535e421f69e0c08e27b259ad1bdbdcChris Lattner      addArgument();
1305331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1306cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattnerpublic:
1307331de23705a719514e37c211f327379688f81b0dChris Lattner  void setAliasFor(Option &O) {
1308331de23705a719514e37c211f327379688f81b0dChris Lattner    if (AliasFor)
1309331de23705a719514e37c211f327379688f81b0dChris Lattner      error(": cl::alias must only have one cl::aliasopt(...) specified!");
1310331de23705a719514e37c211f327379688f81b0dChris Lattner    AliasFor = &O;
1311331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1312331de23705a719514e37c211f327379688f81b0dChris Lattner
1313331de23705a719514e37c211f327379688f81b0dChris Lattner  // One option...
1314331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t>
1315cdf2b3b2f88d6f961b664e3f67a8ee37b46b0d27Dan Gohman  explicit alias(const M0t &M0) : Option(Optional | Hidden), AliasFor(0) {
1316331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this);
1317331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
1318331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1319331de23705a719514e37c211f327379688f81b0dChris Lattner  // Two options...
1320331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t>
1321f6143ef556ed01311d2043d38421302479f7866cChris Lattner  alias(const M0t &M0, const M1t &M1) : Option(Optional | Hidden), AliasFor(0) {
1322331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this);
1323331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
1324331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1325331de23705a719514e37c211f327379688f81b0dChris Lattner  // Three options...
1326331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t, class M2t>
13276e18fa0e1c230ac1b551c34214dac82510974681Chris Lattner  alias(const M0t &M0, const M1t &M1, const M2t &M2)
1328f6143ef556ed01311d2043d38421302479f7866cChris Lattner    : Option(Optional | Hidden), AliasFor(0) {
1329331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this); apply(M2, this);
1330331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
1331331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1332331de23705a719514e37c211f327379688f81b0dChris Lattner  // Four options...
1333331de23705a719514e37c211f327379688f81b0dChris Lattner  template<class M0t, class M1t, class M2t, class M3t>
1334331de23705a719514e37c211f327379688f81b0dChris Lattner  alias(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3)
1335f6143ef556ed01311d2043d38421302479f7866cChris Lattner    : Option(Optional | Hidden), AliasFor(0) {
1336331de23705a719514e37c211f327379688f81b0dChris Lattner    apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
1337331de23705a719514e37c211f327379688f81b0dChris Lattner    done();
1338331de23705a719514e37c211f327379688f81b0dChris Lattner  }
1339331de23705a719514e37c211f327379688f81b0dChris Lattner};
1340331de23705a719514e37c211f327379688f81b0dChris Lattner
1341331de23705a719514e37c211f327379688f81b0dChris Lattner// aliasfor - Modifier to set the option an alias aliases.
1342331de23705a719514e37c211f327379688f81b0dChris Lattnerstruct aliasopt {
1343331de23705a719514e37c211f327379688f81b0dChris Lattner  Option &Opt;
1344cdf2b3b2f88d6f961b664e3f67a8ee37b46b0d27Dan Gohman  explicit aliasopt(Option &O) : Opt(O) {}
1345331de23705a719514e37c211f327379688f81b0dChris Lattner  void apply(alias &A) const { A.setAliasFor(Opt); }
1346cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner};
1347cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
13489bbba091396922093687d11a181e5886c42c5dfdReid Spencer// extrahelp - provide additional help at the end of the normal help
13499bbba091396922093687d11a181e5886c42c5dfdReid Spencer// output. All occurrences of cl::extrahelp will be accumulated and
13509bbba091396922093687d11a181e5886c42c5dfdReid Spencer// printed to std::cerr at the end of the regular help, just before
13519bbba091396922093687d11a181e5886c42c5dfdReid Spencer// exit is called.
13529bbba091396922093687d11a181e5886c42c5dfdReid Spencerstruct extrahelp {
13539bbba091396922093687d11a181e5886c42c5dfdReid Spencer  const char * morehelp;
1354b5660dc8223bd5eb3d21d9855692617fcdec5663Dan Gohman  explicit extrahelp(const char* help);
13559bbba091396922093687d11a181e5886c42c5dfdReid Spencer};
13569bbba091396922093687d11a181e5886c42c5dfdReid Spencer
1357aed293dfba04b07a867491c11dfff4bf3eb6bdddDevang Patelvoid PrintVersionMessage();
13589bbba091396922093687d11a181e5886c42c5dfdReid Spencer// This function just prints the help message, exactly the same way as if the
13599bbba091396922093687d11a181e5886c42c5dfdReid Spencer// --help option had been given on the command line.
13609bbba091396922093687d11a181e5886c42c5dfdReid Spencer// NOTE: THIS FUNCTION TERMINATES THE PROGRAM!
13619bbba091396922093687d11a181e5886c42c5dfdReid Spencervoid PrintHelpMessage();
1362cc08ee507fc47d80a67c10a20b95587f7f06f0b7Reid Spencer
1363cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner} // End namespace cl
1364cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner
1365d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End namespace llvm
1366d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
1367cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner#endif
1368