2014-11-06 2 views
4

Мне интересно, как вставить инструкцию GetElementPointer в LLVM IR через LLVM Pass, скажем, предположим, у меня есть массивВставка GetElementpointer Инструкция в LLVM IR

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

и хотят, чтобы вставить GEP как

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

Какая последовательность инструкций для записи, как в классе IRBuilder, существует так много инструкций для создания getelementpointer. Какой из них использовать и какими будут его параметры. может кто-нибудь объяснить это примером Любая помощь будет оценена.

ответ

7

Начнем с документации для GetElementPtrInst, так как IRBuilder предоставляет оболочку своим конструкторам. Если мы хотим добавить эту инструкцию, я обычно иду прямо и вызываю create.

GetElementPtrInst::Create(ptr, IdxList, name, insertpoint) 
  • Ptr: Это значение *, что это начальное значение PTR передается GetElementPtr (ПВС). В вашем случае,% обр.
  • IdxList: Это список значений, которые являются последовательностью смещений, переданных в GEP. В вашем примере есть 0 и% некоторого значения.
  • Имя: Это имя в ИК-диапазоне. Если вы хотите «% 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

Спасибо Брайан. Действительно хорошее объяснение. – techcomp

Смежные вопросы