微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在LLVM pass中获取对象的内存地址

如何解决如何在LLVM pass中获取对象的内存地址

代码行:

// mutex M
M.lock()

编译和链接后,我在仪器化的 IR 代码中得到了这一行:

call void @_ZNSt5mutex4lockEv(%"class.std::mutex"* nonnull dereferenceable(40) bitcast ({ %union.pthread_mutex_t }* @M to %"class.std::mutex"*))

在 LLVM pass 中,一旦我使用 CallInst *CI = cast<CallInst>(&i); 获得了 M.lock() 指令,我怎样才能获得 M 的内存地址?

解决方法

如果指令为 Instruction *,则 ->getArgOperand(0) 返回 Value *。该值或多或少是 M。您不知道它的最终数值,因为它是由链接器选择的,但是您可以在任何表达式中使用 M,并且链接器会在处理所有其他用途时为您的使用分配正确的数值。

在这种情况下,isa<ConstantExpr>(M) 返回 true,因为参数是一个强制转换。换句话说,auto C = dyn_cast<ConstantExpr>(M) 返回一个 ConstantExpr*,而 C->getOperand(0) 返回实际的 M(而 C->getOpcode() 返回一个强制转换操作码)。在许多其他示例中,M 将具有除 ConstantExpr 之外的另一种类型。如果您想进行全面分析,您通常会考虑多种情​​况。单元测试有帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。