深入分析GCC
深入分析GCC
目录
前言
章 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章 从源代码到AST/GENERIC 26
4.1 抽象语法树 26
4.2 树节点的声明 28
4.3 树节点结构 33
4.3.1 struct tree_base 35
4.3.2 struct tree_mon 36
4.3.3 常量节点 38
4.3.4 标识符节点 42
4.3.5 声明节点 44
4.3.6 struct tree_decl_minimal 46
4.3.7 struct tree_decl_mon 46
4.3.8 struct tree_field_decl 49
4.3.9 struct tree_decl_with_rtl 55
4.3.10 struct tree_label_decl 55
4.3.11 struct tree_result_decl 56
4.3.12 struct tree_const_decl 57
4.3.13 struct tree_parm_decl 57
4.3.14 struct tree_decl_with_vis 59
4.3.15 struct tree_var_decl 59
4.3.16 struct tree_decl_non_mon 62
4.3.17 struct tree_function_decl 62
4.3.18 struct tree_type_decl 64
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_file 103
4.5.6 c_parser_translation_unit 105
4.5.7 c_parser_external_declaration 105
4.5.8 c_parser_declaration_or_fndef 107
4.5.9 c_parser_declspecs 112
4.6 小结 114
第5章 从AST/GENERIC到GIMPLE 115
5.1 GIMPLE 115
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_tree 136
5.6.2 gimplify_body 138
5.6.3 gimlify_parameters 139
5.6.4 gimplify_stmt 144
5.6.5 gimplify_expr 144
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 Pass 177
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_stmts 193
6.3.2 pass_lower_cf 195
6.3.3 pass_build_cfg 197
6.3.4 pass_build_cgraph_edges 203
6.3.5 pass_build_ssa 205
6.3.6 pass_all_optimizations 206
6.3.7 pass_expand 207
6.4 小结 207
第7章 RTL 208
7.1 RTL中的对象类型 209
7.2 RTX_CODE 210
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-RTL 232
7.9.1 INSN 233
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}.md 239
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_peephole 269
8.6.2 define_peephole2 270
8.7 小结 271
第9章 机器描述文件${target}. 272
9.1 targetm 272
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.c 347
9.9.2 genattr.c 348
9.9.3 genattrtab.c 348
9.9.4 genrecog.c 349
9.9.5 genflag.c 352
9.9.6 genemit.c 353
9.9.7 genextract.c 354
9.9.8 genopinit.c 356
9.9.9 genoutput.c 360
9.9.10 genpreds.c 362
9.9.11 其他 363
9.10 小结 364
0章 从GIMPLE到RTL 365
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语句转换成RTL 411
10.4.1 GIMPLE语句转换的一般过程 412
10.4.2 GIMPLE_GOTO语句的RTL生成 415
10.4.3 GIMPLE_ASSIGN语句的RTL生成 417
10.5 小结 432
1章 RTL处理及优化 433
11.1 RTL处理过程 433
11.2 特殊虚拟寄存器的实例化 435
11.3 指令调度 437
11.3.1 指令调度算法 439
11.3.2 GCC指令调度的实现 440
11.3.3 指令调度实例1 442
11.3.4 指令调度实例2 459
11.4 统一寄存器分配 460
11.4.1 基本术语 461
11.4.2 寄存器分配的主要流程 463
11.4.3 代码分析 466
11.4.4 寄存器分配实例1 468
11.4.5 寄存器分配实例2 483
11.5 汇编代码生成 494
11.5.1 汇编代码文件的结构 495
11.5.2 从RTL到汇编代码 499
11.6 小结 502
2章 支持新的目标处理器 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.文件 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
下载地址:https://pan.baidu.com/s/1M6AOEPLJZSfcxV3URC8Mew
关注微信公众号获取提取码:
输入:plin8 获取提取码
深入分析GCC的更多相关文章
- 深入分析GCC 与 编绎系统透视
- GCC编译器原理(三)------编译原理三:编译过程(2-1)---编译之词法分析
二.编译 引用文档:https://blog.csdn.net/chdhust/article/details/9040647 编译过程就是把预处理完的文件进行一系列词法分析.语法分析.语义分析及优化 ...
- make命令与Makefile(转载)
概述博客内容包含linux下make命令的使用与makefile的书写规则等,希望通过本文档使读者对make命令makefile文件有进一步了解,由于鄙人经验学识有限文档中会有描述不准确以及理解偏差, ...
- gcc编译过程简述
在linux系统上,从源文件到目标文件的转化是由编译器完成的.以hello.c程序的编译为例,如下: dfcao@linux: gcc -o hello hello.c 在这里,gcc编译器读取源文件 ...
- linux 安装GCC
研究生阶段已经开始了一段时间了,选了LINUX深入分析,之前没怎么接触过,感觉还是有点难度的.不,好像是很难. 从学校借了一台电脑,安装了UBUNTU12.04的系统,可是不知道怎么地,这个系统里,没 ...
- X86 寻址方式、AT&T 汇编语言相关知识、AT&T 与 Intel 汇编语言的比较、gcc 嵌入式汇编
注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...
- Linux 内核链表的使用及深入分析【转】
转自:http://blog.csdn.net/BoArmy/article/details/8652776 1.内核链表和普通链表的区别 内核链表是一个双向链表,但是与普通的双向链表又有所区别.内核 ...
- VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%
1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ...
- GCC学习(1)之MinGW使用
GCC学习(1)之MinGW使用 因为后续打算分享一些有关GCC的使用心得的文章,就把此篇当作一个小预热,依此来了解下使用GNU工具链(gcc.gdb.make等)在脱离IDE的情况下如何开发以及涉及 ...
随机推荐
- YES, There is No such thing as a free lunch
软件行业本身就建立在copy的基础上的,据说视窗both Windows and Mac OS都借鉴了施乐的. 国内的很多的软件质量真的好差呀. https://queue.acm.org/detai ...
- ReentrantReadWriteLock中的锁降级
锁降级指的是写锁降级为读锁. 因为读锁与读锁之间不互斥,如果是写锁与读锁或者是写锁与写锁就会互斥,所以由写锁变为读锁就降级了. 如果当前线程拥有写锁,然后将其释放,最后再获取读锁,这种并不能称之为锁降 ...
- 【原创】python+selenium,用xlrd,读取excel数据,执行测试用例
# -*- coding: utf-8 -*- import unittest import time from selenium import webdriver import xlrd,xlwt ...
- 状压dp之位运算
## 一.知识 1.我们知道计算机中数据由二进制数存储,一个二进制数的一位就是计算机中数据的最小单位bit,我们有一种运算符可直接对二进制数进行位运算,所以它的速度很快. 2.C++中的位运算符有6种 ...
- destoon下动态链接301到伪静态(ngnix)
分享一个destoon6.0/7.0下动态链接301到伪静态上面,实现权重提升. if ($request_uri ~* "^/index.php\?itemid=(\d+)&mod ...
- jq function return value
所有 JS 函数 都会返回值 假如 没有 return 则返回 undefined
- 如何使用powerdesigner导出sql脚本
使用power designer可以很方便的对数据库设计进行管理,并且能够更方便的查看表与表之间的关系.同时,还可以对设计好的数据库直接导出创建脚本,根据不同的数据库实例导出对应的创建脚本,然后根据脚 ...
- django--远程mysql
settings.py中配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'ttsx', # 数据 ...
- Windows10 Faster R-CNN(GPU版) 配置训练自己的模型
参考链接 1. 找到合适自己的版本,下载安装Anaconda 点击跳转下载安装 Anaconda,双击下载好的 .exe 文件安装,只勾选第一个把 conda 添加到 PATH 路径.
- 使用Quasar设计Material和IOS风格的响应式网站
使用Quasar设计Material和IOS风格的响应式网站 栏目: CSS · 发布时间: 8个月前 来源: segmentfault.com 本文转载自:https://segmentfaul ...