======================================================
LLVM Link Time Optimization: Design and Implementation
======================================================

.. contents::
   :local:

Description
===========

LLVM features powerful intermodular optimizations which can be used at link
time.  Link Time Optimization (LTO) is another name for intermodular
optimization when performed during the link stage. This document describes the
interface and design between the LTO optimizer and the linker.

Design Philosophy
=================

The LLVM Link Time Optimizer provides complete transparency, while doing
intermodular optimization, in the compiler tool chain. Its main goal is to let
the developer take advantage of intermodular optimizations without making any
significant changes to the developer's makefiles or build system. This is
achieved through tight integration with the linker. In this model, the linker
treates LLVM bitcode files like native object files and allows mixing and
matching among them. The linker uses `libLTO`_, a shared object, to handle LLVM
bitcode files. This tight integration between the linker and LLVM optimizer
helps to do optimizations that are not possible in other models. The linker
input allows the optimizer to avoid relying on conservative escape analysis.

.. _libLTO-example:

Example of link time optimization
---------------------------------

The following example illustrates the advantages of LTO's integrated approach
and clean interface. This example requires a system linker which supports LTO
through the interface described in this document.  Here, clang transparently
invokes system linker.

* Input source file ``a.c`` is compiled into LLVM bitcode form.
* Input source file ``main.c`` is compiled into native object code.

.. code-block:: c++

  --- a.h ---
  extern int foo1(void);
  extern void foo2(void);
  extern void foo4(void);

  --- a.c ---
  #include "a.h"

  static signed int i = 0;

  void foo2(void) {
    i = -1;
  }

  static int foo3() {
    foo4();
    return 10;
  }

  int foo1(void) {
    int data = 0;

    if (i < 0) 
      data = foo3();

    data = data + 42;
    return data;
  }

  --- main.c ---
  #include <stdio.h>
  #include "a.h"

  void foo4(void) {
    printf("Hi\n");
  }

  int main() {
    return foo1();
  }

To compile, run:

.. code-block:: console

  % clang -emit-llvm -c a.c -o a.o   # <-- a.o is LLVM bitcode file
  % clang -c main.c -o main.o        # <-- main.o is native object file
  % clang a.o main.o -o main         # <-- standard link command without modifications

* In this example, the linker recognizes that ``foo2()`` is an externally
  visible symbol defined in LLVM bitcode file. The linker completes its usual
  symbol resolution pass and finds that ``foo2()`` is not used
  anywhere. This information is used by the LLVM optimizer and it
  removes ``foo2()``.

* As soon as ``foo2()`` is removed, the optimizer recognizes that condition ``i
  < 0`` is always false, which means ``foo3()`` is never used. Hence, the
  optimizer also removes ``foo3()``.

* And this in turn, enables linker to remove ``foo4()``.

This example illustrates the advantage of tight integration with the
linker. Here, the optimizer can not remove ``foo3()`` without the linker's
input.

Alternative Approaches
----------------------

**Compiler driver invokes link time optimizer separately.**
    In this model the link time optimizer is not able to take advantage of
    information collected during the linker's normal symbol resolution phase.
    In the above example, the optimizer can not remove ``foo2()`` without the
    linker's input because it is externally visible. This in turn prohibits the
    optimizer from removing ``foo3()``.

**Use separate tool to collect symbol information from all object files.**
    In this model, a new, separate, tool or library replicates the linker's
    capability to collect information for link time optimization. Not only is
    this code duplication difficult to justify, but it also has several other
    disadvantages.  For example, the linking semantics and the features provided
    by the linker on various platform are not unique. This means, this new tool
    needs to support all such features and platforms in one super tool or a
    separate tool per platform is required. This increases maintenance cost for
    link time optimizer significantly, which is not necessary. This approach
    also requires staying synchronized with linker developements on various
    platforms, which is not the main focus of the link time optimizer. Finally,
    this approach increases end user's build time due to the duplication of work
    done by this separate tool and the linker itself.

Multi-phase communication between ``libLTO`` and linker
=======================================================

The linker collects information about symbol defininitions and uses in various
link objects which is more accurate than any information collected by other
tools during typical build cycles.  The linker collects this information by
looking at the definitions and uses of symbols in native .o files and using
symbol visibility information. The linker also uses user-supplied information,
such as a list of exported symbols. LLVM optimizer collects control flow
information, data flow information and knows much more about program structure
from the optimizer's point of view.  Our goal is to take advantage of tight
integration between the linker and the optimizer by sharing this information
during various linking phases.

Phase 1 : Read LLVM Bitcode Files
---------------------------------

