使用方式

选项-flto=

编译选项中加入此选项开启LTO。可通过-flto=n指定LTO的并发数,如使用auto可以指定与GNU make一致(如果可以获取)或是与当前机器线程数一致的并发数。

选项-ffat-lto-objects

该选项将生成同时包含汇编信息和LTO信息的目标文件。并且在-ffat-lto-objects开启的情况下,允许通过-fno-lto选项,使用目标对象文件的汇编信息,来完成常规的链接,而不执行链接时优化。

选项-flto-partition=1to1|balanced|max|one|none

该选项可以通过引入不同的分区策略从而加快编译速度。

选项-flto-compression-level=n

该选项用以控制LTO对象文件中IR信息的压缩等级。

DEMO

1
2
3
4
5
// four.c
int four()
{
    return 4;
}
1
2
3
4
5
// five.c
int five()
{
  return 5;
}
1
2
3
4
5
6
7
// test.c
extern int four();
extern int five();
int main()
{
  return four() + five();
}
1
2
3
4
5
6
gcc -O2 -flto test.c four.c five.c
# 或者
gcc -O2 -flto -c test.c
gcc -O2 -flto -c four.c
gcc -O2 -flto -c five.c
gcc test.o four.o five.o

对于上面这个案例,在使用 LTO 生成的可执行文件中,four() + five()会被内敛+常量折叠优化为立即数9,省略了函数调用与计算的步骤,这在非 LTO 模式下是无法实现的。 如果仅对four.c和test.c生成了 LTO 对象文件,最终结果便成了4 + five(),仅部分lto对象文件参与了局部范围内的链接时优化。