2.3.3 エントリ・ポイントの宣言が必要な場合 |
|
CALLS,CALLG,JSB,BSBW,BSBB 命令のいずれかのターゲットとして使用される可能性があるコード・ラベルは,エントリ・ポイントとして宣言する必要があります。また,以下の条件に該当するコード・ラベルは,すべて .JSB_ENTRY 指示文または .JSB32_ENTRY 指示文を使用して,エントリ・ポイントとして宣言する必要があります。
- ラベルが,グローバルな (モジュールにまたがった) JMP 命令, BRB 命令,または BRW 命令のターゲットとなる可能性がある場合。
- ラベルが,不確定な分岐 (BRB#@(R10) など) のターゲットとなる可能性があり,参照とラベルが同じモジュール内にある場合でもラベルのアドレスが R10 に格納されている場合。
- 現在のモジュールからラベルがアクセスされるかどうかにかかわらず,ラベルのアドレスがレジスタまたはメモリ位置に格納される場合。
I64 と Alpha の OpenVMS の呼び出し規則では,不確定なコード・アドレスに直接アクセスする手段は提供されていません。そのようなアクセスは,すべてルーチンとコード・アドレスを記述するプロシージャ記述子を通じて実現されます。コード・ラベル・アドレスが格納されるときには,コンパイラはそのアドレスが現在のモジュールからだけ参照されるのか,別の MACRO モジュールや別の言語で記述された別のモジュールからも参照されるのかが分かりません。ソース命令がコード・アドレスを格納するときには必ず, MACRO コンパイラは,他のコードがそのコードに正しくアクセスできるように,代わりにそのコード・アドレスのプロシージャ記述子アドレスを格納します。プロシージャ記述子が存在するために,ラベルをエントリ・ポイントとして宣言する必要があります。格納されているアドレスを分岐先として使用する際,コンパイラはそのアドレスがどこから来たかを知らないため,格納されているアドレスを常にプロシージャ記述子のアドレスであると見なして,その記述子を使用してルーチンに制御を渡します。
OpenVMS I64 システムは, OpenVMS Alpha システムと同じように振る舞いますが,唯一の違いは,呼び出し規則では用語"関数記述子"が使用され,関数記述子はリンカによって作成される点です。