XL Fortran for AIX V8.1.1
ユーザーズ・ガイド
1 つのルーチンに、2 つのシンボルが関連付けられています。それらは関数記述子 (name) とエントリー・ポイント (.name) です。ルーチンが呼び出されると、プログラムはそのエントリー・ポイントに直接分岐します。適切なレジスターへのパラメーター (存在する場合) のロードを除くと、コンパイラーは関数への呼び出しを以下の 2 つの命令に文字列の形で展開します。
BL .foo # Branch to foo
ORI R0,R0,0x0000 # Special NOP
リンカーは、BL 命令を検出すると、以下の 2 つの内のいずれかを行います。
- foo が (同一オブジェクト・モジュールの外に) インポートされると、リンカーは .foo への BL を
foo の .glink (グローバル・リンケージ・ルーチン) への BL に変更して、.glink をオブジェクト・モジュールに挿入します。また、NOP 命令 (ORI R0,R0,0x0000) が BL 命令の直後にあると、リンカーは LOAD 命令を NOP 命令 L R2, 20(R1) に置き換えます。
- foo が呼び出し元と同じオブジェクト・モジュールにバインドされていて、LOAD 命令 (32 ビットの場合は
L R2,20(R1)、(64 ビットの場合は L R2,40(R1))) または (ORI R0,R0,0) が BL 命令の直後にあると、リンカーは LOAD 命令を NOP 命令 (ORI R0,R0,0) に置き換えます。
- 注:
- エクスポートの場合は常に、リンカーはプロシージャーの記述子をオブジェクト・モジュールに挿入します。
関数ポインターは、値の範囲がプロシージャー名にまで及んでいるデータ型です。このタイプの変数は、C や Fortran などのいくつかのプログラム言語に見られます。
Fortran で、EXTERNAL ステートメントにある仮引き数は関数ポインターです。
Fortran は、呼び出しステートメントのターゲット、またはこのようなステートメントの実引き数の文脈で、関数ポインターの使用をサポートします。
関数ポインターは、関数記述子のアドレスである 1 フルワードです。関数記述子は、3 ワードのオブジェクトです。最初のワードはプロシージャーのエントリー・ポイントのアドレスを含んでいます。
2 番目のワードはプロシージャーがバインドされるオブジェクト・モジュールの TOC のアドレスを持っています。
3 番目のワードは Fortran 以外の言語用の環境ポインターです。関数記述子は、1 つのエントリー・ポイントにつき 1 つしかありません。関数が外部関数である場合は、関数記述子は自分が識別するのと同じオブジェクト・モジュールにバインドされます。記述子は外部名を持っていて、この外部名は関数名と同じですが、それを一意に識別する異なるストレージ・クラスを持っています。この記述子名が、すべてのインポートまたはエクスポート操作で使用されます。
関数はタイプに従って値を戻します。
- kind 1、2、および 4 の
INTEGER と LOGICAL は R3 に戻されます (右寄せ)。
- 32 ビットのモードでは、kind 8 の
INTEGER と LOGICAL は R3 と R4 に戻されます。
- 64 ビットのモードでは、kind 8 の
INTEGER と LOGICAL は R3 に戻されます。
- kind 4 または 8 の REAL は
FP1 に戻されます。
kind 16 の REAL は FP1 と FP2 に戻されます。
- kind 4 または 8 の COMPLEX は
FP1 と FP2 に戻されます。kind 16 の COMPLEX は
FP1-FP4 に戻されます。
- ストリングは、呼び出し元によって割り振られたバッファーに戻されます。このバッファーのアドレスと長さは、隠しパラメーターとして R3 と R4 に入れて渡されます。最初の明示的なパラメーター・ワードは R5 に入れられ、それ以降のパラメーターはすべて次のワードに移動されます。
- 構造体は、呼び出し元によって割り振られたバッファーに戻されます。アドレスは R3 に入れて渡され、長さの指定はありません。最初の明示的なパラメーターは R4 に入れられます。
スタック・フロアとは、スタックがそれより下に広がることができないシステム定義のアドレスです。システム内のすべてのプログラムは、スタック・フロアより下にあるスタック・セグメント内の位置へのアクセスを回避する必要があります。
すべてのプログラムは、スタックに関連した他のシステム不変量を保守する必要があります。
- スタック・フロアよりも下のアドレスからは、データが保管されたり、アクセスされません。
- スタック・ポインターは常に有効です。スタック・フレーム・サイズが 32,767 バイトよりも大きい場合は、その値が必ず 1 つの命令で変更されるように十分注意してください。このステップは、シグナル・ハンドラーがスタック・データをオーバーレイしたり、誤ってスタック・セグメントをオーバーフローしているように見えるタイミング・ウィンドウが生じないようにするものです。
リンケージ規約では、オーバーフローのための明示的なインライン・チェックは必要ありません。オペレーティング・システムは、記憶保護機構を使用して、スタック・セグメントの終わりを超える保管を検出します。
[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]