摘要
文中尝试探讨了GCC 的结构,调试,测试,遍编写,移植等方面,目的是作为
一个 hand by hand 的入门读物,以后...结合 internal 看代码?优化理论?
Arch?...只要自己思考就好
个人能力有限,对 GCC 的一点粗浅认知,欢迎指正。
文中使用了来自 google 的一个调试方法的示例,来自印度技术学院孟买
分校的一个源代码示例的中间表示的教学示例,以及来自 HiPEAC 的循环优化
的例子。当然,我还拷贝了 gcc internal 很多列举描述性的东西。
目录
1 Get Build and Test 2
1.1 获取源代码 . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 检查系统需求 . . . . . . . . . . . . . . . . . . . . . . 2
1.3 配置 . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4 构建 . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.5 测试 . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.6 安装 . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2 Arch 11
2.1 gcc 编译流程 . . . . . . . . . . . . . . . . . . . . . . 11
2.2 GCC 代码目录结构 . . . . . . . . . . . . . . . . . . . . 11
2.3 GCC 内部结构 . . . . . . . . . . . . . . . . . . . . . . 14
3 IRs 24
3.1 对应源代码看 IR :来自印度技术学院孟买分校的教学示例 . . 24
3.2 调试 . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2.1 调试 GCC,最后一个例子来自 google . . . . . . . . 27
3.2.2 GCC 调试 . . . . . . . . . . . . . . . . . . . . 28
3.3 AST/GENERIC 简介 . . . . . . . . . . . . . . . . . . . . 28
3.4 GIMPLE/Tree-SSA 简介 . . . . . . . . . . . . . . . . . . 29
3.5 RTL 简介 . . . . . . . . . . . . . . . . . . . . . . . . 29
4 GIMPLE pass 34
4.1 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.2 来自 HiPEAC 的 GIMPLE/Tree-SSA 循环优化遍 . . . . . . . 34
5 RTL and port 40
5.1 porting GCC 简介 . . . . . . . . . . . . . . . . . . . . 40
5.2 RTL 简介 . . . . . . . . . . . . . . . . . . . . . . . . 41
5.3 port 一句话 . . . . . . . . . . . . . . . . . . . . . . 43
A 来自 HiPEAC 循环优化的 patch 44
参考文献 91
1
第 1 章
Get Build and Test
1.1 获取源代码
我们是要开发 GCC ,不是使用 GCC 做开发,当然要从源码构建了。去 GCC
http://gcc.gnu.org/ 主页下载最新版本的源代码或者运行下面命令:
• svn co svn://gcc.gnu.org/svn/gcc/trunk
也许你会觉得你需要 GMP 和 MPFR ,下载之。
1.2 检查系统需求
哦,什么需求呢?你最起码要有个 POSIX 环境吧?哈哈,这条不是认真
的,下面是构建 GCC 的系统需求:
• ANSI/ISO C90 编译器
你编译 GCC 也需要一个编译器啊,对于这一条我表示怀疑, GCC 代码里
面那么多 GNU 扩展,别的编译器可以编译 GCC ?所以推荐用 GCC 编译
GCC ,这可不是自举哦。
• GNU binutils
这个不用说, GCC 仅仅是把代码转变成 ASM , binutils 才是把 ASM
转变成 bin 的东西。目前 GCC 所支持的机器都是运行 bin 而不是 ASM
的。
• GNAT GNU Ada编译器
如果你需要编译 Ada 前端,这是不可缺少的,这个...我目前还不关心。
2
• POSIX 标准的 shell 或者 GNU bash
不要抱怨你怎么无法在流行的 Windows 下编译 GCC 啊, GCC 是在 UNIX
下开发使用的,所以,你至少需要一个 POSIX 的 shell ,或者 GNU bash
, 最流行的 UNIX 变种 Linux 下最流行的 shell 。
• POSIX 标准的 awk 或者 SVR4 标准的也可以
其实 GNU awk 就可以了,你的 Linux 套件中会有的。 GCC 在编译时所
生成的代码就是由这个脚本按照模板生成的。
• GNU make
土人不会用 Makefile,编译 GCC 需要 make ,我们不是土人。
• GNU Multiple Precision Library (GMP) 和 MPFR Library
前者就是 GNU 多精度库啦,配置的时候有三个相关选项:
--with-gmp
--with-gmp-lib
--with-gmp-include
MPFR 和 GMP 是配合,编译 GCC 的时候同时需要 GMP 和 MPFR 。配置的
时候同样有三个相关选项:
--with-mpfr
--with-mpfr-lib
--with-mpfr-include
• Parma Polyhedra Library (PPL)和 CLooG-PPL
这个选项在编译 GCC 的时候启用 Graphite 循环优化,这个 Graphite
我不知道叫什么。
--with-ppl
CLooG-PPL 应该被上面的参数一起指定了,如果你系统的默认路径中没有
包含 CLooG-PPL ,那么就需要指定下面的参数。
--with-cloog
• jar 或者 zip & unzip
这是构建 GCJ (GNU Java 编译器)所需要的运行时系统, libgcj 所需
要的。
• GNU tar & gzip & bzip2 | svn
显然这是我们获取代码的方式。
下面来看我们修改 GCC 所需要的软件包。
3
评论6