2013-02-10 9 views
7

मैं एलएलवीएम 3.2 ऑप्टिमाइज़र के लिए पास बनाने की कोशिश कर रहा हूं जहां मुझे एक डोमिनेटर पेड़ चाहिए। PassManager से 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-methods में पैरामीटर के साथ विधि को कॉल करने के उदाहरण के रूप में उलझन में हूं ... –

+1

जैसा कि ट्यूटोरियल कहता है: "ए __ मॉड्यूल स्तर पास__ इस इंटरफ़ेस का उपयोग कर __ कार्यक्षमता स्तर स्तर विश्लेषण जानकारी का उपयोग कर सकता है "; आपका पास एक 'FunctionPass' है और पैरामीटर विधि एक' मॉड्यूलपास 'है, क्योंकि dominatorTree एक फ़ंक्शन से संबंधित विश्लेषण है, आप इसे अपने फ़ंक्शनपास में सीधे उपयोग कर सकते हैं। –

संबंधित मुद्दे