[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コンパイラ全体の制御構造は、‘toplev.c’ に記述されている。 このファイルは、初期化、引数の解析、ファイルのオープン/クローズ、 各パスの順次実行を受け持つ。
構文解析パスは一度だけ起動され、入力全体を構文解析する。 関数が文単位で構文解析されるにつれ、その関数に対する RTL 中間コードが、 生成される。各文は、構文木として読み込まれ、その後 RTL に変換される。 その後、その文の構文木用のメモリ領域が再利用される。 型(とその大きさを表す式)、宣言、結合の概略と何重に入れ子になっているかの 表現は、関数のコンパイルが完了するまで残っている。これは、全て デバッグ情報を出力するのに必要である。
構文解析パスが、完全な関数定義か最上位の宣言を読み込む度に、
関数 rest_of_compilation
か rest_of_decl_compilation
を
呼び出す。これらの関数は ‘toplev.c’ にあり、
アセンブラ言語の出力で終わる、以後必要な全ての処理に責任がある。
コンパイラの他の全てのパスは、順番に、rest_of_compilation
の中で
実行される。この関数がある関数定義をコンパイルする処理から戻ると、
その関数定義のコンパイルに使われた記憶領域はインライン関数でない限り
完全に解放される
(see section An Inline Function is As Fast As a Macro)。
以下にコンパイラの全パスとそのソースファイルの一覧を示す。 また、‘-d’ で始まるオプションで要求されるデバッグダンプについての 解説も含めた。
木表現は完全には C の文法にしたがっていない。 他の言語も同様にサポートすることを意図しているからである。
言語固有のデータ型解析もこのパスで行なわれ、 式を表現するあらゆる木ノードには、あるデータ型が付いている。 変数は宣言ノードとして表現される。
定数フォールディングといくつかの演算の単純化もこのパスで行なわれる。
言語独立のパース部のソースファイルは、‘stor-layout.c’、 ‘fold-const.c’、‘tree.c’ である。 また、‘tree.h’ と ‘tree.def’ というヘッダファイルで、 木構造の表現形式で定義している。
C 言語のパース部のソースファイルは、 ‘c-parse.in’、 ‘c-decl.c’、 ‘c-typeck.c’、 ‘c-aux-info.c’、 ‘c-convert.c’、 ‘c-lang.c’ であり、関連するヘッダファイルは ‘c-lex.h’ と ‘c-tree.h’ である。
C++ 言語のパース部のソースファイルは、‘cp-parse.y’、‘cp-class.c’、
‘cp-cvt.c’、‘cp-decl.c’、‘cp-decl2.c’、
‘cp-dem.c’、‘cp-except.c’、
‘cp-expr.c’、‘cp-init.c’、‘cp-lex.c’、
‘cp-method.c’、‘cp-ptree.c’、
‘cp-search.c’、‘cp-tree.c’、‘cp-type2.c’、
‘cp-typeck.c’、であり、関連するヘッダファイルは ‘cp-tree.def’、
‘cp-tree.h’、‘cp-decl.h’ である。
Objective C をパースする特別なソースファイルは、 ‘objc-parse.y’、‘objc-actions.c’、‘objc-tree.def’、それに ‘objc-actions.h’である。C 言語固有のファイルの幾つかも使われる。
ファイル ‘c-common.c’ は、上記の全ての言語で使われる。
この部分には、ターゲットのパラメータに依存するコードが大量にある。 これは、ある種の標準的な命令が利用可能な場合にのみ適用する必要が ある戦略が多いためである。名前付き命令パターンの目的は、 この情報を RTL 生成パスに提供することにある。
このパスでは、比較や真偽値演算、三項演算子式である if
節の条件に対する
最適化が行なわれる。
末尾再帰もこのときに検出される。
ループをどのように編成するのが最適か、それに switch
文を
どのように出力するかの決定が行なわれる。
RTL 生成に関係するソースファイルは、
‘stmt.c’、
‘calls.c’、
‘expr.c’、
‘explow.c’、
‘expmed.c’、
‘function.c’、
‘optabs.c’、
‘emit-rtl.c’ である。
また、ファイル ‘insn-emit.c’ が、genemit
プログラムにより
マシン記述から生成され、このパスで使われる。
ヘッダファイル ‘expr.h’ がこのパス内の通信に使われる。
ヘッダファイル ‘insn-flags.h’ と ‘insn-codes.h’ は、
マシン記述から genflags
プログラムと gencodes
プログラム
により生成される。これらのファイルにより、このパスで
利用可能な標準パターン名とそれに対応するパターンが分かる。
デバッグ情報の出力を別として、これ以降のパスでは 関数の木構造表現(これは部分的にしかセーブされない)を参照しない。
後続の呼び出しにおいて、関数がインライン展開可能か、そしてインライ展開 すべきかは、RTL 生成の終了時に決定される。 インライン展開される関数は幾つかの規準を満たさなければならない。 この規準は現在は、関数の大きさと仮引数の型と数に関係する。 これを満たす関数は、ループや自分自身の再帰呼び出し(末尾再帰関数も インライン展開可能!)、goto 等、つまるところ、GCC がサポートしている 全ての構文を含んでいて良いことに注意して欲しい。 ファイル ‘integrate.c’ には、後のインライン展開に備えて関数の RTL を セーブし、その関数が呼び出されたときにその RTL をインライン展開するコードが 含まれている。 ヘッダファイル ‘integrate.h’ もまたこの目的に使われる。
‘-dr’ オプションを指定すると、このパス後の RTL コードの デバッグ出力が行なわれる。デバッグ出力のファイル名は 入力ファイル名に ‘.rtl’ を付けたものになる。
ジャンプ最適化は二回か三回実行される。 最初は、RTL 生成の直後である。二回目は、CSE の後だが、 ただし CSE がジャンプ最適化を繰り返す必要があると判断した場合だけである。 最後は、最終パスの直前に行なわれる。このとき、 クロスジャンプと no-op 移動命令の削除が、上記の最適化と合わせて行なわれる。
このパスのソースファイルは ‘jump.c’ である。
‘-dj’ オプションを指定すると、このパス後の RTL コードの デバッグ出力が行なわれる。デバッグ出力のファイル名は 入力ファイル名に ‘.jump’ を付けたものになる。
‘-ds’ オプションを指定すると、このパス後の RTL コードの デバッグ出力が行なわれる。デバッグ出力のファイル名は 入力ファイル名に ‘.cse’ を付けたものになる。
このパスのソースファイルは gcse.c である。
‘-dG’ オプションを指定すると、このパス後の RTL コードのデバッグ 出力が行われる。デバッグ出力のファイル名は 入力ファイル名に ‘.gcse’ を付けたものになる。
コマンド行オプション ‘-dL’ を指定すると、このパス終了後の RTL コードの デバッグダンプを出力する。ダンプのファイル名は、入力ファイル名に ‘.loop’ を付けたものである。
コマンド行オプション ‘-dt’ を指定すると、このパス終了後の RTL コードの デバッグダンプを出力する。ダンプのファイル名は、入力ファイル名に ‘.cse2’ を付けたものである。
このパスでは、また、決して使われることのない結果を出す計算を削除し、 メモリ参照を加算または減算命令と組み合わせて、自動インクリメントあるいは 自動デクリメントのアドレッシングを作り出す。
コマンド行オプション ‘-df’ を指定すると、このパス終了後の RTL コードの デバッグダンプを出力する。ダンプのファイル名は、入力ファイル名に ‘.flow’ を付けたものである。 単純な(stupid)レジスタ割当が使われているなら、 このダンプファイルは、その割当に関する全ての結果も含める。
コマンド行オプション ‘-dc’ を指定すると、このパス終了後の RTL コードの デバッグダンプを出力する。ダンプのファイル名は、入力ファイル名に ‘.combine’ を付けたものである。
コマンド行オプション ‘-dN’ を指定すると、このパス終了後の RTL コードの デバッグダンプを出力する。ダンプのファイル名は、入力ファイル名に ‘.regmove’ を付けたものである。
命令スケジューリングは二回行なわれる。 一回目は命令組合せの直後で、二回目はリロードの直後である。
コマンド行オプション ‘-dS’ を指定すると、このパス終了後の RTL コードの デバッグダンプを出力する。ダンプのファイル名は、入力ファイル名に ‘.sched’ を付けたものである。
オプション ‘-dl’ を指定すると、このパスを終了した後の RTL コードのデバッグダンプを行なう。 出力されるダンプファイル名は、入力ファイル名に ‘.lreg’ を付けた ものになる。
再ロードパスでは、オプションで、フレームポインタの削除と、 呼出しの前後で呼出し時破壊レジスタのセーブ/リストアを行なう命令の 挿入も行なう。
関係するソースファイルは ‘reload.c’ と ‘reload1.c’ で、 さらに、この両者の通信用にヘッダファイル ‘reload.h’ が 使われる。
‘-dg’ オプションを指定すると、このパス後の RTL コードのデバッグ出力を 行なう。デバッグ出力ファイル名は、入力ファイル名に ‘.greg’ を 付けたものになる。
‘-dR’ オプションを指定すると、このパス後の RTL コードのデバッグ出力を 行なう。デバッグ出力ファイル名は、入力ファイル名に ‘.sched2’ を 付けたものになる。
‘-dJ’ オプションを指定すると、このパス後の RTL コードのデバッグ出力を 行なう。デバッグ出力ファイル名は、入力ファイル名に ‘.jump2’ を 付けたものになる。
‘-dd’ オプションを指定すると、このパス後の RTL コードのデバッグ出力を 行なう。デバッグ出力ファイル名は、入力ファイル名に ‘.dbr’ を 付けたものになる。
‘-dk’ オプションを指定すると、このパス後の RTL コードのデバッグ出力を 行なう。デバッグ出力ファイル名は、入力ファイル名に ‘.stack’ を 付けたものになる。
関連ソースファイルは、‘final.c’ と ‘insn-output.c’ である。 後者は、マシン記述から ‘genoutput’ プログラムにより自動的に 生成される。ヘッダファイル ‘conditions.h’ を 使って、この二つのファイルの間で情報交換を行なう。
さらに幾つかのファイルが、全ての、あるいは多くのパスで使われる。
gen*
のツール群もこれらのファイルを使って、
マシン記述 RTL を読んで処理を行なう。
genconfig
により自動的に
生成されるパラメータ(C のマクロ定義)を数個含んでいる。
HARD_REG_SET
型とこれを取り扱う
マクロをいくつかを定義している。
HARD_REG_SET
型は、各ハードレジスタにつき 1 ビットの
ビットベクトルである。
この型は、ハードレジスタ数が充分少なければ、単なる int
になる。
多い場合は、int
の配列になり、マクロのうち幾つかはループに
展開される。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated
using texi2html 1.78.