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

17.7.7 スカラ関数値の返し方

この節では、スカラを値として返す方法を制御するマクロについて議論する。 スカラ値とは、レジスタに収まる値である。

TRADITIONAL_RETURN_FLOAT

-traditional’ オプションを指定した場合、 float を返すように宣言された関数がその値を double 型に変換 させるようにすべきでなければ、このマクロを定義する。

FUNCTION_VALUE (valtype, func)

ある関数がデータ型 valtype の値を返す場所を表す RTL を作る C の式である。 valtype は、あるデータ型を表す木ノードである。 その型を表すのに使われるマシンモードを得るには TYPE_MODE (valtype) を使う。 多くの機種では、そのモードだけが適切である。 (実際に、ほとんどの機種では、スカラ値は、モードに関わらず同じ場所に 返される。)

この式の値は、通常、戻り値が格納されるハードレジスタについては reg RTX となる。 この値は、戻り値が複数の場所に置かれるなら、parallel RTX でも良い。 parallel 形式の説明については、FUNCTION_ARG を参照のこと。

PROMOTE_FUNCTION_RETURN が定義されている場合は、 valtype がスカラ型なら、PROMOTE_MODE で指定されているのと 同じ規則を適用しなければならない。

呼び出される具体的な関数が分かっているのなら、 func はその関数を表す木ノード(FUNCTION_DECL)である。 分かっていない場合は、func はヌルポインタである。 このため、特定の関数について、その呼び出し側が全部わかっている場合は、 戻り値を返すのに異なる規約を使うことが可能になる。

FUNCTION_VALUE は集合型のデータ型の戻り値には使われない。 これらはまた別の方法で返されるからである。 以下の、STRUCT_VALUE_REGNUM と関連マクロを参照のこと。

FUNCTION_OUTGOING_VALUE (valtype, func)

ターゲット機種に「レジスタ・ウィンドウ」があるため、 ある関数がその値を返すのに入れるレジスタが、呼び出し側がその値を 見つけるレジスタと同じでない場合は、このマクロを定義する。

そういう機種では、FUNCTION_VALUE が、 呼び出し側がその値を見いだすレジスタを計算する。 FUNCTION_OUTGOING_VALUE は、同様な形式で定義し、 その関数に値をどこに置くかを知らせるようにすべきである。

FUNCTION_OUTGOING_VALUE が定義されていない場合は、 FUNCTION_VALUE が両方の目的を果たす。

FUNCTION_OUTGOING_VALUE は集合型のデータ型の戻り値には使われない。 これらはまた別の方法で返されるからである。 以下の、STRUCT_VALUE_REGNUM と関連マクロを参照のこと。

LIBCALL_VALUE (mode)

あるライブラリ関数がモードmode の値を返す場所を表す RTL を作り出す C の式である。 呼び出される具体的な関数が分かっているのなら、 func はその関数を表す木ノード(FUNCTION_DECL)である。 分かっていない場合は、func はヌルポインタである。 このため、特定の関数について、その呼び出し側が全部わかっている場合は、 戻り値を返すのに異なる規約を使うことが可能になる。

ここで言う「ライブラリ関数」とは、コンパイラのサポートルーチンであり、 算術演算を実行するのに使われることに注意すること。 ライブラリ関数名は、コンパイラが特別に知っており、コンパイルされる C のコードには現れない。

LIBIRARY_VALUE の定義は、集合データ型については気にする必要はない。 集合データを返すようなライブラリ関数は一つもないからである。

FUNCTION_VALUE_REGNO_P (regno)

regno が、呼び出された関数の値が戻ってくるハードレジスタの 番号なら、ゼロでない値となる C の式。

値を戻すのに使われる役割が、レジスタ対(例えば、double 型の値用)の二番目に限定されているならレジスタなら、このマクロで認識する 必要はない。 このため、ほとんどの機種では、以下の定義で充分である。

 
#define FUNCTION_VALUE_REGNO_P(N) ((N) == 0)

レジスタウィンドウを持つ機種で、呼び出し側と被呼び出し側関数が 戻り値に異なるレジスタを使う場合は、このマクロは呼び出し側の レジスタ番号だけを認識すべきである。

APPLY_RESULT_SIZE

untyped_call’ と ‘untyped_return’ が、 任意の戻り値のセーブとリストアについて FUNCTION_VALUE_REGNO_P で暗示されるよりも、多くのスペースを必要とするなら、このマクロを 定義する。


This document was generated using texi2html 1.78.