由于 C 绑定反映了 C++ 代码的结构,因此熟悉 C++ 中的工作方式通常是一个好主意。一个起点是LLVM Programmer's Manual。
你提到的ValueRef
只是Value*
在C代码中。以下是手册中的描述:
该类Value
是 LLVM Source 基础中最重要的类。它表示一个类型化的值,可以(除其他外)用作指令的操作数。有很多不同的类型
Values
,例如Constants
, Arguments
。甚至Instructions
和Functions
是Values
。
现在,为了组装基本块,您通常使用IRBuilder
该类。在 C 代码中,这对应于LLVMBuild*
函数族。例如,这里是用于创建sub
指令的函数的签名:
LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
const char *Name);
第一个参数是对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);
关于LLVMGetFirstUse
: 给定 a Value
,您可以遍历所有使用它的地方。LLVMGetFirstUse
给你一个迭代器 ( LLVMUseRef
) 指向你可以递增 ( LLVMGetNextUse
) 和取消引用 ( LLVMGetUser
) 的使用列表的头部。有关llvm/Use.h
更多信息,请参阅。