[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この節では、スカラを値として返す方法を制御するマクロについて議論する。 スカラ値とは、レジスタに収まる値である。
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.