==============================
CommandLine 2.0 Library Manual
==============================

.. contents::
   :local:

Introduction
============

This document describes the CommandLine argument processing library.  It will
show you how to use it, and what it can do.  The CommandLine library uses a
declarative approach to specifying the command line options that your program
takes.  By default, these options declarations implicitly hold the value parsed
for the option declared (of course this `can be changed`_).

Although there are a **lot** of command line argument parsing libraries out
there in many different languages, none of them fit well with what I needed.  By
looking at the features and problems of other libraries, I designed the
CommandLine library to have the following features:

#. Speed: The CommandLine library is very quick and uses little resources.  The
   parsing time of the library is directly proportional to the number of
   arguments parsed, not the number of options recognized.  Additionally,
   command line argument values are captured transparently into user defined
   global variables, which can be accessed like any other variable (and with the
   same performance).

#. Type Safe: As a user of CommandLine, you don't have to worry about
   remembering the type of arguments that you want (is it an int?  a string? a
   bool? an enum?) and keep casting it around.  Not only does this help prevent
   error prone constructs, it also leads to dramatically cleaner source code.

#. No subclasses required: To use CommandLine, you instantiate variables that
   correspond to the arguments that you would like to capture, you don't
   subclass a parser.  This means that you don't have to write **any**
   boilerplate code.

#. Globally accessible: Libraries can specify command line arguments that are
   automatically enabled in any tool that links to the library.  This is
   possible because the application doesn't have to keep a list of arguments to
   pass to the parser.  This also makes supporting `dynamically loaded options`_
   trivial.

#. Cleaner: CommandLine supports enum and other types directly, meaning that
   there is less error and more security built into the library.  You don't have
   to worry about whether your integral command line argument accidentally got
   assigned a value that is not valid for your enum type.

#. Powerful: The CommandLine library supports many different types of arguments,
   from simple `boolean flags`_ to `scalars arguments`_ (`strings`_,
   `integers`_, `enums`_, `doubles`_), to `lists of arguments`_.  This is
   possible because CommandLine is...

#. Extensible: It is very simple to add a new argument type to CommandLine.
   Simply specify the parser that you want to use with the command line option
   when you declare it. `Custom parsers`_ are no problem.

#. Labor Saving: The CommandLine library cuts down on the amount of grunt work
   that you, the user, have to do.  For example, it automatically provides a
   ``-help`` option that shows the available command line options for your tool.
   Additionally, it does most of the basic correctness checking for you.

