2016-11-22 86 views
0

我想分析LLVM IR中的指針值。如何比較LLVM-IR中的指針?

如圖LLVM Value Class所示,

Value是一個很重要的LLVM類。它是由程序計算的所有 值的基類,可用作其他 值的操作數。值是其他重要類的超類,如 指令和函數。所有值都有一個類型。類型不是 Value的子類。某些值可以有一個名稱,它們屬於某個 模塊。在值上設置名稱會自動更新模塊的符號表。

要測試一個Value是否是指針,有一個函數a->getType()->isPointerTy()。 LLVM也提供了一個LLVM PointerType class,但是沒有直接的API來比較指針的值。

所以我不知道如何比較這些指針值,以測試它們是否相等。我知道有AliasAnalysis,但我對AliasAnalysis結果有疑問,所以我想親自驗證它。

回答

2

快速解決方案是使用IRBuilder::CreatePtrDiff。這將計算兩個指針之間的差異,並返回i64結果。如果指針相等,則它將爲零,否則它將爲非零。

這似乎過度,看到CreatePtrDiff將付出額外的努力來計算元素而不是字節數數量方面的結果,但在所有的可能性,額外的部門將得到優化了。

另一種選擇是使用ptrtoint指令,並使用相當大的結果類型,如i64,然後執行整數比較。

從網上參考:

Value *  CreatePtrDiff (Value *LHS, Value *RHS, const Twine &Name="") 
Return the i64 difference between two pointer values, dividing out the size of the pointed-to objects.