मैं एलएलवीएम 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)
हाँ, ऐसा लगता है कि काम करता है! लेकिन मैं अभी भी http://llvm.org/docs/WritingAnLLVMPass.html#the-getanalysis-and-getanalysisifavailable-methods में पैरामीटर के साथ विधि को कॉल करने के उदाहरण के रूप में उलझन में हूं ... –
जैसा कि ट्यूटोरियल कहता है: "ए __ मॉड्यूल स्तर पास__ इस इंटरफ़ेस का उपयोग कर __ कार्यक्षमता स्तर स्तर विश्लेषण जानकारी का उपयोग कर सकता है "; आपका पास एक 'FunctionPass' है और पैरामीटर विधि एक' मॉड्यूलपास 'है, क्योंकि dominatorTree एक फ़ंक्शन से संबंधित विश्लेषण है, आप इसे अपने फ़ंक्शनपास में सीधे उपयोग कर सकते हैं। –