由於C綁定反映了C++代碼的結構,因此熟悉如何在C++中完成這些事情通常是一個好主意。一個地方開始是LLVM Programmer's Manual。
您提到的ValueRef
只是Value*
的C代碼。這裏的how it is described in the manual:
Value
類是LLVM源代碼庫中最重要的類。 它表示可以用作(除其他之外)作爲指令的操作數的類型值。有許多不同類型的 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
:給定一個Value
,你可以遍歷使用它的所有地方。 LLVMGetFirstUse
爲您提供了一個迭代器(LLVMUseRef
),指向可以遞增的使用列表頭(LLVMGetNextUse
)和取消引用(LLVMGetUser
)。有關更多信息,請參閱llvm/Use.h
。