需要澄清 LLVM C 方法

use*_*276 5 c llvm

我正在使用 C 和 LLVM 编写一些代码。我知道LLVMGetOperand返回 aLLVMValueRef但我想知道它到底是什么,因为它似乎LLVMValueRef可以是许多不同的东西。是否LLVMGetOperand返回创建操作数的指令?

我最终需要做的是获取一个指令操作数并获取创造该值的指令。如在

%3 = ADD %1 %2
...
%5 = ADD ...
...
%8 = SUB %3 %5
Run Code Online (Sandbox Code Playgroud)

如果我知道指令%8 = SUB %3 %5,我想获取操作数%3%5然后用这些值获取指令%3 = ADD %1 %2%5 = ADD ...。我知道我需要使用,LLVMGetOperand()但我不知道它返回什么以及如何使用它来获取我需要的指令。如果它只是返回指令就好了。

我也调查过LLVMGetFirstUse()。是否LLVMGetFirstUse()接受一条指令,然后返回该指令产生的值的第一次使用?

我了解llvm.org并且一直在使用它,我只是需要比该网站上提供的更多说明。

Mik*_*kov 0

由于 C 绑定反映了 C++ 代码的结构,因此通常最好熟悉 C++ 中的工作方式。可以从《LLVM 程序员手册》开始。

你提到的ValueRef只是Value*在C代码中。手册中是这样描述的:

该类Value是 LLVM 源库中最重要的类。它表示一个类型值,可以(除其他外)用作指令的操作数。有许多不同的类型 Values,例如ConstantsArguments。甚至InstructionsFunctions 都是Values

现在,为了组装基本块,您通常使用该类IRBuilder。在 C 代码中,这对应于LLVMBuild*函数族。例如,以下是用于创建指令的函数的签名sub

LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
                          const char *Name);
Run Code Online (Sandbox Code Playgroud)

第一个参数是对对象的引用IRBuilder,第二个参数是第一个操作数,第三个参数是第二个操作数,最后一个参数是结果值的可选名称。所以你的例子看起来像这样(未经测试):

/* I'm assuming that you have already created a basic block bb. */
LLVMBuilderRef builder = LLVMCreateBuilder(); 
LLVMPositionBuilderAtEnd(builder, bb);
LLVMValueRef lhs = LLVMBuildAdd(builder, 
    LLVMConstInt(LLVMInt32Type(), 1, 0), 
    LLVMConstInt(LLVMInt32Type(), 2, 0), NULL);
LLVMValueRef rhs = LLVMBuildAdd(builder, 
    LLVMConstInt(LLVMInt32Type(), 3, 0), 
    LLVMConstInt(LLVMInt32Type(), 4, 0), NULL);
LLVMBuildSub(build, lhs, rhs, NULL);
Run Code Online (Sandbox Code Playgroud)

关于LLVMGetFirstUse:给定 a Value,您可以迭代使用它的所有位置。LLVMGetFirstUse为您提供一个LLVMUseRef指向使用列表头部的迭代器 ( ),您可以递增 ( LLVMGetNextUse) 和取消引用 ( LLVMGetUser)。请参阅llvm/Use.h获取更多信息。