日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS MACRO コンパイラ
|
目次 | 索引 |
.DEFINE_PAL ( OpenVMS Alpha のみ) |
後で MACRO から呼び出すことができるように,任意の PALcode 機能を定義します。
.DEFINE_PAL name, pal_opcode, [,operand_descriptor_list]
name
PALcode 機能の名前です。コンパイラは,指定された名前に接頭辞 EVAX_ を付加します (EVAX_MTPR_USP など)。pal_opcode
PALcode 機能のオペレーション・コード値です。 PALcode のオペレーション・コードの一覧は Alpha Architecture Reference Manual に記載されています。機能コードを 16 進形式 (^X) で指定する場合は,必ず山括弧で囲んでください。機能コードを 10 進形式で指定する場合は,山括弧は必要ありません。
operand_descriptor_list
オペランドの数とそれぞれの型を指定するオペランド記述子のリストです。リストには最大 6 個のオペランド記述子を指定できます。コンパイラがレジスタとスタックの使用を正しく追跡できるように,オペランドは正しく指定してください。 表 B-1 に,オペランド記述子の一覧を示します。
アクセス・タイプ | データ型 | |||
---|---|---|---|---|
バイト | ワード | ロングワード | オクタワード | |
アドレス | AB | AW | AL | AQ |
読み込み専用 | RB | RW | RL | RQ |
変更 | MB | MW | ML | MQ |
書き込み専用 | WB | WW | WL | WQ |
デフォルトで,コンパイラは多数の Alpha PALcode 命令をビルトインとして定義しています。ビルトインの一覧は 付録 C を参照してください。コンパイラ・ビルトインが提供されていない Alpha PALcode 命令を使用する必要がある場合は, .DEFINE_PAL 指示文を使用して独自にビルトインを定義する必要があります。
#1 |
---|
.DEFINE_PAL MTPR_USP, <^X23>, RQ |
注意
これは例です---コンパイラは,MTPR 命令を直接 PAL 呼び出しにコンパイルします。
.DISABLE |
ある範囲のソース・コードに対してコンパイラの機能を無効にします。
.DISABLE argument-list
argument-list
次の表に示すシンボリック引数を 1 つ以上使用できます。
オプション 説明 DEBUG デバッガが使用するローカル・シンボル・テーブル情報をオブジェクト・ファイルに含めない。 FLAGGING コンパイラのメッセージ出力を無効にする。 GLOBAL 未定義のシンボルは外部シンボルであるという想定を無効にする。 OVERFLOW 次のオペレーション・コードに対するオーバフロー・トラップ・コードの生成を無効にする: ADD x, ADWC,INC x,ADAWI, SUB x, SBWC,DEC x,MNEG x,MUL x, CVT xy ( x は y よりも大きい。例: CVTLB), AOB xx, ACBL,SOB xx QUADWORD クォドワードのリテラル式とアドレス式のサポートを無効にする。 SUPPRESSION 参照されていないシンボルをシンボル・テーブルに登録しない。 TRACEBACK トレースバック情報をデバッガに渡さない。
.ENABLE |
ある範囲のソース・コードに対してコンパイラ機能を有効にします。
.ENABLE argument-list
argument-list
次の表に示すシンボリック引数を 1 つ以上使用できます。
オプション 説明 DEBUG 1 デバッガが使用するローカル・シンボル・テーブル情報をオブジェクト・ファイルに含める。 FLAGGING コンパイラのメッセージ出力を有効にする。 GLOBAL 未定義のシンボルは外部シンボルであると想定する。 OVERFLOW 次のオペレーション・コードに対するオーバフロー・トラップ・コードの生成を有効にする: ADD x, ADWC,INC x,ADAWI,SUB x, SBWC,DEC x,MNEG x,MUL x, CVT xy ( x は y よりも大きい。例: CVTLB),AOB xx, ACBL,SOB xx QUADWORD クォドワードのリテラル式とアドレス式をサポートする。 SUPPRESSION 参照されていないシンボルをシンボル・テーブルに登録する。 TRACEBACK 2 トレースバック情報をデバッガに渡す。
.EXCEPTION_ENTRY ( OpenVMS Alpha のみ) |
例外サービス・ルーチンのエントリ・ポイントをコンパイラに宣言します。
.EXCEPTION_ENTRY [preserve] [,stack_base]
preserve=<>
ルーチン呼び出しの前後で内容の保存と復元を行うレジスタを示すレジスタ・セットです。デフォルトでは,コンパイラはルーチンが変更するすべてのレジスタの 64 ビット全体の内容を,ルーチンの入口で保存し,ルーチンの出口で復元します。.EXCEPTION_ENTRY ルーチンの場合,例外のディスパッチにより R2 〜 R7 が PC および PSL とともにスタックに保存され,ルーチン自身が実行する REI 命令によってこれらのレジスタの値が復元されます。その他のレジスタが使用されている場合は,コンパイラが生成するコードによって保存され,ルーチンが CALL 命令または JSB 命令を実行する場合は,その他すべてのレジスタが保存されます。
stack_base
ルーチンの入口でスタック・ポインタ (SP) の値を移動するレジスタです。例外エントリ・ポイントで,例外ディスパッチ処理により,レジスタ R2 〜 R7, PC,PSL がスタックにプッシュされます。 VAX のレジスタ PSL に対応する Alpha のレジスタは,プロセッサ状態 (PS) レジスタです。 stack_base で指定したレジスタに返される値は,例外サービス・ルーチンがこれらのレジスタの値を見つけるのに役立ちます。SYS$LIBRARY:LIB.MLB のマクロ $INTSTKDEF を使用して, R2 〜 R7,PC,PSL が格納されるスタック上の領域に対するシンボルを定義することができます。シンボルは以下のとおりです。
- INTSTK$Q_R2
- INTSTK$Q_R3
- INTSTK$Q_R4
- INTSTK$Q_R5
- INTSTK$Q_R6
- INTSTK$Q_R7
- INTSTK$Q_PC
- INTSTK$Q_PS
これらのシンボルを,例外ルーチンの中で stack_base 値に対するオフセットとして使用します。 stack_base 値とともに適切なシンボル・オフセットを使用することで,例外ルーチンはこれらのレジスタの保存された内容にアクセスできます。たとえば,例外ルーチンは PSL を調べて,例外が発生したときに有効だったアクセス・モードを知ることができます。
.EXCEPTION_ENTRY 指示文は,例外サービス・ルーチンのエントリ・ポイントを示します。ルーチンの入口で, R3 にはプロシージャ記述子のアドレスが格納されている必要があります。ルーチンは REI 命令で終了する必要があります。.EXCEPTION_ENTRY 指示文を使用して,以下の割り込みサービス・ルーチンをすべて宣言する必要があります。
- インターバル・クロック
- プロセッサ間割り込み
- システムまたはプロセッサの訂正可能なエラー
- 電源障害
- システムとプロセッサのマシン・アボート
- ソフトウェア割り込み
.GLOBAL_LABEL |
ルーチンに対するエントリ・ポイントではないグローバル・ラベルを,ルーチン内で宣言します。
Label: .GLOBAL_LABEL
この指示文にはパラメータはありません。
.GLOBAL_LABEL 指示文は,ルーチン内に,ルーチンのエントリ・ポイントではないグローバル・ラベルを定義します。 .GLOBAL_LABEL で宣言しないかぎり,コード中のグローバル・ラベル ("::" で指定) は,エントリ・ポイント・ラベルであると見なされ,宣言が必要となります。宣言されていないと,エラーとして出力されます。グローバル・ラベルのアドレスは保存することができます (たとえば, PUSHAL#命令を使用します)。グローバル・ラベルまたはエントリ・ポイントとして宣言されていないラベルを保存しようとすると,コンパイラはエラーを出力します。
.GLOBAL_LABEL 指示文を使用することで保存されたコード・アドレスが CALL 命令や JSB 命令のターゲットではないことを知らせることになります。グローバル・ラベルは,ルーチンの境界内に現れる必要があります。
.GLOBAL_LABEL 指示文で宣言したラベルは, $UNWIND (Unwind Call Stack) システム・サービスの呼び出しで newpc 引数として使用できます。このシステム・サービスでは,ラベルのアドレスを保存することができるためです。
しかし,コンパイラには,スタック・ポインタをこのようなラベルの位置に自動的に調整して,スタック上で渡された引数を削除したり,スタックのアラインメントを補償するための仕組みはありません。呼び出しスタックが,呼び出し元ルーチンの代替 PC までアンワインドされても,スタックには引数とアラインメント・バイトが格納されたままとなっており,呼び出し元の,元のスタックの深さに戻すこの調整 (VAX では自動的に行われます) を期待するスタック・ベースの参照は,正しくなくなります。
$UNWIND の代替 PC ターゲットとして使用する目的で,この指示文で宣言したラベルを含むコードは,正しく動作するように,特にスタック・ポインタ・ベースの参照について慎重に調べる必要があります。
.JSB_ENTRY |
JSB ルーチンのエントリ・ポイントをコンパイラに宣言します。このエントリ・ポイント宣言によって,ルーチンで変更され,scratch または output として宣言されていないすべてのレジスタ (R0 と R1 を除く) に対して, 64 ビット全体の保存と復元が行われます。 .JSB32_ENTRY も参照してください。
.JSB_ENTRY [input] [,output] [,scratch] [,preserve]
input=<>
ルーチンが入力値を受け取るレジスタを示すレジスタ・セットです。このレジスタ・セットは,指定したレジスタに,ルーチンの入口で意味のある値が格納されており,コンパイラが最初のレジスタの使用を検出する前であっても,一時レジスタとして使用できないことをコンパイラに指示します。このレジスタ・セットにレジスタを指定すると,次の 2 つの場合にコンパイラの一時レジスタの使用に影響を与えます。
- 最適化オプション VAXREGS ( OpenVMS Alpha のみ) を使用している場合。この最適化を有効にすると, VAX MACRO コードで明示的に使用されていないすべての VAX レジスタを,コンパイラが一時レジスタとして使用できるようになります。
- Alpha または Itanium のいずれかのレジスタ (R13 以降) を,明示的に使用している場合。
上記いずれかに該当する場合は,入力として使用するレジスタを input 引数に指定しないと,コンパイラがそのレジスタを一時レジスタとして使用し,入力値が壊れるおそれがあります。
このレジスタ・セットは,コンパイラのデフォルトのレジスタ保護動作には影響を与えません。 VAXREGS 最適化スイッチを使用しない場合や, Alpha レジスタを使用しない場合は,入力マスクはルーチンの文書化のためにのみ使用されます。
output=<>
ルーチンがその呼び出し元に返す値を代入するレジスタを示すレジスタ・セットです。このレジスタ・セットに含まれるレジスタに対しては,ルーチンによって変更される場合でも,コンパイラによる保存と復元が行われません。このレジスタ・セットは,指定されたレジスタにはルーチンの出口で意味のある値が格納されており,コンパイラが最後のレジスタの使用を検出した後でも,一時レジスタとして使用できないことをコンパイラに対して通知します。このレジスタ・セットにレジスタを指定すると,以下の 2 つの場合にコンパイラの一時レジスタの使用に影響を与えます。
- 最適化オプション VAXREGS ( OpenVMS Alpha のみ) を使用している場合。この最適化を有効にすると, VAX MACRO コードで明示的に使用されていないすべての VAX レジスタを,コンパイラが一時レジスタとして使用できるようになります。
- Alpha または Itanium のいずれかのレジスタ (R13 以降) を,明示的に使用している場合。
上記いずれかに該当する場合は,出力として使用するレジスタを output 引数で指定しないと,コンパイラがそのレジスタを一時レジスタとして使用し,出力値が壊れるおそれがあります。
scratch=<>
ルーチン内で使用されているものの,ルーチンの入口と出口で保存と復元を行うべきでないレジスタを示すレジスタ・セットです。ルーチンの呼び出し元は,出力値を受け取ることを期待しておらず,レジスタが保護されることも期待していません。このレジスタ・セットに含まれるレジスタに対しては,ルーチンによって変更される場合でも,コンパイラによる保存と復元が行われません。OpenVMS Alpha システムでは,レジスタ R13 以降がルーチンのソース・コードで使用されていなければ,コンパイラはこれらのレジスタを一時レジスタとして使用します。 OpenVMS Alpha システムでは, R13 〜 R15 が変更される場合は保護する必要があるため,コンパイラはこれらのレジスタを使用する場合には保護します。
しかし,これらのレジスタが scratch レジスタ・セット宣言に指定されている場合は,コンパイラは,一時レジスタとしてそれを使用する場合に保護しません。その結果,これらのレジスタは,ルーチンのソースで使用されていなくても, scratch セットに指定されていれば,ルーチンの出口では壊れている可能性があります。 VAXREGS ( OpenVMS Alpha のみ) による最適化を使用した場合は,これはレジスタ R2 〜 R12 にも適用されます。
OpenVMS I64 システムでは,コンパイラはこれらのレジスタを一時レジスタとして使用しません。
preserve=<>
ルーチン呼び出しの前後で保護する必要があるレジスタを指示するレジスタ・セットです。これには,変更され, 64 ビットの内容全体を保存および復元する必要があるレジスタだけを含める必要があります。このレジスタ・セットを指定すると,コンパイラによってレジスタが自動的に保護されているかどうかにかかわらずレジスタは保護されます。 R0 と R1 はスクラッチ・レジスタであるため,このレジスタ・セットで指定しないかぎり,標準の定義を呼び出しただけでは,コンパイラはこれらのレジスタの保存と復元を実行しません。
このレジスタ・セットは, output レジスタ・セットと scratch レジスタ・セットより優先されます。 preserve レジスタ・セットと, output レジスタ・セットまたは scratch レジスタ・セットの両方にレジスタを指定すると,コンパイラは次の警告を報告します。
%AMAC-W-REGDECCON, register declaration conflict in routine A
注意 OpenVMS Alpha では, .JSB_ENTRY 指示文で宣言したプロシージャに対しては, MACRO コンパイラがヌル・フレーム・プロシージャ記述子を自動的に生成します。 ヌル・フレーム・プロシージャでは新しいコンテキストが設定されないため, SHOW CALLS コマンドや SHOW STACK に対する応答として,このようなプロシージャに関して,完全に正しいデバッガ情報が表示される保証がないという副作用があります。たとえば,呼び出されたヌル・プロシージャ (JSB の実行対象) 内の行番号として, JSB を発行した呼び出し元プロシージャの行番号が報告される可能性があります。 |
目次 | 索引 |
|