我正在使用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在从第一个struct GEP返回的数组地址上,我将其向下隔离到第二个GEP。
对于一些附加信息,我已经注意到,如果我将第一个struct GEP替换为一个以struct类型为参数的常规GEP,然后将结构类型传递给第二个GEP,则llvm-dis不会报错,但随后的加载或存储将使用错误的类型,因此这显然不是一个真正的解决方案。
发布于 2021-03-24 18:05:24
好吧。所以,在这里回答。如您所见,您需要首先获得零索引,然后是索引7和0。原因很容易解释。让我们看一个为什么需要额外的零的例子:
char A *a = new A[123];第一个索引在你的情况下是零的,可以用在数组中,但在你的情况下它是指向单个元素的指针。在数组的情况下,它可以不是零。
无论如何,我对LLVM并不是很了解。请不要因为这个杀我:D
https://stackoverflow.com/questions/66728399
复制相似问题