如何在源代码中要求通过
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。在那种情况下,我将从迁移到新方式开始。
我正在进行优化过程,我需要在一个循环中删除一些无效的基本块。我知道 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。在那种情况下,我将从迁移到新方式开始。