blob: 78d38ccb32bd18d950b21d8a76b7c22e001841fb [file] [log] [blame]
Sean Silvafc6de0f2012-10-04 03:56:23 +00001====================
2The LLVM gold plugin
3====================
4
Sean Silvafc6de0f2012-10-04 03:56:23 +00005Introduction
6============
7
Jonas Devliegherecc7eafc2016-11-30 08:24:43 +00008Building with link time optimization requires cooperation from
9the system linker. LTO support on Linux systems requires that you use the
Ekaterina Vaartis4c5192f2017-06-23 13:54:10 +000010`gold linker`_ or ld.bfd from binutils >= 2.21.51.0.2, as they support LTO via plugins. This is the same mechanism
Jonas Devliegherecc7eafc2016-11-30 08:24:43 +000011used by the `GCC LTO`_ project.
Sean Silvafc6de0f2012-10-04 03:56:23 +000012
13The LLVM gold plugin implements the gold plugin interface on top of
14:ref:`libLTO`. The same plugin can also be used by other tools such as
15``ar`` and ``nm``.
16
17.. _`gold linker`: http://sourceware.org/binutils
18.. _`GCC LTO`: http://gcc.gnu.org/wiki/LinkTimeOptimization
19.. _`gold plugin interface`: http://gcc.gnu.org/wiki/whopr/driver
20
21.. _lto-how-to-build:
22
23How to build it
24===============
25
Ekaterina Vaartis4c5192f2017-06-23 13:54:10 +000026Check for plugin support by running ``/usr/bin/ld -plugin``. If it complains
27"missing argument" then you have plugin support. If not, such as an "unknown option"
28error then you will either need to build gold or install a recent version
29of ld.bfd with plugin support and then build gold plugin.
Sean Silvafc6de0f2012-10-04 03:56:23 +000030
Ekaterina Vaartis4c5192f2017-06-23 13:54:10 +000031* Download, configure and build ld.bfd with plugin support:
Sean Silvafc6de0f2012-10-04 03:56:23 +000032
33 .. code-block:: bash
34
Alp Toker6720f9d2013-12-02 07:15:33 +000035 $ git clone --depth 1 git://sourceware.org/git/binutils-gdb.git binutils
Sean Silvafc6de0f2012-10-04 03:56:23 +000036 $ mkdir build
37 $ cd build
Ekaterina Vaartis4c5192f2017-06-23 13:54:10 +000038 $ ../binutils/configure --disable-werror # ld.bfd includes plugin support by default
39 $ make all-ld
Sean Silvafc6de0f2012-10-04 03:56:23 +000040
Ekaterina Vaartis4c5192f2017-06-23 13:54:10 +000041 That should leave you with ``build/ld/ld-new`` which supports
Alp Toker6720f9d2013-12-02 07:15:33 +000042 the ``-plugin`` option. Running ``make`` will additionally build
43 ``build/binutils/ar`` and ``nm-new`` binaries supporting plugins.
Sean Silvafc6de0f2012-10-04 03:56:23 +000044
Alexey Samsonovf18fba62016-01-30 01:10:15 +000045* Build the LLVMgold plugin. Run CMake with
Tim Northover43361442014-11-04 02:16:03 +000046 ``-DLLVM_BINUTILS_INCDIR=/path/to/binutils/include``. The correct include
47 path will contain the file ``plugin-api.h``.
Sean Silvafc6de0f2012-10-04 03:56:23 +000048
49Usage
50=====
51
52The linker takes a ``-plugin`` option that points to the path of
53the plugin ``.so`` file. To find out what link command ``gcc``
54would run in a given situation, run ``gcc -v [...]`` and
55look for the line where it runs ``collect2``. Replace that with
56``ld-new -plugin /path/to/LLVMgold.so`` to test it out. Once you're
57ready to switch to using gold, backup your existing ``/usr/bin/ld``
58then replace it with ``ld-new``.
59
Rafael Espindola6f5b0e32013-09-23 19:50:59 +000060You should produce bitcode files from ``clang`` with the option
Bill Wendling29c7f162013-10-27 04:25:02 +000061``-flto``. This flag will also cause ``clang`` to look for the gold plugin in
Sean Silvafc6de0f2012-10-04 03:56:23 +000062the ``lib`` directory under its prefix and pass the ``-plugin`` option to
63``ld``. It will not look for an alternate linker, which is why you need
Dmitri Gribenko9dd46872012-10-05 20:50:05 +000064gold to be the installed system linker in your path.
Sean Silvafc6de0f2012-10-04 03:56:23 +000065
Alp Toker6720f9d2013-12-02 07:15:33 +000066``ar`` and ``nm`` also accept the ``-plugin`` option and it's possible to
67to install ``LLVMgold.so`` to ``/usr/lib/bfd-plugins`` for a seamless setup.
68If you built your own gold, be sure to install the ``ar`` and ``nm-new`` you
69built to ``/usr/bin``.
Sean Silvafc6de0f2012-10-04 03:56:23 +000070
71
72Example of link time optimization
73---------------------------------
74
75The following example shows a worked example of the gold plugin mixing LLVM
76bitcode and native code.
77
78.. code-block:: c
79
80 --- a.c ---
81 #include <stdio.h>
82
83 extern void foo1(void);
84 extern void foo4(void);
85
86 void foo2(void) {
87 printf("Foo2\n");
88 }
89
90 void foo3(void) {
91 foo4();
92 }
93
94 int main(void) {
95 foo1();
96 }
97
98 --- b.c ---
99 #include <stdio.h>
100
101 extern void foo2(void);
102
103 void foo1(void) {
104 foo2();
105 }
106
107 void foo4(void) {
108 printf("Foo4");
109 }
110
111.. code-block:: bash
112
113 --- command lines ---
114 $ clang -flto a.c -c -o a.o # <-- a.o is LLVM bitcode file
115 $ ar q a.a a.o # <-- a.a is an archive with LLVM bitcode
116 $ clang b.c -c -o b.o # <-- b.o is native object file
117 $ clang -flto a.a b.o -o main # <-- link with LLVMgold plugin
118
119Gold informs the plugin that foo3 is never referenced outside the IR,
120leading LLVM to delete that function. However, unlike in the :ref:`libLTO
121example <libLTO-example>` gold does not currently eliminate foo4.
122
123Quickstart for using LTO with autotooled projects
124=================================================
125
126Once your system ``ld``, ``ar``, and ``nm`` all support LLVM bitcode,
127everything is in place for an easy to use LTO build of autotooled projects:
128
129* Follow the instructions :ref:`on how to build LLVMgold.so
130 <lto-how-to-build>`.
131
132* Install the newly built binutils to ``$PREFIX``
133
134* Copy ``Release/lib/LLVMgold.so`` to ``$PREFIX/lib/bfd-plugins/``
135
136* Set environment variables (``$PREFIX`` is where you installed clang and
137 binutils):
138
139 .. code-block:: bash
140
141 export CC="$PREFIX/bin/clang -flto"
142 export CXX="$PREFIX/bin/clang++ -flto"
143 export AR="$PREFIX/bin/ar"
144 export NM="$PREFIX/bin/nm"
145 export RANLIB=/bin/true #ranlib is not needed, and doesn't support .bc files in .a
Sean Silvafc6de0f2012-10-04 03:56:23 +0000146
147* Or you can just set your path:
148
149 .. code-block:: bash
150
151 export PATH="$PREFIX/bin:$PATH"
152 export CC="clang -flto"
153 export CXX="clang++ -flto"
154 export RANLIB=/bin/true
Sean Silvafc6de0f2012-10-04 03:56:23 +0000155* Configure and build the project as usual:
156
157 .. code-block:: bash
158
159 % ./configure && make && make check
160
161The environment variable settings may work for non-autotooled projects too,
162but you may need to set the ``LD`` environment variable as well.
163
164Licensing
165=========
166
167Gold is licensed under the GPLv3. LLVMgold uses the interface file
Dmitri Gribenko9dd46872012-10-05 20:50:05 +0000168``plugin-api.h`` from gold which means that the resulting ``LLVMgold.so``
Sean Silvafc6de0f2012-10-04 03:56:23 +0000169binary is also GPLv3. This can still be used to link non-GPLv3 programs
170just as much as gold could without the plugin.