GCC Wikia
Advertisement

このページを編集する際は,編集に関する方針に従ってください.[]

概要[]

  • 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 宣言内に展開される.



リンク元

Advertisement