2012-10-28 60 views
4

我正在使用C和LLVM編寫一些代碼。我知道LLVMGetOperand返回LLVMValueRef,但我想知道究竟是什麼,因爲它好像LLVMValueRef可以是許多不同的事情。 LLVMGetOperand是否返回創建操作數的指令?需要澄清LLVM C方法

我最終需要做的是獲取指令操作數並獲取創建值的說明。作爲

%3 = ADD %1 %2 
... 
%5 = ADD ... 
... 
%8 = SUB %3 %5 

如果我知道指令%8 = SUB %3 %5,我想要得到的操作數%3%5,然後使用這些值獲得指示%3 = ADD %1 %2%5 = ADD ...。我知道我需要使用LLVMGetOperand(),但我不知道它是什麼回報以及如何使用它來獲得我需要的指示。如果它只是返回指令會很好。我也看了一下LLVMGetFirstUse()LLVMGetFirstUse()是否接受指令,然後返回指令產生的值的第一次使用?

我知道關於llvm.org並且一直在使用它,我只需要比在該網站上給出的更多的說明。

回答

0

由於C綁定反映了C++代碼的結構,因此熟悉如何在C++中完成這些事情通常是一個好主意。一個地方開始是LLVM Programmer's Manual

您提到的ValueRef只是Value*的C代碼。這裏的how it is described in the manual

Value類是LLVM源代碼庫中最重要的類。 它表示可以用作(除其他之外)作爲指令的操作數的類型值。有許多不同類型的 Values,例如ConstantsArguments。即使InstructionsFunctions 也是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