日本-日本語

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

OpenVMS マニュアル


≫ 

OpenVMS
ライブラリ

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

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


目次 索引

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

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

8.1 概要

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

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

  • メカニズム・アレイの形式への変更

  • システムから返される条件コードの変更

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

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

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

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

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

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

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

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

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



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

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

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

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


次の表では,シグナル・アレイ内の各引数について説明しています。

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

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

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


図 8-3 I64 システムでのメカニズム・アレイ


次の表では,メカニズム・アレイ内の各引数について説明しています。

引数 説明
引数の数 VAX システムでは,この引数には正の整数が格納され,配列内でその後に続くロングワードの数を示す。 I64 システムでは,この引数はメカニズム・アレイ内の クォドワードの数を示し,「引数の数」のクォドワードは含まない。 I64 システムでは,CHF$V_FPREGS_VALID がオフのときは引数の数は 71 で,このビットがオンのときは 263 である。
フラグ I64 システムでは,この引数には追加情報を伝達するためのさまざまなフラグが格納される。ビット 0 は,プロセスがすでにレジスタ F2-F31 内で浮動小数点演算を実行し,配列内の浮動小数点レジスタが正しいことを示す (VAX システムのメカニズム・アレイにはこれに対応する引数はない)。ビット 1 は,プロセスがすでにレジスタ F32-F127 内で浮動小数点演算を実行し,拡張領域内の浮動小数点レジスタが正しいことを示す (VAX システムのメカニズム・アレイにはこれに対応する引数はない)。
フレーム・ポインタ (FP) VAX システムでは,FP の内容が格納される。 I64 では,プロシージャのエントリ時点での SP の値である PSP (Previous Stack Pointer) が格納される。
深さ VAX システムでも I64 システムでも,この引数には,例外を発生させたフレームを基準にして,条件処理ルーチンを設定したプロシージャのフレーム番号を表す整数が格納される。
リザーブ 予約されている。
ハンドラ・データ・アドレス I64 システムでは,この引数には,ハンドラが存在する場合はハンドラ・データ・クォドワードのアドレスが格納される (VAX システムのメカニズム・アレイにはこれに対応する引数はない)。
例外スタック・フレーム・アドレス I64 システムでは,この引数には例外スタック・フレームのアドレスが格納される (VAX システムのメカニズム・アレイにはこれに対応する引数はない)。
シグナル・アレイのアドレス I64 システムでは,この引数には 32 ビットのシグナル・アレイのアドレスが格納される (VAX システムのメカニズム・アレイにはこれに対応する引数はない)。
関数の戻り値 I64 システムでは,これら 2 つのクォドワードには,例外発生時の R8 とR9 の内容が格納される (VAX システムのメカニズム・アレイにはこれに対応する引数はない)。
シグナル・アレイのアドレス I64 システムでは,この引数には 64 ビットのシグナル・アレイのアドレスが格納される (VAX システムのメカニズム・アレイにはこれに対応する引数はない)。
浮動小数点例外アドレス I64 システムでは,例外発生時点の浮動小数点レジスタ F32-F127 の内容が格納された配列のアドレスが格納される (VAX システムのメカニズム・アレイにはこれに対応する引数はない)。
浮動小数点の戻り値 I64 システムでは,これら 2 つのクォドワードは,例外発生時点の F8 と F9 の内容が格納される (VAX システムのメカニズム・アレイにはこれに対応する引数はない)。
レジスタ VAX システムでも I64 システムでも,メカニズム・アレイにはスクラッチ・レジスタの内容が格納される。 I64 システムでは,この引数にはるかに大きなレジスタ・セットが格納され,浮動小数点レジスタ,分岐レジスタ,一部のアプリケーション・レジスタも格納される。
オペレーティング・システム固有のデータ領域 I64 システムでは,条件ハンドラのオペレーティング・システム固有のデータ領域のアドレスが格納される (VAX システムのメカニズム・アレイにはこれに対応する引数はない)。
起動ハンドル I64 システムでは,条件ハンドラを設定したプロシージャの起動ハンドルが格納される (VAX システムのメカニズム・アレイにはこれに対応する引数はない)。
アンワインド領域 アンワインド領域のアドレス。

詳細は,『OpenVMS Calling Standard』を参照してください。

対処方法

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

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

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

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

例 8-1 C で作成した条件処理ルーチン

#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  */ 

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

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

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

注意

I64 システムで実行されるトランスレートされた VAX イメージも,これらの VAX 例外を返すことがあります。

表 8-1 アーキテクチャ固有のハードウェア例外
例外条件コード コメント
I64 システム固有の例外
SS$_FLTINV--無効な浮動小数点オペランド値 (トラップ) VAX システムには対応する例外はない
SS$_FLTINV_F--無効な浮動小数点オペランド値 (フォルト) VAX システムには対応する例外はない
SS$_FLTINE--浮動小数点の結果が不正確 (トラップ) VAX システムには対応する例外はない
SS$_FLTINE_F--浮動小数点の結果が不正確 (フォルト) VAX システムには対応する例外はない
SS$_FLTDENORMAL--正規化されていない浮動小数点結果 VAX システムには対応する例外はない
SS$_ALIGN--データ・アラインメント・トラップ VAX システムには対応する例外はない
VAX システム固有の例外
SS$_ARTRES--予備の算術演算トラップ I64 システムには対応する例外はない
SS$_COMPAT--互換性フォルト I64 システムには対応する例外はない
SS$_DECOVF--10 進オーバフロー 1 I64 ハードウェアでは生成されない
SS$_INTDIV--0 による整数除算 1 I64 ハードウェアでは生成されない
SS$_INTOVF--整数オーバフロー 1 I64 ハードウェアでは生成されない
SS$_TBIT--トレース・ペンディング I64 システムには対応する例外はない
SS$_OPCCUS--ユーザ用に確保されているオペコード I64 システムには対応する例外はない
SS$_RADMOD--予備のアドレッシング・モード I64 システムには対応する例外はない
SS$_SUBRNG--INDEX 添字範囲チェック I64 システムには対応する例外はない

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


目次 索引

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