Sean Silva | 34c6b7e | 2012-10-04 03:56:23 +0000 | [diff] [blame] | 1 | ==================== |
| 2 | The LLVM gold plugin |
| 3 | ==================== |
| 4 | |
Sean Silva | 34c6b7e | 2012-10-04 03:56:23 +0000 | [diff] [blame] | 5 | Introduction |
| 6 | ============ |
| 7 | |
Jonas Devlieghere | fc89a6a | 2016-11-30 08:24:43 +0000 | [diff] [blame] | 8 | Building with link time optimization requires cooperation from |
Teresa Johnson | 7f233b7 | 2018-07-18 17:10:17 +0000 | [diff] [blame] | 9 | the system linker. LTO support on Linux systems is available via the |
Teresa Johnson | ea13527 | 2018-07-11 20:08:32 +0000 | [diff] [blame] | 10 | `gold linker`_ which supports LTO via plugins. This is the same mechanism |
Jonas Devlieghere | fc89a6a | 2016-11-30 08:24:43 +0000 | [diff] [blame] | 11 | used by the `GCC LTO`_ project. |
Sean Silva | 34c6b7e | 2012-10-04 03:56:23 +0000 | [diff] [blame] | 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 |
Teresa Johnson | 7f233b7 | 2018-07-18 17:10:17 +0000 | [diff] [blame] | 15 | ``ar`` and ``nm``. Note that ld.bfd from binutils version 2.21.51.0.2 |
| 16 | and above also supports LTO via plugins. However, usage of the LLVM |
| 17 | gold plugin with ld.bfd is not tested and therefore not officially |
| 18 | supported or recommended. |
Sean Silva | 34c6b7e | 2012-10-04 03:56:23 +0000 | [diff] [blame] | 19 | |
| 20 | .. _`gold linker`: http://sourceware.org/binutils |
| 21 | .. _`GCC LTO`: http://gcc.gnu.org/wiki/LinkTimeOptimization |
| 22 | .. _`gold plugin interface`: http://gcc.gnu.org/wiki/whopr/driver |
| 23 | |
| 24 | .. _lto-how-to-build: |
| 25 | |
| 26 | How to build it |
| 27 | =============== |
| 28 | |
Teresa Johnson | ea13527 | 2018-07-11 20:08:32 +0000 | [diff] [blame] | 29 | You need to have gold with plugin support and build the LLVMgold plugin. |
Teresa Johnson | 7f233b7 | 2018-07-18 17:10:17 +0000 | [diff] [blame] | 30 | The gold linker is installed as ld.gold. To see whether gold is the default |
| 31 | on your system, run ``/usr/bin/ld -v``. It will report "GNU |
| 32 | gold" or else "GNU ld" if not. If gold is already installed at |
| 33 | ``/usr/bin/ld.gold``, one option is to simply make that the default by |
| 34 | backing up your existing ``/usr/bin/ld`` and creating a symbolic link |
| 35 | with ``ln -s /usr/bin/ld.gold /usr/bin/ld``. Alternatively, you can build |
| 36 | with clang's ``-fuse-ld=gold`` or add ``-fuse-ld=gold`` to LDFLAGS, which will |
| 37 | cause the clang driver to invoke ``/usr/bin/ld.gold`` directly. |
| 38 | |
| 39 | If you have gold installed, check for plugin support by running |
| 40 | ``/usr/bin/ld.gold -plugin``. If it complains "missing argument" then |
| 41 | you have plugin support. If not, and you get an error such as "unknown option", |
| 42 | then you will either need to build gold or install a version with plugin |
| 43 | support. |
Sean Silva | 34c6b7e | 2012-10-04 03:56:23 +0000 | [diff] [blame] | 44 | |
Teresa Johnson | ea13527 | 2018-07-11 20:08:32 +0000 | [diff] [blame] | 45 | * Download, configure and build gold with plugin support: |
Sean Silva | 34c6b7e | 2012-10-04 03:56:23 +0000 | [diff] [blame] | 46 | |
| 47 | .. code-block:: bash |
| 48 | |
Alp Toker | bc134cb | 2013-12-02 07:15:33 +0000 | [diff] [blame] | 49 | $ git clone --depth 1 git://sourceware.org/git/binutils-gdb.git binutils |
Sean Silva | 34c6b7e | 2012-10-04 03:56:23 +0000 | [diff] [blame] | 50 | $ mkdir build |
| 51 | $ cd build |
Teresa Johnson | ea13527 | 2018-07-11 20:08:32 +0000 | [diff] [blame] | 52 | $ ../binutils/configure --enable-gold --enable-plugins --disable-werror |
| 53 | $ make all-gold |
Sean Silva | 34c6b7e | 2012-10-04 03:56:23 +0000 | [diff] [blame] | 54 | |
Teresa Johnson | ea13527 | 2018-07-11 20:08:32 +0000 | [diff] [blame] | 55 | That should leave you with ``build/gold/ld-new`` which supports |
Alp Toker | bc134cb | 2013-12-02 07:15:33 +0000 | [diff] [blame] | 56 | the ``-plugin`` option. Running ``make`` will additionally build |
| 57 | ``build/binutils/ar`` and ``nm-new`` binaries supporting plugins. |
Sean Silva | 34c6b7e | 2012-10-04 03:56:23 +0000 | [diff] [blame] | 58 | |
Teresa Johnson | 7f233b7 | 2018-07-18 17:10:17 +0000 | [diff] [blame] | 59 | Once you're ready to switch to using gold, backup your existing |
| 60 | ``/usr/bin/ld`` then replace it with ``ld-new``. Alternatively, install |
| 61 | in ``/usr/bin/ld.gold`` and use ``-fuse-ld=gold`` as described earlier. |
| 62 | |
Fangrui Song | 8a21449 | 2018-08-21 21:00:54 +0000 | [diff] [blame] | 63 | Optionally, add ``--enable-gold=default`` to the above configure invocation |
Teresa Johnson | 7f233b7 | 2018-07-18 17:10:17 +0000 | [diff] [blame] | 64 | to automatically install the newly built gold as the default linker with |
| 65 | ``make install``. |
| 66 | |
Alexey Samsonov | af1aa14 | 2016-01-30 01:10:15 +0000 | [diff] [blame] | 67 | * Build the LLVMgold plugin. Run CMake with |
Tim Northover | 0a1d0f4 | 2014-11-04 02:16:03 +0000 | [diff] [blame] | 68 | ``-DLLVM_BINUTILS_INCDIR=/path/to/binutils/include``. The correct include |
| 69 | path will contain the file ``plugin-api.h``. |
Sean Silva | 34c6b7e | 2012-10-04 03:56:23 +0000 | [diff] [blame] | 70 | |
| 71 | Usage |
| 72 | ===== |
| 73 | |
Rafael Espindola | fe8f9e7 | 2013-09-23 19:50:59 +0000 | [diff] [blame] | 74 | You should produce bitcode files from ``clang`` with the option |
Bill Wendling | 4d7f7b1 | 2013-10-27 04:25:02 +0000 | [diff] [blame] | 75 | ``-flto``. This flag will also cause ``clang`` to look for the gold plugin in |
Sean Silva | 34c6b7e | 2012-10-04 03:56:23 +0000 | [diff] [blame] | 76 | the ``lib`` directory under its prefix and pass the ``-plugin`` option to |
Teresa Johnson | 7f233b7 | 2018-07-18 17:10:17 +0000 | [diff] [blame] | 77 | ``ld``. It will not look for an alternate linker without ``-fuse-ld=gold``, |
| 78 | which is why you otherwise need gold to be the installed system linker in |
| 79 | your path. |
Sean Silva | 34c6b7e | 2012-10-04 03:56:23 +0000 | [diff] [blame] | 80 | |
Alp Toker | bc134cb | 2013-12-02 07:15:33 +0000 | [diff] [blame] | 81 | ``ar`` and ``nm`` also accept the ``-plugin`` option and it's possible to |
| 82 | to install ``LLVMgold.so`` to ``/usr/lib/bfd-plugins`` for a seamless setup. |
| 83 | If you built your own gold, be sure to install the ``ar`` and ``nm-new`` you |
| 84 | built to ``/usr/bin``. |
Sean Silva | 34c6b7e | 2012-10-04 03:56:23 +0000 | [diff] [blame] | 85 | |
| 86 | |
| 87 | Example of link time optimization |
| 88 | --------------------------------- |
| 89 | |
| 90 | The following example shows a worked example of the gold plugin mixing LLVM |
| 91 | bitcode and native code. |
| 92 | |
| 93 | .. code-block:: c |
| 94 | |
| 95 | --- a.c --- |
| 96 | #include <stdio.h> |
| 97 | |
| 98 | extern void foo1(void); |
| 99 | extern void foo4(void); |
| 100 | |
| 101 | void foo2(void) { |
| 102 | printf("Foo2\n"); |
| 103 | } |
| 104 | |
| 105 | void foo3(void) { |
| 106 | foo4(); |
| 107 | } |
| 108 | |
| 109 | int main(void) { |
| 110 | foo1(); |
| 111 | } |
| 112 | |
| 113 | --- b.c --- |
| 114 | #include <stdio.h> |
| 115 | |
| 116 | extern void foo2(void); |
| 117 | |
| 118 | void foo1(void) { |
| 119 | foo2(); |
| 120 | } |
| 121 | |
| 122 | void foo4(void) { |
| 123 | printf("Foo4"); |
| 124 | } |
| 125 | |
| 126 | .. code-block:: bash |
| 127 | |
| 128 | --- command lines --- |
| 129 | $ clang -flto a.c -c -o a.o # <-- a.o is LLVM bitcode file |
| 130 | $ ar q a.a a.o # <-- a.a is an archive with LLVM bitcode |
| 131 | $ clang b.c -c -o b.o # <-- b.o is native object file |
| 132 | $ clang -flto a.a b.o -o main # <-- link with LLVMgold plugin |
| 133 | |
| 134 | Gold informs the plugin that foo3 is never referenced outside the IR, |
| 135 | leading LLVM to delete that function. However, unlike in the :ref:`libLTO |
| 136 | example <libLTO-example>` gold does not currently eliminate foo4. |
| 137 | |
| 138 | Quickstart for using LTO with autotooled projects |
| 139 | ================================================= |
| 140 | |
| 141 | Once your system ``ld``, ``ar``, and ``nm`` all support LLVM bitcode, |
| 142 | everything is in place for an easy to use LTO build of autotooled projects: |
| 143 | |
| 144 | * Follow the instructions :ref:`on how to build LLVMgold.so |
| 145 | <lto-how-to-build>`. |
| 146 | |
| 147 | * Install the newly built binutils to ``$PREFIX`` |
| 148 | |
| 149 | * Copy ``Release/lib/LLVMgold.so`` to ``$PREFIX/lib/bfd-plugins/`` |
| 150 | |
| 151 | * Set environment variables (``$PREFIX`` is where you installed clang and |
| 152 | binutils): |
| 153 | |
| 154 | .. code-block:: bash |
| 155 | |
| 156 | export CC="$PREFIX/bin/clang -flto" |
| 157 | export CXX="$PREFIX/bin/clang++ -flto" |
| 158 | export AR="$PREFIX/bin/ar" |
| 159 | export NM="$PREFIX/bin/nm" |
| 160 | export RANLIB=/bin/true #ranlib is not needed, and doesn't support .bc files in .a |
Sean Silva | 34c6b7e | 2012-10-04 03:56:23 +0000 | [diff] [blame] | 161 | |
| 162 | * Or you can just set your path: |
| 163 | |
| 164 | .. code-block:: bash |
| 165 | |
| 166 | export PATH="$PREFIX/bin:$PATH" |
| 167 | export CC="clang -flto" |
| 168 | export CXX="clang++ -flto" |
| 169 | export RANLIB=/bin/true |
Sean Silva | 34c6b7e | 2012-10-04 03:56:23 +0000 | [diff] [blame] | 170 | * Configure and build the project as usual: |
| 171 | |
| 172 | .. code-block:: bash |
| 173 | |
| 174 | % ./configure && make && make check |
| 175 | |
| 176 | The environment variable settings may work for non-autotooled projects too, |
| 177 | but you may need to set the ``LD`` environment variable as well. |
| 178 | |
| 179 | Licensing |
| 180 | ========= |
| 181 | |
| 182 | Gold is licensed under the GPLv3. LLVMgold uses the interface file |
Dmitri Gribenko | 038c43b | 2012-10-05 20:50:05 +0000 | [diff] [blame] | 183 | ``plugin-api.h`` from gold which means that the resulting ``LLVMgold.so`` |
Sean Silva | 34c6b7e | 2012-10-04 03:56:23 +0000 | [diff] [blame] | 184 | binary is also GPLv3. This can still be used to link non-GPLv3 programs |
| 185 | just as much as gold could without the plugin. |