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"
相关文章:
- 如何将 I->getType() 作为参数传递给 llvm 中的 CreateCall?
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- llvm构建器向基本块添加终止符
- 正在LLVM中检测整数比较条件
- 如何在LLVM中dyn_cast以识别StoreInst?
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- 如何使用 llvm-10 库在C++定义 LLVM 全局值变量?
- 编译 llvm 3.1 时,为什么会出现错误:在">"标记之前预期主表达式
- 如何删除 LLVM 中的不规则分支?
- LLVM | codegen 用于带有命令行选项的程序输入功能
- 编译 llvm 插件时出现问题:llvm/Config/llvm-config.h:没有这样的文件或目录
- 在调试模式下引发C++ "deque iterator not dereferencable"异常
- std::iterator::reference 必须是引用吗?
- 如何检查函数是否在LLVM Instrumentation pass的ModulePass的系统头文件中定义?
- 从macOS Catalina上的源代码编译LLVM(如何解决未找到"stdio.h")
- LLVM 选择找不到函数传递
- LLVM 编译:目标的配方 '../lib/IR/Release+Asserts/Intrinsics.gen.tmp' failed
- LLVM |如何实现逻辑非操作的 IR 代码生成
- 构建 LLVM 后未找到叮当