我如何正确实施 LLVM InstVisitor?

How do I correclty implement an LLVM InstVisitor?

为了学习 LLVM,我制作了一个 ModulePass,它 运行 遍历了函数、基本块和最后的指令。在某些时候,我想深入研究说明并进行分析。在阅读文档时,我遇到了 http://llvm.org/docs/doxygen/html/classllvm_1_1InstVisitor.html 并且文档建议使用这些结构来有效地遍历 IR 而不是做很多 if(auto* I = dyn_cast<>()) 行。

我尝试对文档示例进行变体,但 BranchInst:

struct BranchInstVisitor : public InstVisitor<BranchInst> {                                               
    unsigned Count;                                                                                       
    BranchInstVisitor() : Count(0) {}                                                                     

    void visitBranchInst(BranchInst &BI){                                                                 
        Count++;                                                                                          
        errs() << "BI found! " << Count << "\n";                                                          
    }                                                                                                     

}; // End of BranchInstVisitor

在我的 ModulePass 中,我创建了访问者:

for(Module::iterator F = M.begin(), modEnd = M.end(); F != modEnd; ++F){
    BranchInstVisitor BIV; 
    BIV.visit(F);
    ...

不幸的是,我对 visit(F) 的调用在编译时失败了:

error: invalid static_cast from type ‘llvm::InstVisitor<llvm::BranchInst>* const’ to type ‘llvm::BranchInst*’ static_cast<SubClass*>(this)->visitFunction(F);

如何正确实现 LLVM InstVisitor? InstVisitors 是否应该 运行 在通行证之外?如果我错过了文档,请告诉我去哪里。

模板参数应该是您声明的类型,而不是指令类型,如下所示:

struct BranchInstVisitor : public InstVisitor<BranchInstVisitor>

每个访问者都可以覆盖任意数量的 visit* 方法——这并不是说每个访问者都受限于一种类型的指令。那不会很有用。