~louis/ubuntu/trusty/clamav/lp799623_fix_logrotate

« back to all changes in this revision

Viewing changes to libclamav/c++/llvm/tools/llvmc/doc/LLVMC-Reference.rst

  • Committer: Bazaar Package Importer
  • Author(s): Scott Kitterman
  • Date: 2010-03-12 11:30:04 UTC
  • mfrom: (0.41.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20100312113004-b0fop4bkycszdd0z
Tags: 0.96~rc1+dfsg-0ubuntu1
* New upstream RC - FFE (LP: #537636):
  - Add OfficialDatabaseOnly option to clamav-base.postinst.in
  - Add LocalSocketGroup option to clamav-base.postinst.in
  - Add LocalSocketMode option to clamav-base.postinst.in
  - Add CrossFilesystems option to clamav-base.postinst.in
  - Add ClamukoScannerCount option to clamav-base.postinst.in
  - Add BytecodeSecurity opiton to clamav-base.postinst.in
  - Add DetectionStatsHostID option to clamav-freshclam.postinst.in
  - Add Bytecode option to clamav-freshclam.postinst.in
  - Add MilterSocketGroup option to clamav-milter.postinst.in
  - Add MilterSocketMode option to clamav-milter.postinst.in
  - Add ReportHostname option to clamav-milter.postinst.in
  - Bump libclamav SO version to 6.1.0 in libclamav6.install
  - Drop clamdmon from clamav.examples (no longer shipped by upstream)
  - Drop libclamav.a from libclamav-dev.install (not built by upstream)
  - Update SO version for lintian override for libclamav6
  - Add new Bytecode Testing Tool, usr/bin/clambc, to clamav.install
  - Add build-depends on python and python-setuptools for new test suite
  - Update debian/copyright for the embedded copy of llvm (using the system
    llvm is not currently feasible)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
===================================
 
2
Customizing LLVMC: Reference Manual
 
3
===================================
 
4
..
 
5
   This file was automatically generated by rst2html.
 
6
   Please do not edit directly!
 
7
   The ReST source lives in the directory 'tools/llvmc/doc'.
 
8
 
 
9
.. contents::
 
10
 
 
11
.. raw:: html
 
12
 
 
13
   <div class="doc_author">
 
14
   <p>Written by <a href="mailto:foldr@codedgers.com">Mikhail Glushenkov</a></p>
 
15
   </div>
 
16
 
 
17
Introduction
 
18
============
 
19
 
 
20
LLVMC is a generic compiler driver, designed to be customizable and
 
21
extensible. It plays the same role for LLVM as the ``gcc`` program
 
22
does for GCC - LLVMC's job is essentially to transform a set of input
 
23
files into a set of targets depending on configuration rules and user
 
24
options. What makes LLVMC different is that these transformation rules
 
25
are completely customizable - in fact, LLVMC knows nothing about the
 
26
specifics of transformation (even the command-line options are mostly
 
27
not hard-coded) and regards the transformation structure as an
 
28
abstract graph. The structure of this graph is completely determined
 
29
by plugins, which can be either statically or dynamically linked. This
 
30
makes it possible to easily adapt LLVMC for other purposes - for
 
31
example, as a build tool for game resources.
 
32
 
 
33
Because LLVMC employs TableGen_ as its configuration language, you
 
34
need to be familiar with it to customize LLVMC.
 
35
 
 
36
.. _TableGen: http://llvm.org/docs/TableGenFundamentals.html
 
37
 
 
38
 
 
39
Compiling with LLVMC
 
40
====================
 
41
 
 
42
LLVMC tries hard to be as compatible with ``gcc`` as possible,
 
43
although there are some small differences. Most of the time, however,
 
44
you shouldn't be able to notice them::
 
45
 
 
46
     $ # This works as expected:
 
47
     $ llvmc -O3 -Wall hello.cpp
 
48
     $ ./a.out
 
49
     hello
 
50
 
 
51
One nice feature of LLVMC is that one doesn't have to distinguish between
 
52
different compilers for different languages (think ``g++`` vs.  ``gcc``) - the
 
53
right toolchain is chosen automatically based on input language names (which
 
54
are, in turn, determined from file extensions). If you want to force files
 
55
ending with ".c" to compile as C++, use the ``-x`` option, just like you would
 
56
do it with ``gcc``::
 
57
 
 
58
      $ # hello.c is really a C++ file
 
59
      $ llvmc -x c++ hello.c
 
60
      $ ./a.out
 
61
      hello
 
62
 
 
63
On the other hand, when using LLVMC as a linker to combine several C++
 
64
object files you should provide the ``--linker`` option since it's
 
65
impossible for LLVMC to choose the right linker in that case::
 
66
 
 
67
    $ llvmc -c hello.cpp
 
68
    $ llvmc hello.o
 
69
    [A lot of link-time errors skipped]
 
70
    $ llvmc --linker=c++ hello.o
 
71
    $ ./a.out
 
72
    hello
 
73
 
 
74
By default, LLVMC uses ``llvm-gcc`` to compile the source code. It is also
 
75
possible to choose the ``clang`` compiler with the ``-clang`` option.
 
76
 
 
77
 
 
78
Predefined options
 
79
==================
 
80
 
 
81
LLVMC has some built-in options that can't be overridden in the
 
82
configuration libraries:
 
83
 
 
84
* ``-o FILE`` - Output file name.
 
85
 
 
86
* ``-x LANGUAGE`` - Specify the language of the following input files
 
87
  until the next -x option.
 
88
 
 
89
* ``-load PLUGIN_NAME`` - Load the specified plugin DLL. Example:
 
90
  ``-load $LLVM_DIR/Release/lib/LLVMCSimple.so``.
 
91
 
 
92
* ``-v`` - Enable verbose mode, i.e. print out all executed commands.
 
93
 
 
94
* ``--save-temps`` - Write temporary files to the current directory and do not
 
95
  delete them on exit. This option can also take an argument: the
 
96
  ``--save-temps=obj`` switch will write files into the directory specified with
 
97
  the ``-o`` option. The ``--save-temps=cwd`` and ``--save-temps`` switches are
 
98
  both synonyms for the default behaviour.
 
99
 
 
100
* ``--temp-dir DIRECTORY`` - Store temporary files in the given directory. This
 
101
  directory is deleted on exit unless ``--save-temps`` is specified. If
 
102
  ``--save-temps=obj`` is also specified, ``--temp-dir`` is given the
 
103
  precedence.
 
104
 
 
105
* ``--check-graph`` - Check the compilation for common errors like mismatched
 
106
  output/input language names, multiple default edges and cycles. Because of
 
107
  plugins, these checks can't be performed at compile-time. Exit with code zero
 
108
  if no errors were found, and return the number of found errors
 
109
  otherwise. Hidden option, useful for debugging LLVMC plugins.
 
110
 
 
111
* ``--view-graph`` - Show a graphical representation of the compilation graph
 
112
  and exit. Requires that you have ``dot`` and ``gv`` programs installed. Hidden
 
113
  option, useful for debugging LLVMC plugins.
 
114
 
 
115
* ``--write-graph`` - Write a ``compilation-graph.dot`` file in the current
 
116
  directory with the compilation graph description in Graphviz format (identical
 
117
  to the file used by the ``--view-graph`` option). The ``-o`` option can be
 
118
  used to set the output file name. Hidden option, useful for debugging LLVMC
 
119
  plugins.
 
120
 
 
121
* ``--help``, ``--help-hidden``, ``--version`` - These options have
 
122
  their standard meaning.
 
123
 
 
124
Compiling LLVMC plugins
 
125
=======================
 
126
 
 
127
It's easiest to start working on your own LLVMC plugin by copying the
 
128
skeleton project which lives under ``$LLVMC_DIR/plugins/Simple``::
 
129
 
 
130
   $ cd $LLVMC_DIR/plugins
 
131
   $ cp -r Simple MyPlugin
 
132
   $ cd MyPlugin
 
133
   $ ls
 
134
   Makefile PluginMain.cpp Simple.td
 
135
 
 
136
As you can see, our basic plugin consists of only two files (not
 
137
counting the build script). ``Simple.td`` contains TableGen
 
138
description of the compilation graph; its format is documented in the
 
139
following sections. ``PluginMain.cpp`` is just a helper file used to
 
140
compile the auto-generated C++ code produced from TableGen source. It
 
141
can also contain hook definitions (see `below`__).
 
142
 
 
143
__ hooks_
 
144
 
 
145
The first thing that you should do is to change the ``LLVMC_PLUGIN``
 
146
variable in the ``Makefile`` to avoid conflicts (since this variable
 
147
is used to name the resulting library)::
 
148
 
 
149
   LLVMC_PLUGIN=MyPlugin
 
150
 
 
151
It is also a good idea to rename ``Simple.td`` to something less
 
152
generic::
 
153
 
 
154
   $ mv Simple.td MyPlugin.td
 
155
 
 
156
To build your plugin as a dynamic library, just ``cd`` to its source
 
157
directory and run ``make``. The resulting file will be called
 
158
``plugin_llvmc_$(LLVMC_PLUGIN).$(DLL_EXTENSION)`` (in our case,
 
159
``plugin_llvmc_MyPlugin.so``). This library can be then loaded in with the
 
160
``-load`` option. Example::
 
161
 
 
162
    $ cd $LLVMC_DIR/plugins/Simple
 
163
    $ make
 
164
    $ llvmc -load $LLVM_DIR/Release/lib/plugin_llvmc_Simple.so
 
165
 
 
166
Compiling standalone LLVMC-based drivers
 
167
========================================
 
168
 
 
169
By default, the ``llvmc`` executable consists of a driver core plus several
 
170
statically linked plugins (``Base`` and ``Clang`` at the moment). You can
 
171
produce a standalone LLVMC-based driver executable by linking the core with your
 
172
own plugins. The recommended way to do this is by starting with the provided
 
173
``Skeleton`` example (``$LLVMC_DIR/example/Skeleton``)::
 
174
 
 
175
    $ cd $LLVMC_DIR/example/
 
176
    $ cp -r Skeleton mydriver
 
177
    $ cd mydriver
 
178
    $ vim Makefile
 
179
    [...]
 
180
    $ make
 
181
 
 
182
If you're compiling LLVM with different source and object directories, then you
 
183
must perform the following additional steps before running ``make``::
 
184
 
 
185
    # LLVMC_SRC_DIR = $LLVM_SRC_DIR/tools/llvmc/
 
186
    # LLVMC_OBJ_DIR = $LLVM_OBJ_DIR/tools/llvmc/
 
187
    $ cp $LLVMC_SRC_DIR/example/mydriver/Makefile \
 
188
      $LLVMC_OBJ_DIR/example/mydriver/
 
189
    $ cd $LLVMC_OBJ_DIR/example/mydriver
 
190
    $ make
 
191
 
 
192
Another way to do the same thing is by using the following command::
 
193
 
 
194
    $ cd $LLVMC_DIR
 
195
    $ make LLVMC_BUILTIN_PLUGINS=MyPlugin LLVMC_BASED_DRIVER_NAME=mydriver
 
196
 
 
197
This works with both srcdir == objdir and srcdir != objdir, but assumes that the
 
198
plugin source directory was placed under ``$LLVMC_DIR/plugins``.
 
199
 
 
200
Sometimes, you will want a 'bare-bones' version of LLVMC that has no
 
201
built-in plugins. It can be compiled with the following command::
 
202
 
 
203
    $ cd $LLVMC_DIR
 
204
    $ make LLVMC_BUILTIN_PLUGINS=""
 
205
 
 
206
 
 
207
Customizing LLVMC: the compilation graph
 
208
========================================
 
209
 
 
210
Each TableGen configuration file should include the common
 
211
definitions::
 
212
 
 
213
   include "llvm/CompilerDriver/Common.td"
 
214
 
 
215
Internally, LLVMC stores information about possible source
 
216
transformations in form of a graph. Nodes in this graph represent
 
217
tools, and edges between two nodes represent a transformation path. A
 
218
special "root" node is used to mark entry points for the
 
219
transformations. LLVMC also assigns a weight to each edge (more on
 
220
this later) to choose between several alternative edges.
 
221
 
 
222
The definition of the compilation graph (see file
 
223
``plugins/Base/Base.td`` for an example) is just a list of edges::
 
224
 
 
225
    def CompilationGraph : CompilationGraph<[
 
226
        Edge<"root", "llvm_gcc_c">,
 
227
        Edge<"root", "llvm_gcc_assembler">,
 
228
        ...
 
229
 
 
230
        Edge<"llvm_gcc_c", "llc">,
 
231
        Edge<"llvm_gcc_cpp", "llc">,
 
232
        ...
 
233
 
 
234
        OptionalEdge<"llvm_gcc_c", "opt", (case (switch_on "opt"),
 
235
                                          (inc_weight))>,
 
236
        OptionalEdge<"llvm_gcc_cpp", "opt", (case (switch_on "opt"),
 
237
                                                  (inc_weight))>,
 
238
        ...
 
239
 
 
240
        OptionalEdge<"llvm_gcc_assembler", "llvm_gcc_cpp_linker",
 
241
            (case (input_languages_contain "c++"), (inc_weight),
 
242
                  (or (parameter_equals "linker", "g++"),
 
243
                      (parameter_equals "linker", "c++")), (inc_weight))>,
 
244
        ...
 
245
 
 
246
        ]>;
 
247
 
 
248
As you can see, the edges can be either default or optional, where
 
249
optional edges are differentiated by an additional ``case`` expression
 
250
used to calculate the weight of this edge. Notice also that we refer
 
251
to tools via their names (as strings). This makes it possible to add
 
252
edges to an existing compilation graph in plugins without having to
 
253
know about all tool definitions used in the graph.
 
254
 
 
255
The default edges are assigned a weight of 1, and optional edges get a
 
256
weight of 0 + 2*N where N is the number of tests that evaluated to
 
257
true in the ``case`` expression. It is also possible to provide an
 
258
integer parameter to ``inc_weight`` and ``dec_weight`` - in this case,
 
259
the weight is increased (or decreased) by the provided value instead
 
260
of the default 2. It is also possible to change the default weight of
 
261
an optional edge by using the ``default`` clause of the ``case``
 
262
construct.
 
263
 
 
264
When passing an input file through the graph, LLVMC picks the edge
 
265
with the maximum weight. To avoid ambiguity, there should be only one
 
266
default edge between two nodes (with the exception of the root node,
 
267
which gets a special treatment - there you are allowed to specify one
 
268
default edge *per language*).
 
269
 
 
270
When multiple plugins are loaded, their compilation graphs are merged
 
271
together. Since multiple edges that have the same end nodes are not
 
272
allowed (i.e. the graph is not a multigraph), an edge defined in
 
273
several plugins will be replaced by the definition from the plugin
 
274
that was loaded last. Plugin load order can be controlled by using the
 
275
plugin priority feature described above.
 
276
 
 
277
To get a visual representation of the compilation graph (useful for
 
278
debugging), run ``llvmc --view-graph``. You will need ``dot`` and
 
279
``gsview`` installed for this to work properly.
 
280
 
 
281
Describing options
 
282
==================
 
283
 
 
284
Command-line options that the plugin supports are defined by using an
 
285
``OptionList``::
 
286
 
 
287
    def Options : OptionList<[
 
288
    (switch_option "E", (help "Help string")),
 
289
    (alias_option "quiet", "q")
 
290
    ...
 
291
    ]>;
 
292
 
 
293
As you can see, the option list is just a list of DAGs, where each DAG
 
294
is an option description consisting of the option name and some
 
295
properties. A plugin can define more than one option list (they are
 
296
all merged together in the end), which can be handy if one wants to
 
297
separate option groups syntactically.
 
298
 
 
299
* Possible option types:
 
300
 
 
301
   - ``switch_option`` - a simple boolean switch without arguments, for example
 
302
     ``-O2`` or ``-time``. At most one occurrence is allowed.
 
303
 
 
304
   - ``parameter_option`` - option that takes one argument, for example
 
305
     ``-std=c99``. It is also allowed to use spaces instead of the equality
 
306
     sign: ``-std c99``. At most one occurrence is allowed.
 
307
 
 
308
   - ``parameter_list_option`` - same as the above, but more than one option
 
309
     occurence is allowed.
 
310
 
 
311
   - ``prefix_option`` - same as the parameter_option, but the option name and
 
312
     argument do not have to be separated. Example: ``-ofile``. This can be also
 
313
     specified as ``-o file``; however, ``-o=file`` will be parsed incorrectly
 
314
     (``=file`` will be interpreted as option value). At most one occurrence is
 
315
     allowed.
 
316
 
 
317
   - ``prefix_list_option`` - same as the above, but more than one occurence of
 
318
     the option is allowed; example: ``-lm -lpthread``.
 
319
 
 
320
   - ``alias_option`` - a special option type for creating aliases. Unlike other
 
321
     option types, aliases are not allowed to have any properties besides the
 
322
     aliased option name. Usage example: ``(alias_option "preprocess", "E")``
 
323
 
 
324
 
 
325
* Possible option properties:
 
326
 
 
327
   - ``help`` - help string associated with this option. Used for ``--help``
 
328
     output.
 
329
 
 
330
   - ``required`` - this option must be specified exactly once (or, in case of
 
331
     the list options without the ``multi_val`` property, at least
 
332
     once). Incompatible with ``optional`` and ``one_or_more``.
 
333
 
 
334
   - ``optional`` - the option can be specified either zero times or exactly
 
335
     once. The default for switch options. Useful only for list options in
 
336
     conjunction with ``multi_val``. Incompatible with ``required``,
 
337
     ``zero_or_more`` and ``one_or_more``.
 
338
 
 
339
   - ``one_or_more`` - the option must be specified at least once. Can be useful
 
340
     to allow switch options be both obligatory and be specified multiple
 
341
     times. For list options is useful only in conjunction with ``multi_val``;
 
342
     for ordinary it is synonymous with ``required``. Incompatible with
 
343
     ``required``, ``optional`` and ``zero_or_more``.
 
344
 
 
345
   - ``zero_or_more`` - the option can be specified zero or more times. Useful
 
346
     to allow a single switch option to be specified more than
 
347
     once. Incompatible with ``required``, ``optional`` and ``one_or_more``.
 
348
 
 
349
   - ``hidden`` - the description of this option will not appear in
 
350
     the ``--help`` output (but will appear in the ``--help-hidden``
 
351
     output).
 
352
 
 
353
   - ``really_hidden`` - the option will not be mentioned in any help
 
354
     output.
 
355
 
 
356
   - ``comma_separated`` - Indicates that any commas specified for an option's
 
357
     value should be used to split the value up into multiple values for the
 
358
     option. This property is valid only for list options. In conjunction with
 
359
     ``forward_value`` can be used to implement option forwarding in style of
 
360
     gcc's ``-Wa,``.
 
361
 
 
362
   - ``multi_val n`` - this option takes *n* arguments (can be useful in some
 
363
     special cases). Usage example: ``(parameter_list_option "foo", (multi_val
 
364
     3))``; the command-line syntax is '-foo a b c'. Only list options can have
 
365
     this attribute; you can, however, use the ``one_or_more``, ``optional``
 
366
     and ``required`` properties.
 
367
 
 
368
   - ``init`` - this option has a default value, either a string (if it is a
 
369
     parameter), or a boolean (if it is a switch; as in C++, boolean constants
 
370
     are called ``true`` and ``false``). List options can't have ``init``
 
371
     attribute.
 
372
     Usage examples: ``(switch_option "foo", (init true))``; ``(prefix_option
 
373
     "bar", (init "baz"))``.
 
374
 
 
375
   - ``extern`` - this option is defined in some other plugin, see `below`__.
 
376
 
 
377
   __ extern_
 
378
 
 
379
.. _extern:
 
380
 
 
381
External options
 
382
----------------
 
383
 
 
384
Sometimes, when linking several plugins together, one plugin needs to
 
385
access options defined in some other plugin. Because of the way
 
386
options are implemented, such options must be marked as
 
387
``extern``. This is what the ``extern`` option property is
 
388
for. Example::
 
389
 
 
390
     ...
 
391
     (switch_option "E", (extern))
 
392
     ...
 
393
 
 
394
If an external option has additional attributes besides 'extern', they are
 
395
ignored. See also the section on plugin `priorities`__.
 
396
 
 
397
__ priorities_
 
398
 
 
399
.. _case:
 
400
 
 
401
Conditional evaluation
 
402
======================
 
403
 
 
404
The 'case' construct is the main means by which programmability is
 
405
achieved in LLVMC. It can be used to calculate edge weights, program
 
406
actions and modify the shell commands to be executed. The 'case'
 
407
expression is designed after the similarly-named construct in
 
408
functional languages and takes the form ``(case (test_1), statement_1,
 
409
(test_2), statement_2, ... (test_N), statement_N)``. The statements
 
410
are evaluated only if the corresponding tests evaluate to true.
 
411
 
 
412
Examples::
 
413
 
 
414
    // Edge weight calculation
 
415
 
 
416
    // Increases edge weight by 5 if "-A" is provided on the
 
417
    // command-line, and by 5 more if "-B" is also provided.
 
418
    (case
 
419
        (switch_on "A"), (inc_weight 5),
 
420
        (switch_on "B"), (inc_weight 5))
 
421
 
 
422
 
 
423
    // Tool command line specification
 
424
 
 
425
    // Evaluates to "cmdline1" if the option "-A" is provided on the
 
426
    // command line; to "cmdline2" if "-B" is provided;
 
427
    // otherwise to "cmdline3".
 
428
 
 
429
    (case
 
430
        (switch_on "A"), "cmdline1",
 
431
        (switch_on "B"), "cmdline2",
 
432
        (default), "cmdline3")
 
433
 
 
434
Note the slight difference in 'case' expression handling in contexts
 
435
of edge weights and command line specification - in the second example
 
436
the value of the ``"B"`` switch is never checked when switch ``"A"`` is
 
437
enabled, and the whole expression always evaluates to ``"cmdline1"`` in
 
438
that case.
 
439
 
 
440
Case expressions can also be nested, i.e. the following is legal::
 
441
 
 
442
    (case (switch_on "E"), (case (switch_on "o"), ..., (default), ...)
 
443
          (default), ...)
 
444
 
 
445
You should, however, try to avoid doing that because it hurts
 
446
readability. It is usually better to split tool descriptions and/or
 
447
use TableGen inheritance instead.
 
448
 
 
449
* Possible tests are:
 
450
 
 
451
  - ``switch_on`` - Returns true if a given command-line switch is provided by
 
452
    the user. Can be given a list as argument, in that case ``(switch_on ["foo",
 
453
    "bar", "baz"])`` is equivalent to ``(and (switch_on "foo"), (switch_on
 
454
    "bar"), (switch_on "baz"))``.
 
455
    Example: ``(switch_on "opt")``.
 
456
 
 
457
  - ``any_switch_on`` - Given a list of switch options, returns true if any of
 
458
    the switches is turned on.
 
459
    Example: ``(any_switch_on ["foo", "bar", "baz"])`` is equivalent to ``(or
 
460
    (switch_on "foo"), (switch_on "bar"), (switch_on "baz"))``.
 
461
 
 
462
  - ``parameter_equals`` - Returns true if a command-line parameter equals
 
463
    a given value.
 
464
    Example: ``(parameter_equals "W", "all")``.
 
465
 
 
466
  - ``element_in_list`` - Returns true if a command-line parameter
 
467
    list contains a given value.
 
468
    Example: ``(element_in_list "l", "pthread")``.
 
469
 
 
470
  - ``input_languages_contain`` - Returns true if a given language
 
471
    belongs to the current input language set.
 
472
    Example: ``(input_languages_contain "c++")``.
 
473
 
 
474
  - ``in_language`` - Evaluates to true if the input file language is equal to
 
475
    the argument. At the moment works only with ``cmd_line`` and ``actions`` (on
 
476
    non-join nodes).
 
477
    Example: ``(in_language "c++")``.
 
478
 
 
479
  - ``not_empty`` - Returns true if a given option (which should be either a
 
480
    parameter or a parameter list) is set by the user. Like ``switch_on``, can
 
481
    be also given a list as argument.
 
482
    Example: ``(not_empty "o")``.
 
483
 
 
484
  - ``any_not_empty`` - Returns true if ``not_empty`` returns true for any of
 
485
    the options in the list.
 
486
    Example: ``(any_not_empty ["foo", "bar", "baz"])`` is equivalent to ``(or
 
487
    (not_empty "foo"), (not_empty "bar"), (not_empty "baz"))``.
 
488
 
 
489
  - ``empty`` - The opposite of ``not_empty``. Equivalent to ``(not (not_empty
 
490
    X))``. Provided for convenience. Can be given a list as argument.
 
491
 
 
492
  - ``any_not_empty`` - Returns true if ``not_empty`` returns true for any of
 
493
    the options in the list.
 
494
    Example: ``(any_empty ["foo", "bar", "baz"])`` is equivalent to ``(not (and
 
495
    (not_empty "foo"), (not_empty "bar"), (not_empty "baz")))``.
 
496
 
 
497
  - ``single_input_file`` - Returns true if there was only one input file
 
498
    provided on the command-line. Used without arguments:
 
499
    ``(single_input_file)``.
 
500
 
 
501
  - ``multiple_input_files`` - Equivalent to ``(not (single_input_file))`` (the
 
502
    case of zero input files is considered an error).
 
503
 
 
504
  - ``default`` - Always evaluates to true. Should always be the last
 
505
    test in the ``case`` expression.
 
506
 
 
507
  - ``and`` - A standard binary logical combinator that returns true iff all of
 
508
    its arguments return true. Used like this: ``(and (test1), (test2),
 
509
    ... (testN))``. Nesting of ``and`` and ``or`` is allowed, but not
 
510
    encouraged.
 
511
 
 
512
  - ``or`` - A binary logical combinator that returns true iff any of its
 
513
    arguments returns true. Example: ``(or (test1), (test2), ... (testN))``.
 
514
 
 
515
  - ``not`` - Standard unary logical combinator that negates its
 
516
    argument. Example: ``(not (or (test1), (test2), ... (testN)))``.
 
517
 
 
518
 
 
519
 
 
520
Writing a tool description
 
521
==========================
 
522
 
 
523
As was said earlier, nodes in the compilation graph represent tools,
 
524
which are described separately. A tool definition looks like this
 
525
(taken from the ``include/llvm/CompilerDriver/Tools.td`` file)::
 
526
 
 
527
  def llvm_gcc_cpp : Tool<[
 
528
      (in_language "c++"),
 
529
      (out_language "llvm-assembler"),
 
530
      (output_suffix "bc"),
 
531
      (cmd_line "llvm-g++ -c $INFILE -o $OUTFILE -emit-llvm"),
 
532
      (sink)
 
533
      ]>;
 
534
 
 
535
This defines a new tool called ``llvm_gcc_cpp``, which is an alias for
 
536
``llvm-g++``. As you can see, a tool definition is just a list of
 
537
properties; most of them should be self-explanatory. The ``sink``
 
538
property means that this tool should be passed all command-line
 
539
options that aren't mentioned in the option list.
 
540
 
 
541
The complete list of all currently implemented tool properties follows.
 
542
 
 
543
* Possible tool properties:
 
544
 
 
545
  - ``in_language`` - input language name. Can be either a string or a
 
546
    list, in case the tool supports multiple input languages.
 
547
 
 
548
  - ``out_language`` - output language name. Multiple output languages are not
 
549
    allowed.
 
550
 
 
551
  - ``output_suffix`` - output file suffix. Can also be changed
 
552
    dynamically, see documentation on actions.
 
553
 
 
554
  - ``cmd_line`` - the actual command used to run the tool. You can
 
555
    use ``$INFILE`` and ``$OUTFILE`` variables, output redirection
 
556
    with ``>``, hook invocations (``$CALL``), environment variables
 
557
    (via ``$ENV``) and the ``case`` construct.
 
558
 
 
559
  - ``join`` - this tool is a "join node" in the graph, i.e. it gets a
 
560
    list of input files and joins them together. Used for linkers.
 
561
 
 
562
  - ``sink`` - all command-line options that are not handled by other
 
563
    tools are passed to this tool.
 
564
 
 
565
  - ``actions`` - A single big ``case`` expression that specifies how
 
566
    this tool reacts on command-line options (described in more detail
 
567
    `below`__).
 
568
 
 
569
__ actions_
 
570
 
 
571
.. _actions:
 
572
 
 
573
Actions
 
574
-------
 
575
 
 
576
A tool often needs to react to command-line options, and this is
 
577
precisely what the ``actions`` property is for. The next example
 
578
illustrates this feature::
 
579
 
 
580
  def llvm_gcc_linker : Tool<[
 
581
      (in_language "object-code"),
 
582
      (out_language "executable"),
 
583
      (output_suffix "out"),
 
584
      (cmd_line "llvm-gcc $INFILE -o $OUTFILE"),
 
585
      (join),
 
586
      (actions (case (not_empty "L"), (forward "L"),
 
587
                     (not_empty "l"), (forward "l"),
 
588
                     (not_empty "dummy"),
 
589
                               [(append_cmd "-dummy1"), (append_cmd "-dummy2")])
 
590
      ]>;
 
591
 
 
592
The ``actions`` tool property is implemented on top of the omnipresent
 
593
``case`` expression. It associates one or more different *actions*
 
594
with given conditions - in the example, the actions are ``forward``,
 
595
which forwards a given option unchanged, and ``append_cmd``, which
 
596
appends a given string to the tool execution command. Multiple actions
 
597
can be associated with a single condition by using a list of actions
 
598
(used in the example to append some dummy options). The same ``case``
 
599
construct can also be used in the ``cmd_line`` property to modify the
 
600
tool command line.
 
601
 
 
602
The "join" property used in the example means that this tool behaves
 
603
like a linker.
 
604
 
 
605
The list of all possible actions follows.
 
606
 
 
607
* Possible actions:
 
608
 
 
609
   - ``append_cmd`` - Append a string to the tool invocation command.
 
610
     Example: ``(case (switch_on "pthread"), (append_cmd "-lpthread"))``.
 
611
 
 
612
   - ``error`` - Exit with error.
 
613
     Example: ``(error "Mixing -c and -S is not allowed!")``.
 
614
 
 
615
   - ``warning`` - Print a warning.
 
616
     Example: ``(warning "Specifying both -O1 and -O2 is meaningless!")``.
 
617
 
 
618
   - ``forward`` - Forward the option unchanged.
 
619
     Example: ``(forward "Wall")``.
 
620
 
 
621
   - ``forward_as`` - Change the option's name, but forward the argument
 
622
     unchanged.
 
623
     Example: ``(forward_as "O0", "--disable-optimization")``.
 
624
 
 
625
   - ``forward_value`` - Forward only option's value. Cannot be used with switch
 
626
     options (since they don't have values), but works fine with lists.
 
627
     Example: ``(forward_value "Wa,")``.
 
628
 
 
629
   - ``forward_transformed_value`` - As above, but applies a hook to the
 
630
     option's value before forwarding (see `below`__). When
 
631
     ``forward_transformed_value`` is applied to a list
 
632
     option, the hook must have signature
 
633
     ``std::string hooks::HookName (const std::vector<std::string>&)``.
 
634
     Example: ``(forward_transformed_value "m", "ConvertToMAttr")``.
 
635
 
 
636
     __ hooks_
 
637
 
 
638
   - ``output_suffix`` - Modify the output suffix of this tool.
 
639
     Example: ``(output_suffix "i")``.
 
640
 
 
641
   - ``stop_compilation`` - Stop compilation after this tool processes its
 
642
     input. Used without arguments.
 
643
     Example: ``(stop_compilation)``.
 
644
 
 
645
 
 
646
Language map
 
647
============
 
648
 
 
649
If you are adding support for a new language to LLVMC, you'll need to
 
650
modify the language map, which defines mappings from file extensions
 
651
to language names. It is used to choose the proper toolchain(s) for a
 
652
given input file set. Language map definition looks like this::
 
653
 
 
654
    def LanguageMap : LanguageMap<
 
655
        [LangToSuffixes<"c++", ["cc", "cp", "cxx", "cpp", "CPP", "c++", "C"]>,
 
656
         LangToSuffixes<"c", ["c"]>,
 
657
         ...
 
658
        ]>;
 
659
 
 
660
For example, without those definitions the following command wouldn't work::
 
661
 
 
662
    $ llvmc hello.cpp
 
663
    llvmc: Unknown suffix: cpp
 
664
 
 
665
The language map entries are needed only for the tools that are linked from the
 
666
root node. Since a tool can't have multiple output languages, for inner nodes of
 
667
the graph the input and output languages should match. This is enforced at
 
668
compile-time.
 
669
 
 
670
Option preprocessor
 
671
===================
 
672
 
 
673
It is sometimes useful to run error-checking code before processing the
 
674
compilation graph. For example, if optimization options "-O1" and "-O2" are
 
675
implemented as switches, we might want to output a warning if the user invokes
 
676
the driver with both of these options enabled.
 
677
 
 
678
The ``OptionPreprocessor`` feature is reserved specially for these
 
679
occasions. Example (adapted from the built-in Base plugin)::
 
680
 
 
681
 
 
682
    def Preprocess : OptionPreprocessor<
 
683
    (case (not (any_switch_on ["O0", "O1", "O2", "O3"])),
 
684
               (set_option "O2"),
 
685
          (and (switch_on "O3"), (any_switch_on ["O0", "O1", "O2"])),
 
686
               (unset_option ["O0", "O1", "O2"]),
 
687
          (and (switch_on "O2"), (any_switch_on ["O0", "O1"])),
 
688
               (unset_option ["O0", "O1"]),
 
689
          (and (switch_on "O1"), (switch_on "O0")),
 
690
               (unset_option "O0"))
 
691
    >;
 
692
 
 
693
Here, ``OptionPreprocessor`` is used to unset all spurious ``-O`` options so
 
694
that they are not forwarded to the compiler. If no optimization options are
 
695
specified, ``-O2`` is enabled.
 
696
 
 
697
``OptionPreprocessor`` is basically a single big ``case`` expression, which is
 
698
evaluated only once right after the plugin is loaded. The only allowed actions
 
699
in ``OptionPreprocessor`` are ``error``, ``warning``, and two special actions:
 
700
``unset_option`` and ``set_option``. As their names suggest, they can be used to
 
701
set or unset a given option. To set an option with ``set_option``, use the
 
702
two-argument form: ``(set_option "parameter", VALUE)``. Here, ``VALUE`` can be
 
703
either a string, a string list, or a boolean constant.
 
704
 
 
705
For convenience, ``set_option`` and ``unset_option`` also work on lists. That
 
706
is, instead of ``[(unset_option "A"), (unset_option "B")]`` you can use
 
707
``(unset_option ["A", "B"])``. Obviously, ``(set_option ["A", "B"])`` is valid
 
708
only if both ``A`` and ``B`` are switches.
 
709
 
 
710
 
 
711
More advanced topics
 
712
====================
 
713
 
 
714
.. _hooks:
 
715
 
 
716
Hooks and environment variables
 
717
-------------------------------
 
718
 
 
719
Normally, LLVMC executes programs from the system ``PATH``. Sometimes,
 
720
this is not sufficient: for example, we may want to specify tool paths
 
721
or names in the configuration file. This can be easily achieved via
 
722
the hooks mechanism. To write your own hooks, just add their
 
723
definitions to the ``PluginMain.cpp`` or drop a ``.cpp`` file into the
 
724
your plugin directory. Hooks should live in the ``hooks`` namespace
 
725
and have the signature ``std::string hooks::MyHookName ([const char*
 
726
Arg0 [ const char* Arg2 [, ...]]])``. They can be used from the
 
727
``cmd_line`` tool property::
 
728
 
 
729
    (cmd_line "$CALL(MyHook)/path/to/file -o $CALL(AnotherHook)")
 
730
 
 
731
To pass arguments to hooks, use the following syntax::
 
732
 
 
733
    (cmd_line "$CALL(MyHook, 'Arg1', 'Arg2', 'Arg # 3')/path/to/file -o1 -o2")
 
734
 
 
735
It is also possible to use environment variables in the same manner::
 
736
 
 
737
   (cmd_line "$ENV(VAR1)/path/to/file -o $ENV(VAR2)")
 
738
 
 
739
To change the command line string based on user-provided options use
 
740
the ``case`` expression (documented `above`__)::
 
741
 
 
742
    (cmd_line
 
743
      (case
 
744
        (switch_on "E"),
 
745
           "llvm-g++ -E -x c $INFILE -o $OUTFILE",
 
746
        (default),
 
747
           "llvm-g++ -c -x c $INFILE -o $OUTFILE -emit-llvm"))
 
748
 
 
749
__ case_
 
750
 
 
751
.. _priorities:
 
752
 
 
753
How plugins are loaded
 
754
----------------------
 
755
 
 
756
It is possible for LLVMC plugins to depend on each other. For example,
 
757
one can create edges between nodes defined in some other plugin. To
 
758
make this work, however, that plugin should be loaded first. To
 
759
achieve this, the concept of plugin priority was introduced. By
 
760
default, every plugin has priority zero; to specify the priority
 
761
explicitly, put the following line in your plugin's TableGen file::
 
762
 
 
763
    def Priority : PluginPriority<$PRIORITY_VALUE>;
 
764
    # Where PRIORITY_VALUE is some integer > 0
 
765
 
 
766
Plugins are loaded in order of their (increasing) priority, starting
 
767
with 0. Therefore, the plugin with the highest priority value will be
 
768
loaded last.
 
769
 
 
770
Debugging
 
771
---------
 
772
 
 
773
When writing LLVMC plugins, it can be useful to get a visual view of
 
774
the resulting compilation graph. This can be achieved via the command
 
775
line option ``--view-graph``. This command assumes that Graphviz_ and
 
776
Ghostview_ are installed. There is also a ``--write-graph`` option that
 
777
creates a Graphviz source file (``compilation-graph.dot``) in the
 
778
current directory.
 
779
 
 
780
Another useful ``llvmc`` option is ``--check-graph``. It checks the
 
781
compilation graph for common errors like mismatched output/input
 
782
language names, multiple default edges and cycles. These checks can't
 
783
be performed at compile-time because the plugins can load code
 
784
dynamically. When invoked with ``--check-graph``, ``llvmc`` doesn't
 
785
perform any compilation tasks and returns the number of encountered
 
786
errors as its status code.
 
787
 
 
788
.. _Graphviz: http://www.graphviz.org/
 
789
.. _Ghostview: http://pages.cs.wisc.edu/~ghost/
 
790
 
 
791
Conditioning on the executable name
 
792
-----------------------------------
 
793
 
 
794
For now, the executable name (the value passed to the driver in ``argv[0]``) is
 
795
accessible only in the C++ code (i.e. hooks). Use the following code::
 
796
 
 
797
    namespace llvmc {
 
798
    extern const char* ProgramName;
 
799
    }
 
800
 
 
801
    namespace hooks {
 
802
 
 
803
    std::string MyHook() {
 
804
    //...
 
805
    if (strcmp(ProgramName, "mydriver") == 0) {
 
806
       //...
 
807
 
 
808
    }
 
809
 
 
810
    } // end namespace hooks
 
811
 
 
812
In general, you're encouraged not to make the behaviour dependent on the
 
813
executable file name, and use command-line switches instead. See for example how
 
814
the ``Base`` plugin behaves when it needs to choose the correct linker options
 
815
(think ``g++`` vs. ``gcc``).
 
816
 
 
817
.. raw:: html
 
818
 
 
819
   <hr />
 
820
   <address>
 
821
   <a href="http://jigsaw.w3.org/css-validator/check/referer">
 
822
   <img src="http://jigsaw.w3.org/css-validator/images/vcss-blue"
 
823
      alt="Valid CSS" /></a>
 
824
   <a href="http://validator.w3.org/check?uri=referer">
 
825
   <img src="http://www.w3.org/Icons/valid-xhtml10-blue"
 
826
      alt="Valid XHTML 1.0 Transitional"/></a>
 
827
 
 
828
   <a href="mailto:foldr@codedgers.com">Mikhail Glushenkov</a><br />
 
829
   <a href="http://llvm.org">LLVM Compiler Infrastructure</a><br />
 
830
 
 
831
   Last modified: $Date: 2008-12-11 11:34:48 -0600 (Thu, 11 Dec 2008) $
 
832
   </address>