(57)【要約】【課題】  プログラム内の動的関数呼出しにかかるコールペア情報を収集する際の計算量と使用メモリ量とを削減する。【解決手段】  静的ソース解析部１０は、ソースプログラム蓄積部５内のプログラムを静的に解析し、動的呼出し側関数及び動的呼出され側関数を洗い出し、各関数に識別ラベルを付与する。動的呼出しプロファイル処理呼出し処理挿入部１９は、動的呼出しプロファイル処理を含むプロファイル処理入りソースプログラムを生成する。リンク部４１は、動的呼出し側関数と動的呼出され側関数との組み合わせに対応する動的コールペア情報格納テーブルの領域を確保する処理と識別ラベルのセクション処理とプロファイル処理入りソースプログラムとをリンクする。モジュール実行部４３は、コンパイルして実行し、動的コールペア情報格納テーブルに動的な呼出しにかかるコールペア毎の呼出し回数を収集する。【選択図】図１
2006202134.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの実行中にプロファイル情報を収集するプロファイル情報収集装置において、
ソースプログラムを静的に解析して動的な呼出しによって他の関数を呼出す可能性のある動的呼出し側関数および他の関数から呼出される可能性のある動的呼出され側関数をそれぞれ洗い出す解析部と、
前記ソースプログラムに、洗い出された前記動的呼出し側関数および前記動的呼出され側関数を識別するための識別ラベルを宣言する関数ラベルセクションを設定する処理を挿入する動的セクション挿入部と、
前記ソースプログラムに、洗い出された前記動的呼出し側関数の識別ラベルを記憶するためのアドレスを該当する関数の前に付与する動的アドレス挿入部と、
前記ソースプログラムに、動的な呼出しによって他の関数を呼出す処理毎に動的プロファイル処理を挿入する動的呼出し処理挿入部と、
前記ソースプログラムに、洗い出された前記動的呼出し側関数と前記動的呼出され側関数との組み合わせである動的コールペア毎にその動的コールペアの呼出し回数を格納する動的コールペア情報格納テーブルの領域を設定する処理を挿入する動的呼出しコールペア情報格納セクション処理部と、
前記動的セクション挿入部、前記動的アドレス挿入部、前記動的呼出し処理挿入部、および前記動的呼出しコールペア情報格納セクション処理部によって処理情報が挿入済みのソースプログラムをコンパイルして実行したときに前記動的プロファイル処理があったとき、当該動的な呼出しにかかる動的呼出し側関数の識別ラベルに対応するアドレスと動的呼出され側関数の識別ラベルに対応するアドレスとに基づいて前記動的コールペア情報格納テーブル中の該当エントリのアドレスを算出し、算出されたアドレスで示される記憶内容である呼出し回数をインクリメントする実行部と、
を備えることを特徴とするプロファイル情報収集装置。
【請求項２】
前記動的プロファイル処理は、前記動的関数呼出し部を識別するための前記動的関数呼出し識別ラベルのアドレスと呼出し側関数のアドレスとを引数に持つ動的呼出しプロファイル処理関数呼出しコードで表されることを特徴とする請求項１記載のプロファイル情報収集装置。
【請求項３】
前記実行部は、前記動的呼出し側関数の関数ラベルセクションにおける先頭アドレスから前記動的な呼出しにかかる動的呼出し側関数の識別ラベルに対応するアドレスへの差分と、前記動的呼出され側関数の関数ラベルセクションの大きさとの積に、前記動的呼出され側関数の関数ラベルセクションにおける先頭アドレスから前記動的な呼出しにかかる動的呼出され側関数の識別ラベルに対応するアドレスへの差分を加算して該当エントリのアドレスとすることを特徴とする請求項１記載のプロファイル情報収集装置。
【請求項４】
前記動的コールペア情報格納テーブルの領域は、前記動的呼出し側関数の総数と前記動的呼出され側関数の総数との積の大きさに設定されることを特徴とする請求項１記載のプロファイル情報収集装置。
【請求項５】
前記解析部は、ソースプログラムを静的に解析して静的な呼出しによって他の関数を呼出す可能性のある静的呼出し側関数を洗い出す機能をさらに含み、
前記ソースプログラムに、洗い出された前記静的呼出し側関数を識別するための識別ラベルを宣言する静的関数ラベルセクションを設定する処理を挿入する静的セクション挿入部と、
前記ソースプログラムに、洗い出された前記静的呼出し側関数の識別ラベルを記憶するためのアドレスを該当する関数の前に付与する静的アドレス挿入部と、
前記ソースプログラムに、静的な呼出しによって他の関数を呼出す処理毎に静的プロファイル処理を挿入する静的呼出し処理挿入部と、
前記ソースプログラムに、洗い出された前記静的呼出し側関数毎に静的コールペアの呼出し回数を格納する静的コールペア情報格納テーブルの領域を設定する処理を挿入する静的呼出しコールペア情報格納セクション処理部と、をさらに備え、
前記実行部は、前記静的セクション挿入部、前記静的アドレス挿入部、前記静的呼出し処理挿入部、および前記静的呼出しコールペア情報格納セクション処理部によって処理情報挿入済みのソースプログラムをコンパイルして実行したときに前記静的プロファイル処理があったとき、当該静的な呼出しにかかる静的呼出し側関数の識別ラベルに対応するアドレスに基づいて前記静的コールペア情報格納テーブル中の該当エントリのアドレスで示される記憶内容である呼出し回数をインクリメントすることをさらに実行することを特徴とする請求項１記載のプロファイル情報収集装置。
【請求項６】
プロファイル情報収集装置がプログラムの実行中にプロファイル情報を収集する方法であって、
（ａ）ソースプログラムを静的に解析して動的な呼出しによって他の関数を呼出す可能性のある動的呼出し側関数および他の関数から呼出される可能性のある動的呼出され側関数をそれぞれ洗い出すステップと、
（ｂ）前記ソースプログラムに、洗い出された前記動的呼出し側関数および前記動的呼出され側関数を識別するための識別ラベルを宣言する関数ラベルセクションを設定する処理を挿入するステップと、
（ｃ）前記ソースプログラムに、洗い出された前記動的呼出し側関数の識別ラベルを記憶するためのアドレスを該当する関数の前に付与するステップと、
（ｄ）前記ソースプログラムに、動的な呼出しによって他の関数を呼出す処理毎に動的プロファイル処理を挿入するステップと、
（ｅ）前記ソースプログラムに、洗い出された前記動的呼出し側関数と前記動的呼出され側関数との組み合わせである動的コールペア毎にその動的コールペアの呼出し回数を格納する動的コールペア情報格納テーブルの領域を設定する処理を挿入するステップと、
（ｆ）前記（ｂ）、（ｃ）、（ｄ）、（ｅ）の各ステップによって処理情報が挿入されたソースプログラムをコンパイルして実行したときに前記動的プロファイル処理があったとき、当該動的な呼出しにかかる動的呼出し側関数の識別ラベルに対応するアドレスと動的呼出され側関数の識別ラベルに対応するアドレスとに基づいて前記動的コールペア情報格納テーブル中の該当エントリのアドレスを算出し、算出されたアドレスで示される記憶内容である呼出し回数をインクリメントするステップと、
を含むことを特徴とするプロファイル情報収集方法。
【請求項７】
前記動的プロファイル処理は、前記動的関数呼出し部を識別するための前記動的関数呼出し識別ラベルのアドレスと呼出し側関数のアドレスとを引数に持つ動的呼出しプロファイル処理関数呼出しコードで表されることを特徴とする請求項６記載のプロファイル情報収集方法。
【請求項８】
前記呼出し回数をインクリメントするステップは、前記動的呼出し側関数の関数ラベルセクションにおける先頭アドレスから前記動的な呼出しにかかる動的呼出し側関数の識別ラベルに対応するアドレスへの差分と、前記動的呼出され側関数の関数ラベルセクションの大きさとの積に、前記動的呼出され側関数の関数ラベルセクションにおける先頭アドレスから前記動的な呼出しにかかる動的呼出され側関数の識別ラベルに対応するアドレスへの差分を加算して該当エントリのアドレスを算出することを特徴とする請求項６記載のプロファイル情報収集方法。
【請求項９】
（ｇ）前記ソースプログラムを静的に解析して静的な呼出しによって他の関数を呼出す可能性のある静的呼出し側関数を洗い出すステップと、
（ｈ）前記ソースプログラムに、洗い出された前記静的呼出し側関数を識別するための識別ラベルを宣言する関数ラベルセクションを設定する処理を挿入するステップと、
（ｉ）前記ソースプログラムに、洗い出された前記静的呼出し側関数の識別ラベルを記憶するためのアドレスを該当する関数の前に付与するステップと、
（ｊ）前記ソースプログラムに、静的な呼出しによって他の関数を呼出す処理毎に静的プロファイル処理を挿入するステップと、
（ｋ）前記ソースプログラムに、洗い出された前記静的呼出し側関数毎に静的コールペアの呼出し回数を格納する静的コールペア情報格納テーブルの領域を設定する処理を挿入するステップと、
（ｌ）前記（ｈ）、（ｉ）、（ｊ）、（ｋ）の各ステップによって処理情報が挿入されたソースプログラムをコンパイルして実行したときに前記静的プロファイル処理があったとき、当該静的な呼出しにかかる静的呼出し側関数の識別ラベルに対応するアドレスに基づいて前記静的コールペア情報格納テーブル中の該当エントリのアドレスで示される記憶内容である呼出し回数をインクリメントするステップと、
をさらに含むを特徴とする請求項６記載のプロファイル情報収集方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロファイル情報収集方法および装置に関し、特にプログラムの性能測定におけるプロファイル情報の収集方法および装置に関する。
【０００２】
なお、本明細書において、ソースプログラム中で明示的に関数を指定して呼出すことを、静的な関数呼出しという。これに対して、関数へのポインタ（開始アドレス）を変数に格納し、変数を介してその関数を呼出すことを、動的な関数呼出しといい、動的な関数呼出しにおいて、呼び出す方の関数を動的呼び出し側関数、呼び出される方の関数を動的呼び出され側関数という。
【背景技術】
【０００３】
プログラムの実行性能の向上を図る上で、プロファイル情報によってそのプログラムの挙動を把握することはきわめて有効である。プロファイル情報は、プログラム実行時に、動的にその特定部分の実行回数、実行時間、分岐情報などを計測し収集したものである。このようにして得られるプロファイル情報は、プログラムの解析情報として使用され、主に実行速度向上などの最適化が、解析情報をもとに行われる。プロファイル情報は、プログラム固有の最適化を可能にする有用性の高い情報であり、プログラム内の呼出し側関数／呼出され側関数の呼出し頻度を示すコールペア情報は、このようなプロファイル情報の一つである。
【０００４】
このようなコールペア情報に関し、プログラム内の動的関数呼出しにかかるコールペア情報を収集する際に必要な、コールペア情報を格納するテーブルのサイズを縮小するプロファイル情報収集装置が特許文献１に開示されている。このプロファイル情報収集装置は、ソースプログラムを静的に解析して動的呼出し側関数および動的呼出され側関数をそれぞれ洗い出し、動的コールペア情報格納テーブルとしては、洗い出した動的呼出し側関数と動的呼出され側関数の組み合わせ分のエントリを持つテーブルを持つ。この場合、コールペア識別番号インデックステーブル、呼出し側関数インデックステーブル及び呼出され側関数インデックステーブルを介在させ、コールペア情報格納テーブル中の該当するアドレスをアクセスしている。
【０００５】
特許文献１のプロファイル情報収集装置において、具体的には、ソースプログラムに静的呼出しプロファイル処理関数のコードが挿入される。この静的呼出しプロファイル処理関数は、引数としてコールペア仮識別番号を受け取り、図２１に示すように、コールペア識別番号インデックステーブルを参照してコールペア仮識別番号をコールペア識別番号に変換する（ステップＳ１６１）。そして、このコールペア識別番号を静的コールペア情報格納テーブルのインデックスとして該当エントリの値を１増加する処理（ステップＳ１６２）を行う。
【０００６】
また、ソースプログラムに動的呼出しプロファイル処理関数のコードが挿入される。この動的呼出しプロファイル処理関数は、引数として呼出し側関数の関数仮ＩＤと動的呼出しに使う変数（少なくとも実行時点で呼出し側関数の開始アドレスが入る）とを受け取り、図２２に示すように、引数の変数が示す呼出し側関数の開始アドレスの直前を読み込んで、呼出され側関数の関数仮ＩＤを取得する（ステップＳ１９１）。そして、呼出され側関数インデックステーブルを参照して、呼出され側関数の関数仮ＩＤから関数ＩＤを取得する（ステップＳ１９２）。また、同様な呼出し側関数インデックステーブルを参照して、呼出し側関数の関数仮ＩＤから関数ＩＤを取得し（ステップＳ１９３）、呼出し側関数の関数ＩＤと呼出され側関数の関数ＩＤとを動的コールペア情報格納テーブルのインデックスとし、該当エントリの値を１増加させる処理（ステップＳ１９４）を行う。
【０００７】
以下、簡単なソースプログラム（ユーザ＋ライブラリ）を例として取り上げ、プロファイル情報収集について説明する。まず、図２３に示すようなシステムライブラリソースがあった場合、２、３、１１、１５、２０行目の静的なコールペアが検出され、図２４に示すようなシステムライブラリ用コールペア仮識別番号データベースが登録される。また、図２３の４、５、６行目の動的に呼出される可能性のある関数が検出され、図２５に示すようなシステムライブラリ用動的呼出され側関数仮識別番号データベースが登録される。さらに、図２３の７、１６、２１行目の動的呼び出しを行なっている関数を検出し、図２６に示すようなシステムライブラリ用動的呼出し側関数仮識別番号データベースが登録される。
【０００８】
先に説明した図２１、図２２のプロファイル処理関数を用意し、プロファイル処理関数を呼び出すために、図２３に対し、図２７の２、４、９、１４、１９、２１、２６、２８行目に示すような情報収集用コードを挿入する。そして、プロファイル用の情報収集用コードを挿入したシステムライブラリソースをコンパイルし、情報収集用のシステムライブラリを生成する。
【０００９】
次に、図２８のようなユーザプログラムのソースがあった場合、２、３、１１、１５、２０行目の静的なコールペアが検出され、図２９に示すようなコールペア仮識別番号データベースが登録される。また、図２８の４、５、６行目にあるような動的に呼出される可能性のある関数が検出され、図３０のように動的に呼出され側関数仮識別番号データベースが登録される。さらに、図２８の７、１６、２１行目にあるような動的呼び出しを行なっている関数を検出し、図３１のような動的呼出し側関数仮識別番号データベースが登録される。
【００１０】
また、図２４のデータベースから図２９のデータベースに関係するコールペアのみを抽出し、図３２のようなコールペア仮識別番号データベースが登録される。そして、図３２のコールペア仮識別番号データベースに対して識別番号を振り、図３３に示すような仮識別番号と識別番号を対応させるコールペア識別番号インデックステーブルを作成する。
【００１１】
さらに、図２５のデータベースを図３０のデータベースに追加し、図３４に示すような動的呼出し側関数仮識別番号データベースが登録される。図３４の動的呼出し側関数仮識別番号データベースに識別番号を振り、図３５に示すような仮識別番号と識別番号を対応させる動的呼出し側関数識別番号インデックステーブルを作成する。
【００１２】
また、図２６のデータベースから図３２に関係するコールペアを図３１のデータベースに追加し、図３６に示すような動的呼出され側関数仮識別番号データベースを作成する。図３６の動的呼出され側関数仮識別番号データベースに識別番号を振り、図３７のような仮識別番号と識別番号を対応させる動的呼出され側関数識別番号インデックステーブルを作成する。
【００１３】
さらに、静的コールペアの情報収集データ格納用のメモリを、図３３のコールペア識別番号インデックステーブルの識別番号分確保する。
【００１４】
また、動的コールペアの情報収集データ格納用のメモリを、図３８に示すように、図３５の動的呼出し側関数仮識別番号データベースのサイズと、図３７の動的呼出され側関数仮識別番号データベースのサイズとの積の大きさ分を確保する。
【００１５】
先に説明した図２１、図２２のプロファイル処理関数を用意し、図２８に対し、図３９の２、４、９、１４、１９、２１、２６、２８行目に示すように情報収集用コードを挿入する。情報収集用コードが挿入されたソースファイルをコンパイル・リンクしてモジュールを生成・実行する。実行の結果、図４０に示す静的呼出しコールペア情報格納領域、図４１に示す動的呼出しコールペア情報格納領域に対して、情報収集用コードによって収集されたデータ、各関数の実行回数が蓄えられる。この蓄えられた情報がプロファイル情報に当たる。
【００１６】
【特許文献１】特開２００２−１３２５４２号公報  （図２０、図２３）
【発明の開示】
【発明が解決しようとする課題】
【００１７】
一般に、プログラムの性能解析や挙動の確認、把握を行なう際に重要な点（顧客の要望する点）として、取得した情報が正確であることが挙げられる。当然であるが、取得した情報が正確でなければ、目的の「プログラムの性能解析や挙動の確認、把握」を達成することができない。「プログラムの性能解析や挙動の確認、把握」で最も正確さが求められる情報とは、プログラムの実行時間と、プログラムの挙動である。実行時間を正確にするには、情報収集における処理をなるべく時間の掛らないものにする必要がある。また、情報収集における処理をなるべく時間の掛らないものにすることによって、プログラムの挙動を正確にすることにもつながる。なぜならば、プログラムの挙動が変る最も大きな要因として、情報収集用のコード挿入による、プログラム内の各スレッドの処理タイミングや、外部装置（あるいはプログラム）との通信のタイミングのずれの影響が挙げられるが、これらは、情報収集における処理をなるべく時間の掛らないものにすることによって、軽減されるからである。すなわち、情報収集時の処理の計算量は、なるべく少ないことが望ましい。
【００１８】
ところで、特許文献１に記載の装置では、情報収集における処理の計算量（オーバーヘッド）が大きいと言うことが挙げられる。この装置では、情報収集（検索）にあたり、図２１の静的呼出しプロファイル処理および図２２の動的呼出しプロファイル処理においてインデックステーブルを参照するアルゴリズムが必要とされる。すなわち、ソースプログラムを静的に解析して得られた仮識別番号あるいは仮関数ＩＤから、情報収集における処理（静的呼出しプロファイル処理、動的呼出しプロファイル処理）で参照される識別番号あるいは関数ＩＤを求めるために対応付けを記述したインデックステーブルを用いている。
【００１９】
特に、動的呼出しプロファイル処理において、動的呼出し側関数インデックステーブル、動的呼出され側関数インデックステーブルが参照され、情報収集に必要な計算量は、対応付けを求めるために、これらインデックステーブルの大きさに比例することになる。各インデックステーブルの大きさは、動的呼出し側関数、動的呼出され側関数の数に比例するので、これら関数の数が増えると情報収集における計算量（オーバーヘッド）が著しく増加してしまう。
【００２０】
この場合の検索に必要な平均計算量は、インデックステーブルの大きさをＮ（Ｎは自然数）とした場合、Ｏ（Ｎ／２）となる。なお、コールペア識別番号インデックステーブルが仮識別番号でソートされていると仮定すれば、２分検索を行なうことで、平均計算量をＯ（ｌｏｇＮ）に削減することができる。コールペア識別番号インデックステーブルの大きさは、解析するコールペアの数に比例するので、解析するコールペアが増えると、情報収集のオーバーヘッドが無視できないものとなってしまう。ここで、Ｏ記法とは、漸近的計算量がこれより大きくなることはない限界を示すものであって、例えば、あるアルゴリズムの計算時間が、Ｎが大きくなった時にＮに比例する場合にＯ（Ｎ）、ｌｏｇＮに比例する場合にＯ（ｌｏｇＮ）というように表す。
【課題を解決するための手段】
【００２１】
前記課題を解決するために、本発明者は、情報収集時のアドレスアクセスにおいて、事前に該当する関数に関数を識別するための識別ラベルを付与することによって、従来技術におけるインデックステーブルを用いなくとも済むことに着目し、本発明を創案するに至った。
【００２２】
本発明の一つのアスペクトに係るプロファイル情報収集装置は、プログラムの実行中にプロファイル情報を収集するプロファイル情報収集装置である。この装置は、ソースプログラムを静的に解析して動的な呼出しによって他の関数を呼出す可能性のある動的呼出し側関数および他の関数から呼出される可能性のある動的呼出され側関数をそれぞれ洗い出す解析部と、前記ソースプログラムに、洗い出された前記動的呼出し側関数および前記動的呼出され側関数を識別するための識別ラベルを宣言する関数ラベルセクションを設定する処理を挿入する動的セクション挿入部と、前記ソースプログラムに、洗い出された前記動的呼出し側関数の識別ラベルを記憶するためのアドレスを該当する関数の前に付与する動的アドレス挿入部と、前記ソースプログラムに、動的な呼出しによって他の関数を呼出す処理毎に動的プロファイル処理を挿入する動的呼出し処理挿入部と、前記ソースプログラムに、洗い出された前記動的呼出し側関数と前記動的呼出され側関数との組み合わせである動的コールペア毎にその動的コールペアの呼出し回数を格納する動的コールペア情報格納テーブルの領域を設定する処理を挿入する動的呼出しコールペア情報格納セクション処理部と、前記動的セクション挿入部、前記動的アドレス挿入部、前記動的呼出し処理挿入部、および前記動的呼出しコールペア情報格納セクション処理部によって処理情報が挿入済みのソースプログラムをコンパイルして実行したときに前記動的プロファイル処理があったとき、当該動的な呼出しにかかる動的呼出し側関数の識別ラベルに対応するアドレスと動的呼出され側関数の識別ラベルに対応するアドレスとに基づいて前記動的コールペア情報格納テーブル中の該当エントリのアドレスを算出し、算出されたアドレスで示される記憶内容である呼出し回数をインクリメントする実行部と、を備える。
【００２３】
本発明の一つのアスペクトに係るプロファイル情報収集方法は、プロファイル情報収集装置がプログラムの実行中にプロファイル情報を収集する方法である。この方法は、（ａ）ソースプログラムを静的に解析して動的な呼出しによって他の関数を呼出す可能性のある動的呼出し側関数および他の関数から呼出される可能性のある動的呼出され側関数をそれぞれ洗い出すステップと、（ｂ）前記ソースプログラムに、洗い出された前記動的呼出し側関数および前記動的呼出され側関数を識別するための識別ラベルを宣言する関数ラベルセクションを設定する処理を挿入するステップと、（ｃ）前記ソースプログラムに、洗い出された前記動的呼出し側関数の識別ラベルを記憶するためのアドレスを該当する関数の前に付与するステップと、（ｄ）前記ソースプログラムに、動的な呼出しによって他の関数を呼出す処理毎に動的プロファイル処理を挿入するステップと、（ｅ）前記ソースプログラムに、洗い出された前記動的呼出し側関数と前記動的呼出され側関数との組み合わせである動的コールペア毎にその動的コールペアの呼出し回数を格納する動的コールペア情報格納テーブルの領域を設定する処理を挿入するステップと、（ｆ）前記（ｂ）、（ｃ）、（ｄ）、（ｅ）の各ステップによって処理情報が挿入されたソースプログラムをコンパイルして実行したときに前記動的プロファイル処理があったとき、当該動的な呼出しにかかる動的呼出し側関数の識別ラベルに対応するアドレスと動的呼出され側関数の識別ラベルに対応するアドレスとに基づいて前記動的コールペア情報格納テーブル中の該当エントリのアドレスを算出し、算出されたアドレスで示される記憶内容である呼出し回数をインクリメントするステップと、を含む。
【発明の効果】
【００２４】
本発明によれば、事前にプロファイル情報格納場所にラベル付けすることにより、プロファイル情報の格納場所決定時にインデックステーブルの検索を行なわずに済む。したがって、簡単な演算を行うだけで格納場所を決定することができ、情報収集に伴うオーバーヘッドが少なくて済む。
【発明を実施するための最良の形態】
【００２５】
本発明の実施形態に係るプロファイル情報収集装置は、ソースプログラム蓄積部（図１の５）に蓄えられているソースプログラムを静的に解析して動的な呼出しによって他の関数を呼出す可能性のある動的呼出し側関数および他の関数から呼出される可能性のある動的呼出され側関数をそれぞれ洗い出す静的ソース解析部（図１の１０）を備える。静的ソース解析部は、ソースプログラムに、洗い出された動的呼出し側関数および動的呼出され側関数を識別するための識別ラベルを宣言する関数ラベルセクションを設定する処理を挿入する。また、ソースプログラムに、洗い出された動的呼出し側関数の識別ラベルを記憶するためのアドレスを該当する関数の前に付与する。さらに、ソースプログラムに、動的な呼出しによって他の関数を呼出す処理毎に動的プロファイル処理を挿入する。また、動的呼出しコールペア情報格納セクション処理部（図１の３８）は、ソースプログラムに、洗い出された動的呼出し側関数と動的呼出され側関数との組み合わせである動的コールペア毎にその動的コールペアの呼出し回数を格納する動的コールペア情報格納テーブルの領域を設定する処理を挿入する。
【００２６】
リンク部（図１の４１）は、動的セクション挿入部、動的アドレス挿入部、動的呼出し処理挿入部、および動的呼出しコールペア情報格納セクション処理部によって処理情報が挿入済みのソースプログラムをリンクする。さらに、モジュール実行部（図１の４３）が、リンクされたプログラムをコンパイルして実行する。この際、ソースプログラム中に動的プロファイル処理があったとき、動的な呼出しにかかる動的呼出し側関数の識別ラベルに対応するアドレスと動的呼出され側関数の識別ラベルに対応するアドレスとに基づいて動的コールペア情報格納テーブル中の該当エントリのアドレスが算出され、算出されたアドレスで示される記憶内容である呼出し回数がインクリメントされる。この様に動作することで、動的コールペア情報格納テーブル中にプロファイル情報が蓄えられる。
【００２７】
以上のような構成のプロファイル情報収集装置は、プログラムの性能解析や挙動の確認、把握のために、プロファイル情報収集対象のプログラムに情報収集用のコードを埋め込み、実行モジュールを作成し、それを実行することでプロファイル情報をユーザに提示する。ユーザは、そのプロファイル情報を解析することでプログラムの動作把握、性能解析や、キャッシュコンフリクトの防止が可能となる。以下、実施例に即して詳しく説明する。
【実施例】
【００２８】
図１は、本発明の実施例に係るプロファイル情報収集装置の構成を示すブロック図である。プロファイル情報収集装置は、ソースプログラム蓄積部５、静的ソース解析部１０、動的関数呼出し識別ラベルデータベース３０、動的呼出され側関数データベース３１、プロファイル処理入りソースプログラム蓄積部３２、関数識別ラベルデータベース（関数識別ラベルＤＢ）３３、静的関数呼出し識別ラベルデータベース３４、プロファイル用ライブラリ蓄積部３５、動的に呼出される可能性関数情報データベース（動的に呼出される可能性関数情報ＤＢ）３６、静的呼出しプロファイル処理関数蓄積部３７、動的呼出しコールペア情報格納セクション処理部３８、動的呼出しプロファイル処理関数蓄積部３９、関数識別ラベルセクション処理部４０、リンク部４１、プロファイル用モジュール蓄積部４２、モジュール実行部４３、プロファイル情報蓄積部４４、プロファイル情報取得部４５、可能性関数処理部４６を備える。また、静的ソース解析部１０は、関数識別ラベル生成部１１、静的関数呼出し識別ラベル生成部１２、動的関数呼出し識別ラベル生成部１３、関数識別ラベルアドレス挿入部１４、関数特定部１５、静的呼出しコールペア情報格納セクション宣言挿入部１６、動的関数呼出し識別ラベルセクション宣言挿入部１７、静的呼出しプロファイル処理呼出し処理挿入部１８、動的呼出しプロファイル処理呼出し処理挿入部１９を備える。
【００２９】
静的ソース解析部１０は、ソースプログラム蓄積部５に蓄えられているユーザソースプログラムおよびライブラリソースプログラムを解析し、動的関数呼出し識別ラベルを生成して動的関数呼出し識別ラベルデータベース３０に蓄え、動的に呼出されている関数を特定し、動的呼出され側関数データベース３１に蓄える。また、ソースプログラムにプロファイル処理を挿入して、プロファイル処理入りソースプログラム蓄積部３２に蓄え、関数識別ラベルを生成して関数識別ラベルデータベース３３に蓄える。さらに、静的関数呼出し識別ラベルを生成して静的関数呼出し識別ラベルデータベース３４に蓄える。
【００３０】
以上のように構成されるプロファイル情報収集装置は、ライブラリソースプログラム、ユーザソースプログラムを入力することで、プロファイル用のライブラリ、あるいはプロファイル情報を出力する。
【００３１】
次にプロファイル情報収集装置の動作について説明する。図２は、本発明の実施例に係るプロファイル情報収集装置の動作を表すフローチャートである。
【００３２】
スタートすると、ステップＳ１１において、ユーザソースプログラム、ライブラリソースプログラムに関係無く、プロファイル用オブジェクトを生成する。なお、ステップＳ１１の詳細については後に述べる。
【００３３】
ステップＳ１２において、可能性関数処理部４６は、ステップＳ１１で生成した関数識別ラベルデータベース３３と動的呼出され側関数データベース３１とから、動的に呼出される可能性関数情報データベース３６を以下の手順にしたがって作成する。
【００３４】
関数識別ラベルデータベース３３に存在する関数識別ラベルで、リンクされるモジュールに含まれている関数識別ラベルについて、以下の（Ａ１）〜（Ａ３）の処理を行なう。
【００３５】
（Ａ−１）関数識別ラベルが、動的呼出され関数データベース３１に存在する場合、動的に呼出される可能性を「あり」として動的に呼出される可能性関数情報データベース３６に追加する。
【００３６】
（Ａ−２）関数識別ラベルが、グローバルな関数で、その関数名が動的呼出され側関数データベース３１に存在する場合、動的に呼出される可能性を「あり」として動的に呼出される可能性関数情報データベース３６に追加する。
【００３７】
（Ａ−３）上記以外の関数識別ラベルを、動的に呼出される可能性を「なし」として動的に呼出される可能性関数情報データベース３６に追加する。
【００３８】
ステップＳ１３において、関数識別ラベルセクション処理部４０は、動的に呼出される可能性関数情報データベース３６の内容を基に、以下の（Ａ）〜（Ｄ）のように関数識別ラベルセクションを作成するソースプログラムを生成してコンパイルし、関数識別ラベルセクション用オブジェクトを生成する（図１３）。
（Ａ）動的に呼出される可能性が「あり」のものと、「なし」のものとで分ける。
（Ｂ）「あり」のものから順にラベルを宣言する。
（Ｃ）なお、各ラベルは１バイトスペースを空ける。
（Ｄ）また、「あり」の先頭ラベルの直前と、「なし」の先頭のラベルの直前とに、先頭であることを示すラベルｄｙｎａｍｉｃＣａｌｌｅｅＴｏｐとｄｙｎａｍｉｃＣａｌｌｅｅＥｎｄとをそれぞれ挿入する。
【００３９】
ステップＳ１４において、動的呼出しコールペア情報格納セクション処理部３８は、動的に呼出される可能性関数情報データベース３６の内容を基に、動的呼出し側関数の総数と動的呼出され側関数の総数との積の大きさの動的呼出しコールペア情報格納領域を、例えば下記（Ａ）〜（Ｃ）のいずれかの方法で生成する。なお、動的呼出され側関数総数は、ステップＳ１３の（Ｄ）で挿入した先頭ラベルのアドレスの差（ｄｙｎａｍｉｃＣａｌｌｅｅＥｎｄ−ｄｙｎａｍｉｃＣａｌｌｅｅＴｏｐ）から取得する。
（Ａ）プログラムの実行開始直後に呼出されるスタートアップルーチンに、動的呼出しコールペア情報格納領域を確保する処理を挿入する。
（Ｂ）動的呼出しプロファイル処理関数蓄積部３９内の動的呼出しプロファイル処理関数が最初に呼ばれた一回だけ、動的呼出しコールペア情報格納領域を確保する処理を挿入する。
（Ｃ）動的呼出し識別ラベルセクションのサイズと動的呼出され側関数の総数との積の大きさの動的呼出しコールペア情報格納領域を宣言するソースを生成してオブジェクトを生成し、実行モジュール生成時にリンクする。
【００４０】
ステップＳ１５において、静的呼出しプロファイル処理関数蓄積部３７と動的呼出しプロファイル処理関数蓄積部３９とにおいてプロファイル処理関数を用意する。
【００４１】
ステップＳ１６において、リンク部４１は、プロファイル処理入りソースプログラム蓄積部３２のユーザソースプログラムとライブラリソースプログラムとに対するプロファイル用オブジェクトと、関数識別ラベルセクション用オブジェクトとをリンクし、プロファイル用モジュールを作成し、プロファイル用モジュール蓄積部４２に蓄える。このリンク時に、リンク部４１は、関数識別ラベル、静的関数呼出し識別ラベル、動的関数呼出し識別ラベルのそれぞれのアドレスを決定する。
【００４２】
ステップＳ１７において、モジュール実行部４３は、プロファイル用モジュール蓄積部４２に蓄えられたプロファイル用モジュールを実行し、プロファイル処理関数によってプロファイルデータを収集し、プロファイル情報蓄積部４４に蓄積する。
【００４３】
ステップＳ１８において、プロファイル情報取得部４５は、プロファイル情報蓄積部４４に蓄積されたデータを以下の（Ａ）、（Ｂ）のように解析することで、プログラムの実行情報を取得する。
【００４４】
（Ａ）プロファイル処理関数によって収集され、静的呼出しコールペア情報格納セクションに格納されているデータには、それぞれ静的関数呼出し識別ラベルが付けられている。その静的関数呼出し識別ラベルを基に、静的関数呼出し識別ラベルデータベース３４の内容を引くことで、そのデータがどの関数のデータなのかを判定する。
【００４５】
（Ｂ）動的呼出しコールペア情報格納セクションには、動的呼出しプロファイル処理関数蓄積部３９内の動的呼出しプロファイル処理関数によって、実行データが格納されているので、各エントリに対応する動的関数呼出し識別ラベルと、呼出され関数の関数識別ラベルとから実行データがどの関数のデータなのかを判定する。
【００４６】
次に、図２のステップＳ１１の詳細について説明する。図３は、ステップＳ１１の詳細を示すフローチャートである。
【００４７】
ステップＳ２１において、関数識別ラベル生成部１１は、プロファイル情報収集対象となるソースプログラム中に関数宣言部を見つけた場合、関数を識別するための関数識別ラベルを関数識別ラベルデータベース３３に登録する。ここで関数識別ラベルは、ソースプログラム蓄積部５の全てのソースプログラムに対して一意になるような名前にする。一意であればどのような名前でも構わない。関数識別ラベルデータベース３３には、プロファイルに必要な情報であり、かつ実行モジュールからは取得不可能である、この関数に関連した情報を登録する。なお、ここでは説明を簡単にするために、関数識別ラベル名は、図５に示すように「文字列"ＦＵＮＣＴＩＯＮ"＋ソースプログラム名＋グローバル・ローカル識別文字＋関数名」とし、関数識別ラベルの他に登録する情報としては、関数名、グローバル・ローカル情報、ソースプログラムパス名とする。
【００４８】
ステップＳ２２において、関数識別ラベルアドレス挿入部１４は、ソースプログラム中の関数の直前に関数識別ラベルのアドレスを挿入する。
【００４９】
ステップＳ２３において、静的ソース解析部１０で静的関数呼出しを見つけた場合、以下の（Ａ）〜（Ｃ）の処理を行なう。
【００５０】
（Ａ）静的関数呼出し識別ラベル生成部１２は、静的関数呼出しを識別するための静的関数呼出し識別ラベルを静的関数呼出し識別ラベルデータベース３４に登録する（図６）。静的関数呼出し識別ラベルは、ソースプログラム蓄積部５の全てのソースプログラムに対して一意になるような名前を自動的につける。一意であればどのような名前でも構わない。なお、ここでは説明を簡単にするために、静的関数呼出し識別ラベル名は、図６に示すように「文字列"ＳＴＡＴＩＣ＿ＣＡＬＬＰＡＩＲ"＋ソースプログラム名＋グローバル・ローカル識別文字＋呼出し側関数名＋文字列"ＴＯ"＋グローバル・ローカル識別文字＋呼出され側関数名」とし、静的関数呼出し識別ラベルの他に登録する情報としては、呼出し側関数識別ラベル、呼出され側関数名、呼出され側関数のグローバル・ローカル情報とする。
【００５１】
（Ｂ）静的呼出しコールペア情報格納セクション宣言挿入部１６は、静的関数呼出しを識別するための静的関数呼出し識別ラベルの、静的呼出しコールペア情報格納セクションへの宣言（図７）をソースプログラムに挿入する。なお、図７における「．ｓｅｃｔｉｏｎ  "．ｓｔａｔｉｃＣａｌｌｐａｉｒＴａｂｌｅ"，  ．ｄａｔａ」は、初期値ありのデータセクションを定義する命令で、「．ｗｏｒｄ  ０」は、初期値が０で、４バイト領域を確保する命令である。ここで指定しているバイト数により、収集できる実行回数の上限値が決定する。４バイト分も必要なければ２バイトや、１バイトにすることもできる。ただし、その場合は、プロファイル処理関数のコードも変更する必要がある。
【００５２】
（Ｃ）静的呼出しプロファイル処理呼出し処理挿入部１８は、静的関数呼出しの直前に、静的関数呼出し識別ラベルのアドレスを引数に持つ、静的呼出しプロファイル処理関数蓄積部３７内の静的呼出しプロファイル処理関数の呼出しコードを挿入する（図１１）。なお、図１１の３、１５、２５、３１行目のｓｔａｔｉｃＰｒｏｆｉｌｅ（）が静的呼出しプロファイル処理関数である。
【００５３】
ステップＳ２４において、動的関数呼出しを見つけた場合、以下の（Ａ）〜（Ｃ）の処理を行なう。
【００５４】
（Ａ）動的関数呼出し識別ラベル生成部１３は、動的関数呼出しを識別するための動的関数呼出し識別ラベルを、動的関数呼出し識別ラベルデータベース３０に登録する（図８）。動的関数呼出し識別ラベルは、ソースプログラム蓄積部５の全てのソースプログラムに対して一意になるような名前にする。一意であればどのような名前でも構わない。なお、ここでは説明を簡単にするために、図８に示すように動的関数呼出し識別ラベル名は、「文字列"ＤＹＮＡＭＩＣ＿ＣＡＬＬＰＡＩＲ"＋ソースプログラム名＋グローバル・ローカル識別文字＋呼出し側関数名」とする。静的関数呼出し識別ラベルと共に、呼出し側関数識別ラベルが登録される。
【００５５】
（Ｂ）動的関数呼出し識別ラベルセクション宣言挿入部１７は、動的関数呼出しを識別するための動的関数呼出し識別ラベルの動的呼出しコールペア情報格納セクションへの宣言（図９）をソースプログラムに挿入する。なお、図９の「．ｓｅｃｔｉｏｎ  "．ｄｙｎａｍｉｃＣａｌｌｐａｉｒＬａｂｅｌ"，．ｂｓｓ」は、初期値無しのデータセクションを定義する命令で、「．ｌｃｏｍｍ  ＤＹＮＡＭＩＣ＿ＣＡＬＬＰＡＩＲ＿ｆｉｌｅ１＿Ｇ＿ｍａｉｎ，  １」は、１バイトのサイズを持つラベルを定義する命令である。
【００５６】
（Ｃ）動的呼出しプロファイル処理呼出し処理挿入部１９は、動的関数呼出しの直前に、動的関数呼出し識別ラベルのアドレスと、呼出し側関数のアドレスとを引数に持つ動的呼出しプロファイル処理関数呼出しコードを挿入する（図１１）。なお、図１１の１０、２１行目のｄｙｎａｍｉｃＰｒｏｆｉｌｅ（）が、動的呼出しプロファイル処理関数蓄積部３９内の、動的呼出しプロファイル処理関数である。
【００５７】
ステップＳ２５において、関数特定部１５は、ソースプログラムを解析して関数ポインタへの代入を行なっている関数を検索し、動的に呼出される可能性のある関数名と関数識別ラベルとを動的呼出され側関数データベース３１に登録する（図１０）。なお、関数が他のファイル内で宣言されているグローバルな関数であった場合、関数識別ラベルは「不明」としておく。
【００５８】
ステップＳ２６において、プロファイル処理入りソースプログラム蓄積部３２内のプロファイル処理入りソースプログラムをコンパイルし、プロファイル用オブジェクトを生成する。
【００５９】
ステップＳ２７において、ライブラリの場合、プロファイル用オブジェクトからプロファイル用ライブラリを生成し、プロファイル用ライブラリ蓄積部３５に蓄える。
【００６０】
次に、図４に示すようなソースファイルを例として、図２および図３における具体的な処理内容について説明する。まず、図２のステップＳ１１の処理を詳述した図３について説明する。
【００６１】
図３のステップＳ２１において、図４に示す２、１１、１７、２０、２５、２８行目の関数が図５に示すようなデータ構成で関数識別ラベルデータベース３３に登録される。
【００６２】
ステップＳ２２において、ステップＳ２１で検出した関数宣言の直前に、関数の関数識別ラベルを表すアドレスを挿入する。
【００６３】
ステップＳ２３において、図４の３、１３、２１、２６行目の静的関数呼出しに対し、図６に示すようなデータ構成で、静的関数呼出し識別ラベルを静的関数呼出し識別ラベルデータベース３４に登録する。また、図７のような静的呼出しコールペア情報格納セクションでの静的関数呼出し識別ラベル宣言をソースプログラムに挿入する。さらに、図１１の３、１５、２５、３１行目のように、静的関数呼出しの直前に、静的関数呼出し識別ラベルのアドレスを引数に持つ静的呼出しプロファイル処理関数呼出しを挿入する。
【００６４】
ステップＳ２４において、図４の９、１８行目の動的関数呼出しに対し、図８に示すようなデータ構成で動的関数呼出し識別ラベルを動的関数呼出し識別ラベルデータベース３０に登録する。また、図９のような動的呼出しコールペア情報格納セクションへの動的関数呼出し識別ラベル宣言をソースプログラムに挿入する。さらに、図１１の１０、２１行目のように、動的関数呼出しの直前に、動的関数呼出し識別ラベルのアドレスと呼出し側関数のアドレスとを引数に持つ動的呼出しプロファイル処理関数呼出しを挿入する。
【００６５】
ステップＳ２５において、図４の５、７、１２行目のような関数ポインタへの代入が行なわれている関数について、図１０に示すようなデータ構成で動的呼出され側関数を動的呼出され側関数データベース３１に登録する。
【００６６】
ステップＳ２６において、図１１のようなプロファイル処理関数を挿入したソースプログラムがコンパイルされ、プロファイル用オブジェクトが生成される。
【００６７】
ステップＳ２７において、対象がライブラリだった場合は、ステップＳ２６で生成したプロファイル用オブジェクトからプロファイル用ライブラリが生成される。
【００６８】
図２のステップＳ１２において、図５に示すようなデータ構成の関数識別ラベルデータベース３３と、図１０に示すようなデータ構成の動的呼出され側関数データベース３１とで、図１２に示すようなデータ構成の、動的に呼出される可能性関数情報データベース３６を作成する。
【００６９】
ステップＳ１３において、図１２に示すようなデータ構成の、動的に呼出される可能性関数情報データベース３６を基に、図１３のような関数識別ラベルセクションを作成するソースプログラムを生成し、コンパイルして関数識別ラベルセクション用オブジェクトを生成する。
【００７０】
ステップＳ１４において、図１５に示すような動的呼出し側関数の総数と動的呼出され側関数の総数との積の大きさの動的呼出しコールペア情報格納領域を生成する。
【００７１】
ステップＳ１５において、図１６、図１７にそれぞれ示すような処理を行なうプロファイル処理関数ｓｔａｔｉｃＰｒｏｆｉｌｅ（）、ｄｙｎａｍｉｃＰｒｏｆｉｌｅ（）を用意する。
【００７２】
静的呼び出しの場合、図１６のプロファイル処理関数ｓｔａｔｉｃＰｒｏｆｉｌｅ（）が呼ばれ、ステップＳ３１において、引数で渡されたコールペア識別ラベルのアドレスで示される記憶内容をインクリメントする。すなわち、静的コールペア情報として呼出し回数が格納される。
【００７３】
また、動的呼出しの場合は、図１７のプロファイル処理関数ｄｙｎａｍｉｃＰｒｏｆｉｌｅ（）が呼ばれ、図１７に示すステップＳ４１〜Ｓ４４において以下ような処理を行なう。
【００７４】
ステップＳ４１において、引数で渡された動的呼出され側関数のアドレスから、関数の直前に挿入されている関数識別ラベルのアドレスａｄｄｒｅｓｓを取得する。例えば、図１８に示すようなプロファイル処理関数ｄｙｎａｍｉｃＰｒｏｆｉｌｅ（＆ＤＹＮＡＭＩＣ＿ＣＡＬＬＰＡＩＲ＿ｆｉｌｅＪ，ｄｙｎａｍｉｃ）が呼ばれる場合、ｄｙｎａｍｉｃを定義する動的呼び出され側関数Ｆｕｎｃｔｉｏｎ＿ｆｉｌｅＫのソースプログラム中のアドレスから、関数Ｆｕｎｃｔｉｏｎ＿ｆｉｌｅＫの定義の直前に挿入されている関数識別ラベルのアドレスａｄｄｒｅｓｓを取得する。
【００７５】
ステップＳ４２において、ｃｏｌｕｍｎＩｎｄｅｘ＝ａｄｄｒｅｓｓ−ｄｙｎａｍｉｃＣａｌｌｅｅＴｏｐＡｄｄｒｅｓｓの式から動的呼び出され側の関数ラベルセクション中の位置ｃｏｌｕｍｎＩｎｄｅｘを求める。ここで、ｄｙｎａｍｉｃＣａｌｌｅｅＴｏｐＡｄｄｒｅｓｓは、動的呼び出され側の関数ラベルセクションの先頭アドレスである。
【００７６】
ステップＳ４３において、ｒｏｗＩｎｄｅｘ＝ｄｙｎａｍｉｃＣａｌｌｅｒＡｄｄｒｅｓｓ−ｄｙｎａｍｉｃＣａｌｌｅｒＳｅｃｔｉｏｎＴｏｐＡｄｄｒｅｓｓの式から動的呼び出し側の関数ラベルセクション中の位置ｒｏｗＩｎｄｅｘを求める。ここで、ｄｙｎａｍｉｃＣａｌｌｅｒＡｄｄｒｅｓｓは、動的関数呼出し識別ラベルのアドレスであり、ｄｙｎａｍｉｃＣａｌｌｅｒＳｅｃｔｉｏｎＴｏｐＡｄｄｒｅｓｓは、動的関数呼出し側の関数ラベルセクションの先頭アドレスである。
【００７７】
ステップＳ４４において、Ｉｎｄｅｘ＝ｒｏｗＩｎｄｅｘ×（ｄｙｎａｍｉｃＣａｌｌｅｅＥｎｄＡｄｄｒｅｓｓ−ｄｙｎａｍｉｃＣａｌｌｅｅＴｏｐＡｄｄｒｅｓｓ）＋ｃｏｌｕｍｎＩｎｄｅｘの式で得られる動的呼び出しコールペア情報格納領域の位置に格納されている内容をインクリメントする。ここで、ｄｙｎａｍｉｃＣａｌｌｅｅＥｎｄＡｄｄｒｅｓｓとｄｙｎａｍｉｃＣａｌｌｅｅＴｏｐＡｄｄｒｅｓｓとは、それぞれ動的関数呼出され側の関数ラベルセクションの末尾と先頭とのアドレスである。
【００７８】
図１８は、以上の動的呼出しプロファイル処理関数におけるアドレス計算を模式的に示す図である。例えばソースプログラムに示すように動的呼び出され側関数Ｆｕｎｃｔｉｏｎ＿ｆｉｌｅＫと動的呼出し側関数ＤＹＮＡＭＩＣ＿ＣＡＬＬＰＡＩＲ＿ｆｉｌｅＪとが存在する場合、動的呼び出され側の関数ラベルセクション中のＦｕｎｃｔｉｏｎ＿ｆｉｌｅＫと動的呼び出し側の関数ラベルセクション中のＤＹＮＡＭＩＣ＿ＣＡＬＬＰＡＩＲ＿ｆｉｌｅＪとのアドレスデータからコールペア情報格納セクション（動的呼び出しコールペア情報格納領域）中の（Ｊ、Ｋ）で表される位置Ｉｎｄｅｘが求められる。言い換えれば、コールペア情報格納セクション中の２次元的な位置（Ｊ、Ｋ）に対応する１次元的な位置Ｉｎｄｅｘを、動的呼出し先に相当する関数ラベルセクションと動的呼出し元に相当する関数ラベルセクションとにおける５個のアドレスデータから５回の四則演算（減算３、乗算１、加算１）によって求めることができる。
【００７９】
以上の位置計算をより具体的な数値で簡単化して説明する。ｄｙｎａｍｉｃＣａｌｌｅｒＳｅｃｔｉｏｎＴｏｐＡｄｄｒｅｓｓ＝１０、ｄｙｎａｍｉｃＣａｌｌｅｒＡｄｄｒｅｓｓ＝１５、ｄｙｎａｍｉｃＣａｌｌｅｅＴｏｐＡｄｄｒｅｓｓ＝１００、ａｄｄｒｅｓｓ＝１０３、ｄｙｎａｍｉｃＣａｌｌｅｅＥｎｄＡｄｄｒｅｓｓ＝１１０であると仮定する。図１７のステップＳ４２よってｃｏｌｕｍｎＩｎｄｅｘ＝３が求められ、ステップＳ４３によってｒｏｗＩｎｄｅｘ＝５が求められ、さらにステップＳ４４によって２次元的な位置（５、３）に対応する動的呼出しコールペア情報格納領域の１次元的な位置ｉｎｄｅｘ＝５×（１１０−１００）＋３＝５３が求められる。
【００８０】
そして、このようにして求められた位置ｉｎｄｅｘで指し示される記憶内容がインクリメントされる。すなわち、動的コールペア情報として呼出し回数が格納されることとなる。
【００８１】
図２のステップＳ１６において、各ソースプログラムに対するプロファイル用オブジェクトと、関数識別ラベルセクション用オブジェクトをリンクしてプロファイル用モジュールを作成し、プロファイル用モジュール蓄積部４２内に保持する。
【００８２】
ステップＳ１７において、プロファイル用モジュール蓄積部４２内のプロファイル用モジュールが実行される。その結果、図１４、図１５に示すような、それぞれの格納領域の内容は、例えば、図１９、図２０に示すようにインクリメントされた実行情報が書き込まれ、実行情報がプロファイル情報蓄積部４４内に収集される。
【００８３】
ステップＳ１８において、プロファイル情報取得部４５は、プロファイル情報蓄積部４４に収集されたデータを取得し、プログラムのプロファイル情報を解析する。
【００８４】
本発明のプロファイル情報収集方法は、以上のように処理され、情報収集に伴う計算量は、従来技術と比べると非常に小さくなる。すなわち、本発明における情報収集用コードは、図１６、図１７で示すように非常に単純な計算だけで実行される。特に動的関数においては、従来の技術のように解析するコールペア、動的呼出し側関数、動的呼出され側関数の数に比例して計算量が増加するのではなく、図１７の処理において説明したように高々５回の四則演算を行うだけで済む。すなわち、平均計算量をＯ（１）とすることができ、情報収集用コードに関わるオーバーヘッドを小さくすることができる。
【００８５】
また、静的呼出しプロファイル処理において、情報収集処理は、従来のコールペア仮識別番号に対応する識別番号をコールペア識別番号インデックステーブルから検索する必要がなくなり、静的呼出しコールペア識別ラベルに対応するアドレスを参照するだけで済む。したがって、実行時間を短くすることができる。
【００８６】
一方、本発明におけるメモリ量に関し、従来技術よりも少ないメモリ量で情報収集が可能となる。すなわち、従来の技術では、実行情報を格納する領域以外に、コールペア識別番号インデックステーブル、動的呼出し側関数識別番号インデックステーブル、動的呼出され側関数識別番号インデックステーブルがターゲットのメモリ上に必要になる。これに対して本発明では、実行情報を格納する領域である動的呼び出しコールペア情報格納領域以外では、動的呼出しコールペア識別ラベルセクションと、関数識別ラベルセクションが必要になる。しかし、これらセクションは、リンク時にプロファイル用実行モジュールに挿入する情報収集用コードが使用するアドレスを算出するためだけに必要なものである。したがって、プロファイル用実行モジュールを実行するときには、これらセクションのデータをターゲットのメモリにロードする必要はない。
【００８７】
なお、例えば以下の（Ａ）〜（Ｄ）のいずれかの方法でこれらセクションが使用するメモリを削減することができる。
（Ａ）プロファイル用実行モジュールを実行するときに、これらセクションの情報をダウンロードの対象から除外する。
（Ｂ）リンクして生成されたプロファイル用実行モジュールから、これらセクションの情報を削除する。
（Ｃ）リンクするセクションのオーバーラップを許しているリンカの場合、これらセクションを他のセクションとオーバーラップさせる。
（Ｄ）ターゲットが組み込みなどの場合、実際にはメモリの存在しない領域に、これらセクションを配置する。
【００８８】
以上の説明したように、本発明では少ないメモリ量で情報収集が可能となる。情報収集時に使用されるメモリ量が少くなれば、メモリのページング等が行なわれるなどしてプログラムの実行速度に影響を与える場合を少なくすることができる。また、それ以前の問題として、仮想メモリの技術を使用できないような環境、あるいは、扱えるメモリが少ないような環境では、情報収集時に使用されるメモリ量が多いと、そのプログラム自体を動かせなくなってしまう場合があるが、そのような現象を減らすことができる。特に組み込み型システムの分野では、利用できるメモリ量が限られることが多いので、情報収集時に使用するメモリ量を少なくすることは極めて有効である。
【００８９】
ところで、従来技術においては、仮識別番号の一意性の確立の問題がある。仮識別番号の一意性の確立仮識別番号は、システムライブラリとプログラムとで一意になるような番号でなければならない。このため、システムライブラリが複数ある場合、仮識別番号を割り振る時に仮識別番号が他のシステムライブラリと重ならないように、割り振る仮識別番号の開始番号を管理する必要がある。すなわち、システムライブラリが複数ある場合、特に不特定多数がシステムライブラリを作成する場合には、割り振る仮識別番号を管理する機構が必要になる。しかし、特許文献１に記載の技術では、システムライブラリの仮識別番号の管理が定義されていない。十分桁の大きな番号を割り振れば、不特定多数が作成したとしても、仮識別番号の一意性を確立できるが、その場合、コールペア識別番号インデックステーブル等のデータも巨大になってしまう虞がある。
【００９０】
本発明では、関数識別ラベル、静的関数呼出し識別ラベル、動的関数呼出し識別ラベルの一意性を保つ必要がある。しかし、従来の発明と異なり、ラベル名を十分長いものにすれば解決できる問題である。何故ならば、ラベル名をいかに長くしたとしても、実行モジュールを実行するターゲット上のメモリは消費されないためである。なお、名前の一意性についての問題は、既存の技術で対応できているので、それを用いても良い。例えばプログラミング言語であるＪａｖａ（登録商標）では、不特定多数の開発者が作成するクラスの名前が同名にならないようにｐａｃｋａｇｅと言う概念を用いている。このｐａｃｋａｇｅ名は、例えば次のように命名することが推奨されている。
（Ａ）Ｓｕｎ．ＣＯＭのようなインターネットドメイン名を取得する。
（Ｂ）構成要素ごとに逆にして（例えば、ＣＯＭ．Ｓｕｎのようにして）、パッケージ名の前置詞として使用する。
【００９１】
以上のように、本発明では、仮識別番号の一意性の確立が容易となる。すなわち、事前にプロファイル情報格納場所にラベル付けを行うことにより、仮識別番号を使用せずに解析できる。代わりに識別ラベルが必要になるが、文字列の一意性は既存の手法を用いることで容易に一意性を確立できる。また、仮識別番号のようにターゲット上のメモリを使用することもない。
【００９２】
2006202134.tif 000003
次に、オーバーヘッド（計算量）とメモリ量について、具体的な測定数値例を説明する。所定のソースプログラムについてプロファイル情報の収集を行った結果、従来技術と本
発明の実施例とにおける測定数値として、以下のようなものが得られた。
ただし、測定条件としては、静的コールペア数：１００００、動的呼出し関数数：１００、動的呼出され関数数：１００とし、２５ＭＨｚで計測した。
【００９３】
以上のような測定結果によれば、従来技術よりも情報収集に伴うオーバーヘッドが少なくて済み、また情報収集用に必要なメモリを削減できることが判った。
【図面の簡単な説明】
【００９４】
【図１】本発明の実施例に係るプロファイル情報収集装置の構成を示すブロック図である。
【図２】本発明の実施例に係るプロファイル情報収集装置の動作を表すフローチャートである。
【図３】図２のＳ１１の詳細を示すフローチャートである。
【図４】本発明の処理を説明するためのソースプログラムの例を示す図である。
【図５】関数識別ラベルデータベースのデータ構成例を示す図である。
【図６】静的関数呼出し識別ラベルデータベースのデータ構成例を示す図である。
【図７】静的呼出しコールペア情報格納セクション宣言の例を示す図である。
【図８】動的関数呼出しラベルデータベースのデータ構成例を示す図である。
【図９】動的呼出しコールペア識別ラベル宣言の例を示す図である。
【図１０】動的呼出され側関数データベースのデータ構成例を示す図である。
【図１１】処理後のソースプログラムの例を示す図である。
【図１２】動的に呼出される可能性関数情報データベースのデータ構成例を示す図である。
【図１３】関数識別ラベルセクション宣言の例を示す図である。
【図１４】静的呼出しプロファイル情報格納領域の構成例を示す図である。
【図１５】動的呼出しプロファイル情報格納領域の構成例を示す図である。
【図１６】静的呼出しプロファイル処理関数の処理を表すフローチャートである。
【図１７】動的呼出しプロファイル処理関数の処理を表すフローチャートである。
【図１８】動的呼出しプロファイル処理関数におけるアドレス計算を模式的に示す図である。
【図１９】情報収集用モジュール実行後の静的呼出しプロファイル情報格納領域の構成例を示す図である。
【図２０】情報収集用モジュール実行後の動的呼出しプロファイル情報格納領域の構成例を示す図である。
【図２１】従来技術における静的呼出しプロファイル処理のフローチャートである。
【図２２】従来技術における動的呼出しプロファイル処理のフローチャートである。
【図２３】システムライブラリソースの例を示す図である。
【図２４】システムライブラリ用コールペア仮識別番号データベースである。
【図２５】システムライブラリ用動的呼出され側関数仮識別番号データベースである。
【図２６】システムライブラリ用動的呼出し側関数仮識別番号データベースである。
【図２７】情報収集用コードが挿入されたシステムライブラリソースの例を示す図である。
【図２８】ユーザソースプログラムのソースの例を示す図である。
【図２９】コールペア仮識別番号データベースの例を示す図である。
【図３０】動的呼出され側関数仮識別番号データベースの例を示す図である。
【図３１】動的呼出し側関数仮識別番号データベースの例を示す図である。
【図３２】コールペア仮識別番号データベースの例を示す図である。
【図３３】コールペア識別番号インデックステーブルの例を示す図である。
【図３４】動的呼出し側関数仮識別番号データベースの例を示す図である。
【図３５】動的呼出し側関数識別番号インデックステーブルの例を示す図である。
【図３６】動的呼出され側関数仮識別番号データベースの例を示す図である。
【図３７】動的呼出され側関数識別番号インデックステーブルの例を示す図である。
【図３８】動的コールペアの情報収集データ格納用テーブルの例を示す図である。
【図３９】情報収集用コードを挿入したソースファイルの例を示す図である。
【図４０】静的呼出しコールペア情報格納領域の例を示す図である。
【図４１】動的呼出しコールペア情報格納領域の例を示す図である。
【符号の説明】
【００９５】
５  ソースプログラム蓄積部
１０  静的ソース解析部
１１  関数識別ラベル生成部
１２  静的関数呼出し識別ラベル生成部
１３  動的関数呼出し識別ラベル生成部
１４  関数識別ラベルアドレス挿入部
１５  関数特定部
１６  静的呼出しコールペア情報格納セクション宣言挿入部
１７  動的関数呼出し識別ラベルセクション宣言挿入部
１８  静的呼出しプロファイル処理呼出し処理挿入部
１９  動的呼出しプロファイル処理呼出し処理挿入部
３０  動的関数呼出し識別ラベルデータベース
３１  動的呼出され側関数データベース
３２  プロファイル処理入りソースプログラム蓄積部
３３  関数識別ラベルデータベース
３４  静的関数呼出し識別ラベルデータベース
３５  プロファイル用ライブラリ蓄積部
３６  動的に呼出される可能性関数情報データベース
３７  静的呼出しプロファイル処理関数蓄積部
３８  動的呼出しコールペア情報格納セクション処理部
３９  動的呼出しプロファイル処理関数蓄積部
４０  関数識別ラベルセクション処理部
４１  リンク部
４２  プロファイル用モジュール蓄積部
４３  モジュール実行部
４４  プロファイル情報蓄積部
４５  プロファイル情報取得部
４６  可能性関数処理部
【図１】
2006202134.tif 000004
【図２】
2006202134.tif 000005
【図３】
2006202134.tif 000006
【図４】
2006202134.tif 000007
【図５】
2006202134.tif 000008
【図６】
2006202134.tif 000009
【図７】
2006202134.tif 000010
【図８】
2006202134.tif 000011
【図９】
2006202134.tif 000012
【図１０】
2006202134.tif 000013
【図１１】
2006202134.tif 000014
【図１２】
2006202134.tif 000015
【図１３】
2006202134.tif 000016
【図１４】
2006202134.tif 000017
【図１５】
2006202134.tif 000018
【図１６】
2006202134.tif 000019
【図１７】
2006202134.tif 000020
【図１８】
2006202134.tif 000021
【図１９】
2006202134.tif 000022
【図２０】
2006202134.tif 000023
【図２１】
2006202134.tif 000024
【図２２】
2006202134.tif 000025
【図２３】
2006202134.tif 000026
【図２４】
2006202134.tif 000027
【図２５】
2006202134.tif 000028
【図２６】
2006202134.tif 000029
【図２７】
2006202134.tif 000030
【図２８】
2006202134.tif 000031
【図２９】
2006202134.tif 000032
【図３０】
2006202134.tif 000033
【図３１】
2006202134.tif 000034
【図３２】
2006202134.tif 000035
【図３３】
2006202134.tif 000036
【図３４】
2006202134.tif 000037
【図３５】
2006202134.tif 000038
【図３６】
2006202134.tif 000039
【図３７】
2006202134.tif 000040
【図３８】
2006202134.tif 000041
【図３９】
2006202134.tif 000042
【図４０】
2006202134.tif 000043
【図４１】
2006202134.tif 000044