LLVM编译系统概述
LLVM编译系统概述
LLVM=低级虚拟机
LLVM编译器基础结构
为构建编译器提供可重复使用的组件
减少构建新编译器的时间/成本
构建静态编译器、JIT、基于跟踪的优化器。。。
LLVM编译器框架
使用LLVM基础结构的端到端编译器
C和C++具有健壮性和攻击性:
Java、Scheme等正在开发中
针对X86、Sparc、PowerPC发出C代码或本机代码
三个主要LLVM组件
LLVM虚拟指令集
与通用语言和目标无关的IR
内部(IR)和外部(持久)表示
集成良好的支持库集合
分析、优化、代码生成器、JIT编译器、垃圾收集支持、分析…
从库构建的工具集合
汇编程序、自动调试器、链接器、代码生成器、编译器驱动程序、模块化优化器…
LLVM C/C++编译器
从高层来看,它是一个标准编译器:
与标准makefile兼容
使用GCC 3.4 C和C++解析器
区别特征:
使用LLVM优化器,而不是GCC优化器
.o文件包含LLVM IR/字节码,而不是机器码
可执行文件可以是字节码(JIT)或机器码
LLVM C/C++编译器(续)
使用LLVM作为中级IR的标准编译器组织:
–特定于语言的前端将代码降低到LLVM IR
–独立于语言/目标的优化器改进代码
–代码生成器将LLVM代码转换为目标代码(例如IA64)
在编译时查看事件
死代码删除,IP常量传播,死参数消除,插入,重新关联,LICM,循环选择,内存提升,死存储消除,ADCE…
G的修改版本++
将LLVM IR作为文本文件发出
将C++AST降低为LLVM
GCC的修改版本
将LLVM IR作为文本文件发出
将C AST降低到LLVM
示例中间表示
; Declare the string constant as a global constant...@.LC0 = internal constant [13 x i8] c"hello world\0A\00" ; [13 x i8]*
; External declaration of the puts functiondeclare i32 @puts(i8 *) ;
i32(i8 *)*
; Definition of main functiondefine i32 @main() {
; i32()*
;
Convert [13x i8 ]* to i8 *... %cast210 = getelementptr [13 x i8 ]* @.LC0,
i64 0, i64 0 ; i8 *
; Call puts function to write
out the string to stdout...
call i32 @puts(i8 * %cast210)
ret i32 0
}
LLVM的当前用途/项目
用谜题求解技术求解寄存器分配方案编译器
LLVM字节码JIT编译器
LLVM未来
目前存在Java编译器的部分版本,需要进行扩展改进性能优化
LLVM当前的大多数优化都是基于性能的,需要对大小进行优化