llvm基本块前辈llvm pred_iterator超出范围

时间:2015-08-26 14:39:24

标签: c++ compiler-construction llvm

我试图对基本块的前辈进行迭代,并且我正在使用以下代码:

case

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

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

有没有人有任何想法可能导致这个问题?我的代码基于:http://llvm.org/docs/ProgrammersManual.html#iterating-over-predecessors-successors-of-blocks

谢谢!

2 个答案:

答案 0 :(得分:0)

首先,解决您的方法与您引用的示例中的方法之间的差异非常重要。

在示例中,他们定义了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的输入方式来尝试并诊断问题是定义。

答案 1 :(得分:0)

我一直在寻找svn历史,因为LLVM 3.5,CFG.h已从include / llvm / Support转移到include / llvm / IR。所以你可能想要使用以下

#include "llvm/IR/CFG.h"

而不是

#include "llvm/Support/CFG.h"