为了学习 LLVM,我制作了一个 ModulePass,它贯穿了函数、基本块和最后的指令。在某些时候,我想深入研究说明并进行分析。在阅读文档时我遇到了http://llvm.org/docs/doxygen/html/classllvm_1_1InstVisitor.html并且文档建议使用这些结构来有效地遍历 IR,而不是做大量的操作if(auto* I = dyn_cast<>())
lines.
我尝试对文档示例进行变体,但是对于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*
你想要的方法——并不是每个访问者都依赖于一种类型的指令。那不会很有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)