#. Capable: The CommandLine library can handle lots of different forms of
   options often found in real programs.  For example, `positional`_ arguments,
   ``ls`` style `grouping`_ options (to allow processing '``ls -lad``'
   naturally), ``ld`` style `prefix`_ options (to parse '``-lmalloc
   -L/usr/lib``'), and interpreter style options.

This document will hopefully let you jump in and start using CommandLine in your
utility quickly and painlessly.  Additionally it should be a simple reference
manual to figure out how stuff works.

Quick Start Guide
=================

This section of the manual runs through a simple CommandLine'ification of a
basic compiler tool.  This is intended to show you how to jump into using the
CommandLine library in your own program, and show you some of the cool things it
can do.

To start out, you need to include the CommandLine header file into your program:

.. code-block:: c++

  #include "llvm/Support/CommandLine.h"

Additionally, you need to add this as the first line of your main program:

.. code-block:: c++

  int main(int argc, char **argv) {
    cl::ParseCommandLineOptions(argc, argv);
    ...
  }

... which actually parses the arguments and fills in the variable declarations.

Now that you are ready to support command line arguments, we need to tell the
system which ones we want, and what type of arguments they are.  The CommandLine
library uses a declarative syntax to model command line arguments with the
global variable declarations that capture the parsed values.  This means that
for every command line option that you would like to support, there should be a
global variable declaration to capture the result.  For example, in a compiler,
we would like to support the Unix-standard '``-o <filename>``' option to specify
where to put the output.  With the CommandLine library, this is represented like
this:

.. _scalars arguments:
.. _here:

.. code-block:: c++

  cl::opt<string> OutputFilename("o", cl::desc("Specify output filename"), cl::value_desc("filename"));

This declares a global variable "``OutputFilename``" that is used to capture the
result of the "``o``" argument (first parameter).  We specify that this is a
simple scalar option by using the "``cl::opt``" template (as opposed to the
"``cl::list``" template), and tell the CommandLine library that the data
type that we are parsing is a string.

The second and third parameters (which are optional) are used to specify what to
output for the "``-help``" option.  In this case, we get a line that looks like
this:

::

  USAGE: compiler [options]

  OPTIONS:
    -h                - Alias for -help
    -help             - display available options (-help-hidden for more)
    -o <filename>     - Specify output filename

Because we specified that the command line option should parse using the
``string`` 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:

.. code-block:: c++

  ...
  std::ofstream Output(OutputFilename.c_str());
  if (Output.good()) ...
  ...

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 to
these options.  The options can be specified in any order, and are specified
with helper functions like `cl::desc(...)`_, so there are no positional
dependencies to remember.  The available options are discussed in detail in the
`Reference Guide`_.

Continuing the example, we would like to have our compiler take an input
filename as well as an output filename, but we do not want the input filename to
be specified with a hyphen (ie, not ``-filename.c``).  To support this style of
argument, the CommandLine library allows for `positional`_ 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:

.. code-block:: c++


  cl::opt<string> InputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"));

This declaration indicates that the first positional argument should be treated
as the input filename.  Here we use the `cl::init`_ option to specify an initial
value for the command line option, which is used if the option is not specified
(if you do not specify a `cl::init`_ modifier for an option, then the default
constructor for the data type is used to initialize the value).  Command line
options default to being optional, so if we would like to require that the user
always specify an input filename, we would add the `cl::Required`_ flag, and we
could eliminate the `cl::init`_ modifier, like this:

.. code-block:: c++

  cl::opt<string> InputFilename(cl::Positional, cl::desc("<input file>"), cl::Required);

Again, the CommandLine library does not require the options to be specified in
any particular order, so the above declaration is equivalent to:

.. code-block:: c++

  cl::opt<string> InputFilename(cl::Positional, cl::Required, cl::desc("<input file>"));

By simply adding the `cl::Required`_ flag, the CommandLine library will
automatically issue an error if the argument is not specified, which shifts all
of the command line option verification code out of your application into the
library.  This is just one example of how using flags can alter the default
behaviour of the library, on a per-option basis.  By adding one of the
declarations above, the ``-help`` option synopsis is now extended to:

::

  USAGE: compiler [options] <input file>

  OPTIONS:
    -h                - Alias for -help
    -help             - display available options (-help-hidden for more)
    -o <filename>     - Specify output filename

... indicating that an input filename is expected.

Boolean Arguments
-----------------

In addition to input and output filenames, we would like the compiler example to
support three boolean flags: "``-f``" to force writing binary output to a
terminal, "``--quiet``" to enable quiet mode, and "``-q``" for backwards
compatibility with some of our users.  We can support these by declaring options
of boolean type like this:

.. code-block:: c++

  cl::opt<bool> Force ("f", cl::desc("Enable binary output on terminals"));
  cl::opt<bool> Quiet ("quiet", cl::desc("Don't print informational messages"));
  cl::opt<bool> Quiet2("q", cl::desc("Don't print informational messages"), cl::Hidden);

This does what you would expect: it declares three boolean variables
("``Force``", "``Quiet``", and "``Quiet2``") to recognize these options.  Note
that the "``-q``" option is specified with the "`cl::Hidden`_" flag.  This
modifier prevents it from being shown by the standard "``-help``" output (note
that it is still shown in the "``-help-hidden``" output).

The CommandLine library uses a `different parser`_ for different data types.
For example, in the string case, the argument passed to the option is copied
literally into the content of the string variable... we obviously cannot do that
in the boolean case, however, so we must use a smarter parser.  In the case of
the boolean parser, it allows no options (in which case it assigns the value of
true to the variable), or it allows the values "``true``" or "``false``" to be
specified, allowing any of the following inputs:

::

  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

... you get the idea.  The `bool parser`_ just turns the string values into
boolean values, and rejects things like '``compiler -f=foo``'.  Similarly, the
`float`_, `double`_, and `int`_ parsers work like you would expect, using the
'``strtol``' and '``strtod``' C library calls to parse the string value into the
specified data type.

With the declarations above, "``compiler -help``" emits this:

::

  USAGE: compiler [options] <input file>

  OPTIONS:
    -f     - Enable binary output on terminals
    -o     - Override output filename
    -quiet - Don't print informational messages
    -help  - display available options (-help-hidden for more)

and "``compiler -help-hidden``" prints this:

::

  USAGE: compiler [options] <input file>

  OPTIONS:
    -f     - Enable binary output on terminals
    -o     - Override output filename
    -q     - Don't print informational messages
    -quiet - Don't print informational messages
    -help  - display available options (-help-hidden for more)

This brief example has shown you how to use the '`cl::opt`_' class to parse
simple scalar command line arguments.  In addition to simple scalar arguments,
the CommandLine library also provides primitives to support CommandLine option
`aliases`_, and `lists`_ of options.

.. _aliases:

Argument Aliases
----------------

So far, the example works well, except for the fact that we need to check the
quiet condition like this now:

.. code-block:: c++

  ...
    if (!Quiet && !Quiet2) printInformationalMessage(...);
  ...

... which is a real pain!  Instead of defining two values for the same
condition, we can use the "`cl::alias`_" class to make the "``-q``" option an
**alias** for the "``-quiet``" option, instead of providing a value itself:

.. code-block:: c++

  cl::opt<bool> Force ("f", cl::desc("Overwrite output files"));
  cl::opt<bool> Quiet ("quiet", cl::desc("Don't print informational messages"));
  cl::alias     QuietA("q", cl::desc("Alias for -quiet"), cl::aliasopt(Quiet));

The third line (which is the only one we modified from above) defines a "``-q``"
alias that updates the "``Quiet``" variable (as specified by the `cl::aliasopt`_
modifier) whenever it is specified.  Because aliases do not hold state, the only
thing the program has to query is the ``Quiet`` variable now.  Another nice
feature of aliases is that they automatically hide themselves from the ``-help``
output (although, again, they are still visible in the ``-help-hidden output``).

Now the application code can simply use:

.. code-block:: c++

  ...
    if (!Quiet) printInformationalMessage(...);
  ...

... which is much nicer!  The "`cl::alias`_" can be used to specify an
alternative name for any variable type, and has many uses.

.. _unnamed alternatives using the generic parser:

Selecting an alternative from a set of possibilities
----------------------------------------------------

So far we have seen how the CommandLine library handles builtin types like
``std::string``, ``bool`` and ``int``, but how does it handle things it doesn't
know about, like enums or '``int*``'s?

The answer is that it uses a table-driven generic parser (unless you specify
your own parser, as described in the `Extension Guide`_).  This parser maps
literal strings to whatever type is required, and requires you to tell it what
this mapping should be.

Let's say that we would like to add four optimization levels to our optimizer,
using the standard flags "``-g``", "``-O0``", "``-O1``", and "``-O2``".  We
could easily implement this with boolean options like above, but there are
several problems with this strategy:

#. A user could specify more than one of the options at a time, for example,
   "``compiler -O3 -O2``".  The CommandLine library would not be able to catch
   this erroneous input for us.

#. We would have to test 4 different variables to see which ones are set.

#. This doesn't map to the numeric levels that we want... so we cannot easily
   see if some level >= "``-O1``" is enabled.

To cope with these problems, we can use an enum value, and have the CommandLine
library fill it in with the appropriate level directly, which is used like this:

.. code-block:: c++

  enum OptLevel {
    g, O1, O2, O3
  };

  cl::opt<OptLevel> OptimizationLevel(cl::desc("Choose optimization level:"),
    cl::values(
      clEnumVal(g , "No optimizations, enable debugging"),
      clEnumVal(O1, "Enable trivial optimizations"),
      clEnumVal(O2, "Enable default optimizations"),
      clEnumVal(O3, "Enable expensive optimizations")));

  ...
    if (OptimizationLevel >= O2) doPartialRedundancyElimination(...);
  ...

This declaration defines a variable "``OptimizationLevel``" of the
"``OptLevel``" enum type.  This variable can be assigned any of the values that
are listed in the declaration.  The CommandLine library enforces that
the user can only specify one of the options, and it ensure that only valid enum
values can be specified.  The "``clEnumVal``" macros ensure that the command
line arguments matched the enum values.  With this option added, our help output
now is:

::

  USAGE: compiler [options] <input file>

  OPTIONS:
    Choose optimization level:
      -g          - No optimizations, enable debugging
      -O1         - Enable trivial optimizations
      -O2         - Enable default optimizations
      -O3         - Enable expensive optimizations
    -f            - Enable binary output on terminals
    -help         - display available options (-help-hidden for more)
    -o <filename> - Specify output filename
    -quiet        - Don't print informational messages

In this case, it is sort of awkward that flag names correspond directly to enum
names, because we probably don't want an enum definition named "``g``" in our
program.  Because of this, we can alternatively write this example like this:

.. code-block:: c++

  enum OptLevel {
    Debug, O1, O2, O3
  };

  cl::opt<OptLevel> OptimizationLevel(cl::desc("Choose optimization level:"),
    cl::values(
     clEnumValN(Debug, "g", "No optimizations, enable debugging"),
      clEnumVal(O1        , "Enable trivial optimizations"),
      clEnumVal(O2        , "Enable default optimizations"),
      clEnumVal(O3        , "Enable expensive optimizations")));

  ...
    if (OptimizationLevel == Debug) outputDebugInfo(...);
  ...

By using the "``clEnumValN``" macro instead of "``clEnumVal``", we can directly
specify the name that the flag should get.  In general a direct mapping is nice,
but sometimes you can't or don't want to preserve the mapping, which is when you
would use it.

Named Alternatives
------------------

Another useful argument form is a named alternative style.  We shall use this
style in our compiler to specify different debug levels that can be used.
Instead of each debug level being its own switch, we want to support the
following options, of which only one can be specified at a time:
"``--debug-level=none``", "``--debug-level=quick``",
"``--debug-level=detailed``".  To do this, we use the exact same format as our
optimization level flags, but we also specify an option name.  For this case,
the code looks like this:

.. code-block:: c++

  enum DebugLev {
    nodebuginfo, quick, detailed
  };

  // Enable Debug Options to be specified on the command line
  cl::opt<DebugLev> DebugLevel("debug_level", cl::desc("Set the debugging level:"),
    cl::values(
      clEnumValN(nodebuginfo, "none", "disable debug information"),
       clEnumVal(quick,               "enable quick debug information"),
       clEnumVal(detailed,            "enable detailed debug information")));

This definition defines an enumerated command line variable of type "``enum
DebugLev``", 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 "``-help``" option:

::

  USAGE: compiler [options] <input file>

  OPTIONS:
    Choose optimization level:
      -g          - No optimizations, enable debugging
      -O1         - Enable trivial optimizations
      -O2         - Enable default optimizations
      -O3         - Enable expensive optimizations
    -debug_level  - Set the debugging level:
      =none       - disable debug information
      =quick      - enable quick debug information
      =detailed   - enable detailed debug information
    -f            - Enable binary output on terminals
    -help         - display available options (-help-hidden for more)
    -o <filename> - Specify output filename
    -quiet        - Don't print informational messages

Again, the only structural difference between the debug level declaration and
the optimization level declaration is that the debug level declaration includes
an option name (``"debug_level"``), 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.

.. _lists:

Parsing a list of options
-------------------------

Now that we have the standard run-of-the-mill argument types out of the way,
lets get a little wild and crazy.  Lets say that we want our optimizer to accept
a **list** of optimizations to perform, allowing duplicates.  For example, we
might want to run: "``compiler -dce -instsimplify -inline -dce -strip``".  In this
case, the order of the arguments and the number of appearances is very
important.  This is what the "``cl::list``" template is for.  First, start by
defining an enum of the optimizations that you would like to perform:

.. code-block:: c++

  enum Opts {
    // 'inline' is a C++ keyword, so name it 'inlining'
    dce, instsimplify, inlining, strip
  };

Then define your "``cl::list``" variable:

.. code-block:: c++

  cl::list<Opts> OptimizationList(cl::desc("Available Optimizations:"),
    cl::values(
      clEnumVal(dce               , "Dead Code Elimination"),
      clEnumVal(instsimplify      , "Instruction Simplification"),
     clEnumValN(inlining, "inline", "Procedure Integration"),
      clEnumVal(strip             , "Strip Symbols")));

This defines a variable that is conceptually of the type
"``std::vector<enum Opts>``".  Thus, you can access it with standard vector
methods:

.. code-block:: c++

  for (unsigned i = 0; i != OptimizationList.size(); ++i)
    switch (OptimizationList[i])
       ...

... to iterate through the list of options specified.

Note that the "``cl::list``" template is completely general and may be used with
any data types or other arguments that you can use with the "``cl::opt``"
template.  One especially useful way to use a list is to capture all of the
positional arguments together if there may be more than one specified.  In the
case of a linker, for example, the linker takes several '``.o``' files, and
needs to capture them into a list.  This is naturally specified as:

.. code-block:: c++

  ...
  cl::list<std::string> InputFilenames(cl::Positional, cl::desc("<Input files>"), cl::OneOrMore);
  ...

This variable works just like a "``vector<string>``" object.  As such, accessing
the list is simple, just like above.  In this example, we used the
`cl::OneOrMore`_ modifier to inform the CommandLine library that it is an error
if the user does not specify any ``.o`` files on our command line.  Again, this
just reduces the amount of checking we have to do.

Collecting options as a set of flags
------------------------------------

Instead of collecting sets of options in a list, it is also possible to gather
information for enum values in a **bit vector**.  The representation used by the
`cl::bits`_ class is an ``unsigned`` 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:

.. code-block:: c++

  bits |= 1 << (unsigned)enum;

Options that are specified multiple times are redundant.  Any instances after
the first are discarded.

Reworking the above list example, we could replace `cl::list`_ with `cl::bits`_:

.. code-block:: c++

  cl::bits<Opts> OptimizationBits(cl::desc("Available Optimizations:"),
    cl::values(
      clEnumVal(dce               , "Dead Code Elimination"),
      clEnumVal(instsimplify      , "Instruction Simplification"),
     clEnumValN(inlining, "inline", "Procedure Integration"),
      clEnumVal(strip             , "Strip Symbols")));

To test to see if ``instsimplify`` was specified, we can use the ``cl:bits::isSet``
function:

.. code-block:: c++

  if (OptimizationBits.isSet(instsimplify)) {
    ...
  }

It's also possible to get the raw bit vector using the ``cl::bits::getBits``
function:

.. code-block:: c++

  unsigned bits = OptimizationBits.getBits();

Finally, if external storage is used, then the location specified must be of
**type** ``unsigned``. In all other ways a `cl::bits`_ option is equivalent to a
`cl::list`_ option.

.. _additional extra text:

Adding freeform text to help output
-----------------------------------

As our program grows and becomes more mature, we may decide to put summary
information about what it does into the help output.  The help output is styled
to look similar to a Unix ``man`` page, providing concise information about a
program.  Unix ``man`` pages, however often have a description about what the
program does.  To add this to your CommandLine program, simply pass a third
argument to the `cl::ParseCommandLineOptions`_ 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:

.. code-block:: c++

  int main(int argc, char **argv) {
    cl::ParseCommandLineOptions(argc, argv, " CommandLine compiler example\n\n"
                                "  This program blah blah blah...\n");
    ...
  }

would yield the help output:

::

  **OVERVIEW: CommandLine compiler example

    This program blah blah blah...**

  USAGE: compiler [options] <input file>

  OPTIONS:
    ...
    -help             - display available options (-help-hidden for more)
    -o <filename>     - Specify output filename

.. _grouping options into categories:

Grouping options into categories
--------------------------------

If our program has a large number of options it may become difficult for users
of our tool to navigate the output of ``-help``. To alleviate this problem we
can put our options into categories. This can be done by declaring option
categories (`cl::OptionCategory`_ objects) and then placing our options into
these categories using the `cl::cat`_ option attribute. For example:

.. code-block:: c++

  cl::OptionCategory StageSelectionCat("Stage Selection Options",
                                       "These control which stages are run.");

  cl::opt<bool> Preprocessor("E",cl::desc("Run preprocessor stage."),
                             cl::cat(StageSelectionCat));

  cl::opt<bool> NoLink("c",cl::desc("Run all stages except linking."),
                       cl::cat(StageSelectionCat));

The output of ``-help`` will become categorized if an option category is
declared. The output looks something like ::

  OVERVIEW: This is a small program to demo the LLVM CommandLine API
  USAGE: Sample [options]

  OPTIONS:

    General options:

      -help              - Display available options (-help-hidden for more)
      -help-list         - Display list of available options (-help-list-hidden for more)


    Stage Selection Options:
    These control which stages are run.

      -E                 - Run preprocessor stage.
      -c                 - Run all stages except linking.

In addition to the behaviour of ``-help`` changing when an option category is
declared, the command line option ``-help-list`` becomes visible which will
print the command line options as uncategorized list.

Note that Options that are not explicitly categorized will be placed in the
``cl::GeneralCategory`` category.

.. _Reference Guide:

Reference Guide
===============

Now that you know the basics of how to use the CommandLine library, this section
will give you the detailed information you need to tune how command line options
work, as well as information on more "advanced" command line option processing
capabilities.

.. _positional:
.. _positional argument:
.. _Positional Arguments:
.. _Positional arguments section:
.. _positional options:

Positional Arguments
--------------------

Positional arguments are those arguments that are not named, and are not
specified with a hyphen.  Positional arguments should be used when an option is
specified by its position alone.  For example, the standard Unix ``grep`` 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:

.. code-block:: c++

  cl::opt<string> Regex   (cl::Positional, cl::desc("<regular expression>"), cl::Required);
  cl::opt<string> Filename(cl::Positional, cl::desc("<input file>"), cl::init("-"));

Given these two option declarations, the ``-help`` output for our grep
replacement would look like this:

::

  USAGE: spiffygrep [options] <regular expression> <input file>

  OPTIONS:
    -help - display available options (-help-hidden for more)

... and the resultant program could be used just like the standard ``grep``
tool.

Positional arguments are sorted by their order of construction.  This means that
command line options will be ordered according to how they are listed in a .cpp
file, but will not have an ordering defined if the positional arguments are
defined in multiple .cpp files.  The fix for this problem is simply to define
all of your positional arguments in one .cpp file.

Specifying positional options with hyphens
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Sometimes you may want to specify a value to your positional argument that
starts with a hyphen (for example, searching for '``-foo``' in a file).  At
first, you will have trouble doing this, because it will try to find an argument
named '``-foo``', and will fail (and single quotes will not save you).  Note
that the system ``grep`` has the same problem:

::

  $ spiffygrep '-foo' test.txt
  Unknown command line argument '-foo'.  Try: spiffygrep -help'

  $ grep '-foo' test.txt
  grep: illegal option -- f
  grep: illegal option -- o
  grep: illegal option -- o
  Usage: grep -hblcnsviw pattern file . . .

The solution for this problem is the same for both your tool and the system
version: use the '``--``' marker.  When the user specifies '``--``' on the
command line, it is telling the program that all options after the '``--``'
should be treated as positional arguments, not options.  Thus, we can use it
like this:

::

  $ spiffygrep -- -foo test.txt
    ...output...

Determining absolute position with getPosition()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Sometimes an option can affect or modify the meaning of another option. For
example, consider ``gcc``'s ``-x LANG`` option. This tells ``gcc`` to ignore the
suffix of subsequent positional arguments and force the file to be interpreted
as if it contained source code in language ``LANG``. In order to handle this
properly, you need to know the absolute position of each argument, especially
those in lists, so their interaction(s) can be applied correctly. This is also
useful for options like ``-llibname`` which is actually a positional argument
that starts with a dash.

So, generally, the problem is that you have two ``cl::list`` variables that
interact in some way. To ensure the correct interaction, you can use the
``cl::list::getPosition(optnum)`` method. This method returns the absolute
position (as found on the command line) of the ``optnum`` item in the
``cl::list``.

The idiom for usage is like this:

.. code-block:: c++

  static cl::list<std::string> Files(cl::Positional, cl::OneOrMore);
  static cl::list<std::string> Libraries("l", cl::ZeroOrMore);

  int main(int argc, char**argv) {
    // ...
    std::vector<std::string>::iterator fileIt = Files.begin();
    std::vector<std::string>::iterator libIt  = Libraries.begin();
    unsigned libPos = 0, filePos = 0;
    while ( 1 ) {
      if ( libIt != Libraries.end() )
        libPos = Libraries.getPosition( libIt - Libraries.begin() );
      else
        libPos = 0;
      if ( fileIt != Files.end() )
        filePos = Files.getPosition( fileIt - Files.begin() );
      else
        filePos = 0;

      if ( filePos != 0 && (libPos == 0 || filePos < libPos) ) {
        // Source File Is next
        ++fileIt;
      }
      else if ( libPos != 0 && (filePos == 0 || libPos < filePos) ) {
        // Library is next
        ++libIt;
      }
      else
        break; // we're done with the list
    }
  }

Note that, for compatibility reasons, the ``cl::opt`` also supports an
``unsigned getPosition()`` option that will provide the absolute position of
that option. You can apply the same approach as above with a ``cl::opt`` and a
``cl::list`` option as you can with two lists.

.. _interpreter style options:
.. _cl::ConsumeAfter:
.. _this section for more information:

The ``cl::ConsumeAfter`` modifier
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The ``cl::ConsumeAfter`` `formatting option`_ is used to construct programs that
use "interpreter style" option processing.  With this style of option
processing, all arguments specified after the last positional argument are
treated as special interpreter arguments that are not interpreted by the command
line argument.

As a concrete example, lets say we are developing a replacement for the standard
Unix Bourne shell (``/bin/sh``).  To run ``/bin/sh``, first you specify options
to the shell itself (like ``-x`` which turns on trace output), then you specify
the name of the script to run, then you specify 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:

.. code-block:: c++

  cl::opt<string> Script(cl::Positional, cl::desc("<input script>"), cl::init("-"));
  cl::list<string>  Argv(cl::ConsumeAfter, cl::desc("<program arguments>..."));
  cl::opt<bool>    Trace("x", cl::desc("Enable trace output"));

which automatically provides the help output:

::

  USAGE: spiffysh [options] <input script> <program arguments>...

  OPTIONS:
    -help - display available options (-help-hidden for more)
    -x    - Enable trace output

At runtime, if we run our new shell replacement as ```spiffysh -x test.sh -a -x
-y bar``', the ``Trace`` variable will be set to true, the ``Script`` variable
will be set to "``test.sh``", and the ``Argv`` list will contain ``["-a", "-x",
"-y", "bar"]``, because they were specified after the last positional argument
(which is the script name).

There are several limitations to when ``cl::ConsumeAfter`` options can be
specified.  For example, only one ``cl::ConsumeAfter`` can be specified per
program, there must be at least one `positional argument`_ specified, there must
not be any `cl::list`_ positional arguments, and the ``cl::ConsumeAfter`` option
should be a `cl::list`_ option.

.. _can be changed:
.. _Internal vs External Storage:

Internal vs External Storage
----------------------------

By default, all command line options automatically hold the value that they
parse from the command line.  This is very convenient in the common case,
especially when combined with the ability to define command line options in the
files that use them.  This is called the internal storage model.

Sometimes, however, it is nice to separate the command line option processing
code from the storage of the value parsed.  For example, lets say that we have a
'``-debug``' option that we would like to use to enable debug information across
the entire body of our program.  In this case, the boolean value controlling the
debug code should be globally accessible (in a header file, for example) yet the
command line option processing code should not be exposed to all of these
clients (requiring lots of .cpp files to ``#include CommandLine.h``).

To do this, set up your .h file with your option, like this for example:

.. code-block:: c++

  // DebugFlag.h - Get access to the '-debug' command line option
  //

  // DebugFlag - This boolean is set to true if the '-debug' command line option
  // is specified.  This should probably not be referenced directly, instead, use
  // the DEBUG macro below.
  //
  extern bool DebugFlag;

  // DEBUG macro - This macro should be used by code to emit debug information.
  // In the '-debug' option is specified on the command line, and if this is a
  // debug build, then the code specified as the option to the macro will be
  // executed.  Otherwise it will not be.
  #ifdef NDEBUG
  #define LLVM_DEBUG(X)
  #else
  #define LLVM_DEBUG(X) do { if (DebugFlag) { X; } } while (0)
  #endif

This allows clients to blissfully use the ``LLVM_DEBUG()`` macro, or the
``DebugFlag`` explicitly if they want to.  Now we just need to be able to set
the ``DebugFlag`` boolean when the option is set.  To do this, we pass an
additional argument to our command line argument processor, and we specify where
to fill in with the `cl::location`_ attribute:

.. code-block:: c++

  bool DebugFlag;                  // the actual value
  static cl::opt<bool, true>       // The parser
  Debug("debug", cl::desc("Enable debug output"), cl::Hidden, cl::location(DebugFlag));

In the above example, we specify "``true``" as the second argument to the
`cl::opt`_ template, indicating that the template should not maintain a copy of
the value itself.  In addition to this, we specify the `cl::location`_
attribute, so that ``DebugFlag`` is automatically set.

Option Attributes
-----------------

This section describes the basic attributes that you can specify on options.

* The option name attribute (which is required for all options, except
  `positional options`_) specifies what the option name is.  This option is
  specified in simple double quotes:

  .. code-block:: c++

    cl::opt<bool> Quiet("quiet");

.. _cl::desc(...):

* The **cl::desc** attribute specifies a description for the option to be
  shown in the ``-help`` output for the program. This attribute supports
  multi-line descriptions with lines separated by '\n'.

.. _cl::value_desc:

* The **cl::value_desc** attribute specifies a string that can be used to
  fine tune the ``-help`` output for a command line option.  Look `here`_ for an
  example.

.. _cl::init:

* The **cl::init** attribute specifies an initial value for a `scalar`_
  option.  If this attribute is not specified then the command line option value
  defaults to the value created by the default constructor for the
  type.

  .. warning::

    If you specify both **cl::init** and **cl::location** for an option, you
    must specify **cl::location** first, so that when the command-line parser
    sees **cl::init**, it knows where to put the initial value. (You will get an
    error at runtime if you don't put them in the right order.)

.. _cl::location:

* The **cl::location** attribute where to store the value for a parsed command
  line option if using external storage.  See the section on `Internal vs
  External Storage`_ for more information.

.. _cl::aliasopt:

* The **cl::aliasopt** attribute specifies which option a `cl::alias`_ option is
  an alias for.

.. _cl::values:

* The **cl::values** attribute specifies the string-to-value mapping to be used
  by the generic parser.  It takes a list of (option, value, description)
  triplets that specify the option name, the value mapped to, and the
  description shown in the ``-help`` for the tool.  Because the generic parser
  is used most frequently with enum values, two macros are often useful:

  #. The **clEnumVal** macro is used as a nice simple way to specify a triplet
     for an enum.  This macro automatically makes the option name be the same as
     the enum name.  The first option to the macro is the enum, the second is
     the description for the command line option.

  #. The **clEnumValN** macro is used to specify macro options where the option
     name doesn't equal the enum name.  For this macro, the first argument is
     the enum value, the second is the flag name, and the second is the
     description.

  You will get a compile time error if you try to use cl::values with a parser
  that does not support it.

.. _cl::multi_val:

* The **cl::multi_val** attribute specifies that this option takes has multiple
  values (example: ``-sectalign segname sectname sectvalue``). This attribute
  takes one unsigned argument - the number of values for the option. This
  attribute is valid only on ``cl::list`` options (and will fail with compile
  error if you try to use it with other option types). It is allowed to use all
  of the usual modifiers on multi-valued options (besides
  ``cl::ValueDisallowed``, obviously).

.. _cl::cat:

* The **cl::cat** attribute specifies the option category that the option
  belongs to. The category should be a `cl::OptionCategory`_ object.

.. _cl::callback:

* The **cl::callback** attribute specifies a callback function that is
  called when an option is seen, and can be used to set other options,
  as in option B implies option A.  If the option is a `cl::list`_,
  and `cl::CommaSeparated`_ is also specified, the callback will fire
  once for each value.  This could be used to validate combinations or
  selectively set other options.

  .. code-block:: c++

    cl::opt<bool> OptA("a", cl::desc("option a"));
    cl::opt<bool> OptB(
        "b", cl::desc("option b -- This option turns on option a"),
        cl::callback([&](const bool &) { OptA = true; }));
    cl::list<std::string, cl::list<std::string>> List(
      "list",
      cl::desc("option list -- This option turns on options a when "
               "'foo' is included in list"),
      cl::CommaSeparated,
      cl::callback([&](const std::string &Str) {
        if (Str == "foo")
          OptA = true;
      }));

Option Modifiers
----------------

Option modifiers are the flags and expressions that you pass into the
constructors for `cl::opt`_ and `cl::list`_.  These modifiers give you the
ability to tweak how options are parsed and how ``-help`` output is generated to
fit your application well.

These options fall into five main categories:

#. Hiding an option from ``-help`` output

#. Controlling the number of occurrences required and allowed

#. Controlling whether or not a value must be specified

#. Controlling other formatting options

#. Miscellaneous option modifiers

It is not possible to specify two options from the same category (you'll get a
runtime error) to a single option, except for options in the miscellaneous
category.  The CommandLine library specifies defaults for all of these settings
that are the most useful in practice and the most common, which mean that you
usually shouldn't have to worry about these.

Hiding an option from ``-help`` output
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The ``cl::NotHidden``, ``cl::Hidden``, and ``cl::ReallyHidden`` modifiers are
used to control whether or not an option appears in the ``-help`` and
``-help-hidden`` output for the compiled program:

.. _cl::NotHidden:

* The **cl::NotHidden** modifier (which is the default for `cl::opt`_ and
  `cl::list`_ options) indicates the option is to appear in both help
  listings.

.. _cl::Hidden:

* The **cl::Hidden** modifier (which is the default for `cl::alias`_ options)
  indicates that the option should not appear in the ``-help`` output, but
  should appear in the ``-help-hidden`` output.

.. _cl::ReallyHidden:

* The **cl::ReallyHidden** modifier indicates that the option should not appear
  in any help output.

Controlling the number of occurrences required and allowed
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This group of options is used to control how many time an option is allowed (or
required) to be specified on the command line of your program.  Specifying a
value for this setting allows the CommandLine library to do error checking for
you.

The allowed values for this option group are:

.. _cl::Optional:

* The **cl::Optional** modifier (which is the default for the `cl::opt`_ and
  `cl::alias`_ classes) indicates that your program will allow either zero or
  one occurrence of the option to be specified.

.. _cl::ZeroOrMore:

* The **cl::ZeroOrMore** modifier (which is the default for the `cl::list`_
  class) indicates that your program will allow the option to be specified zero
  or more times.

.. _cl::Required:

* The **cl::Required** modifier indicates that the specified option must be
  specified exactly one time.

.. _cl::OneOrMore:

* The **cl::OneOrMore** modifier indicates that the option must be specified at
  least one time.

* The **cl::ConsumeAfter** modifier is described in the `Positional arguments
  section`_.

If an option is not specified, then the value of the option is equal to the
value specified by the `cl::init`_ attribute.  If the ``cl::init`` attribute is
not specified, the option value is initialized with the default constructor for
the data type.

If an option is specified multiple times for an option of the `cl::opt`_ class,
only the last value will be retained.

Controlling whether or not a value must be specified
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This group of options is used to control whether or not the option allows a
value to be present.  In the case of the CommandLine library, a value is either
specified with an equal sign (e.g. '``-index-depth=17``') or as a trailing
string (e.g. '``-o a.out``').

The allowed values for this option group are:

.. _cl::ValueOptional:

* The **cl::ValueOptional** modifier (which is the default for ``bool`` typed
  options) specifies that it is acceptable to have a value, or not.  A boolean
  argument can be enabled just by appearing on the command line, or it can have
  an explicit '``-foo=true``'.  If an option is specified with this mode, it is
  illegal for the value to be provided without the equal sign.  Therefore
  '``-foo true``' is illegal.  To get this behavior, you must use
  the `cl::ValueRequired`_ modifier.

.. _cl::ValueRequired:

* The **cl::ValueRequired** modifier (which is the default for all other types
  except for `unnamed alternatives using the generic parser`_) specifies that a
  value must be provided.  This mode informs the command line library that if an
  option is not provides with an equal sign, that the next argument provided
  must be the value.  This allows things like '``-o a.out``' to work.

.. _cl::ValueDisallowed:

* The **cl::ValueDisallowed** modifier (which is the default for `unnamed
  alternatives using the generic parser`_) indicates that it is a runtime error
  for the user to specify a value.  This can be provided to disallow users from
  providing options to boolean options (like '``-foo=true``').

In general, the default values for this option group work just like you would
want them to.  As mentioned above, you can specify the `cl::ValueDisallowed`_
modifier to a boolean argument to restrict your command line parser.  These
options are mostly useful when `extending the library`_.

.. _formatting option:

Controlling other formatting options
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The formatting option group is used to specify that the command line option has
special abilities and is otherwise different from other command line arguments.
As usual, you can only specify one of these arguments at most.

.. _cl::NormalFormatting:

* The **cl::NormalFormatting** modifier (which is the default all options)
  specifies that this option is "normal".

.. _cl::Positional:

* The **cl::Positional** modifier specifies that this is a positional argument
  that does not have a command line option associated with it.  See the
  `Positional Arguments`_ section for more information.

* The **cl::ConsumeAfter** modifier specifies that this option is used to
  capture "interpreter style" arguments.  See `this section for more
  information`_.

.. _prefix:
.. _cl::Prefix:

* The **cl::Prefix** modifier specifies 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 ``-lmalloc`` and ``-L/usr/lib`` in a linker tool or
  ``-DNAME=value`` in a compiler tool.  Here, the '``l``', '``D``' and '``L``'
  options are normal string (or list) options, that have the **cl::Prefix**
  modifier added to allow the CommandLine library to recognize them.  Note that
  **cl::Prefix** options must not have the **cl::ValueDisallowed** modifier
  specified.

.. _grouping:
.. _cl::Grouping:

Controlling options grouping
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The **cl::Grouping** modifier can be combined with any formatting types except
for `cl::Positional`_.  It is used to implement Unix-style tools (like ``ls``)
that have lots of single letter arguments, but only require a single dash.
For example, the '``ls -labF``' command actually enables four different options,
all of which are single letters.

Note that **cl::Grouping** options can have values only if they are used
separately or at the end of the groups.  For `cl::ValueRequired`_, it is
a runtime error if such an option is used elsewhere in the group.

The CommandLine library does not restrict how you use the **cl::Prefix** or
**cl::Grouping** 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.

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:

::

  parse(string OrigInput) {

  1. string Input = OrigInput;
  2. if (isOption(Input)) return getOption(Input).parse();  // Normal option
  3. while (!Input.empty() && !isOption(Input)) Input.pop_back();  // Remove the last letter
  4. while (!Input.empty()) {
       string MaybeValue = OrigInput.substr(Input.length())
       if (getOption(Input).isPrefix())
         return getOption(Input).parse(MaybeValue)
       if (!MaybeValue.empty() && MaybeValue[0] == '=')
         return getOption(Input).parse(MaybeValue.substr(1))
       if (!getOption(Input).isGrouping())
         return error()
       getOption(Input).parse()
       Input = OrigInput = MaybeValue
       while (!Input.empty() && !isOption(Input)) Input.pop_back();
       if (!Input.empty() && !getOption(Input).isGrouping())
         return error()
     }
  5. if (!OrigInput.empty()) error();

  }

Miscellaneous option modifiers
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The miscellaneous option modifiers are the only flags where you can specify more
than one flag from the set: they are not mutually exclusive.  These flags
specify boolean properties that modify the option.

.. _cl::CommaSeparated:

* The **cl::CommaSeparated** modifier indicates that any commas specified for an
  option's value should be used to split the value up into multiple values for
  the option.  For example, these two options are equivalent when
  ``cl::CommaSeparated`` is specified: "``-foo=a -foo=b -foo=c``" and
  "``-foo=a,b,c``".  This option only makes sense to be used in a case where the
  option is allowed to accept one or more values (i.e. it is a `cl::list`_
  option).

.. _cl::DefaultOption:

* The **cl::DefaultOption** modifier is used to specify that the option is a
  default that can be overridden by application specific parsers. For example,
  the ``-help`` alias, ``-h``, is registered this way, so it can be overridden
  by applications that need to use the ``-h`` option for another purpose,
  either as a regular option or an alias for another option.

.. _cl::PositionalEatsArgs:

* The **cl::PositionalEatsArgs** modifier (which only applies to positional
  arguments, and only makes sense for lists) indicates that positional argument
  should consume any strings after it (including strings that start with a "-")
  up until another recognized positional argument.  For example, if you have two
  "eating" positional arguments, "``pos1``" and "``pos2``", the string "``-pos1
  -foo -bar baz -pos2 -bork``" would cause the "``-foo -bar -baz``" strings to
  be applied to the "``-pos1``" option and the "``-bork``" string to be applied
  to the "``-pos2``" option.

.. _cl::Sink:

* The **cl::Sink** modifier is used to handle unknown options. If there is at
  least one option with ``cl::Sink`` modifier specified, the parser passes
  unrecognized option strings to it as values instead of signaling an error. As
  with ``cl::CommaSeparated``, this modifier only makes sense with a `cl::list`_
  option.

.. _response files:

Response files
^^^^^^^^^^^^^^

Some systems, such as certain variants of Microsoft Windows and some older
Unices have a relatively low limit on command-line length. It is therefore
customary to use the so-called 'response files' to circumvent this
restriction. These files are mentioned on the command-line (using the "@file")
syntax. The program reads these files and inserts the contents into argv,
thereby working around the command-line length limits.

Top-Level Classes and Functions
-------------------------------

Despite all of the built-in flexibility, the CommandLine option library really
only consists of one function `cl::ParseCommandLineOptions`_ and three main
classes: `cl::opt`_, `cl::list`_, and `cl::alias`_.  This section describes
these three classes in detail.

.. _cl::getRegisteredOptions:

The ``cl::getRegisteredOptions`` function
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The ``cl::getRegisteredOptions`` function is designed to give a programmer
access to declared non-positional command line options so that how they appear
in ``-help`` can be modified prior to calling `cl::ParseCommandLineOptions`_.
Note this method should not be called during any static initialisation because
it cannot be guaranteed that all options will have been initialised. Hence it
should be called from ``main``.

This function can be used to gain access to options declared in libraries that
the tool writer may not have direct access to.

The function retrieves a :ref:`StringMap <dss_stringmap>` that maps the option
string (e.g. ``-help``) to an ``Option*``.

Here is an example of how the function could be used:

.. code-block:: c++

  using namespace llvm;
  int main(int argc, char **argv) {
    cl::OptionCategory AnotherCategory("Some options");

    StringMap<cl::Option*> &Map = cl::getRegisteredOptions();

    //Unhide useful option and put it in a different category
    assert(Map.count("print-all-options") > 0);
    Map["print-all-options"]->setHiddenFlag(cl::NotHidden);
    Map["print-all-options"]->setCategory(AnotherCategory);

    //Hide an option we don't want to see
    assert(Map.count("enable-no-infs-fp-math") > 0);
    Map["enable-no-infs-fp-math"]->setHiddenFlag(cl::Hidden);

    //Change --version to --show-version
    assert(Map.count("version") > 0);
    Map["version"]->setArgStr("show-version");

    //Change --help description
    assert(Map.count("help") > 0);
    Map["help"]->setDescription("Shows help");

    cl::ParseCommandLineOptions(argc, argv, "This is a small program to demo the LLVM CommandLine API");
    ...
  }


.. _cl::ParseCommandLineOptions:

The ``cl::ParseCommandLineOptions`` function
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The ``cl::ParseCommandLineOptions`` function is designed to be called directly
from ``main``, and is used to fill in the values of all of the command line
option variables once ``argc`` and ``argv`` are available.

The ``cl::ParseCommandLineOptions`` function requires two parameters (``argc``
and ``argv``), but may also take an optional third parameter which holds
`additional extra text`_ to emit when the ``-help`` option is invoked.

The ``cl::SetVersionPrinter`` function
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The ``cl::SetVersionPrinter`` function is designed to be called directly from
``main`` and *before* ``cl::ParseCommandLineOptions``. Its use is optional. It
simply arranges for a function to be called in response to the ``--version``
option instead of having the ``CommandLine`` 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 ``CommandLine`` facilities. Such programs should just define a small
function that takes no arguments and returns ``void`` and that prints out
whatever version information is appropriate for the program. Pass the address of
that function to ``cl::SetVersionPrinter`` to arrange for it to be called when
the ``--version`` option is given by the user.

.. _cl::opt:
.. _scalar:

The ``cl::opt`` class
^^^^^^^^^^^^^^^^^^^^^

The ``cl::opt`` class is the class used to represent scalar command line
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):

.. code-block:: c++

  namespace cl {
    template <class DataType, bool ExternalStorage = false,
              class ParserClass = parser<DataType> >
    class opt;
  }

The first template argument specifies what underlying data type the command line
argument is, and is used to select a default parser implementation.  The second
template argument is used to specify whether the option should contain the
storage for the option (the default) or whether external storage should be used
to contain the value parsed for the option (see `Internal vs External Storage`_
for more information).

The third template argument specifies which parser to use.  The default value
selects an instantiation of the ``parser`` class based on the underlying data
type of the option.  In general, this default works well for most applications,
so this option is only used when using a `custom parser`_.

.. _lists of arguments:
.. _cl::list:

The ``cl::list`` class
^^^^^^^^^^^^^^^^^^^^^^

The ``cl::list`` class is the class used to represent a list of command line
options.  It too is a templated class which can take up to three arguments:

.. code-block:: c++

  namespace cl {
    template <class DataType, class Storage = bool,
              class ParserClass = parser<DataType> >
    class list;
  }

This class works the exact same as the `cl::opt`_ class, except that the second
argument is the **type** of the external storage, not a boolean value.  For this
class, the marker type '``bool``' is used to indicate that internal storage
should be used.

.. _cl::bits:

The ``cl::bits`` class
^^^^^^^^^^^^^^^^^^^^^^

The ``cl::bits`` 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:

.. code-block:: c++

  namespace cl {
    template <class DataType, class Storage = bool,
              class ParserClass = parser<DataType> >
    class bits;
  }

This class works the exact same as the `cl::list`_ class, except that the second
argument must be of **type** ``unsigned`` if external storage is used.

.. _cl::alias:

The ``cl::alias`` class
^^^^^^^^^^^^^^^^^^^^^^^

The ``cl::alias`` class is a nontemplated class that is used to form aliases for
other arguments.

.. code-block:: c++

  namespace cl {
    class alias;
  }

The `cl::aliasopt`_ attribute should be used to specify which option this is an
alias for.  Alias arguments default to being `cl::Hidden`_, and use the aliased
options parser to do the conversion from string to data.

.. _cl::extrahelp:

The ``cl::extrahelp`` class
^^^^^^^^^^^^^^^^^^^^^^^^^^^

The ``cl::extrahelp`` class is a nontemplated class that allows extra help text
to be printed out for the ``-help`` option.

.. code-block:: c++

  namespace cl {
    struct extrahelp;
  }

To use the extrahelp, simply construct one with a ``const char*`` parameter to
the constructor. The text passed to the constructor will be printed at the
bottom of the help message, verbatim. Note that multiple ``cl::extrahelp``
**can** be used, but this practice is discouraged. If your tool needs to print
additional help information, put all that help into a single ``cl::extrahelp``
instance.

For example:

.. code-block:: c++

  cl::extrahelp("\nADDITIONAL HELP:\n\n  This is the extra help\n");

.. _cl::OptionCategory:

The ``cl::OptionCategory`` class
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The ``cl::OptionCategory`` class is a simple class for declaring
option categories.

.. code-block:: c++

  namespace cl {
    class OptionCategory;
  }

An option category must have a name and optionally a description which are
passed to the constructor as ``const char*``.

Note that declaring an option category and associating it with an option before
parsing options (e.g. statically) will change the output of ``-help`` from
uncategorized to categorized. If an option category is declared but not
associated with an option then it will be hidden from the output of ``-help``
but will be shown in the output of ``-help-hidden``.

.. _different parser:
.. _discussed previously:

Builtin parsers
---------------

Parsers control how the string value taken from the command line is translated
into a typed value, suitable for use in a C++ program.  By default, the
CommandLine library uses an instance of ``parser<type>`` if the command line
option specifies that it uses values of type '``type``'.  Because of this,
custom option processing is specified with specializations of the '``parser``'
class.

The CommandLine library provides the following builtin parser specializations,
which are sufficient for most applications. It can, however, also be extended to
work with new data types and new ways of interpreting the same data.  See the
`Writing a Custom Parser`_ for more details on this type of library extension.

.. _enums:
.. _cl::parser:

* The generic ``parser<t>`` parser can be used to map strings values to any data
  type, through the use of the `cl::values`_ property, which specifies the
  mapping information.  The most common use of this parser is for parsing enum
  values, which allows you to use the CommandLine library for all of the error
  checking to make sure that only valid enum values are specified (as opposed to
  accepting arbitrary strings).  Despite this, however, the generic parser class
  can be used for any data type.

.. _boolean flags:
.. _bool parser:

* The **parser<bool> specialization** is used to convert boolean strings to a
  boolean value.  Currently accepted strings are "``true``", "``TRUE``",
  "``True``", "``1``", "``false``", "``FALSE``", "``False``", and "``0``".

* The **parser<boolOrDefault> specialization** 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 **``parser<bool>``**.

.. _strings:

* The **parser<string> specialization** simply stores the parsed string into the
  string value specified.  No conversion or modification of the data is
  performed.

.. _integers:
.. _int:

* The **parser<int> specialization** uses the C ``strtol`` function to parse the
  string input.  As such, it will accept a decimal number (with an optional '+'
  or '-' prefix) which must start with a non-zero digit.  It accepts octal
  numbers, which are identified with a '``0``' prefix digit, and hexadecimal
  numbers with a prefix of '``0x``' or '``0X``'.

.. _doubles:
.. _float:
.. _double:

* The **parser<double>** and **parser<float> specializations** use the standard
  C ``strtod`` function to convert floating point strings into floating point
  values.  As such, a broad range of string formats is supported, including
  exponential notation (ex: ``1.7e15``) and properly supports locales.

.. _Extension Guide:
.. _extending the library:

Extension Guide
===============

Although the CommandLine library has a lot of functionality built into it
already (as discussed previously), one of its true strengths lie in its
extensibility.  This section discusses how the CommandLine library works under
the covers and illustrates how to do some simple, common, extensions.

.. _Custom parsers:
.. _custom parser:
.. _Writing a Custom Parser:

Writing a custom parser
-----------------------

One of the simplest and most common extensions is the use of a custom parser.
As `discussed previously`_, parsers are the portion of the CommandLine library
that turns string input from the user into a particular parsed data type,
validating the input in the process.

There are two ways to use a new parser:

#. Specialize the `cl::parser`_ template for your custom data type.

   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 fundamental data type is something that is already
   supported.

#. Write an independent class, using it explicitly from options that need it.

   This approach works well in situations where you would line to parse an
   option using special syntax for a not-very-special data-type.  The drawback
   of this approach is that users of your parser have to be aware that they are
   using your parser instead of the builtin ones.

To guide the discussion, we will discuss a custom parser that accepts file
sizes, specified with an optional unit after the numeric size.  For example, we
would like to parse "102kb", "41M", "1G" into the appropriate integer value.  In
this case, the underlying data type we want to parse into is '``unsigned``'.  We
choose approach #2 above because we don't want to make this the default for all
``unsigned`` options.

To start out, we declare our new ``FileSizeParser`` class:

.. code-block:: c++

  struct FileSizeParser : public cl::parser<unsigned> {
    // parse - Return true on error.
    bool parse(cl::Option &O, StringRef ArgName, const std::string &ArgValue,
               unsigned &Val);
  };

Our new class inherits from the ``cl::parser`` template class to fill in
the default, boiler plate code for us.  We give it the data type that we parse
into, the last argument to the ``parse`` method, so that clients of our custom
parser know what object type to pass in to the parse method.  (Here we declare
that we parse into '``unsigned``' variables.)

For most purposes, the only method that must be implemented in a custom parser
is the ``parse`` method.  The ``parse`` method is called whenever the option is
invoked, passing in the option itself, the option name, the string to parse, and
a reference to a return value.  If the string to parse is not well-formed, the
parser should output an error message and return true.  Otherwise it should
return false and set '``Val``' to the parsed value.  In our example, we
implement ``parse`` as:

.. code-block:: c++

  bool FileSizeParser::parse(cl::Option &O, StringRef ArgName,
                             const std::string &Arg, unsigned &Val) {
    const char *ArgStart = Arg.c_str();
    char *End;

    // Parse integer part, leaving 'End' pointing to the first non-integer char
    Val = (unsigned)strtol(ArgStart, &End, 0);

    while (1) {
      switch (*End++) {
      case 0: return false;   // No error
      case 'i':               // Ignore the 'i' in KiB if people use that
      case 'b': case 'B':     // Ignore B suffix
        break;

      case 'g': case 'G': Val *= 1024*1024*1024; break;
      case 'm': case 'M': Val *= 1024*1024;      break;
      case 'k': case 'K': Val *= 1024;           break;

      default:
        // Print an error message if unrecognized character!
        return O.error("'" + Arg + "' value invalid for file size argument!");
      }
    }
  }

This function implements a very simple parser for the kinds of strings we are
interested in.  Although it has some holes (it allows "``123KKK``" for example),
it is good enough for this example.  Note that we use the option itself to print
out the error message (the ``error`` 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:

.. code-block:: c++

  static cl::opt<unsigned, false, FileSizeParser>
  MFS("max-file-size", cl::desc("Maximum file size to accept"),
      cl::value_desc("size"));

Which adds this to the output of our program:

::

  OPTIONS:
    -help                 - display available options (-help-hidden for more)
    ...
    -max-file-size=<size> - Maximum file size to accept

And we can test that our parse works correctly now (the test program just prints
out the max-file-size argument value):

::

  $ ./test
  MFS: 0
  $ ./test -max-file-size=123MB
  MFS: 128974848
  $ ./test -max-file-size=3G
  MFS: 3221225472
  $ ./test -max-file-size=dog
  -max-file-size option: 'dog' value invalid for file size argument!

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"
tutorial.

Exploiting external storage
---------------------------

Several of the LLVM libraries define static ``cl::opt`` instances that will
automatically be included in any program that links with that library.  This is
a feature. However, sometimes it is necessary to know the value of the command
line option outside of the library. In these cases the library does or should
provide an external storage location that is accessible to users of the
library. Examples of this include the ``llvm::DebugFlag`` exported by the
``lib/Support/Debug.cpp`` file and the ``llvm::TimePassesIsEnabled`` flag
exported by the ``lib/IR/PassManager.cpp`` file.

.. todo::

  TODO: complete this section

.. _dynamically loaded options:

Dynamically adding command line options
---------------------------------------

.. todo::

  TODO: fill in this section
