日本-日本語

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

OpenVMS マニュアル


≫ 

OpenVMS V8.3
ライブラリ

タイトルページ
目次
まえがき
第 1 章:移行プロセスの概要
第 2 章:移行方法の選択
第 3 章:アプリケーションの移行
第 4 章:再コンパイルと再リンクの概要
第 5 章:ページ・サイズの拡大に対するアプリケーションの対応
第 6 章:共有データの整合性の維持
第 7 章:アプリケーション・データ宣言の移植性の確認
第 8 章:アプリケーション内の条件処理コードの確認
第 9 章:アプリケーションのトランスレート
第 10 章: ネイティブなイメージとトランスレートされたイメージの間の相互操作性の確認
第 11 章:OpenVMS Alpha コンパイラ
付録 A :アプリケーション評価チェックリスト
用語集
索引
PDF
OpenVMS ホーム
OpenVMS Alpha オペレーティング・システム | HPE 日本

OpenVMS Alpha
オペレーティング・システム
OpenVMS VAX から OpenVMS Alpha へのアプリケーションの移行


目次 索引

第 8 章
アプリケーション内の条件処理コードの確認

この章では,アプリケーション内の条件処理コードに対して,VAXアーキテクチャと Alphaアーキテクチャの違いがどのような影響を与えるかについて説明します。

8.1 概要

ほとんどの場合,アプリケーションの条件処理コードはAlphaシステムでも正しく機能します。特に,FORTRANのENDやERR,IOSTAT指定子など,アプリケーション開発において,高級言語で提供される条件処理機能を使用している場合には,問題はありません。これらの言語機能はアーキテクチャ固有の条件処理機能からアプリケーションを分離します。

しかし,Alpha条件処理機能とそれに対応するVAX条件処理機能の間にはいくつかの違いがあり,場合によってはソース・コードを変更しなければなりません。次の場合には,ソース・コードの変更が必要です。

  • メカニズム・アレイの形式を変更する場合

  • システムから戻された条件コードを変更する場合

  • アプリケーション内の条件処理に関連する他の作業を実現する方法を変更する場合。たとえば,例外通知を許可し,実行時に条件処理ルーチンを動的に指定する場合など

この後の節では,これらの変更について詳しく説明し,ソース・コードの変更が必要かどうかを判断するのに役立つガイドラインも示します。

8.2 動的条件ハンドラの設定

OpenVMS Alpha の実行時ライブラリ (RTL) には LIB$ESTABLISH ルーチンがありませんが,OpenVMS VAX の RTL にはこのルーチンがあります。OpenVMS Alpha の呼び出し規則により,条件ハンドラの設定はコンパイラによって行われます。

条件ハンドラを動的に設定しなければならないプログラムのために,一部の Alpha 言語では,LIB$ESTABLISH の呼び出しが特別な方法で取り扱われ,実際に RTL ルーチンを呼び出さずに適切なコードを生成します。次の言語は,対応する VAX 言語と互換性のある方法で LIB$ESTABLISH をサポートします。

  • DEC C と DEC C++
    OpenVMS Alpha システム用の DEC C と DEC C++ は,LIB$ESTABLISH を組み込み関数として取り扱いますが,OpenVMS VAX または OpenVMS Alpha システムで LIB$ESTABLISH を使用することは望ましくありません。C および C++ のプログラマは,LIB$ESTABLISH の代わりに VAXC$ESTABLISH を呼び出すようにしてください (VAXC$ESTABLISH は,OpenVMS Alpha システム用の DEC C と DEC C++ で提供される組み込み関数です)。

  • Digital Fortran
    Digital Fortran では,LIB$ESTABLISH および LIB$REVERT 内部関数に対する宣言が可能であり,これらを Digital Fortran RTL 固有のエントリ・ポイントに変換します。

  • DEC Pascal
    DEC Pascal では,ESTABLISH と REVERT という組み込みルーチンが提供され,LIB$ESTABLISH および LIB$REVERT の代わりに使用できます。 LIB$ESTABLISH を宣言して使用しようとすると,コンパイル時に警告が出されます。

  • MACRO--32
    MACRO--32 コンパイラは,LIB$ESTABLISH の呼び出しがソース・コードに指定されている場合,これを呼び出そうとします。
    MACRO--32 プログラムが 0(FP) のルーチン・アドレスを格納することにより,動的ハンドラを設定する場合には,これらのプログラムは, OpenVMS Alpha システムでコンパイルした場合も正しく動作します。しかし, CALL_ENTRY ルーチンの内部からでなければ,JSB (Jump to Subroutine) ルーチンの内部から条件ハンドラ・アドレスを設定することはできません。



