为了学习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是否应该在通行证之外运行?如果我错过了文档,请告诉我去哪里。
答案 0 :(得分:4)
模板参数应该是您要声明的类型,而不是一种类型的指令,如下所示:
struct BranchInstVisitor : public InstVisitor<BranchInstVisitor>
每个访问者可以根据需要覆盖尽可能多的visit*
方法 - 并不是每个访问者都与一种类型的指令相关联。那不是很有用。