【发布时间】:2019-03-25 16:12:11
【问题描述】:
这是一个关于分析 LLVM IR 的快速问题。所以基本上我正在尝试获取 LLVM IR 函数调用语句的返回值,如下所示:
%47 = call i256 @test(i256 %46)
我想访问%47。
这是我用来访问参数的代码。
else if (funcName.contains("test")) {
Value *op = CI->getOperand(0);
if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(op))
// get the first function parameter
op = GEP->getPointerOperand();
}
非常令人惊讶的发现是,我在文档中找不到诸如“获取返回值”之类的东西:http://llvm.org/doxygen/classllvm_1_1CallInst.html
有人可以在这里点亮一些灯吗?非常感谢。
【问题讨论】:
-
您到底想在这里得到什么?函数在运行时将作为常量返回的实际返回值?显然,直到运行时您才能知道这一点(除非调用是恒定折叠的,在这种情况下,
CallInst不再存在)。还是将评估为返回值的指令?这只是CallInst本身。 -
@sepp2k 感谢您的回复。所以我想得到一个变量
%47的Value实例。 -
那是
CallInst。 -
我有一个类似于你问的用例,获取 %47 的值并将其作为参数传递给另一个接受 i32 类型的函数。问题是如果我们只使用 CallInst,参数将类似于 call%47 i32,它与接受 i32 类型的新函数不兼容。 LLVM 是 SSA,但这样的场景是一个有趣的问题