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

17.7.3 スタックフレームを扱うレジスタ

スタックフレームを指すレジスタについて説明する。

STACK_POINTER_REGNUM

スタックポインタレジスタのレジスタ番号である。FIXED_REGISTERS に より固定レジスタとして指定されていなければならない。 大抵の機種では、このレジスタはハードウェアによって決められている。

FRAME_POINTER_REGNUM

フレームポインタレジスタのレジスタ番号である。フレームポインタは、 スタックフレーム中の自動変数を参照するのに使われる。 マシンによっては、このレジスタがハードウェアによって決められている場合が ある。ハードウェアによって決められていない場合は、好きなレジスタを フレームポインタとして使うことができる。

HARD_FRAME_POINTER_REGNUM

マシンによっては、フレームポインタと自動変数の開始オフセットとの オフセットが、レジスタの確保が完了するまで分からない場合がある。 (例えば、セーブされたレジスタがこの二つの位置の間にあるような場合である。) この種類のマシンでは、FRAME_POINTER_REGNUM として 特別な固定したレジスタを定義し、オフセットが分かるまでは内部的に これを使うようにする。そして、HARD_FRAME_POINTER_REGNUM は、 フレームポインタとして実際に使われるハードレジスタ番号を定義する。

このマクロは次のような非常に希な場合にだけ定義するべきである。 その場合とは、フレームポインタと自動変数の間のオフセットが レジスタ割当が完了するまで計算できないという場合である。 このマクロが定義されている場合は、ELIMINABLE_REGS の定義で、 FRAME_POINTER_REGNUM を消去して、 HARD_FRAME_POINTER_REGNUMSTACK_POINTER_REGNUM に 置き換える方法も示さなければならない。

FRAME_POINTER_REGNUM と同じになる場合は、このマクロは 定義しないこと。

ARG_POINTER_REGNUM

引数ポインタレジスタのレジスタ番号である。このレジスタは、 関数の引数リストをアクセスするのに使われる。 機種によっては、フレームポインタレジスタと同じである。 また、機種によっては、ハードウェアによりどのレジスタかが決まっている場合も あるし、引数ポインタレジスタとして任意のレジスタを自分で選択出来る場合もある。 引数レジスタがフレームポインタレジスタと同じではない場合は、 FIXED_REGISTERS に従って、それに固定レジスタである印を付けるか、 それを消去可能になるように調整しなければならない。 (see section フレームポインタと引数ポインタの消去)

RETURN_ADDRESS_POINTER_REGNUM

戻りアドレスポインタレジスタのレジスタ番号。 これは、現在の関数の戻りアドレスをスタックからアクセスするのに使われる。 機種によっては、戻りアドレスが、フレームポインタやスタックポインタや 引数ポインタからの固定のオフセットにない場合がある。 このレジスタはスタック上の戻りアドレスを指すように定義でき、 ELIMINABLE_REGS により、フレームポインタかスタックポインタに 変換される。

スタックから戻りアドレスを得る方法が他にあるのなら、 このマクロは定義しないこと。

STATIC_CHAIN_REGNUM
STATIC_CHAIN_INCOMING_REGNUM

関数の静的チェーンポインタを渡すのに使うレジスタの番号である。 レジスタ・ウィンドウが使われる場合は、呼び出された関数から見える レジスタ番号は STATIC_CHAIN_INCOMING_REGNUM である。 一方、呼びだし側関数から見えるレジスタ番号は STATIC_CHAIN_REGNUM である。この二つのレジスタが同じなら、STATIC_CHAIN_INCOMING_REGNUM は定義しなくて良い。

静的チェーンレジスタは固定レジスタである必要はない。

静的チェーンがメモリで渡されるなら、これらのマクロは定義すべきではない。 代わりに次の二つのマクロを定義すべきである。

STATIC_CHAIN
STATIC_CHAIN_INCOMING

静的チェーンがメモリで渡されるなら、これらのマクロは、それらがどこに 格納されるかを示す mem 式を与える RTX を提供する。 STATIC_CHAINSTATIC_CHAIN_INCOMING は、 それぞれ、呼びだし側関数と呼び出された関数から見える位置を表す。 前者はスタックポインタからのオフセットの位置にあり、後者は フレームポインタからのオフセット位置にあることが多い。

変数 stack_pointer_rtxframe_pointer_rtxarg_pointer_rtx が、これらのマクロの使用に先だって初期化されるので、 マクロを参照するのにはこちらの変数を使うべきである。

静的チェーンがレジスタで渡されるなら、先の二つのマクロを代わりに定義すべき である。


This document was generated using texi2html 1.78.