comparison docs/GoldPlugin.rst @ 31:d22a1cf4041c

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