2013-02-10 25 views
7

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) 

Trả lời

3

Thay đổi DominatorTree& DT = getAnalysis<DominatorTree>(F); để DominatorTree& DT = getAnalysis<DominatorTree>(); dường như làm việc.

+0

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

+1

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

Các vấn đề liên quan