更改llvm传递体系结构以在模块中找到所需的函数而不是主函数

时间:2013-05-23 09:38:10

标签: function optimization llvm main llvm-ir

我尝试对LLVM bitcode进行一些优化,而不生成最终的可执行二进制文件。我链接了所有项目bitcode。在这个测试中,bitcode中没有main函数,但是LLVM需要在模块中找到一个main函数来内化其他函数,我怎么能改变pass或passmanager而不是看main函数作为程序的入口点,看起来我的特殊功能如foo1,并假设foo1有主要功能的规则?

1 个答案:

答案 0 :(得分:2)

不,LLVM不“寻找主”,它根据LLVM IR文件中的linkage types函数行事。

默认的链接类型是external,这意味着可能还需要来自尚未链接的其他对象的函数。链接器不会删除或内化此类函数,也不会删除它们调用的函数(除非内联...)。但是,如果函数具有internalprivate链接,则可以将其内化,甚至在未从其他外部可见函数调用时删除。


更新:正如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);
  }