我想知道目前是否可以在 LTO 时间安排一个“外部”(.so/.dylib)LLVM 插件(模块)通过?想要这个的原因是我想添加一个模块间优化。
我也找到了这个话题;如何在 LLVM 中编写自定义模块间传递? 但是一个单独的工具对我来说不是一个选择。
谢谢
我想知道目前是否可以在 LTO 时间安排一个“外部”(.so/.dylib)LLVM 插件(模块)通过?想要这个的原因是我想添加一个模块间优化。
我也找到了这个话题;如何在 LLVM 中编写自定义模块间传递? 但是一个单独的工具对我来说不是一个选择。
谢谢
我认为这里最有帮助的事情可能是了解通行证的运行方式以及 LTO 期间代码的状态。
首先,当编译器运行优化过程时,它们是作为已添加到PassManager
. 这意味着LLVM/Clang
,当传递类似的东西时,-O3
将创建 a 的副本PassManager
并随后为其提供预期提供O3
优化级别的传递集。这与您对必须手动提供且无法正常放入传递管道的外部库所做的操作非常不同。
然后我们就有了做 LTO 时的状态。在链接时间优化期间,所有单独的翻译单元都已合并,现在是一个单独的Module
. 这意味着在每个函数上运行的优化将在代码库中的每个函数上运行。同样,每个模块的优化将完全运行Module
,因此提供程序间分析/优化。
如果您希望使用 Intra-Modular Pass,那么在 LTO 时没有理由这样做,您可以简单地制作一个ModulePass
并在每个单元上运行它。