2014-02-18 64 views
2

我試圖迭代使用store inst的操作數。我遵循程序員手冊來做到這一點,但我得到錯誤。使用llvm :: dyn_cast鑄造錯誤

//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 ::運算符*()const的[UserTy = LLVM ::用戶]:斷言`Ù & &「無法取消引用結束迭代器!」'失敗。

在我的理解,如果鑄造不可能dyn_cast應該返回一個空指針而不是一個錯誤。我也嘗試dyn_cast_or_null,但同樣的錯誤。

+0

有沒有其他方法可以完成它? – rahuL

回答

0

您的錯誤來自於提取useItr,而不是來自dyn_cast。你的代碼對我來說看起來很好,所以我看了一下value_use_iterator的實現,並且我可以想到發生錯誤的唯一方法是如果其中一個值用於NULL

但是,在法律模塊中不會出現NULL的使用。所以我建議在你的代碼之前在你的模塊上運行verifier pass,看它是否能發現問題 - 否則你必須自己仔細檢查模塊。

0

那麼,問題似乎是最新的llvm代碼,因爲我使用svn checkout獲取最新的代碼。我終於拿到了3.4穩定版本,現在一切正常。