■
以下、 @@@ は調べが足りていないと思う部分、保留した部分、つまり TODO です。
gcc - tree.def
GCC はすばらしい。地球が宇宙に誇れるソフトウェアだ…って前も書いたか。
ということで 3.4.0 を読み始めました。今度こそ止めない。と思ったら西田さんが解析を始められたらしい。
http://www.wnishida.com/~wmemo/?date=20040427#p04
残念ながら、私が主に興味があるのは RTL ができるまで。真逆だねえ。
さて、 tree.def が読み始めるべきところだと思う。インクルードガードも含めて一切マクロ定義が無いまま、コメントで説明がなされた後に、
DEFTREECODE (RETURN_EXPR, "return_expr", 's', 1)
なんて感じの宣言が続く。これを例えば c-lang.c では、
#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, const char tree_code_type[] = { #include "tree.def" 'x', #include "c-common.def" }; #undef DEFTREECODE
などとして利用する。こういうのは大好きだ。
DEFTREECODE の四引数の意味は、 enum のキー、文字列、種類、引数の数。引数だけわかりにくいけど、例えば for は 4 つ。いつもの 3 つと、 4 つ目はブロックだろう。
gcc - GTY, gentype, struct tree
かなり前の話ですが、読み始めようと思った動機の一つになったサイトです。私的には fontlist あたりで知った方なのですが、いろいろと勉強になりました。なめるように記録を全部読ませて頂いたりしました。
http://morihyphen.hp.infoseek.co.jp/log/03_12.html
GTY(()) は無視して良いらしい。同様に gentype も見なくて良いはず。
さらに tree 型についても解説しておられる。ということでここでは省略。ありがたい。
gcc - tree-dump
tree 型について理解できているか確認するために、 tree-dump.[hc] を読む。手頃なサイズだし。 queue に入れて dequeue_and_dump で dump するらしい。なんで queue になっているのかはとりあえず保留 (@@@) 。 dequeue_and_dump は大体思い描いていたような dump が行われている。
gcc - langhooks
tree を作っていくコードを見ようと思ったが、 wo さんの記述に従い、先に langhooks* を見る。 langhooks.h で lang_hooks 構造体が定義されていて、その中にさらに lang_hook_for_functions などの特定目的のフックを収める構造体がいくつか。それらは同じヘッダ内で定義されている。いずれも中身は関数ポインタばかり。そのポインタに langhooks-def.h で宣言されている lhd_* なりオリジナルで作ったものを渡せば良い作りであるようだ。
langhooks がどうかけられているかを調べるため、 toplev.c に。どこで lang_hooks がかけられているかがわからないまま (*lang_hooks.init)() されている。少し調べると、 c-lang.c で初期化されていた。
const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
LANG_HOOKS_INITIALIZER は langhooks-def.h にある大きなマクロ。他のマクロをまた呼んでいる。…(若干省略(@@@))…結局、例えば langhooks.init を調べたければ c-lang.c の LANG_HOOKS_INIT を調べる、というような対応付けで良さそう。すると c_objc_common_init を見ることになる。