获取 LLVM getelementptr 中的操作数名称

2024-05-13

我正在尝试获取 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 http://llvm.org/docs/doxygen/html/classllvm_1_1GetElementPtrInst.html。在第二种情况下,你会得到一个ConstantExpr http://llvm.org/docs/doxygen/html/classllvm_1_1ConstantExpr.html whose getOpcode()方法返回Instruction::GetElementPtr.

您可以通过使用在代码中统一处理这两种情况GEPOperator http://llvm.org/docs/doxygen/html/classllvm_1_1GEPOperator.html。您可以使用dyn_cast<GEPOperator>(I)它会为指令和常量表达式做正确的事情。

(笔记 -Operator不是一个 LLVM IR 概念——它只是一个 C++ 抽象,可以在这样的情况下提供帮助,在这种情况下,您可能正在处理指令或常量表达式(这可能发生在强制转换、GEP 或算术运算中)但您并不关心关于区别。)

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

获取 LLVM getelementptr 中的操作数名称 的相关文章

随机推荐