LLVM-IR 获取结构元素指针

LLVM-IR Get Struct Element Pointer

我正在使用 C API 构建 LLVM-IR,并且有一个指向以下结构类型的指针:

{ i8*, i8*, i8*, i8*, i8*, i8*, i8*, [1 x i64] }

也就是说,几个 i8 指针和一个长整数数组,目前大小为 1,但将来会改变。

我想访问数组中位于索引 7 的元素,我目前的理解是我应该能够通过调用结构指针上的 LLVMBuildStructGEP 来完成此操作,传递索引 7,然后在返回的地址上调用 LLVMBuildGEP2,类型为 i64,索引为 0

当将模块传递给 LLVMAnalyseModule 时,此方法不会标记任何问题,但如果我转储模块的位码,然后将 运行 llvm-dis 转储到文件中,我收到错误:

llvm-dis: error: Explicit gep type does not match pointee type of pointer operand

我已经在从第一个结构 GEP 返回的数组地址上分离到第二个 GEP。

有关一些其他信息,我注意到如果我将第一个结构 GEP 替换为将结构类型作为参数的常规 GEP,然后将结构类型传递给第二个 GEP 应该是 i64 数组地址,llvm-dis 不会报错,但随后的加载或存储将使用错误的类型,因此这显然不是真正的解决方案。

好的。所以,在这里回答。 如您所见,您需要首先获得零索引,然后是索引 7 和 0。 原因很容易解释。 让我们看一个例子为什么需要额外的零:

char A *a = new A[123];

在您的情况下为零的第一个索引可用于数组,但在您的情况下它是指向单个元素的指针。在数组的情况下,它不能为零。

无论如何,我对 LLVM C API 不是很了解。请不要为此杀了我 :D