Another typo
[oota-llvm.git] / docs / CommandLine.html
index 0eda9c2c4d210bf6b9e5186483c87d4c78f66a8f..bf80ec07d458ad575b0420acc78f2094edd35e38 100644 (file)
@@ -2,6 +2,7 @@
                       "http://www.w3.org/TR/html4/strict.dtd">
 <html>
 <head>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <title>CommandLine 2.0 Library Manual</title>
   <link rel="stylesheet" href="llvm.css" type="text/css">
 </head>
@@ -22,6 +23,7 @@
                                     set of possibilities</a></li>
       <li><a href="#namedalternatives">Named alternatives</a></li>
       <li><a href="#list">Parsing a list of options</a></li>
+      <li><a href="#bits">Collecting options as a set of flags</a></li>
       <li><a href="#description">Adding freeform text to help output</a></li>
     </ol></li>
 
             <tt>cl::ParseCommandLineOptions</tt> function</a></li>
         <li><a href="#cl::ParseEnvironmentOptions">The 
             <tt>cl::ParseEnvironmentOptions</tt> function</a></li>
+        <li><a href="#cl::SetVersionPrinter">The cl::SetVersionPrinter
+          function</a></li>
         <li><a href="#cl::opt">The <tt>cl::opt</tt> class</a></li>
         <li><a href="#cl::list">The <tt>cl::list</tt> class</a></li>
+        <li><a href="#cl::bits">The <tt>cl::bits</tt> class</a></li>
         <li><a href="#cl::alias">The <tt>cl::alias</tt> class</a></li>
+        <li><a href="#cl::extrahelp">The <tt>cl::extrahelp</tt> class</a></li>
         </ul></li>
 
       <li><a href="#builtinparsers">Builtin parsers</a>
@@ -69,6 +75,8 @@
             parser</a></li>
         <li><a href="#boolparser">The <tt>parser&lt;bool&gt;</tt>
             specialization</a></li>
+        <li><a href="#boolOrDefaultparser">The <tt>parser&lt;boolOrDefault&gt;</tt>
+            specialization</a></li>
         <li><a href="#stringparser">The <tt>parser&lt;string&gt;</tt>
             specialization</a></li>
         <li><a href="#intparser">The <tt>parser&lt;int&gt;</tt>
@@ -190,19 +198,19 @@ can do.</p>
 <p>To start out, you need to include the CommandLine header file into your
 program:</p>
 
-<pre>
-  #include "Support/CommandLine.h"
-</pre>
+<div class="doc_code"><pre>
+  #include "llvm/Support/CommandLine.h"
+</pre></div>
 
 <p>Additionally, you need to add this as the first line of your main
 program:</p>
 
-<pre>
+<div class="doc_code"><pre>
 int main(int argc, char **argv) {
   <a href="#cl::ParseCommandLineOptions">cl::ParseCommandLineOptions</a>(argc, argv);
   ...
 }
-</pre>
+</pre></div>
 
 <p>... which actually parses the arguments and fills in the variable
 declarations.</p>
@@ -218,9 +226,9 @@ to specify where to put the output.  With the CommandLine library, this is
 represented like this:</p>
 
 <a name="value_desc_example"></a>
-<pre>
+<div class="doc_code"><pre>
 <a href="#cl::opt">cl::opt</a>&lt;string&gt; OutputFilename("<i>o</i>", <a href="#cl::desc">cl::desc</a>("<i>Specify output filename</i>"), <a href="#cl::value_desc">cl::value_desc</a>("<i>filename</i>"));
-</pre>
+</pre></div>
 
 <p>This declares a global variable "<tt>OutputFilename</tt>" that is used to
 capture the result of the "<tt>o</tt>" argument (first parameter).  We specify
@@ -233,25 +241,25 @@ that the data type that we are parsing is a string.</p>
 to output for the "<tt>--help</tt>" option.  In this case, we get a line that
 looks like this:</p>
 
-<pre>
+<div class="doc_code"><pre>
 USAGE: compiler [options]
 
 OPTIONS:
   -help             - display available options (--help-hidden for more)
   <b>-o &lt;filename&gt;     - Specify output filename</b>
-</pre>
+</pre></div>
 
 <p>Because we specified that the command line option should parse using the
 <tt>string</tt> data type, the variable declared is automatically usable as a
 real string in all contexts that a normal C++ string object may be used.  For
 example:</p>
 
-<pre>
+<div class="doc_code"><pre>
   ...
   ofstream Output(OutputFilename.c_str());
   if (Out.good()) ...
   ...
-</pre>
+</pre></div>
 
 <p>There are many different options that you can use to customize the command
 line option handling library, but the above example shows the general interface
@@ -268,9 +276,9 @@ href="#positional">positional</a> arguments to be specified for the program.
 These positional arguments are filled with command line parameters that are not
 in option form.  We use this feature like this:</p>
 
-<pre>
+<div class="doc_code"><pre>
 <a href="#cl::opt">cl::opt</a>&lt;string&gt; InputFilename(<a href="#cl::Positional">cl::Positional</a>, <a href="#cl::desc">cl::desc</a>("<i>&lt;input file&gt;</i>"), <a href="#cl::init">cl::init</a>("<i>-</i>"));
-</pre>
+</pre></div>
 
 <p>This declaration indicates that the first positional argument should be
 treated as the input filename.  Here we use the <tt><a
@@ -283,16 +291,16 @@ that the user always specify an input filename, we would add the <tt><a
 href="#cl::Required">cl::Required</a></tt> flag, and we could eliminate the
 <tt><a href="#cl::init">cl::init</a></tt> modifier, like this:</p>
 
