新書推薦:
《
二十四节气生活美学
》
售價:NT$
340.0
《
西班牙内战:秩序崩溃与激荡的世界格局:1936-1939
》
售價:NT$
990.0
《
基于鲲鹏的分布式图分析算法实战
》
售價:NT$
495.0
《
夺回大脑 如何靠自己走出强迫
》
售價:NT$
299.0
《
图解机械工程入门
》
售價:NT$
440.0
《
中文版SOLIDWORKS 2024机械设计从入门到精通(实战案例版)
》
售價:NT$
450.0
《
旷野人生:吉姆·罗杰斯的全球投资探险
》
售價:NT$
345.0
《
希腊人(伊恩·莫里斯文明史系列)
》
售價:NT$
845.0
|
內容簡介: |
本书结合GCC4.4.0源代码,围绕GCC编译过程,详细介绍了GCC的设计框架和实现过程,包括从源代码到AST、从AST到GIMPLE、从GIMPLE到RTL,以及从RTL到终的目标机器代码的详细过程,涉及各个阶段中间表示的详细分析、生成过程,使读者在了解编译原理的基础上进一步掌握其实现的总体流程和实现细节,让更多的读者对编译技术不再只是停留在理论层面,而是学会如何实现一个编译系统实例。
|
關於作者: |
本书结合GCC-4.4.0源代码,围绕GCC编译过程,详细介绍了GCC的设计框架和实现过程,从源代码到AST、从AST到GIMPLE、从GIMPLE到RTL,以及从RTL到终的目标机器代码的详细过程,涉及到各个阶段中间表示的详细分析、生成过程,使读者在了解编译原理的基础上进一步掌握其实现的总体流程和实现细节,让更多的读者对编译技术不再仅仅停留在理论层面,而是能看到一个活生生编译系统实例的实现过程。
|
目錄:
|
目录
前言
第1章 GCC概述1
1.1 GCC的产生与发展1
1.2 GCC的特点2
1.3 GCC代码分析3
第2章 GCC源代码分析工具4
2.1 vim ctags代码阅读工具4
2.2 GNU gdb调试工具6
2.3 GNU binutils工具8
2.4 shell工具及graphviz绘图工具11
2.5 GCC调试选项13
第3章 GCC总体结构16
3.1 GCC的目录结构16
3.2 GCC的逻辑结构18
3.3 GCC源代码编译20
3.3.1 配置21
3.3.2 编译23
3.3.3 安装25
第4章 从源代码到ASTGENERIC26
4.1 抽象语法树26
4.2 树节点的声明28
4.3 树节点结构33
4.3.1 struct tree_base35
4.3.2 struct tree_common36
4.3.3 常量节点38
4.3.4 标识符节点42
4.3.5 声明节点44
4.3.6 struct tree_decl_minimal46
4.3.7 struct tree_decl_common46
4.3.8 struct tree_field_decl49
4.3.9 struct tree_decl_with_rtl55
4.3.10 struct tree_label_decl55
4.3.11 struct tree_result_decl56
4.3.12 struct tree_const_decl57
4.3.13 struct tree_parm_decl57
4.3.14 struct tree_decl_with_vis59
4.3.15 struct tree_var_decl59
4.3.16 struct tree_decl_non_common62
4.3.17 struct tree_function_decl62
4.3.18 struct tree_type_decl64
4.3.19 类型节点67
4.3.20 tree_list节点68
4.3.21 表达式节点71
4.3.22 语句节点73
4.3.23 其他树节点75
4.4 AST输出及图示76
4.5 AST的生成83
4.5.1 词法分析84
4.5.2 词法分析过程90
4.5.3 语法分析98
4.5.4 语法分析过程99
4.5.5 c_parse_file103
4.5.6 c_parser_translation_unit105
4.5.7 c_parser_external_declaration105
4.5.8 c_parser_declaration_or_fndef107
4.5.9 c_parser_declspecs112
4.6 小结114
第5章 从ASTGENERIC到GIMPLE115
5.1 GIMPLE115
5.2 GIMPLE语句119
5.3 GIMPLE的表示与存储122
5.4 GIMPLE语句的操作数128
5.5 GIMPLE语句序列的基本操作132
5.6 GIMPLE的生成135
5.6.1 gimplify_function_tree136
5.6.2 gimplify_body138
5.6.3 gimlify_parameters139
5.6.4 gimplify_stmt144
5.6.5 gimplify_expr144
5.7 GIMPLE转换实例157
5.7.1 BIND_EXPR节点的GIMPLE生成158
5.7.2 STATEMENT_LIST_EXPR节点的GIMPLE生成159
5.7.3 MODIFY_EXPR节点的GIMPLE生成160
5.7.4 POSTINCREMENT_EXPR节点的GIMPLE生成162
5.8 实例分析172
5.9 小结176
第6章 GIMPLE处理及其优化177
6.1 GCC Pass177
6.1.1 核心数据结构177
6.1.2 Pass的类型179
6.1.3 Pass链的初始化182
6.1.4 Pass的执行184
6.2 Pass列表187
6.3 GIMPLE Pass实例193
6.3.1 pass_remove_useless_stmts193
6.3.2 pass_lower_cf195
6.3.3 pass_build_cfg197
6.3.4 pass_build_cgraph_edges203
6.3.5 pass_build_ssa205
6.3.6 pass_all_optimizations206
6.3.7 pass_expand207
6.4 小结207
第7章 RTL208
7.1 RTL中的对象类型209
7.2 RTX_CODE210
7.3 RTX类型210
7.4 RTX输出格式212
7.5 RTX操作数213
7.6 RTX的机器模式216
7.7 RTX的存储219
7.8 RTX表达式222
7.8.1 常量225
7.8.2 寄存器和内存227
7.8.3 算术运算228
7.8.4 比较运算230
7.8.5 副作用230
7.9 IR-RTL232
7.9.1 INSN233
7.9.2 JUMP_INSN 234
7.9.3 CALL_INSN 235
7.9.4 BARRIER 235
7.9.5 CODE_LABEL 236
7.9.6 NOTE 237
7.10 小结238
第8章 机器描述文件${target}.md239
8.1 机器描述文件240
8.2 指令模板241
8.2.1 模板名称242
8.2.2 RTL模板246
8.2.3 条件256
8.2.4 输出模板256
8.2.5 属性256
8.3 定义RTL序列257
8.4 指令拆分263
8.5 枚举器266
8.5.1 mode枚举器266
8.5.2 code枚举器268
8.6 窥孔优化269
8.6.1 define_peephole269
8.6.2 define_peephole2270
8.7 小结271
第9章 机器描述文件${target}.[ch]272
9.1 targetm272
9.1.1 struct gcc_target的定义273
9.1.2 targetm的初始化277
9.2 编译驱动及选项279
9.2.1 编译选项280
9.2.2 SPEC语言及SPEC文件281
9.2.3 机器相关的编译选项285
9.3 存储布局286
9.3.1 位顺序和字节顺序286
9.3.2 类型宽度287
9.3.3 机器模式提升287
9.3.4 存储对齐288
9.3.5 编程语言中数据类型的存储布局289
9.4 寄存器使用290
9.4.1 寄存器的基本描述290
9.4.2 寄存器分配顺序297
9.4.3 机器模式298
9.4.4 寄存器类型300
9.5 堆栈及函数调用规范描述307
9.5.1 堆栈的基本特性309
9.5.2 寄存器消除313
9.5.3 函数栈帧的管理315
9.5.4 参数传递316
9.5.5 函数返回值318
9.5.6 i386机器栈帧318
9.6 寻址方式325
9.7 汇编代码分区326
9.8 定义输出的汇编语言333
9.8.1 汇编代码文件的框架333
9.8.2 数据输出336
9.8.3 未初始化数据输出336
9.8.4 标签输出338
9.8.5 指令输出342
9.9 机器描述信息的提取343
9.9.1 gencode.c347
9.9.2 genattr.c348
9.9.3 genattrtab.c348
9.9.4 genrecog.c349
9.9.5 genflag.c352
9.9.6 genemit.c353
9.9.7 genextract.c354
9.9.8 genopinit.c356
9.9.9 genoutput.c360
9.9.10 genpreds.c362
9.9.11 其他363
9.10 小结364
第10章 从GIMPLE到RTL365
10.1 GIMPLE序列365
10.2 典型数据结构366
10.3 RTL生成的基本过程367
10.3.1 变量展开370
10.3.2 参数及返回值处理380
10.3.3 初始块的处理395
10.3.4 基本块的RTL生成398
10.3.5 退出块的处理410
10.3.6 其他处理411
10.4 GIMPLE语句转换成RTL411
10.4.1 GIMPLE语句转换的一般过程412
10.4.2 GIMPLE_GOTO语句的RTL生成415
10.4.3 GIMPLE_ASSIGN语句的RTL生成417
10.5 小结432
第11章 RTL处理及优化433
11.1 RTL处理过程433
11.2 特殊虚拟寄存器的实例化435
11.3 指令调度437
11.3.1 指令调度算法439
11.3.2 GCC指令调度的实现440
11.3.3 指令调度实例1442
11.3.4 指令调度实例2459
11.4 统一寄存器分配460
11.4.1 基本术语461
11.4.2 寄存器分配的主要流程463
11.4.3 代码分析466
11.4.4 寄存器分配实例1468
11.4.5 寄存器分配实例2483
11.5 汇编代码生成494
11.5.1 汇编代码文件的结构495
11.5.2 从RTL到汇编代码499
11.6 小结502
第12章 支持新的目标处理器503
12.1 GCC移植503
12.2 PAAG处理器504
12.2.1 PAAG处理器指令集505
12.2.2 应用二进制接口505
12.3 GCC移植的基本步骤506
12.4 PAAG机器描述文件(paag.md)507
12.5 paag.[ch]文件512
12.5.1 存储布局512
12.5.2 寄存器使用规范513
12.5.3 堆栈布局及堆栈指针514
12.5.4 函数调用规范515
12.5.5 寻址方式519
12.5.6 汇编代码输出521
12.5.7 杂项523
12.6 PAAG后端注册523
12.7 GCC移植测试524
12.8 小结526
参考文献527
索引529
|
內容試閱:
|
前言GCC(GNU Compiler Collection,GNU编译器套件)是一套由GNU开发的程序设计语言编译工具,是GNU工程中最重要的组成部分。经过近30年的发展,GCC不仅支持众多的前端编程语言,还支持各种主流的处理器平台和操作系统平台,成为公认的跨平台编译器的事实标准,也成为编译器设计的成功典范。
作为一名GCC编译器的使用者和源码阅读的爱好者,我一直想写一本关于GCC的技术书。
2002年,我开始在Linux系统上进行一些软件开发,GCC就是我使用的编译工具。我一直对从源代码到目标代码的转换过程充满好奇,想知道在这个过程中GCC到底都做了些什么?GCC是如何设计的,那些成千上万个GCC的源代码文件都表示了什么意义?那时我常常幻想,要是能透彻地分析和理解GCC源代码,多好!从那时起,在教学科研之余,我偶尔会翻阅一下GCC的相关源代码,可是看着繁多的GCC源代码,也常常感觉手足无措,真有一种老虎吃天,无法下爪的尴尬。于是分析GCC源代码的事情被搁置了,然而那种一探究竟的心情总是挥之不去。
2012年开始,我有了较多的闲暇时间,在经过一段彷徨之后,分析GCC源代码的冲动又一次浮现在脑海。我知道,这次是要来真的了,我要做点自己喜欢的事。
Why?我有空余时间了,我要干些自己感兴趣的事情。在我创建的GCC爱好者交流群中经常有朋友问,有没有介绍GCC的资料呀?大多人都会说,有请看官方文档!我也去看了看,没错,GCC有比较详细的官方文档,包括gccinternal及用户手册等。然而,这些文档的内容庞杂,缺乏系统分析GCC设计框架和工作流程的内容,并且大多的内容对读者来讲都是零散的,让初学者无所适从。于是我想,为什么不分析一下GCC系统,把GCC的设计实现用一种更清晰明了、更系统的方法介绍给GCC的爱好者呢?What?本书将围绕GCC编译过程,详细介绍从源代码到AST、从AST到GIMPLE、从GIMPLE到RTL,以及从RTL到最终的目标机器汇编代码的详细过程,涉及各个阶段中间表示的详细分析、生成过程。本书提供了大量的图表和实例,展示了GCC编译系统的总体工作流程和工作细节。本书的另外一个特点是结合GCC 4.4.0的源代码进行分析,使读者在了解编译原理的基础上进一步掌握其实现的总体流程和细节,让更多读者对编译技术的认识不再只停留在理论层面,而是向其展示一个编译系统实例的实现过程。
How?GCC源代码涉及的内容非常庞杂,很难在一本书中全面描述,因此本书以GCC中间表示为主线,详细分析GCC从源代码开始,直到生成目标机器汇编代码的整个过程中所使用的三种中间表示(AST、GIMPLE及RTL),并对这三种中间表示的基本概念、生成过程进行详细的描述,对基于GIMPLE和RTL的优化处理进行介绍,从而描述一条从源代码到目标机器汇编代码的清晰路线图。
Who?本书以热爱编译系统理论及其实现的在校大学生、研究生为主要读者对象,也可以作为企业中研发编译系统以及进行编译系统移植的研发工程师的有益参考。
在编写这本书的时候,有一种精神支撑着我,我相信兴趣加上坚持就是胜利!分析GCC不是一年半载的事情,需要3年、5年,甚至更长时间,不过我可以坚持,我要用我的坚持换来对GCC的深入分析,让更多的GCC爱好者熟悉它、接触它、了解它,更多地参与GCC的开发与维护。
感谢我的爱人和孩子,给了我家的温暖和亲情。感谢病榻上的父亲,虽然他不能和我说话,但他那一双大手,依然经常抚摸在我的头上。感谢年老体弱的母亲,感谢她一直照顾我的父亲,让我知道什么是坚持,什么是不离不弃!感谢西安邮电大学GPU项目组的各位同事在本书的写作中提出的宝贵建议。
本书的写作得到国家自然科学基金重点项目(项目编号:61136002)以及陕西省教育厅科研计划项目(项目编号:14JK1674)资助。
鉴于作者水平有限,在分析和写作本书的过程中也引入了一些个人观点,因此难免有一些理解的偏差和错误,敬请读者批评指正并不吝赐教,如有意见和建议,请联系作者lazy_linux@126.com,在此一并感谢!
王亚刚2016年10月于西安邮电大学
|
|