我尝试对LLVM bitcode进行一些优化,而不生成最终的可执行二进制文件。我链接了所有项目bitcode。在这个测试中,bitcode中没有main函数,但是LLVM需要在模块中找到一个main函数来内化其他函数,我怎么能改变pass或passmanager而不是看main函数作为程序的入口点,看起来我的特殊功能如foo1,并假设foo1有主要功能的规则?
答案 0 :(得分:2)
不,LLVM不“寻找主”,它根据LLVM IR文件中的linkage types函数行事。
默认的链接类型是external
,这意味着可能还需要来自尚未链接的其他对象的函数。链接器不会删除或内化此类函数,也不会删除它们调用的函数(除非内联...)。但是,如果函数具有internal
或private
链接,则可以将其内化,甚至在未从其他外部可见函数调用时删除。
更新:正如Oak在评论中指出的那样,当LLVM内部化传递以默认方式运行时,它确实保留了main
。但是,您可以通过自己运行internalize传递来控制它,并传递一个符号列表以保存。
PassManagerBuilder::populatePassManager
设为false的情况下致电Internalize
。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);
}