==============================
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:
    -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:
    -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"),
     clEnumValEnd));

  ...
    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 (Note that the declaration list must be terminated
with the "``clEnumValEnd``" argument!).  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 a 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"),
     clEnumValEnd));

  ...
    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"),
      clEnumValEnd));

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 -constprop -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, constprop, 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(constprop         , "Constant Propagation"),
     clEnumValN(inlining, "inline", "Procedure Integration"),
      clEnumVal(strip             , "Strip Symbols"),
    clEnumValEnd));

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(constprop         , "Constant Propagation"),
     clEnumValN(inlining, "inline", "Procedure Integration"),
      clEnumVal(strip             , "Strip Symbols"),
    clEnumValEnd));

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

.. code-block:: c++

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

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 DEBUG(X)
  #else
  #define DEBUG(X) do { if (DebugFlag) { X; } } while (0)
  #endif

This allows clients to blissfully use the ``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 **clEnumValEnd terminated** 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.

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:

* The **cl::Grouping** modifier 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
  cannot have values.

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 (!isOption(input) && !input.empty()) input.pop_back();  // Remove the last letter
  4. if (input.empty()) return error();  // No matching option
  5. if (getOption(input).isPrefix())
       return getOption(input).parse(input);
  6. while (!input.empty()) {  // Must be grouping options
       getOption(input).parse();
       OrigInput.erase(OrigInput.begin(), OrigInput.begin()+input.length());
       input = OrigInput;
       while (!isOption(input) && !input.empty()) input.pop_back();
     }
  7. 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::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.

So far, these are the only three miscellaneous option modifiers.

.. _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. Response files are
enabled by an optional fourth argument to `cl::ParseEnvironmentOptions`_ and
`cl::ParseCommandLineOptions`_.

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 writter 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(Map);

    //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, and a
fourth boolean parameter that enables `response files`_.

.. _cl::ParseEnvironmentOptions:

The ``cl::ParseEnvironmentOptions`` function
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The ``cl::ParseEnvironmentOptions`` function has mostly the same effects as
`cl::ParseCommandLineOptions`_, except that it is designed to take values for
options from an environment variable, for those cases in which reading the
command line is not convenient or desired. It fills in the values of all the
command line option variables just like `cl::ParseCommandLineOptions`_ does.

It takes four parameters: the name of the program (since ``argv`` may not be
available, it can't just look in ``argv[0]``), the name of the environment
variable to examine, the optional `additional extra text`_ to emit when the
``-help`` option is invoked, and the boolean switch that controls whether
`response files`_ should be read.

``cl::ParseEnvironmentOptions`` will break the environment variable's value up
into words and then process them using `cl::ParseCommandLineOptions`_.
**Note:** Currently ``cl::ParseEnvironmentOptions`` does not support quoting, so
an environment variable containing ``-option "foo bar"`` will be parsed as three
words, ``-option``, ``"foo``, and ``bar"``, which is different from what you
would get from the shell with the same input.

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/VMCore/PassManager.cpp`` file.

.. todo::

  TODO: complete this section

.. _dynamically loaded options:

Dynamically adding command line options

.. todo::

  TODO: fill in this section
