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