2013-02-10 51 views
7

我試圖爲LLVM 3.2優化器構建一個通行證,我需要一個支配樹。這應該很容易通過從PassManager請求DominatorTree分析結果,但即使這個簡單的示例崩潰。LLVM通過getAnalysis通過segfaults <DominatorTree>()

我在做什麼錯?

namespace { 
    struct Mypass : public FunctionPass { 
    static char ID; 

    Mypass() : FunctionPass(ID) { } 

    virtual void getAnalysisUsage(AnalysisUsage &AU) const { 
     AU.addRequired<DominatorTree>(); 
    } 

    virtual bool runOnFunction(Function &F) { 
     DominatorTree& DT = getAnalysis<DominatorTree>(F); 
     return false; 
    } 
    }; 
} 

char Mypass::ID = 0; 
static RegisterPass<Mypass> X("mypass", "My test analysis", true, true); 

時調用

opt --load mypass.so -mypass --debug-pass=Structure test.bc

立即出現segfaults與

Pass Arguments: -targetlibinfo -datalayout -domtree -mypass -preverify -domtree -verify 
Target Library Information 
Data Layout 
    ModulePass Manager 
    FunctionPass Manager 
     Dominator Tree Construction 
     My test analysis 
     Preliminary module verification 
     Dominator Tree Construction 
     Module Verifier 
0 libLLVM-3.2.so.1 0x00007f2d8172a1df 
1 libLLVM-3.2.so.1 0x00007f2d8172a649 
2 libpthread.so.0 0x00007f2d80842bd0 
3 mypass.so  0x00007f2d7f63deb9 llvm::DominatorTree& llvm::Pass::getAnalysisID<llvm::DominatorTree>(void const*, llvm::Function&) + 217 
4 mypass.so  0x00007f2d7f63ddce llvm::DominatorTree& llvm::Pass::getAnalysis<llvm::DominatorTree>(llvm::Function&) + 94 
5 mypass.so  0x00007f2d7f63dc38 
6 libLLVM-3.2.so.1 0x00007f2d811e0e3f llvm::FPPassManager::runOnFunction(llvm::Function&) + 575 
7 libLLVM-3.2.so.1 0x00007f2d811e0e83 llvm::FPPassManager::runOnModule(llvm::Module&) + 51 
8 libLLVM-3.2.so.1 0x00007f2d811e0ba4 llvm::MPPassManager::runOnModule(llvm::Module&) + 484 
9 libLLVM-3.2.so.1 0x00007f2d811e44bb llvm::PassManagerImpl::run(llvm::Module&) + 107 
10 opt    0x000000000040d606 main + 4230 
11 libc.so.6  0x00007f2d80189ea5 __libc_start_main + 245 
12 opt    0x000000000040db41 
Stack dump: 
0. Program arguments: opt --load mypass.so -mypass --debug-pass=Structure 
1. Running pass 'Function Pass Manager' on module '<stdin>'. 
2. Running pass 'My test analysis' on function '@const_expr' 
Segmentation fault (core dumped) 

回答

3

變化DominatorTree& DT = getAnalysis<DominatorTree>(F);DominatorTree& DT = getAnalysis<DominatorTree>();似乎工作。

+0

是的,這似乎工作!但我仍然感到困惑,因爲http://llvm.org/docs/WritingAnLLVMPass.html#the-getanalysis-and-getanalysisifavailable-方法中的示例使用參數調用方法... – 2013-02-12 19:32:16

+1

正如本教程所述:「A __module級別pass__可以使用__function__使用此接口的級別分析信息「;你的pass是一個'FunctionPass',參數化方法是一個'ModulePass',因爲dominatorTree是一個功能相關的分析,你可以直接在你的FunctionPass中使用它。 – 2013-02-13 02:49:51