OpenVMS AXP
オペレーティング・システム
OpenVMS AXP オペレーティング・システムへの移行:
再コンパイルと再リンク


前へ 次へ 目次 索引


5.3 例外条件の識別

アプリケーションの条件処理ルーチンは,シグナル・アレイに戻された条件コードを確認することにより,どの例外が通知されているかを識別します。次のプログラムの一文は 例 5-1 から抜粋したものであり,条件処理ルーチンがランタイム・ライブラリ・ルーチンLIB$MATCH_CONDを使用することにより,この作業をどのような方法で実現できるかを示しています。


status = LIB$MATCH_COND(sigs->chf$l_sig_name,  /* returned code */ 
                                  SS$_INTOVF);  /* test against  */ 

このメカニズムはAXPシステムでも変更されていません。32ビットの条件コードの形式とシグナル・アレイ内での位置は,VAXシステムの場合と同じです。しかし,条件処理ルーチンがVAXシステムで受け取っていた条件コードはAXPシステムでは意味がないでしょう。アーキテクチャが異なるため,VAXシステムで戻されていた一部の例外条件は,AXPシステムではサポートされません。

ソフトウェア例外の場合には,AXPシステムはVAXシステムの場合と同じ例外をサポートします。このことについては,オンライン・ヘルプ・メッセージ・ユーティリティまたは『OpenVMS system messages documentation』に示されています。しかし,ハードウェア例外はソフトウェア例外よりアーキテクチャに依存する部分が多く,特に算術演算例外はアーキテクチャに依存しています。VAXシステムでサポートされていたハードウェア例外の一部(『OpenVMS Programming Concepts Manual』を参照)だけがAXPシステムでもサポートされます。さらに,Alpha AXPアーキテクチャでは,VAXアーキテクチャでサポートされないいくつかの追加された例外を定義しています。

表 5-3 は,AXPシステムでサポートされないVAXハードウェア例外と,VAXシステムでサポートされないAXPハードウェア例外を示しています。アプリケーションの例外処理ルーチンがこれらのVAX固有の例外をテストする場合には,対応するAXP例外をテストするためのコードを追加する必要があります(AXPシステムでの算術演算例外のテストについての詳しい説明は,第 5.3.1 項 を参照してください)。

注意

AXPシステムで実行されるトランスレートされたVAXイメージは,これらのVAX例外を戻すことができます。

表 5-3 アーキテクチャ固有のハードウェア例外
例外条件コード コメント
AXPシステム固有の例外
SS$_HPARITH --高性能算術演算例外 VAX算術演算例外はこの例外に変更された(第 5.3.1 項 を参照)。
SS$_ALIGN --データ・アラインメント・トラップ VAXシステムには対応する例外はない
VAXシステム固有の例外
SS$_ARTRES --予備の算術演算トラップ AXPシステムには対応する例外はない
SS$_COMPAT --互換性フォルト AXPシステムには対応する例外はない
1SS$_DECOVF --10進オーバーフロー SS$_HPARITHに変更された(第 5.3.1 項 を参照)
1SS$_FLTDIV --0による浮動小数点除算(トラップ) SS$_HPARITHに変更された(第 5.3.1 項 を参照)
SS$_FLTDIV_F --0による浮動小数点除算(フォルト) SS$_HPARITHに変更された(第 5.3.1 項 を参照)
1SS$_FLTOVF --浮動小数点オーバーフロー(トラップ) SS$_HPARITHに変更された(第 5.3.1 項 を参照)
SS$_FLTOVF_F --浮動小数点オーバーフロー(フォルト) SS$_HPARITHに変更された(第 5.3.1 項 を参照)
1SS$_FLTUND --浮動小数点アンダーフロー(トラップ) SS$_HPARITHに変更された(第 5.3.1 項 を参照)
SS$_FLTUND_F --浮動小数点アンダーフロー(フォルト) SS$_HPARITHに変更された(第 5.3.1 項 を参照)
1SS$_INTDIV --0による整数除算 SS$_HPARITHに変更された(第 5.3.1 項 を参照)
1SS$_INTOVF --整数オーバーフロー SS$_HPARITHに変更された(第 5.3.1 項 を参照)
SS$_TBIT --トレース・ペンディング AXPシステムには対応する例外はない
SS$_OPCCUS --ユーザ用に確保されているオペコード AXPシステムには対応する例外はない
SS$_RADMOD --予備のアドレッシング・モード AXPシステムには対応する例外はない
SS$_SUBRNG --INDEX添字範囲チェック AXPシステムには対応する例外はない


1AXPシステムではソフトウェアによって生成される可能性があります。

5.3.1 AXPシステムでの算術演算例外のテスト

VAXシステムでは,アーキテクチャは算術演算例外が同期的に報告されるようにします。つまり,例外(オーバーフローなど)の原因となったVAX算術演算命令は,ただちに例外処理ハンドラを開始し,後続の命令は実行されません。例外ハンドラに報告されるプログラム・カウンタ(PC)は,例外の原因となった算術演算命令のPCです。このため,アプリケーション・プログラムは,たとえば,メイン・シーケンスを再開し,例外の原因となった操作を同等の操作または別の操作によってエミュレートするか,置換することができます。

