compiler-construction - 我应该如何从 LLVM 前端的基本复合类型中确定索引子类型?
问题描述
我正在将一个 IR 解析为 LLVM IR,并且很难弄清楚如何找到我应该从内存中加载的类型,给定一个复合类型的 n 维索引。
作为使用 C 代码的示例:
struct Book {
int pages;
};
int main() {
struct Book books[10];
int res = books[0].pages;
return 0;
}
当它编译为 LLVM IR 时,数组books
的类型为[10 x Book]
. 它被索引0
并访问了第一个元素,因此相应的 GEP 指令将类似于getelementptr Book, Book* %books, i32 0, i32 0, i32 0
. 然后我们需要加载i32
出GEP返回的地址,通过i32
在相应的加载指令中指定。
您从 开始[10 x Books]
,然后索引到Books
,然后i32
- 我需要将每个索引与这些子类型中的每一个进行匹配,以便能够加载正确数量的字节。
那么我的问题是,确定任意复合类型的加载指令中所需的最终类型的标准是什么?这通常仅通过基本类型和索引来实现,还是编译器通常会保存更多他们可以访问的信息以在编译时使此过程更容易,而不是必须逐步检查每个索引并检查您当前拥有的类型,直到您达到结束?
解决方案
推荐阅读
- javascript - JHipster 和 React:调用异步减速器动作后如何调用函数?
- html - 刷新后活动选择器不起作用
- mysql - 在 Windws10 64 位的 ActivePerl 5.28 中使用 perl 模块 DBD::mysql 时出错
- google-cloud-platform - GCP 存储桶访问日志
- sql - 在 T-SQL 中,表中的数字是否可以具有不同的显示名称?
- .net-core - 实体框架 3.1 从程序集执行迁移
- angular - Angular 8 两个子路由都指向同一个组件
- python - 烧瓶g可以和gunicorn一起使用吗?
- typescript - 带有选项和链的 fp-ts 管道不起作用
- amazon-web-services - 我无法从浏览器访问 AWS 中的 ec2 实例