日本-日本語

製品  >  ソフトウェア  >  OpenVMS  >  マニュアル

OpenVMS マニュアル


≫ 

OpenVMS
ライブラリ

タイトルページ
目次
まえがき
第 1 章:移行プロセスの概要
第 2 章:移行方法の選択
第 3 章:アプリケーションの移行
第 4 章:再コンパイルと再リンクの概要
第 5 章:ページサイズの拡大に対するアプリケーションの対応
第 6 章:共用データの整合性の維持
第 7 章:アプリケーションデータ宣言の移植性の確認
第 8 章:アプリケーション内の条件処理コードの確認
第 9 章:OpenVMS I64コンパイラ
付録 A :アプリケーション評価チェックリスト
用語集
索引
PDF
OpenVMS ホーム

OpenVMS
OpenVMS VAX から OpenVMS I64 への
アプリケーションの移行


目次 索引



OpenVMS I64 では,OpenVMS VAX とほぼ同じ浮動小数点条件コードを使用しますが,新しい条件コードもいくつか使用します。また,VAX ではハードウェアで条件が通知されていた場合でも,いくつかの条件はライブラリ・ソフトウェアで通知されます。さらに,同じ状況でもアーキテクチャによって例外が異なる場合があります。

Intel Itanium アーキテクチャの算術演算例外は,VAX と同様に厳密です。つまり,例外 PC は,失敗した命令を正確に示します (これに対し, Alpha アーキテクチャでは,浮動小数点例外は非同期に検出され,厳密ではありません)。しかし,I64 の命令形式により,例外 PC は単なる失敗した命令のアドレスではありません。 I64 の命令は,それぞれ 3 つの命令がまとめられた 16 バイトのバンドルで構成されます。例外 PC は,命令バンドルのアドレスを指し,下位 2 ビットで命令スロット番号を表します。

命令アドレッシングと命令形式の違いにより,例外の原因となった命令を解釈する条件ハンドラコードを書き換える必要があります。

対処方法

算術演算例外に応答して処理を実行する条件処理ルーチンを I64 システムで実行するために変更しなければならないかどうかを判断する場合には,次のガイドラインに従ってください。

  • アプリケーション内の条件処理ルーチンが,発生した算術演算例外の数だけを数える場合や,算術演算例外が発生したときに強制終了する場合には,最低限の修正だけで I64 システムで正しく動作するようになります。これらの条件処理ルーチンでは, I64 で追加された条件コードのテストを追加するだけで十分です。

  • アプリケーションで例外の原因となった演算を再実行しようとする場合には,条件ハンドラ中の,失敗した命令を見つけて解釈する部分のコードを書き直す必要があります。

    注意

    I64 システムで実行されるトランスレートされた VAX イメージは,算術演算例外条件も含めて,VAX 例外条件を返します。 VEST コマンドの利用についての詳細は,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください。



8.4.2 データ・アラインメント・トラップのテスト

I64 システムでは,自然なアラインメントになっていないアドレスを使用して,レジスタとの間でロングワードまたはクォドワードをロード/ストアしようとする操作を実行すると,データ・アラインメント・トラップが発生します (データ・アラインメントについての詳細は, 第 7 章 を参照してください)。

I64 システムのコンパイラは通常,次の操作を実行することにより,アラインメント・フォルトの発生を防止します。

  • デフォルトで,静的データを自然な境界にアラインします (このデフォルトの動作は,コンパイラ修飾子を使用することにより変更できます)。

  • コンパイル時に正しくアラインされていないことがわかっているデータに対して,特殊なインライン・コード・シーケンスを生成します。

しかし,動的に定義されるデータをコンパイラがアラインすることはできません。したがって,このような場合はアラインメント・フォルトが発生する可能性があります。

アラインメント例外は条件コード SS$_ALIGN によって示されます。 図 8-4 は,SS$_ALIGN 例外によって返されるシグナル・アレイの要素を示しています。

図 8-4 SS$_ALIGN 例外のシグナル・アレイ


