Make 'extern' an option property.
[oota-llvm.git] / tools / llvmc / doc / LLVMC-Reference.rst
1 ===================================
2 Customizing LLVMC: Reference Manual
3 ===================================
4 :Author: Mikhail Glushenkov <foldr@codedegers.com>
5
6 LLVMC is a generic compiler driver, designed to be customizable and
7 extensible. It plays the same role for LLVM as the ``gcc`` program
8 does for GCC - LLVMC's job is essentially to transform a set of input
9 files into a set of targets depending on configuration rules and user
10 options. What makes LLVMC different is that these transformation rules
11 are completely customizable - in fact, LLVMC knows nothing about the
12 specifics of transformation (even the command-line options are mostly
13 not hard-coded) and regards the transformation structure as an
14 abstract graph. The structure of this graph is completely determined
15 by plugins, which can be either statically or dynamically linked. This
16 makes it possible to easily adapt LLVMC for other purposes - for
17 example, as a build tool for game resources.
18
19 Because LLVMC employs TableGen [1]_ as its configuration language, you
20 need to be familiar with it to customize LLVMC.
21
22
23 .. contents::
24
25
26 Compiling with LLVMC
27 ====================
28
29 LLVMC tries hard to be as compatible with ``gcc`` as possible,
30 although there are some small differences. Most of the time, however,
31 you shouldn't be able to notice them::
32
33      $ # This works as expected:
34      $ llvmc -O3 -Wall hello.cpp
35      $ ./a.out
36      hello
37
38 One nice feature of LLVMC is that one doesn't have to distinguish
39 between different compilers for different languages (think ``g++`` and
40 ``gcc``) - the right toolchain is chosen automatically based on input
41 language names (which are, in turn, determined from file
42 extensions). If you want to force files ending with ".c" to compile as
43 C++, use the ``-x`` option, just like you would do it with ``gcc``::
44
45       $ # hello.c is really a C++ file
46       $ llvmc -x c++ hello.c
47       $ ./a.out
48       hello
49
50 On the other hand, when using LLVMC as a linker to combine several C++
51 object files you should provide the ``--linker`` option since it's
52 impossible for LLVMC to choose the right linker in that case::
53
54     $ llvmc -c hello.cpp
55     $ llvmc hello.o
56     [A lot of link-time errors skipped]
57     $ llvmc --linker=c++ hello.o
58     $ ./a.out
59     hello
60
61
62 Predefined options
63 ==================
64
65 LLVMC has some built-in options that can't be overridden in the
66 configuration libraries:
67
68 * ``-o FILE`` - Output file name.
69
70 * ``-x LANGUAGE`` - Specify the language of the following input files
71   until the next -x option.
72
73 * ``-load PLUGIN_NAME`` - Load the specified plugin DLL. Example:
74   ``-load $LLVM_DIR/Release/lib/LLVMCSimple.so``.
75
76 * ``-v`` - Enable verbose mode, i.e. print out all executed commands.
77
78 * ``--view-graph`` - Show a graphical representation of the compilation
79   graph. Requires that you have ``dot`` and ``gv`` programs
80   installed. Hidden option, useful for debugging.
81
82 * ``--write-graph`` - Write a ``compilation-graph.dot`` file in the
83   current directory with the compilation graph description in the
84   Graphviz format. Hidden option, useful for debugging.
85
86 * ``--save-temps`` - Write temporary files to the current directory
87   and do not delete them on exit. Hidden option, useful for debugging.
88
89 * ``--help``, ``--help-hidden``, ``--version`` - These options have
90   their standard meaning.
91
92
93 Compiling LLVMC plugins
94 =======================
95
96 It's easiest to start working on your own LLVMC plugin by copying the
97 skeleton project which lives under ``$LLVMC_DIR/plugins/Simple``::
98
99    $ cd $LLVMC_DIR/plugins
100    $ cp -r Simple MyPlugin
101    $ cd MyPlugin
102    $ ls
103    Makefile PluginMain.cpp Simple.td
104
105 As you can see, our basic plugin consists of only two files (not
106 counting the build script). ``Simple.td`` contains TableGen
107 description of the compilation graph; its format is documented in the
108 following sections. ``PluginMain.cpp`` is just a helper file used to
109 compile the auto-generated C++ code produced from TableGen source. It
110 can also contain hook definitions (see `below`__).
111
112 __ hooks_
113
114 The first thing that you should do is to change the ``LLVMC_PLUGIN``
115 variable in the ``Makefile`` to avoid conflicts (since this variable
116 is used to name the resulting library)::
117
118    LLVMC_PLUGIN=MyPlugin
119
120 It is also a good idea to rename ``Simple.td`` to something less
121 generic::
122
123    $ mv Simple.td MyPlugin.td
124
125 Note that the plugin source directory must be placed under
126 ``$LLVMC_DIR/plugins`` to make use of the existing build
127 infrastructure. To build a version of the LLVMC executable called
128 ``mydriver`` with your plugin compiled in, use the following command::
129
130    $ cd $LLVMC_DIR
131    $ make BUILTIN_PLUGINS=MyPlugin DRIVER_NAME=mydriver
132
133 To build your plugin as a dynamic library, just ``cd`` to its source
134 directory and run ``make``. The resulting file will be called
135 ``LLVMC$(LLVMC_PLUGIN).$(DLL_EXTENSION)`` (in our case,
136 ``LLVMCMyPlugin.so``). This library can be then loaded in with the
137 ``-load`` option. Example::
138
139     $ cd $LLVMC_DIR/plugins/Simple
140     $ make
141     $ llvmc -load $LLVM_DIR/Release/lib/LLVMCSimple.so
142
143 Sometimes, you will want a 'bare-bones' version of LLVMC that has no
144 built-in plugins. It can be compiled with the following command::
145
146     $ cd $LLVMC_DIR
147     $ make BUILTIN_PLUGINS=""
148
149 How plugins are loaded
150 ======================
151
152 It is possible for LLVMC plugins to depend on each other. For example,
153 one can create edges between nodes defined in some other plugin. To
154 make this work, however, that plugin should be loaded first. To
155 achieve this, the concept of plugin priority was introduced. By
156 default, every plugin has priority zero; to specify the priority
157 explicitly, put the following line in your plugin's TableGen file::
158
159     def Priority : PluginPriority<$PRIORITY_VALUE>;
160     # Where PRIORITY_VALUE is some integer > 0
161
162 Plugins are loaded in order of their (increasing) priority, starting
163 with 0. Therefore, the plugin with the highest priority value will be
164 loaded last.
165
166
167 Customizing LLVMC: the compilation graph
168 ========================================
169
170 Each TableGen configuration file should include the common
171 definitions::
172
173    include "llvm/CompilerDriver/Common.td"
174    // And optionally:
175    // include "llvm/CompilerDriver/Tools.td"
176    // which contains some useful tool definitions.
177
178 Internally, LLVMC stores information about possible source
179 transformations in form of a graph. Nodes in this graph represent
180 tools, and edges between two nodes represent a transformation path. A
181 special "root" node is used to mark entry points for the
182 transformations. LLVMC also assigns a weight to each edge (more on
183 this later) to choose between several alternative edges.
184
185 The definition of the compilation graph (see file
186 ``plugins/Base/Base.td`` for an example) is just a list of edges::
187
188     def CompilationGraph : CompilationGraph<[
189         Edge<"root", "llvm_gcc_c">,
190         Edge<"root", "llvm_gcc_assembler">,
191         ...
192
193         Edge<"llvm_gcc_c", "llc">,
194         Edge<"llvm_gcc_cpp", "llc">,
195         ...
196
197         OptionalEdge<"llvm_gcc_c", "opt", (case (switch_on "opt"),
198                                           (inc_weight))>,
199         OptionalEdge<"llvm_gcc_cpp", "opt", (case (switch_on "opt"),
200                                                   (inc_weight))>,
201         ...
202
203         OptionalEdge<"llvm_gcc_assembler", "llvm_gcc_cpp_linker",
204             (case (input_languages_contain "c++"), (inc_weight),
205                   (or (parameter_equals "linker", "g++"),
206                       (parameter_equals "linker", "c++")), (inc_weight))>,
207         ...
208
209         ]>;
210
211 As you can see, the edges can be either default or optional, where
212 optional edges are differentiated by an additional ``case`` expression
213 used to calculate the weight of this edge. Notice also that we refer
214 to tools via their names (as strings). This makes it possible to add
215 edges to an existing compilation graph in plugins without having to
216 know about all tool definitions used in the graph.
217
218 The default edges are assigned a weight of 1, and optional edges get a
219 weight of 0 + 2*N where N is the number of tests that evaluated to
220 true in the ``case`` expression. It is also possible to provide an
221 integer parameter to ``inc_weight`` and ``dec_weight`` - in this case,
222 the weight is increased (or decreased) by the provided value instead
223 of the default 2. It is also possible to change the default weight of
224 an optional edge by using the ``default`` clause of the ``case``
225 construct.
226
227 When passing an input file through the graph, LLVMC picks the edge
228 with the maximum weight. To avoid ambiguity, there should be only one
229 default edge between two nodes (with the exception of the root node,
230 which gets a special treatment - there you are allowed to specify one
231 default edge *per language*).
232
233 When multiple plugins are loaded, their compilation graphs are merged
234 together. Since multiple edges that have the same end nodes are not
235 allowed (i.e. the graph is not a multigraph), an edge defined in
236 several plugins will be replaced by the definition from the plugin
237 that was loaded last. Plugin load order can be controlled by using the
238 plugin priority feature described above.
239
240 To get a visual representation of the compilation graph (useful for
241 debugging), run ``llvmc --view-graph``. You will need ``dot`` and
242 ``gsview`` installed for this to work properly.
243
244
245 Writing a tool description
246 ==========================
247
248 As was said earlier, nodes in the compilation graph represent tools,
249 which are described separately. A tool definition looks like this
250 (taken from the ``include/llvm/CompilerDriver/Tools.td`` file)::
251
252   def llvm_gcc_cpp : Tool<[
253       (in_language "c++"),
254       (out_language "llvm-assembler"),
255       (output_suffix "bc"),
256       (cmd_line "llvm-g++ -c $INFILE -o $OUTFILE -emit-llvm"),
257       (sink)
258       ]>;
259
260 This defines a new tool called ``llvm_gcc_cpp``, which is an alias for
261 ``llvm-g++``. As you can see, a tool definition is just a list of
262 properties; most of them should be self-explanatory. The ``sink``
263 property means that this tool should be passed all command-line
264 options that lack explicit descriptions.
265
266 The complete list of the currently implemented tool properties follows:
267
268 * Possible tool properties:
269
270   - ``in_language`` - input language name. Can be either a string or a
271     list, in case the tool supports multiple input languages.
272
273   - ``out_language`` - output language name.
274
275   - ``output_suffix`` - output file suffix.
276
277   - ``cmd_line`` - the actual command used to run the tool. You can
278     use ``$INFILE`` and ``$OUTFILE`` variables, output redirection
279     with ``>``, hook invocations (``$CALL``), environment variables
280     (via ``$ENV``) and the ``case`` construct (more on this below).
281
282   - ``join`` - this tool is a "join node" in the graph, i.e. it gets a
283     list of input files and joins them together. Used for linkers.
284
285   - ``sink`` - all command-line options that are not handled by other
286     tools are passed to this tool.
287
288 The next tool definition is slightly more complex::
289
290   def llvm_gcc_linker : Tool<[
291       (in_language "object-code"),
292       (out_language "executable"),
293       (output_suffix "out"),
294       (cmd_line "llvm-gcc $INFILE -o $OUTFILE"),
295       (join),
296       (prefix_list_option "L", (forward),
297                           (help "add a directory to link path")),
298       (prefix_list_option "l", (forward),
299                           (help "search a library when linking")),
300       (prefix_list_option "Wl", (unpack_values),
301                           (help "pass options to linker"))
302       ]>;
303
304 This tool has a "join" property, which means that it behaves like a
305 linker. This tool also defines several command-line options: ``-l``,
306 ``-L`` and ``-Wl`` which have their usual meaning. An option has two
307 attributes: a name and a (possibly empty) list of properties. All
308 currently implemented option types and properties are described below:
309
310 * Possible option types:
311
312    - ``switch_option`` - a simple boolean switch, for example ``-time``.
313
314    - ``parameter_option`` - option that takes an argument, for example
315      ``-std=c99``;
316
317    - ``parameter_list_option`` - same as the above, but more than one
318      occurence of the option is allowed.
319
320    - ``prefix_option`` - same as the parameter_option, but the option name
321      and parameter value are not separated.
322
323    - ``prefix_list_option`` - same as the above, but more than one
324      occurence of the option is allowed; example: ``-lm -lpthread``.
325
326    - ``alias_option`` - a special option type for creating
327      aliases. Unlike other option types, aliases are not allowed to
328      have any properties besides the aliased option name. Usage
329      example: ``(alias_option "preprocess", "E")``
330
331
332 * Possible option properties:
333
334    - ``append_cmd`` - append a string to the tool invocation command.
335
336    - ``forward`` - forward this option unchanged.
337
338    - ``forward_as`` - Change the name of this option, but forward the
339      argument unchanged. Example: ``(forward_as "--disable-optimize")``.
340
341    - ``output_suffix`` - modify the output suffix of this
342      tool. Example: ``(switch "E", (output_suffix "i")``.
343
344    - ``stop_compilation`` - stop compilation after this phase.
345
346    - ``unpack_values`` - used for for splitting and forwarding
347      comma-separated lists of options, e.g. ``-Wa,-foo=bar,-baz`` is
348      converted to ``-foo=bar -baz`` and appended to the tool invocation
349      command.
350
351    - ``help`` - help string associated with this option. Used for
352      ``--help`` output.
353
354    - ``required`` - this option is obligatory.
355
356    - ``hidden`` - this option should not appear in the ``--help``
357      output (but should appear in the ``--help-hidden`` output).
358
359    - ``really_hidden`` - the option should not appear in any help
360      output.
361
362
363 Option list - specifying all options in a single place
364 ======================================================
365
366 It can be handy to have all information about options gathered in a
367 single place to provide an overview. This can be achieved by using a
368 so-called ``OptionList``::
369
370     def Options : OptionList<[
371     (switch_option "E", (help "Help string")),
372     (alias_option "quiet", "q")
373     ...
374     ]>;
375
376 ``OptionList`` is also a good place to specify option aliases.
377
378 Tool-specific option properties like ``append_cmd`` have (obviously)
379 no meaning in the context of ``OptionList``, so the only properties
380 allowed there are ``help`` and ``required``.
381
382 Option lists are used at file scope. See the file
383 ``plugins/Clang/Clang.td`` for an example of ``OptionList`` usage.
384
385 .. _hooks:
386
387 Using hooks and environment variables in the ``cmd_line`` property
388 ==================================================================
389
390 Normally, LLVMC executes programs from the system ``PATH``. Sometimes,
391 this is not sufficient: for example, we may want to specify tool names
392 in the configuration file. This can be achieved via the mechanism of
393 hooks - to write your own hooks, just add their definitions to the
394 ``PluginMain.cpp`` or drop a ``.cpp`` file into the
395 ``$LLVMC_DIR/driver`` directory. Hooks should live in the ``hooks``
396 namespace and have the signature ``std::string hooks::MyHookName
397 (void)``. They can be used from the ``cmd_line`` tool property::
398
399     (cmd_line "$CALL(MyHook)/path/to/file -o $CALL(AnotherHook)")
400
401 It is also possible to use environment variables in the same manner::
402
403    (cmd_line "$ENV(VAR1)/path/to/file -o $ENV(VAR2)")
404
405 To change the command line string based on user-provided options use
406 the ``case`` expression (documented below)::
407
408     (cmd_line
409       (case
410         (switch_on "E"),
411            "llvm-g++ -E -x c $INFILE -o $OUTFILE",
412         (default),
413            "llvm-g++ -c -x c $INFILE -o $OUTFILE -emit-llvm"))
414
415 Conditional evaluation: the ``case`` expression
416 ===============================================
417
418 The 'case' construct can be used to calculate weights of the optional
419 edges and to choose between several alternative command line strings
420 in the ``cmd_line`` tool property. It is designed after the
421 similarly-named construct in functional languages and takes the form
422 ``(case (test_1), statement_1, (test_2), statement_2, ... (test_N),
423 statement_N)``. The statements are evaluated only if the corresponding
424 tests evaluate to true.
425
426 Examples::
427
428     // Increases edge weight by 5 if "-A" is provided on the
429     // command-line, and by 5 more if "-B" is also provided.
430     (case
431         (switch_on "A"), (inc_weight 5),
432         (switch_on "B"), (inc_weight 5))
433
434     // Evaluates to "cmdline1" if option "-A" is provided on the
435     // command line, otherwise to "cmdline2"
436     (case
437         (switch_on "A"), "cmdline1",
438         (switch_on "B"), "cmdline2",
439         (default), "cmdline3")
440
441 Note the slight difference in 'case' expression handling in contexts
442 of edge weights and command line specification - in the second example
443 the value of the ``"B"`` switch is never checked when switch ``"A"`` is
444 enabled, and the whole expression always evaluates to ``"cmdline1"`` in
445 that case.
446
447 Case expressions can also be nested, i.e. the following is legal::
448
449     (case (switch_on "E"), (case (switch_on "o"), ..., (default), ...)
450           (default), ...)
451
452 You should, however, try to avoid doing that because it hurts
453 readability. It is usually better to split tool descriptions and/or
454 use TableGen inheritance instead.
455
456 * Possible tests are:
457
458   - ``switch_on`` - Returns true if a given command-line switch is
459     provided by the user. Example: ``(switch_on "opt")``. Note that
460     you have to define all possible command-line options separately in
461     the tool descriptions. See the next section for the discussion of
462     different kinds of command-line options.
463
464   - ``parameter_equals`` - Returns true if a command-line parameter equals
465     a given value. Example: ``(parameter_equals "W", "all")``.
466
467   - ``element_in_list`` - Returns true if a command-line parameter list
468     includes a given value. Example: ``(parameter_in_list "l", "pthread")``.
469
470   - ``input_languages_contain`` - Returns true if a given language
471     belongs to the current input language set. Example:
472     ``(input_languages_contain "c++")``.
473
474   - ``in_language`` - Evaluates to true if the language of the input
475     file equals to the argument. At the moment works only with
476     ``cmd_line`` property on non-join nodes. Example: ``(in_language
477     "c++")``.
478
479   - ``not_empty`` - Returns true if a given option (which should be
480     either a parameter or a parameter list) is set by the
481     user. Example: ``(not_empty "o")``.
482
483   - ``default`` - Always evaluates to true. Should always be the last
484     test in the ``case`` expression.
485
486   - ``and`` - A standard logical combinator that returns true iff all
487     of its arguments return true. Used like this: ``(and (test1),
488     (test2), ... (testN))``. Nesting of ``and`` and ``or`` is allowed,
489     but not encouraged.
490
491   - ``or`` - Another logical combinator that returns true only if any
492     one of its arguments returns true. Example: ``(or (test1),
493     (test2), ... (testN))``.
494
495
496 Language map
497 ============
498
499 One last thing that you will need to modify when adding support for a
500 new language to LLVMC is the language map, which defines mappings from
501 file extensions to language names. It is used to choose the proper
502 toolchain(s) for a given input file set. Language map definition looks
503 like this::
504
505     def LanguageMap : LanguageMap<
506         [LangToSuffixes<"c++", ["cc", "cp", "cxx", "cpp", "CPP", "c++", "C"]>,
507          LangToSuffixes<"c", ["c"]>,
508          ...
509         ]>;
510
511 Debugging
512 =========
513
514 When writing LLVMC plugins, it can be useful to get a visual view of
515 the resulting compilation graph. This can be achieved via the command
516 line option ``--view-graph``. This command assumes that Graphviz [2]_ and
517 Ghostview [3]_ are installed. There is also a ``--dump-graph`` option that
518 creates a Graphviz source file(``compilation-graph.dot``) in the
519 current directory.
520
521
522 References
523 ==========
524
525 .. [1] TableGen Fundamentals
526        http://llvm.cs.uiuc.edu/docs/TableGenFundamentals.html
527
528 .. [2] Graphviz
529        http://www.graphviz.org/
530
531 .. [3] Ghostview
532        http://pages.cs.wisc.edu/~ghost/