gcc LTO:限制优化范围

Mar*_*sky 5 c++ gcc lto

相当大的共享库(许多模板实例化)的LTO构建需要相当长的时间(> 10分钟).现在我知道了关于库的一些事情,并且可以以对象文件的形式指定某种"黑名单",这些文件不需要一起分析(因为它们之间没有应该内联的调用),或者我可以指定应该一起分析的目标文件组.这可能是某种方式(没有拆分lib)?

Tav*_*nes 5

/有一个很少使用的功能ld,可以用来将多个目标文件组合成一个,然后可以链接到最终产品中。如果可以让 LTO 在这里发生,但不能稍后发生,那么您就可以获得您正在寻找的那种“部分”LTO。-r--relocatable

遗憾的ld -r是行不通;它只是组合所有要稍后处理的 LTO 信息。但通过 gcc 驱动程序 ( gcc -r) 调用它似乎可以工作:

交流电

int a() {
    return 42;
}
Run Code Online (Sandbox Code Playgroud)

公元前

int a(void);

int b() {
    return a();
}
Run Code Online (Sandbox Code Playgroud)

抄送

int b(void);

int c() {
    return b();
}
Run Code Online (Sandbox Code Playgroud)

直流电

int c(void);

int main() {
    return c();
}
Run Code Online (Sandbox Code Playgroud)
$ gcc -O3 -flto -c [a-d].c
$ gcc -O3 -r -nostdlib a.o b.o -o g1.o
$ gcc -O3 -r -nostdlib c.o d.o -o g2.o
$ gcc -O3 -fno-lto g1.o g2.o
$ objdump -d a.out
...
00000000000004f0 <main>:
 4f0:   e9 1b 01 00 00          jmpq   610 <b>
...
0000000000000610 <b>:
 610:   b8 2a 00 00 00          mov    $0x2a,%eax
 615:   c3                      retq   
...
Run Code Online (Sandbox Code Playgroud)

因此main()优化为return b();,并b()优化为return 42;,但两组之间没有过程间优化。