獲取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/bashBUILD_DIR=${1:-../build/gcc} cscope-files.sh libiberty gcc include gcc/config/arm $BUILD_DIR >cscope.files if [ -f cscope.files ] thencscope -b -q -k elseecho "cscope.files not found at $PWD."exit 1 fi
由于gcc的部分代碼是在編譯期生成的,所以除了索引源代碼目錄下的文件,還要索引編譯目錄下的文件(對應于BUILD_DIR這個變量所制訂的目錄,缺省為build/gcc
,也可以通過參數使用其它目錄)。
由于gcc支持多種硬件平臺,為避免混淆,我只選擇了自己關心的ARM部分代碼,其它后端代碼忽略。
cscope-files.sh
腳本內容如下:
#!/bin/bashfor dir in "$@" dofind "$dir" -maxdepth 1 -iname "*.[hc]" -type f done
要想在Emacs里面使用cscope索引結果,需要安裝cscope-el
軟件包,并把下面一行代碼加入Emacs配置文件
(require 'xcscope)
具體使用方法可以參見/usr/share/emacs/site-lisp/xcscope.el
文件內的注釋。