XL Fortran for AIX V8.1.1

ユーザーズ・ガイド


引き数の引き渡しに関するリンケージ規約

システム・リンケージ規約は、使用可能な多数のレジスターを利用します。リンケージ規約では、引き数を GPR と FPR の両方に入れて渡します。 2 つの固定リスト R3-R10 および FP1-FP13 は、引き数の引き渡しに使用可能な GPR および FPR を指定します。

使用可能な引き数 GPR および FPR よりも多くの引き数ワードがある場合は、残りのワードはスタックのストレージに入れて渡されます。ストレージ内の値は、レジスター内の場合と同一です。

パラメーター域のサイズは、スタック・フレームに関連付けられているプロシージャーからの呼び出しステートメントで渡されるすべての引き数を入れられるだけの大きさがあります。特定の呼び出しのための引き数がすべてストレージに実際に現れるわけではありませんが、各引き数が 1 つまたはそれ以上のワードを占有し、この区域内にリストを作成すると考えるとわかりやすくなります。

参照による呼び出し (Fortran ではデフォルトの場合のように) では、引き数のアドレスはレジスターに入れて渡されます。以下の情報は、%VAL が使用される時の C または Fortran の場合と同じように、値による呼び出しのことを述べています。リスト内に現れるようにするために、引き数は浮動小数点値または非浮動小数点値として分類されます。

32 ビット環境の場合

  • 個々の INTEGER(8) および LOGICAL(8) 引き数には、 2 つのワードが必要です。
  • 組み込みタイプのその他の非浮動小数スカラーは、1 ワードを必要とし、GPR に現れるのとまったく同じようにそのワードに現れます。これは、言語のセマンティクスが指定されている場合、右寄せされ、ワード境界に合わせられます。
  • 個々の単精度 (REAL(4)) 値は 1 ワードを占有します。個々の倍精度 (REAL(8)) 値はリスト内で 2 つの連続ワードを占有します。個々の倍精度 (REAL(16)) 値はリスト内で 2 つの連続ワードを占有します。
  • COMPLEX 値は、同じ kind タイプ・パラメーターを持つ REAL 値の 2 倍のワードを占有します。
  • Fortran および C では、構造体はストレージ内にあるとおりに連続ワードに現れて (ストレージ内のどこにあっても) すべての適切な境界合わせの要件を満たします。構造体はフルワードに境界を合わせられ、(sizeof(struct X)+3)/4 フルワードを占有します (終わりに埋め込みされます)。 1 ワードよりも小さい構造体は、そのワードまたはレジスター内で左寄せされます。 1 ワードよりも大きい構造体は複数のレジスターを占有することができ、一部はストレージに一部はレジスターに入れられて渡される場合があります。
  • Pascal レコードなどにあるその他の集合値は、「参照による値」で渡されます。つまり、コンパイラーは実際にそれらのアドレスを渡して、呼び出されたプログラム内にコピーが作成されるようにします。
  • プロシージャーまたは関数ポインターは、ルーチンの関数記述子を指し示すポインターとして渡されます。その最初のワードには、エントリー・ポインターのアドレスが含まれています。 (詳細は、関数を指し示すポインターを参照)
64 ビット環境の場合

  • すべての非浮動小数点の値には、ダブルワード境界の合わせられた 1 つのダブルワードが必要です。
  • 個々の単精度 (REAL(4)) 値と個々の倍精度 (REAL(8)) 値はリスト内で 1 つのダブルワードを占有します。個々の拡張精度 (REAL(16)) 値はリスト内で 2 つの連続ダブルワードを占有します。
  • COMPLEX 値は、同じ kind タイプ・パラメーターを持つ REAL 値の 2 倍のダブルワードを占有します。
  • Fortran および C では、構造体はストレージ内にあるとおりに連続ワードに現れて (ストレージ内のどこにあっても) すべての適切な境界合わせの要件を満たします。構造体はダブルワードに境界を合わせられ、 (sizeof(struct X)+7)/8 ダブルワードを占有します (終わりに埋め込みされます)。 1 ダブルワードよりも小さい構造体は、そのダブルワードまたはレジスター内で左寄せされます。 1 ワードよりも大きい構造体は複数のレジスターを占有することができ、一部はストレージに一部はレジスターに入れられて渡される場合があります。
  • Pascal レコードなどにあるその他の集合値は、「参照による値」で渡されます。つまり、コンパイラーは実際にそれらのアドレスを渡して、呼び出されたプログラム内にコピーが作成されるようにします。
  • プロシージャーまたは関数ポインターは、ルーチンの関数記述子を指し示すポインターとして渡されます。その最初のワードには、エントリー・ポインターのアドレスが含まれています。 (詳細は、関数を指し示すポインターを参照)

引き数の引き渡し規則 (値による)

以下の図から、次のような規則を理解できます。

関数への呼び出しの例を次に挙げます。

         f(%val(l1), %val(l2), %val(l3), %val(d1), %val(f1),
                   %val(c1), %val(d2), %val(s1), %val(cx2))

上記の意味は次のとおりです。

l integer(4) (フルワードの整数) を示します。
d real(8) (倍精度) を示します。
f real(4) (実数) を示します。
s integer(2) (ハーフワード整数) を示します。
c character (1 文字) を示します。
cx complex(8) (倍精度複素数) を示します。

図 4. 32 ビット環境でのスタック上のパラメーター域のストレージのマッピング

32 ビット環境でのスタック上の パラメーター域のストレージのマッピング

図 5. 64 ビット環境でのスタック上のパラメーター域のストレージのマッピング

64 ビット環境でのスタック上の パラメーター域のストレージのマッピング

引き数リスト内の引き数の順序

引き数リストは以下の順序で作成します。同一の中黒内の項目は、呼び出しで引き数キーワードが使用されてもされなくても、プロシージャー宣言の場合と同じ順序で現れます。


脚注:

4
Fortran-Fortran 呼び出しの間、このリストに別の項目がある場合もありますが、このセクションの呼び出し規則に従っている Fortran 以外のプロシージャーには見えません。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]