Clang 编译前使用llvm链接

Clang 编译前使用llvm链接,clang,llvm,lto,Clang,Llvm,Lto,我做了一个小实验,看看如果我将一堆伪C源文件编译成一个LLVM位代码文件,Clang是否会产生更好的代码(首先使用-emit LLVM编译成.bc文件,然后使用LLVM link将它们弄脏成一个.bc文件)在编译到虚拟库之前,与通常编译到要链接的单个目标文件不同,它似乎能够执行一些WPO(整个程序优化),例如跨不同翻译单元的内联函数,否则它不会执行这些操作。我知道LTO(链接时间优化)是通过-flto实现的,所以这只是我的一个小实验,看看在这种特殊情况下,叮当声的表现会有多不同 然而,我的问题是

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

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

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

基本上,是的

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

嗯,我认为会有一些不同之处,但它们不应该有任何意义。当LTO感知链接器链接字节码并运行优化过程时,它使用
PassManagerBuilder::addltoptimizationpasses
管道从
lib/Transforms/IPO/PassManagerBuilder.cpp
。当您优化由
llvm link
生成的代码时,
opt
工具使用
PassManagerBuilder::populateModulePassManager
,这显然是不同的。很难说具体的差异是什么,但很可能在
llvmlink+opt
情况下,某些过程会运行两次