首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LLVM-IR获取结构元素指针

LLVM-IR获取结构元素指针
EN

Stack Overflow用户
提问于 2021-03-21 10:51:23
回答 1查看 189关注 0票数 0

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

代码语言:javascript
复制
{ i8*, i8*, i8*, i8*, i8*, i8*, i8*, [1 x i64] }

也就是说,几个i8指针和一个长整数数组,目前大小为1,但这将在未来发生变化。

我想访问索引7处的数组中的元素,我目前的理解是,我应该能够这样做:在指向结构的指针上调用LLVMBuildStructGEP,传递索引7,然后在返回的地址上调用LLVMBuildGEP2,类型为i64,索引为0

这个方法在将模块传递给LLVMAnalyseModule时不会标记出任何问题,但是如果我转储模块的位码,然后对文件运行llvm-dis,我会得到错误:

代码语言:javascript
复制
llvm-dis: error: Explicit gep type does not match pointee type of pointer operand

在从第一个struct GEP返回的数组地址上,我将其向下隔离到第二个GEP。

对于一些附加信息,我已经注意到,如果我将第一个struct GEP替换为一个以struct类型为参数的常规GEP,然后将结构类型传递给第二个GEP,则llvm-dis不会报错,但随后的加载或存储将使用错误的类型,因此这显然不是一个真正的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-24 18:05:24

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

代码语言:javascript
复制
char A *a = new A[123];

第一个索引在你的情况下是零的,可以用在数组中,但在你的情况下它是指向单个元素的指针。在数组的情况下,它可以不是零。

无论如何,我对LLVM并不是很了解。请不要因为这个杀我:D

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66728399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档