日本-日本語

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

OpenVMS マニュアル


≫ 

OpenVMS
ライブラリ

タイトルページ
目次
まえがき
第 1 章:はじめに
第 2 章:ページサイズの拡大に対するアプリケーションの対応
第 3 章:共有データの整合性の維持
第 4 章:アプリケーションデータ宣言の移植性の確認
第 5 章: アプリケーション内の条件処理コードの確認
第 6 章:ネイティブイメージとトランスレートイメージの相互操作性の確認
付録 A :OpenVMS AXPコンパイラ
索引
PDF
OpenVMS ホーム
OpenVMS AXP オペレーティング・システム | HPE 日本

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システムではソフトウェアによって生成される可能性があります。



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システムで実行するために変更しなければならないかどうかを判断する場合には,次のガイドラインに従ってください。

  • アプリケーション内の条件処理ルーチンが,発生した算術演算例外の数だけを数える場合や,算術演算例外が発生したときに強制終了する場合には,AXPシステムで例外が非同期的に報告されることは問題になりません。これらの条件処理ルーチンは,SS$_HPARITH条件コードのテストを追加するだけで十分です。

  • アプリケーションで例外の原因となった操作を再起動しようとする場合には,コードを変更するか,またはコンパイラ修飾子を使用することにより,算術演算例外が正確に報告されるようにしなければなりません(これらのコンパイラ修飾子についての詳しい説明は 付録 A を参照してください)。しかし,これらの命令を指定すると,性能が低下する可能性があります。

  • トランスレートされたイメージで算術演算例外が正確に報告されることを保証するには,イメージをトランスレートするときにVESTコマンド・ラインに /PRESERVE=FLOAT_EXCEPTIONS修飾子を指定します。この修飾子を使用した場合には,VESTユーティリティは,浮動小数点フォルトの原因となる各命令を実行した後,例外を報告できるようなコードを生成します。しかし,この修飾子を使用すると,トランスレートされたイメージの性能が低下する可能性があります。VESTコマンドの使い方についての詳しい説明は,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください。

    注意

    AXPシステムで実行されるトランスレートされたVAXイメージは,算術演算例外条件も含めて,VAX例外条件を戻します。



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 --シグナルを使用して実行を停止する サポートされる

対処方法

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

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

    • 無効な浮動小数点演算

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

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

    省略時の設定により通知されないように設定されている例外は,コンパイル時に通知されるように設定しなければなりません。

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

たとえば,例 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 


目次 索引

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