-<pre>
+<div class="doc_code"><pre>
 <a href="#cl::opt">cl::opt</a>&lt;string&gt; InputFilename(<a href="#cl::Positional">cl::Positional</a>, <a href="#cl::desc">cl::desc</a>("<i>&lt;input file&gt;</i>"), <b><a href="#cl::Required">cl::Required</a></b>);
-</pre>
+</pre></div>
 
 <p>Again, the CommandLine library does not require the options to be specified
 in any particular order, so the above declaration is equivalent to:</p>
 
-<pre>
+<div class="doc_code"><pre>
 <a href="#cl::opt">cl::opt</a>&lt;string&gt; InputFilename(<a href="#cl::Positional">cl::Positional</a>, <a href="#cl::Required">cl::Required</a>, <a href="#cl::desc">cl::desc</a>("<i>&lt;input file&gt;</i>"));
-</pre>
+</pre></div>
 
 <p>By simply adding the <tt><a href="#cl::Required">cl::Required</a></tt> flag,
 the CommandLine library will automatically issue an error if the argument is not
@@ -302,13 +310,13 @@ can alter the default behaviour of the library, on a per-option basis.  By
 adding one of the declarations above, the <tt>--help</tt> option synopsis is now
 extended to:</p>
 
-<pre>
+<div class="doc_code"><pre>
 USAGE: compiler [options] <b>&lt;input file&gt;</b>
 
 OPTIONS:
   -help             - display available options (--help-hidden for more)
   -o &lt;filename&gt;     - Specify output filename
-</pre>
+</pre></div>
 
 <p>... indicating that an input filename is expected.</p>
 
@@ -327,11 +335,11 @@ file, "<tt>--quiet</tt>" to enable quiet mode, and "<tt>-q</tt>" for backwards
 compatibility with some of our users.  We can support these by declaring options
 of boolean type like this:</p>
 
-<pre>
+<div class="doc_code"><pre>
 <a href="#cl::opt">cl::opt</a>&lt;bool&gt; Force ("<i>f</i>", <a href="#cl::desc">cl::desc</a>("<i>Overwrite output files</i>"));
 <a href="#cl::opt">cl::opt</a>&lt;bool&gt; Quiet ("<i>quiet</i>", <a href="#cl::desc">cl::desc</a>("<i>Don't print informational messages</i>"));
 <a href="#cl::opt">cl::opt</a>&lt;bool&gt; Quiet2("<i>q</i>", <a href="#cl::desc">cl::desc</a>("<i>Don't print informational messages</i>"), <a href="#cl::Hidden">cl::Hidden</a>);
-</pre>
+</pre></div>
 
 <p>This does what you would expect: it declares three boolean variables
 ("<tt>Force</tt>", "<tt>Quiet</tt>", and "<tt>Quiet2</tt>") to recognize these
@@ -349,12 +357,12 @@ it assigns the value of true to the variable), or it allows the values
 "<tt>true</tt>" or "<tt>false</tt>" to be specified, allowing any of the
 following inputs:</p>
 
-<pre>
+<div class="doc_code"><pre>
  compiler -f          # No value, 'Force' == true
  compiler -f=true     # Value specified, 'Force' == true
  compiler -f=TRUE     # Value specified, 'Force' == true
  compiler -f=FALSE    # Value specified, 'Force' == false
-</pre>
+</pre></div>
 
 <p>... you get the idea.  The <a href="#boolparser">bool parser</a> just turns
 the string values into boolean values, and rejects things like '<tt>compiler
@@ -365,7 +373,7 @@ library calls to parse the string value into the specified data type.</p>
 
 <p>With the declarations above, "<tt>compiler --help</tt>" emits this:</p>
 
-<pre>
+<div class="doc_code"><pre>
 USAGE: compiler [options] &lt;input file&gt;
 
 OPTIONS:
@@ -373,11 +381,11 @@ OPTIONS:
   -o     - Override output filename
   <b>-quiet - Don't print informational messages</b>
   -help  - display available options (--help-hidden for more)
-</pre>
+</pre></div>
 
 <p>and "<tt>opt --help-hidden</tt>" prints this:</p>
 
-<pre>
+<div class="doc_code"><pre>
 USAGE: compiler [options] &lt;input file&gt;
 
 OPTIONS:
@@ -386,7 +394,7 @@ OPTIONS:
   <b>-q     - Don't print informational messages</b>
   -quiet - Don't print informational messages
   -help  - display available options (--help-hidden for more)
-</pre>
+</pre></div>
 
 <p>This brief example has shown you how to use the '<tt><a
 href="#cl::opt">cl::opt</a></tt>' class to parse simple scalar command line
@@ -406,22 +414,22 @@ and <a href="#list">lists</a> of options.</p>
 <p>So far, the example works well, except for the fact that we need to check the
 quiet condition like this now:</p>
 
-<pre>
+<div class="doc_code"><pre>
 ...
   if (!Quiet &amp;&amp; !Quiet2) printInformationalMessage(...);
 ...
-</pre>
+</pre></div>
 
 <p>... which is a real pain!  Instead of defining two values for the same
 condition, we can use the "<tt><a href="#cl::alias">cl::alias</a></tt>" class to make the "<tt>-q</tt>"
 option an <b>alias</b> for the "<tt>-quiet</tt>" option, instead of providing
 a value itself:</p>
 
-<pre>
+<div class="doc_code"><pre>
 <a href="#cl::opt">cl::opt</a>&lt;bool&gt; Force ("<i>f</i>", <a href="#cl::desc">cl::desc</a>("<i>Overwrite output files</i>"));
 <a href="#cl::opt">cl::opt</a>&lt;bool&gt; Quiet ("<i>quiet</i>", <a href="#cl::desc">cl::desc</a>("<i>Don't print informational messages</i>"));
 <a href="#cl::alias">cl::alias</a>     QuietA("<i>q</i>", <a href="#cl::desc">cl::desc</a>("<i>Alias for -quiet</i>"), <a href="#cl::aliasopt">cl::aliasopt</a>(Quiet));