The linker first reads all object files in natural order and collects symbol
information. This includes native object files as well as LLVM bitcode files.
To minimize the cost to the linker in the case that all .o files are native
object files, the linker only calls ``lto_module_create()`` when a supplied
object file is found to not be a native object file.  If ``lto_module_create()``
returns that the file is an LLVM bitcode file, the linker then iterates over the
module using ``lto_module_get_symbol_name()`` and
``lto_module_get_symbol_attribute()`` to get all symbols defined and referenced.
This information is added to the linker's global symbol table.


The lto* functions are all implemented in a shared object libLTO.  This allows
the LLVM LTO code to be updated independently of the linker tool.  On platforms
that support it, the shared object is lazily loaded.

Phase 2 : Symbol Resolution
---------------------------

In this stage, the linker resolves symbols using global symbol table.  It may
report undefined symbol errors, read archive members, replace weak symbols, etc.
The linker is able to do this seamlessly even though it does not know the exact
content of input LLVM bitcode files.  If dead code stripping is enabled then the
linker collects the list of live symbols.

Phase 3 : Optimize Bitcode Files
--------------------------------

After symbol resolution, the linker tells the LTO shared object which symbols
are needed by native object files.  In the example above, the linker reports
that only ``foo1()`` is used by native object files using
``lto_codegen_add_must_preserve_symbol()``.  Next the linker invokes the LLVM
optimizer and code generators using ``lto_codegen_compile()`` which returns a
native object file creating by merging the LLVM bitcode files and applying
various optimization passes.

Phase 4 : Symbol Resolution after optimization
----------------------------------------------

In this phase, the linker reads optimized a native object file and updates the
internal global symbol table to reflect any changes. The linker also collects
information about any changes in use of external symbols by LLVM bitcode
files. In the example above, the linker notes that ``foo4()`` is not used any
more. If dead code stripping is enabled then the linker refreshes the live
symbol information appropriately and performs dead code stripping.

After this phase, the linker continues linking as if it never saw LLVM bitcode
files.

.. _libLTO:

``libLTO``
==========

``libLTO`` is a shared object that is part of the LLVM tools, and is intended
for use by a linker. ``libLTO`` provides an abstract C interface to use the LLVM
interprocedural optimizer without exposing details of LLVM's internals. The
intention is to keep the interface as stable as possible even when the LLVM
optimizer continues to evolve. It should even be possible for a completely
different compilation technology to provide a different libLTO that works with
their object files and the standard linker tool.

``lto_module_t``
----------------

A non-native object file is handled via an ``lto_module_t``.  The following
functions allow the linker to check if a file (on disk or in a memory buffer) is
a file which libLTO can process:

.. code-block:: c

  lto_module_is_object_file(const char*)
  lto_module_is_object_file_for_target(const char*, const char*)
  lto_module_is_object_file_in_memory(const void*, size_t)
  lto_module_is_object_file_in_memory_for_target(const void*, size_t, const char*)

If the object file can be processed by ``libLTO``, the linker creates a
``lto_module_t`` by using one of:

.. code-block:: c

  lto_module_create(const char*)
  lto_module_create_from_memory(const void*, size_t)

and when done, the handle is released via

.. code-block:: c

  lto_module_dispose(lto_module_t)


The linker can introspect the non-native object file by getting the number of
symbols and getting the name and attributes of each symbol via:

.. code-block:: c

  lto_module_get_num_symbols(lto_module_t)
  lto_module_get_symbol_name(lto_module_t, unsigned int)
  lto_module_get_symbol_attribute(lto_module_t, unsigned int)

The attributes of a symbol include the alignment, visibility, and kind.

``lto_code_gen_t``
------------------

Once the linker has loaded each non-native object files into an
``lto_module_t``, it can request ``libLTO`` to process them all and generate a
native object file.  This is done in a couple of steps.  First, a code generator
is created with:

.. code-block:: c

  lto_codegen_create()

Then, each non-native object file is added to the code generator with:

.. code-block:: c

  lto_codegen_add_module(lto_code_gen_t, lto_module_t)

The linker then has the option of setting some codegen options.  Whether or not
to generate DWARF debug info is set with:
  
.. code-block:: c

  lto_codegen_set_debug_model(lto_code_gen_t)

Which kind of position independence is set with:

.. code-block:: c

  lto_codegen_set_pic_model(lto_code_gen_t)
  
And each symbol that is referenced by a native object file or otherwise must not
be optimized away is set with:

.. code-block:: c

  lto_codegen_add_must_preserve_symbol(lto_code_gen_t, const char*)

After all these settings are done, the linker requests that a native object file
be created from the modules with the settings using:

.. code-block:: c

  lto_codegen_compile(lto_code_gen_t, size*)

which returns a pointer to a buffer containing the generated native object file.
The linker then parses that and links it with the rest of the native object
files.
