首页 > 解决方案 > 我应该如何从 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- 我需要将每个索引与这些子类型中的每一个进行匹配,以便能够加载正确数量的字节。

那么我的问题是,确定任意复合类型的加载指令中所需的最终类型的标准是什么?这通常仅通过基本类型和索引来实现,还是编译器通常会保存更多他们可以访问的信息以在编译时使此过程更容易,而不是必须逐步检查每个索引并检查您当前拥有的类型,直到您达到结束?

标签: compiler-constructionllvmllvm-ir

解决方案


推荐阅读