2012-02-24 56 views
2

在我的llvm代碼中,我嘗試檢查迭代器InsertPos是否指向基本塊的最後一條指令,代碼如下。如何檢查迭代器的相等性?

BasicBlock::iterator InsertPos = BB->begin(); 
    LLVMContext &Context = BB->getContext(); 

    while (!(isa<CallInst>(InsertPos) || 
     (InsertPos == BB->getTerminator()))) // <-- Error here 
    ++InsertPos; 

但是,clang給我以下錯誤。

Basic2.cpp:82:54: error: use of overloaded operator '==' is ambiguous (with operand types 'BasicBlock::iterator' (aka 'ilist_iterator<llvm::Instruction>') 
     and 'llvm::TerminatorInst *') 
    while (!(isa<CallInst>(InsertPos) || (InsertPos == BB->getTerminator()))) 
              ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~ 
/home/hmushtaq/llvm/include/llvm/ADT/ilist.h:204:8: note: candidate function 
    bool operator==(const ilist_iterator &RHS) const { 
    ^
Basic2.cpp:82:54: note: built-in candidate operator==(class llvm::Instruction *, class llvm::Instruction *) 
    while (!(isa<CallInst>(InsertPos) || (InsertPos == BB->getTerminator()))) 
                ^
    Basic2.cpp:82:54: note: built-in candidate operator==(restrict class llvm::Instruction *, restrict class llvm::Instruction *) 
    Basic2.cpp:82:54: note: built-in candidate operator==(const restrict class llvm::Instruction *, const restrict class llvm::Instruction *) 
    Basic2.cpp:82:54: note: built-in candidate operator==(volatile class llvm::Instruction *, volatile class llvm::Instruction *) 
    Basic2.cpp:82:54: note: built-in candidate operator==(const volatile class llvm::Instruction *, const volatile class llvm::Instruction *) 
    Basic2.cpp:82:54: note: built-in candidate operator==(volatile restrict class llvm::Instruction *, volatile restrict class llvm::Instruction *) 
    Basic2.cpp:82:54: note: built-in candidate operator==(const class llvm::Instruction *, const class llvm::Instruction *) 
    Basic2.cpp:82:54: note: built-in candidate operator==(const volatile restrict class llvm::Instruction *, const volatile restrict class llvm::Instruction *) 

這樣做的正確方法是什麼?

回答

3

BB->getTerminator()返回一個指針(TerminatorInst *),而InsertPos是一個迭代(BasicBlock::iterator)。類型不匹配。

也許你可以嘗試

&*InsertPos == BB->getTerminator() 

你也可以查看指令是否與the isTerminator() method終止。

InsertPos->isTerminator() 
1

我解決了這個問題。

BasicBlock::iterator InsertPos = BB->begin(); 
BasicBlock::iterator TermPos = BB->getTerminator(); // <-- Added this variable 

while (!(isa<CallInst>(InsertPos) || (InsertPos == TermPos))) 
    ++InsertPos;