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
我正在使用 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