-</pre>
+</pre></div>
 
 <p>The third line (which is the only one we modified from above) defines a
 "<tt>-q</tt> alias that updates the "<tt>Quiet</tt>" variable (as specified by
@@ -434,11 +442,11 @@ output</tt>).</p>
 
 <p>Now the application code can simply use:</p>
 
-<pre>
+<div class="doc_code"><pre>
 ...
   if (!Quiet) printInformationalMessage(...);
 ...
-</pre>
+</pre></div>
 
 <p>... which is much nicer!  The "<tt><a href="#cl::alias">cl::alias</a></tt>"
 can be used to specify an alternative name for any variable type, and has many
@@ -484,7 +492,7 @@ see if some level &gt;= "<tt>-O1</tt>" is enabled.</li>
 CommandLine library fill it in with the appropriate level directly, which is
 used like this:</p>
 
-<pre>
+<div class="doc_code"><pre>
 enum OptLevel {
   g, O1, O2, O3
 };
@@ -500,7 +508,7 @@ enum OptLevel {
 ...
   if (OptimizationLevel &gt;= O2) doPartialRedundancyElimination(...);
 ...
-</pre>
+</pre></div>
 
 <p>This declaration defines a variable "<tt>OptimizationLevel</tt>" of the
 "<tt>OptLevel</tt>" enum type.  This variable can be assigned any of the values
@@ -512,7 +520,7 @@ enum values can be specified.  The "<tt>clEnumVal</tt>" macros ensure that the
 command line arguments matched the enum values.  With this option added, our
 help output now is:</p>
 
-<pre>
+<div class="doc_code"><pre>
 USAGE: compiler [options] &lt;input file&gt;
 
 OPTIONS:
@@ -525,14 +533,14 @@ OPTIONS:
   -help         - display available options (--help-hidden for more)
   -o &lt;filename&gt; - Specify output filename
   -quiet        - Don't print informational messages
-</pre>
+</pre></div>
 
 <p>In this case, it is sort of awkward that flag names correspond directly to
 enum names, because we probably don't want a enum definition named "<tt>g</tt>"
 in our program.  Because of this, we can alternatively write this example like
 this:</p>
 
-<pre>
+<div class="doc_code"><pre>
 enum OptLevel {
   Debug, O1, O2, O3
 };
@@ -548,7 +556,7 @@ enum OptLevel {
 ...
   if (OptimizationLevel == Debug) outputDebugInfo(...);
 ...
-</pre>
+</pre></div>
 
 <p>By using the "<tt>clEnumValN</tt>" macro instead of "<tt>clEnumVal</tt>", we
 can directly specify the name that the flag should get.  In general a direct
@@ -573,7 +581,7 @@ following options, of which only one can be specified at a time:
 our optimization level flags, but we also specify an option name.  For this
 case, the code looks like this:</p>
 
-<pre>
+<div class="doc_code"><pre>
 enum DebugLev {
   nodebuginfo, quick, detailed
 };
@@ -585,14 +593,14 @@ enum DebugLev {
      clEnumVal(quick,               "<i>enable quick debug information</i>"),
      clEnumVal(detailed,            "<i>enable detailed debug information</i>"),
     clEnumValEnd));
-</pre>
+</pre></div>
 
 <p>This definition defines an enumerated command line variable of type "<tt>enum
 DebugLev</tt>", which works exactly the same way as before.  The difference here
 is just the interface exposed to the user of your program and the help output by
 the "<tt>--help</tt>" option:</p>
 
-<pre>
+<div class="doc_code"><pre>
 USAGE: compiler [options] &lt;input file&gt;
 
 OPTIONS:
@@ -609,10 +617,10 @@ OPTIONS:
   -help         - display available options (--help-hidden for more)
   -o &lt;filename&gt; - Specify output filename
   -quiet        - Don't print informational messages
-</pre>
+</pre></div>
 
 <p>Again, the only structural difference between the debug level declaration and
-the optimiation level declaration is that the debug level declaration includes
+the optimization level declaration is that the debug level declaration includes
 an option name (<tt>"debug_level"</tt>), which automatically changes how the
 library processes the argument.  The CommandLine library supports both forms so
 that you can choose the form most appropriate for your application.</p>
@@ -635,16 +643,16 @@ important.  This is what the "<tt><a href="#cl::list">cl::list</a></tt>"
 template is for.  First, start by defining an enum of the optimizations that you
 would like to perform:</p>
 
-<pre>
+<div class="doc_code"><pre>
 enum Opts {
   // 'inline' is a C++ keyword, so name it 'inlining'
   dce, constprop, inlining, strip
 };
-</pre>
+</pre></div>
 
 <p>Then define your "<tt><a href="#cl::list">cl::list</a></tt>" variable:</p>
 
-<pre>
+<div class="doc_code"><pre>
 <a href="#cl::list">cl::list</a>&lt;Opts&gt; OptimizationList(<a href="#cl::desc">cl::desc</a>("<i>Available Optimizations:</i>"),
   <a href="#cl::values">cl::values</a>(
     clEnumVal(dce               , "<i>Dead Code Elimination</i>"),
@@ -652,17 +660,17 @@ enum Opts {
    clEnumValN(inlining, "<i>inline</i>", "<i>Procedure Integration</i>"),
     clEnumVal(strip             , "<i>Strip Symbols</i>"),
   clEnumValEnd));
-</pre>
+</pre></div>
 
 <p>This defines a variable that is conceptually of the type
 "<tt>std::vector&lt;enum Opts&gt;</tt>".  Thus, you can access it with standard
 vector methods:</p>
 
-<pre>
+<div class="doc_code"><pre>
   for (unsigned i = 0; i != OptimizationList.size(); ++i)
     switch (OptimizationList[i])
        ...
-</pre>
+</pre></div>
 
 <p>... to iterate through the list of options specified.</p>
 
@@ -674,11 +682,11 @@ arguments together if there may be more than one specified.  In the case of a
 linker, for example, the linker takes several '<tt>.o</tt>' files, and needs to
 capture them into a list.  This is naturally specified as:</p>
 
-<pre>
+<div class="doc_code"><pre>
 ...
 <a href="#cl::list">cl::list</a>&lt;std::string&gt; InputFilenames(<a href="#cl::Positional">cl::Positional</a>, <a href="#cl::desc">cl::desc</a>("&lt;Input files&gt;"), <a href="#cl::OneOrMore">cl::OneOrMore</a>);
 ...
-</pre>
+</pre></div>
 
 <p>This variable works just like a "<tt>vector&lt;string&gt;</tt>" object.  As
 such, accessing the list is simple, just like above.  In this example, we used
@@ -689,6 +697,65 @@ checking we have to do.</p>
 
 </div>
 
+<!-- ======================================================================= -->
+<div class="doc_subsection">
+  <a name="bits">Collecting options as a set of flags</a>
+</div>
+
+<div class="doc_text">
+
+<p>Instead of collecting sets of options in a list, it is also possible to
+gather information for enum values in a <b>bit vector</b>.  The represention used by
+the <a href="#bits"><tt>cl::bits</tt></a> class is an <tt>unsigned</tt>
+integer.  An enum value is represented by a 0/1 in the enum's ordinal value bit
+position. 1 indicating that the enum was specified, 0 otherwise.  As each
+specified value is parsed, the resulting enum's bit is set in the option's bit
+vector:</p>
+
+<div class="doc_code"><pre>
+  <i>bits</i> |= 1 << (unsigned)<i>enum</i>;
+</pre></div>
+
+<p>Options that are specified multiple times are redundant.  Any instances after
+the first are discarded.</p>
+
+<p>Reworking the above list example, we could replace <a href="#list">
+<tt>cl::list</tt></a> with <a href="#bits"><tt>cl::bits</tt></a>:</p>
+
+<div class="doc_code"><pre>
+<a href="#cl::bits">cl::bits</a>&lt;Opts&gt; OptimizationBits(<a href="#cl::desc">cl::desc</a>("<i>Available Optimizations:</i>"),
+  <a href="#cl::values">cl::values</a>(
+    clEnumVal(dce               , "<i>Dead Code Elimination</i>"),
+    clEnumVal(constprop         , "<i>Constant Propagation</i>"),
+   clEnumValN(inlining, "<i>inline</i>", "<i>Procedure Integration</i>"),
+    clEnumVal(strip             , "<i>Strip Symbols</i>"),
+  clEnumValEnd));
+</pre></div>
+
+<p>To test to see if <tt>constprop</tt> was specified, we can use the
+<tt>cl:bits::isSet</tt> function:</p>
+
+<div class="doc_code"><pre>
+  if (OptimizationBits.isSet(constprop)) {
+    ...
+  }
+</pre></div>
+
+<p>It's also possible to get the raw bit vector using the
+<tt>cl::bits::getBits</tt> function:</p>
+
+<div class="doc_code"><pre>
+  unsigned bits = OptimizationBits.getBits();
+</pre></div>
+
+<p>Finally, if external storage is used, then the location specified must be of
+<b>type</b> <tt>unsigned</tt>. In all other ways a <a
+href="#bits"><tt>cl::bits</tt></a> option is morally equivalent to a <a
+href="#list"> <tt>cl::list</tt></a> option.</p>
+
+</div>
+
+
 <!-- ======================================================================= -->
 <div class="doc_subsection">
   <a name="description">Adding freeform text to help output</a>
@@ -707,17 +774,17 @@ call in main.  This additional argument is then printed as the overview
 information for your program, allowing you to include any additional information
 that you want.  For example:</p>
 
-<pre>
+<div class="doc_code"><pre>
 int main(int argc, char **argv) {
   <a href="#cl::ParseCommandLineOptions">cl::ParseCommandLineOptions</a>(argc, argv, " CommandLine compiler example\n\n"
                               "  This program blah blah blah...\n");
   ...
 }
-</pre>
+</pre></div>
 
-<p>Would yield the help output:</p>
+<p>would yield the help output:</p>
 
-<pre>
+<div class="doc_code"><pre>
 <b>OVERVIEW: CommandLine compiler example
 
   This program blah blah blah...</b>
@@ -728,7 +795,7 @@ OPTIONS:
   ...
   -help             - display available options (--help-hidden for more)
   -o &lt;filename&gt;     - Specify output filename
-</pre>
+</pre></div>
 
 </div>
 
@@ -762,20 +829,20 @@ tool takes a regular expression argument, and an optional filename to search
 through (which defaults to standard input if a filename is not specified).
 Using the CommandLine library, this would be specified as:</p>
 
-<pre>
+<div class="doc_code"><pre>
 <a href="#cl::opt">cl::opt</a>&lt;string&gt; Regex   (<a href="#cl::Positional">cl::Positional</a>, <a href="#cl::desc">cl::desc</a>("<i>&lt;regular expression&gt;</i>"), <a href="#cl::Required">cl::Required</a>);
 <a href="#cl::opt">cl::opt</a>&lt;string&gt; Filename(<a href="#cl::Positional">cl::Positional</a>, <a href="#cl::desc">cl::desc</a>("<i>&lt;input file&gt;</i>"), <a href="#cl::init">cl::init</a>("<i>-</i>"));
-</pre>
+</pre></div>
 
 <p>Given these two option declarations, the <tt>--help</tt> output for our grep
 replacement would look like this:</p>
 
-<pre>
+<div class="doc_code"><pre>
 USAGE: spiffygrep [options] <b>&lt;regular expression&gt; &lt;input file&gt;</b>
 
 OPTIONS:
   -help - display available options (--help-hidden for more)
-</pre>
+</pre></div>
 
 <p>... and the resultant program could be used just like the standard
 <tt>grep</tt> tool.</p>
@@ -802,7 +869,7 @@ first, you will have trouble doing this, because it will try to find an argument
 named '<tt>-foo</tt>', and will fail (and single quotes will not save you).
 Note that the system <tt>grep</tt> has the same problem:</p>
 
-<pre>
+<div class="doc_code"><pre>
   $ spiffygrep '-foo' test.txt
   Unknown command line argument '-foo'.  Try: spiffygrep --help'
 
@@ -811,7 +878,7 @@ Note that the system <tt>grep</tt> has the same problem:</p>
   grep: illegal option -- o
   grep: illegal option -- o
   Usage: grep -hblcnsviw pattern file . . .
-</pre>
+</pre></div>
 
 <p>The solution for this problem is the same for both your tool and the system
 version: use the '<tt>--</tt>' marker.  When the user specifies '<tt>--</tt>' on
@@ -819,10 +886,10 @@ the command line, it is telling the program that all options after the
 '<tt>--</tt>' should be treated as positional arguments, not options.  Thus, we
 can use it like this:</p>
 
-<pre>
+<div class="doc_code"><pre>
   $ spiffygrep -- -foo test.txt
     ...output...
-</pre>
+</pre></div>
 
 </div>
 
@@ -845,7 +912,9 @@ can use it like this:</p>
   <tt>cl::list::getPosition(optnum)</tt> method. This method returns the
   absolute position (as found on the command line) of the <tt>optnum</tt>
   item in the <tt>cl::list</tt>.</p>
-  <p>The idiom for usage is like this:<pre><tt>
+  <p>The idiom for usage is like this:</p>
+  
+  <div class="doc_code"><pre>
   static cl::list&lt;std::string&gt; Files(cl::Positional, cl::OneOrMore);
   static cl::listlt;std::string&gt; Libraries("l", cl::ZeroOrMore);
 
@@ -875,7 +944,8 @@ can use it like this:</p>
       else
         break; // we're done with the list
     }
-  }</tt></pre></p>
+  }</pre></div>
+
   <p>Note that, for compatibility reasons, the <tt>cl::opt</tt> also supports an
   <tt>unsigned getPosition()</tt> option that will provide the absolute position
   of that option. You can apply the same approach as above with a 
