获取GCC源代码
阅读源代码的第一步是获取源代码,巧妇难为无米之炊嘛!
使用以下任意方法均可获得gcc源代码:
svn checkout svn://gcc.gnu.org/svn/gcc/trunk SomeLocalDir
(摘自http://gcc.gnu.org/svn.html)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
文件内的注释。