このページを編集する際は,編集に関する方針に従ってください.[]
概要[]
- gcc-4.1.0/gcc/tree.hにて定義
- GCC の内部で使用される木構造のノード (tree 型.すなわち union tree_node へのポインタ) が,実際には何の構造体 (整数定数を表す struct tree_int_cst や,実数を表す struct tree_real_cst など,さまざまな値を指し得る) を指しているのかを判定するための列挙型.
- tree ポインタが指す union tree_node は,当然 struct tree_common 型とは限らないが,tree_common 型以外の共用体メンバに含まれる全ての構造体は,必ず先頭に tree_common 型のメンバ common を持つ構造体として定義されている.そのため,C のメモリレイアウト上,必ず tree->common は合法なアクセスになる.
- common は tree_code 型のメンバ code を持っている.それゆえに,tree が指している値を,とりあえず tree_common だと見立てて,その code メンバにアクセスして,実際の型を動的に判定して行くことになる.
- 実際の判定には,以下のように,TREE_CODE(tree) マクロを使用する.
switch ( TREE_CODE(t) ) {
case INTEGER_CST:
... // 整数定数の処理
break;
...
case REAL_CST:
... // 実数定数の処理
...
break;
}
参考 (というよりも,まんま…) サイト (wo さんの日記)
http://morihyphen.hp.infoseek.co.jp/log/03_12.html
実装[]
- またここでも,tree.def と DEFTREECODE マクロを用いたトリックにより,enum 宣言が生成されている.
30 /* Codes of tree nodes */
31
32 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) SYM,
33
34 enum tree_code {
35 #include "tree.def"
36
37 LAST_AND_UNUSED_TREE_CODE
38 /* A convenient way to get a value for NUM_TREE_CODES. */
39 };
40
41 #undef DEFTREECODE
- マクロ展開後は,gcc-4.1.0/gcc/tree.def 内の,DEFTREECODE マクロの羅列の第一引数だけが残り,enum tree_code 宣言内に展開される.