答案 0 :(得分:9)
是!
链接时优化通常适用于“胖”目标文件中存在的中间表示(IR),它可以包含传统链接的机器代码和LTO链接的IR。
在这个阶段,没有更多高级语言结构,因此链接时优化与语言无关。
海湾合作委员会的link-time optimization(LTO)在GCC的中间代表之一GIMPLE上工作。 IR始终与语言无关,因此任何链接时优化都适用于使用任何语言生成的代码。
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)编译中混合语言时相同的链接命令选项。
以下是一个示例,向您展示这项技术的强大功能。我们将定义一个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 <main>:
4003d0: b8 0a 00 00 00 mov eax,0xa ; 1*3 + 2*2 + 3 = 10
4003d5: c3 ret
你可以看到它不仅将我的C func()
内联到我的C ++ main()
中,而且它将整个事物变成了一个常量表达式!
使用相同的语法,Clang能够使用LLVM IR发出“胖”对象文件,可以在链接时进行优化。请参阅LLVM Link Time Optimization。
使用与上面相同的测试代码,clang产生完全相同的结果:
00000000004004b0 <main>:
4004b0: b8 0a 00 00 00 mov eax,0xa
4004b5: c3 ret