让我们从文档开始获取元素指针实例 http://www.llvm.org/docs/doxygen/html/classllvm_1_1GetElementPtrInst.html,因为 IRBuilder 为其构造函数提供了一个包装器。如果我们想添加这条指令,我通常会直接调用 create。
GetElementPtrInst::Create(ptr, IdxList, name, insertpoint)
- Ptr:这是一个 Value*,它是传递给 GetElementPtr (GEP) 的初始 ptr 值。在你的情况下,%arr。
- IdxList:这是传递给 GEP 的偏移序列值的列表。您的示例具有 0 和 %some 值。
- 名称:这是 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>);
现在,您询问了有关使用 IRBuilder 的问题,它具有非常相似的功能function http://www.llvm.org/docs/doxygen/html/classllvm_1_1IRBuilder.html#ac46176b523c8a76a9ccdb5683279db94:
IRBuilder::CreateGEP(ptr, idxList, name)
如果您想使用 IRBuilder,那么您可以将代码片段的最后一行替换为类似 IRBuilder 的调用。