[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
基本的なスタック配置について説明する。
STACK_GROWS_DOWNWARD
ワードをスタック上にプッシュした場合に、スタックポインタの値が 小さなアドレス方向に移動するなら、このマクロを定義する。
以下で「もし … ならこのマクロを定義する」と書いてある場合は、
コンパイラはこのマクロを #ifdef
で調べるだけなので、
何に定義されているかの詳細は関係がない。
FRAME_GROWS_DOWNWARD
局所変数用のスロットのアドレスのフレームポインタからのオフセットが 負であれば、このマクロを定義する。
ARGS_GROW_DOWNWARD
関数の一連の引数がスタック上でアドレスが減少する方向に置かれるなら、 このマクロを定義する。
STARTING_FRAME_OFFSET
確保すべき局所変数のスロットの、フレームポインタからのオフセットである。
FRAME_GROWS_DOWNWARD
であれば、次のスロットのオフセットを、
STARTING_FRAME_OFFSET
から先頭のスロットの長さを差し引くことで
求める。
FRAME_GROWS_DOWNWARD
でなければ、先頭のスロットの長さを
STARTING_FRAME_OFFSET
に加算することで求める。
STACK_POINTER_OFFSET
スタックポインタレジスタから、出力引数が置かれる先頭の位置へのオフセット を定義する。これが指定されていない場合は、デフォルト値のゼロが使われる。 多くの機種ではゼロが適切な値である。
ARGS_GROW_DOWNWARD
が定義されている場合は、これは、
出力引数が置かれている先頭の位置の直前の位置へのオフセットになる。
FIRST_PARM_OFFSET (fundecl)
引数ポインタレジスタからの先頭の引数のアドレスのオフセットを定義する。 マシンによっては、関数の戻り値型に依存する。
ARGS_GROW_DOWNWARD
が定義されている場合は、これは、
先頭の引数のアドレスの直前の位置へのオフセットになる。
STACK_DYNAMIC_OFFSET (fundecl)
スタックポインタレジスタから、例えば alloca
により、スタック上に
動的に確保されるものへのオフセットを定義する。
このマクロのデフォルト値は、STACK_POINTER_OFFSET
に出力引数の
長さを足したものある。
多くの機種ではこのデフォルト値で正しい値である。
詳細は、‘function.c’ を参照のこと。
DYNAMIC_CHAIN_ADDRESS (frameaddr)
呼び出し側フレームへのポインタが格納されているスタックフレームのアドレスを 表す RTL を値とする C の式。 frameaddr は、スタックフレーム自身のアドレスを表す RTL 式であると 仮定する。
このマクロを定義しない場合のデフォルトは、frameaddr の値を 返すことである。すなわち、スタックフレームのアドレスが、 前のフレームを指すスタックのワードのアドレスでもある。
SETUP_FRAME_ADDRESSES
定義されていれば、任意のフレームがアクセスできるようにスタックを設定する 機種固有のコードを生成する C の式である。 例えば、Sparc では、任意のスタックフレームをアクセス可能になる前に 全てのレジスタ・ウィンドウをスタックにフラッシュしなければならない。 このマクロを定義する必要は滅多にないだろう。
BUILTIN_SETJMP_FRAME_VALUE
定義されていれば、C の式であり、現在のフレームのアドレスを
組み込みの setjmp
バッファに格納するのに使われる rtx を
保持する。デフォルト値である virtual_stack_vars_rtx
が、
ほとんどの機種で正しい値である。このマクロを定義する必要が
出てくる理由の一つは、hard_frame_pointer_rtx
が読者の機種で
このマクロに適した値の場合があるからである。
RETURN_ADDR_RTX (count, frameaddr)
一個の C の式。その値は、プロローグの後、現在のフレームから count
段さかのぼったフレームの戻りアドレス値を表す RTL である。
frameaddr は、count 番目のフレームのフレームポインタか、
RETURN_ADDR_IN_PREVIOUS_FRAME
が定義されているなら、
count - 1 番目のフレームポインタである。
この式の値は count がゼロの場合は常に正しいアドレスに
ならなければならない。だが、他のフレームの戻りアドレスを決める方法が
ない場合は NULL_RTX
でも良い。
RETURN_ADDR_IN_PREVIOUS_FRAME
ある特定のスタックフレームの戻りアドレスが直前のスタックフレームの フレームポインタからアクセスされるなら、このマクロを定義する。
INCOMING_RETURN_ADDR_RTX
一個の C の式。この式の値は、任意の関数の先頭で、プロローグの前においての
入力戻りアドレスの位置を表す RTL である。この RTL はある REG
か、
ある MEM
のどちらかである。REG
は、戻り値が ‘REG’ に
セーブされることを示し、MEM
はスタック上の位置を表す。
このマクロを定義する必要があるのは、DWARF 2 で提供されているような 呼び出しフレームデバッグ情報をサポートしたいときだけである。
INCOMING_FRAME_SP_OFFSET
一個の C の式。この式の値は、任意の関数の先頭で、プロローグの前においての スタックポインタレジスタの値から、スタックフレームの頂上までのオフセットを バイト数で与える整数である。 フレームの頂上は、直前のフレームでのコール命令の直前でのスタックポインタ の値として定義される。
このマクロを定義する必要があるのは、DWARF 2 で提供されているような 呼び出しフレームデバッグ情報をサポートしたいときだけである。
ARG_POINTER_CFA_OFFSET
C の式である。引数ポインタから正規フレームアドレス(canonical frame
address (cfa))へのオフセットをバイト数で表した整数である。
最終的な値は、INCOMING_FRAME_SP_OFFSET
で計算した値と
一致する必要がある。残念なことに、INCOMING_FRAME_SP_OFFSET
は
レジスタが仮想的な実体である間は使えないのである。
このマクロを定義する必要があるのは、DWARF 2 で提供されているような 呼び出しフレームデバッグ情報をサポートしたいときだけである。
This document was generated
using texi2html 1.78.