mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 19:31:58 +00:00
many cleanups and fixed, contributed by Sam Bishop
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45780 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
864e3a3762
commit
8b44b90644
@ -138,7 +138,7 @@ code.</li>
|
|||||||
|
|
||||||
<li>Globally accessible: Libraries can specify command line arguments that are
|
<li>Globally accessible: Libraries can specify command line arguments that are
|
||||||
automatically enabled in any tool that links to the library. This is possible
|
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
|
because the application doesn't have to keep a list of arguments to pass to
|
||||||
the parser. This also makes supporting <a href="#dynamicopts">dynamically
|
the parser. This also makes supporting <a href="#dynamicopts">dynamically
|
||||||
loaded options</a> trivial.</li>
|
loaded options</a> trivial.</li>
|
||||||
|
|
||||||
@ -216,12 +216,12 @@ int main(int argc, char **argv) {
|
|||||||
declarations.</p>
|
declarations.</p>
|
||||||
|
|
||||||
<p>Now that you are ready to support command line arguments, we need to tell the
|
<p>Now that you are ready to support command line arguments, we need to tell the
|
||||||
system which ones we want, and what type of argument they are. The CommandLine
|
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
|
library uses a declarative syntax to model command line arguments with the
|
||||||
global variable declarations that capture the parsed values. This means that
|
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
|
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,
|
global variable declaration to capture the result. For example, in a compiler,
|
||||||
we would like to support the unix standard '<tt>-o <filename></tt>' option
|
we would like to support the Unix-standard '<tt>-o <filename></tt>' option
|
||||||
to specify where to put the output. With the CommandLine library, this is
|
to specify where to put the output. With the CommandLine library, this is
|
||||||
represented like this:</p>
|
represented like this:</p>
|
||||||
|
|
||||||
@ -383,7 +383,7 @@ OPTIONS:
|
|||||||
-help - display available options (--help-hidden for more)
|
-help - display available options (--help-hidden for more)
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>and "<tt>opt --help-hidden</tt>" prints this:</p>
|
<p>and "<tt>compiler --help-hidden</tt>" prints this:</p>
|
||||||
|
|
||||||
<div class="doc_code"><pre>
|
<div class="doc_code"><pre>
|
||||||
USAGE: compiler [options] <input file>
|
USAGE: compiler [options] <input file>
|
||||||
@ -432,7 +432,7 @@ a value itself:</p>
|
|||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>The third line (which is the only one we modified from above) defines a
|
<p>The third line (which is the only one we modified from above) defines a
|
||||||
"<tt>-q</tt> alias that updates the "<tt>Quiet</tt>" variable (as specified by
|
"<tt>-q</tt>" alias that updates the "<tt>Quiet</tt>" variable (as specified by
|
||||||
the <tt><a href="#cl::aliasopt">cl::aliasopt</a></tt> modifier) whenever it is
|
the <tt><a href="#cl::aliasopt">cl::aliasopt</a></tt> modifier) whenever it is
|
||||||
specified. Because aliases do not hold state, the only thing the program has to
|
specified. Because aliases do not hold state, the only thing the program has to
|
||||||
query is the <tt>Quiet</tt> variable now. Another nice feature of aliases is
|
query is the <tt>Quiet</tt> variable now. Another nice feature of aliases is
|
||||||
@ -462,24 +462,24 @@ uses.</p>
|
|||||||
|
|
||||||
<div class="doc_text">
|
<div class="doc_text">
|
||||||
|
|
||||||
<p>So far, we have seen how the CommandLine library handles builtin types like
|
<p>So far we have seen how the CommandLine library handles builtin types like
|
||||||
<tt>std::string</tt>, <tt>bool</tt> and <tt>int</tt>, but how does it handle
|
<tt>std::string</tt>, <tt>bool</tt> and <tt>int</tt>, but how does it handle
|
||||||
things it doesn't know about, like enums or '<tt>int*</tt>'s?</p>
|
things it doesn't know about, like enums or '<tt>int*</tt>'s?</p>
|
||||||
|
|
||||||
<p>The answer is that it uses a table driven generic parser (unless you specify
|
<p>The answer is that it uses a table-driven generic parser (unless you specify
|
||||||
your own parser, as described in the <a href="#extensionguide">Extension
|
your own parser, as described in the <a href="#extensionguide">Extension
|
||||||
Guide</a>). This parser maps literal strings to whatever type is required, and
|
Guide</a>). This parser maps literal strings to whatever type is required, and
|
||||||
requires you to tell it what this mapping should be.</p>
|
requires you to tell it what this mapping should be.</p>
|
||||||
|
|
||||||
<p>Lets say that we would like to add four optimization levels to our
|
<p>Let's say that we would like to add four optimization levels to our
|
||||||
optimizer, using the standard flags "<tt>-g</tt>", "<tt>-O0</tt>",
|
optimizer, using the standard flags "<tt>-g</tt>", "<tt>-O0</tt>",
|
||||||
"<tt>-O1</tt>", and "<tt>-O2</tt>". We could easily implement this with boolean
|
"<tt>-O1</tt>", and "<tt>-O2</tt>". We could easily implement this with boolean
|
||||||
options like above, but there are several problems with this strategy:</p>
|
options like above, but there are several problems with this strategy:</p>
|
||||||
|
|
||||||
<ol>
|
<ol>
|
||||||
<li>A user could specify more than one of the options at a time, for example,
|
<li>A user could specify more than one of the options at a time, for example,
|
||||||
"<tt>opt -O3 -O2</tt>". The CommandLine library would not be able to catch this
|
"<tt>compiler -O3 -O2</tt>". The CommandLine library would not be able to
|
||||||
erroneous input for us.</li>
|
catch this erroneous input for us.</li>
|
||||||
|
|
||||||
<li>We would have to test 4 different variables to see which ones are set.</li>
|
<li>We would have to test 4 different variables to see which ones are set.</li>
|
||||||
|
|
||||||
@ -634,7 +634,7 @@ that you can choose the form most appropriate for your application.</p>
|
|||||||
|
|
||||||
<div class="doc_text">
|
<div class="doc_text">
|
||||||
|
|
||||||
<p>Now that we have the standard run of the mill argument types out of the way,
|
<p>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
|
lets get a little wild and crazy. Lets say that we want our optimizer to accept
|
||||||
a <b>list</b> of optimizations to perform, allowing duplicates. For example, we
|
a <b>list</b> of optimizations to perform, allowing duplicates. For example, we
|
||||||
might want to run: "<tt>compiler -dce -constprop -inline -dce -strip</tt>". In
|
might want to run: "<tt>compiler -dce -constprop -inline -dce -strip</tt>". In
|
||||||
@ -750,7 +750,7 @@ the first are discarded.</p>
|
|||||||
|
|
||||||
<p>Finally, if external storage is used, then the location specified must be of
|
<p>Finally, if external storage is used, then the location specified must be of
|
||||||
<b>type</b> <tt>unsigned</tt>. In all other ways a <a
|
<b>type</b> <tt>unsigned</tt>. In all other ways a <a
|
||||||
href="#bits"><tt>cl::bits</tt></a> option is morally equivalent to a <a
|
href="#bits"><tt>cl::bits</tt></a> option is equivalent to a <a
|
||||||
href="#list"> <tt>cl::list</tt></a> option.</p>
|
href="#list"> <tt>cl::list</tt></a> option.</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@ -916,7 +916,7 @@ can use it like this:</p>
|
|||||||
|
|
||||||
<div class="doc_code"><pre>
|
<div class="doc_code"><pre>
|
||||||
static cl::list<std::string> Files(cl::Positional, cl::OneOrMore);
|
static cl::list<std::string> Files(cl::Positional, cl::OneOrMore);
|
||||||
static cl::listlt;std::string> Libraries("l", cl::ZeroOrMore);
|
static cl::list<std::string> Libraries("l", cl::ZeroOrMore);
|
||||||
|
|
||||||
int main(int argc, char**argv) {
|
int main(int argc, char**argv) {
|
||||||
// ...
|
// ...
|
||||||
@ -969,7 +969,7 @@ interpreted by the command line argument.</p>
|
|||||||
standard Unix Bourne shell (<tt>/bin/sh</tt>). To run <tt>/bin/sh</tt>, first
|
standard Unix Bourne shell (<tt>/bin/sh</tt>). To run <tt>/bin/sh</tt>, first
|
||||||
you specify options to the shell itself (like <tt>-x</tt> which turns on trace
|
you specify options to the shell itself (like <tt>-x</tt> which turns on trace
|
||||||
output), then you specify the name of the script to run, then you specify
|
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
|
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 command line option processor, but are not interpreted as options to the
|
||||||
shell itself. Using the CommandLine library, we would specify this as:</p>
|
shell itself. Using the CommandLine library, we would specify this as:</p>
|
||||||
|
|
||||||
@ -1042,10 +1042,7 @@ extern bool DebugFlag;
|
|||||||
<i>// DEBUG macro - This macro should be used by code to emit debug information.
|
<i>// 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
|
// 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
|
// debug build, then the code specified as the option to the macro will be
|
||||||
// executed. Otherwise it will not be. Example:
|
// executed. Otherwise it will not be.</i>
|
||||||
//
|
|
||||||
// DOUT << "Bitset contains: " << Bitset << "\n";
|
|
||||||
//</i>
|
|
||||||
<span class="doc_hilite">#ifdef NDEBUG
|
<span class="doc_hilite">#ifdef NDEBUG
|
||||||
#define DEBUG(X)
|
#define DEBUG(X)
|
||||||
#else
|
#else
|
||||||
@ -1057,7 +1054,7 @@ extern bool DebugFlag;
|
|||||||
<p>This allows clients to blissfully use the <tt>DEBUG()</tt> macro, or the
|
<p>This allows clients to blissfully use the <tt>DEBUG()</tt> macro, or the
|
||||||
<tt>DebugFlag</tt> explicitly if they want to. Now we just need to be able to
|
<tt>DebugFlag</tt> explicitly if they want to. Now we just need to be able to
|
||||||
set the <tt>DebugFlag</tt> boolean when the option is set. To do this, we pass
|
set the <tt>DebugFlag</tt> boolean when the option is set. To do this, we pass
|
||||||
an additial argument to our command line argument processor, and we specify
|
an additional argument to our command line argument processor, and we specify
|
||||||
where to fill in with the <a href="#cl::location">cl::location</a>
|
where to fill in with the <a href="#cl::location">cl::location</a>
|
||||||
attribute:</p>
|
attribute:</p>
|
||||||
|
|
||||||
@ -1206,15 +1203,15 @@ compiled program:</p>
|
|||||||
|
|
||||||
<li><a name="cl::NotHidden">The <b><tt>cl::NotHidden</tt></b></a> modifier
|
<li><a name="cl::NotHidden">The <b><tt>cl::NotHidden</tt></b></a> modifier
|
||||||
(which is the default for <tt><a href="#cl::opt">cl::opt</a></tt> and <tt><a
|
(which is the default for <tt><a href="#cl::opt">cl::opt</a></tt> and <tt><a
|
||||||
href="#cl::list">cl::list</a></tt> options), indicates the option is to appear
|
href="#cl::list">cl::list</a></tt> options) indicates the option is to appear
|
||||||
in both help listings.</li>
|
in both help listings.</li>
|
||||||
|
|
||||||
<li><a name="cl::Hidden">The <b><tt>cl::Hidden</tt></b></a> modifier (which is the
|
<li><a name="cl::Hidden">The <b><tt>cl::Hidden</tt></b></a> modifier (which is the
|
||||||
default for <tt><a href="#cl::alias">cl::alias</a></tt> options), indicates that
|
default for <tt><a href="#cl::alias">cl::alias</a></tt> options) indicates that
|
||||||
the option should not appear in the <tt>--help</tt> output, but should appear in
|
the option should not appear in the <tt>--help</tt> output, but should appear in
|
||||||
the <tt>--help-hidden</tt> output.</li>
|
the <tt>--help-hidden</tt> output.</li>
|
||||||
|
|
||||||
<li><a name="cl::ReallyHidden">The <b><tt>cl::ReallyHidden</tt></b></a> modifier,
|
<li><a name="cl::ReallyHidden">The <b><tt>cl::ReallyHidden</tt></b></a> modifier
|
||||||
indicates that the option should not appear in any help output.</li>
|
indicates that the option should not appear in any help output.</li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
@ -1255,7 +1252,7 @@ indicates that the specified option must be specified exactly one time.</li>
|
|||||||
indicates that the option must be specified at least one time.</li>
|
indicates that the option must be specified at least one time.</li>
|
||||||
|
|
||||||
<li>The <b><tt>cl::ConsumeAfter</tt></b> modifier is described in the <a
|
<li>The <b><tt>cl::ConsumeAfter</tt></b> modifier is described in the <a
|
||||||
href="#positional">Positional arguments section</a></li>
|
href="#positional">Positional arguments section</a>.</li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
@ -1328,7 +1325,7 @@ when <a href="#extensionguide">extending the library</a>.</p>
|
|||||||
|
|
||||||
<p>The formatting option group is used to specify that the command line option
|
<p>The formatting option group is used to specify that the command line option
|
||||||
has special abilities and is otherwise different from other command line
|
has special abilities and is otherwise different from other command line
|
||||||
arguments. As usual, you can only specify at most one of these arguments.</p>
|
arguments. As usual, you can only specify one of these arguments at most.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
|
|
||||||
@ -1337,7 +1334,7 @@ modifier (which is the default all options) specifies that this option is
|
|||||||
"normal".</li>
|
"normal".</li>
|
||||||
|
|
||||||
<li><a name="cl::Positional">The <b><tt>cl::Positional</tt></b></a> modifier
|
<li><a name="cl::Positional">The <b><tt>cl::Positional</tt></b></a> modifier
|
||||||
specifies that this is a positional argument, that does not have a command line
|
specifies that this is a positional argument that does not have a command line
|
||||||
option associated with it. See the <a href="#positional">Positional
|
option associated with it. See the <a href="#positional">Positional
|
||||||
Arguments</a> section for more information.</li>
|
Arguments</a> section for more information.</li>
|
||||||
|
|
||||||
@ -1358,7 +1355,7 @@ modifier added to allow the CommandLine library to recognize them. Note that
|
|||||||
specified.</li>
|
specified.</li>
|
||||||
|
|
||||||
<li><a name="cl::Grouping">The <b><tt>cl::Grouping</tt></b></a> modifier is used
|
<li><a name="cl::Grouping">The <b><tt>cl::Grouping</tt></b></a> modifier is used
|
||||||
to implement unix style tools (like <tt>ls</tt>) that have lots of single letter
|
to implement Unix-style tools (like <tt>ls</tt>) that have lots of single letter
|
||||||
arguments, but only require a single dash. For example, the '<tt>ls -labF</tt>'
|
arguments, but only require a single dash. For example, the '<tt>ls -labF</tt>'
|
||||||
command actually enables four different options, all of which are single
|
command actually enables four different options, all of which are single
|
||||||
letters. Note that <b><tt><a href="#cl::Grouping">cl::Grouping</a></tt></b>
|
letters. Note that <b><tt><a href="#cl::Grouping">cl::Grouping</a></tt></b>
|
||||||
@ -1426,7 +1423,7 @@ more values (i.e. it is a <a href="#cl::list">cl::list</a> option).</li>
|
|||||||
positional arguments, and only makes sense for lists) indicates that positional
|
positional arguments, and only makes sense for lists) indicates that positional
|
||||||
argument should consume any strings after it (including strings that start with
|
argument should consume any strings after it (including strings that start with
|
||||||
a "-") up until another recognized positional argument. For example, if you
|
a "-") up until another recognized positional argument. For example, if you
|
||||||
have two "eating" positional arguments "<tt>pos1</tt>" and "<tt>pos2</tt>" the
|
have two "eating" positional arguments, "<tt>pos1</tt>" and "<tt>pos2</tt>", the
|
||||||
string "<tt>-pos1 -foo -bar baz -pos2 -bork</tt>" would cause the "<tt>-foo -bar
|
string "<tt>-pos1 -foo -bar baz -pos2 -bork</tt>" would cause the "<tt>-foo -bar
|
||||||
-baz</tt>" strings to be applied to the "<tt>-pos1</tt>" option and the
|
-baz</tt>" strings to be applied to the "<tt>-pos1</tt>" option and the
|
||||||
"<tt>-bork</tt>" string to be applied to the "<tt>-pos2</tt>" option.</li>
|
"<tt>-bork</tt>" string to be applied to the "<tt>-pos2</tt>" option.</li>
|
||||||
@ -1487,14 +1484,14 @@ as <a
|
|||||||
href="#cl::ParseCommandLineOptions"><tt>cl::ParseCommandLineOptions</tt></a>,
|
href="#cl::ParseCommandLineOptions"><tt>cl::ParseCommandLineOptions</tt></a>,
|
||||||
except that it is designed to take values for options from an environment
|
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
|
variable, for those cases in which reading the command line is not convenient or
|
||||||
not desired. It fills in the values of all the command line option variables
|
desired. It fills in the values of all the command line option variables just
|
||||||
just like <a
|
like <a
|
||||||
href="#cl::ParseCommandLineOptions"><tt>cl::ParseCommandLineOptions</tt></a>
|
href="#cl::ParseCommandLineOptions"><tt>cl::ParseCommandLineOptions</tt></a>
|
||||||
does.</p>
|
does.</p>
|
||||||
|
|
||||||
<p>It takes three parameters: first, the name of the program (since
|
<p>It takes three parameters: the name of the program (since <tt>argv</tt> may
|
||||||
<tt>argv</tt> may not be available, it can't just look in <tt>argv[0]</tt>),
|
not be available, it can't just look in <tt>argv[0]</tt>), the name of the
|
||||||
second, the name of the environment variable to examine, and third, the optional
|
environment variable to examine, and the optional
|
||||||
<a href="#description">additional extra text</a> to emit when the
|
<a href="#description">additional extra text</a> to emit when the
|
||||||
<tt>--help</tt> option is invoked.</p>
|
<tt>--help</tt> option is invoked.</p>
|
||||||
|
|
||||||
@ -1518,7 +1515,7 @@ input.</p>
|
|||||||
<div class="doc_text">
|
<div class="doc_text">
|
||||||
|
|
||||||
<p>The <tt>cl::SetVersionPrinter</tt> function is designed to be called
|
<p>The <tt>cl::SetVersionPrinter</tt> function is designed to be called
|
||||||
directly from <tt>main</tt>, and <i>before</i>
|
directly from <tt>main</tt> and <i>before</i>
|
||||||
<tt>cl::ParseCommandLineOptions</tt>. Its use is optional. It simply arranges
|
<tt>cl::ParseCommandLineOptions</tt>. Its use is optional. It simply arranges
|
||||||
for a function to be called in response to the <tt>--version</tt> option instead
|
for a function to be called in response to the <tt>--version</tt> option instead
|
||||||
of having the <tt>CommandLine</tt> library print out the usual version string
|
of having the <tt>CommandLine</tt> library print out the usual version string
|
||||||
@ -1783,7 +1780,7 @@ it.</p>
|
|||||||
<p>This approach works well in situations where you would line to parse an
|
<p>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
|
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
|
this approach is that users of your parser have to be aware that they are using
|
||||||
your parser, instead of the builtin ones.</p>
|
your parser instead of the builtin ones.</p>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
@ -1807,16 +1804,16 @@ this the default for all <tt>unsigned</tt> options.</p>
|
|||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>Our new class inherits from the <tt>cl::basic_parser</tt> template class to
|
<p>Our new class inherits from the <tt>cl::basic_parser</tt> template class to
|
||||||
fill in the default, boiler plate, code for us. We give it the data type that
|
fill in the default, boiler plate code for us. We give it the data type that
|
||||||
we parse into (the last argument to the <tt>parse</tt> method so that clients of
|
we parse into, the last argument to the <tt>parse</tt> method, so that clients of
|
||||||
our custom parser know what object type to pass in to the parse method (here we
|
our custom parser know what object type to pass in to the parse method. (Here we
|
||||||
declare that we parse into '<tt>unsigned</tt>' variables.</p>
|
declare that we parse into '<tt>unsigned</tt>' variables.)</p>
|
||||||
|
|
||||||
<p>For most purposes, the only method that must be implemented in a custom
|
<p>For most purposes, the only method that must be implemented in a custom
|
||||||
parser is the <tt>parse</tt> method. The <tt>parse</tt> method is called
|
parser is the <tt>parse</tt> method. The <tt>parse</tt> method is called
|
||||||
whenever the option is invoked, passing in the option itself, the option name,
|
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
|
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.
|
is not well-formed, the parser should output an error message and return true.
|
||||||
Otherwise it should return false and set '<tt>Val</tt>' to the parsed value. In
|
Otherwise it should return false and set '<tt>Val</tt>' to the parsed value. In
|
||||||
our example, we implement <tt>parse</tt> as:</p>
|
our example, we implement <tt>parse</tt> as:</p>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user