このシグナル・アレイには,SS$_ALIGN 例外固有の 2 つの引数が格納されます。それは仮想アドレスレジスタ番号です。仮想アドレスには,アクセスしているアラインされていないデータのアドレスが格納されます。 レジスタ番号は操作の対象となるレジスタを示します。

対処方法

  • アプリケーションの開発中にアラインメント・フォルトを検出するには,この例外条件を使用します。このようにすれば,アプリケーションの性能に影響するデータ・アラインメントの問題をこの段階で修正することができます。この例外が報告されているということは,アプリケーションはデータ・アラインメントの問題によって性能に影響を受けているということになります。



8.5 条件処理に関連する他の作業の実行

いままでに述べてきた条件処理ルーチンの問題に加えて,条件処理を含むアプリケーションは,システムに対して条件処理ルーチンを設定するなどの処理を実行しなければなりません。ランタイム・ライブラリには,アプリケーションでこれらの処理を実行するためのルーチンが用意されています。たとえば,アプリケーションでランタイム・ライブラリ・ルーチン LIB$ESTABLISH を呼び出すことにより,例外が発生したときに実行する条件処理ルーチンを識別 (または設定) することができます。

VAX アーキテクチャと Intel Itanium アーキテクチャには相違点があり,両方のアーキテクチャの呼び出し規則にも違いがあるため,これらの多くの処理の実現方法は同じではありません。 表 8-2 は,VAX システムで提供されるランタイム・ライブラリ条件処理サポート・ルーチンと, I64 システムではどのルーチンがサポートされるかを示しています。

表 8-2 ランタイム・ライブラリ条件処理サポート・ルーチン
ルーチン I64 システムでのサポート
算術演算例外サポート・ルーチン
LIB$DEC_OVER--10 進オーバフローの通知を許可または禁止する サポートされない
LIB$FIXUP_FLT--予備の浮動小数点オペランドを指定された値に変更する サポートされない
LIB$FLT_UNDER--浮動小数点アンダフローの通知を許可または禁止する サポートされない
LIB$INT_OVER--整数オーバフローの通知を許可または禁止する サポートされない
一般的な条件処理サポート・ルーチン
LIB$DECODE_FAULT--フォルトに対して命令コンテキストを解析する サポートされない
LIB$ESTABLISH--条件ハンドラを設定する RTL ではサポートされないが,互換性を維持するためにコンパイラによってサポートされる
LIB$MATCH_COND--条件値を照合する サポートされる
LIB$REVERT--条件ハンドラを削除する RTL ではサポートされないが,互換性を維持するためにコンパイラによってサポートされる
LIB$SIG_TO_STOP--通知された条件を継続できない条件値に変換する サポートされる
LIB$SIG_TO_RET--シグナルをリターン・ステータスに変換する サポートされる
LIB$SIM_TRAP--浮動小数点トラップをシミュレートする サポートされない
LIB$SIGNAL--例外条件を通知する サポートされる
LIB$STOP--シグナルを使用して実行を停止する サポートされる

対処方法

次のリストは,ランタイム・ライブラリ・ルーチンを使用するアプリケーションにおけるガイドラインを示しています。

  • アプリケーションで例外報告を可能にするランタイム・ライブラリ・ルーチンのいずれかを呼び出すことにより,例外の通知を許可している場合には,ソース・コードを変更しなければなりません。これらのルーチンは I64 システムではサポートされません。しかし,特定のタイプの算術演算例外は I64 システムで常に通知されるように設定されています。次のタイプの算術演算例外は常に通知されます。

    • 無効な浮動小数点演算

    • ゼロによる浮動小数点除算

    • 浮動小数点オーバフロー


    デフォルトで通知されないように設定されている例外は,コンパイル時に通知されるように設定しなければなりません。

  • アプリケーションで,ランタイム・ライブラリ・ルーチン LIB$ESTABLISH を呼び出すことにより条件処理ルーチンを指定している場合には,ソース・コードを変更する必要はありません。 I64 システムの大部分のコンパイラは,互換性を維持するために, LIB$ESTABLISH ルーチンへの呼び出しを受け付けます。コンパイラは「現在の」条件ハンドラを指す変数を,スタック上に作成します。 LIB$ESTABLISH はこの変数を設定し,LIB$REVERT はこの変数を消去します。これらの言語に対して静的に設定されたハンドラは,この変数の値を読み取り,どのルーチンを呼び出すかを判断します。特定の言語での詳細は, 第 9 章 を参照してください。

