使用llvm :: dyn_cast进行转换导致错误

时间:2014-02-18 21:07:52

标签: llvm

我正在尝试迭代使用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,但同样的错误。

2 个答案:

答案 0 :(得分:1)

好吧,问题似乎是最新的llvm代码,因为我使用svn checkout获取最新代码。我终于拿到3.4稳定版,现在一切正常。

答案 1 :(得分:0)

您的错误来自解除引用useItr,而不是来自dyn_cast。你的代码对我来说很好,所以我看了value_use_iterator的实现,我能想到你的错误的唯一方法是,如果其中一个值是NULL。< / p>

NULL的使用并不是法律模块中可能发生的事情。因此,我建议在代码之前运行模块上的verifier pass以查看是否可以发现问题 - 否则您必须自己仔细检查模块。