没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
Getting Started with LLVM Core
Libraries
2021 年 11 月 25 日
Contents
1 第 1 章编译和安装 LLVM 3
1.1 理解 LLVM 的版本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 获取预编译安装包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.1 获取官方预编译二进制文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.2 使用包管理器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 从源代码编译 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3.1 系统要求 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3.2 获取源代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3.3 编译和安装 LLVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3.4 Windows 和 Microsoft Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3.5 Mac OS X 和 Xcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2 第 2 章外部项目 23
2.1 介绍 Clang extras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.1.1 编译和安装 Clang 附加(extra)工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.1.2 理解 Compiler-RT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.1.3 试验 Compiler-RT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.2 使用 DragonEgg 插件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.2.1 编译 DragonEgg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.2.2 理解 DragonEgg 和 LLVM 工具的编译流水线 . . . . . . . . . . . . . . . . . . . . . . 28
2.2.3 理解 LLVM 测试套件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2.4 使用 LLDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.2.5 介绍 libc++ 标准库 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.3 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3 第 3 章工具和设计 35
i
3.1 LLVM 的基本设计原则和它的历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.2 理解如今的 LLVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.3 跟编译器驱动器交互 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4 使用独立工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.5 探究 LLVM 内部设计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.5.1 了解 LLVM 基础库 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.5.2 演示插件式 Pass 接口 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.6 编写第一个 LLVM 项目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.6.1 编写 Makele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.6.2 编写代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.7 浏览 LLVM 源代码—一般建议 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.7.1 理解代码如文档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.7.2 向社区求助 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.7.3 处理更新—SVN 日志用作文档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.7.4 结束语 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.8 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4 第 4 章前端 55
4.1 介绍 Clang . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.1.1 前端的活动 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.1.2 程序库 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.1.3 理解 Clang 诊断 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.2 通过 Clang 学习前端的步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.2.1 词法分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.2.2 语法分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.2.3 语义分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.2.4 生成 LLVM IR 代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.3 组合在一起 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
4.4 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5 第 5 章 LLVM 中间表示 83
5.1 概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.1.1 理解 LLVM IR 的目标依赖 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.2 练习基础工具转换 IR 格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.3 介绍 LLVM IR 语言的语法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
5.3.1 介绍 LLVM IR 内存中的模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
5.4 编写一个定制的 LLVM IR 生成器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
5.4.1 编译并运行 IR 生成器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
5.4.2 学习如何用 C++ 后端生成任意 IR 的构造代码 . . . . . . . . . . . . . . . . . . . . . 94
5.5 IR 层次的优化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
5.5.1 编译时和链接时优化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
5.5.2 发现哪些 Pass 有用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
ii
5.5.3 理解 Pass 依赖关系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
5.5.4 理解 Pass API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.5.5 写一个定制的 Pass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.6 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
6 第 6 章后端 105
6.1 概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
6.1.1 使用后端工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
6.2 学习后端代码结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
6.3 了解后端程序库 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
6.4 学习 LLVM 后端如何利用 TableGen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
6.4.1 语言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
6.4.2 了解代码生成器.td 文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
6.5 理解指令选择过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
6.5.1 SelectionDAG 类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
6.5.2 低层化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
6.5.3 DAG 结合与合法化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
6.5.4 DAG 到 DAG 的指令选择 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
6.5.5 可视化指令选择过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
6.5.6 快速指令选择 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
6.6 调度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
6.6.1 指令延迟表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
6.6.2 风险检测 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
6.6.3 调度单元 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
6.7 机器指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
6.8 寄存器分配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
6.8.1 寄存器合并器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
6.8.2 虚拟寄存器重写 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
6.8.3 目标钩子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
6.9 序曲和尾声 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
6.9.1 帧索引 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
6.10 理解机器代码框架 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
6.10.1 MC 指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
6.10.2 代码输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
6.11 编写你自己的机器 Pass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
6.12 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
7 第 7 章 Just-in-Time 编译器 139
7.1 了解 LLVM JIT 引擎基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
7.1.1 介绍执行引擎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
7.1.2 内存管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
7.2 介绍 llvm::JIT 基础结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
iii
剩余236页未读,继续阅读
内核沉思录
- 粉丝: 1864
- 资源: 19
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0