在 LLVM IR 中插入 GetElementpointer 指令

2023-12-29

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

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

并想要插入一个像

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

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


让我们从文档开始获取元素指针实例 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 的调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 LLVM IR 中插入 GetElementpointer 指令 的相关文章

随机推荐