LLVM IR:获取调用点的返回值

5

这里有一个关于分析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
@sepp2k 感谢您的回复。所以我想要获取变量%47的“Value”实例。 - lllllllllllll
那是 CallInst - sepp2k
我有一个类似于你所问的用例,获取%47的值并将其作为参数传递给另一个接受i32类型的函数。问题在于,如果我们只使用CallInst,参数将看起来像这样call%47 i32,这与接受i32类型的新函数不兼容。LLVM是SSA,但这种情况是一个有趣的问题。 - webjockey
2个回答

8

CIcall指令)其返回值。它有一个继承自Value的类型。

如果要执行1 + %47,只是一个例子,可以像这样进行加法:Value * Add = BinaryOperation :: Create(Instruction :: Add,CI,ConstantInt :: get(i256,1),...);。而加法指令则是其结果,Add->getType() == i256,因为它是两个具有类型i256的值之和。


如果我不想插入指令,有没有其他方法可以获取函数的返回值?我只想要函数的返回值。 - webjockey
由于LLVM是SSA,我认为我可以简单地将值传递给另一个插装函数,但类型不兼容。新函数参数的类型为i32。如果我按原样传递,它会创建类似于此调用% i32的内容,这与新函数的i32参数类型不兼容。 - webjockey
指令就是值。如果您不插入指令,该值将无法进入程序的宇宙。如果您想知道函数的返回值,则必须调用该函数,并在SSA中。调用指令就是返回值,明白了吗?或者您真正的目标是在编译时推断函数可能返回的内容,而不需要调用它吗? - arnt
你可以传递值,但需要进行类型转换。如何进行转换取决于你。一些语言会对整数进行符号扩展,因此true变成32位的-1,而其他语言则会进行零扩展,所以true变成1。CastInst::Create()让你可以做任何事情,只要你决定什么样的转换是合适的。 - arnt

0

如果您需要“返回值”名称的字符串,可以在Instruction对象上使用inst.getName()inst.getNameOrAsOperand()。该对象是从Value类派生而来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接