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)
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 ... –
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. –