在LLVM IR中插入GetElementpointer指令

tec*_*omp 5 llvm

我想知道如何通过LLVM Pass在LLVM IR中插入GetElementPointer指令,假设我有一个数组

%arr4 = alloca [100000 x i32], align 4
Run Code Online (Sandbox Code Playgroud)

并希望插入一个类似的gep

 %arrayidx = getelementptr inbounds [100000 x i32]* %arr, i32 0, i32 %some value
Run Code Online (Sandbox Code Playgroud)

在IRBuilder类中编写的指令序列有很多指令来创建getelementpointer.使用哪一个以及它的参数是什么.任何人都可以用例子解释它任何帮助将不胜感激.

Bri*_*ian 8

让我们从GetElementPtrInst的文档开始,因为IRBuilder为其构造函数提供了一个包装器.如果我们想要添加此指令,我通常会直接调用create.

GetElementPtrInst::Create(ptr, IdxList, name, insertpoint)
Run Code Online (Sandbox Code Playgroud)
  • Ptr:这是一个Value*,它是传递给GetElementPtr(GEP)的初始ptr值.在你的情况下,%arr.
  • IdxList:这是一个值列表,它是传递给GEP的偏移序列.您的示例有0和%一些值.
  • 名称:这是IR中的名称.如果你想要"%arrayidx",你会提供"arrayidx".
  • insertpoint:如果没有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>);
Run Code Online (Sandbox Code Playgroud)

现在,您询问了如何使用IRBuilder,它具有非常相似的功能:

IRBuilder::CreateGEP(ptr, idxList, name)
Run Code Online (Sandbox Code Playgroud)

如果您想使用IRBuilder,那么您可以使用类似的IRBuilder调用替换代码段的最后一行.