blob: e7e8f081e0f10f0bd1e2972a0321818f8b716162 [file] [log] [blame]
Mikhail Glushenkovae551a02008-05-30 06:25:24 +00001======================
Mikhail Glushenkov490692c2008-05-30 06:14:42 +00002Tutorial - Using LLVMC
3======================
Mikhail Glushenkove04b5bf2008-12-13 17:51:47 +00004..
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'.
Mikhail Glushenkovc0363fc2008-12-13 02:28:58 +00008
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
17Introduction
18============
Mikhail Glushenkov490692c2008-05-30 06:14:42 +000019
20LLVMC is a generic compiler driver, which plays the same role for LLVM
21as the ``gcc`` program does for GCC - the difference being that LLVMC
Mikhail Glushenkovfe292352008-10-15 09:29:13 +000022is designed to be more adaptable and easier to customize. Most of
23LLVMC functionality is implemented via plugins, which can be loaded
24dynamically or compiled in. This tutorial describes the basic usage
25and configuration of LLVMC.
Mikhail Glushenkov490692c2008-05-30 06:14:42 +000026
Mikhail Glushenkovae551a02008-05-30 06:25:24 +000027
Mikhail Glushenkov490692c2008-05-30 06:14:42 +000028Compiling with LLVMC
Mikhail Glushenkovae551a02008-05-30 06:25:24 +000029====================
Mikhail Glushenkov490692c2008-05-30 06:14:42 +000030
31In general, LLVMC tries to be command-line compatible with ``gcc`` as
32much as possible, so most of the familiar options work::
33
Mikhail Glushenkov98d5ed52008-11-25 21:38:12 +000034 $ llvmc -O3 -Wall hello.cpp
Mikhail Glushenkov490692c2008-05-30 06:14:42 +000035 $ ./a.out
36 hello
37
Mikhail Glushenkoveafa1dd2008-11-25 21:34:29 +000038This will invoke ``llvm-g++`` under the hood (you can see which
39commands are executed by using the ``-v`` option). For further help on
40command-line LLVMC usage, refer to the ``llvmc --help`` output.
41
Mikhail Glushenkov490692c2008-05-30 06:14:42 +000042
43Using LLVMC to generate toolchain drivers
Mikhail Glushenkovae551a02008-05-30 06:25:24 +000044=========================================
Mikhail Glushenkov490692c2008-05-30 06:14:42 +000045
Mikhail Glushenkovc0363fc2008-12-13 02:28:58 +000046LLVMC plugins are written mostly using TableGen_, so you need to
Mikhail Glushenkovfe292352008-10-15 09:29:13 +000047be familiar with it to get anything done.
Mikhail Glushenkov490692c2008-05-30 06:14:42 +000048
Mikhail Glushenkovfbd815f2009-06-17 02:56:08 +000049.. _TableGen: http://llvm.org/docs/TableGenFundamentals.html
Mikhail Glushenkovc0363fc2008-12-13 02:28:58 +000050
Mikhail Glushenkovbf508522009-06-16 00:13:52 +000051Start by compiling ``example/Simple``, which is a primitive wrapper for
52``gcc``::
Mikhail Glushenkov490692c2008-05-30 06:14:42 +000053
Mikhail Glushenkov98d5ed52008-11-25 21:38:12 +000054 $ cd $LLVM_DIR/tools/llvmc
Mikhail Glushenkovfbd815f2009-06-17 02:56:08 +000055 $ cp -r example/Simple plugins/Simple
Mikhail Glushenkovbf508522009-06-16 00:13:52 +000056
57 # NB: A less verbose way to compile standalone LLVMC-based drivers is
58 # described in the reference manual.
59
60 $ make LLVMC_BASED_DRIVER_NAME=mygcc LLVMC_BUILTIN_PLUGINS=Simple
Mikhail Glushenkovfe292352008-10-15 09:29:13 +000061 $ cat > hello.c
62 [...]
Mikhail Glushenkov490692c2008-05-30 06:14:42 +000063 $ mygcc hello.c
64 $ ./hello.out
65 Hello
66
Mikhail Glushenkovbf508522009-06-16 00:13:52 +000067Here we link our plugin with the LLVMC core statically to form an executable
68file called ``mygcc``. It is also possible to build our plugin as a dynamic
69library to be loaded by the ``llvmc`` executable (or any other LLVMC-based
70standalone driver); this is described in the reference manual.
Mikhail Glushenkovfe292352008-10-15 09:29:13 +000071
Mikhail Glushenkov490692c2008-05-30 06:14:42 +000072Contents of the file ``Simple.td`` look like this::
73
74 // Include common definitions
Mikhail Glushenkoveafa1dd2008-11-25 21:34:29 +000075 include "llvm/CompilerDriver/Common.td"
Mikhail Glushenkov490692c2008-05-30 06:14:42 +000076
77 // Tool descriptions
78 def gcc : Tool<
79 [(in_language "c"),
80 (out_language "executable"),
81 (output_suffix "out"),
82 (cmd_line "gcc $INFILE -o $OUTFILE"),
83 (sink)
84 ]>;
85
86 // Language map
87 def LanguageMap : LanguageMap<[LangToSuffixes<"c", ["c"]>]>;
88
89 // Compilation graph
Mikhail Glushenkovfaae1222008-11-17 17:29:18 +000090 def CompilationGraph : CompilationGraph<[Edge<"root", "gcc">]>;
Mikhail Glushenkov490692c2008-05-30 06:14:42 +000091
92As you can see, this file consists of three parts: tool descriptions,
93language map, and the compilation graph definition.
94
Mikhail Glushenkovfe292352008-10-15 09:29:13 +000095At the heart of LLVMC is the idea of a compilation graph: vertices in
96this graph are tools, and edges represent a transformation path
Mikhail Glushenkovb50080e2008-09-22 20:45:17 +000097between two tools (for example, assembly source produced by the
Mikhail Glushenkovfe292352008-10-15 09:29:13 +000098compiler can be transformed into executable code by an assembler). The
99compilation graph is basically a list of edges; a special node named
100``root`` is used to mark graph entry points.
Mikhail Glushenkov490692c2008-05-30 06:14:42 +0000101
Mikhail Glushenkovfe292352008-10-15 09:29:13 +0000102Tool descriptions are represented as property lists: most properties
Mikhail Glushenkov490692c2008-05-30 06:14:42 +0000103in the example above should be self-explanatory; the ``sink`` property
104means that all options lacking an explicit description should be
105forwarded to this tool.
106
Mikhail Glushenkovfe292352008-10-15 09:29:13 +0000107The ``LanguageMap`` associates a language name with a list of suffixes
108and is used for deciding which toolchain corresponds to a given input
Mikhail Glushenkov490692c2008-05-30 06:14:42 +0000109file.
110
111To learn more about LLVMC customization, refer to the reference
Mikhail Glushenkovfe292352008-10-15 09:29:13 +0000112manual and plugin source code in the ``plugins`` directory.
Mikhail Glushenkov490692c2008-05-30 06:14:42 +0000113
Mikhail Glushenkov6fd55132008-12-11 23:24:40 +0000114.. raw:: html
Mikhail Glushenkovc0363fc2008-12-13 02:28:58 +0000115
116 <hr />
117 <address>
118 <a href="http://jigsaw.w3.org/css-validator/check/referer">
119 <img src="http://jigsaw.w3.org/css-validator/images/vcss-blue"
120 alt="Valid CSS" /></a>
121 <a href="http://validator.w3.org/check?uri=referer">
122 <img src="http://www.w3.org/Icons/valid-xhtml10-blue"
123 alt="Valid XHTML 1.0 Transitional"/></a>
124
125 <a href="mailto:foldr@codedgers.com">Mikhail Glushenkov</a><br />
126 <a href="http://llvm.org">LLVM Compiler Infrastructure</a><br />
127
128 Last modified: $Date: 2008-12-11 11:34:48 -0600 (Thu, 11 Dec 2008) $
129 </address>