我正在尝试迭代基本块的前身,并且正在使用以下代码:
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
的类型,以诊断问题。