HP OpenVMS MACRO コンパイラポーティングおよびユーザーズ・ガイド
HP OpenVMS MACRO コンパイラ ポーティングおよびユーザーズ・ガイド
コンパイラは以下のファイルを必要とします。
- SYS$LIBRARY:STARLET.MLB
これは,コンパイラ指示文が定義されたマクロ・ライブラリです。コードをコンパイルする際,コンパイラは自動的に STARLET.MLB のコンパイラ指示文の定義を確認します。
- SYS$LIBRARY:STARLET.OLB
これは,コンパイラが使用するエミュレーション・ルーチンとその他のルーチンが格納されているオブジェクト・ライブラリです。コードをリンクすると,リンカは STARLET.OLB とリンクして未定義のシンボルを解決します。
コンパイラ修飾子については, 付録 A を参照してください。
2.12.1 リスト・ファイルの行番号 |  |
リスト・ファイル内でのマクロ展開の行番号は, Xnn/mmm となります。ここで,Xnn はネストの深さを表し, mmm は最も外側のマクロからの相対行番号です。
例 2-1 に OpenVMS I64 のリスト・ファイルを示します。 OpenVMS Alpha のリスト・ファイルのソース部分は基本的に同じです。
00000000 1 ;
00000000 2 ; This is the Itanium (previously called "IA-64") version of
00000000 3 ; ARCH_DEFS.MAR, which contains architectural definitions for
00000000 4 ; compiling VMS sources for VAX, Alpha, and I64 systems.
00000000 5 ;
00000000 6 ; Note: VAX, VAXPAGE, and IA64 should be left undefined,
00000000 7 ; a lot of code checks for whether a symbol is
00000000 8 ; defined (e.g. .IF DF VAX) vs. whether the value
00000000 9 ; is of a expected value (e.g. .IF NE VAX).
00000000 10 ;
00000000 11 ;VAX = 0
00000000 12 ;EVAX = 0
00000000 13 ;ALPHA = 0
00000001 00000000 14 IA64 = 1
00000000 15 ;
00000000 16 ;VAXPAGE = 0
00000001 00000000 17 BIGPAGE = 1
00000000 18 ;
00000020 00000000 19 ADDRESSBITS = 32
00000000 20 .TITLE ug_ex_listing /line numbering in the listing file/
00000000 21 ;
00000000 22 .MACRO test1
00000000 23 clrl r1
00000000 24 clrl r2
00000000 25 tstl 48(sp) ; generate uplevel stack error
00000000 26 clrl r3
00000000 27 .ENDM test1
00000000 28 .MACRO test2
00000000 29 clrl r4
00000000 30 clrl r5
00000000 31 test1
00000000 32 clrl r6
00000000 33 .ENDM test2
00000000 34
00000000 35 foo: .jsb_entry
00000000 56 .show expansions
00000000 57 clrl r0
00000011 58 test2
1.......
%IMAC-E-UPLEVSTK, (1) up-level stack reference in routine FOO
X01/001 00000002 clrl r4
X01/002 00000004 clrl r5
X01/003 00000006 test1
X02/004 00000006 clrl r1
X02/005 00000008 clrl r2
X02/006 0000000A tstl 48(sp) ; generate uplevel stack error
X02/007 0000000D clrl r3
X02/008 0000000F
X01/009 0000000F clrl r6
X01/010 00000011
00000011 59 rsb
00000012 60 .noshow expansions
00000012 61
00000012 62 .END
|
コンパイラはデバッガを完全にサポートしています。コンパイルされた VAX MACRO コードのデバッグ・セッションは,アセンブルされた VAX MACRO コードのデバッグと同様です。ただし,ここで説明する重要な違いがいくつかあります。デバッグの詳しい説明については, OpenVMS Debugger Manual を参照してください。
2.13.1 コードの再配置 |  |
大きな違いの 1 つは,コードがアセンブルされるのではなくコンパイルされるという点です。 OpenVMS VAX システムでは, VAX MACRO のそれぞれの命令は単一の機械語命令でした。 OpenVMS Alpha システムや OpenVMS I64 システムでは, VAX MACRO のそれぞれの命令は多数の Alpha または Itanium の機械語命令にコンパイルされます。この違いの大きな副作用は,コンパイル・コマンドで /NOOPTIMIZE を指定しなかった場合のコードの再配置と再スケジューリングです。
デフォルトでは,いくつかの最適化が行われ,生成されたコードがソースの境界を超えて移動されます ( 第 1.2 節 , 第 4.3 節 ,および 付録 A を参照)。ほとんどのコード・モジュールでは, /NOOPTIMIZE を指定してコンパイルすることでデバッグ作業が単純化されます。これを指定すると,再配置が行われなくなります。コードのデバッグを終えたら, /NOOPTIMIZE を指定せずに再コンパイルして性能を向上させることができます。
2.13.2 ルーチンの引数のシンボリック変数 |  |
コンパイルされたコードのデバッグとアセンブルされたコードのデバッグのもう 1 つの大きな違いは,VAX MACRO に対する新しい概念である,ルーチンの引数を調べるためのシンボリック変数の定義です。 OpenVMS VAX システムでは,ルーチンをデバッグしていて引数を調べたくなったら,通常,次のような操作をします。
DBG> EXAMINE @AP ; to see the argument count
DBG> EXAMINE @AP+4 ; to examine the first arg
|
または
DBG> EXAMINE @AP ; to see arg count
DBG> EXAMINE .+4:.+20 ; to see first 5 args
|
OpenVMS Alpha システムと OpenVMS I64 システムでは,引数は OpenVMS VAX システムと異なりメモリ内のベクタにありません。さらに, OpenVMS Alpha システムと OpenVMS I64 システムには AP レジスタがありません。 VAX MACRO のコンパイルされたコードをデバッグする際に EXAMINE @AP と入力すると,デバッガから AP が未定義のシンボルであると報告されます。
コンパイルされたコードでは,引数は以下の場所の組み合わせに置かれています。
- レジスタ
- ルーチンのスタック・フレームより上のスタック中
- 引数リストがホーミングされている場合 (
第 2.4 節 を参照) や,レジスタ引数を保存する必要があるルーチンを呼び出している場合は,スタック・フレーム内。
生成されたコードを参照してどこに引数があるかを探す必要はありません。代わりに,引数の正しい位置を指している $ARGn シンボルが用意されています。 $ARG0 シンボルは,VAX システムでの @AP+0 と同じで引数の個数です。 $ARG1 シンボルは最初の引数で,$ARG2 が 2 番目の引数となり,以下同様です。これらのシンボルは CALL_ENTRY 指示文と JSB_ENTRY 指示文では定義されていますが,EXCEPTION_ENTRY 指示文では定義されていません。
2.13.3 $ARGn シンボルを使用せずに引数を見つける |  |
コンパイラが $ARGn シンボルを生成しない追加の引数がコードの中にある場合があります。 .CALL_ENTRY ルーチンで定義される $ARGn シンボルの数は,コンパイラによって検出された最大数です (自動的に検出されるか,MAX_ARGS によって指定します)。 .JSB_ENTRY ルーチンでは,引数は呼び出し元のスタック・フレームにホーミングされ,コンパイラは実際の数を検出できないため,常に 8 個の $ARGn シンボルが作成されます。
ほとんどの場合,追加の引数を容易に見つけることができますが,見つけられない場合もあります。
2.13.3.1 簡単に見つけることができる追加の引数
以下の場合は追加の引数を容易に見つけることができます。
- 引数リストがホーミングされておらず, $ARGn シンボルが OpenVMS Alpha では $ARG7 以降まで, OpenVMS I64 では $ARG9 以降まで定義されている場合。引数リストがホーミングされていない場合, OpenVMS Alpha では $ARG7 以降, OpenVMS I64 では $ARG9 以降の $ARGn シンボルは,スタック上のクォドワードとして渡されたパラメータのリストを常に指します。以降の引数は,最後に定義された $ARGn シンボルに続くクォドワードの中にあります。
- 引数リストがホーミングされている場合で,コンパイラによって検出された最大数 (自動的に検出されるか, MAX_ARGS によって指定します) に等しいかそれよりも前の引数を調べたい場合。引数リストがホーミングされている場合, $ARGn シンボルは常にホーミングされた引数リストを指します。以降の引数は,最後に定義された $ARGn シンボルに続くロングワードの中にあります。
たとえば,次のようにして, JSB ルーチン (引数リストは呼び出し元でホーミングされている必要があります) の 8 個の引数を超えて引数を調べることができます。
DBG> EX $ARG8 ; highest defined $ARGn
.
.
.
DBG> EX .+4 ; next arg is in next longword
.
.
.
DBG> EX .+4 ; and so on
|
この例では,引数をホーミングするときに,呼び出し元が少なくとも 10 個の引数を検出したことが仮定されています。
引数をホーミングしていないルーチンの中で最後の $ARGn シンボルを超えて引数を見つけるには,上の例の EX .+4 を EX .+8 に置き換えます。
2.13.3.2 簡単に見つけることができない追加の引数
以下の場合は追加の引数を容易に見つけることができません。
- 引数リストがホーミングされておらず, $ARGn シンボルが OpenVMS Alpha では $ARG6, OpenVMS I64 では $ARG8 までしか定義されていない場合。この場合,存在している $ARGn シンボルは,レジスタまたはスタック・フレーム中のクォドワードのどちらかを指します。どちらの場合でも,定義されている $ARGn シンボルの後ろのクォドワードを参照しても,以降の引数を調べることはできません。
- 引数リストがホーミングされており,コンパイラが検出した数を超える引数を調べたい場合。 $ARGn シンボルは,ホーミングされた引数リストに格納されているロングワードを指します。コンパイラは検出できた数の引数だけをこのリストに移動します。ホーミングされた最後の引数の後ろのロングワードを調べると,さまざまな他のスタック・コンテキストを調べることになります。
これらの場合に追加の引数を探す唯一の方法は,コンパイルされた機械語コードを調べ,引数がある場所を確認することです。調べたい引数の最大数を MAX_ARGS に正しく指定すれば,これらの問題はどちらも解決できます。
2.13.4 OpenVMS I64 での VAX と Alpha のレジスタ名の使用 |  |
便宜上, OpenVMS I64 上の MACRO コンパイラではシンボル名 R0,R1,... R31 が定義されており, Alpha のこれらのレジスタの値が格納されている Itanium のレジスタを参照するようになっています。それでも,デバッガの名前 %R0,%R1,... %R31 を使用してマシンのネイティブな番号付けでレジスタを参照することができます。
2.13.5 パック 10 進数データを使用したコードのデバッグ |  |
パック 10 進数データを使用した,コンパイルされた VAX MACRO コードを, OpenVMS Alpha システムまたは OpenVMS I64 システムでデバッグする際には,以下の情報を念頭に置いてください。
- EXAMINE コマンドを使用して, .PACKED 指示文で宣言された場所を調べるときには,デバッガは自動的に値をパック 10 進数データ型として表示します。
- パック 10 進数データを格納することができます。構文は VAX での構文と同じです。
2.13.6 浮動小数点データを使用したコードのデバッグ |  |
浮動小数点データを使用した,コンパイルされた VAX MACRO コードを, OpenVMS Alpha システムまたは OpenVMS I64 システムでデバッグする際には,以下の情報を念頭に置いてください。
- EXAMINE/FLOAT コマンドを使用して, Alpha または Itanium の整数レジスタの浮動小数点数値を調べることができます。
OpenVMS Alpha システムと OpenVMS I64 システムでは浮動小数点演算用のレジスタ・セットがありますが,浮動小数点演算が含まれる,コンパイルされた VAX MACRO コードでは,これらのレジスタは使用されません。整数レジスタだけが使用されます。
コンパイルされた VAX MACRO コードにおける浮動小数点演算は,コンパイラの外で動作するエミュレーション・ルーチンによって実行されます。そのため,VAX MACRO 浮動小数点演算をたとえば R7 に対して実行しても,浮動小数点レジスタ 7 には影響がありません。
- EXAMINE コマンドを使用して .FLOAT 指示文またはその他の浮動小数点ストレージ指示文で宣言された場所を調べる場合は,デバッガは値を自動的に浮動小数点データとして表示します。
- EXAMINE コマンドを使用して G_FLOAT データ型を調べる場合は,デバッガは 2 つのレジスタの内容を使用して VAX データの値を構築しません。
次の例を見てください。
この例で,R4 と R5 の下位のロングワードは,VAX の場合と異なり値を構築するために使用されません。代わりに,R4 のクォドワードの内容が使用されます。
D_FLOAT の演算と G_FLOAT の演算に対してコンパイラが生成するコードは,連続する 2 つのレジスタの下位のロングワードに VAX 形式のデータを保持します。そのため,これら 2 つのレジスタのどちらかに対して EXAMINE/G_FLOAT を使用しても,正しい浮動小数点数値が得られません。また,これらどちらかのレジスタに対して DEPOSIT/G_FLOAT を実行しても,目的の結果は得られません。ただし,2 つの値の半分ずつを手動で組み合わせることはできます。たとえば,次の命令を実行したとします。
次のようなシーケンスで, R6 と R7 にある G_FLOAT 値を読み取ることができます。
DBG> EX R6
.MAIN.\%LINE 100\%R6: 0FFFFFFFF D8E640D1
DBG> EX R7
.MAIN.\%LINE 100\%R7: 00000000 2F1B24DD
DBG> DEP R0 = 2F1B24DDD8E640D1
DBG> EX/G_FLOAT R0
.MAIN.\%LINE 100\%R0: 4568.89900000000
|
- DEPOSIT コマンドを使用して, Alpha または Itanium の整数レジスタに浮動小数点データを格納することができます。構文は VAX システムでの構文と同じです。
- H_FLOAT はサポートされていません。
- OpenVMS I64 システムでは,入力パラメータは R16 〜 R21 ではなく R32 〜 R39 です。出力パラメータは,コンパイラによって選択された,より大きな番号のレジスタに格納されます。
|