【问题标题】:llvm basic block predecessors llvm pred_iterator out of rangellvm 基本块前辈 llvm pred_iterator 超出范围
【发布时间】:2015-08-26 14:39:23
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: c++ compiler-construction llvm


    【解决方案1】:

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

    在示例中,它们定义了 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 的类型定义来诊断问题.

    【讨论】:

      【解决方案2】:

      我一直在查看 svn 的历史,从 LLVM 3.5 开始,CFG.h 已从 include/llvm/Support 移至 include/llvm/IR。所以你可能想使用以下

      #include "llvm/IR/CFG.h"
      

      而不是

      #include "llvm/Support/CFG.h"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-03
        相关资源
        最近更新 更多