8.3 依存している条件処理ルーチンの確認

ユーザ作成条件処理ルーチンの呼び出しシーケンスは,Alphaシステムでも VAXシステムのときと同じです。条件処理ルーチンは,例外条件を通知するときにシステムが戻すデータをアクセスするために2つの引数を宣言します。システムはシグナル・アレイとメカニズム・アレイという2つの配列を使用して,どの例外条件がシグナルを起動したかを識別する情報を伝達し,例外が発生したときのプロセッサの状態を報告します。

シグナル・アレイとメカニズム・アレイの形式はシステムで定義され,『HP OpenVMS Programming Concepts Manual』に説明されています。 Alphaシステムでは,シグナル・アレイに戻されるデータとその形式は VAXシステムの場合と同じです。 図 8-1 を参照してください。

図 8-1 VAXシステムとAlphaシステム上の32ビット・シグナル・アレイ


次の表はシグナル・アレイ内の各引数を示しています。

引数 説明
引数の数 AlphaシステムでもVAXシステムでも,この引数には正の整数が格納され,配列内でこの後に続くロングワードの数を示す。
状態コード AlphaシステムでもVAXシステムでも,この引数は32ビットのコードであり,ハードウェアまたはソフトウェア例外条件を一意に識別する。条件コードの形式は Alphaシステムでも変更されておらず,『OpenVMS Programming Interfaces: Calling a System Routine』に説明されているとおりである。しかし,AlphaシステムはVAXシステムで戻されるすべての条件コードをサポートするわけではなく,さらにVAXシステムでは戻されない条件コードを定義している。 Alphaシステムで戻すことができないVAX条件コードについては 第 8.4 節 を参照。
オプション・メッセージ・シーケンス これらの引数は戻される例外に関する追加情報を提供し,これは各例外に応じて異なる。VAX例外に対するこれらの引数については,『HP OpenVMS Programming Concepts Manual』を参照。
プログラム・カウンタ (PC) 例外がトラップである場合には,例外が発生したときに次に実行される命令のアドレス。例外がフォルトの場合には,例外の原因となった命令のアドレス。 Alphaシステムでは,この引数には PCの下位32ビットが格納される (Alphaシステムでは,PCは64ビットの長さである)。
プロセッサ・ステータス・ロングワード (PSL) フォーマッティングした32ビットの引数であり,例外が発生したときのプロセッサの状態を記述する。Alphaシステムでは,この引数にはAlphaの64ビットのプロセッサ・ステータス(PS)・クォドワードの下位32ビットが格納される。

Alphaシステムでは,メカニズム・アレイにはVAXの場合と同様のデータが戻されます。しかし,その形式は異なります。Alphaシステムで戻されるメカニズム・アレイには,浮動小数点スクラッチ・レジスタだけでなく,整数スクラッチ・レジスタの内容も保存されます。さらに,Alphaのレジスタは64ビットの長さであるため,メカニズム・アレイは,VAXシステムのようにロングワード(32ビット)ではなく,クォドワード(64ビット)で構成されます。 図 8-2 は VAXシステムとAlphaシステムでのメカニズム・アレイの形式を比較しています。

図 8-2 VAXシステムと Alphaシステムでのメカニズム・アレイ


次の表はメカニズム・アレイ内の各引数を示しています。

