LTO for gcc或clang可以跨C和C ++方法进行优化

如果链接时优化(LTO)与gcc或clang一起使用 ,是否可以跨C和C ++语言边界优化代码?

例如,C函数可以内联到C ++调用者中吗?

是!

链接时优化通常适用于“胖”目标文件中存在的中间表示(IR),其可以包含用于传统链接的机器代码和用于LTO链接的IR。

在这个阶段,没有更高级的语言结构,因此链接时优化与语言无关。


GCC

GCC的链路时间优化 (LTO)适用于GCC的中间代表之一GIMPLE。 IR始终与语言无关,因此任何链接时优化都可以在任何语言生成的代码中使用。

从GCC Optimization Options文档中:

LTO的另一个特性是可以对用不同语言编写的文件应用过程间优化:

gcc -c -flto foo.c g++ -c -flto bar.cc gfortran -c -flto baz.f90 g++ -o myprog -flto -O3 foo.o bar.o baz.o -lgfortran 

请注意,最终链接是使用g ++完成的,以获取C ++运行时库,并添加-lgfortran以获取Fortran运行时库。 通常,在LTO模式下混合语言时,应使用与在常规(非LTO)编译中混合语言时相同的链接命令选项。


这是一个示例,向您展示这项技术的强大function。 我们将定义一个C函数并从C ++程序中调用它:

func.h

 #ifndef FUNC_DOT_H #define FUNC_DOT_H #ifdef __cplusplus extern "C" { #endif int func(int a, int b, int c); #ifdef __cplusplus } #endif #endif /* FUNC_DOT_H */ 

func.c

 #include "func.h" int func(int a, int b, int c) { return 3*a + 2*b + c; } 

main.cpp

 #include "func.h" int main() { int a = 1; int b = 2; int c = 3; return func(a, b, c); } 

 gcc -o func.o -c -Wall -Werror -flto -O2 func.c g++ -o main.o -c -Wall -Werror -flto -O2 main.cpp g++ -o testlto -flto -O2 main.o func.o 

拆解objdump -Mintel -d -R -C testlto

 Disassembly of section .text: 00000000004003d0 
: 4003d0: b8 0a 00 00 00 mov eax,0xa ; 1*3 + 2*2 + 3 = 10 4003d5: c3 ret

你可以看到它不仅将我的C func()内联到我的C ++ main() ,而且它将整个事物变成了一个常量表达式!


Clang / LLVM

使用相同的语法,Clang能够使用LLVM IR发出“胖”对象文件,这可以在链接时进行优化。 请参阅LLVM链路时间优化 。

使用与上面相同的测试代码,clang产生完全相同的结果:

 00000000004004b0 
: 4004b0: b8 0a 00 00 00 mov eax,0xa 4004b5: c3 ret