Contents

LLVM基础概念总结

LLVM的历史

LLVM的命名最早源于底层虚拟机(Low Level Virtual Machine)的首字母缩写。后来这个项目不断发展,使得这个名字变得不贴切,于是开发者决定放弃这个缩写的意义。如今LLVM已单纯成为一个品牌,适用于LLVM下的所有项目,包含LLVM中间代码(LLVM IR)、LLVM调试工具、LLVM C++标准库等

LLVM和编译器

常见编译器架构

常见编译器架构通常被分为三部分:

  • 前端(Frontend):词法分析、语法分析、语义分析、生成中间代码

  • 中间端优化器(Optimizer):优化中间代码(有时中间端被归为后端的一部分)

  • 后端(Backend):生成机器码

LLVM架构

https://img.dx3906.cloud/imgs/llvm-1.png

  • 不同的语言使用自己相应的编译前端生成统一的LLVM IR

  • LLVM Optimizer对LLVM IR进行优化

  • 使用对应平台的LLVM Backend生成相应的机器码

LLVM已经成为多个编译器和代码生成相关项目的子项目。

LLVM与前端

LLVM最初被用来取代gcc中的代码生成器,gcc的前端许多已经可以与其运行,LLVM目前支持Ada、C、C++、D语言、Fortran、Haskell、Julia、Objective-C、Rust及swift的编译。

LLVM引来一些人为许多语言设计新的编译器。其中比较出名的clang,主要由苹果电脑进行支持,其目的是取代gcc系统下的Objective-C编译器。

LLVM与中间端

LLVM的核心是中间代码(Intermediate Representation,IR),一种类似于汇编的底层语言。

LLVM IR有三种表示形式:

  • 人类可读的形式

  • 内存中的LLVM IR

  • 二进制形式的bitcode

LLVM与后端

LLVM已支持多种指令集,可以生成多种平台的机器码。包括ARM、Qualcomm Hexagon、MIPS、Nvidia并行指令集(LLVM中称为NVPTX),PowerPC、AMD TeraScale、AMDGPU、SPARC、SystemZ、RISC-V、WebAssembly、x86、x86-64和XCore

LLVM作为后端的C语言编译流程

一图以蔽之

llvm-2.png

相关文件

  • main.c:C语言源代码

  • main.ll:LLVM IR的人类可读形式

  • main.bc:LLVM IR的bitcode形式。可以使用lli解释运行(Just In Time execute)

  • main.s:特定平台下的汇编形式

  • main.o:可重定向目标文件

  • a.out:可执行文件

相关工具

  • clang:C语言编译前端,用来生成LLVM IR

  • opt:llvm IR优化器,针对bitcode形式的IR

  • llvm-as:llvm汇编器,将llvm IR人类可读形式转化为bitcode形式

  • llvm-dis:llvm-as的逆过程,将bitcode转化为人类可读的形式

  • llvm-link:llvm IR bitcode形式的链接器,将多个bitcode文件链接成一个bitcode文件

  • llc:llvm IR bitcode形式的编译器,将bitcode转化为汇编代码

  • lli:llvm IR bitcode形式的解释运行工具

Ref