[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.5.4 末端関数の扱い

機種によっては、末端関数(すなわち、他の関数の呼び出しがない関数)は、 その関数自身のレジスタウィンドウを作らないのであれば、より効率良く 実行させることができる。 これが意味することは、通常届けられるレジスタの代わりに、 呼びだし側によって渡されたレジスタで引数を受け取る必要があるということで ある。

末端関数が特別に取り扱われるのは、一般には他に幾つかの条件も満たされるときに 限られる。例えば、末端関数ではレジスタをその関数自身の変数や一時領域に しか使わない場合が多い。 我々は「末端関数」という言葉で、この特別な取扱いが可能な関数を指すことにする。 このため、関数呼び出しのない関数は必ずしも「末端関数」とは限らないことになる。

GNU CC は、関数が末端関数としての取扱いに向いているかどうかを知る前に レジスタ番号を割り当てる。 そのため、末端関数を出力するにはレジスタ番号の付け替えをする必要がある。 以下のマクロでこの処理を行なう。

LEAF_REGISTERS

あるベクトルの C の初期化子。ハードレジスタ番号が添え字となる。 末端関数処理の対象候補で使えるレジスタに対しては要素が 1 となる。

末端関数用の処理の中にレジスタ番号の付け替えがあるなら、 ここで印を付けたレジスタは番号付け替えの前のものであり、GNU CC が 普通に割り当てたものである。 番号付け替えの後で、アセンブラコード中で実際に使われるレジスタは、 このベクトルの中で 1 と印を付けるべきである。

ターゲット機種が末端関数の取扱いを最適化する手段を提供している場合にだけ このマクロを定義すること。

LEAF_REG_REMAP (regno)

一個の C の式で、その値は、関数が末端関数として取り扱われるときは、 regno を番号付け替えした後のレジスタ番号になる。

regno が、番号付け替えの前には末端関数に現れるべきでないレジスタ番号 なら、この式の値は -1 となるべきで、そうするとコンパイラがアボートする。

このマクロは、ターゲット機種が末端関数の扱いを最適化する手段を提供しており、 そのためにはレジスタの番号付け替えが必要である場合にのみ、定義する。

通常、FUNCTION_PROLOGUEFUNCTION_EPILOGUE は 末端関数を特別に取り扱わなければならない。 C の変数である current_function_is_leaf を調べてゼロでなければ 末端関数である。 current_function_is_leaf はローカルレジスタの割当に先だって 設定され、以降のコンパイラパスで有効である。 また、C の変数 current_function_uses_only_leaf_regs を調べて ゼロでなければ、末端レジスタしか使わない末端関数である。 変数 current_function_uses_only_leaf_regs は、再ロード後に有効になり、 LEAF_REGISTERS が定義されている場合にのみ意味がある。


This document was generated using texi2html 1.78.