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

17.7.1 基本的なスタックレイアウト

基本的なスタック配置について説明する。

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.