2017-04-08 4 views
1

패스 중이 아닌 IR 파일에서 모든 선행 기본 블록을 가져 오려고합니다. 내가 this link에서 for (BasicBlock *Pred : pred_iterator(bb)) {}를 추가 할 때 나는, 그러나'llvm :: BasicBlock'을 'pred_iterator'로 어떻게 변환합니까?

for (auto iter1 = m->getFunctionList().begin(); 
    iter1 != m->getFunctionList().end(); 
    iter1++) 
{ 
    for (auto iter2 = f.getBasicBlockList().begin(); 
     iter2 != f.getBasicBlockList().end(); 
     iter2++) 
    { 
    BasicBlock &bb = *iter2; 

    std::cout << " BasicBlock: " << bb.getName().str() << std::endl; 
    } 
} 

사용하여 모든 기본 블록을 반복 할 수 있습니다, 나는

for (auto iter1 = m->getFunctionList().begin(); 
    iter1 != m->getFunctionList().end(); 
    iter1++) 
{ 
    for (auto iter2 = f.getBasicBlockList().begin(); 
     iter2 != f.getBasicBlockList().end(); 
     iter2++) 
    { 
    BasicBlock &bb = *iter2; 

    std::cout << " BasicBlock: " << bb.getName().str() << std::endl; 
    for (BasicBlock *Pred : pred_iterator(bb)) {} 
    } 
} 

오류가 여기에있다

test2.cpp:63:37: error: no matching conversion for functional-style cast from 'llvm::BasicBlock' to 'pred_iterator' (aka 'PredIterator<llvm::BasicBlock, user_iterator_impl<llvm::User> >') 
     for (BasicBlock *Pred : pred_iterator(bb)) { 
           ^~~~~~~~~~~~~~~~ 

아래에 표시되는 오류를 얻을 몇 가지 추가 정보 :

/usr/local/include/llvm/IR/CFG.h:48:19: note: candidate constructor not viable: no known conversion from 'llvm::BasicBlock' to 'llvm::BasicBlock *' for 1st argument; take the address of the 
     argument with & 
    explicit inline PredIterator(Ptr *bb) : It(bb->user_begin()) { 
       ^
Additional Informatino is below. 
/usr/local/include/llvm/IR/CFG.h:30:7: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'llvm::BasicBlock' to 'const 
     llvm::PredIterator<llvm::BasicBlock, llvm::Value::user_iterator_impl<llvm::User> >' for 1st argument 
class PredIterator : public std::iterator<std::forward_iterator_tag, 
    ^
/usr/local/include/llvm/IR/CFG.h:30:7: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'llvm::BasicBlock' to 
     'llvm::PredIterator<llvm::BasicBlock, llvm::Value::user_iterator_impl<llvm::User> >' for 1st argument 
/usr/local/include/llvm/IR/CFG.h:47:3: note: candidate constructor not viable: requires 0 arguments, but 1 was provided 
    PredIterator() {} 
^
/usr/local/include/llvm/IR/CFG.h:51:10: note: candidate constructor not viable: requires 2 arguments, but 1 was provided 
    inline PredIterator(Ptr *bb, bool) : It(bb->user_end()) {} 

'llvm :: BasicBlock'에서 'pred_iterator'로 변환하는 방법은 무엇입니까?

답변

1

게시 한 오류 메시지에 표시된대로 pred_iterator 생성자는 이 아니라 BasicBlock&이 걸립니다.

예를 들어 다른 문제는 범위 기반 루프를 반복하려면 반복자가 아니라 범위가 필요하다는 것입니다. 이를 위해서는 llvm::predecessors이라는 도우미를 사용해야합니다.

for (BasicBlock *Pred : predecessors(&bb)) {} 
:

이 오류를 해결, 우리는 다음에 도착