2014-11-06 132 views
4

我想知道如何將通過LLVM通行證在LLVM IR一GetElementPointer指令,說假設我有一個數組插入GetElementpointer指令在LLVM IR

%arr4 = alloca [100000 x i32], align 4 

並想插入一個GEP像

%arrayidx = getelementptr inbounds [100000 x i32]* %arr, i32 0, i32 %some value 

在IRBuilder Class中寫入的指令序列會有如此多的指令來創建getelement指針。使用哪一個以及它的參數是什麼。 任何人都可以用示例來解釋它 任何幫助,將不勝感激。

回答

7

讓我們從GetElementPtrInst的文檔開始,因爲IRBuilder正在爲其構造函數提供包裝。如果我們想要添加這條指令,我通常會直接去創建。

GetElementPtrInst::Create(ptr, IdxList, name, insertpoint) 
  • PTR:這是一個值*傳遞到GetElementPtr(GEP)初始PTR值。在你的情況下,%arr。
  • IdxList:這是一個值列表,它是傳遞給GEP的偏移序列。你的例子有0和%一些值。
  • 姓名:這是IR的名稱。如果你想要「%arrayidx」,你可以提供「arrayidx」。
  • 插入點:如果沒有IRBuilder,則必須指定插入指令的位置(在另一條指令之前或在基本塊的末尾)。

把這些碎片拼湊起來,我們有下面的代碼序列:

Value* arr = ...; // This is the instruction producing %arr 
Value* someValue = ...; // This is the instruction producing %some value 

// We need an array of index values 
// Note - we need a type for constants, so use someValue's type 
Value* indexList[2] = {ConstantInt::get(someValue->getType(), 0), someValue}; 
GetElementPtrInst* gepInst = GetElementPtrInst::Create(arr, ArrayRef<Value*>(indexList, 2), "arrayIdx", <some location to insert>); 

現在,你問有關使用IRBuilder,其中有一個非常類似的function

IRBuilder::CreateGEP(ptr, idxList, name) 

如果你想要使用IRBuilder,那麼可以用類似的IRBuilder的調用替換代碼片段的最後一行。

+0

謝謝Brian。真的很好的解釋。 – techcomp 2014-11-07 10:13:20