@@ -903,23 +973,23 @@ arguments to the script.  These arguments to the script are parsed by the bourne
 shell command line option processor, but are not interpreted as options to the
 shell itself.  Using the CommandLine library, we would specify this as:</p>
 
-<pre>
+<div class="doc_code"><pre>
 <a href="#cl::opt">cl::opt</a>&lt;string&gt; Script(<a href="#cl::Positional">cl::Positional</a>, <a href="#cl::desc">cl::desc</a>("<i>&lt;input script&gt;</i>"), <a href="#cl::init">cl::init</a>("-"));
 <a href="#cl::list">cl::list</a>&lt;string&gt;  Argv(<a href="#cl::ConsumeAfter">cl::ConsumeAfter</a>, <a href="#cl::desc">cl::desc</a>("<i>&lt;program arguments&gt;...</i>"));
 <a href="#cl::opt">cl::opt</a>&lt;bool&gt;    Trace("<i>x</i>", <a href="#cl::desc">cl::desc</a>("<i>Enable trace output</i>"));
-</pre>
+</pre></div>
 
 <p>which automatically provides the help output:</p>
 
-<pre>
+<div class="doc_code"><pre>
 USAGE: spiffysh [options] <b>&lt;input script&gt; &lt;program arguments&gt;...</b>
 
 OPTIONS:
   -help - display available options (--help-hidden for more)
   <b>-x    - Enable trace output</b>
