我正在使用 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并且一直在使用它,我只是需要比该网站上提供的更多说明。
由于 C 绑定反映了 C++ 代码的结构,因此通常最好熟悉 C++ 中的工作方式。可以从《LLVM 程序员手册》开始。
你提到的ValueRef只是Value*在C代码中。手册中是这样描述的:
该类
Value是 LLVM 源库中最重要的类。它表示一个类型值,可以(除其他外)用作指令的操作数。有许多不同的类型Values,例如Constants,Arguments。甚至Instructions和Functions都是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获取更多信息。