《深入分析GCC 》——3.2 GCC的逻辑结构

简介:

本节书摘来自华章出版社《深入分析GCC 》一书中的第3章,第3.2节,作者 王亚刚 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.2 GCC的逻辑结构

GCC的源代码文件数量庞大,目录结构复杂,总体结构理解有一定的难度,但从代码功能和逻辑结构上来讲,这些代码大致可以分为如图3-1所示的几个部分。


f3a6e0d955eae7427c77af0f59a7cc808d6e01db

图3-1分为上下两个部分,上半部分使用GCC表示GCC 4.4.0的源代码内容,下半部分使用gcc/cc1表示使用GCC源代码编译生成的编译器程序。
图3-1的上半部分根据源代码的功能将GCC源代码分为4大部分:
(1)高级语言相关代码(High-Level-Language Specif?ic Code)。在GCC的源代码中,对于GCC能够编译的每一种编程语言都有其相应的处理代码,这些代码主要集中在${GCC_SOURCE}/${Language}目录下。其中${Language}代表了编程语言的名称,这部分代码主要完成高级编程语言的词法、语法分析等功能,从而生成该语言对应的抽象语法树(AST,Abstract Syntax TREE),并完成其规范化(Genericize)操作。
(2)与编程语言和目标机器无关的通用代码(Language & Machine Independent Generic Code)。这部分代码主要包括${GCC_SOURCE}/目录下的代码,用于完成GIMPLE和RTL的生成,以及数量庞大的基于GIMPLE和RTL的处理及编译优化工作。
(3)机器描述(Machine Descriptions)代码。一般来说,对于GCC支持的每一种名称为${target}的目标机器,在GCC的代码中均有一个名称为${GCC_SOURCE}/conf?ig/${target}的子目录,用来存放与该目标机器相关的机器描述代码及其相应的头文件和c文件等。
(4)与目标机器相关的生成器代码(Machine Dependent Generator Code)。这部分代码比较难以理解,读者可以试着这样来考虑。为了生成目标机器上编译器程序cc1,GCC提供的源代码在设计阶段是不完整的,其中缺少的部分主要包括目标机器相关的RTL构造及目标代码生成等部分的源代码。由于这一部分源代码是与目标机器相关的,在GCC设计源代码时是难以确定的,因此,GCC采用了这样一种解决的思路,就是通过一些生成器(Generator)代码,这些代码能够根据目标机器的机器描述文件,提取目标机器的信息,从而自动地生成关于目标机器上RTL构造及目标代码生成的源代码,并将这些源代码与GCC原有的其他代码结合在一起编译,从而生成与目标机器相关的编译器程序。与目标机器相关的生成器代码的文件名称一般为${GCC_SOURCE}/gen*.[ch],其主要的功能就是根据机器描述文件生成与目标机器相关的部分源代码。
因此,最终参与编译,生成目标机器编译器的源代码主要包括了语言相关的代码、语言及机器无关的通用代码,以及根据机器描述文件由机器相关代码生成器所生成的代码等三部分。
图3-1的下半部分给出了根据上述GCC的源代码所生成的目标机器上编译器cc1(gcc程序所调用的编译器)的主要工作流程。从整体上看,目标机器上编译器cc1的功能就是将用户输入的高级程序代码最终编译成目标机器上的汇编代码,其中经历了前端的词法分析、语法分析、语义分析,中间的GIMPLE生成、GIMPLE优化,以及后端的RTL生成、RTL优化、代码生成等几个步骤。在这些处理过程中,GCC也分别使用几种不同的中间表示(Intermediate Representation,IR)形式,包括AST、GIMPLE、RTL等。这些处理步骤与上半部分的代码具有一定的对应关系,例如词法、语法分析以及AST的规范化过程对应上半部分的“高级语言相关代码”;GIMPLE生成、GIMPLE优化及RTL优化部分则对应上半部分的“与编程语言和目标机器无关的代码”;RTL生成以及最终的汇编代码生成部分则由上半部分的“与目标机器相关的生成器代码”根据上半部分的“机器描述”生成。
对图3-1的上半部分和下半部分进行对照,可以看出不同部分的GCC源代码在功能上的差异。
本书在分析GCC时,也是按照cc1的执行流程,围绕各种中间表示的生成和处理进行深入分析,从而帮助读者理解GCC设计的关键思路和技术,主要包括:
第4章主要以C语言为例,介绍GCC前端对于高级语言进行词法、语法分析,从而生成其AST的过程,重点描述了其中AST的表示、存储结构及其操作等。
第5章主要描述GIMPLE中间表示的生成过程。
第6章主要描述基于GIMPLE中间表示的各种编译优化,这些优化大多是基于静态单赋值(Static Single Assignment,SSA)形式的GIMPLE表示,而且都是与目标机器无关的优化。
第7章详细地介绍了GCC中RTL中间表示的基本概念,并对其类型、存储以及操作做了详细描述。
第8章主要介绍GCC中机器描述文件${target}.md的指令模板的基本概念及其主要内容,并对机器描述文件中def?ine_insn、def?ine_expand、def?ine_split、def?ine_peephole等主要操作进行了详细的描述和实例说明,这些内容对于理解机器描述文件和用户机器描述文件至关重要。
第9章主要对GCC中机器描述文件的c文件和头文件进行了详细描述。这些内容也为第12章的GCC向新处理器的移植做了充分的准备。另外,9.9节则重点介绍了与目标机器相关的生成器代码的结构及其作用。
第10章主要描述RTL中间表示的生成技术。
第11章主要描述基于RTL中间表示的优化技术,这些优化大部分是与目标机器相关的。
第12章重点给出将GCC移植到新的处理器的基本过程和实例。
关于GCC代码的结构,也可以参考Abhijat Vichare的《GCC-conceptual-structure》( http://www.cse.iitb.ac.in/grc/)。
相关文章
|
2天前
|
存储 编译器 C语言
深入理解GCC 和 G++ 编译器
GCC 和 G++ 是 GNU 工具链中的核心编译器,支持 C 和 C++ 程序开发。本文详细介绍其编译流程、常用选项及动态链接与静态链接的区别。编译过程分为预处理、编译、汇编和链接四个阶段,每个阶段有特定任务和命令选项。常用选项如 `-E`、`-S`、`-c` 和 `-o` 分别用于预处理、生成汇编代码、生成目标文件和指定输出文件。动态链接节省空间且易于更新,但依赖运行时库;静态链接独立高效,但文件较大且更新困难。合理选择优化选项(如 `-O0` 至 `-O3`)可提升程序性能。掌握这些知识有助于开发者更高效地编写、调试和优化代码。
37 23
深入理解GCC 和 G++ 编译器
|
5月前
|
前端开发 C语言
gcc动态库升级
gcc动态库升级
|
3月前
|
编译器 Linux C语言
gcc的编译过程
GCC(GNU Compiler Collection)的编译过程主要包括四个阶段:预处理、编译、汇编和链接。预处理展开宏定义,编译将代码转换为汇编语言,汇编生成目标文件,链接将目标文件与库文件合并成可执行文件。
119 11
|
5月前
|
编译器 开发工具 C语言
Gcc 链接文件
Gcc 链接文件
50 4
|
5月前
|
编译器 C语言 C++
MinGW安装gcc
MinGW安装gcc
118 0
|
7月前
|
自然语言处理 编译器 Go
GCC:GNU编译器
GCC:GNU编译器
112 0
|
7月前
|
Java 编译器 Linux
技术经验解读:【转载】详解GCC的下载和安装(源码安装)
技术经验解读:【转载】详解GCC的下载和安装(源码安装)
240 0
|
7月前
|
C语言
关于如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令
关于如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令
|
8月前
|
C语言
gcc的简易用法(编译、参数与链接)
【5月更文挑战第14天】gcc的简易用法(编译、参数与链接)。
71 1
|
8月前
|
Unix Java 编译器
安装gcc
【5月更文挑战第14天】安装gcc。
146 1