簡體   English   中英

llvm基本塊的前身llvm pred_iterator超出范圍

[英]llvm basic block predecessors llvm pred_iterator out of range

我正在嘗試迭代基本塊的前身,並且正在使用以下代碼:

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM