|  | ==================== | 
|  | The LLVM gold plugin | 
|  | ==================== | 
|  |  | 
|  | Introduction | 
|  | ============ | 
|  |  | 
|  | Building with link time optimization requires cooperation from | 
|  | the system linker. LTO support on Linux systems is available via the | 
|  | `gold linker`_ which supports LTO via plugins. This is the same mechanism | 
|  | used by the `GCC LTO`_ project. | 
|  |  | 
|  | The LLVM gold plugin implements the gold plugin interface on top of | 
|  | :ref:`libLTO`.  The same plugin can also be used by other tools such as | 
|  | ``ar`` and ``nm``.  Note that ld.bfd from binutils version 2.21.51.0.2 | 
|  | and above also supports LTO via plugins.  However, usage of the LLVM | 
|  | gold plugin with ld.bfd is not tested and therefore not officially | 
|  | supported or recommended. | 
|  |  | 
|  | .. _`gold linker`: http://sourceware.org/binutils | 
|  | .. _`GCC LTO`: http://gcc.gnu.org/wiki/LinkTimeOptimization | 
|  | .. _`gold plugin interface`: http://gcc.gnu.org/wiki/whopr/driver | 
|  |  | 
|  | .. _lto-how-to-build: | 
|  |  | 
|  | How to build it | 
|  | =============== | 
|  |  | 
|  | You need to have gold with plugin support and build the LLVMgold plugin. | 
|  | The gold linker is installed as ld.gold. To see whether gold is the default | 
|  | on your system, run ``/usr/bin/ld -v``. It will report "GNU | 
|  | gold" or else "GNU ld" if not. If gold is already installed at | 
|  | ``/usr/bin/ld.gold``, one option is to simply make that the default by | 
|  | backing up your existing ``/usr/bin/ld`` and creating a symbolic link | 
|  | with ``ln -s /usr/bin/ld.gold /usr/bin/ld``. Alternatively, you can build | 
|  | with clang's ``-fuse-ld=gold`` or add ``-fuse-ld=gold`` to LDFLAGS, which will | 
|  | cause the clang driver to invoke ``/usr/bin/ld.gold`` directly. | 
|  |  | 
|  | If you have gold installed, check for plugin support by running | 
|  | ``/usr/bin/ld.gold -plugin``. If it complains "missing argument" then | 
|  | you have plugin support. If not, and you get an error such as "unknown option", | 
|  | then you will either need to build gold or install a version with plugin | 
|  | support. | 
|  |  | 
|  | * Download, configure and build gold with plugin support: | 
|  |  | 
|  | .. code-block:: bash | 
|  |  | 
|  | $ git clone --depth 1 git://sourceware.org/git/binutils-gdb.git binutils | 
|  | $ mkdir build | 
|  | $ cd build | 
|  | $ ../binutils/configure --enable-gold --enable-plugins --disable-werror | 
|  | $ make all-gold | 
|  |  | 
|  | That should leave you with ``build/gold/ld-new`` which supports | 
|  | the ``-plugin`` option. Running ``make`` will additionally build | 
|  | ``build/binutils/ar`` and ``nm-new`` binaries supporting plugins. | 
|  |  | 
|  | Once you're ready to switch to using gold, backup your existing | 
|  | ``/usr/bin/ld`` then replace it with ``ld-new``. Alternatively, install | 
|  | in ``/usr/bin/ld.gold`` and use ``-fuse-ld=gold`` as described earlier. | 
|  |  | 
|  | Optionally, add ``--enable-gold=default`` to the above configure invocation | 
|  | to automatically install the newly built gold as the default linker with | 
|  | ``make install``. | 
|  |  | 
|  | * Build the LLVMgold plugin. Run CMake with | 
|  | ``-DLLVM_BINUTILS_INCDIR=/path/to/binutils/include``.  The correct include | 
|  | path will contain the file ``plugin-api.h``. | 
|  |  | 
|  | Usage | 
|  | ===== | 
|  |  | 
|  | You should produce bitcode files from ``clang`` with the option | 
|  | ``-flto``. This flag will also cause ``clang`` to look for the gold plugin in | 
|  | the ``lib`` directory under its prefix and pass the ``-plugin`` option to | 
|  | ``ld``. It will not look for an alternate linker without ``-fuse-ld=gold``, | 
|  | which is why you otherwise need gold to be the installed system linker in | 
|  | your path. | 
|  |  | 
|  | ``ar`` and ``nm`` also accept the ``-plugin`` option and it's possible to | 
|  | to install ``LLVMgold.so`` to ``/usr/lib/bfd-plugins`` for a seamless setup. | 
|  | If you built your own gold, be sure to install the ``ar`` and ``nm-new`` you | 
|  | built to ``/usr/bin``. | 
|  |  | 
|  |  | 
|  | Example of link time optimization | 
|  | --------------------------------- | 
|  |  | 
|  | The following example shows a worked example of the gold plugin mixing LLVM | 
|  | bitcode and native code. | 
|  |  | 
|  | .. code-block:: c | 
|  |  | 
|  | --- a.c --- | 
|  | #include <stdio.h> | 
|  |  | 
|  | extern void foo1(void); | 
|  | extern void foo4(void); | 
|  |  | 
|  | void foo2(void) { | 
|  | printf("Foo2\n"); | 
|  | } | 
|  |  | 
|  | void foo3(void) { | 
|  | foo4(); | 
|  | } | 
|  |  | 
|  | int main(void) { | 
|  | foo1(); | 
|  | } | 
|  |  | 
|  | --- b.c --- | 
|  | #include <stdio.h> | 
|  |  | 
|  | extern void foo2(void); | 
|  |  | 
|  | void foo1(void) { | 
|  | foo2(); | 
|  | } | 
|  |  | 
|  | void foo4(void) { | 
|  | printf("Foo4"); | 
|  | } | 
|  |  | 
|  | .. code-block:: bash | 
|  |  | 
|  | --- command lines --- | 
|  | $ clang -flto a.c -c -o a.o      # <-- a.o is LLVM bitcode file | 
|  | $ ar q a.a a.o                   # <-- a.a is an archive with LLVM bitcode | 
|  | $ clang b.c -c -o b.o            # <-- b.o is native object file | 
|  | $ clang -flto a.a b.o -o main    # <-- link with LLVMgold plugin | 
|  |  | 
|  | Gold informs the plugin that foo3 is never referenced outside the IR, | 
|  | leading LLVM to delete that function. However, unlike in the :ref:`libLTO | 
|  | example <libLTO-example>` gold does not currently eliminate foo4. | 
|  |  | 
|  | Quickstart for using LTO with autotooled projects | 
|  | ================================================= | 
|  |  | 
|  | Once your system ``ld``, ``ar``, and ``nm`` all support LLVM bitcode, | 
|  | everything is in place for an easy to use LTO build of autotooled projects: | 
|  |  | 
|  | * Follow the instructions :ref:`on how to build LLVMgold.so | 
|  | <lto-how-to-build>`. | 
|  |  | 
|  | * Install the newly built binutils to ``$PREFIX`` | 
|  |  | 
|  | * Copy ``Release/lib/LLVMgold.so`` to ``$PREFIX/lib/bfd-plugins/`` | 
|  |  | 
|  | * Set environment variables (``$PREFIX`` is where you installed clang and | 
|  | binutils): | 
|  |  | 
|  | .. code-block:: bash | 
|  |  | 
|  | export CC="$PREFIX/bin/clang -flto" | 
|  | export CXX="$PREFIX/bin/clang++ -flto" | 
|  | export AR="$PREFIX/bin/ar" | 
|  | export NM="$PREFIX/bin/nm" | 
|  | export RANLIB=/bin/true #ranlib is not needed, and doesn't support .bc files in .a | 
|  |  | 
|  | * Or you can just set your path: | 
|  |  | 
|  | .. code-block:: bash | 
|  |  | 
|  | export PATH="$PREFIX/bin:$PATH" | 
|  | export CC="clang -flto" | 
|  | export CXX="clang++ -flto" | 
|  | export RANLIB=/bin/true | 
|  | * Configure and build the project as usual: | 
|  |  | 
|  | .. code-block:: bash | 
|  |  | 
|  | % ./configure && make && make check | 
|  |  | 
|  | The environment variable settings may work for non-autotooled projects too, | 
|  | but you may need to set the ``LD`` environment variable as well. | 
|  |  | 
|  | Licensing | 
|  | ========= | 
|  |  | 
|  | Gold is licensed under the GPLv3. LLVMgold uses the interface file | 
|  | ``plugin-api.h`` from gold which means that the resulting ``LLVMgold.so`` | 
|  | binary is also GPLv3. This can still be used to link non-GPLv3 programs | 
|  | just as much as gold could without the plugin. |