如何正确实现LLVM InstVisitor?

时间:2015-09-28 19:49:20

标签: llvm

为了学习LLVM,我创建了一个ModulePass,它运行了函数,基本块和最后的指令。在某些时候,我想深入了解说明并进行分析。在阅读我遇到的文档http://software.dell.com/landing/218/?gclid=CjwKEAjwyqOwBRDZuIO4p5SV8w0SJAAQoUSwC6B8BfgAQLML_8o3j9Bw1sUL01EljAjF9eXlZrY-nxoCYsjw_wcB时,文档建议使用这些结构来有效地遍历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是否应该在通行证之外运行?如果我错过了文档,请告诉我去哪里。

1 个答案:

答案 0 :(得分:4)

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

struct BranchInstVisitor : public InstVisitor<BranchInstVisitor>

每个访问者可以根据需要覆盖尽可能多的visit*方法 - 并不是每个访问者都与一种类型的指令相关联。那不是很有用。