[英]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.