《深入分析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/)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: GCC是GNU Compiler Collection(GNU编译器集合)的缩写,它是一个流行的开源编译器套件。GCC在许多操作系统上广泛使用,并支持多种编程语言,如C、C++、Objective-C、Fortran等。 深入分析GCC PDF文档主要包含以下内容: 1. 简介和背景:PDF文档可能会提供GCC的历史和发展背景,讲解GCC作为一个自由软件项目的诞生和发展过程。还可能涵盖GCC发行版本的演变和GCC在开源社区中的地位。 2. GCC编译器的组成:PDF文档可能会详细描述GCC编译器的各个组成部分,如预处理器、编译器、汇编器和链接器等。还会介绍这些组件的功能、作用和相互关系。 3. 支持的编程语言:PDF文档可能会列举GCC支持的编程语言,并描述GCC在各种语言的编译器方面的特点和能力。对于每种语言,可能会介绍GCC支持的语言特性、可用的优化选项和编译器扩展。 4. 编译器选项和优化:PDF文档可能会提供关于GCC编译器选项和优化技术的详细信息。这些信息可以帮助开发人员更好地了解如何使用GCC编译器进行代码编译和优化,以提高代码性能和效率。 5. 跨平台支持和移植性:PDF文档可能会介绍GCC作为一个跨平台编译器的优势和特点。它可能会说明GCC可用于多种操作系统和硬件平台,并提供基于GCC的开发环境设置和配置方面的指导。 6. GCC扩展和插件:PDF文档可能会介绍GCC的扩展和插件生态系统,包括GCC插件开发和GCC扩展库的使用。它可能会提供关于如何为GCC开发和集成自定义编译器功能和扩展的指导。 总之,通过深入分析GCC PDF文档,我们可以获得关于GCC编译器的详细信息,包括其组成、支持的编程语言、编译器选项和优化技术,以及其在跨平台开发和扩展方面的特点和能力。这些信息对于开发人员来说非常有价值,可以帮助他们更好地使用GCC编译器进行开发和优化。 ### 回答2: GCC(GNU编译器集合)是一个开源的编程语言编译器套件,可以编译多种语言,如C、C++、Fortran等。GCC的开发由自由软件基金会(FSF)领导,并得到全球广泛的开发者社区的支持。 深入分析GCC PDF,首先要了解GCC的基本架构和工作原理。GCC由多个组件组成,包括前端、中端和后端。前端负责将不同的源代码转换为中间代码,中端进行中间代码的优化和转换,而后端根据目标平台将中间代码转换成机器码。 GCC PDF中通常包含GCC的各个组件的详细说明、接口定义和使用示例。可以从PDF中了解GCC的各个组件是如何协同工作的,每个组件的功能和作用分别是什么。这对于理解GCC的整体架构和代码编译的流程非常重要。 此外,GCC PDF还通常包含GCC支持的语言特性、编译选项和优化技术等相关信息。对于不同的语言特性和编译选项,PDF中可以提供详细的解释和示例,使开发者可以更好地理解和利用GCC提供的功能。 对于想要深入了解GCC的开发者来说,GCC PDF还可以提供GCC代码的详细解析和实现原理等内容。通过阅读PDF中的相关章节,可以更深入地了解GCC的内部工作机制和算法,对GCC进行二次开发或优化具有很大帮助。 总之,深入分析GCC PDF对于理解GCC的工作原理、代码结构和使用方式非常有帮助。通过研读PDF中的内容,可以更好地使用GCC进行代码编译、优化和开发,并为GCC的二次开发和改进提供理论基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值