mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 06:30:16 +00:00
Documentation update.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51753 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5fe8475e3a
commit
270cae3bf8
@ -1,3 +1,4 @@
|
|||||||
|
===================================
|
||||||
Customizing LLVMC: Reference Manual
|
Customizing LLVMC: Reference Manual
|
||||||
===================================
|
===================================
|
||||||
|
|
||||||
@ -15,8 +16,12 @@ purposes - for example, as a build tool for game resources.
|
|||||||
Because LLVMC employs TableGen [1]_ as its configuration language, you
|
Because LLVMC employs TableGen [1]_ as its configuration language, you
|
||||||
need to be familiar with it to customize LLVMC.
|
need to be familiar with it to customize LLVMC.
|
||||||
|
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
|
||||||
|
|
||||||
Compiling with LLVMC
|
Compiling with LLVMC
|
||||||
--------------------
|
====================
|
||||||
|
|
||||||
LLVMC tries hard to be as compatible with ``gcc`` as possible,
|
LLVMC tries hard to be as compatible with ``gcc`` as possible,
|
||||||
although there are some small differences. Most of the time, however,
|
although there are some small differences. Most of the time, however,
|
||||||
@ -50,9 +55,30 @@ impossible for LLVMC to choose the right linker in that case::
|
|||||||
$ ./a.out
|
$ ./a.out
|
||||||
hello
|
hello
|
||||||
|
|
||||||
|
Predefined options
|
||||||
|
==================
|
||||||
|
|
||||||
|
LLVMC has some built-in options that can't be overridden in the
|
||||||
|
configuration files:
|
||||||
|
|
||||||
|
* ``-o FILE`` - Output file name.
|
||||||
|
|
||||||
|
* ``-x LANGUAGE`` - Specify the language of the following input files
|
||||||
|
until the next -x option.
|
||||||
|
|
||||||
|
* ``-v`` - Enable verbose mode, i.e. print out all executed commands.
|
||||||
|
|
||||||
|
* ``--view-graph`` - Show a graphical representation of the compilation
|
||||||
|
graph. Requires that you have ``dot`` and ``gv`` commands
|
||||||
|
installed. Hidden option, useful for debugging.
|
||||||
|
|
||||||
|
* ``--write-graph`` - Write a ``compilation-graph.dot`` file in the
|
||||||
|
current directory with the compilation graph description in the
|
||||||
|
Graphviz format. Hidden option, useful for debugging.
|
||||||
|
|
||||||
|
|
||||||
Customizing LLVMC: the compilation graph
|
Customizing LLVMC: the compilation graph
|
||||||
----------------------------------------
|
========================================
|
||||||
|
|
||||||
At the time of writing LLVMC does not support on-the-fly reloading of
|
At the time of writing LLVMC does not support on-the-fly reloading of
|
||||||
configuration, so to customize LLVMC you'll have to recompile the
|
configuration, so to customize LLVMC you'll have to recompile the
|
||||||
@ -125,65 +151,8 @@ debugging), run ``llvmc2 --view-graph``. You will need ``dot`` and
|
|||||||
``gsview`` installed for this to work properly.
|
``gsview`` installed for this to work properly.
|
||||||
|
|
||||||
|
|
||||||
The 'case' expression
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
The 'case' construct can be used to calculate weights of the optional
|
|
||||||
edges and to choose between several alternative command line strings
|
|
||||||
in the ``cmd_line`` tool property. It is designed after the
|
|
||||||
similarly-named construct in functional languages and takes the form
|
|
||||||
``(case (test_1), statement_1, (test_2), statement_2, ... (test_N),
|
|
||||||
statement_N)``. The statements are evaluated only if the corresponding
|
|
||||||
tests evaluate to true.
|
|
||||||
|
|
||||||
Examples::
|
|
||||||
|
|
||||||
// Increases edge weight by 5 if "-A" is provided on the
|
|
||||||
// command-line, and by 5 more if "-B" is also provided.
|
|
||||||
(case
|
|
||||||
(switch_on "A"), (inc_weight 5),
|
|
||||||
(switch_on "B"), (inc_weight 5))
|
|
||||||
|
|
||||||
// Evaluates to "cmdline1" if option "-A" is provided on the
|
|
||||||
// command line, otherwise to "cmdline2"
|
|
||||||
(case
|
|
||||||
(switch_on "A"), ("cmdline1"),
|
|
||||||
(default), ("cmdline2"))
|
|
||||||
|
|
||||||
|
|
||||||
* Possible tests are:
|
|
||||||
|
|
||||||
- ``switch_on`` - Returns true if a given command-line option is
|
|
||||||
provided by the user. Example: ``(switch_on "opt")``. Note that
|
|
||||||
you have to define all possible command-line options separately in
|
|
||||||
the tool descriptions. See the next section for the discussion of
|
|
||||||
different kinds of command-line options.
|
|
||||||
|
|
||||||
- ``parameter_equals`` - Returns true if a command-line parameter equals
|
|
||||||
a given value. Example: ``(parameter_equals "W", "all")``.
|
|
||||||
|
|
||||||
- ``element_in_list`` - Returns true if a command-line parameter list
|
|
||||||
includes a given value. Example: ``(parameter_in_list "l", "pthread")``.
|
|
||||||
|
|
||||||
- ``input_languages_contain`` - Returns true if a given language
|
|
||||||
belongs to the current input language set. Example:
|
|
||||||
```(input_languages_contain "c++")``.
|
|
||||||
|
|
||||||
- ``default`` - Always evaluates to true. Should always be the last
|
|
||||||
test in the ``case`` expression.
|
|
||||||
|
|
||||||
- ``and`` - A standard logical combinator that returns true iff all
|
|
||||||
of its arguments return true. Used like this: ``(and (test1),
|
|
||||||
(test2), ... (testN))``. Nesting of ``and`` and ``or`` is allowed,
|
|
||||||
but not encouraged.
|
|
||||||
|
|
||||||
- ``or`` - Another logical combinator that returns true only if any
|
|
||||||
one of its arguments returns true. Example: ``(or (test1),
|
|
||||||
(test2), ... (testN))``.
|
|
||||||
|
|
||||||
|
|
||||||
Writing a tool description
|
Writing a tool description
|
||||||
--------------------------
|
==========================
|
||||||
|
|
||||||
As was said earlier, nodes in the compilation graph represent tools,
|
As was said earlier, nodes in the compilation graph represent tools,
|
||||||
which are described separately. A tool definition looks like this
|
which are described separately. A tool definition looks like this
|
||||||
@ -285,8 +254,8 @@ currently implemented option types and properties are described below:
|
|||||||
- ``required`` - this option is obligatory.
|
- ``required`` - this option is obligatory.
|
||||||
|
|
||||||
|
|
||||||
Hooks and environment variables
|
Using hooks and environment variables in the ``cmd_line`` property
|
||||||
-------------------------------
|
==================================================================
|
||||||
|
|
||||||
Normally, LLVMC executes programs from the system ``PATH``. Sometimes,
|
Normally, LLVMC executes programs from the system ``PATH``. Sometimes,
|
||||||
this is not sufficient: for example, we may want to specify tool names
|
this is not sufficient: for example, we may want to specify tool names
|
||||||
@ -303,7 +272,7 @@ It is also possible to use environment variables in the same manner::
|
|||||||
(cmd_line "$ENV(VAR1)/path/to/file -o $ENV(VAR2)")
|
(cmd_line "$ENV(VAR1)/path/to/file -o $ENV(VAR2)")
|
||||||
|
|
||||||
To change the command line string based on user-provided options use
|
To change the command line string based on user-provided options use
|
||||||
the ``case`` expression (which we have already seen before)::
|
the ``case`` expression (documented below)::
|
||||||
|
|
||||||
(cmd_line
|
(cmd_line
|
||||||
(case
|
(case
|
||||||
@ -312,9 +281,89 @@ the ``case`` expression (which we have already seen before)::
|
|||||||
(default),
|
(default),
|
||||||
"llvm-g++ -c -x c $INFILE -o $OUTFILE -emit-llvm"))
|
"llvm-g++ -c -x c $INFILE -o $OUTFILE -emit-llvm"))
|
||||||
|
|
||||||
|
Conditional evaluation: the ``case`` expression
|
||||||
|
===============================================
|
||||||
|
|
||||||
|
The 'case' construct can be used to calculate weights of the optional
|
||||||
|
edges and to choose between several alternative command line strings
|
||||||
|
in the ``cmd_line`` tool property. It is designed after the
|
||||||
|
similarly-named construct in functional languages and takes the form
|
||||||
|
``(case (test_1), statement_1, (test_2), statement_2, ... (test_N),
|
||||||
|
statement_N)``. The statements are evaluated only if the corresponding
|
||||||
|
tests evaluate to true.
|
||||||
|
|
||||||
|
Examples::
|
||||||
|
|
||||||
|
// Increases edge weight by 5 if "-A" is provided on the
|
||||||
|
// command-line, and by 5 more if "-B" is also provided.
|
||||||
|
(case
|
||||||
|
(switch_on "A"), (inc_weight 5),
|
||||||
|
(switch_on "B"), (inc_weight 5))
|
||||||
|
|
||||||
|
// Evaluates to "cmdline1" if option "-A" is provided on the
|
||||||
|
// command line, otherwise to "cmdline2"
|
||||||
|
(case
|
||||||
|
(switch_on "A"), "cmdline1",
|
||||||
|
(switch_on "B"), "cmdline2",
|
||||||
|
(default), "cmdline3")
|
||||||
|
|
||||||
|
Note the slight difference in 'case' expression handling in contexts
|
||||||
|
of edge weights and command line specification - in the second example
|
||||||
|
the value of the ``"B"`` switch is never checked when switch ``"A"`` is
|
||||||
|
enabled, and the whole expression always evaluates to ``"cmdline1"`` in
|
||||||
|
that case.
|
||||||
|
|
||||||
|
Case expressions can also be nested, i.e. the following is legal::
|
||||||
|
|
||||||
|
(case (switch_on "E"), (case (switch_on "o"), ..., (default), ...)
|
||||||
|
(default), ...)
|
||||||
|
|
||||||
|
You should, however, try to avoid doing that because it hurts
|
||||||
|
readability. It is usually better to split tool descriptions and/or
|
||||||
|
use TableGen inheritance instead.
|
||||||
|
|
||||||
|
* Possible tests are:
|
||||||
|
|
||||||
|
- ``switch_on`` - Returns true if a given command-line option is
|
||||||
|
provided by the user. Example: ``(switch_on "opt")``. Note that
|
||||||
|
you have to define all possible command-line options separately in
|
||||||
|
the tool descriptions. See the next section for the discussion of
|
||||||
|
different kinds of command-line options.
|
||||||
|
|
||||||
|
- ``parameter_equals`` - Returns true if a command-line parameter equals
|
||||||
|
a given value. Example: ``(parameter_equals "W", "all")``.
|
||||||
|
|
||||||
|
- ``element_in_list`` - Returns true if a command-line parameter list
|
||||||
|
includes a given value. Example: ``(parameter_in_list "l", "pthread")``.
|
||||||
|
|
||||||
|
- ``input_languages_contain`` - Returns true if a given language
|
||||||
|
belongs to the current input language set. Example:
|
||||||
|
```(input_languages_contain "c++")``.
|
||||||
|
|
||||||
|
- ``in_language`` - Evaluates to true if the language of the input
|
||||||
|
file equals to the argument. Valid only when using ``case``
|
||||||
|
expression in a ``cmd_line`` tool property. Example:
|
||||||
|
```(in_language "c++")``.
|
||||||
|
|
||||||
|
- ``not_empty`` - Returns true if a given option (which should be
|
||||||
|
either a parameter or a parameter list) is set by the
|
||||||
|
user. Example: ```(not_empty "o")``.
|
||||||
|
|
||||||
|
- ``default`` - Always evaluates to true. Should always be the last
|
||||||
|
test in the ``case`` expression.
|
||||||
|
|
||||||
|
- ``and`` - A standard logical combinator that returns true iff all
|
||||||
|
of its arguments return true. Used like this: ``(and (test1),
|
||||||
|
(test2), ... (testN))``. Nesting of ``and`` and ``or`` is allowed,
|
||||||
|
but not encouraged.
|
||||||
|
|
||||||
|
- ``or`` - Another logical combinator that returns true only if any
|
||||||
|
one of its arguments returns true. Example: ``(or (test1),
|
||||||
|
(test2), ... (testN))``.
|
||||||
|
|
||||||
|
|
||||||
Language map
|
Language map
|
||||||
------------
|
============
|
||||||
|
|
||||||
One last thing that you will need to modify when adding support for a
|
One last thing that you will need to modify when adding support for a
|
||||||
new language to LLVMC is the language map, which defines mappings from
|
new language to LLVMC is the language map, which defines mappings from
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
======================
|
||||||
Tutorial - Using LLVMC
|
Tutorial - Using LLVMC
|
||||||
======================
|
======================
|
||||||
|
|
||||||
@ -6,8 +7,12 @@ as the ``gcc`` program does for GCC - the difference being that LLVMC
|
|||||||
is designed to be more adaptable and easier to customize. This
|
is designed to be more adaptable and easier to customize. This
|
||||||
tutorial describes the basic usage and configuration of LLVMC.
|
tutorial describes the basic usage and configuration of LLVMC.
|
||||||
|
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
|
||||||
|
|
||||||
Compiling with LLVMC
|
Compiling with LLVMC
|
||||||
--------------------
|
====================
|
||||||
|
|
||||||
In general, LLVMC tries to be command-line compatible with ``gcc`` as
|
In general, LLVMC tries to be command-line compatible with ``gcc`` as
|
||||||
much as possible, so most of the familiar options work::
|
much as possible, so most of the familiar options work::
|
||||||
@ -20,7 +25,7 @@ For further help on command-line LLVMC usage, refer to the ``llvmc
|
|||||||
--help`` output.
|
--help`` output.
|
||||||
|
|
||||||
Using LLVMC to generate toolchain drivers
|
Using LLVMC to generate toolchain drivers
|
||||||
-----------------------------------------
|
=========================================
|
||||||
|
|
||||||
At the time of writing LLVMC does not support on-the-fly reloading of
|
At the time of writing LLVMC does not support on-the-fly reloading of
|
||||||
configuration, so it will be necessary to recompile its source
|
configuration, so it will be necessary to recompile its source
|
||||||
|
Loading…
x
Reference in New Issue
Block a user