説明

プロファイル情報収集方法および装置

【課題】
プログラム内の動的関数呼出しにかかるコールペア情報を収集する際の計算量と使用メモリ量とを削減する。
【解決手段】
静的ソース解析部10は、ソースプログラム蓄積部5内のプログラムを静的に解析し、動的呼出し側関数及び動的呼出され側関数を洗い出し、各関数に識別ラベルを付与する。動的呼出しプロファイル処理呼出し処理挿入部19は、動的呼出しプロファイル処理を含むプロファイル処理入りソースプログラムを生成する。リンク部41は、動的呼出し側関数と動的呼出され側関数との組み合わせに対応する動的コールペア情報格納テーブルの領域を確保する処理と識別ラベルのセクション処理とプロファイル処理入りソースプログラムとをリンクする。モジュール実行部43は、コンパイルして実行し、動的コールペア情報格納テーブルに動的な呼出しにかかるコールペア毎の呼出し回数を収集する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、プロファイル情報収集方法および装置に関し、特にプログラムの性能測定におけるプロファイル情報の収集方法および装置に関する。
【0002】
なお、本明細書において、ソースプログラム中で明示的に関数を指定して呼出すことを、静的な関数呼出しという。これに対して、関数へのポインタ(開始アドレス)を変数に格納し、変数を介してその関数を呼出すことを、動的な関数呼出しといい、動的な関数呼出しにおいて、呼び出す方の関数を動的呼び出し側関数、呼び出される方の関数を動的呼び出され側関数という。
【背景技術】
【0003】
プログラムの実行性能の向上を図る上で、プロファイル情報によってそのプログラムの挙動を把握することはきわめて有効である。プロファイル情報は、プログラム実行時に、動的にその特定部分の実行回数、実行時間、分岐情報などを計測し収集したものである。このようにして得られるプロファイル情報は、プログラムの解析情報として使用され、主に実行速度向上などの最適化が、解析情報をもとに行われる。プロファイル情報は、プログラム固有の最適化を可能にする有用性の高い情報であり、プログラム内の呼出し側関数/呼出され側関数の呼出し頻度を示すコールペア情報は、このようなプロファイル情報の一つである。
【0004】
このようなコールペア情報に関し、プログラム内の動的関数呼出しにかかるコールペア情報を収集する際に必要な、コールペア情報を格納するテーブルのサイズを縮小するプロファイル情報収集装置が特許文献1に開示されている。このプロファイル情報収集装置は、ソースプログラムを静的に解析して動的呼出し側関数および動的呼出され側関数をそれぞれ洗い出し、動的コールペア情報格納テーブルとしては、洗い出した動的呼出し側関数と動的呼出され側関数の組み合わせ分のエントリを持つテーブルを持つ。この場合、コールペア識別番号インデックステーブル、呼出し側関数インデックステーブル及び呼出され側関数インデックステーブルを介在させ、コールペア情報格納テーブル中の該当するアドレスをアクセスしている。
【0005】
特許文献1のプロファイル情報収集装置において、具体的には、ソースプログラムに静的呼出しプロファイル処理関数のコードが挿入される。この静的呼出しプロファイル処理関数は、引数としてコールペア仮識別番号を受け取り、図21に示すように、コールペア識別番号インデックステーブルを参照してコールペア仮識別番号をコールペア識別番号に変換する(ステップS161)。そして、このコールペア識別番号を静的コールペア情報格納テーブルのインデックスとして該当エントリの値を1増加する処理(ステップS162)を行う。
【0006】
また、ソースプログラムに動的呼出しプロファイル処理関数のコードが挿入される。この動的呼出しプロファイル処理関数は、引数として呼出し側関数の関数仮IDと動的呼出しに使う変数(少なくとも実行時点で呼出し側関数の開始アドレスが入る)とを受け取り、図22に示すように、引数の変数が示す呼出し側関数の開始アドレスの直前を読み込んで、呼出され側関数の関数仮IDを取得する(ステップS191)。そして、呼出され側関数インデックステーブルを参照して、呼出され側関数の関数仮IDから関数IDを取得する(ステップS192)。また、同様な呼出し側関数インデックステーブルを参照して、呼出し側関数の関数仮IDから関数IDを取得し(ステップS193)、呼出し側関数の関数IDと呼出され側関数の関数IDとを動的コールペア情報格納テーブルのインデックスとし、該当エントリの値を1増加させる処理(ステップS194)を行う。
【0007】
以下、簡単なソースプログラム(ユーザ+ライブラリ)を例として取り上げ、プロファイル情報収集について説明する。まず、図23に示すようなシステムライブラリソースがあった場合、2、3、11、15、20行目の静的なコールペアが検出され、図24に示すようなシステムライブラリ用コールペア仮識別番号データベースが登録される。また、図23の4、5、6行目の動的に呼出される可能性のある関数が検出され、図25に示すようなシステムライブラリ用動的呼出され側関数仮識別番号データベースが登録される。さらに、図23の7、16、21行目の動的呼び出しを行なっている関数を検出し、図26に示すようなシステムライブラリ用動的呼出し側関数仮識別番号データベースが登録される。
【0008】
先に説明した図21、図22のプロファイル処理関数を用意し、プロファイル処理関数を呼び出すために、図23に対し、図27の2、4、9、14、19、21、26、28行目に示すような情報収集用コードを挿入する。そして、プロファイル用の情報収集用コードを挿入したシステムライブラリソースをコンパイルし、情報収集用のシステムライブラリを生成する。
【0009】
次に、図28のようなユーザプログラムのソースがあった場合、2、3、11、15、20行目の静的なコールペアが検出され、図29に示すようなコールペア仮識別番号データベースが登録される。また、図28の4、5、6行目にあるような動的に呼出される可能性のある関数が検出され、図30のように動的に呼出され側関数仮識別番号データベースが登録される。さらに、図28の7、16、21行目にあるような動的呼び出しを行なっている関数を検出し、図31のような動的呼出し側関数仮識別番号データベースが登録される。
【0010】
また、図24のデータベースから図29のデータベースに関係するコールペアのみを抽出し、図32のようなコールペア仮識別番号データベースが登録される。そして、図32のコールペア仮識別番号データベースに対して識別番号を振り、図33に示すような仮識別番号と識別番号を対応させるコールペア識別番号インデックステーブルを作成する。
【0011】
さらに、図25のデータベースを図30のデータベースに追加し、図34に示すような動的呼出し側関数仮識別番号データベースが登録される。図34の動的呼出し側関数仮識別番号データベースに識別番号を振り、図35に示すような仮識別番号と識別番号を対応させる動的呼出し側関数識別番号インデックステーブルを作成する。
【0012】
また、図26のデータベースから図32に関係するコールペアを図31のデータベースに追加し、図36に示すような動的呼出され側関数仮識別番号データベースを作成する。図36の動的呼出され側関数仮識別番号データベースに識別番号を振り、図37のような仮識別番号と識別番号を対応させる動的呼出され側関数識別番号インデックステーブルを作成する。
【0013】
さらに、静的コールペアの情報収集データ格納用のメモリを、図33のコールペア識別番号インデックステーブルの識別番号分確保する。
【0014】
また、動的コールペアの情報収集データ格納用のメモリを、図38に示すように、図35の動的呼出し側関数仮識別番号データベースのサイズと、図37の動的呼出され側関数仮識別番号データベースのサイズとの積の大きさ分を確保する。
【0015】
先に説明した図21、図22のプロファイル処理関数を用意し、図28に対し、図39の2、4、9、14、19、21、26、28行目に示すように情報収集用コードを挿入する。情報収集用コードが挿入されたソースファイルをコンパイル・リンクしてモジュールを生成・実行する。実行の結果、図40に示す静的呼出しコールペア情報格納領域、図41に示す動的呼出しコールペア情報格納領域に対して、情報収集用コードによって収集されたデータ、各関数の実行回数が蓄えられる。この蓄えられた情報がプロファイル情報に当たる。
【0016】
【特許文献1】特開2002−132542号公報 (図20、図23)
【発明の開示】
【発明が解決しようとする課題】
【0017】
一般に、プログラムの性能解析や挙動の確認、把握を行なう際に重要な点(顧客の要望する点)として、取得した情報が正確であることが挙げられる。当然であるが、取得した情報が正確でなければ、目的の「プログラムの性能解析や挙動の確認、把握」を達成することができない。「プログラムの性能解析や挙動の確認、把握」で最も正確さが求められる情報とは、プログラムの実行時間と、プログラムの挙動である。実行時間を正確にするには、情報収集における処理をなるべく時間の掛らないものにする必要がある。また、情報収集における処理をなるべく時間の掛らないものにすることによって、プログラムの挙動を正確にすることにもつながる。なぜならば、プログラムの挙動が変る最も大きな要因として、情報収集用のコード挿入による、プログラム内の各スレッドの処理タイミングや、外部装置(あるいはプログラム)との通信のタイミングのずれの影響が挙げられるが、これらは、情報収集における処理をなるべく時間の掛らないものにすることによって、軽減されるからである。すなわち、情報収集時の処理の計算量は、なるべく少ないことが望ましい。
【0018】
ところで、特許文献1に記載の装置では、情報収集における処理の計算量(オーバーヘッド)が大きいと言うことが挙げられる。この装置では、情報収集(検索)にあたり、図21の静的呼出しプロファイル処理および図22の動的呼出しプロファイル処理においてインデックステーブルを参照するアルゴリズムが必要とされる。すなわち、ソースプログラムを静的に解析して得られた仮識別番号あるいは仮関数IDから、情報収集における処理(静的呼出しプロファイル処理、動的呼出しプロファイル処理)で参照される識別番号あるいは関数IDを求めるために対応付けを記述したインデックステーブルを用いている。
【0019】
特に、動的呼出しプロファイル処理において、動的呼出し側関数インデックステーブル、動的呼出され側関数インデックステーブルが参照され、情報収集に必要な計算量は、対応付けを求めるために、これらインデックステーブルの大きさに比例することになる。各インデックステーブルの大きさは、動的呼出し側関数、動的呼出され側関数の数に比例するので、これら関数の数が増えると情報収集における計算量(オーバーヘッド)が著しく増加してしまう。
【0020】
この場合の検索に必要な平均計算量は、インデックステーブルの大きさをN(Nは自然数)とした場合、O(N/2)となる。なお、コールペア識別番号インデックステーブルが仮識別番号でソートされていると仮定すれば、2分検索を行なうことで、平均計算量をO(logN)に削減することができる。コールペア識別番号インデックステーブルの大きさは、解析するコールペアの数に比例するので、解析するコールペアが増えると、情報収集のオーバーヘッドが無視できないものとなってしまう。ここで、O記法とは、漸近的計算量がこれより大きくなることはない限界を示すものであって、例えば、あるアルゴリズムの計算時間が、Nが大きくなった時にNに比例する場合にO(N)、logNに比例する場合にO(logN)というように表す。
【課題を解決するための手段】
【0021】
前記課題を解決するために、本発明者は、情報収集時のアドレスアクセスにおいて、事前に該当する関数に関数を識別するための識別ラベルを付与することによって、従来技術におけるインデックステーブルを用いなくとも済むことに着目し、本発明を創案するに至った。
【0022】
本発明の一つのアスペクトに係るプロファイル情報収集装置は、プログラムの実行中にプロファイル情報を収集するプロファイル情報収集装置である。この装置は、ソースプログラムを静的に解析して動的な呼出しによって他の関数を呼出す可能性のある動的呼出し側関数および他の関数から呼出される可能性のある動的呼出され側関数をそれぞれ洗い出す解析部と、前記ソースプログラムに、洗い出された前記動的呼出し側関数および前記動的呼出され側関数を識別するための識別ラベルを宣言する関数ラベルセクションを設定する処理を挿入する動的セクション挿入部と、前記ソースプログラムに、洗い出された前記動的呼出し側関数の識別ラベルを記憶するためのアドレスを該当する関数の前に付与する動的アドレス挿入部と、前記ソースプログラムに、動的な呼出しによって他の関数を呼出す処理毎に動的プロファイル処理を挿入する動的呼出し処理挿入部と、前記ソースプログラムに、洗い出された前記動的呼出し側関数と前記動的呼出され側関数との組み合わせである動的コールペア毎にその動的コールペアの呼出し回数を格納する動的コールペア情報格納テーブルの領域を設定する処理を挿入する動的呼出しコールペア情報格納セクション処理部と、前記動的セクション挿入部、前記動的アドレス挿入部、前記動的呼出し処理挿入部、および前記動的呼出しコールペア情報格納セクション処理部によって処理情報が挿入済みのソースプログラムをコンパイルして実行したときに前記動的プロファイル処理があったとき、当該動的な呼出しにかかる動的呼出し側関数の識別ラベルに対応するアドレスと動的呼出され側関数の識別ラベルに対応するアドレスとに基づいて前記動的コールペア情報格納テーブル中の該当エントリのアドレスを算出し、算出されたアドレスで示される記憶内容である呼出し回数をインクリメントする実行部と、を備える。
【0023】
本発明の一つのアスペクトに係るプロファイル情報収集方法は、プロファイル情報収集装置がプログラムの実行中にプロファイル情報を収集する方法である。この方法は、(a)ソースプログラムを静的に解析して動的な呼出しによって他の関数を呼出す可能性のある動的呼出し側関数および他の関数から呼出される可能性のある動的呼出され側関数をそれぞれ洗い出すステップと、(b)前記ソースプログラムに、洗い出された前記動的呼出し側関数および前記動的呼出され側関数を識別するための識別ラベルを宣言する関数ラベルセクションを設定する処理を挿入するステップと、(c)前記ソースプログラムに、洗い出された前記動的呼出し側関数の識別ラベルを記憶するためのアドレスを該当する関数の前に付与するステップと、(d)前記ソースプログラムに、動的な呼出しによって他の関数を呼出す処理毎に動的プロファイル処理を挿入するステップと、(e)前記ソースプログラムに、洗い出された前記動的呼出し側関数と前記動的呼出され側関数との組み合わせである動的コールペア毎にその動的コールペアの呼出し回数を格納する動的コールペア情報格納テーブルの領域を設定する処理を挿入するステップと、(f)前記(b)、(c)、(d)、(e)の各ステップによって処理情報が挿入されたソースプログラムをコンパイルして実行したときに前記動的プロファイル処理があったとき、当該動的な呼出しにかかる動的呼出し側関数の識別ラベルに対応するアドレスと動的呼出され側関数の識別ラベルに対応するアドレスとに基づいて前記動的コールペア情報格納テーブル中の該当エントリのアドレスを算出し、算出されたアドレスで示される記憶内容である呼出し回数をインクリメントするステップと、を含む。
【発明の効果】
【0024】
本発明によれば、事前にプロファイル情報格納場所にラベル付けすることにより、プロファイル情報の格納場所決定時にインデックステーブルの検索を行なわずに済む。したがって、簡単な演算を行うだけで格納場所を決定することができ、情報収集に伴うオーバーヘッドが少なくて済む。
【発明を実施するための最良の形態】
【0025】
本発明の実施形態に係るプロファイル情報収集装置は、ソースプログラム蓄積部(図1の5)に蓄えられているソースプログラムを静的に解析して動的な呼出しによって他の関数を呼出す可能性のある動的呼出し側関数および他の関数から呼出される可能性のある動的呼出され側関数をそれぞれ洗い出す静的ソース解析部(図1の10)を備える。静的ソース解析部は、ソースプログラムに、洗い出された動的呼出し側関数および動的呼出され側関数を識別するための識別ラベルを宣言する関数ラベルセクションを設定する処理を挿入する。また、ソースプログラムに、洗い出された動的呼出し側関数の識別ラベルを記憶するためのアドレスを該当する関数の前に付与する。さらに、ソースプログラムに、動的な呼出しによって他の関数を呼出す処理毎に動的プロファイル処理を挿入する。また、動的呼出しコールペア情報格納セクション処理部(図1の38)は、ソースプログラムに、洗い出された動的呼出し側関数と動的呼出され側関数との組み合わせである動的コールペア毎にその動的コールペアの呼出し回数を格納する動的コールペア情報格納テーブルの領域を設定する処理を挿入する。
【0026】
リンク部(図1の41)は、動的セクション挿入部、動的アドレス挿入部、動的呼出し処理挿入部、および動的呼出しコールペア情報格納セクション処理部によって処理情報が挿入済みのソースプログラムをリンクする。さらに、モジュール実行部(図1の43)が、リンクされたプログラムをコンパイルして実行する。この際、ソースプログラム中に動的プロファイル処理があったとき、動的な呼出しにかかる動的呼出し側関数の識別ラベルに対応するアドレスと動的呼出され側関数の識別ラベルに対応するアドレスとに基づいて動的コールペア情報格納テーブル中の該当エントリのアドレスが算出され、算出されたアドレスで示される記憶内容である呼出し回数がインクリメントされる。この様に動作することで、動的コールペア情報格納テーブル中にプロファイル情報が蓄えられる。
【0027】
以上のような構成のプロファイル情報収集装置は、プログラムの性能解析や挙動の確認、把握のために、プロファイル情報収集対象のプログラムに情報収集用のコードを埋め込み、実行モジュールを作成し、それを実行することでプロファイル情報をユーザに提示する。ユーザは、そのプロファイル情報を解析することでプログラムの動作把握、性能解析や、キャッシュコンフリクトの防止が可能となる。以下、実施例に即して詳しく説明する。
【実施例】
【0028】
図1は、本発明の実施例に係るプロファイル情報収集装置の構成を示すブロック図である。プロファイル情報収集装置は、ソースプログラム蓄積部5、静的ソース解析部10、動的関数呼出し識別ラベルデータベース30、動的呼出され側関数データベース31、プロファイル処理入りソースプログラム蓄積部32、関数識別ラベルデータベース(関数識別ラベルDB)33、静的関数呼出し識別ラベルデータベース34、プロファイル用ライブラリ蓄積部35、動的に呼出される可能性関数情報データベース(動的に呼出される可能性関数情報DB)36、静的呼出しプロファイル処理関数蓄積部37、動的呼出しコールペア情報格納セクション処理部38、動的呼出しプロファイル処理関数蓄積部39、関数識別ラベルセクション処理部40、リンク部41、プロファイル用モジュール蓄積部42、モジュール実行部43、プロファイル情報蓄積部44、プロファイル情報取得部45、可能性関数処理部46を備える。また、静的ソース解析部10は、関数識別ラベル生成部11、静的関数呼出し識別ラベル生成部12、動的関数呼出し識別ラベル生成部13、関数識別ラベルアドレス挿入部14、関数特定部15、静的呼出しコールペア情報格納セクション宣言挿入部16、動的関数呼出し識別ラベルセクション宣言挿入部17、静的呼出しプロファイル処理呼出し処理挿入部18、動的呼出しプロファイル処理呼出し処理挿入部19を備える。
【0029】
静的ソース解析部10は、ソースプログラム蓄積部5に蓄えられているユーザソースプログラムおよびライブラリソースプログラムを解析し、動的関数呼出し識別ラベルを生成して動的関数呼出し識別ラベルデータベース30に蓄え、動的に呼出されている関数を特定し、動的呼出され側関数データベース31に蓄える。また、ソースプログラムにプロファイル処理を挿入して、プロファイル処理入りソースプログラム蓄積部32に蓄え、関数識別ラベルを生成して関数識別ラベルデータベース33に蓄える。さらに、静的関数呼出し識別ラベルを生成して静的関数呼出し識別ラベルデータベース34に蓄える。
【0030】
以上のように構成されるプロファイル情報収集装置は、ライブラリソースプログラム、ユーザソースプログラムを入力することで、プロファイル用のライブラリ、あるいはプロファイル情報を出力する。
【0031】
次にプロファイル情報収集装置の動作について説明する。図2は、本発明の実施例に係るプロファイル情報収集装置の動作を表すフローチャートである。
【0032】
スタートすると、ステップS11において、ユーザソースプログラム、ライブラリソースプログラムに関係無く、プロファイル用オブジェクトを生成する。なお、ステップS11の詳細については後に述べる。
【0033】
ステップS12において、可能性関数処理部46は、ステップS11で生成した関数識別ラベルデータベース33と動的呼出され側関数データベース31とから、動的に呼出される可能性関数情報データベース36を以下の手順にしたがって作成する。
【0034】
関数識別ラベルデータベース33に存在する関数識別ラベルで、リンクされるモジュールに含まれている関数識別ラベルについて、以下の(A1)〜(A3)の処理を行なう。
【0035】
(A−1)関数識別ラベルが、動的呼出され関数データベース31に存在する場合、動的に呼出される可能性を「あり」として動的に呼出される可能性関数情報データベース36に追加する。
【0036】
(A−2)関数識別ラベルが、グローバルな関数で、その関数名が動的呼出され側関数データベース31に存在する場合、動的に呼出される可能性を「あり」として動的に呼出される可能性関数情報データベース36に追加する。
【0037】
(A−3)上記以外の関数識別ラベルを、動的に呼出される可能性を「なし」として動的に呼出される可能性関数情報データベース36に追加する。
【0038】
ステップS13において、関数識別ラベルセクション処理部40は、動的に呼出される可能性関数情報データベース36の内容を基に、以下の(A)〜(D)のように関数識別ラベルセクションを作成するソースプログラムを生成してコンパイルし、関数識別ラベルセクション用オブジェクトを生成する(図13)。
(A)動的に呼出される可能性が「あり」のものと、「なし」のものとで分ける。
(B)「あり」のものから順にラベルを宣言する。
(C)なお、各ラベルは1バイトスペースを空ける。
(D)また、「あり」の先頭ラベルの直前と、「なし」の先頭のラベルの直前とに、先頭であることを示すラベルdynamicCalleeTopとdynamicCalleeEndとをそれぞれ挿入する。
【0039】
ステップS14において、動的呼出しコールペア情報格納セクション処理部38は、動的に呼出される可能性関数情報データベース36の内容を基に、動的呼出し側関数の総数と動的呼出され側関数の総数との積の大きさの動的呼出しコールペア情報格納領域を、例えば下記(A)〜(C)のいずれかの方法で生成する。なお、動的呼出され側関数総数は、ステップS13の(D)で挿入した先頭ラベルのアドレスの差(dynamicCalleeEnd−dynamicCalleeTop)から取得する。
(A)プログラムの実行開始直後に呼出されるスタートアップルーチンに、動的呼出しコールペア情報格納領域を確保する処理を挿入する。
(B)動的呼出しプロファイル処理関数蓄積部39内の動的呼出しプロファイル処理関数が最初に呼ばれた一回だけ、動的呼出しコールペア情報格納領域を確保する処理を挿入する。
(C)動的呼出し識別ラベルセクションのサイズと動的呼出され側関数の総数との積の大きさの動的呼出しコールペア情報格納領域を宣言するソースを生成してオブジェクトを生成し、実行モジュール生成時にリンクする。
【0040】
ステップS15において、静的呼出しプロファイル処理関数蓄積部37と動的呼出しプロファイル処理関数蓄積部39とにおいてプロファイル処理関数を用意する。
【0041】
ステップS16において、リンク部41は、プロファイル処理入りソースプログラム蓄積部32のユーザソースプログラムとライブラリソースプログラムとに対するプロファイル用オブジェクトと、関数識別ラベルセクション用オブジェクトとをリンクし、プロファイル用モジュールを作成し、プロファイル用モジュール蓄積部42に蓄える。このリンク時に、リンク部41は、関数識別ラベル、静的関数呼出し識別ラベル、動的関数呼出し識別ラベルのそれぞれのアドレスを決定する。
【0042】
ステップS17において、モジュール実行部43は、プロファイル用モジュール蓄積部42に蓄えられたプロファイル用モジュールを実行し、プロファイル処理関数によってプロファイルデータを収集し、プロファイル情報蓄積部44に蓄積する。
【0043】
ステップS18において、プロファイル情報取得部45は、プロファイル情報蓄積部44に蓄積されたデータを以下の(A)、(B)のように解析することで、プログラムの実行情報を取得する。
【0044】
(A)プロファイル処理関数によって収集され、静的呼出しコールペア情報格納セクションに格納されているデータには、それぞれ静的関数呼出し識別ラベルが付けられている。その静的関数呼出し識別ラベルを基に、静的関数呼出し識別ラベルデータベース34の内容を引くことで、そのデータがどの関数のデータなのかを判定する。
【0045】
(B)動的呼出しコールペア情報格納セクションには、動的呼出しプロファイル処理関数蓄積部39内の動的呼出しプロファイル処理関数によって、実行データが格納されているので、各エントリに対応する動的関数呼出し識別ラベルと、呼出され関数の関数識別ラベルとから実行データがどの関数のデータなのかを判定する。
【0046】
次に、図2のステップS11の詳細について説明する。図3は、ステップS11の詳細を示すフローチャートである。
【0047】
ステップS21において、関数識別ラベル生成部11は、プロファイル情報収集対象となるソースプログラム中に関数宣言部を見つけた場合、関数を識別するための関数識別ラベルを関数識別ラベルデータベース33に登録する。ここで関数識別ラベルは、ソースプログラム蓄積部5の全てのソースプログラムに対して一意になるような名前にする。一意であればどのような名前でも構わない。関数識別ラベルデータベース33には、プロファイルに必要な情報であり、かつ実行モジュールからは取得不可能である、この関数に関連した情報を登録する。なお、ここでは説明を簡単にするために、関数識別ラベル名は、図5に示すように「文字列"FUNCTION"+ソースプログラム名+グローバル・ローカル識別文字+関数名」とし、関数識別ラベルの他に登録する情報としては、関数名、グローバル・ローカル情報、ソースプログラムパス名とする。
【0048】
ステップS22において、関数識別ラベルアドレス挿入部14は、ソースプログラム中の関数の直前に関数識別ラベルのアドレスを挿入する。
【0049】
ステップS23において、静的ソース解析部10で静的関数呼出しを見つけた場合、以下の(A)〜(C)の処理を行なう。
【0050】
(A)静的関数呼出し識別ラベル生成部12は、静的関数呼出しを識別するための静的関数呼出し識別ラベルを静的関数呼出し識別ラベルデータベース34に登録する(図6)。静的関数呼出し識別ラベルは、ソースプログラム蓄積部5の全てのソースプログラムに対して一意になるような名前を自動的につける。一意であればどのような名前でも構わない。なお、ここでは説明を簡単にするために、静的関数呼出し識別ラベル名は、図6に示すように「文字列"STATIC_CALLPAIR"+ソースプログラム名+グローバル・ローカル識別文字+呼出し側関数名+文字列"TO"+グローバル・ローカル識別文字+呼出され側関数名」とし、静的関数呼出し識別ラベルの他に登録する情報としては、呼出し側関数識別ラベル、呼出され側関数名、呼出され側関数のグローバル・ローカル情報とする。
【0051】
(B)静的呼出しコールペア情報格納セクション宣言挿入部16は、静的関数呼出しを識別するための静的関数呼出し識別ラベルの、静的呼出しコールペア情報格納セクションへの宣言(図7)をソースプログラムに挿入する。なお、図7における「.section ".staticCallpairTable", .data」は、初期値ありのデータセクションを定義する命令で、「.word 0」は、初期値が0で、4バイト領域を確保する命令である。ここで指定しているバイト数により、収集できる実行回数の上限値が決定する。4バイト分も必要なければ2バイトや、1バイトにすることもできる。ただし、その場合は、プロファイル処理関数のコードも変更する必要がある。
【0052】
(C)静的呼出しプロファイル処理呼出し処理挿入部18は、静的関数呼出しの直前に、静的関数呼出し識別ラベルのアドレスを引数に持つ、静的呼出しプロファイル処理関数蓄積部37内の静的呼出しプロファイル処理関数の呼出しコードを挿入する(図11)。なお、図11の3、15、25、31行目のstaticProfile()が静的呼出しプロファイル処理関数である。
【0053】
ステップS24において、動的関数呼出しを見つけた場合、以下の(A)〜(C)の処理を行なう。
【0054】
(A)動的関数呼出し識別ラベル生成部13は、動的関数呼出しを識別するための動的関数呼出し識別ラベルを、動的関数呼出し識別ラベルデータベース30に登録する(図8)。動的関数呼出し識別ラベルは、ソースプログラム蓄積部5の全てのソースプログラムに対して一意になるような名前にする。一意であればどのような名前でも構わない。なお、ここでは説明を簡単にするために、図8に示すように動的関数呼出し識別ラベル名は、「文字列"DYNAMIC_CALLPAIR"+ソースプログラム名+グローバル・ローカル識別文字+呼出し側関数名」とする。静的関数呼出し識別ラベルと共に、呼出し側関数識別ラベルが登録される。
【0055】
(B)動的関数呼出し識別ラベルセクション宣言挿入部17は、動的関数呼出しを識別するための動的関数呼出し識別ラベルの動的呼出しコールペア情報格納セクションへの宣言(図9)をソースプログラムに挿入する。なお、図9の「.section ".dynamicCallpairLabel",.bss」は、初期値無しのデータセクションを定義する命令で、「.lcomm DYNAMIC_CALLPAIR_file1_G_main, 1」は、1バイトのサイズを持つラベルを定義する命令である。
【0056】
(C)動的呼出しプロファイル処理呼出し処理挿入部19は、動的関数呼出しの直前に、動的関数呼出し識別ラベルのアドレスと、呼出し側関数のアドレスとを引数に持つ動的呼出しプロファイル処理関数呼出しコードを挿入する(図11)。なお、図11の10、21行目のdynamicProfile()が、動的呼出しプロファイル処理関数蓄積部39内の、動的呼出しプロファイル処理関数である。
【0057】
ステップS25において、関数特定部15は、ソースプログラムを解析して関数ポインタへの代入を行なっている関数を検索し、動的に呼出される可能性のある関数名と関数識別ラベルとを動的呼出され側関数データベース31に登録する(図10)。なお、関数が他のファイル内で宣言されているグローバルな関数であった場合、関数識別ラベルは「不明」としておく。
【0058】
ステップS26において、プロファイル処理入りソースプログラム蓄積部32内のプロファイル処理入りソースプログラムをコンパイルし、プロファイル用オブジェクトを生成する。
【0059】
ステップS27において、ライブラリの場合、プロファイル用オブジェクトからプロファイル用ライブラリを生成し、プロファイル用ライブラリ蓄積部35に蓄える。
【0060】
次に、図4に示すようなソースファイルを例として、図2および図3における具体的な処理内容について説明する。まず、図2のステップS11の処理を詳述した図3について説明する。
【0061】
図3のステップS21において、図4に示す2、11、17、20、25、28行目の関数が図5に示すようなデータ構成で関数識別ラベルデータベース33に登録される。
【0062】
ステップS22において、ステップS21で検出した関数宣言の直前に、関数の関数識別ラベルを表すアドレスを挿入する。
【0063】
ステップS23において、図4の3、13、21、26行目の静的関数呼出しに対し、図6に示すようなデータ構成で、静的関数呼出し識別ラベルを静的関数呼出し識別ラベルデータベース34に登録する。また、図7のような静的呼出しコールペア情報格納セクションでの静的関数呼出し識別ラベル宣言をソースプログラムに挿入する。さらに、図11の3、15、25、31行目のように、静的関数呼出しの直前に、静的関数呼出し識別ラベルのアドレスを引数に持つ静的呼出しプロファイル処理関数呼出しを挿入する。
【0064】
ステップS24において、図4の9、18行目の動的関数呼出しに対し、図8に示すようなデータ構成で動的関数呼出し識別ラベルを動的関数呼出し識別ラベルデータベース30に登録する。また、図9のような動的呼出しコールペア情報格納セクションへの動的関数呼出し識別ラベル宣言をソースプログラムに挿入する。さらに、図11の10、21行目のように、動的関数呼出しの直前に、動的関数呼出し識別ラベルのアドレスと呼出し側関数のアドレスとを引数に持つ動的呼出しプロファイル処理関数呼出しを挿入する。
【0065】
ステップS25において、図4の5、7、12行目のような関数ポインタへの代入が行なわれている関数について、図10に示すようなデータ構成で動的呼出され側関数を動的呼出され側関数データベース31に登録する。
【0066】
ステップS26において、図11のようなプロファイル処理関数を挿入したソースプログラムがコンパイルされ、プロファイル用オブジェクトが生成される。
【0067】
ステップS27において、対象がライブラリだった場合は、ステップS26で生成したプロファイル用オブジェクトからプロファイル用ライブラリが生成される。
【0068】
図2のステップS12において、図5に示すようなデータ構成の関数識別ラベルデータベース33と、図10に示すようなデータ構成の動的呼出され側関数データベース31とで、図12に示すようなデータ構成の、動的に呼出される可能性関数情報データベース36を作成する。
【0069】
ステップS13において、図12に示すようなデータ構成の、動的に呼出される可能性関数情報データベース36を基に、図13のような関数識別ラベルセクションを作成するソースプログラムを生成し、コンパイルして関数識別ラベルセクション用オブジェクトを生成する。
【0070】
ステップS14において、図15に示すような動的呼出し側関数の総数と動的呼出され側関数の総数との積の大きさの動的呼出しコールペア情報格納領域を生成する。
【0071】
ステップS15において、図16、図17にそれぞれ示すような処理を行なうプロファイル処理関数staticProfile()、dynamicProfile()を用意する。
【0072】
静的呼び出しの場合、図16のプロファイル処理関数staticProfile()が呼ばれ、ステップS31において、引数で渡されたコールペア識別ラベルのアドレスで示される記憶内容をインクリメントする。すなわち、静的コールペア情報として呼出し回数が格納される。
【0073】
また、動的呼出しの場合は、図17のプロファイル処理関数dynamicProfile()が呼ばれ、図17に示すステップS41〜S44において以下ような処理を行なう。
【0074】
ステップS41において、引数で渡された動的呼出され側関数のアドレスから、関数の直前に挿入されている関数識別ラベルのアドレスaddressを取得する。例えば、図18に示すようなプロファイル処理関数dynamicProfile(&DYNAMIC_CALLPAIR_fileJ,dynamic)が呼ばれる場合、dynamicを定義する動的呼び出され側関数Function_fileKのソースプログラム中のアドレスから、関数Function_fileKの定義の直前に挿入されている関数識別ラベルのアドレスaddressを取得する。
【0075】
ステップS42において、columnIndex=address−dynamicCalleeTopAddressの式から動的呼び出され側の関数ラベルセクション中の位置columnIndexを求める。ここで、dynamicCalleeTopAddressは、動的呼び出され側の関数ラベルセクションの先頭アドレスである。
【0076】
ステップS43において、rowIndex=dynamicCallerAddress−dynamicCallerSectionTopAddressの式から動的呼び出し側の関数ラベルセクション中の位置rowIndexを求める。ここで、dynamicCallerAddressは、動的関数呼出し識別ラベルのアドレスであり、dynamicCallerSectionTopAddressは、動的関数呼出し側の関数ラベルセクションの先頭アドレスである。
【0077】
ステップS44において、Index=rowIndex×(dynamicCalleeEndAddress−dynamicCalleeTopAddress)+columnIndexの式で得られる動的呼び出しコールペア情報格納領域の位置に格納されている内容をインクリメントする。ここで、dynamicCalleeEndAddressとdynamicCalleeTopAddressとは、それぞれ動的関数呼出され側の関数ラベルセクションの末尾と先頭とのアドレスである。
【0078】
図18は、以上の動的呼出しプロファイル処理関数におけるアドレス計算を模式的に示す図である。例えばソースプログラムに示すように動的呼び出され側関数Function_fileKと動的呼出し側関数DYNAMIC_CALLPAIR_fileJとが存在する場合、動的呼び出され側の関数ラベルセクション中のFunction_fileKと動的呼び出し側の関数ラベルセクション中のDYNAMIC_CALLPAIR_fileJとのアドレスデータからコールペア情報格納セクション(動的呼び出しコールペア情報格納領域)中の(J、K)で表される位置Indexが求められる。言い換えれば、コールペア情報格納セクション中の2次元的な位置(J、K)に対応する1次元的な位置Indexを、動的呼出し先に相当する関数ラベルセクションと動的呼出し元に相当する関数ラベルセクションとにおける5個のアドレスデータから5回の四則演算(減算3、乗算1、加算1)によって求めることができる。
【0079】
以上の位置計算をより具体的な数値で簡単化して説明する。dynamicCallerSectionTopAddress=10、dynamicCallerAddress=15、dynamicCalleeTopAddress=100、address=103、dynamicCalleeEndAddress=110であると仮定する。図17のステップS42よってcolumnIndex=3が求められ、ステップS43によってrowIndex=5が求められ、さらにステップS44によって2次元的な位置(5、3)に対応する動的呼出しコールペア情報格納領域の1次元的な位置index=5×(110−100)+3=53が求められる。
【0080】
そして、このようにして求められた位置indexで指し示される記憶内容がインクリメントされる。すなわち、動的コールペア情報として呼出し回数が格納されることとなる。
【0081】
図2のステップS16において、各ソースプログラムに対するプロファイル用オブジェクトと、関数識別ラベルセクション用オブジェクトをリンクしてプロファイル用モジュールを作成し、プロファイル用モジュール蓄積部42内に保持する。
【0082】
ステップS17において、プロファイル用モジュール蓄積部42内のプロファイル用モジュールが実行される。その結果、図14、図15に示すような、それぞれの格納領域の内容は、例えば、図19、図20に示すようにインクリメントされた実行情報が書き込まれ、実行情報がプロファイル情報蓄積部44内に収集される。
【0083】
ステップS18において、プロファイル情報取得部45は、プロファイル情報蓄積部44に収集されたデータを取得し、プログラムのプロファイル情報を解析する。
【0084】
本発明のプロファイル情報収集方法は、以上のように処理され、情報収集に伴う計算量は、従来技術と比べると非常に小さくなる。すなわち、本発明における情報収集用コードは、図16、図17で示すように非常に単純な計算だけで実行される。特に動的関数においては、従来の技術のように解析するコールペア、動的呼出し側関数、動的呼出され側関数の数に比例して計算量が増加するのではなく、図17の処理において説明したように高々5回の四則演算を行うだけで済む。すなわち、平均計算量をO(1)とすることができ、情報収集用コードに関わるオーバーヘッドを小さくすることができる。
【0085】
また、静的呼出しプロファイル処理において、情報収集処理は、従来のコールペア仮識別番号に対応する識別番号をコールペア識別番号インデックステーブルから検索する必要がなくなり、静的呼出しコールペア識別ラベルに対応するアドレスを参照するだけで済む。したがって、実行時間を短くすることができる。
【0086】
一方、本発明におけるメモリ量に関し、従来技術よりも少ないメモリ量で情報収集が可能となる。すなわち、従来の技術では、実行情報を格納する領域以外に、コールペア識別番号インデックステーブル、動的呼出し側関数識別番号インデックステーブル、動的呼出され側関数識別番号インデックステーブルがターゲットのメモリ上に必要になる。これに対して本発明では、実行情報を格納する領域である動的呼び出しコールペア情報格納領域以外では、動的呼出しコールペア識別ラベルセクションと、関数識別ラベルセクションが必要になる。しかし、これらセクションは、リンク時にプロファイル用実行モジュールに挿入する情報収集用コードが使用するアドレスを算出するためだけに必要なものである。したがって、プロファイル用実行モジュールを実行するときには、これらセクションのデータをターゲットのメモリにロードする必要はない。
【0087】
なお、例えば以下の(A)〜(D)のいずれかの方法でこれらセクションが使用するメモリを削減することができる。
(A)プロファイル用実行モジュールを実行するときに、これらセクションの情報をダウンロードの対象から除外する。
(B)リンクして生成されたプロファイル用実行モジュールから、これらセクションの情報を削除する。
(C)リンクするセクションのオーバーラップを許しているリンカの場合、これらセクションを他のセクションとオーバーラップさせる。
(D)ターゲットが組み込みなどの場合、実際にはメモリの存在しない領域に、これらセクションを配置する。
【0088】
以上の説明したように、本発明では少ないメモリ量で情報収集が可能となる。情報収集時に使用されるメモリ量が少くなれば、メモリのページング等が行なわれるなどしてプログラムの実行速度に影響を与える場合を少なくすることができる。また、それ以前の問題として、仮想メモリの技術を使用できないような環境、あるいは、扱えるメモリが少ないような環境では、情報収集時に使用されるメモリ量が多いと、そのプログラム自体を動かせなくなってしまう場合があるが、そのような現象を減らすことができる。特に組み込み型システムの分野では、利用できるメモリ量が限られることが多いので、情報収集時に使用するメモリ量を少なくすることは極めて有効である。
【0089】
ところで、従来技術においては、仮識別番号の一意性の確立の問題がある。仮識別番号の一意性の確立仮識別番号は、システムライブラリとプログラムとで一意になるような番号でなければならない。このため、システムライブラリが複数ある場合、仮識別番号を割り振る時に仮識別番号が他のシステムライブラリと重ならないように、割り振る仮識別番号の開始番号を管理する必要がある。すなわち、システムライブラリが複数ある場合、特に不特定多数がシステムライブラリを作成する場合には、割り振る仮識別番号を管理する機構が必要になる。しかし、特許文献1に記載の技術では、システムライブラリの仮識別番号の管理が定義されていない。十分桁の大きな番号を割り振れば、不特定多数が作成したとしても、仮識別番号の一意性を確立できるが、その場合、コールペア識別番号インデックステーブル等のデータも巨大になってしまう虞がある。
【0090】
本発明では、関数識別ラベル、静的関数呼出し識別ラベル、動的関数呼出し識別ラベルの一意性を保つ必要がある。しかし、従来の発明と異なり、ラベル名を十分長いものにすれば解決できる問題である。何故ならば、ラベル名をいかに長くしたとしても、実行モジュールを実行するターゲット上のメモリは消費されないためである。なお、名前の一意性についての問題は、既存の技術で対応できているので、それを用いても良い。例えばプログラミング言語であるJava(登録商標)では、不特定多数の開発者が作成するクラスの名前が同名にならないようにpackageと言う概念を用いている。このpackage名は、例えば次のように命名することが推奨されている。
(A)Sun.COMのようなインターネットドメイン名を取得する。
(B)構成要素ごとに逆にして(例えば、COM.Sunのようにして)、パッケージ名の前置詞として使用する。
【0091】
以上のように、本発明では、仮識別番号の一意性の確立が容易となる。すなわち、事前にプロファイル情報格納場所にラベル付けを行うことにより、仮識別番号を使用せずに解析できる。代わりに識別ラベルが必要になるが、文字列の一意性は既存の手法を用いることで容易に一意性を確立できる。また、仮識別番号のようにターゲット上のメモリを使用することもない。
【0092】

