2016-11-22 87 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.