关于LLVM
- 官网地址 https://llvm.org/
- LLVM 项目是模块化,可重用的编译器以及工具链技术的集合
- 创始人 Chris Lattner ,也是 Swift 之父
- LLVM 不是缩写(acronym),是项目全名
传统编译器
- GCC
- LLVM
- Clang

- Frontend: 前端
- 词法分析 , 语法分析 ,语义分析 生成中间代码
- Optimizer :优化器
- 中间代码优化
- Backend 后端
- 生成机器代码
LLVM 架构

- 不同的前端后端使用统一的中间代码 LLVM Intermediate Representation(LLVM IR)
- 如果需要支持一种新的编程语言,那么只需要实现一个新的前端
- 如果需要支持一个新的硬件设备,那么只需要实现一个新的后端
- 优化阶段是一个通用的阶段,他针对的是统一的LLVM IR ,不论是支持新的编程,还是支持新的硬件设备,都不需要对优化阶段进行修改
- 想比之下,GCC 的前端和后端是耦合在一起的,想要支持一门新的语言是要花费特别多精力的,特别困难。
- LLVM 现在被作为实现各种静态和运行时编译语言的通用基础结构(GCC家族,Java , .Net, Python, Ruby, Scheme, Haskell , D等)
Clang
什么是Clang
- LLVM 项目的一个子项目
- 基于LLVM 架构的C/C++/OC编译器前端
- 官网 http://clang.llvm.org/
Clang相对GCC 的优点
- 编译速度快 : OC 调试比GCC 快3倍
- 占用内存小 :Clang 生成的AST 所占内存是GCC 的五分之一
- 模块化设计 : Clang采用基于库的模块化设计,易于IDE 集成和其他用途的重用
- 诊断信息可读性强 :Clang在编译过程中,保存了大量详细的元数据,有利于调试
- 设计清晰简单,容易理解,易于扩展增强
Clang 和 LLVM 的关系

OC源文件的编译过程
$clang -ccc-print-phases main.m
命令行查看编译的过程
0: input,"main.m",objective-c
1: preprocessor ,{0},objective-c-cpp-output
2: complier,{1},ir
3: backend,{2},assembler
4: assembler,{3},object
5: linker,{4},image
6:bind-arch,"x86_64",{5},image
词法分析
$clang -fmodules -E -Xclang -dump-tokens main.m
生成语法树 AST
(iOS 用的是自下向上的语法树)
$clang -fmodules -fsyntax-only-Xclang -ast-dump main.m
IR
IR有三种形式
- text:便于阅读的文本格式,类似于汇编,拓展名
.ll
$clang -S -emit-llvm main.m
- memory:内存格式
- bitcode:二进制格式,拓展名
.bc
$clang -c -emit-llvm main.m



LLVM 开发插件

-
Clang 插件开发
image.png
-
Pass 开发
image.png
-
开发一个新的编程语言
image.png
网友评论