たとえば, 例 8-2 に示した Fortran プログラムは, RTL ルーチン LIB$ESTABLISH を使用して,条件コード SS$_INTOVF を指定することで整数オーバフローをテストする条件処理ルーチンを指定しています。 VAX システムでは,整数オーバフローの検出を可能にするために,プログラムをコンパイルする際に /CHECK=OVERFLOW 修飾子を指定しなければなりません。

このプログラムを I64 システムで実行するには,VAX システムの場合と同様に,オーバフロー検出を可能にするためにコンパイル・コマンド行に /CHECK=OVERFLOW 修飾子を指定なければなりません。 HPE Fortran は LIB$ESTABLISH ルーチンを組み込み関数として受け付けるため,このルーチンの呼び出しを変更する必要はありません。

例 8-2 条件処理プログラムの例

 
C       This program types a maximum value of integers 
C       Compile with /CHECK=OVERFLOW and the /EXTEND_SOURCE qualifiers 
 
        INTEGER*4 int4 
        EXTERNAL HANDLER 
        CALL LIB$ESTABLISH (HANDLER)  (1)
 
        int4=2147483645 
        WRITE (6,*) ' Beginning DO LOOP, adding 1 to ', int4 
        DO I=1,10 
          int4=int4+1 
          WRITE (6,*) ' INT*4 NUMBER IS  ', int4 
        END DO 
        WRITE (6,*) ' The end ...' 
        END 
 
C       This is the condition-handling routine 
 
        INTEGER*4 FUNCTION HANDLER (SIGARGS, MECHARGS) 
        INTEGER*4 SIGARGS(*),MECHARGS(*) 
        INCLUDE '($FORDEF)' 
        INCLUDE '($SSDEF)' 
        INTEGER INDEX 
        INTEGER LIB$MATCH_COND 
   
        INDEX = LIB$MATCH_COND (SIGARGS(2), SS$_INTOVF) 
        IF (INDEX .EQ. 0 ) THEN 
           HANDLER = SS$_RESIGNAL 
        ELSE IF (INDEX .GT. 0) THEN 
           WRITE (6,*) 'Arithmetic exception detected...' 
           CALL LIB$STOP(SIGARGS(1)) 
        END IF 
        END 

次のリストの各項目は 例 8-2 に示されている番号に対応しています。

  1. この例では,条件処理ルーチンを指定するために LIB$ESTABLISH を呼び出します。

次の例は, 例 8-2 に示したプログラムをコンパイル,リンク,および実行する方法を示しています。


$ FORTRAN/EXTEND_SOURCE/CHECK=OVERFLOW  EXCEPTIION
$ LINK  EXCEPTION
$ RUN EXCEPTION
 Beginning DO LOOP, adding 1 to 2147483645 
 INT*4 NUMBER IS    2147483646 
 INT*4 NUMBER IS    2147483647 
Arithmetic exception detected... 
%TRACE-F-TRACEBACK, symbolic stack dump follows 
image     module    routine               line      rel PC           abs PC 
exception  exception$MAIN  HANDLER        2662 0000000000000440 0000000000010440 
DEC$FORRTL                                   0 00000000000DAC00 FFFFFFFF85440C00 
                                             0 FFFFFFFF8039FE70 FFFFFFFF8039FE70 
image     module    routine               line      rel PC           abs PC 
exception  exception$MAIN  EXCEPTION$MAIN 
                                            10 00000000000001C0 00000000000101C0 
                                             0 FFFFFFFF80B356B0 FFFFFFFF80B356B0 
DCL                                          0 000000000006AE90 000000007AE26E90 
%TRACE-I-END, end of TRACE stack dump 


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項