mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-13 17:38:39 +00:00
Document OptionPreprocessor.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85030 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
14cb2a2327
commit
3e4102e94c
@ -431,8 +431,16 @@ use TableGen inheritance instead.
|
|||||||
|
|
||||||
* Possible tests are:
|
* Possible tests are:
|
||||||
|
|
||||||
- ``switch_on`` - Returns true if a given command-line switch is
|
- ``switch_on`` - Returns true if a given command-line switch is provided by
|
||||||
provided by the user. Example: ``(switch_on "opt")``.
|
the user. Can be given a list as argument, in that case ``(switch_on ["foo",
|
||||||
|
"bar", "baz"])`` is equivalent to ``(and (switch_on "foo"), (switch_on
|
||||||
|
"bar"), (switch_on "baz"))``.
|
||||||
|
Example: ``(switch_on "opt")``.
|
||||||
|
|
||||||
|
- ``any_switch_on`` - Given a list of switch options, returns true if any of
|
||||||
|
the switches is turned on.
|
||||||
|
Example: ``(any_switch_on ["foo", "bar", "baz"])`` is equivalent to ``(or
|
||||||
|
(switch_on "foo"), (switch_on "bar"), (switch_on "baz"))``.
|
||||||
|
|
||||||
- ``parameter_equals`` - Returns true if a command-line parameter equals
|
- ``parameter_equals`` - Returns true if a command-line parameter equals
|
||||||
a given value.
|
a given value.
|
||||||
@ -446,18 +454,28 @@ use TableGen inheritance instead.
|
|||||||
belongs to the current input language set.
|
belongs to the current input language set.
|
||||||
Example: ``(input_languages_contain "c++")``.
|
Example: ``(input_languages_contain "c++")``.
|
||||||
|
|
||||||
- ``in_language`` - Evaluates to true if the input file language
|
- ``in_language`` - Evaluates to true if the input file language is equal to
|
||||||
equals to the argument. At the moment works only with ``cmd_line``
|
the argument. At the moment works only with ``cmd_line`` and ``actions`` (on
|
||||||
and ``actions`` (on non-join nodes).
|
non-join nodes).
|
||||||
Example: ``(in_language "c++")``.
|
Example: ``(in_language "c++")``.
|
||||||
|
|
||||||
- ``not_empty`` - Returns true if a given option (which should be
|
- ``not_empty`` - Returns true if a given option (which should be either a
|
||||||
either a parameter or a parameter list) is set by the
|
parameter or a parameter list) is set by the user. Like ``switch_on``, can
|
||||||
user.
|
be also given a list as argument.
|
||||||
Example: ``(not_empty "o")``.
|
Example: ``(not_empty "o")``.
|
||||||
|
|
||||||
|
- ``any_not_empty`` - Returns true if ``not_empty`` returns true for any of
|
||||||
|
the options in the list.
|
||||||
|
Example: ``(any_not_empty ["foo", "bar", "baz"])`` is equivalent to ``(or
|
||||||
|
(not_empty "foo"), (not_empty "bar"), (not_empty "baz"))``.
|
||||||
|
|
||||||
- ``empty`` - The opposite of ``not_empty``. Equivalent to ``(not (not_empty
|
- ``empty`` - The opposite of ``not_empty``. Equivalent to ``(not (not_empty
|
||||||
X))``. Provided for convenience.
|
X))``. Provided for convenience. Can be given a list as argument.
|
||||||
|
|
||||||
|
- ``any_not_empty`` - Returns true if ``not_empty`` returns true for any of
|
||||||
|
the options in the list.
|
||||||
|
Example: ``(any_empty ["foo", "bar", "baz"])`` is equivalent to ``(not (and
|
||||||
|
(not_empty "foo"), (not_empty "bar"), (not_empty "baz")))``.
|
||||||
|
|
||||||
- ``single_input_file`` - Returns true if there was only one input file
|
- ``single_input_file`` - Returns true if there was only one input file
|
||||||
provided on the command-line. Used without arguments:
|
provided on the command-line. Used without arguments:
|
||||||
@ -572,11 +590,13 @@ The list of all possible actions follows.
|
|||||||
Example: ``(case (switch_on "pthread"), (append_cmd
|
Example: ``(case (switch_on "pthread"), (append_cmd
|
||||||
"-lpthread"))``
|
"-lpthread"))``
|
||||||
|
|
||||||
- ``error` - exit with error.
|
- ``error`` - exit with error.
|
||||||
Example: ``(error "Mixing -c and -S is not allowed!")``.
|
Example: ``(error "Mixing -c and -S is not allowed!")``.
|
||||||
|
|
||||||
- ``forward`` - forward an option unchanged.
|
- ``warning`` - print a warning.
|
||||||
Example: ``(forward "Wall")``.
|
Example: ``(warning "Specifying both -O1 and -O2 is meaningless!")``.
|
||||||
|
|
||||||
|
- ``forward`` - forward an option unchanged. Example: ``(forward "Wall")``.
|
||||||
|
|
||||||
- ``forward_as`` - Change the name of an option, but forward the
|
- ``forward_as`` - Change the name of an option, but forward the
|
||||||
argument unchanged.
|
argument unchanged.
|
||||||
@ -619,6 +639,36 @@ linked with the root node. Since tools are not allowed to have
|
|||||||
multiple output languages, for nodes "inside" the graph the input and
|
multiple output languages, for nodes "inside" the graph the input and
|
||||||
output languages should match. This is enforced at compile-time.
|
output languages should match. This is enforced at compile-time.
|
||||||
|
|
||||||
|
Option preprocessor
|
||||||
|
===================
|
||||||
|
|
||||||
|
It is sometimes useful to run error-checking code before processing the
|
||||||
|
compilation graph. For example, if optimization options "-O1" and "-O2" are
|
||||||
|
implemented as switches, we might want to output a warning if the user invokes
|
||||||
|
the driver with both of these options enabled.
|
||||||
|
|
||||||
|
The ``OptionPreprocessor`` feature is reserved specially for these
|
||||||
|
occasions. Example (adapted from the built-in Base plugin)::
|
||||||
|
|
||||||
|
def Preprocess : OptionPreprocessor<
|
||||||
|
(case (and (switch_on "O3"), (any_switch_on ["O0", "O1", "O2"])),
|
||||||
|
[(unset_option ["O0", "O1", "O2"]),
|
||||||
|
(warning "Multiple -O options specified, defaulted to -O3.")],
|
||||||
|
(and (switch_on "O2"), (any_switch_on ["O0", "O1"])),
|
||||||
|
(unset_option ["O0", "O1"]),
|
||||||
|
(and (switch_on "O1"), (switch_on "O0")),
|
||||||
|
(unset_option "O0"))
|
||||||
|
>;
|
||||||
|
|
||||||
|
Here, ``OptionPreprocessor`` is used to unset all spurious optimization options
|
||||||
|
(so that they are not forwarded to the compiler).
|
||||||
|
|
||||||
|
``OptionPreprocessor`` is basically a single big ``case`` expression, which is
|
||||||
|
evaluated only once right after the plugin is loaded. The only allowed actions
|
||||||
|
in ``OptionPreprocessor`` are ``error``, ``warning`` and a special action
|
||||||
|
``unset_option``, which, as the name suggests, unsets a given option. For
|
||||||
|
convenience, ``unset_option`` also works on lists.
|
||||||
|
|
||||||
|
|
||||||
More advanced topics
|
More advanced topics
|
||||||
====================
|
====================
|
||||||
|
Loading…
x
Reference in New Issue
Block a user