64 ビット・モードでは、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) に置き換えます。
- 注:
- エクスポートの場合は常に、リンカーはプロシージャーの
記述子をオブジェクト・モジュールに挿入します。
64 ビット・モードでは、関数ポインターは、
値の範囲がプロシージャー名にまで及んでいるデータ型です。
このタイプの変数は、C や Fortran などのいくつかのプログラム言語に見られます。
Fortran で、EXTERNAL ステートメントにある仮引き数は関数ポインターです。
Fortran は、呼び出しステートメントのターゲット、またはこのようなステートメントの実引き数の文脈で、
関数ポインターの使用をサポートします。
関数ポインターは、関数記述子のアドレスである 1 フルワードです。
関数記述子は、3 ワードのオブジェクトです。
最初のワードはプロシージャーの入り口点のアドレスを含んでいます。
2 番目のワードはプロシージャーがバインドされるオブジェクト・モジュールの TOC のアドレスを持っています。
3 番目のワードは Fortran 以外の言語用の環境ポインターです。
関数記述子は、1 つの入り口点につき 1 つしかありません。
関数が外部関数である場合は、関数記述子は自分が識別するのと同じオブジェクト・モジュールにバインドされます。
記述子は外部名を持っていて、この外部名は関数名と同じですが、それを一意に識別する異なるストレージ・クラスを
持っています。
この記述子名が、すべてのインポートまたはエクスポート操作で使用されます。
関数は型に従って値を戻します。
- 32 ビットのモードでは、kind 1、2、および 4 の INTEGER と
LOGICAL は R3 に戻されます (符号/ゼロ拡張)。
- 64 ビットのモードでは、kind 1、2、および 4 の INTEGER と
LOGICAL は R3 に戻されます (右寄せ)。
- 64 ビットのモードでは、kind 8 の INTEGER と
LOGICAL は R3 に戻されます。
- REAL *4 または *8 は FP1 に戻されます。
REAL*16 は FP1 と FP2 に
戻されます。
- COMPLEX*8 または *16 は FP1 と FP2 に戻されます。
COMPLEX *32 は FP1 から FP4 に戻されます。
- 32 ビット・モードでは、
-qfloat=complexgcc が指定されると、
COMPLEX*8 は R3 から R4 に戻され、
COMPLEX*16 は R3 から R6 に戻されます。
64 ビット・モードでは、COMPLEX*8 は R3 に戻され、COMPLEX*16 は
R3 から R4 に戻されます。
- 文字ストリングは、呼び出し元によって割り振られたバッファーに戻されます。
このバッファーのアドレスと長さは、隠しパラメーターとして R3 と R4 に入れて渡されます。
最初の明示的なパラメーター・ワードは R5 に入れられ、それ以降のパラメーターはすべて次のワードに移動されます。
- 構造体は、呼び出し元によって割り振られたバッファーに戻されます。
アドレスは R3 に入れて渡され、長さの指定はありません。
最初の明示的なパラメーターは R4 に入れられます。
64 ビット・モードでは、
スタック・フロアとは、スタックがそれより下に広がることが
できないシステム定義のアドレスです。
システム内のすべてのプログラムは、スタック・フロアより下にあるスタック・セグメント内の位置へのアクセスを
回避する必要があります。
すべてのプログラムは、スタックに関連した他のシステム不変量を保守する必要があります。
- スタック・フロアよりも下のアドレスからは、データが保管されたり、アクセスされません。
- スタック・ポインターは常に有効です。
スタック・フレーム・サイズが 32,767 バイトよりも大きい場合は、その値が必ず 1 つの命令で変更されるように
十分注意してください。
このステップは、シグナル・ハンドラーがスタック・データをオーバーレイしたり、誤ってスタック・セグメントを
オーバーフローしているように見えるタイミング・ウィンドウが生じないようにするものです。
リンケージ規約では、オーバーフローのための明示的なインライン・チェックは必要ありません。
オペレーティング・システムは、記憶保護機構を使用して、スタック・セグメントの終わりを超える保管を検出します。
