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

LLVM IR:获取调用站点的返回值,llvm,llvm-ir,Llvm,Llvm Ir,下面是一个关于分析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<

下面是一个关于分析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();
      }
非常令人惊讶的发现是,我在文档中找不到像get return value这样的东西:

有人能在这里照明吗?非常感谢。

CI调用指令是它的返回值。它具有继承值的类型

如果您想执行1+%47,作为一个示例,您可以进行如下添加:Value*add=BinaryOperation::CreateInstruction::add,CI,ConstantInt::geti256,1。。。;add指令是它的结果,add->getType==i256,因为它是两个类型都为i256的值的总和。

CI调用指令是它的返回值。它具有继承值的类型


如果您想执行1+%47,作为一个示例,您可以进行如下添加:Value*add=BinaryOperation::CreateInstruction::add,CI,ConstantInt::geti256,1。。。;add指令是它的结果,add->getType==i256,因为它是两个值的总和,这两个值的类型都是i256。

?函数在运行时作为常量返回的实际返回值?显然,除非调用是常量折叠的,否则在运行时之前您将无法知道这一点,在这种情况下,CallInst不再存在。还是将计算为返回值的指令?这只是电话本身。@sepp2k谢谢您的回复。因此,我想获取变量%47的值实例。这是CallInst。我有一个类似于您要求的用例,获取%47的值,并将其作为参数传递给另一个接受i32类型的函数。问题是,如果我们只使用CallInst,参数将类似于此调用%47 i32,它将与接受i32类型的新函数不兼容。LLVM是SSA,但类似这样的场景是一个有趣的问题。您到底想要得到什么?函数在运行时作为常量返回的实际返回值?显然,除非调用是常量折叠的,否则在运行时之前您将无法知道这一点,在这种情况下,CallInst不再存在。还是将计算为返回值的指令?这只是电话本身。@sepp2k谢谢您的回复。因此,我想获取变量%47的值实例。这是CallInst。我有一个类似于您要求的用例,获取%47的值,并将其作为参数传递给另一个接受i32类型的函数。问题是,如果我们只使用CallInst,参数将类似于此调用%47 i32,它将与接受i32类型的新函数不兼容。LLVM是SSA,但是像这样的场景是一个有趣的问题,如果我不想插入指令,还有其他方法可以获取函数的返回值。我只需要函数的返回值,因为llvm是SSA,我想我可以简单地将该值传递给另一个插装函数,但类型不兼容。新函数param为i32类型。如果我按原样传递,它会创建类似于此调用%i32的内容,该调用与新函数的i32 param类型不兼容。指令就是值。如果不插入指令,则该值不会进入程序的范围。如果你想知道一个函数的返回值,必须有一个调用该函数的函数,并且在SSA中。call指令是返回值,请参阅?或者,您的真正目标是在编译时对函数可能返回的内容进行推理(如果调用,但不调用它)?您可以传递值,您需要强制转换。怎么投取决于你。例如,有些语言对ints进行符号扩展,因此true变为32位-1,而另一些语言为零扩展,因此true变为1。允许您执行任何操作,只要您决定哪种类型的强制转换是合适的。如果我不想插入指令,是否有其他方法获取函数的返回值。我只需要函数的返回值,因为llvm是SSA,我想我可以简单地将该值传递给另一个插装函数,但类型不兼容。新函数param为i32类型。如果我按原样传递,它会创建类似于此调用%i32的内容,该调用与新函数的i32 param类型不兼容。指令就是值。如果不插入指令,则该值不会进入程序的范围。如果你想知道一个函数的返回值,必须有一个调用该函数的函数,并且在SSA中。call指令是返回值,请参阅?或者,您的真正目标是在编译时对函数可能返回的内容进行推理(如果调用,但不调用它)?您可以传递值,您需要强制转换。怎么投取决于你。例如,有些语言对ints进行符号扩展,因此true变为32位-1,而另一些语言为零扩展,因此true变为1。让你做任何事,只要你 你决定什么样的演员阵容是合适的。