我尝试在不生成最终可执行二进制文件的情况下对LLVM位码进行一些优化。我链接所有的项目位码。在这个测试中没有主函数在位码,但LLVM需要在模块中找到一个主函数来内化其他函数,我怎么能改变pass或passmanager,而不是寻找主函数作为程序的入口点,看起来我的特殊函数像foo1,假设foo1有主函数的规则?
不,LLVM不会"查找main",它会根据LLVM IR文件中函数的链接类型进行操作。
默认链接类型是external
,这意味着该函数可能需要来自尚未链接的其他对象。链接器不会删除或内部化这样的函数,也不会删除它们调用的函数(除非内联…)。但是,如果一个函数具有internal
或private
链接,则可以将其内部化甚至删除,如果不从其他外部可见的函数中调用。
Update:正如Oak在评论中指出的那样,当LLVM内部化通道以默认方式运行时,它确实保留了main
。但是,您可以通过自己运行internalize传递来控制它,将要保留的符号列表传递给它。
- 如果需要优化链路时间,请调用
PassManagerBuilder::populatePassManager
,并将Internalize
设置为false。 - 添加您自己的
InternalizePass
,只需您需要的符号。
这已经在代码库的另一个地方完成了,在LTOCodeGenerator.cpp
中。请看LTOCodeGenerator::generateObjectFile
中的注释:
// Enabling internalize here would use its AllButMain variant. It
// keeps only main if it exists and does nothing for libraries. Instead
// we create the pass ourselves with the symbol list provided by the linker.
if (!DisableOpt) {
PassManagerBuilder().populateLTOPassManager(passes,
/*Internalize=*/false,
!DisableInline,
DisableGVNLoadPRE);
}