2015-09-28 63 views
0

爲了學習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是否應該在通行證之外運行?如果我錯過了文檔,請告訴我該去哪裏。

回答

1

模板參數應該是你聲明的類型,而不是一個類型的指令,像這樣:

struct BranchInstVisitor : public InstVisitor<BranchInstVisitor> 

,只要你想每個遊客都可以覆蓋多達visit*方法 - 它不是像每個訪問者被綁定到一種類型的指令。這不會很有用。

+0

我明白了!我必須很快地在文檔中閱讀這個例子。謝謝! –