爲了學習LLVM,我製作了一個ModulePass,它貫穿函數,基本塊和最終指令。在某個時候,我想深入瞭解說明並進行分析。在閱讀文檔時,我遇到了http://llvm.org/docs/doxygen/html/classllvm_1_1InstVisitor.html,文檔建議使用這些結構來高效地遍歷IR,而不是執行很多if(auto* I = dyn_cast<>())
行。如何correclty實施LLVM InstVisitor?
我試圖使文件示例的變化,但對於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是否應該在通行證之外運行?如果我錯過了文檔,請告訴我該去哪裏。
我明白了!我必須很快地在文檔中閱讀這個例子。謝謝! –