我想分析LLVM IR中的指针值。
如LLVM Value Class所示,
Value
是一个非常重要的LLVM类。它是所有人的基础 由程序计算的值,可以用作其他的操作数 值。价值是其他重要类的超类,如 指令和功能。所有值都有一个类型。类型不是 Value的子类。某些值可以具有名称,并且它们属于某些值 模块。在值上设置名称会自动更新 模块的符号表。
要测试Value
是否为指针,有一个函数a->getType()->isPointerTy()
。 LLVM还提供LLVM PointerType class,但是没有直接的apis来比较指针的值。
所以我想知道如何比较这些指针值,以测试它们是否相等。我知道有AliasAnalysis
,但我对AliasAnalysis
结果有疑问,所以我想自己验证一下。
答案 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.