次に、オーバーヘッド(計算量)とメモリ量について、具体的な測定数値例を説明する。所定のソースプログラムについてプロファイル情報の収集を行った結果、従来技術と本
発明の実施例とにおける測定数値として、以下のようなものが得られた。
ただし、測定条件としては、静的コールペア数:10000、動的呼出し関数数:100、動的呼出され関数数:100とし、25MHzで計測した。
【0093】
以上のような測定結果によれば、従来技術よりも情報収集に伴うオーバーヘッドが少なくて済み、また情報収集用に必要なメモリを削減できることが判った。
【図面の簡単な説明】
【0094】
【図1】本発明の実施例に係るプロファイル情報収集装置の構成を示すブロック図である。
【図2】本発明の実施例に係るプロファイル情報収集装置の動作を表すフローチャートである。
【図3】図2のS11の詳細を示すフローチャートである。
【図4】本発明の処理を説明するためのソースプログラムの例を示す図である。
【図5】関数識別ラベルデータベースのデータ構成例を示す図である。
【図6】静的関数呼出し識別ラベルデータベースのデータ構成例を示す図である。
【図7】静的呼出しコールペア情報格納セクション宣言の例を示す図である。
【図8】動的関数呼出しラベルデータベースのデータ構成例を示す図である。
【図9】動的呼出しコールペア識別ラベル宣言の例を示す図である。
【図10】動的呼出され側関数データベースのデータ構成例を示す図である。
【図11】処理後のソースプログラムの例を示す図である。
【図12】動的に呼出される可能性関数情報データベースのデータ構成例を示す図である。
【図13】関数識別ラベルセクション宣言の例を示す図である。
【図14】静的呼出しプロファイル情報格納領域の構成例を示す図である。
【図15】動的呼出しプロファイル情報格納領域の構成例を示す図である。
【図16】静的呼出しプロファイル処理関数の処理を表すフローチャートである。
【図17】動的呼出しプロファイル処理関数の処理を表すフローチャートである。
【図18】動的呼出しプロファイル処理関数におけるアドレス計算を模式的に示す図である。
【図19】情報収集用モジュール実行後の静的呼出しプロファイル情報格納領域の構成例を示す図である。
【図20】情報収集用モジュール実行後の動的呼出しプロファイル情報格納領域の構成例を示す図である。
【図21】従来技術における静的呼出しプロファイル処理のフローチャートである。
【図22】従来技術における動的呼出しプロファイル処理のフローチャートである。
【図23】システムライブラリソースの例を示す図である。
【図24】システムライブラリ用コールペア仮識別番号データベースである。
【図25】システムライブラリ用動的呼出され側関数仮識別番号データベースである。
【図26】システムライブラリ用動的呼出し側関数仮識別番号データベースである。
【図27】情報収集用コードが挿入されたシステムライブラリソースの例を示す図である。
【図28】ユーザソースプログラムのソースの例を示す図である。
【図29】コールペア仮識別番号データベースの例を示す図である。
【図30】動的呼出され側関数仮識別番号データベースの例を示す図である。
【図31】動的呼出し側関数仮識別番号データベースの例を示す図である。
【図32】コールペア仮識別番号データベースの例を示す図である。
【図33】コールペア識別番号インデックステーブルの例を示す図である。
【図34】動的呼出し側関数仮識別番号データベースの例を示す図である。
【図35】動的呼出し側関数識別番号インデックステーブルの例を示す図である。
【図36】動的呼出され側関数仮識別番号データベースの例を示す図である。
【図37】動的呼出され側関数識別番号インデックステーブルの例を示す図である。
【図38】動的コールペアの情報収集データ格納用テーブルの例を示す図である。
【図39】情報収集用コードを挿入したソースファイルの例を示す図である。
【図40】静的呼出しコールペア情報格納領域の例を示す図である。
【図41】動的呼出しコールペア情報格納領域の例を示す図である。
【符号の説明】
【0095】
5 ソースプログラム蓄積部
10 静的ソース解析部
11 関数識別ラベル生成部
12 静的関数呼出し識別ラベル生成部
13 動的関数呼出し識別ラベル生成部
14 関数識別ラベルアドレス挿入部
15 関数特定部
16 静的呼出しコールペア情報格納セクション宣言挿入部
17 動的関数呼出し識別ラベルセクション宣言挿入部
18 静的呼出しプロファイル処理呼出し処理挿入部
19 動的呼出しプロファイル処理呼出し処理挿入部
30 動的関数呼出し識別ラベルデータベース
31 動的呼出され側関数データベース
32 プロファイル処理入りソースプログラム蓄積部
33 関数識別ラベルデータベース
34 静的関数呼出し識別ラベルデータベース
35 プロファイル用ライブラリ蓄積部
36 動的に呼出される可能性関数情報データベース
37 静的呼出しプロファイル処理関数蓄積部
38 動的呼出しコールペア情報格納セクション処理部
39 動的呼出しプロファイル処理関数蓄積部
40 関数識別ラベルセクション処理部
41 リンク部
42 プロファイル用モジュール蓄積部
43 モジュール実行部
44 プロファイル情報蓄積部
45 プロファイル情報取得部
46 可能性関数処理部

