gpt4 book ai didi

llvm - 在 LLVM IR 中插入 GetElementpointer 指令

转载 作者:行者123 更新时间:2023-12-04 17:47:59 30 4
gpt4 key购买 nike

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

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

并且想要插入一个 gep 之类的
 %arrayidx = getelementptr inbounds [100000 x i32]* %arr, i32 0, i32 %some value

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

最佳答案

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

GetElementPtrInst::Create(ptr, IdxList, name, insertpoint)
  • Ptr:这是一个 Value*,它是传递给 GetElementPtr (GEP) 的初始 ptr 值。在你的情况下,%arr。
  • IdxList:这是一个值列表,这些值是传递给 GEP 的偏移量序列。您的示例具有 0 和 %some 值。
  • 名称:这是 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 的调用替换代码片段的最后一行。

    关于llvm - 在 LLVM IR 中插入 GetElementpointer 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26787341/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com