-</pre>
+</pre></div>
 
-<p>At runtime, if we run our new shell replacement as '<tt>spiffysh -x test.sh
+<p>At runtime, if we run our new shell replacement as `<tt>spiffysh -x test.sh
 -a -x -y bar</tt>', the <tt>Trace</tt> variable will be set to true, the
 <tt>Script</tt> variable will be set to "<tt>test.sh</tt>", and the
 <tt>Argv</tt> list will contain <tt>["-a", "-x", "-y", "bar"]</tt>, because they
@@ -958,6 +1028,7 @@ all of these clients (requiring lots of .cpp files to #include
 
 <p>To do this, set up your .h file with your option, like this for example:</p>
 
+<div class="doc_code">
 <pre>
 <i>// DebugFlag.h - Get access to the '-debug' command line option
 //
@@ -973,15 +1044,15 @@ extern bool DebugFlag;
 // debug build, then the code specified as the option to the macro will be
 // executed.  Otherwise it will not be.  Example:
 //
-// DEBUG(cerr << "Bitset contains: " << Bitset << "\n");
+// DOUT &lt;&lt; "Bitset contains: " &lt;&lt; Bitset &lt;&lt; "\n";
 //</i>
-<span class="doc_red">#ifdef NDEBUG
+<span class="doc_hilite">#ifdef NDEBUG
 #define DEBUG(X)
 #else
-#define DEBUG(X)</span> \
-  do { if (DebugFlag) { X; } } while (0)
-<span class="doc_red">#endif</span>
+#define DEBUG(X)</span> do { if (DebugFlag) { X; } } while (0)
+<span class="doc_hilite">#endif</span>
 </pre>
+</div>
 
 <p>This allows clients to blissfully use the <tt>DEBUG()</tt> macro, or the
 <tt>DebugFlag</tt> explicitly if they want to.  Now we just need to be able to
@@ -990,18 +1061,19 @@ an additial argument to our command line argument processor, and we specify
 where to fill in with the <a href="#cl::location">cl::location</a>
 attribute:</p>
 
+<div class="doc_code">
 <pre>
-bool DebugFlag;      <i>// the actual value</i>
+bool DebugFlag;                  <i>// the actual value</i>
 static <a href="#cl::opt">cl::opt</a>&lt;bool, true&gt;       <i>// The parser</i>
-Debug("<i>debug</i>", <a href="#cl::desc">cl::desc</a>("<i>Enable debug output</i>"), <a href="#cl::Hidden">cl::Hidden</a>,
-      <a href="#cl::location">cl::location</a>(DebugFlag));
+Debug("<i>debug</i>", <a href="#cl::desc">cl::desc</a>("<i>Enable debug output</i>"), <a href="#cl::Hidden">cl::Hidden</a>, <a href="#cl::location">cl::location</a>(DebugFlag));
 </pre>
+</div>
 
 <p>In the above example, we specify "<tt>true</tt>" as the second argument to
-the <a href="#cl::opt">cl::opt</a> template, indicating that the template should
-not maintain a copy of the value itself.  In addition to this, we specify the <a
-href="#cl::location">cl::location</a> attribute, so that <tt>DebugFlag</tt> is
-automatically set.</p>
+the <tt><a href="#cl::opt">cl::opt</a></tt> template, indicating that the
+template should not maintain a copy of the value itself.  In addition to this,
+we specify the <tt><a href="#cl::location">cl::location</a></tt> attribute, so
+that <tt>DebugFlag</tt> is automatically set.</p>
 
 </div>
 
@@ -1052,8 +1124,8 @@ the section on <a href="#storage">Internal vs External Storage</a> for more
 information.</li>
 
 <li><a name="cl::aliasopt">The <b><tt>cl::aliasopt</tt></b></a> attribute
-specifies which option a <a href="#cl::alias">cl::alias</a> option is an alias
-for.</li>
+specifies which option a <tt><a href="#cl::alias">cl::alias</a></tt> option is
+an alias for.</li>
 
 <li><a name="cl::values">The <b><tt>cl::values</tt></b></a> attribute specifies
 the string-to-value mapping to be used by the generic parser.  It takes a
@@ -1273,35 +1345,39 @@ Arguments</a> section for more information.</li>
 specifies that this option is used to capture "interpreter style" arguments.  See <a href="#cl::ConsumeAfter">this section for more information</a>.</li>
 
 <li><a name="cl::Prefix">The <b><tt>cl::Prefix</tt></b></a> modifier specifies
-that this option prefixes its value.  With 'Prefix' options, there is no equal
-sign that separates the value from the option name specified.  This is useful
-for processing odd arguments like '<tt>-lmalloc -L/usr/lib'</tt> in a linker
-tool.  Here, the '<tt>l</tt>' and '<tt>L</tt>' options are normal string (list)
-options, that have the <a href="#cl::Prefix">cl::Prefix</a> modifier added to
-allow the CommandLine library to recognize them.  Note that <a
-href="#cl::Prefix">cl::Prefix</a> options must not have the <a
-href="#cl::ValueDisallowed">cl::ValueDisallowed</a> modifier specified.</li>
+that this option prefixes its value.  With 'Prefix' options, the equal sign does
+not separate the value from the option name specified. Instead, the value is
+everything after the prefix, including any equal sign if present. This is useful
+for processing odd arguments like <tt>-lmalloc</tt> and <tt>-L/usr/lib</tt> in a
+linker tool or <tt>-DNAME=value</tt> in a compiler tool.   Here, the
+'<tt>l</tt>', '<tt>D</tt>' and '<tt>L</tt>' options are normal string (or list)
+options, that have the <b><tt><a href="#cl::Prefix">cl::Prefix</a></tt></b>
+modifier added to allow the CommandLine library to recognize them.  Note that
+<b><tt><a href="#cl::Prefix">cl::Prefix</a></tt></b> options must not have the
+<b><tt><a href="#cl::ValueDisallowed">cl::ValueDisallowed</a></tt></b> modifier
+specified.</li>
 
 <li><a name="cl::Grouping">The <b><tt>cl::Grouping</tt></b></a> modifier is used
 to implement unix style tools (like <tt>ls</tt>) that have lots of single letter
 arguments, but only require a single dash.  For example, the '<tt>ls -labF</tt>'
 command actually enables four different options, all of which are single
-letters.  Note that <a href="#cl::Grouping">cl::Grouping</a> options cannot have
-values.</li>
+letters.  Note that <b><tt><a href="#cl::Grouping">cl::Grouping</a></tt></b>
+options cannot have values.</li>
 
 </ul>
 
-<p>The CommandLine library does not restrict how you use the <a
-href="#cl::Prefix">cl::Prefix</a> or <a href="#cl::Grouping">cl::Grouping</a>
-modifiers, but it is possible to specify ambiguous argument settings.  Thus, it
-is possible to have multiple letter options that are prefix or grouping options,
-and they will still work as designed.</p>
+<p>The CommandLine library does not restrict how you use the <b><tt><a
+href="#cl::Prefix">cl::Prefix</a></tt></b> or <b><tt><a
+href="#cl::Grouping">cl::Grouping</a></tt></b> modifiers, but it is possible to
+specify ambiguous argument settings.  Thus, it is possible to have multiple
+letter options that are prefix or grouping options, and they will still work as
+designed.</p>
 
 <p>To do this, the CommandLine library uses a greedy algorithm to parse the
 input option into (potentially multiple) prefix and grouping options.  The
 strategy basically looks like this:</p>
 
-<p><tt>parse(string OrigInput) {</tt>
+<div class="doc_code"><tt>parse(string OrigInput) {</tt>
 
 <ol>
 <li><tt>string input = OrigInput;</tt>
@@ -1317,10 +1393,10 @@ strategy basically looks like this:</p>
 &nbsp;&nbsp;while (!isOption(input) &amp;&amp; !input.empty()) input.pop_back();<br>
 }</tt>
 <li><tt>if (!OrigInput.empty()) error();</tt></li>
-
 </ol>
 
 <p><tt>}</tt></p>
+</div>
 
 </div>
 
@@ -1433,6 +1509,27 @@ input.</p>
 
 </div>
 
+<!-- _______________________________________________________________________ -->
+<div class="doc_subsubsection">
+  <a name="cl::SetVersionPrinter">The <tt>cl::SetVersionPrinter</tt>
+  function</a>
+</div>
+
+<div class="doc_text">
+
+<p>The <tt>cl::SetVersionPrinter</tt> function is designed to be called
+directly from <tt>main</tt>, and <i>before</i>
+<tt>cl::ParseCommandLineOptions</tt>. Its use is optional. It simply arranges
+for a function to be called in response to the <tt>--version</tt> option instead
+of having the <tt>CommandLine</tt> library print out the usual version string
+for LLVM. This is useful for programs that are not part of LLVM but wish to use
+the <tt>CommandLine</tt> facilities. Such programs should just define a small
+function that takes no arguments and returns <tt>void</tt> and that prints out
+whatever version information is appropriate for the program. Pass the address
+of that function to <tt>cl::SetVersionPrinter</tt> to arrange for it to be
+called when the <tt>--version</tt> option is given by the user.</p>
+
+</div>
 <!-- _______________________________________________________________________ -->
 <div class="doc_subsubsection">
   <a name="cl::opt">The <tt>cl::opt</tt> class</a>
@@ -1445,13 +1542,13 @@ options, and is the one used most of the time.  It is a templated class which
 can take up to three arguments (all except for the first have default values
 though):</p>
 
-<pre>
+<div class="doc_code"><pre>
 <b>namespace</b> cl {
   <b>template</b> &lt;<b>class</b> DataType, <b>bool</b> ExternalStorage = <b>false</b>,
             <b>class</b> ParserClass = parser&lt;DataType&gt; &gt;
   <b>class</b> opt;
 }
-</pre>
+</pre></div>
 
 <p>The first template argument specifies what underlying data type the command
 line argument is, and is used to select a default parser implementation.  The
@@ -1479,13 +1576,13 @@ href="#customparser">custom parser</a>.</p>
 line options.  It too is a templated class which can take up to three
 arguments:</p>
 
-<pre>
+<div class="doc_code"><pre>
 <b>namespace</b> cl {
   <b>template</b> &lt;<b>class</b> DataType, <b>class</b> Storage = <b>bool</b>,
             <b>class</b> ParserClass = parser&lt;DataType&gt; &gt;
   <b>class</b> list;
 }
-</pre>
+</pre></div>
 
 <p>This class works the exact same as the <a
 href="#cl::opt"><tt>cl::opt</tt></a> class, except that the second argument is
@@ -1495,6 +1592,31 @@ be used.</p>
 
 </div>
 
+<!-- _______________________________________________________________________ -->
+<div class="doc_subsubsection">
+  <a name="cl::bits">The <tt>cl::bits</tt> class</a>
+</div>
+
+<div class="doc_text">
+
+<p>The <tt>cl::bits</tt> class is the class used to represent a list of command
+line options in the form of a bit vector.  It is also a templated class which
+can take up to three arguments:</p>
+
+<div class="doc_code"><pre>
+<b>namespace</b> cl {
+  <b>template</b> &lt;<b>class</b> DataType, <b>class</b> Storage = <b>bool</b>,
+            <b>class</b> ParserClass = parser&lt;DataType&gt; &gt;
+  <b>class</b> bits;
+}
+</pre></div>
+
+<p>This class works the exact same as the <a
+href="#cl::opt"><tt>cl::lists</tt></a> class, except that the second argument
+must be of <b>type</b> <tt>unsigned</tt> if external storage is used.</p>
+
+</div>
+
 <!-- _______________________________________________________________________ -->
 <div class="doc_subsubsection">
   <a name="cl::alias">The <tt>cl::alias</tt> class</a>
@@ -1505,11 +1627,11 @@ be used.</p>
 <p>The <tt>cl::alias</tt> class is a nontemplated class that is used to form
 aliases for other arguments.</p>
 
-<pre>
+<div class="doc_code"><pre>
 <b>namespace</b> cl {
   <b>class</b> alias;
 }
-</pre>
+</pre></div>
 
 <p>The <a href="#cl::aliasopt"><tt>cl::aliasopt</tt></a> attribute should be
 used to specify which option this is an alias for.  Alias arguments default to
@@ -1518,6 +1640,34 @@ the conversion from string to data.</p>
 
 </div>
 
+<!-- _______________________________________________________________________ -->
+<div class="doc_subsubsection">
+  <a name="cl::extrahelp">The <tt>cl::extrahelp</tt> class</a>
+</div>
+
+<div class="doc_text">
+
+<p>The <tt>cl::extrahelp</tt> class is a nontemplated class that allows extra
+help text to be printed out for the <tt>--help</tt> option.</p>
+
+<div class="doc_code"><pre>
+<b>namespace</b> cl {
+  <b>struct</b> extrahelp;
+}
+</pre></div>
+
+<p>To use the extrahelp, simply construct one with a <tt>const char*</tt> 
+parameter to the constructor. The text passed to the constructor will be printed
+at the bottom of the help message, verbatim. Note that multiple
+<tt>cl::extrahelp</tt> <b>can</b> be used, but this practice is discouraged. If
+your tool needs to print additional help information, put all that help into a
+single <tt>cl::extrahelp</tt> instance.</p>
+<p>For example:</p>
+<div class="doc_code"><pre>
+  cl::extrahelp("\nADDITIONAL HELP:\n\n  This is the extra help\n");
+</pre></div>
+</div>
+
 <!-- ======================================================================= -->
 <div class="doc_subsection">
   <a name="builtinparsers">Builtin parsers</a>
@@ -1554,6 +1704,12 @@ is used to convert boolean strings to a boolean value.  Currently accepted
 strings are "<tt>true</tt>", "<tt>TRUE</tt>", "<tt>True</tt>", "<tt>1</tt>",
 "<tt>false</tt>", "<tt>FALSE</tt>", "<tt>False</tt>", and "<tt>0</tt>".</li>
 
+<li><a name="boolOrDefaultparser">The <b><tt>parser&lt;boolOrDefault&gt;</tt>
+ specialization</b></a> is used for cases where the value is boolean,
+but we also need to know whether the option was specified at all.  boolOrDefault
+is an enum with 3 values, BOU_UNSET, BOU_TRUE and BOU_FALSE.  This parser accepts
+the same strings as <b><tt>parser&lt;bool&gt;</tt></b>.</li>
+
 <li><a name="stringparser">The <b><tt>parser&lt;string&gt;</tt>
 specialization</b></a> simply stores the parsed string into the string value
 specified.  No conversion or modification of the data is performed.</li>
@@ -1615,7 +1771,7 @@ your custom data type.<p>
 <p>This approach has the advantage that users of your custom data type will
 automatically use your custom parser whenever they define an option with a value
 type of your data type.  The disadvantage of this approach is that it doesn't
-work if your fundemental data type is something that is already supported.</p>
+work if your fundamental data type is something that is already supported.</p>
 
 </li>
 
@@ -1642,13 +1798,13 @@ this the default for all <tt>unsigned</tt> options.</p>
 
 <p>To start out, we declare our new <tt>FileSizeParser</tt> class:</p>
 
-<pre>
+<div class="doc_code"><pre>
 <b>struct</b> FileSizeParser : <b>public</b> cl::basic_parser&lt;<b>unsigned</b>&gt; {
   <i>// parse - Return true on error.</i>
   <b>bool</b> parse(cl::Option &amp;O, <b>const char</b> *ArgName, <b>const</b> std::string &amp;ArgValue,
              <b>unsigned</b> &amp;Val);
 };
-</pre>
+</pre></div>
 
 <p>Our new class inherits from the <tt>cl::basic_parser</tt> template class to
 fill in the default, boiler plate, code for us.  We give it the data type that
@@ -1664,7 +1820,7 @@ is not well formed, the parser should output an error message and return true.
 Otherwise it should return false and set '<tt>Val</tt>' to the parsed value.  In
 our example, we implement <tt>parse</tt> as:</p>
 
-<pre>
+<div class="doc_code"><pre>
 <b>bool</b> FileSizeParser::parse(cl::Option &amp;O, <b>const char</b> *ArgName,
                            <b>const</b> std::string &amp;Arg, <b>unsigned</b> &amp;Val) {
   <b>const char</b> *ArgStart = Arg.c_str();
@@ -1690,7 +1846,7 @@ our example, we implement <tt>parse</tt> as:</p>
     }
   }
 }
-</pre>
+</pre></div>
 
 <p>This function implements a very simple parser for the kinds of strings we are
 interested in.  Although it has some holes (it allows "<tt>123KKK</tt>" for
@@ -1699,25 +1855,25 @@ itself to print out the error message (the <tt>error</tt> method always returns
 true) in order to get a nice error message (shown below).  Now that we have our
 parser class, we can use it like this:</p>
 
-<pre>
+<div class="doc_code"><pre>
 <b>static</b> <a href="#cl::opt">cl::opt</a>&lt;<b>unsigned</b>, <b>false</b>, FileSizeParser&gt;
 MFS(<i>"max-file-size"</i>, <a href="#cl::desc">cl::desc</a>(<i>"Maximum file size to accept"</i>),
     <a href="#cl::value_desc">cl::value_desc</a>("<i>size</i>"));
-</pre>
+</pre></div>
 
 <p>Which adds this to the output of our program:</p>
 
-<pre>
+<div class="doc_code"><pre>
 OPTIONS:
   -help                 - display available options (--help-hidden for more)
   ...
   <b>-max-file-size=&lt;size&gt; - Maximum file size to accept</b>
-</pre>
+</pre></div>
 
 <p>And we can test that our parse works correctly now (the test program just
 prints out the max-file-size argument value):</p>
 
-<pre>
+<div class="doc_code"><pre>
 $ ./test
 MFS: 0
 $ ./test -max-file-size=123MB
@@ -1726,7 +1882,7 @@ $ ./test -max-file-size=3G
 MFS: 3221225472
 $ ./test -max-file-size=dog
 -max-file-size option: 'dog' value invalid for file size argument!
-</pre>
+</pre></div>
 
 <p>It looks like it works.  The error message that we get is nice and helpful,
 and we seem to accept reasonable file sizes.  This wraps up the "custom parser"
@@ -1774,7 +1930,7 @@ tutorial.</p>
   src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>
 
   <a href="mailto:sabre@nondot.org">Chris Lattner</a><br>
-  <a href="http://llvm.cs.uiuc.edu">LLVM Compiler Infrastructure</a><br>
+  <a href="http://llvm.org">LLVM Compiler Infrastructure</a><br>
   Last modified: $Date$
 </address>