Tôi đang cố gắng xây dựng một pass cho trình tối ưu hóa LLVM 3.2, nơi tôi cần một cây thống trị. Điều này có thể dễ dàng thực hiện được bằng cách yêu cầu kết quả phân tích DominatorTree
từ PassManager, nhưng ngay cả ví dụ đơn giản này cũng bị treo.LLVM Vượt qua segfaults trên getAnalysis <DominatorTree>()
Tôi đang làm gì sai?
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);
khi được gọi với
opt --load mypass.so -mypass --debug-pass=Structure test.bc
nó ngay lập tức segfaults với
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)
Có, điều đó dường như hoạt động! Nhưng tôi vẫn còn bối rối vì ví dụ trong http://llvm.org/docs/WritingAnLLVMPass.html#the-getanalysis-and-getanalysisifavailable-methods gọi phương thức có tham số ... –
Khi hướng dẫn cho biết: "A __module level pass__ có thể sử dụng thông tin phân tích cấp __function__ sử dụng giao diện này "; pass của bạn là 'FunctionPass' và phương thức parametered là một' ModulePass', vì dominatorTree là một hàm phân tích liên quan, bạn có thể sử dụng nó trong FunctionPass của bạn trực tiếp. –