2013-02-10 16 views
7

Bir dominatör ağacına ihtiyacım olan LLVM 3.2 eniyileyicisine geçiş yapmaya çalışıyorum. Bu, PassManager'dan DominatorTree analiz sonucunu isteyerek kolayca yapılabilir, ancak bu basit örnek bile çöker.LLVM GetAnalysis'de geçiş segmansı <DominatorTree>()

Neyi yanlış yapıyorum?

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); 

DominatorTree& DT = getAnalysis<DominatorTree>(); için DominatorTree& DT = getAnalysis<DominatorTree>(F); iş gibi görünüyor

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) 

cevap

3

Değişim ile

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

hemen çalışma sırasında parçalama arızası ile çağrıldığında.

+0

Evet, işe yarıyor! Ama yine de http://llvm.org/docs/WritingAnLLVMPass.html#the-getanalysis-and-getanalysisifavailable-methods yönteminde bir parametre ile yöntemi çağırıyor gibi hala kafam karıştı ... –

+1

Öğreticinin dediği gibi: "A __module level pass__, bu arabirimi kullanarak __function__ level analysis bilgilerini kullanabilir. "; Geçişiniz bir 'FunctionPass' ve parametrelenmiş yöntem' ModulePass', çünkü dominatorTree fonksiyonla ilgili bir analizdir, doğrudan FunctionPass'inizde kullanabilirsiniz. –