GCC源代码阅读(一)

获取GCC源代码

阅读源代码的第一步是获取源代码,巧妇难为无米之炊嘛!

使用以下任意方法均可获得gcc源代码:

  1. svn checkout svn://gcc.gnu.org/svn/gcc/trunk SomeLocalDir (摘自http://gcc.gnu.org/svn.html
  2. git clone git://gcc.gnu.org/git/gcc.git(摘自http://gcc.gnu.org/git/?p=gcc.git;a=summary

需要注意的是,第二种方法得到的代码并非是svn的所有历史镜像。因为gcc的svn分支不是全部位于svn://gcc.gnu.org/svn/gcc/branches/这一层,其中如redhat或者google等实际起到名字空间的作用,再下一层才是真正的分支内容,然而svn到git转换的脚本不能识别这种情况,因此所有这类位于第二层的分支都不存在于git镜像中。

当然对于初学者来说并不重要,我们只要盯住一个版本看就好了,比如4.5.2或者4.4.5(原本想等4.6发布之后再开始这个学习系列,目前看来一半时是等不到了)。由于我之前在4.4.5上有一点积累,因此如没有特别说明,这一系列的心得都是通过阅读4.4.5的代码而来。

使用源代码交叉索引工具

拿到源代码之后,建议使用代码交叉索引工具生成索引,方便阅读。常用的有etags(或者ctags)和cscope。

etags

gcc的Makefile里有生成TAGS文件的target,可以直接在编译目录下生成,如

$ mkdir build
$ cd build
$ ../gcc/configure --enable-languages=c,c++,lto
$ make
$ make -k etags # OR `make -k tags'

在Emacs里加载TAGS文件的方法是:M-x visit-tags-table

cscope

cscope的配置也不复杂,以下是在Ubuntu 10.10下安装配置步骤

$ sudo apt-get install cscope cscope-el
$ cd gcc
$ gcc-cscope.sh

gcc-cscope.sh脚本内容如下

#!/bin/bash

BUILD_DIR=${1:-../build/gcc}
cscope-files.sh libiberty gcc include gcc/config/arm $BUILD_DIR >cscope.files
if [ -f cscope.files ]
then
    cscope -b -q -k
else
    echo "cscope.files not found at $PWD."
    exit 1
fi

由于gcc的部分代码是在编译期生成的,所以除了索引源代码目录下的文件,还要索引编译目录下的文件(对应于BUILD_DIR这个变量所制订的目录,缺省为build/gcc,也可以通过参数使用其它目录)。

由于gcc支持多种硬件平台,为避免混淆,我只选择了自己关心的ARM部分代码,其它后端代码忽略。

cscope-files.sh脚本内容如下:

#!/bin/bash

for dir in "$@"
do
    find "$dir" -maxdepth 1 -iname "*.[hc]" -type f
done

要想在Emacs里面使用cscope索引结果,需要安装cscope-el软件包,并把下面一行代码加入Emacs配置文件

(require 'xcscope)

具体使用方法可以参见/usr/share/emacs/site-lisp/xcscope.el文件内的注释。