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

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/)。

时间: 2024-09-27 19:32:52

《深入分析GCC 》——3.2 GCC的逻辑结构的相关文章

gcc 编译-编译GCC,建立mcore的编译器

问题描述 编译GCC,建立mcore的编译器 因为芯片跟mcore比较类似,所以要用这个试试,可是这编译器就搞不定了. GCC安装的依赖包:gmp-5.0.1 mpfr-3.1.3 mpc-1.0.1 configure参数: $ ../configure --prefix=/home/xxxx/mcore-linux-gcc --with-gmp=/usr/local/gmp-5.0.1 --with-mpfr=/usr/local/mpfr-3.1.3 --with-mpc=/usr/loc

《深入分析GCC 》——2.2 GNU gdb调试工具

2.2 GNU gdb调试工具 调试工具是代码分析中至关重要的工具之一.在使用vim+ctags查看代码时,经常会遇到难以理解的部分,此时,可以借助调试工具,对代码的运行过程进行跟踪,通过跟踪运行过程以及关键数据的变化,可以从程序执行的过程中理解源代码的功能. 调试工具有很多种,最常用的是GNU gdb工具.下面通过一个例子,介绍如何使用gdb,这些调试命令几乎就是笔者调试程序的所有命令,简单且实用.关于完整的gdb的使用,请参与GNU gdb文档,或者使用man gdb进行在线查询. 本例主要

《深入分析GCC 》——1.2 GCC的特点

1.2 GCC的特点 GCC作为目前较为成功的编译系统之一,具有非常突出的优点,主要包括: (1)GCC编译系统支持众多的前端编程语言,GCC 4.4.0中${GCC_SOURCE}/gcc/目录下包含了前端编程语言处理的目录及其代码(其中,${GCC_SOURCE}表示GCC源代码的主目录,下同),主要包括C.C++.Ada.Fortran.Java.Objective-C.Objective-C++等语言的前端处理,可以使用如下命令查看这些目录: [GCC@localhost gcc-4.4

《深入分析GCC 》——2.5 GCC调试选项

2.5 GCC调试选项 GCC本身对包含了众多的调试选项,既可以为用户程序生成调试信息,也可以将GCC运行过程中的关键信息保存在文件或输出在终端上,常用的调试选项如表2-2所示.如果需要了解GCC在处理的各个阶段里中间表示的具体内容,或者需要了解GCC中某个处理过程对于中间表示的处理细节时,就可以使用表2-2中给出的各种GCC调试选项,输出GCC运行过程中所生成的中间表示的调试信息和处理过程细节,并结合GCC的代码,从而了解GCC的具体工作细节. 假设有如下的源代码: [GCC@localhos

《深入分析GCC 》——第3章 GCC总体结构3.1 GCC的目录结构

第3章 GCC总体结构GCC是一个复杂的软件系统,例如gcc-4.4.0.tar.gz软件包中包含了成千上万个文件.本章主要对GCC的代码结构和目录结构进行介绍,阐明GCC的主要模块及其相互关系,并给出GCC源代码编译的主要步骤和关键问题.3.1 GCC的目录结构GCC的源代码可以从GCC的官网(https://gcc.gnu.org)上获得.该源代码包主要包括bz2和gz两种压缩形式的tar包,以gcc-4.4.0为例,分别为gcc-4.4.0.tar.bz2及gcc-4.4.0.tar.gz

GCC性能优越的多平台编译器详解

不经意间,GCC已发展到了4.3的版本,尽管在软件http://www.aliyun.com/zixun/aggregation/36661.html">开发社区之外乏人闻问,但因为GCC在几乎所有开源软件和自由软件中都会用到,因此它的编译性能的涨落会直接影响到Linux .Firefox 乃至于OpenOffice.org和Apache等几千个项目的开发.因此,把GCC摆在开源软件的核心地位是一点也不为过.另一方面,GCC4.3的出现,正在牵引着广大程序员们的心.如果我们非要用一个词来说

让你的 PHP 7 更快 (GCC PGO)

我们一直致力于提升PHP7的性能,  上个月我们注意到GCC的PGO能在Wordpress上能带来近10%的性能提升,  这个让我们很激动. 然而,  PGO正如名字所说(Profile Guided Optimization 有兴趣的可以Google), 他需要用一些用例来获得反馈, 也就是说这个优化是需要和一个特定的场景绑定的. 你对一个场景的优化, 也许在另外一个场景就事与愿违了.  它不是一个通用的优化. 所以我们不能简单的就包含这些优化, 也无法直接发布PGO编译后的PHP7. 当然,

GCC的内嵌汇编语法

1 Overview 开发一个OS,尽管绝大部分代码只需要用C/C++等高级语言就可以了,但至少和硬件相关部分的代码需要使用汇编语言,另外,由于启动部分的代码有大小限制,使用精练的汇编可以缩小目标代码的Size.另外,对于某些需要被经常调用的代码,使用汇编来写可以提高性能.所以我们必须了解汇编语言,即使你有可能并不喜欢它.     如果我们选择的OS开发工具是GCC以及GAS的话,就必须了解AT&T汇编语言语法,因为GCC/GAS只支持这种汇编语法.  本文只讨论AT&T的汇编语法,以及G

gcc或clang中消除特定警告的方法

    一般在编译代码时会有相当多的警告信息,尤其当我们使用了-Wall选项的时候.-Wall绝不是像其字面意思一样打开所有警告.不过它打开的警告也相当多了.对于一些我们已知"无害"但仍然打印出来挤占可怜的控制台空间的警告,我们当然可以将其"屏蔽"掉.     就拿以下代码来说: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <uni

《Linux 高级程序设计(第三版)》——2.2 GCC/GDB编译调试工具基础

2.2 GCC/GDB编译调试工具基础 Linux 高级程序设计(第三版) GCC/G++是GNU最优秀的自由软件之一,它主要提供C/C++程序的编译工作.Linux下的C.C++程序开发过程中,一般都采用GCC/G++/GDB工具.将C语言程序编译成一个可执行文件一般都需经过以下4个步骤. (1)预处理(Preprocessing):对源代码文件中的文件包含.宏定义.预编译语句进行分析和替换. (2)编译(Compilation):根据编译器的语法规则,将高级语言转换为以.s为后缀的汇编语言文