我如何正确实施 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*
方法——这并不是说每个访问者都受限于一种类型的指令。那不会很有用。
为了学习 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*
方法——这并不是说每个访问者都受限于一种类型的指令。那不会很有用。