我正在尝试迭代使用store inst的操作数。我按照程序员手册执行此操作,但是我收到了错误。
//x is store instruction pointing to [store i32 5, i32* %a, align 4]
Value *op2 = x->getOperand(1);
for (Value::use_iterator useItr=op2->use_begin(),useEnd=op2->use_end(); useItr!=useEnd;useItr++){
if (Instruction *Inst = dyn_cast_or_null<Instruction>(*useItr))
errs()<<"done";
}
我收到此错误消息:
IR / Use.h:204:UserTy * llvm :: value_use_iterator :: operator *()const [UserTy = llvm :: User]:断言`U&amp;&amp; “不能取消引用结束迭代器!”'失败。
根据我的理解,如果无法进行转换,dyn_cast应返回空指针而不是错误。我也尝试过dyn_cast_or_null,但同样的错误。
答案 0 :(得分:1)
好吧,问题似乎是最新的llvm代码,因为我使用svn checkout获取最新代码。我终于拿到3.4稳定版,现在一切正常。
答案 1 :(得分:0)
您的错误来自解除引用useItr
,而不是来自dyn_cast
。你的代码对我来说很好,所以我看了value_use_iterator
的实现,我能想到你的错误的唯一方法是,如果其中一个值是NULL
。< / p>
但NULL
的使用并不是法律模块中可能发生的事情。因此,我建议在代码之前运行模块上的verifier pass以查看是否可以发现问题 - 否则您必须自己仔细检查模块。