问题描述
要学习LLVM,我制作了一个ModulePass,它遍历了函数,基本块以及最后的指令.在某些时候,我想深入研究说明并进行分析.在阅读文档时,我遇到了 http://llvm.org/docs/doxygen/html/classllvm_1_1InstVisitor.html ,并且文档建议使用这些结构来有效地遍历IR,而不要执行很多if(auto* I = dyn_cast<>())
行.
To learn LLVM I made a ModulePass that runs through the functions, basic blocks, and finally instructions. At some point I want to dig into the instructions and perform analysis. While reading the documentation I came across http://llvm.org/docs/doxygen/html/classllvm_1_1InstVisitor.html and the documentation recommends using these structures to efficiently traverse IR rather than do a lot of if(auto* I = dyn_cast<>())
lines.
我尝试过修改文档示例,但对于BranchInst
:
I tried making a variation of the documentation example, but for 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
中,我创建了访客:
Within my ModulePass
, I created the visitor:
for(Module::iterator F = M.begin(), modEnd = M.end(); F != modEnd; ++F){
BranchInstVisitor BIV;
BIV.visit(F);
...
不幸的是,编译时我对visit(F)
的调用失败:
Unfortunately, my call to visit(F)
fails when I compile:
error: invalid static_cast from type ‘llvm::InstVisitor<llvm::BranchInst>* const’ to type ‘llvm::BranchInst*’ static_cast<SubClass*>(this)->visitFunction(F);
如何正确实现LLVM InstVisitor? InstVisitor是否应该在通行证之外运行?如果我错过了文档,请告诉我去哪里.
How do I correctly implement an LLVM InstVisitor? Are InstVisitors supposed to be run outside of passes? If I missed documentation, please let me know where to go.
推荐答案
模板参数应该是您要声明的类型,而不是指令类型,例如:
The template parameter should be the type you're declaring, not a type of instruction, like this:
struct BranchInstVisitor : public InstVisitor<BranchInstVisitor>
每个访问者都可以根据需要覆盖任意多个visit*
方法-并不是每个访问者都被一种指令所束缚.那不是很有用.
Each visitor can override as many visit*
methods as you want -- it's not like each visitor is tied to one type of instruction. That wouldn't be very useful.
这篇关于如何正确实现LLVM InstVisitor?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!