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 を見ることになる。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h