722a9a1bb06f61c1c46321b762da43984fcbe024
[oota-llvm.git] / docs / GoldPlugin.rst
1 .. _gold-plugin:
2
3 ====================
4 The LLVM gold plugin
5 ====================
6
7 Introduction
8 ============
9
10 Building with link time optimization requires cooperation from
11 the system linker. LTO support on Linux systems requires that you use the
12 `gold linker`_ which supports LTO via plugins. This is the same mechanism
13 used by the `GCC LTO`_ project.
14
15 The LLVM gold plugin implements the gold plugin interface on top of
16 :ref:`libLTO`.  The same plugin can also be used by other tools such as
17 ``ar`` and ``nm``.
18
19 .. _`gold linker`: http://sourceware.org/binutils
20 .. _`GCC LTO`: http://gcc.gnu.org/wiki/LinkTimeOptimization
21 .. _`gold plugin interface`: http://gcc.gnu.org/wiki/whopr/driver
22
23 .. _lto-how-to-build:
24
25 How to build it
26 ===============
27
28 You need to have gold with plugin support and build the LLVMgold plugin.
29 Check whether you have gold running ``/usr/bin/ld -v``. It will report "GNU
30 gold" or else "GNU ld" if not. If you have gold, check for plugin support
31 by running ``/usr/bin/ld -plugin``. If it complains "missing argument" then
32 you have plugin support. If not, such as an "unknown option" error then you
33 will either need to build gold or install a version with plugin support.
34
35 * To build gold with plugin support:
36
37   .. code-block:: bash
38
39      $ mkdir binutils
40      $ cd binutils
41      $ cvs -z 9 -d :pserver:anoncvs@sourceware.org:/cvs/src login
42      {enter "anoncvs" as the password}
43      $ cvs -z 9 -d :pserver:anoncvs@sourceware.org:/cvs/src co binutils
44      $ mkdir build
45      $ cd build
46      $ ../src/configure --enable-gold --enable-plugins
47      $ make all-gold
48
49   That should leave you with ``binutils/build/gold/ld-new`` which supports
50   the ``-plugin`` option. It also built would have
51   ``binutils/build/binutils/ar`` and ``nm-new`` which support plugins but
52   don't have a visible -plugin option, instead relying on the gold plugin
53   being present in ``../lib/bfd-plugins`` relative to where the binaries
54   are placed.
55
56 * Build the LLVMgold plugin: Configure LLVM with
57   ``--with-binutils-include=/path/to/binutils/src/include`` and run
58   ``make``.
59
60 Usage
61 =====
62
63 The linker takes a ``-plugin`` option that points to the path of
64 the plugin ``.so`` file. To find out what link command ``gcc``
65 would run in a given situation, run ``gcc -v [...]`` and
66 look for the line where it runs ``collect2``. Replace that with
67 ``ld-new -plugin /path/to/LLVMgold.so`` to test it out. Once you're
68 ready to switch to using gold, backup your existing ``/usr/bin/ld``
69 then replace it with ``ld-new``.
70
71 You can produce bitcode files from ``clang`` using ``-emit-llvm`` or
72 ``-flto``, or the ``-O4`` flag which is synonymous with ``-O3 -flto``.
73
74 Any of these flags will also cause ``clang`` to look for the gold plugin in
75 the ``lib`` directory under its prefix and pass the ``-plugin`` option to
76 ``ld``. It will not look for an alternate linker, which is why you need
77 gold to be the installed system linker in your path.
78
79 If you want ``ar`` and ``nm`` to work seamlessly as well, install
80 ``LLVMgold.so`` to ``/usr/lib/bfd-plugins``. If you built your own gold, be
81 sure to install the ``ar`` and ``nm-new`` you built to ``/usr/bin``.
82
83
84 Example of link time optimization
85 ---------------------------------
86
87 The following example shows a worked example of the gold plugin mixing LLVM
88 bitcode and native code.
89
90 .. code-block:: c
91
92    --- a.c ---
93    #include <stdio.h>
94
95    extern void foo1(void);
96    extern void foo4(void);
97
98    void foo2(void) {
99      printf("Foo2\n");
100    }
101
102    void foo3(void) {
103      foo4();
104    }
105
106    int main(void) {
107      foo1();
108    }
109
110    --- b.c ---
111    #include <stdio.h>
112
113    extern void foo2(void);
114
115    void foo1(void) {
116      foo2();
117    }
118
119    void foo4(void) {
120      printf("Foo4");
121    }
122
123 .. code-block:: bash
124
125    --- command lines ---
126    $ clang -flto a.c -c -o a.o      # <-- a.o is LLVM bitcode file
127    $ ar q a.a a.o                   # <-- a.a is an archive with LLVM bitcode
128    $ clang b.c -c -o b.o            # <-- b.o is native object file
129    $ clang -flto a.a b.o -o main    # <-- link with LLVMgold plugin
130
131 Gold informs the plugin that foo3 is never referenced outside the IR,
132 leading LLVM to delete that function. However, unlike in the :ref:`libLTO
133 example <libLTO-example>` gold does not currently eliminate foo4.
134
135 Quickstart for using LTO with autotooled projects
136 =================================================
137
138 Once your system ``ld``, ``ar``, and ``nm`` all support LLVM bitcode,
139 everything is in place for an easy to use LTO build of autotooled projects:
140
141 * Follow the instructions :ref:`on how to build LLVMgold.so
142   <lto-how-to-build>`.
143
144 * Install the newly built binutils to ``$PREFIX``
145
146 * Copy ``Release/lib/LLVMgold.so`` to ``$PREFIX/lib/bfd-plugins/``
147
148 * Set environment variables (``$PREFIX`` is where you installed clang and
149   binutils):
150
151   .. code-block:: bash
152
153      export CC="$PREFIX/bin/clang -flto"
154      export CXX="$PREFIX/bin/clang++ -flto"
155      export AR="$PREFIX/bin/ar"
156      export NM="$PREFIX/bin/nm"
157      export RANLIB=/bin/true #ranlib is not needed, and doesn't support .bc files in .a
158      export CFLAGS="-O4"
159
160 * Or you can just set your path:
161
162   .. code-block:: bash
163
164      export PATH="$PREFIX/bin:$PATH"
165      export CC="clang -flto"
166      export CXX="clang++ -flto"
167      export RANLIB=/bin/true
168      export CFLAGS="-O4"
169 * Configure and build the project as usual:
170
171   .. code-block:: bash
172
173      % ./configure && make && make check
174
175 The environment variable settings may work for non-autotooled projects too,
176 but you may need to set the ``LD`` environment variable as well.
177
178 Licensing
179 =========
180
181 Gold is licensed under the GPLv3. LLVMgold uses the interface file
182 ``plugin-api.h`` from gold which means that the resulting ``LLVMgold.so``
183 binary is also GPLv3. This can still be used to link non-GPLv3 programs
184 just as much as gold could without the plugin.