LLVM基本块的前身LLVM pred_iterator超出范围



我正在尝试迭代一个基本块的前辈,我正在使用以下代码:

for (::llvm::PredIterator PI = pred_begin(post_block); PI != pred_end(post_block); PI++)
{
    ::llvm::BasicBlock *pred = *PI;
    if (pred != exec_block)
    { ...

在if语句行中,我得到以下错误:

In instantiation of ‘llvm::PredIterator<Ptr, USE_iterator>::reference llvm::PredIterator<Ptr, USE_iterator>::operator*() const [with Ptr = llvm::BasicBlock; USE_iterator = llvm::Value::use_iterator_impl<llvm::Use>; llvm::PredIterator<Ptr, USE_iterator>::reference = llvm::BasicBlock*]’:LLVMTC.cpp:1489:31:  
required from here /usr/local/include/llvm/Support/CFG.h:56:5: error: ‘const class llvm::Value::use_iterator_impl<llvm::Use>’ has no member named ‘atEnd’
 assert(!It.atEnd() && "pred_iterator out of range!");

有没有人知道是什么原因导致了这个问题?我的代码基于:http://llvm.org/docs/ProgrammersManual.html#iterating-over-predecessors-successors-of-blocks.

谢谢!

首先,重要的是要指出您的方法与您引用的示例中的方法之间的区别。

在示例中,它们定义了pred_iterator类型的实例,而不是您使用的PredIterator类,后者定义为

typedef PredIterator<BasicBlock, Value::user_iterator> pred_iterator

,然后使用调用pred_begin返回pred_iterator(BB)的实例,其中BB是您传递的基本块。

在您的例子中,您正在创建PredIterator类的实例并将其分配给BB指针,然后尝试解引用,在此基础上它会命中以下断言:

inline reference operator*() const {
    assert(!It.atEnd() && "pred_iterator out of range!");
    return cast<TerminatorInst>(*It)->getParent();
}

作为最初的解决方案,尝试并完全模仿示例中使用的方法可能会有所帮助,然后,如果您仍然需要使用您的方法,请尝试通过观察如何定义PredIterator的类型来诊断问题。

我一直在看svn的历史,从LLVM 3.5开始,CFG.h已经从include/LLVM/Support移动到include/LLVM/IR。因此,您可能需要使用以下

#include "llvm/IR/CFG.h"
不是

#include "llvm/Support/CFG.h"

最新更新