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