更改LLVM传递架构以查找所需函数而不是模块中的主函数



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

不,LLVM不会"查找main",它会根据LLVM IR文件中函数的链接类型进行操作。

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


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);
  }

相关内容

  • 没有找到相关文章

最新更新