如何在源代码中要求通过

How to require a pass within the source code

我正在进行优化过程,我需要在一个循环中删除一些无效的基本块。我知道 pass unreachableblockelim 可以完成这项工作,但我如何要求它在我的 pass 中间执行?也就是说,不使用 opt 命令行界面:

opt -load myOptPass.dylib -unreachableblockelim ir.bc -o ir2.bc

这可能吗?我在 llvm 源代码中找不到与我试图实现的类似的东西。

LLVM 目前包含两个传递管理器。您想要的通行证使用新的通行证(其特点是通行证继承了 PassInfoMixin),并且在 new-PM 通行证中使用它需要在通行证的 .cpp 文件中包含其头文件:

#include "llvm/CodeGen/UnreachableBlockElim.h"

您的传递将包含一个名为 运行() 的函数,它可能如下所示:

PreservedAnalyses MyPAss::run(Function &F, FunctionAnalysisManager &FAM) {
  // some of your code goes here

  UnreachableBlockElimPass ube;
  ube.run(F, FAM);

  // more of your code here
}

如果您的通行证使用旧的通行证管理器(以继承 FunctionPass、ModulePass 等为特征),那么它会涉及更多一些,因为您需要自己提供 FunctionAnalysisManager。在那种情况下,我将从迁移到新方式开始。