[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
フレームポインタと引数ポインタの消去について説明する。
FRAME_POINTER_REQUIRED
ある関数がフレームポインタを持たなければならず、かつ使う必要がある場合は ゼロでない値を持つ C の式を定義する。 この式は、再ロードのパスで評価される。 この式の値がゼロでなければ、その関数はフレームポインタを持つようになる。
原理的にはこの式で現在の関数を調べてその結果に従ってフレームポインタ の有無を決定することができるが、ほとんどのマシンでは定数 0 か定数 1 を 使えば充分である。そのマシンがフレームポインタなしで生成したコードを 許し、かつ、フレームポインタを使わないことで時間や空間の節約になるなら、 0 を使う。 フレームポインタを使わないことに何の利点もなければ、1 を使う。
場合によっては、フレームポインタなしには正しいコードを生成する方法が
分からない場合がある。
GNU CC はそういう場合を認識し、FRAME_POINTER_REQUIRED
の値に
関わらず自動的に関数にフレームポインタを与える。
読者が心配することはない。
フレームポインタを必要としない関数では、固定レジスタとしていない限り、
フレームポインタレジスタを通常の使用目的に確保することができる。
詳細は FIXED_REGISTERS
の項を参照のこと。
INITIAL_FRAME_POINTER_OFFSET (depth-var)
関数のプロローグの直後の時点でのフレームポインタとスタックポインタの
値の差を変数 depth-var に格納する作業を行なう、C の文である。
この値は、get_frame_size ()
の結果と
二つのレジスタのテーブル、regs_ever_live
と call_used_regs
等の情報から計算することができる。
ELIMINABLE_REGS
が定義されているなら、このマクロは使われないので
定義する必要がない。
ELIMINABLE_REGS
が定義されていなければ、
FRAME_POINTER_REQUIRED
が常に真になるように定義されていても、
このマクロを定義しなければならない。FRAME_POINTER_REQUIRED
が
常に真の場合は、depth-var には何を設定しても良い。
ELIMINABLE_REGS
このマクロが定義されていれば、レジスタ対のテーブルを指す。 このレジスタ対のテーブルは、スタックフレーム中を指すレジスタのうち 不要なものを消去するために使うものである。 このマクロが定義されていない場合は、GNU CC が試みる消去は、 フレームポインタへの参照をスタックポインタへの参照に置き換えること だけである。
このマクロの定義は構造体の初期化式のリストからなり、 リストの各要素は、置き換え前のレジスタと置き換え後のレジスタ対を指定する。
マシンによっては、引数ポインタの位置はコンパイルが完了するまでは 分からない場合がある。そう言う場合は、別個のハードレジスタを引数ポインタ として使わなければならない。 このハードレジスタは、フレームポインタか引数ポインタかのどちらかで 置き換えることで消去可能である。どちらになるかは、フレームポインタが 消去されたかどうかにより決まる。
この場合、以下のように指定しなければならない。
#define ELIMINABLE_REGS \ {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \ {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}} |
引数ポインタをスタックポインタで置き換える消去が先頭に指定されているのは、 それが望ましい消去だからであることに注意。
CAN_ELIMINATE (from-reg, to-reg)
レジスタ番号 from-reg をレジスタ番号 to-reg で置き換える
試みが許されているならゼロでない値を返す C の式である。
このマクロは ELIMINABLE_REGS
が定義されている場合にのみ
定義すれば良く、通常は定数 1 になる。
というのは、レジスタ消去を妨げるほとんどの場合は、GNU CC が既に
知っていることだからである。
INITIAL_ELIMINATION_OFFSET (from-reg, to-reg, offset-var)
このマクロは、INITIAL_FRAME_POINTER_OFFSET
に似ている。
指定されたレジスタ対の差の初期値を指定する。
ELIMINABLE_REGS
が定義されているなら、このマクロを定義しなければ
ならない。
LONGJMP_RESTORE_FROM_STACK
関数 longjmp
が、setjmp
が明示的に退避したレジスタではなく、
スタックフレームからレジスタを復帰する場合は、このマクロを定義する。
このような機種では、ある種の量は、setjmp
の呼び出しを越えて
レジスタに保存されてはならない。
This document was generated
using texi2html 1.78.