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