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当前的大多数优化都是基于性能的,需要对大小进行优化

 

posted @ 2023-10-26 04:48  吴建明wujianming  阅读(79)  评论(0编辑  收藏  举报