c - 获取 LLVM getelementptr 的操作数名称

标签 c arrays llvm

我正在尝试获取 getelementptr 指令引用的数组的名称。当数组被索引到使用实际 c 代码中的中间变量时,这似乎有效

int a = 0;
i[a] = 3; 

在这种情况下,我得到以下位码

%arrayidx = getelementptr inbounds [2 x i32], [2 x i32]* @i, i64 0, i64 %idxprom
store i32 3, i32* %arrayidx, align 4

在这种情况下,我可以迭代 getelementptr 指令的操作数 并通过第一个操作数的 getName() 方法找到数组 (i) 的名称。

但是,如果在源代码中,数组直接索引,

i[0] = 3;

那么生成的bitcode如下

store i32 3, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @i, i64 0, i64 0), align 4

这里我不确定如何从位码中获取数组名称(i)。 存储指令的第二个操作数的类型设置为PointerTy。第二个操作数的包含类型是一个 int。这两者都符合预期,因为操作数是 i32*。但是,在这种情况下,我不确定如何获取 getelementptr 指令的句柄以迭代其操作数。

编辑:我应该提到数组 i 是一个全局的

最佳答案

在第一个示例中,store 的第二个操作数指令是 getelementptr 说明,但在第二个示例中,它是 getelementptr 常量表达式,因为指针和索引都是常量。

因此,在第一种情况下,如果您获得了 StoreInst 的指针操作数,你会得到一个 GetElementPtrInst .在第二种情况下,你会得到一个 ConstantExpr 谁的getOpcode()方法返回 Instruction::GetElementPtr .

您可以使用 GEPOperator 在您的代码中统一处理这两种情况。 .您可以使用 dyn_cast<GEPOperator>(I)它将对指令和常量表达式做正确的事情。

(注意——Operator 不是一个 LLVM IR 概念——它只是一个 C++ 抽象来帮助你处理指令或常量表达式(这可能发生在强制转换、GEP、或算术运算)但你不关心区别。)

关于c - 获取 LLVM getelementptr 的操作数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33574522/

相关文章:

c++ - 将所有值分配给结构体有什么意义吗?

c - 尝试在用户定义的函数中操作 char 数组的元素时收到错误

java - 如何避免在数组(Java)中引用相同的索引?

llvm - 获取 LLVM 中的函数所需的总周期数

macos - 包括 llvm,找不到 Value.h

c++ - 如何生成 LLVM 位码

c - 矩阵乘法的动态内存分配

c - 如何在到达某个字符时停止读取输入

c - 链表程序在构建下一个节点时崩溃

c++ - 在 typedef 结构中声明一个数组