如何比较LLVM-IR中的指针?

时间:2016-11-22 03:30:24

标签: pointers llvm-ir llvm-c++-api

我想分析LLVM IR中的指针值。

LLVM Value Class所示,

  

Value是一个非常重要的LLVM类。它是所有人的基础   由程序计算的值,可以用作其他的操作数   值。价值是其他重要类的超类,如   指令和功能。所有值都有一个类型。类型不是   Value的子类。某些值可以具有名称,并且它们属于某些值   模块。在值上设置名称会自动更新   模块的符号表。

要测试Value是否为指针,有一个函数a->getType()->isPointerTy()。 LLVM还提供LLVM PointerType class,但是没有直接的apis来比较指针的值。

所以我想知道如何比较这些指针值,以测试它们是否相等。我知道有AliasAnalysis,但我对AliasAnalysis结果有疑问,所以我想自己验证一下。

1 个答案:

答案 0 :(得分:4)

快速解决方案是使用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.