1

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

4

1 回答 1

2

不,LLVM 不会“寻找主要”,它会根据LLVM IR 文件中函数的链接类型进行操作。

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


更新:正如 Oak 在评论中指出的那样,当 LLVM internalize pass 以默认方式运行时,它确实保留了main. 但是,您可以通过自己运行 internalize pass 来控制它,向其传递要保留的符号列表。

  • 如果您需要链接时优化,请PassManagerBuilder::populatePassManagerInternalize设置为 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);
  }
于 2013-05-24T18:49:50.320 回答