Qor*_*ros 2 pointers llvm-ir llvm-c++-api
我想分析LLVM IR中的指针值。
Value是一个非常重要的LLVM类。它是程序所计算的所有值的基类,可用作所有其他值的操作数。值是其他重要类的超类,例如指令和功能。所有值都有一个类型。类型不是Value的子类。一些值可以具有名称,并且它们属于某个模块。在值上设置名称会自动更新模块的符号表。
要测试a Value是否为指针,有一个函数a->getType()->isPointerTy()。LLVM还提供了LLVM PointerType类,但是没有直接的api来比较指针的值。
所以我想知道如何比较这些指针值,以测试它们是否相等。我知道有AliasAnalysis,但是我对AliasAnalysis结果有疑问,所以我想自己验证一下。
小智 5
快速的解决方案是使用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.
Run Code Online (Sandbox Code Playgroud)