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

17.7.8 大きな値の返し方

関数値のモードが BLKmode の場合(そして他のいくつかの場合)、 値は FUNCTION_VALUE にしたがっては返されない(see section スカラ関数値の返し方)。 代わりに、呼びだし側が値を格納すべきメモリブロックのアドレスを渡す。 このアドレスは、構造体値アドレス と呼ばれる。

この節では、構造体値をメモリに入れて返す方法を説明する。

RETURN_IN_MEMORY (type)

一個のCの式。この式により、戻り値の型によって、一定の関数の戻り値をレジスタで 返すのを禁止することが可能である。 この式の値がゼロでないと、大きな構造体を返す場合は常にそうであるように、 関数の値をメモリに入れて返すことを表す。 ここで type は、tree 型の C の式であり、戻り値のデータ型を 表現する。

モード BLKmode の値は、このマクロで明示的に扱わなければ ならないことに注意。また、 ‘-fpcc-struct-return’ は、このマクロに 関係なく有効になる。ほとんどの機種では、このマクロを定義しなくても良い。 定義しないとデフォルトの定義が使われ、その場合、このマクロの値は BLKmode の値の場合は 1 に、それ以外の場合は 0 になる。

構造体と共用体を常にメモリで返すように指示するのには、このマクロは 使わないこと。そのためには、代わりに DEFAULT_PCC_STRUCT_RETURN を 使うべきである。

DEFAULT_PCC_STRUCT_RETURN

全ての構造体と共用体の戻り値をメモリに入れなくてはならない場合は このマクロを 1 に定義する。 これを定義すると生成されるコードが遅いものになるので、 他のコンパイラや ABI との互換性のために必要な場合にだけ 定義するようにする。 このマクロを 0 に定義すると、構造体と共用体の戻り値に対する規約は、 マクロ RETURN_IN_MEMORY により決定される。

このマクロが定義されない場合は、デフォルトで 1 となる。

STRUCT_VALUE_REGNUM

構造体値のアドレスがレジスタで渡されるなら、STRUCT_VALUE_REGNUM は そのレジスタ番号とする必要がある。

STRUCT_VALUE

構造体値のアドレスがレジスタでは渡されないなら、STRUCT_VALUE を アドレスが渡される場所を表す RTX を返す式として定義する。 それが 0 を返すと、アドレスは「見えない」先頭の引数として渡される。

STRUCT_VALUE_INCOMING_REGNUM

アーキテクチャによっては、被呼び出し関数が構造体値のアドレスを見つける 場所が、呼び出し側が置いた場所と同じでないことがある。 これは、レジスタ・ウィンドウのせいであったり、関数のプロローグが 異なる場所へ移動するためであったりする。

入力引数の構造体値のアドレスが置かれる位置がレジスタの場合は、 このマクロをレジスタ番号として定義する。

STRUCT_VALUE_INCOMING

入力位置がレジスタでない場合は、呼び出された関数がその値を探すべき 位置を表す RTX の式として STRUCT_VALUE_INCOMING を定義すべきである。 その値をスタック上で探すべきなら、このマクロをフレームポインタを参照する mem を作り出すように定義する。0 と定義すると、アドレスは 「不可視」の第一引数として渡されることを意味する。

PCC_STATIC_STRUCT_RETURN

構造体や共用体を返すための、ターゲット機種でのシステムの通常の規約が 呼び出された関数が構造体や共用体の値を含む静的変数のアドレスを返す というものであるなら、このマクロを定義する。

システムの通常の規約が呼び出し側がサブルーチンにアドレスを渡すもので あるなら、このマクロは定義しないこと。

このマクロは ‘-fpcc-struct-return’ を指定した場合に効果があるが、 ‘-freg-struct-return’ を指定した場合には何の効果もない。


This document was generated using texi2html 1.78.