【特許請求の範囲】
【請求項1】
プログラムの実行中にプロファイル情報を収集するプロファイル情報収集装置において、
ソースプログラムを静的に解析して動的な呼出しによって他の関数を呼出す可能性のある動的呼出し側関数および他の関数から呼出される可能性のある動的呼出され側関数をそれぞれ洗い出す解析部と、
前記ソースプログラムに、洗い出された前記動的呼出し側関数および前記動的呼出され側関数を識別するための識別ラベルを宣言する関数ラベルセクションを設定する処理を挿入する動的セクション挿入部と、
前記ソースプログラムに、洗い出された前記動的呼出し側関数の識別ラベルを記憶するためのアドレスを該当する関数の前に付与する動的アドレス挿入部と、
前記ソースプログラムに、動的な呼出しによって他の関数を呼出す処理毎に動的プロファイル処理を挿入する動的呼出し処理挿入部と、
前記ソースプログラムに、洗い出された前記動的呼出し側関数と前記動的呼出され側関数との組み合わせである動的コールペア毎にその動的コールペアの呼出し回数を格納する動的コールペア情報格納テーブルの領域を設定する処理を挿入する動的呼出しコールペア情報格納セクション処理部と、
前記動的セクション挿入部、前記動的アドレス挿入部、前記動的呼出し処理挿入部、および前記動的呼出しコールペア情報格納セクション処理部によって処理情報が挿入済みのソースプログラムをコンパイルして実行したときに前記動的プロファイル処理があったとき、当該動的な呼出しにかかる動的呼出し側関数の識別ラベルに対応するアドレスと動的呼出され側関数の識別ラベルに対応するアドレスとに基づいて前記動的コールペア情報格納テーブル中の該当エントリのアドレスを算出し、算出されたアドレスで示される記憶内容である呼出し回数をインクリメントする実行部と、
を備えることを特徴とするプロファイル情報収集装置。
【請求項2】
前記動的プロファイル処理は、前記動的関数呼出し部を識別するための前記動的関数呼出し識別ラベルのアドレスと呼出し側関数のアドレスとを引数に持つ動的呼出しプロファイル処理関数呼出しコードで表されることを特徴とする請求項1記載のプロファイル情報収集装置。
【請求項3】
前記実行部は、前記動的呼出し側関数の関数ラベルセクションにおける先頭アドレスから前記動的な呼出しにかかる動的呼出し側関数の識別ラベルに対応するアドレスへの差分と、前記動的呼出され側関数の関数ラベルセクションの大きさとの積に、前記動的呼出され側関数の関数ラベルセクションにおける先頭アドレスから前記動的な呼出しにかかる動的呼出され側関数の識別ラベルに対応するアドレスへの差分を加算して該当エントリのアドレスとすることを特徴とする請求項1記載のプロファイル情報収集装置。
【請求項4】
前記動的コールペア情報格納テーブルの領域は、前記動的呼出し側関数の総数と前記動的呼出され側関数の総数との積の大きさに設定されることを特徴とする請求項1記載のプロファイル情報収集装置。
【請求項5】
前記解析部は、ソースプログラムを静的に解析して静的な呼出しによって他の関数を呼出す可能性のある静的呼出し側関数を洗い出す機能をさらに含み、
前記ソースプログラムに、洗い出された前記静的呼出し側関数を識別するための識別ラベルを宣言する静的関数ラベルセクションを設定する処理を挿入する静的セクション挿入部と、
前記ソースプログラムに、洗い出された前記静的呼出し側関数の識別ラベルを記憶するためのアドレスを該当する関数の前に付与する静的アドレス挿入部と、
前記ソースプログラムに、静的な呼出しによって他の関数を呼出す処理毎に静的プロファイル処理を挿入する静的呼出し処理挿入部と、
前記ソースプログラムに、洗い出された前記静的呼出し側関数毎に静的コールペアの呼出し回数を格納する静的コールペア情報格納テーブルの領域を設定する処理を挿入する静的呼出しコールペア情報格納セクション処理部と、をさらに備え、
前記実行部は、前記静的セクション挿入部、前記静的アドレス挿入部、前記静的呼出し処理挿入部、および前記静的呼出しコールペア情報格納セクション処理部によって処理情報挿入済みのソースプログラムをコンパイルして実行したときに前記静的プロファイル処理があったとき、当該静的な呼出しにかかる静的呼出し側関数の識別ラベルに対応するアドレスに基づいて前記静的コールペア情報格納テーブル中の該当エントリのアドレスで示される記憶内容である呼出し回数をインクリメントすることをさらに実行することを特徴とする請求項1記載のプロファイル情報収集装置。
【請求項6】
プロファイル情報収集装置がプログラムの実行中にプロファイル情報を収集する方法であって、
(a)ソースプログラムを静的に解析して動的な呼出しによって他の関数を呼出す可能性のある動的呼出し側関数および他の関数から呼出される可能性のある動的呼出され側関数をそれぞれ洗い出すステップと、
(b)前記ソースプログラムに、洗い出された前記動的呼出し側関数および前記動的呼出され側関数を識別するための識別ラベルを宣言する関数ラベルセクションを設定する処理を挿入するステップと、
(c)前記ソースプログラムに、洗い出された前記動的呼出し側関数の識別ラベルを記憶するためのアドレスを該当する関数の前に付与するステップと、
(d)前記ソースプログラムに、動的な呼出しによって他の関数を呼出す処理毎に動的プロファイル処理を挿入するステップと、
(e)前記ソースプログラムに、洗い出された前記動的呼出し側関数と前記動的呼出され側関数との組み合わせである動的コールペア毎にその動的コールペアの呼出し回数を格納する動的コールペア情報格納テーブルの領域を設定する処理を挿入するステップと、
(f)前記(b)、(c)、(d)、(e)の各ステップによって処理情報が挿入されたソースプログラムをコンパイルして実行したときに前記動的プロファイル処理があったとき、当該動的な呼出しにかかる動的呼出し側関数の識別ラベルに対応するアドレスと動的呼出され側関数の識別ラベルに対応するアドレスとに基づいて前記動的コールペア情報格納テーブル中の該当エントリのアドレスを算出し、算出されたアドレスで示される記憶内容である呼出し回数をインクリメントするステップと、
を含むことを特徴とするプロファイル情報収集方法。
【請求項7】
前記動的プロファイル処理は、前記動的関数呼出し部を識別するための前記動的関数呼出し識別ラベルのアドレスと呼出し側関数のアドレスとを引数に持つ動的呼出しプロファイル処理関数呼出しコードで表されることを特徴とする請求項6記載のプロファイル情報収集方法。
【請求項8】
前記呼出し回数をインクリメントするステップは、前記動的呼出し側関数の関数ラベルセクションにおける先頭アドレスから前記動的な呼出しにかかる動的呼出し側関数の識別ラベルに対応するアドレスへの差分と、前記動的呼出され側関数の関数ラベルセクションの大きさとの積に、前記動的呼出され側関数の関数ラベルセクションにおける先頭アドレスから前記動的な呼出しにかかる動的呼出され側関数の識別ラベルに対応するアドレスへの差分を加算して該当エントリのアドレスを算出することを特徴とする請求項6記載のプロファイル情報収集方法。
【請求項9】
(g)前記ソースプログラムを静的に解析して静的な呼出しによって他の関数を呼出す可能性のある静的呼出し側関数を洗い出すステップと、
(h)前記ソースプログラムに、洗い出された前記静的呼出し側関数を識別するための識別ラベルを宣言する関数ラベルセクションを設定する処理を挿入するステップと、
(i)前記ソースプログラムに、洗い出された前記静的呼出し側関数の識別ラベルを記憶するためのアドレスを該当する関数の前に付与するステップと、
(j)前記ソースプログラムに、静的な呼出しによって他の関数を呼出す処理毎に静的プロファイル処理を挿入するステップと、
(k)前記ソースプログラムに、洗い出された前記静的呼出し側関数毎に静的コールペアの呼出し回数を格納する静的コールペア情報格納テーブルの領域を設定する処理を挿入するステップと、
(l)前記(h)、(i)、(j)、(k)の各ステップによって処理情報が挿入されたソースプログラムをコンパイルして実行したときに前記静的プロファイル処理があったとき、当該静的な呼出しにかかる静的呼出し側関数の識別ラベルに対応するアドレスに基づいて前記静的コールペア情報格納テーブル中の該当エントリのアドレスで示される記憶内容である呼出し回数をインクリメントするステップと、
をさらに含むを特徴とする請求項6記載のプロファイル情報収集方法。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate

【図19】
image rotate

【図20】
image rotate

【図21】
image rotate

【図22】
image rotate

【図23】
image rotate

【図24】
image rotate

【図25】
image rotate

【図26】
image rotate

【図27】
image rotate

【図28】
image rotate

【図29】
image rotate

【図30】
image rotate

【図31】
image rotate

【図32】
image rotate

【図33】
image rotate

【図34】
image rotate

【図35】
image rotate

【図36】
image rotate

【図37】
image rotate

【図38】
image rotate

【図39】
image rotate

【図40】
image rotate

【図41】
image rotate


【公開番号】特開2006−202134(P2006−202134A)
【公開日】平成18年8月3日(2006.8.3)
【国際特許分類】
【出願番号】特願2005−14550(P2005−14550)
【出願日】平成17年1月21日(2005.1.21)
【出願人】(000232036)NECマイクロシステム株式会社 (72)
【Fターム(参考)】