问题描述
源代码行:
// 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
之外的另一种类型。如果您想进行全面分析,您通常会考虑多种情况。单元测试有帮助。