如何解决如何在LLVM pass中获取对象的内存地址
源代码行:
// mutex M
M.lock()
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 举报,一经查实,本站将立刻删除。