1

我做了一个小实验,看看如果我在编译之前将一堆虚拟 C 源文件编译成一个 LLVM 位代码文件(首先-emit-llvm用于编译成.bc文件,然后使用llvm-link将它们压缩成一个.bc文件), Clang 是否会产生更好的代码。一个虚拟库,而不是通常编译到要链接的单个目标文件,它似乎能够执行一些 WPO(整个程序优化),例如跨不同翻译单元的内联函数,否则它不会这样做。我通过 了解 LTO(链接时间优化)-flto,所以这更像是我的一个小实验,以了解 Clang 在这种特殊情况下的行为会有多么不同。

但是,我的问题是,以这种方式构建二进制文件是否可取?最终结果与简单地使用有什么不同-flto吗?如果是这样,无论是在过程还是最终结果方面,会有什么不同?如果不是,这只是一种更人为的调用 LTO 的方式吗?

4

1 回答 1

1

如果不是,这只是一种更人为的调用 LTO 的方式吗?

基本上,是的。

最终结果与简单地使用 -flto 有什么不同吗

嗯,我认为会有一些差异,但它们不应该有任何意义。当 LTO 感知链接器链接字节码并运行优化通道时,它使用PassManagerBuilder::addLTOOptimizationPasses来自lib/Transforms/IPO/PassManagerBuilder.cpp. 而当你优化生成的代码时llvm-linkopt工具使用PassManagerBuilder::populateModulePassManager的,显然是不同的。很难说到底会有什么不同,但很可能有些传球会运行两次llvm-link+opt以防万一。

于 2019-03-20T05:08:50.777 回答