llvm编译系统结构分析

LLVM 编译系统分析

整个 LLVM 编译系统的组成可分成三部分:LLVM 中间代码,用于分析、 优化、代码生成等工作的集成库,以及建立在以上集成库基础之上的工具,包括汇 编器、链接器、调试器等等。本章将先依次分析这三个组成部分,然后再对 LLVM 的编译流程作详细的说明。

中间代码

LLVM 中间代码是一种采用 SSA 形式的 IR(Immediate Representation,中间 表达),使用的指令集为 LLVM 虚拟指令集。该指令集是一个类似 RISC(Reduced Instruction Set Computer,精简指令集计算机)的三地址指令集,含有简单的控制 指令和使用带类型指针的访存指令,拥有独立于高级语言和目标处理器的语法,易 于进行代码分析和优化。使用 LLVM 虚拟指令集的 LLVM 中间代码可以三种方式 存在:存在于内存中的编译器 IR、存在磁盘上的字节码(bytecode)、以及可供人 阅读的汇编代码。这三种存在方式是同一中间代码的不同表达形式,可分别用于: 在编译器执行编译遍时提供方便高效的中间代码转换或者中间代码分析、作为 JIT 编译器(Just-In-Time Compiler)在本地执行客户处理器代码的格式、以及方便开 发人员进行代码调试的汇编代码。LLVM 中间代码由虚拟指令集、中间代码高层结构、以及中间代码类型系统三方面组成。

LLVM 原子类型

工具集

LLVM 提供了类似 GNU 工具链的全套基本工具,包括 llvm-as、llvm-dis、 llvm-link、llvm-ar、llvm-nm、llvm-ranlib、llvm-prof、llvm-ld 等,区别在于 LLVM定义有自己的汇编文件类型.ll 文件和二进制目标文件类型.bc 文件,并可用工具 llvm2cpp 将.bc 文件转成调用 LLVM C++ API 的 C++源文件。

编译工具包括基于 GCC 的 C 及 C++前端 llvmgcc 和 llvmg++,两者分别类似 于 GCC 的 gcc 和 g++,而 gccas 和 gccld 则是被前两个工具分别用于编译和链接阶段的优化器。工具 opt 可方便用户在.bc 文件的基础上逐遍进行编译遍转换 或优化。

后端工具中最重要的工具是 llc, lli 和 tblgen。llc 用于从.bc 文件生成目标处 理器的汇编代码;而对支持 JIT 编译器(LLVM Just-In-Time compiler,LLVM 即时 编译器)的目标处理器,lli 可直接在本地运行目标处理器的.bc 代码。tblgen 用于 将目标处理器的描述转化为相应的描述源代码文件,由此来简化后端目标处理器的 移植工作,它要求用 LLVM 定义的.td 格式文件来描述,是 LLVM 后端移植机制的 重要组成部分。
LLVM编译工具

编译流程

LLVM编译流程
后端代码生成器主要由以下部分组成:指令选择、遍前调度、寄存器分配、后 期机器代码优化、代码输出。其中在指令选择前使用 LLVM 中间代码,之后均使 用目标处理器的特定代码。下面图 5 给出了代码生成器的结构图。

LLVM 后端代码生成器
下面简要介绍代码生成器的各个组成部分:
指令选择,就是将输入给后端代码生成器的 LLVM 中间代码翻译成目标处理器 的特定机器指令的过程,过程中可进行窥孔优化等工作。
遍前调度,就是根据目标处理器指令在执行时占用处理器功能单元的资源使用 情况对程序的指令序列进行重新安排;同时根据程序使用寄存器的情况对指令序列 进行重新安排。
寄存器分配,将原来使用的没有个数限制的虚拟寄存器映射到真实的目标处理器寄存器,由于真实寄存器的个数限制,不能放下的源虚拟寄存器中的值将被迫放入内存中。在这个过程中,LLVM 采用线性扫描(linear scan)作为默认的寄存器 分配算法。
后期代码优化,进行代码长度优化、ILP(Instruction-Level Parallelism,指令级并行)优化等一系列优化工作。
代码输出,根据要求输出目标处理器的汇编代码、目标文件、或者可执行文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值