2013-02-10 13 views
7

Sto provando a creare un passaggio per l'ottimizzatore LLVM 3.2 in cui ho bisogno di un albero del dominatore. Questo dovrebbe essere facilmente possibile richiedendo il risultato dell'analisi DominatorTree da PassManager, ma anche questo semplice esempio si blocca.LLVM Pass segfaults su getAnalysis <DominatorTree>()

Cosa sto sbagliando?

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

quando chiamato con

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

si segfaults immediatamente con

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) 

risposta

3

Change DominatorTree& DT = getAnalysis<DominatorTree>(F); a DominatorTree& DT = getAnalysis<DominatorTree>(); sembra funzionare.

+0

Sì, sembra funzionare! Ma sono ancora confuso come l'esempio in http://llvm.org/docs/WritingAnLLVMPass.html#the-getanalysis-and-getanalysisifavailable-methods chiama il metodo con un parametro ... –

+1

Come dice il tutorial: "A __module level pass__ può utilizzare informazioni di analisi di livello __function__ utilizzando questa interfaccia "; il tuo pass è un 'FunctionPass' e il metodo parametrizzato è un' ModulePass', dal momento che dominatorTree è un'analisi correlata alla funzione, puoi utilizzarla direttamente in FunctionPass. –