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 つの内のいずれかを行います。

  1. foo が (同一オブジェクト・モジュールの外に) インポートされると、リンカーは .foo への BLfoo.glink (グローバル・リンケージ・ルーチン) への BL に変更して、.glink をオブジェクト・モジュールに挿入します。また、NOP 命令 (ORI R0,R0,0x0000) が BL 命令の直後にあると、リンカーは LOAD 命令を NOP 命令 L R2, 20(R1) に置き換えます。
  2. 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 つしかありません。関数が外部関数である場合は、関数記述子は自分が識別するのと同じオブジェクト・モジュールにバインドされます。記述子は外部名を持っていて、この外部名は関数名と同じですが、それを一意に識別する異なるストレージ・クラスを持っています。この記述子名が、すべてのインポートまたはエクスポート操作で使用されます。

関数値

関数はタイプに従って値を戻します。

スタック・フロア

スタック・フロアとは、スタックがそれより下に広がることができないシステム定義のアドレスです。システム内のすべてのプログラムは、スタック・フロアより下にあるスタック・セグメント内の位置へのアクセスを回避する必要があります。

すべてのプログラムは、スタックに関連した他のシステム不変量を保守する必要があります。

スタック・オーバーフロー

リンケージ規約では、オーバーフローのための明示的なインライン・チェックは必要ありません。オペレーティング・システムは、記憶保護機構を使用して、スタック・セグメントの終わりを超える保管を検出します。


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