一、基本框架
1、概述
LLVM编译器采用了如下图所示的三段式设计:前端,优化组件和后端。前端组件解析程序源代码,检查语法错误,生成一个基于语言特性的AST来表示输入代码,并将其转换为LLVM IR;优化器作用是中间代码(IR)优化,比如去除无用的变量或者无用的计算,来提高代码运行效率;后端生成目标机器码。
2、源码结构
位于llvm-project/llvm/中
- llvm/examples/:包含LLVM官网中一些教程的代码实现。
- llvm/include/:存放源码中的公共头文件
- llvm/lib/(主要目录如下)
- llvm/lib/IR/:包含所有和IR层有关的源码文件,这些文件实现了很多核心的类(class),比如:Instruction类,BasicBlock类,Function类,Module类。
- llvm/lib/MC/:包含MachineCode层面的类和方法的实现。
- llvm/lib/CodeGen/:包含从IR代码->目标中间代码的实现文件,指令选择、指令调度、寄存器分配以及它们所需的辅助分析函数。
- llvm/lib/Passes/:包含llvm pass的构造文件。
- llvm/lib/Target/:存放描述代码生成的目标架构的文件。如果编写一个新的后端,其后端代码仅存于此文件夹的子文件夹中。
- llvm/lib/TableGen/:包含TableGen工具的完整实现,该工具用于根据.td文件中的高层目标描述来生成C++代码。
- llvm/test/:这个目录是LLVM的测试套件,包含了很多测试用例,这些测试用例是测试LLVM的所有基本功能的,比如从测试IR->汇编,汇编->机器码。
- llvm/tools/:这个目录是各个工具的源码(也就是驱动那些库的驱动程序)。比如做 LLVM IR 汇编的 llvm-as,后端编译器 llc,优化驱动器 opt 等。
- llvm/utils/:这个目录包含了一些和LLVM源码一起工作的应用。有些应用在LLVM的编译过程中是不可或缺的。
FORTRAN等。
二、前端
官方项目——Language Frontend with LLVM Tutorial
主要包括以下4个阶段,词法分析、语法分析、语义分析、LLVM IR生成器。
1、词法分析
负责处理源代码的文本输入,将语言结构拆分成一组单词和记号(token),并删除诸如注释、空格和制表符之类的字符。
预处理,在进行语义分析之前使用,负责通过处理以 '#' 开头的预处理指令来扩展宏,或包括头文件,或跳过部分代码。预处理器与词法分析器紧密相关,并连续相互作用。
2、语法分析
负责根据一组记号的代码布局决定把它们组合在一起是否合理,不涉及含义分析,只关心语法是否正确,不关心具体的语义表达。它的输入为一个记号流,输出为抽像语法树(AST)。