LLVM Cookbook中文版 - (EPUB全文下载)

文件大小:1.07 mb。
文件格式:epub 格式。
书籍内容:

LLVM Cookbook中文版
第1章 LLVM设计与使用
概述
模块化设计
交叉编译Clang/LLVM
将C源码转换为LLVM汇编码
将LLVM IR转换为bitcode
将LLVM bitcode转换为目标平台汇编码
将LLVM bitcode转回为LLVM汇编码
转换LLVM IR
链接LLVM bitcode
执行LLVM bitcode
使用C语言前端——Clang
使用GO语言前端
使用DragonEgg
第2章 实现编译器前端
概述
定义TOY语言
实现词法分析器
定义抽象语法树
实现语法分析器
解析简单的表达式
解析二元表达式
为解析编写驱动
对TOY语言进行词法分析和语法分析
为每个AST类定义IR代码生成方法
为表达式生成IR代码
为函数生成IR代码
增加IR优化支持
第3章 扩展前端并增加JIT支持
概述
处理条件控制结构——if/then/else结构
生成循环结构
处理自定义二元运算符
处理自定义一元运算符
增加JIT支持
第4章 准备优化
概述
多级优化
自定义LLVM Pass
使用opt工具运行自定义Pass
在新的Pass中调用其他Pass
使用Pass管理器注册Pass
实现一个分析Pass
实现一个别名分析Pass
使用其他分析Pass
第5章 实现优化
概述
编写无用代码消除Pass
编写内联转换Pass
编写内存优化Pass
合并LLVM IR
循环的转换与优化
表达式重组
IR向量化
其他优化Pass
第6章 平台无关代码生成器
概述
LLVM IR指令的生命周期
使用GraphViz可视化LLVM IR控制流图
使用TableGen描述目标平台
定义指令集
添加机器码描述
实现MachineInstrBuilder类
实现MachineBasicBlock类
实现MachineFunction类
编写指令选择器
合法化SelectionDAG
优化SelectionDAG
基于DAG的指令选择
基于SelectionDAG的指令调度
第7章 机器码优化
概述
消除机器码公共子表达式
活动周期分析
寄存器分配
插入头尾代码
代码发射
尾调用优化
兄弟调用优化
第8章 实现LLVM后端
概述
定义寄存器和寄存器集合
定义调用约定
定义指令集
实现栈帧lowering
打印指令
选择指令
增加指令编码
子平台支持
多指令lowering
平台注册
第9章 LLVM项目最佳实践
概述
LLVM中的异常处理
使用sanitizer
使用LLVM编写垃圾回收器
将LLVM IR转换为JavaScript
使用Clang静态分析器
使用bugpoint
使用LLDB
使用LLVM通用Pass
封底
第1章LLVM设计与使用
本章涵盖以下话题。
• 模块化设计
• 交叉编译Clang/LLVM
• 将C源码转换为LLVM汇编码
• 将LLVM IR转换为bitcode
• 将LLVM bitcode转换为目标平台汇编码
• 将LLVM bitcode转回为LLVM汇编码
• 转换LLVM IR
• 链接LLVM bitcode
• 执行LLVM bitcode
• 使用C语言前端——Clang
• 使用GO语言前端
• 使用DragonEgg
概述
本节介绍LLVM的设计理念,以及如何使用LLVM提供的诸多工具。你将了解如何把C语言代码编译为LLVM IR(Intermediate Representation——中间码)以及如何把它转为其他多种形式。你也会看到在LLVM的源码树中代码是如何组织的,以及如何使用LLVM自己编写一个编译器。
模块化设计
与其他编译器(例如GNU Compiler Collection——GCC)不同,LLVM的设计目标是成为一系列的库。本节以LLVM优化器(optimizer)为例来解释这个概念,因为它的设计就是基于库的。它允许你选择各个Pass(趟)的执行顺序,也能够选择执行哪些优化Pass——也就是说,有一些优化对你设计的系统是没有帮助的,只有少数优化会针对你的系统。反观传统的编译器优化器,它们通常是由大量高度耦合的代码组成,很难拆分成容易理解和使用的小模块。而在LLVM中,如果你想了解特定的优化器,是不需要知道整个系统是如何工作的。你只需选择一个优化器并使用它,无须担心其他依赖它的组件。
在我们开始本节之前,我们需要知道一点关于LLVM汇编码的知识。LLVM的代码有3种表示形式:内存编译器中的IR、存于磁盘的bitcode,以及用户可读的汇编码。LLVM IR是基于静态单赋值[1](Static Single Assignment——SSA)的,并且提供了类型安全性、底层操作性、灵活性,因此能够清楚表达绝大多数高级语言。这种表示形式贯穿LLVM编译的各个阶段。事实上,LLVM IR致力于成为一种足够底层的通用IR,只有这样,高级语言的诸多特性才能够得以实现。同样,LLVM IR组织良好,也具备不错的可读性。如果你对理解本节提到的LLVM汇编码有任何疑问,请参考本节结尾的“另请参阅”一节。
SSA于1980年由IBM开始研究,由于它的一些良好性质,之后在编译器领域得到广泛应用,包括LLVM。
准备工作
在开始之前,我们需要在本机安装LLVM工具链,特别是opt工具。
详细步骤
我们将在同一段代码上逐步实施两个不同的优化,来观察它们分别是如何改变代码的。
1. 首先,我们来写一段代码用作优化器的输入,在这里创建testfile.ll文件。
$ cat testfile.ll
define i32 @test1(i32 %A) {
%B = add i32 %A, 0
ret i32 %B
}

define internal i32 @test(i32 %X, i32 %dead) {
ret i32 %X
}

define i32 @caller() {
%A = call i32 @test(i ............

以上为书籍内容预览,如需阅读全文内容请下载EPUB源文件,祝您阅读愉快。

版权声明:书云(openelib.org)是世界上最大的在线非盈利图书馆之一,致力于让每个人都能便捷地了解我们的文明。我们尊重著作者的知识产权,如您认为书云侵犯了您的合法权益,请参考版权保护声明,通过邮件openelib@outlook.com联系我们,我们将及时处理您的合理请求。 数研咨询 流芳阁 研报之家 AI应用导航 研报之家
书云 Open E-Library » LLVM Cookbook中文版 - (EPUB全文下载)