Optimizing across modules with link time optimization
Additional optimization opportunities are available at link time, because source code from different modules can be optimized together.
By default, the compiler optimizes each source module independently, translating C or C++ source code into an ELF file containing object code. At link time the linker combines all the ELF object files into an executable by resolving symbol references and relocations. Compiling each source file separately means the compiler might miss some optimization opportunities, such as cross-module inlining.
When link time optimization is enabled, the compiler translates source code
into an intermediate form called LLVM bitcode. At link time, the linker collects all
files containing bitcode together and sends them to the link time optimizer (
libLTO). Collecting modules together means the link
time optimizer can perform more optimizations because it has more information about
the dependencies between modules. The link time optimizer then sends a single ELF
object file back to the linker. Finally, the linker combines all object and library
code to create an executable.
Figure 6-1 Link time optimization
In this figure, ELF Object containing Bitcode is an ELF file that does not
contain normal code and data. Instead, it contains a section called
.llvmbc that holds LLVM bitcode.
.llvmbc is reserved. You must not create
.llvmbc section with, for example
CautionLink Time Optimization performs aggressive optimizations. Sometimes this can result in large chunks of code being removed.
This section contains the following subsections: