我做了一个小实验,看看如果我将一堆虚拟C源文件编译成一个LLVM位代码文件(首先使用-emit-llvm
编译为.bc
文件,Clang是否会产生更好的代码,然后使用llvm-link
将它们拖入一个.bc
文件中),然后再编译成虚拟库,这与通常编译到要链接的单个目标文件相反,它似乎能够执行某些WPO (整个程序的优化),例如跨不同翻译单元的内联函数,否则就不会这样做。我知道通过-flto
的LTO(链接时优化),所以这是我的一个小实验,目的是了解Clang在这种特殊情况下的行为方式。
但是,我的问题是完全建议以这种方式构建二进制文件吗?最终结果与仅使用-flto
有什么不同吗?如果是这样,无论是过程还是最终结果都有什么不同?如果不是,这仅仅是调用LTO的一种更人为的方式吗?
答案 0 :(得分:1)
如果没有,这仅仅是调用LTO的一种更人为的方式吗?
基本上是。
最终结果与仅使用-flto有什么不同
嗯,我认为会有一些差异,但是它们之间没有任何意义。意识到LTO的链接器链接字节码并运行优化过程时,它将使用PassManagerBuilder::addLTOOptimizationPasses
中的lib/Transforms/IPO/PassManagerBuilder.cpp
管道。当优化由llvm-link
生成的代码时,opt
工具使用PassManagerBuilder::populateModulePassManager
,这显然是不同的。很难说到底会有什么差异,但是很可能在llvm-link+opt
情况下,某些传球会跑两次。