(57)【要約】  プログラムの第１バイナリバージョンと、前記プログラムの第１バイナリバージョンに係るアンワインド情報とを解析するステップ、前記解析結果に少なくとも部分的に基づき、前記プログラムの第２バイナリバージョンを生成するため、前記プログラムの第１バイナリバージョンに対して最適化を実行するステップ、前記解析結果と前記実行された最適化に少なくとも部分的に基づき、前記プログラムの第２バイナリバージョンに対する更新されたアンワインド情報を生成するステップ。
2008505423.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの第１バイナリバージョンと、前記プログラムの第１バイナリバージョンに係るアンワインド情報とを解析するステップと、
前記解析結果に少なくとも部分的に基づき、前記プログラムの第２バイナリバージョンを生成するため、前記プログラムの第１バイナリバージョンに対して最適化を実行するステップと、
前記解析結果と前記実行された最適化に少なくとも部分的に基づき、前記プログラムの第２バイナリバージョンに対する更新されたアンワインド情報を生成するステップと、
から構成されることを特徴とする方法。
【請求項２】
請求項１記載の方法であって、
前記アンワインド情報はさらに、前記プログラムの各プロシージャの各アンワインド領域に係り、前記プログラムのアンワインド処理に関する言語独立情報を有することを特徴とする方法。
【請求項３】
請求項２記載の方法であって、
前記解析するステップはさらに、
命令、ベーシックブロック及びプロシージャの表現を含む前記プログラムの表現を生成するステップと、
表現された各ベーシックブロックのベーシックブロックタイプを特定し、前記ベーシックブロックタイプにより前記表現をマークするステップと、
前記プログラムの各プロシージャの各アンワインド領域に対するアンワインド属性とアンワインド状態データとを生成するステップと、
アンワインド状態データと属性とを前記プログラムの命令の表現と関連付けるステップと、
アンワインド状態データと属性とを前記プログラムのプロシージャの表現と関連付けるステップと、
から構成されることを特徴とする方法。
【請求項４】
請求項３記載の方法であって、
前記最適化を実行するステップはさらに、
最適化中、関連付けされたアンワインド属性を有する命令を削除からプロテクトするステップと、
関連付けされたアンワインド属性を有する第１命令が、最適化中に第２命令を生成するよう複製される場合、前記第１命令の表現に係るアンワインド属性に少なくとも部分的に基づき、前記第２命令と該表現に係るアンワインド属性とを生成するステップと、
最適化中、何れの命令も１つのベーシックブロックタイプのベーシックブロックから異なるベーシックブロックタイプのベーシックブロックに移動されないよう回避するステップと、
前記プログラムの第１バイナリバージョンのプロシージャが、最適化中に２つの新しいプロシージャに分割される場合、前記プログラムの第１バイナリバージョンのプロシージャの表現に対する前記アンワインド状態データ及び属性と、前記分割が行われた命令に対するアンワインドルールとに少なくとも部分的に基づき、各新しいプロシージャの表現と、該表現に対するアンワインド状態データ及び属性とを生成するステップと、
から構成されることを特徴とする方法。
【請求項５】
請求項４記載の方法であって、
前記解析結果と前記実行された最適化に少なくとも部分的に基づき、前記プログラムの第２バイナリバージョンに対する新たなアンワインド情報を生成するステップはさらに、
各プロシージャの各アンワインド領域に対するアンワインド状態データを、該データが前記プログラムの第２バイナリバージョン内の前記領域の位置及び新たな長さと整合するように調整するステップと、
前記調整されたアンワインド状態データを前記プログラムの第２バイナリバージョンに関連付けるステップと、
から構成されることを特徴とする方法。
【請求項６】
請求項５記載の方法であって、
前記プログラムの第１バイナリバージョンのプロシージャが、最適化中に２つの新しいプロシージャに分割される場合、該プロシージャは、ペアレントプロシージャと少なくとも１つのチャイルドプロシージャとに分割され、
前記解析結果と前記実行された最適化に少なくとも部分的に基づき、前記プログラムの第２バイナリバージョンに対する新たなアンワインド情報を生成するステップはさらに、
前記チャイルドプロシージャがゼロの長さのプロローグを有することを示すため、前記分割によって生成された各チャイルドプロシージャの表現に対して前記アンワインド状態データをマーク付けするステップと、
前記アンワインド状態データがアクティブとなる前記プログラムの位置を前記チャイルドプロシージャの始めに設定するステップと、
から構成されることを特徴とする方法。
【請求項７】
請求項１記載の方法であって、
前記アンワインド情報はさらに、前記プログラムのソースコードバージョンのソース言語に規定される例外処理に関する言語に依存した例外処理情報を有し、
前記プログラムの第１バイナリバージョンは、少なくとも部分的に前記プログラムのソースコードバージョン上での前記ソース言語のコンパイラの実行により求められる、
ことを特徴とする方法。
【請求項８】
請求項７記載の方法であって、
前記解析するステップはさらに、
前記プログラムの第１バイナリバージョンを求めるのに実行されたコンパイラを特定するステップと、
前記プログラムの命令、ベーシックブロック及びプロシージャの表現を生成するステップと、
例外処理情報が前記プログラムのプロシージャのアンワインド情報に含まれる場合、前記コンパイラのアイデンティティに少なくとも部分的に基づき、前記プロシージャに対する例外処理情報を解釈するステップと、
前記例外処理情報に少なくとも部分的に基づき、各プロシージャの表現のため、例外処理コールサイトテーブル、例外処理タイプテーブル及び例外処理アクションテーブルを生成するステップと、
例外処理を生成するコードを含むベーシックブロックの表現と、前記例外処理のためのハンドラを含むベーシックブロックの表現との間の関連付けを前記表現に追加するステップと、
から構成されることを特徴とする方法。
【請求項９】
請求項８記載の方法であって、
前記最適化を実行するステップはさらに、
例外処理を生成するコードを含むベーシックブロックを削除からプロテクトするステップと、
例外処理を処理するコードを含むベーシックブロックを削除からプロテクトするステップと、
例外処理を生成するコードを含む第１ベーシックブロックが、最適化中に第２ベーシックブロックを生成するため複製される場合、前記第２ベーシックブロックの表現と、前記第１ベーシックブロックの表現の既存の各関連付けに対応する前記第２ベーシックブロックの表現の関連付けとを生成するステップと、
前記プログラムの第１バイナリバージョンのプロシージャが、最適化中に２つの新しいプロシージャに分割される場合、各新しいプロシージャに対して、例外処理コールサイトテーブル、例外処理タイプテーブル及び例外処理アクションテーブルを、前記プログラムの第１バイナリバージョンの前記プロシージャに対する例外処理コールサイトテーブル、例外処理タイプテーブル及び例外処理アクションテーブルに少なくとも部分的に基づき生成するステップと、
から構成されることを特徴とする方法。
【請求項１０】
請求項９記載の方法であって、
前記解析結果と前記実行された最適化に少なくとも部分的に基づき、前記プログラムの第２バイナリバージョンに対する新たなアンワインド情報を生成するステップはさらに、前記第２バイナリプログラムの各プロシージャに対して、新たな例外処理コールサイトテーブル、新たな例外処理タイプテーブル及び新たな例外処理アクションテーブルを、
前記プログラムの第１バイナリバージョンを解析することによってそれぞれ生成される前記例外処理コールサイトテーブル、前記例外処理タイプテーブル及び前記例外処理アクションテーブルと、
最適化中のプロシージャの分割によって生成される新たなプロシージャに対してそれぞれ生成される新たな例外処理コールサイトテーブル、新たな例外処理タイプテーブル及び新たな例外処理アクションテーブルと、
例外処理を生成するコードを含む各ベーシックブロックと、前記例外処理に対するハンドラを含むベーシックブロックとの間の前記表現における関連付けと、
の１以上に少なくとも部分的に基づき生成するステップを有することを特徴とする方法。
【請求項１１】
請求項１０記載の方法であって、さらに、
最適化中に前記例外処理コールサイトテーブルの符号なし数として生成される、新たなプロシージャの例外処理コールサイトのためのハンドラのアドレスに対する負のオフセットを表現するステップを有することを特徴とする方法。
【請求項１２】
記憶装置に通信可能に接続されるプロセッサと、
前記記憶装置上に格納され、前記プロセッサによって実行可能であって、プログラムの第１バイナリバージョンと、前記プログラムの第１バイナリバージョンに係るアンワインド情報とを解析する解析モジュールと、
前記記憶装置上に格納され、前記プロセッサによって実行可能であって、前記解析結果に少なくとも部分的に基づき、前記プログラムの第２バイナリバージョンを生成するため、前記プログラムの第１バイナリバージョンに対して最適化を実行する最適化モジュールと、
前記記憶装置上に格納され、前記プロセッサによって実行可能であって、前記解析結果と前記実行された最適化に少なくとも部分的に基づき、前記プログラムの第２バイナリバージョンに対する新しいアンワインド情報を生成する生成モジュールと、
から構成されることを特徴とするシステム。
【請求項１３】
請求項１２記載のシステムであって、
前記アンワインド情報はさらに、前記プログラムの各プロシージャの各アンワインド領域に係り、前記プログラムのアンワインド処理に関する言語独立情報を有することを特徴とするシステム。
【請求項１４】
請求項１２記載のシステムであって、
前記アンワインド情報はさらに、前記プログラムのソースコードバージョンのソース言語に規定される例外処理に関する言語に依存した例外処理情報を有し、
前記プログラムの第１バイナリバージョンは、少なくとも部分的に前記プログラムのソースコードバージョン上での前記ソース言語のコンパイラの実行により求められる、
ことを特徴とするシステム。
【請求項１５】
プログラムの第１バイナリバージョンと、前記プログラムの第１バイナリバージョンに係るアンワインド情報とを解析するステップと、
前記解析結果に少なくとも部分的に基づき、前記プログラムの第２バイナリバージョンを生成するため、前記プログラムの第１バイナリバージョンに対して最適化を実行するステップと、
前記解析結果と前記実行された最適化に少なくとも部分的に基づき、前記プログラムの第２バイナリバージョンに対する更新されたアンワインド情報を生成するステップと、
から構成される方法を、マシーンによりアクセスされると、前記マシーンに実行されるデータを格納することを特徴とするマシーンアクセス可能な媒体。
【請求項１６】
請求項１５記載のマシーンアクセス可能な媒体であって、
前記アンワインド情報はさらに、前記プログラムの各プロシージャの各アンワインド領域に係り、前記プログラムのアンワインド処理に関する言語独立情報を有することを特徴とするマシーンアクセス可能な媒体。
【請求項１７】
請求項１６記載のマシーンアクセス可能な媒体であって、
前記解析するステップはさらに、
命令、ベーシックブロック及びプロシージャの表現を含む前記プログラムの表現を生成するステップと、
表現された各ベーシックブロックのベーシックブロックタイプを特定し、前記ベーシックブロックタイプにより前記表現をマークするステップと、
前記プログラムの各プロシージャの各アンワインド領域に対するアンワインド属性とアンワインド状態データとを生成するステップと、
アンワインド状態データと属性とを前記プログラムの命令の表現と関連付けるステップと、
アンワインド状態データと属性とを前記プログラムのプロシージャの表現と関連付けるステップと、
から構成されることを特徴とするマシーンアクセス可能な媒体。
【請求項１８】
請求項１７記載のマシーンアクセス可能な媒体であって、
前記最適化を実行するステップはさらに、
最適化中、関連付けされたアンワインド属性を有する命令を削除からプロテクトするステップと、
関連付けされたアンワインド属性を有する第１命令が、最適化中に第２命令を生成するよう複製される場合、前記第１命令の表現に係るアンワインド属性に少なくとも部分的に基づき、前記第２命令と該表現に係るアンワインド属性とを生成するステップと、
最適化中、何れの命令も１つのベーシックブロックタイプのベーシックブロックから異なるベーシックブロックタイプのベーシックブロックに移動されないよう回避するステップと、
前記プログラムの第１バイナリバージョンのプロシージャが、最適化中に２つの新しいプロシージャに分割される場合、前記プログラムの第１バイナリバージョンのプロシージャの表現に対する前記アンワインド状態データ及び属性と、前記分割が行われた命令に対するアンワインドルールとに少なくとも部分的に基づき、各新しいプロシージャの表現と、該表現に対するアンワインド状態データ及び属性とを生成するステップと、
から構成されることを特徴とするマシーンアクセス可能な媒体。
【請求項１９】
請求項１８記載のマシーンアクセス可能な媒体であって、
前記解析結果と前記実行された最適化に少なくとも部分的に基づき、前記プログラムの第２バイナリバージョンに対する新たなアンワインド情報を生成するステップはさらに、
各プロシージャの各アンワインド領域に対するアンワインド状態データを、該データが前記プログラムの第２バイナリバージョン内の前記領域の位置及び新たな長さと整合するように調整するステップと、
前記調整されたアンワインド状態データを前記プログラムの第２バイナリバージョンに関連付けるステップと、
から構成されることを特徴とするマシーンアクセス可能な媒体。
【請求項２０】
請求項１９記載のマシーンアクセス可能な媒体であって、
前記プログラムの第１バイナリバージョンのプロシージャが、最適化中に２つの新しいプロシージャに分割される場合、該プロシージャは、ペアレントプロシージャと少なくとも１つのチャイルドプロシージャとに分割され、
前記解析結果と前記実行された最適化に少なくとも部分的に基づき、前記プログラムの第２バイナリバージョンに対する新たなアンワインド情報を生成するステップはさらに、
前記チャイルドプロシージャがゼロの長さのプロローグを有することを示すため、前記分割によって生成された各チャイルドプロシージャの表現に対して前記アンワインド状態データをマーク付けするステップと、
前記アンワインド状態データがアクティブとなる前記プログラムの位置を前記チャイルドプロシージャの始めに設定するステップと、
から構成されることを特徴とするマシーンアクセス可能な媒体。
【請求項２１】
請求項１５記載のマシーンアクセス可能な媒体であって、
前記アンワインド情報はさらに、前記プログラムのソースコードバージョンのソース言語に規定される例外処理に関する言語に依存した例外処理情報を有し、
前記プログラムの第１バイナリバージョンは、少なくとも部分的に前記プログラムのソースコードバージョン上での前記ソース言語のコンパイラの実行により求められる、
ことを特徴とするマシーンアクセス可能な媒体。
【請求項２２】
請求項２１記載のマシーンアクセス可能な媒体であって、
前記解析するステップはさらに、
前記プログラムの第１バイナリバージョンを求めるのに実行されたコンパイラを特定するステップと、
前記プログラムの命令、ベーシックブロック及びプロシージャの表現を生成するステップと、
例外処理情報が前記プログラムのプロシージャのアンワインド情報に含まれる場合、前記コンパイラのアイデンティティに少なくとも部分的に基づき、前記プロシージャに対する例外処理情報を解釈するステップと、
前記例外処理情報に少なくとも部分的に基づき、各プロシージャの表現のため、例外処理コールサイトテーブル、例外処理タイプテーブル及び例外処理アクションテーブルを生成するステップと、
例外処理を生成するコードを含むベーシックブロックの表現と、前記例外処理のためのハンドラを含むベーシックブロックの表現との間の関連付けを前記表現に追加するステップと、
から構成されることを特徴とするマシーンアクセス可能な媒体。
【請求項２３】
請求項２２記載のマシーンアクセス可能な媒体であって、
前記最適化を実行するステップはさらに、
例外処理を生成するコードを含むベーシックブロックを削除からプロテクトするステップと、
例外処理を処理するコードを含むベーシックブロックを削除からプロテクトするステップと、
例外処理を生成するコードを含む第１ベーシックブロックが、最適化中に第２ベーシックブロックを生成するため複製される場合、前記第２ベーシックブロックの表現と、前記第１ベーシックブロックの表現の既存の各関連付けに対応する前記第２ベーシックブロックの表現の関連付けとを生成するステップと、
前記プログラムの第１バイナリバージョンのプロシージャが、最適化中に２つの新しいプロシージャに分割される場合、各新しいプロシージャに対して、例外処理コールサイトテーブル、例外処理タイプテーブル及び例外処理アクションテーブルを、前記プログラムの第１バイナリバージョンの前記プロシージャに対する例外処理コールサイトテーブル、例外処理タイプテーブル及び例外処理アクションテーブルに少なくとも部分的に基づき生成するステップと、
から構成されることを特徴とするマシーンアクセス可能な媒体。
【請求項２４】
請求項２３記載のマシーンアクセス可能な媒体であって、
前記解析結果と前記実行された最適化に少なくとも部分的に基づき、前記プログラムの第２バイナリバージョンに対する新たなアンワインド情報を生成するステップはさらに、前記第２バイナリプログラムの各プロシージャに対して、新たな例外処理コールサイトテーブル、新たな例外処理タイプテーブル及び新たな例外処理アクションテーブルを、
前記プログラムの第１バイナリバージョンを解析することによってそれぞれ生成される前記例外処理コールサイトテーブル、前記例外処理タイプテーブル及び前記例外処理アクションテーブルと、
最適化中のプロシージャの分割によって生成される新たなプロシージャに対してそれぞれ生成される新たな例外処理コールサイトテーブル、新たな例外処理タイプテーブル及び新たな例外処理アクションテーブルと、
例外処理を生成するコードを含む各ベーシックブロックと、前記例外処理に対するハンドラを含むベーシックブロックとの間の前記表現における関連付けと、
の１以上に少なくとも部分的に基づき生成するステップを有することを特徴とするマシーンアクセス可能な媒体。
【請求項２５】
請求項２４記載のマシーンアクセス可能な媒体であって、さらに、
最適化中に前記例外処理コールサイトテーブルの符号なし数として生成される、新たなプロシージャの例外処理コールサイトのためのハンドラのアドレスに対する負のオフセットを表現するステップを有することを特徴とするマシーンアクセス可能な媒体。
【発明の詳細な説明】
【発明の詳細な説明】
【０００１】
［背景］
人間により可読な又はハイレベルソース言語により当初記述されたプログラムは、一般にコンパイル処理及びリンク処理によって機械語による実行可能プログラムに変換される。バイナリコードと呼ばれるこの結果として得られるプログラムのバージョンは、プロセッサベースシステムによって実行可能である。プログラムは、一般に便宜上、再利用可能性、設計複雑性管理及び他の理由のため、プロシージャと呼ばれるサブプログラムに分割される。プロシージャは、ＣやＣ＋＋などの言語による関数などの他の名称によって参照されるかもしれない。ハイレベル言語バージョンによるプロシージャに分割されるプログラムは、一般に当該プログラムのハイレベル言語バージョンによるものにほぼ対応するプロシージャを有するプログラムのバイナリバージョンにコンパイル及びリンクされる。コンパイル及びリンク処理の後、システム上で実行されるプログラムは、典型的には、プログラムスタックを利用して、当該技術分野では周知なように、プロシージャの呼び出しを支援し、プログラムのメインフロー又は呼出元のプロシージャに戻る。一般に、プロシージャコールは入れ子にされ、メインプログラムはメインプロシージャとみなされるかもしれないため、以下において、「呼出元プロシージャ（ｃａｌｌｉｎｇ  ｐｒｏｃｅｄｕｒｅ）」及び「呼出先プロシージャ（ｃａｌｌｅｄ  ｐｒｏｃｅｄｕｒｅ）」という用語が、一般性を失うことなく用いられる。プロシージャコールは、命令ポインタなどの呼出元プロシージャによって用いられるレジスタ、及び呼出先プロシージャの実行によって上書きされる可能性のある他のレジスタの値を含む呼出に関する値のセットをプログラムスタックに格納しなければならない。呼出元プロシージャのローカル変数や、呼出先プロシージャによって変更される可能性のないパラメータなどの他のデータ値もまた、スタックに格納されるかもしれない。スタック上の特定のプロシージャの特定の呼出に関するすべてのデータは、それのスタックフレーム又はアクティベーションレコードと呼ばれる。
【０００２】
システム上でプログラムを実行するための典型的なランタイムシステムでは、呼び出されているプロシージャは、プログラムスタック上のそれのスタックフレームをそれの第１アクションセットの１つとして割当て、プロシージャの実行に従って変更される可能性のあるデータによりスタックフレームを占有させる。イグジット前に、それは割り当てられたスタックフレームをリリースし、リターン実行前にプログラムスタックポインタを更新する。従って、プログラムスタックは、プロシージャコール及びリターン処理機構によるプログラム実行の通常のプロセスにおいて管理される。しかしながら、ときどきプログラムコントロールは、プロシージャリターン機構の通常の処理なしに、あるプロシージャから他のプロシージャに移行することもある。
【０００３】
これは、一例では、プロシージャが仲介リターンの実行なしに、異なるレベルのプログラムスタックにおいてプログラムコントロールを他のプロシージャに移行させるロングジャンプタイプ命令を実行する際に発生するかもしれない。他の例では、これは、再びスタックがリターンコールシーケンスにより管理されることなく、コントロールを他のレベルのプログラムスタックにおける例外処理ハンドラに移行させるプロシージャ内部で例外処理が発生する場合に行われるかもしれない。さらなる他の例では、これは、デバッガがプログラムをデバッグするのに使用され、プロシージャ内のポイントから現在のステートメントを導いたコールチェーンへのポイントまでプログラムの外部のデバッガによって移行される場合に発生するかもしれない。マルチスレッド処理をサポートする言語及びランタイムシステムでは、同じタイプの現象がスレッドの終了によって引き起こされるかもしれない。
【０００４】
このようなプロシージャ内部からのコントロールの移行が行われるとき、コントロールが移行される新たなポイントにおいてプログラムの実行が適切に回復するように、コントロールがプロシージャから移行されるポイントにおいて行われたかのように通常のリターンプロセスをシミュレートするという意味で、プログラムスタックはアンロール（ｕｎｒｏｌｌ）又はアンワインド（ｕｎｗｉｎｄ）される必要がある。プログラムスタックの適切なアンワインド処理のため、一部のランタイムシステムは、プログラムの実行可能イメージに含まれる特定のサポートを提供する。これは、通常のリターン以外のポイントにおけるプロシージャからのイグジットの後に、ランタイムシステムがコンテクストを正確に復元することを可能にするアンワインド情報又はアンワインドテーブルの形式となる。
【０００５】
アンワインド情報は、このようなイグジットが発生する可能性のあるプロシージャの各ステートメントと関連付けされるかもしれない。いくつかの例では、アンワインド情報は、アンワインド情報がすべてのステートメントに対して同一となるプロシージャの領域又はステートメントブロックと関連付けされるかもしれない。他の例では、アンワインド情報は、各ステートメント又は格ステートメントブロックに対して異なるかもしれない。
【０００６】
アンワインド情報の有効性は、ポストリンクプログラム最適化（ｐｏｓｔ−ｌｉｎｋ  ｐｒｏｇｒａｍ  ｏｐｔｉｍｉｚａｔｉｏｎ）によって重大な障害又は解消されるかもしれない。ポストリンクプログラム最適化は、例えば、実行時間などに関するプログラムパフォーマンスを、それの入出力動作などの他の動作を変更することなく、プログラムのバイナリポストリンクバージョンのコードを変更する各種技術によって向上させるための技術セットである。プログラム最適化に利用される周知の技術の中には、プロシージャ分割処理、ループアンロール処理、ループからの命令の移動がある。これらの技術は、既存のプロシージャの変更又は削除によって、新たなプロシージャの追加、ステートメントの複製、及びもとのバージョンのプログラムからのステートメントの削除を含む複数の方法によりもとのプログラムとは異なるプログラムの新たなバイナリバージョンをもたらす。もとのプログラムのプロシージャ及びステートメントに係るアンワインド情報は、一般に最適化されたプログラムのプログラムスタックのアンワインド処理における未使用に限定される。
【０００７】
［詳細な説明］
一実施例では、図１に示されるような処理が行われる。概略すると、以下のメインフェーズが当該処理を構成する。すなわち、第１に、関連付けされたアンワインド情報１３０によるプログラム１２５のポストリンク最適化バイナリバージョンが、解析フェーズ１０５と１１０に入力される。プログラムの解析は、入力プログラムからのアンワインド情報の読み出し（１０５）と、当該情報を利用してプログラムの詳細表現を構成し、追加的なアノテーション（ａｎｎｏｔａｔｉｏｎ）をプログラムのステートメント及びブロックの表現（をデコレートし）と関連付ける（１１０）という２つの主要なコンポーネントから構成される。当該フェーズの後、実際のプログラムの最適化が行われ（１１５）、そこで、プログラムの最適化されたバージョンと整合した新たなアンワインド情報が最適化後に再生成可能となることを保証するため、必要に応じてデコレートされた表現が利用及び更新される。最適化されたプログラム、デコレートされた表現及びもとのプログラムのアンワインド情報が使用され（１２０）、プログラムの最適化されたバイナリバージョンと整合し格納される（１３５）新たなアンワインド情報を生成する（１４０）。
【０００８】
次に、当該実施例におけるこれらの処理フェーズのそれぞれが、さらに詳細に検討される。アンワインド情報は、コンパイラとリンカーを含むコンパイルシステムによってバイナリプログラムに関連付けされ、図２に示されるような情報を含むかもしれない。一般的に図示された一実施例は、Ｉｎｔｅｌ（登録商標）Ｉｔａｎｉｕｍ（登録商標）プロセッサファミリに対するアンワインド情報を格納するための取り決めのセットである。この取り決めのセットは、“Ｉｎｔｅｌ  Ｉｔａｎｉｕｍ  Ｓｏｆｔｗａｒｅ  Ｃｏｎｖｅｎｔｉｏｎｓ  ａｎｄ  Ｒｕｎｔｉｍｅ  Ａｒｃｈｉｔｅｃｔｕｒｅ  Ｇｕｉｄｅ”に詳述される。本実施例では、他の実施例と同様に、アンワインド情報は、プログラムスタックがプロシージャの実行における特定ポイントにおいてアンワインド処理される必要がある場合、プロシージャによって使用される関連するレジスタセットが少なくともどのようにリストアされるべきか詳述する必要がある。例えば、Ｉｔａｎｉｕｍ（登録商標）プロセッサファミリのためのアンワインド情報は、２つのセクションから構成される。第１のものは、図の２０２〜２０６に示されるような、各々がプロシージャ２１２における命令ポインタ２０８のポジションに対応するレコードセットを有するテーブルである。いくつかの実施例では、命令ポインタの値の範囲は、同じレコードセットに対応するかもしれない。命令ポインタとアンワインド情報の位置との間の関係は、一実施例では、アンワインド情報のレコードアレイにインデックスを生成するため、命令ポインタに適用されるマッピング関数に基づくものであるかもしれない。
【０００９】
アンワインド処理のため、各プロシージャは、各アンワインド領域において同一のアンワインド情報セットが有効となるいくつかのアンワインド領域に分割されるかもしれない。テーブルにおけるすべてのアンワインドレコードは、有効となるプロシージャ内の領域のスタートポイント２０２とエンドポイント２０４を示す。この実施例では、これらのエンドポイントがポインタ又はアドレスとして記録される。当該実施例におけるアンワインド領域は、アンワインド記述子エリア２１０、パーソナリティルーチン２１４及び言語固有データエリア（ＬＳＤＡ）２１５から構成される指定された領域に対するプロシージャのアンワインド処理のための実データを指し示す情報ポインタを含む。これらのうち、後者の２つは、一般にはコンパイラ及び言語に依存したものであり、このため、同一のプラットフォーム上でさえコンパイラ毎に異なるものとなる。
【００１０】
次に、アンワインド記述子セグメント２１０は、本実施例では、アンワインド処理の場合にどのようにプロセッサレジスタが処理されるべきか指示するのに主として用いられる。各レジスタは、一般にプロシージャの実行における特定のポイントにおいてセーブされる必要がある。記述子は、何れのレジスタがセーブされるべき、プロシージャにおける何れの命令においてセーブされるべきか、及びセーブされるべきメモリ内の位置を記述するものであるかもしれない。アンワインド処理のため、プロシージャは、プロローグ領域と１以上のボディー領域の少なくとも２つの領域に分割されるかもしれない。プロローグ領域は、プロシージャによって使用されるべきレジスタが確立され、既存のレジスタ状態がセーブされ、プロシージャのスタックフレームが割り当てられる領域である。ボディー領域は、プロローグ領域に後続し、一般にスタックフレームの割当てや、レジスタセーブ及びリストアの実行を行わない。プロローグセクションのアンワインド情報は、セーブされる又はセーブされないレジスタセットがステートメント毎に変わる可能性があるため、一般にはボディー領域に対するものより詳述される。
【００１１】
図２に示されるように、アンワインド記述子は、アンワインド記述子エリアにおいて記述子が提供される領域を示す領域ヘッダ２１６を含む。これは、プロローグ記述子２１８及び１以上のボディー記述子２２０に続く。他の記述子２２２もまた利用可能である。
【００１２】
本実施例におけるプロシージャをアンワインド処理するためのデータの次の部分は、例外処理のサポートを含む。例外処理は、特定のプログラミング言語において利用可能な周知のエラー処理機構である。本実施例では、一例としてＣ＋＋言語が利用されるが、他の同様の機構もまた、Ｊａｖａ（登録商標）、Ａｄａ及び当該技術分野で知られているような他のプログラミング言語により実現される。
【００１３】
当業者はＣ＋＋言語の一般的コンテクストに十分精通していることが予想される。特定の例外処理への参照によって、Ｃ＋＋プログラミング言語は、例外処理のためのコードを構成するためプログラマーによって利用可能なｔｒｙ、ｃａｔｃｈ及びｔｈｒｏｗの言語キーワードのセマティックを規定している。ｔｒｙブロックは、通常は１以上のｃａｔｃｈブロックに続くステートメントブロックである。各ｃａｔｃｈブロックは、“ｃａｔｃｈ  ａｌｌ”条件を示すコンストラクト“．．．”又はそれに関連付けされたタイプを有する。ｔｒｙブロックに含まれるコールされるステートメント及びプロシージャは、存在する場合には、ｔｈｒｏｗステートメントを含むかもしれない。Ｃ＋＋によるｔｈｒｏｗステートメントは、ある特定タイプの引数を求める。
【００１４】
ｔｒｙ、ｃａｔｃｈ及びｔｈｒｏｗのセマティックは、一般には以下の通りである。ランタイム時において、例外処理中にｔｈｒｏｗステートメントに遭遇した場合、サーチフェーズがマッチしたｃａｔｃｈに対して開始される。このサーチはまず、現在のコンテクスト、すなわち、現在実行中のプロシージャにおいて実行され、さらにプロシージャのコールチェーンまで実行される。実行されたｔｈｒｏｗの引数と同じタイプの、又は“ｃａｔｃｈ  ａｌｌ”であるｃａｔｃｈクローズが存在する場合、マッチが発生する。サーチフェーズは、マッチしたｃａｔｃｈに又はｍａｉｎ（）プロシージャに到達すると終了する。マッチが存在しない場合、ランタイムエラーが生成される。マッチしたｃａｔｃｈが検出されると、クリーンアップフェーズが開始される。クリーンアップフェーズでは、ｔｈｒｏｗから見ることができるローカル変数が、まず破壊される。見ることができるすべてのローカル変数を破壊した後、現在のプロシージャがアンワインド処理され、プログラムスタックのアンワインド処理が要求される。マッチしたｃａｔｃｈによるプロシージャに到達するまで、コールチェーンの各プロシージャに対して同一のプロセス（ローカル変数を破壊し、プロシージャをアンワインド処理する）が繰り返される。その後、コントロールは、マッチしたｃａｔｃｈクローズにわたされる。マッチしたｃａｔｃｈのステートメントが実行され、その後、コントロールがすべてのｃａｔｃｈクローズに続くステートメントにわたされる。
【００１５】
これにより、例外処理が発生すると、それはスタックアンワインド処理と、前述されたタイプのアンワインド情報の利用を必要とする。さらに、例外処理をサポートする他のタイプのアンワインド情報がまた、アンワインド処理の一部として適切な例外処理を可能にするため、コンパイラ及びリンカーによって格納されるかもしれない。図２に示されるように、この情報は、当該実施例において、パーソナリティルーチン２１４及びＬＳＤＡ（Ｌａｎｇｕａｇｅ  Ｓｐｅｃｉｆｉｃ  Ｄａｔａ  Ａｒｅａ）２１５から構成される。Ｉｎｔｅｌ（登録商標）Ｉｔａｎｉｕｍ（登録商標）プロセッサランタイムシステムに対するアンワインド情報の上記コンパイラ固有エリアのより詳細な説明は、当該プロセッサに対してリリースされた具体的コンパイラに関する文書に見つけることができる。一例では、Ｉｎｔｅｌ（登録商標）Ｉｔａｎｉｕｍ（登録商標）プロセッサのための公表されたＧＮＵ  ｇｃｃコンパイラバージョン３．１は、Ｃ＋＋例外処理のためのアンワインドエリアのコンパイラ固有部分を実現する。以下の説明において、本実施例を説明するのに十分なコンパイラ固有エリアが概略される。記載される特徴は、Ｉｔａｎｉｕｍ（登録商標）のためのＣ＋＋例外処理をサポートするよう構成されるコンパイラに含まれるかもしれない。
【００１６】
本実施例では、パーソナリティルーチン２１４は、例外処理のためのＣ＋＋ランタイムライブラリの特別なプロシージャである。パーソナリティルーチンは、ランタイムシステムによって採用される特定のアクションが当該言語の例外処理コンストラクトのセマティックに依存しているため、コンパイラのプログラミング言語に依存する。ＬＳＤＡ２１５は、マッチした各種ｃａｔｃｈクローズ、ｃａｔｃｈクローズボディーコード及び当該プロシージャのためのクリーンアップアクションのためのコードを指し示すテーブルから構成される。ｃａｔｃｈクローズマッチング、ｃａｔｃｈクローズボディー及びクリーンアップアクションを実現する上記コード部分は、ランディングパッド（ｌａｎｄｉｎｇ  ｐａｄ）と呼ばれる。これらのテーブルのレイアウトは、Ｃ＋＋コンパイラによって決定される。パーソナリティルーチンもまた、Ｃ＋＋言語だけでなく、プログラムのバイナリバージョンを生成するのに使用される特定のＣ＋＋コンパイラに固有なものである。なぜなら、コンパイラはＬＳＤＡのテーブルのレイアウトを理解する必要があるためである。
【００１７】
図２は、図示された実施例のＬＳＤＡのフォーマットを示す。スタート（Ｓｔａｒｔ）２２４、ベース（Ｂａｓｅ）２２６及びコールサイトサイズ（Ｃａｌｌ  Ｓｉｔｅ  Ｓｉｚｅ）２２８は、ヘッダフィールドである。スタートは、ランディングパッドのアドレスがそれに対して指定可能なスタートアドレスである。ベースは、タイプテーブル（後述される）のエンドに対するオフセットである。コールサイトサイズは、バイトによるテーブルのサイズである。
【００１８】
ヘッダフィールドは、コールサイトテーブルに続く。一般に、コンパイラは、ｔｈｒｏｗステートメントをＣ＋＋ランタイムシステムに対するプロシージャコールに変換する。このような各コールは、コールサイトテーブルのコールサイトによって処理される（２３０）。各コールサイトは、ランディングパッドに対する任意的なポインタとアクションテーブルに対するポインタに関連付けされる（２３２）。アクションテーブルは、アクションレコードに格納されるｃａｔｃｈクローズに対するタイプ情報を有する。当該情報は、ランタイムにおけるｔｈｒｏｗのためのマッチを検出するのに利用される（２３４）。
【００１９】
以上において、図１のフローチャートを参照することにより、一実施例による例外処理を含むアンワインド処理に関するポストリンク情報１３０が説明された。当該実施例について説明された構成は、アンワインド処理のための言語独立又は言語及びコンパイラ固有情報を表す唯一の方法ではない。当該技術分野において知られるようなリスト、テーブル、ハッシュデータアレイなどの他の構成もまた利用可能である。他の実施例では、データの構成及びフィールドは可変である。いくつかの実施例では、特定のデータは省略されてもよい。例えば、コールサイトテーブルに対するベースアドレスは、プロシージャスタートアドレスと同じものと仮定されてもよい。
【００２０】
次に、図１の１０５〜１１５に示される処理の解析及び最適化フェーズが、より詳細に検討される。これらのフェーズは、入力プログラムからのアンワインド情報を処理し、プログラム最適化時にそれを変換し、出力される最適化されたプログラムに対して当該情報を再生成する。
【００２１】
・アンワインド情報の読み込み
一実施例では、図２に示されるようなアンワインド情報が、図１の１０５において、ポストリンク最適化装置の最適化前処理フェーズによって読み込まれ、解釈される。最適化装置は、アンワインド及びアンワインド情報セクションを含むプログラムの入力バイナリバージョンのすべてのアンワインド及びアンワインド情報セクションを読み込む。それは、プログラムの命令及びプロシージャに対する内部表現を生成する。最適化装置は、パーソナリティルーチンから入力プログラムを生成するのに利用されるコンパイラを決定している。その後、最適化装置は、アンワインドテーブルを探索する。図２の２０２〜２０６のようにプロシージャを表す各アンワインドテーブルエントリに対して、当該実施例は、２１０、２１４及び２１５におけるアンワインド情報セクションへのポインタに従い、２１６〜２２２に示されるものと同様のアンワインド情報レコードの解釈を開始する。あるプロシージャに対してＬＳＤＡが存在する場合、最適化装置は、ＬＳＤＡを生成するのに利用されるコンパイラに固有のフォーマットを用いてＬＳＤＡを解釈する。上述されたように、これらのレコードは、プロシージャにおけるアンワインド領域によってグループ化される。各領域に対して、命令スロットにおける当該領域の長さを含むアンワインド状態データ構造と、プロシージャレジスタに対するより小さなアンワインドデータ構造シーケンスが生成される。レジスタに対するアンワインドデータ構造は、当該レジスタがどこからリストアされるべきか（例えば、アクティベーションレコード又は他のレジスタからなど）、その指定が有効となるとき（例えば、アンワインド領域に対する何れの命令スロット番号においてなど）を指定する。
【００２２】
・プログラム表現のデコレート処理
次に、図１の１１０において、命令、ベーシックブロック（直線のコントロールフローによるシーケンシャルな命令グループ）及びプロシージャなどに対する各種プログラムコンポーネントの内部表現が生成される。上述した方法によりアンワインド情報を解釈した後、当該実施例は、与えられたプロシージャにおける各種アンワインド領域に対するアンワインド状態レコードのシーケンスを生成する。その後、それはこれらのアンワインド状態レコードを当該プロシージャに対応する表現に添付する。その後、最適化装置は、ＬＳＤＡからの復号化されたコールサイトテーブルを利用して、各プロシージャに対する復号化されたタイプテーブルと復号化されたアクションテーブルを生成する。それは、これらのテーブルをプロシージャの表現に添付する。次に、本実施例による最適化装置は、アンワインド状態レコードを照会しながら、ベーシックブロック及び命令を訪れる各プロシージャの表現を探索する。アンワインド状態レコードのレジスタに対するｗｈｅｎフィールドが、与えられた命令に対応するスロットを指し示す場合、最適化装置は、当該命令にその事実を符号化する特別なアンワインド属性を添付する。最適化装置は、訪れたベーシックブロック又は命令にランディングパッドが存在するかチェックするため、復号化されたコールサイトテーブルを照会し、そうである場合、最適化装置は、コールサイトと現在訪れているベーシックブロック又は命令との間の関係をそれの内部表現に追加する。この処理の後、当該表現のプロシージャにおけるいくつかの命令は、１１０においてアンワインド属性によりデコレートされる。最適化装置はまた、アンワインド領域がベーシックブロック境界において開始及び終了することを保証し、各ベーシックブロックを「プロローグ」又は「ボディー」としてマークする。
【００２３】
当該フェーズ後、本実施例の最適化装置は、プログラムのそれの表現に基づき、プログラムの何れかの命令に対するアンワインドルールを生成することが可能である。このルールは、命令を介しプロシージャの始めからのすべてのアンワインド状態レコードの効果を含むアンワインド状態レコードを符号化する。ある命令に対するアンワインドルールは、当該命令におけるエンクロージング（ｅｎｃｌｏｓｉｎｇ）プロシージャからのアンワインド方法を示す。
【００２４】
・最適化の実行
最適化装置は、次に以下のアンワインド関連の検討によるプロシージャ及び命令に対する各種最適化を実行するかもしれない（１１５）。
ｉ．アンワインド属性による命令は、削除されない。それが複製される必要がある場合、アンワインド属性もまた複製される。
ｉｉ．ランディングパッドベーシックブロックに関連するコールサイトによるベーシックブロックは、削除されない。
ｉｉｉ．コールサイトによるベーシックブロックが複製される場合、それとランディングパッドとの関係がまた、最適化装置の表現に複製される。
ｉｖ．異なる領域タイプ（例えば、プロローグとボディーなど）のベーシックブロックにおいて、命令移動は許可されない。
ｖ．プロシージャが不連続なコードセグメントにスピリット又は分割されると、新たな部分（チャイルドと呼ばれる）が、もとのプロシージャ（ペアレントと呼ばれる）のスピリットポイントにおける命令に対するアンワインドルールに対応する復号化されたタイプテーブルと復号化されたアクションテーブルと共に、アンワインド状態レコードを承継する。
【００２５】
・アンワインド情報の再生成
最適化中、アンワインド領域の命令は移動されるかもしれず、このため、アンワインド状態の各種レジスタのｗｈｅｎフィールドは、正確でないかもしれない。さらに、アンワインド領域は、縮小又は拡大されているかもしれず、これにより、アンワインド状態に記録されるようなそれらの長さは、変更の必要がある。最適化装置がタイプ情報を削除しないため、タイプテーブルが有効なままであるが、もとのコールサイトテーブルがもはや正確なものとならないように、コールサイト及びランディングパッドは移動されるかもしれない。最適化装置は、ｗｈｅｎフィールド及びアンワインド領域長フィールドを調整するすべてのプロシージャのすべてのアンワインド領域に対するアンワインド状態レコードを処理する。プログラムの最適化されたバージョンのコールサイトテーブルが、プロシージャのコールサイトを有するすべてのベーシックブロックを探索し、何れか関連するランディングパッドを検索することによって生成される。このとき、最適化されたプロシージャに対する新たなコールサイトテーブルが生成されるかもしれない。分割プロシージャのチャイルド部分は、特別な方法により処理される。すなわち、それのペアレントから承継したアンワインド状態レコードのコピーが、ゼロの長さを有するものとしてマークされる。ゼロの長さのプロローグを有することは、アンワインド情報の各種レジスタに対するｗｈｅｎフィールドがプロシージャの始めを指し示すことを意味する。復号化されたタイプ及びアクションテーブルのコピーが、ペアレントのタイプ及びアクションテーブルに基づき、当該チャイルドに対して生成される。
【００２６】
分割プロシージャのチャイルド部分に対するコールサイトテーブルを生成することは、ＬＳＤＡによるコールサイトテーブルのランディングパッドフィールドがベース値（ＬＳＤＡヘッダに符号化される図２の２２６）からのオフセットとして記述される場合に問題を発生させるかもしれない。なぜなら、一般に、このオフセットは正であると仮定されるためである。最適化前処理プロシージャに対して、スタートアドレスの値は、プロシージャのスタートアドレスに一致する。しかしながら最適化後、最適化により分割されるプロシージャのチャイルドのコールサイトを有する与えられたベーシックブロックに対して、ランディングパッドはペアレントに維持されるかもしれない。このため、ランディングパッドのベースオフセットは、分割されたプロシージャの相対的配置に応じて負となる可能性がある。この問題に対する１つの解決手段は、符号なしの数として負のオフセットを表すことである。パーソナリティルーチンが負のオフセットを読み込むと、それはそれを大きな正の数として解釈する。この大きな正の数を用いて実行されるアドレス計算は、当該技術分野において知られるようなラップアラウンド効果（ｗｒａｐ−ａｒｏｕｎｄ  ｅｆｆｅｃｔ）による正しい最終的なアドレスを生成する。
【００２７】
その後、最適化装置は、図１の１２０において、各種プロシージャに対する変更されたアンワインド状態レコードを用いて、出力プログラム１３５にアンワインドテーブルとアンワインド情報レコードを書き込む。
【００２８】
マシーンによってアクセスされると、請求される主題に従ってマシーンに処理を実行させるデータを格納したマシーン可読媒体を有するコンピュータプログラムプロダクトとしていくつかの実施例を提供することが可能である。このマシーン可読媒体には、以下に限定するものではないが、フロッピー（登録商標）ディスケット、光ディスク、ＤＶＤ−ＲＯＭディスク、ＤＶＤ−ＲＡＭディスク、ＤＶＤ−ＲＷディスク、ＤＶＤ＋ＲＷディスク、ＣＤ−Ｒディスク、ＣＤ−ＲＷディスク、ＣＤ−ＲＯＭディスク、光磁気ディスク、ＲＯＭ、ＲＡＭ、ＥＰＲＯＭ、ＥＥＰＲＯＭ、磁気又は光カード、フラッシュメモリ、又は電子命令を格納するのに適した他のタイプのメディア／マシーン可読媒体が含まれるかもしれない。さらに、当該プログラムが通信リンク（モデム又はネットワーク接続など）を介し搬送波又は他の伝搬媒体に実現されるデータ信号を介しリモートコンピュータから要求元コンピュータに転送可能なコンピュータプログラムプロダクトとして、いくつかの実施例がダウンロード可能である。
【００２９】
本方法の多くは、それらの最も基本的な形式により記載されているが、請求される主題の基本的範囲から逸脱することなく、これらの方法の何れかに対してステップの追加又は削除が可能であり、記載されたメッセージの何れかに対する情報の追加又は削除が可能である。さらなる多数の変更及び調整が可能であるということは、当業者に明らかであろう。上記実施例は、本発明を限定するためのものではなく、例示するために与えられている。請求された主題の範囲は、上述された具体例によってではなく、以下の請求項によってのみ決定されるべきものである。
【図面の簡単な説明】
【００３０】
【図１】図１は、一実施例による処理のハイレベルなフローチャートである。
【図２】図２は、一実施例によるアンワインド情報のデータレイアウトである。
【図１】
2008505423.tif 000003
【図２】
2008505423.tif 000004
【国際調査報告】
2008505423.tif 000005
2008505423.tif 000006
2008505423.tif 000007