引数 説明
引数の数 VAXシステムでは,この引数には正の整数が格納され,配列内でその後に続くロングワードの数を示す。Alphaシステムでは,この引数はメカニズム・アレイ内のクォドワードの数を示し,引数カウント・クォドワードの数 (Alphaシステムでは常に43)を示すわけではない。
フラグ Alphaシステムでは,この引数には追加情報を伝達するためのさまざまなフラグが格納される。たとえば,ビット0がセットされている場合には,プロセスがすでに浮動小数点演算を実行し,配列内の浮動小数点レジスタが正しいことを示す (VAXシステムのメカニズム・アレイにはこれに対応する引数はない)。
フレーム・ポインタ (FP) VAXシステムでもAlphaシステムでも,この引数には条件ハンドラを設定したスタックの呼び出しフレームのアドレスが格納される。
深さ VAXシステムでもAlphaシステムでも,この引数には,例外を発生させたフレームを基準にして,条件処理ルーチンを設定したプロシージャのフレーム番号を表現する整数が格納される。
リザーブ 予約されている。
ハンドラ・データ・アドレス Alphaシステムでは,この引数には,ハンドラが存在する場合はハンドラ・データ・クォドワードのアドレスが格納される (VAXシステムのメカニズム・アレイにはこれに対応する引数はない)。
例外スタック・フレーム・アドレス Alphaシステムでは,この引数には例外スタック・フレームのアドレスが格納される (VAXシステムのメカニズム・アレイにはこれに対応する引数はない)。
シグナル・アレイのアドレス Alphaシステムでは,この引数にはシグナル・アレイのアドレスが格納される (VAXシステムのメカニズム・アレイにはこれに対応する引数はない)。
レジスタ VAXシステムでもAlphaシステムでも,メカニズム・アレイにはスクラッチ・レジスタの内容が格納される。Alphaシステムでは,この引数にはるかに大きなレジスタ・セットが格納され,対応する浮動小数点レジスタも格納される。

対処方法

32ビット・シグナル・アレイはAlphaシステムとVAXシステムとで同じであるため,条件処理ルーチンのソース・コードを変更する必要はないでしょう。しかし,メカニズム・アレイは変更されているため,ソース・コードを変更しなければならないかもしれません。特に,次のことを確認してください。

  • 条件処理ルーチンのソース・コードを調べ,メカニズム・アレイ内の配列要素のサイズや配列要素の順序に関して何らかの仮定を設定していないかどうかを確認してください。

  • アプリケーションの条件処理ルーチンで特定の数のスタック・フレームを巻き戻すために depth 引数を使用している場合には,ソース・コードを変更しなければならない可能性があります。アーキテクチャが変更されたため,Alphaシステムで戻される depth 引数はVAXシステムで戻される引数と異なる可能性があります(メカニズム・アレイのdepth引数は,例外が発生したフレームを基準にして,ハンドラを設定したプロシージャとの間のフレームの数を示します)。
    SYS$UNWINDシステム・サービスに対してdepth引数のアドレスを指定することにより,例外処理ハンドラを設定したフレームまで巻き戻すアプリケーションや, SYS$UNWINDシステム・サービスの省略時のdepth引数を使用することにより,例外処理ハンドラを設定したフレームの呼び出し側まで巻き戻すアプリケーションは,今後も正しく動作します。depthを負の値として指定した場合には,例外ベクタを示します(VAXシステムの場合と同じ)。

例 8-1 はCで作成した条件処理ルーチンを示しています。

例 8-1 条件処理ルーチン

#include  <ssdef.h> 
#include  <chfdef.h> 
   .
   .
   .
(1) int cond_handler( sigs, mechs ) 
   struct  chf$signal_array  *sigs; 
   struct  chf$mech_array   *mechs; 
{ 
     int status; 
 
(2)   status = LIB$MATCH_COND(sigs->chf$l_sig_name, /* returned code */ 
                             SS$_INTOVF);          /* test against  */ 
 
(3)   if(status != 0) 
     { 
         /*  ...Condition matched.  Perform processing.  */ 
         return SS$_CONTINUE; 
     } 
     else 
     { 
         /*  ...Condition does not match. Resignal exception. */ 
         return SS$_RESIGNAL; 
     } 
} 

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

  1. このルーチンは,システムがシグナル・アレイとメカニズム・アレイに戻すデータをアクセスするために,sigsmechsという2つの引数を定義します。このルーチンは前もって定義されている2つのデータ構造を使用して,引数を宣言します。2つのデータ構造とはchf$signal_arrayとchf$mech_arrayであり,システムによってCHFDEF.Hヘッダ・ファイルに定義されています。

  2. この条件処理ルーチンはLIB$MATCH_CONDランタイム・ライブラリ・ルーチンを使用することにより,戻された条件コードと,整数オーバーフローを識別する条件コード(SSDEF.Hに定義されているコード)を比較します。条件コードはシステム定義のシグナル・データ構造のフィールドとして参照されます (CHFDEF.Hに定義されています)。

  3. LIB$MATCH_CONDルーチンは,一致する条件コードを検出したときにゼロ以外の結果を戻します。条件処理ルーチンはこの結果をもとに,異なるコード・パスを実行します。



8.4 例外条件の識別

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


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

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

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

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

注意

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

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

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


目次 索引

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