AXPシステムでは,算術演算例外は非同期的に報告されます。つまり,アーキテクチャの実現方法により,例外の原因となった命令より後の多くの命令(分岐やジャンプも含む)を実行できます。これらの命令は,例外の原因となった命令が使用していたオペランドの上に重ね書きする可能性があるため,例外を解釈したり,修正するのに必要な情報が失われてしまいます。例外ハンドラに報告されるPCは,例外の原因となった命令のPCではなく,その後に実行された命令のPCです。例外がアプリケーションの例外ハンドラに報告される時点では,ハンドラは入力データを修正しており,命令を再起動することができない可能性があります。

このように,算術演算例外の報告方法が基本的に異なるため,AXPシステムでは,SS$_HPARITHという1つの条件コードを定義し,これによってすべての算術演算例外を示します。たとえば,整数オーバーフロー例外が発生したときに処理を実行する条件処理ルーチンがアプリケーションに含まれている場合,VAXシステムでは,SS$_INTOVR条件コードが例外処理ルーチンに渡されます。AXPシステムでは,この例外はSS$_HPARITHという条件コードによって示されます。このため,アプリケーションの条件処理ルーチンは,AXP算術演算例外を対応するVAX例外と誤って解釈することがありません。処理を行うアプリケーションが,アーキテクチャ固有である可能性があるため,このことは重要です。

図 5-3 はSS$_HPARITH例外シグナル・アレイの形式を示しています。

図 5-3 SS$_HPARITH例外シグナル・アレイ


このシグナル・アレイには,SS$_HPARITH例外の固有の3つの引数が格納されます。それは 整数レジスタ・ライト・マスク(integer register write mask)浮動小数点レジスタ・ライト・マスク(floating register write mask),および例外サマリです。整数および浮動小数点レジスタ・ライト・マスクは,例外サマリのビットをセットした命令のターゲットであったレジスタを示します。マスク内の各ビットはレジスタを表現します。例外サマリは最初の7ビットにフラグをセットすることにより,通知される例外のタイプ(1つ以上)を示します。表 5-4 はこれらの各ビットがセットされているときの意味を示しています。

表 5-4 例外サマリ引数のフィールド
ビット 意味
0 ソフトウェアは正常終了した。
1 浮動小数点演算,変換,または比較操作に誤りがある。
2 浮動小数点除算で0による除算を実行しようとした。0による整数除算は報告されないので注意しなければならない。
3 浮動小数点演算または変換操作で宛先の指数部がオーバーフローした。
4 浮動小数点演算または変換操作で宛先の指数部がアンダーフローした。
5 浮動小数点演算または変換操作で正確な算術演算結果と異なる結果が報告された。
6 浮動小数点数値から整数への変換操作または整数算術演算で宛先の精度がオーバーフローした。

対処方法

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

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

AXPシステムでは,アラインされていないアドレスをオペランドとして受け付ける Alpha AXP命令(LDQ_U)を使わずに,自然なアラインメントになっていないアドレスを使用して,レジスタとの間でロングワードまたはクォドワードをロード/ストアしようとする操作を実行すると,データ・アラインメント・トラップが発生します(データ・アラインメントについての詳しい説明は,第 4 章 を参照してください)。

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

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

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

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


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

対処方法

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

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

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

表 5-5 ランタイム・ライブラリ条件処理サポート・ルーチン
ルーチン AXPシステムで使用できるかどうか
算術演算例外サポート・ルーチン
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 --シグナルを使用して実行を停止する サポートされる

対処方法

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

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

このプログラムをAXPシステムで実行するには,条件コードを SS$_INTOVFからSS$_HPARITHに変更しなければなりません(オーバーフローのタイプはシグナル・アレイ内の例外サマリ引数を調べることにより判断できます。詳しくはコンパイラに関する解説書を参照してください)。VAXシステムの場合と同様に,オーバーフロー検出を可能にするためにはコンパイル・コマンド・ラインに /CHECK=OVERFLOW修飾子を指定なければなりません。DEC Fortran はLIB$ESTABLISHルーチンを組み込み関数として受け付けるため,このルーチンの呼び出しを削除する必要はありません。

例 5-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)(2)
        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 

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

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

  2. AXPシステムでは,条件コードをSS$_INTOVFからSS$_HPARITHに変更しなければなりません。条件処理ルーチンはLIB$STOPルーチンを呼び出すことにより,プログラムの実行を終了します。

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


$ FORTRAN/EXTEND_SOURCE/CHECK=OVERFLOW  HANDLER_EX.FOR
$ LINK  HANDLER_EX
$ RUN   HANDLER_EX 
 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 Name   Module Name     Routine Name    Line Number  rel PC      abs PC 
 INT_OVR_HAND INT_OVR_HANDLER HANDLER                1637 00000238    00020238 
 DEC$FORRTL                                             0 000651E4    001991E4 
 -- --- above condition handler called with exception 00000504: 
%SYSTEM-F-HPARITH, high performance arithmetic trap, Imask=00000001, Fmask=00000 
 
000, summary=40, PC=000200E0, PS=0000001B 
-SYSTEM-F-INTOVF, arithmetic trap, integer overflow at PC=000200E0, PS=0000001B 
 -- --- end of exception message 
                                                        0 84FE9FFC    84FE9FFC 
 INT_OVR_HAND INT_OVR_HANDLER INT_OVR_HANDLER          15 000000E0    000200E0 
                                                        0 84EFD918    84EFD918 
                                                        0 7FF23EE0    7FF23EE0 


前へ 次へ 目次 索引