LLVM---1

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/My_stage/article/details/82953513

LLVM与传统编译器不同,传统编译器只在 连接时优化(link Time),运行时优化(Run Time),概要信息优化。
传统情况下:
Link Time的时候传统编译器一般采用low-level 或者high-level的方式,但是low-level的方法(机器码)无法提供高级的信息去支持更多的分析与转换。
High-level的方式是做一个语法树,可以提供高级信息,但是延迟时间并且程序改变时需要重新编译程序。

Run Time:无过多优化。

收集概要信息:过于繁琐,需要不停的更换运行环境。

LLVM特点:
在Complier Time, Link Time, Run Time, Idle Time都进行了优化。

Compiler Time
1 前端多语言,每种语言都要转为LLVM Instruction Set(保留足够多的类型信息)
2 做一些源语言优化,如printf-puts
3 全局变量优化与过程优化
LLVM Instruction Set 是LLVM中IR的表现形式。他本身是一个low-level类型的表示方法,但通过映射可以映射到多个high-level的结构类型中。

Link Time
使用传统的标量优化,减少大部分时间的过程间优化

  1. 数据结构分析(文本敏感的指向分析),借助于LLVM比较充足的type information,在指针分析的基础上,可以构造出整个内存对象的连接关系图。其中使用的DSA,在DSA中对于关系比较密切的结构对象,可以定义在一个连续的内存块中,减少内存块的浪费。
    以及APA(Automatic Pool Allocation)能够将堆上分配的链接形式的结构体,分配在连续的内存池中,这种做法是通过将内存分配函数替换为自定义池分配函数实现的
    2 无效全局变量、参数、类型消除
  2. 常量替换(constant propagation)
  3. 简单结构体域重排

另一个优化是,将每个函数的信息都附加在LLVM的bytecode中,这样在连接时可以直接使用这些信息,减少计算内容来优化。

Run Time
收集概要信息,对LLVM的字节码再优化与编译
1 从最后的使用者那里收集
2 自动收集,而非开发者来收集
运行时优化
1-1在预编译原机器码的时候进行轻量的优化。
1-2运行时的优化器可以提供更高级的信息来优化

IDLE TIME
结合了通过运行时优化收集的配置信息与LLVM二进制码 去进行再优化与编译这个程序。

  1. 可以利用应用程序运行时获取的用户信息来做优化
  2. 可以针对目标机器的详细特征来裁剪代码
  3. 由于是离线执行,它可以做比运行时优化器更多的激进优化

LLVM IR分为几种形式,Plain-text, Binary, and In-memory Representations。
其中的binary形式应该就是关于如何将LLVM IR存储到可执行文件中的
这个IR是可读的。

  1. LLVM指令集包括通用处理器的主要操作
  2. LLVM提供无限的指定类型的虚拟寄存器,可以存储基本类型数据。这些虚拟寄存器是SSA格式的。
  3. LLVM通过load/store操作来完成虚拟寄存器和内存之间的数据交换的。
  4. LLVM也明确的构建了每个函数的控制流图已经异常控制流。
  5. LLVM指令集中只包括31条指令:1、避免多条操作指令对应一种操作;2、指令重载

LLVM中的两个指令集
cast指令:类型转换指令。该指令是进行类型转换的唯一方法。换而言之,LLVM代码中类型转换都是显式的。
getelementptr指令:用来实现指针算术运算,它可以计算组合类型(结 构或者数组)数据的成员的地址。

猜你喜欢

转载自blog.csdn.net/My_stage/article/details/82953513
今日推荐