(57)【要約】【課題】低コストでデバッグに必要な情報をトレースできるようにする。【解決手段】デバッグ装置であって、命令列を格納する命令メモリと、前記命令列の実行の結果を格納するデータメモリと、プログラムカウンタから出力されたアドレスに従って、前記命令列の命令を前記命令メモリから読み出して解釈し、データを格納すべきアドレス及び格納されるデータのサイズを出力する命令デコーダと、前記データを格納すべきアドレス及び前記格納されるデータのサイズに従って、前記プログラムカウンタの出力及びステータス保持部の値を前記データメモリに格納させるメモリアクセス部と、トレースデータ読み出し要求を受けると、前記データを格納すべきアドレス及び前記格納されるデータのサイズに従って、前記データメモリからデータを読み出して出力するトレース読み出し部とを有する。【選択図】図３６
2011002934.tif 000002
【特許請求の範囲】
【請求項１】
デバッグ装置であって、
命令列を格納する命令メモリと、
実行するべき命令が格納されたアドレスを出力するプログラムカウンタと、
前記デバッグ装置の状態を格納するステータス保持部と、
前記命令列の実行の結果を格納するデータメモリと、
前記プログラムカウンタから出力されたアドレスに従って、前記命令列の命令を前記命令メモリから読み出して解釈し、データを格納すべきアドレス及び格納されるデータのサイズを出力する命令デコーダと、
前記データを格納すべきアドレス及び前記格納されるデータのサイズに従って、前記プログラムカウンタの出力及び前記ステータス保持部の値を前記データメモリに格納させるメモリアクセス部と、
トレースデータ読み出し要求を受けると、前記データを格納すべきアドレス及び前記格納されるデータのサイズに従って、前記データメモリからデータを読み出して出力するトレース読み出し部とを備える
デバッグ装置。
【請求項２】
請求項１に記載のデバッグ装置において、
前記トレース読み出し部は、新たなトレースデータ読み出し要求を受けると、データ読み出しを中止し、前記新たなトレースデータ読み出し要求に従ってデータ読み出しを開始する
デバッグ装置。
【請求項３】
請求項１に記載のデバッグ装置において、
前記メモリアクセス部及び前記トレース読み出し部から同時にアクセス可能であって、前記メモリアクセス部から前記データメモリに書き込まれるデータを格納し、格納されたデータを前記トレース読み出し部に出力するデュアルポートメモリを更に備える
デバッグ装置。
【請求項４】
命令列を解析して、前記命令列に含まれる複数のサブルーチンの間の依存関係を求めるステップと、
前記複数のサブルーチンのそれぞれのスタックフレームに用いられる領域が重ならないように、前記依存関係に従って、前記複数のサブルーチンに、対応するスタックフレームの相対アドレスを割り当てるステップと、
前記相対アドレスに従って前記スタックフレームを配置するための命令を生成して、前記命令列に挿入するステップとを備える
プログラム変換方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータプログラムのデバッグのためのデバッグ装置及びプログラム変換方法に関する。
【背景技術】
【０００２】
近年の大規模ＳｏＣ（System-on-a-chip）に搭載されたプロセッサの動作を記述するプログラムの開発においては、プロセッサの動作状況をトレースメモリ（例えばＦＩＦＯ（First in, First out）バッファ）に取り込み、トレースメモリの内容を解析してデバッグを行うという手法が一般的に用いられている。Ｃ言語のような高級言語で記述されたプログラムの実行の際には、データメモリにおいてローカル変数用のスタック上に割り付けられたスタックフレームは、サブルーチン処理が完了する度に上書きされてしまうためである。このようなトレースメモリを有する装置の例が、特許文献１に記載されている。
【０００３】
プロセッサの動作を記述するプログラムはＣ言語のような高級言語を用いて記述されていることがほとんどであるので、Ｃ言語関数（サブルーチン）単位でのデバッグを効率よく行うことが求められている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平７−５６７６６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、トレースメモリはプロセッサと同じチップに搭載する必要があり、デバッグ時のみにしか使われないにもかかわらずトレースメモリのサイズはコストに大きく影響するので、トレースメモリのサイズには事実上制約がある。一方、一般的にＳｏＣに搭載されたプロセッサの命令実行速度はトレース出力速度より圧倒的に速いので、トレースメモリのサイズが十分に大きくないと実質的にトレースを行うことができない。
【０００６】
また、プログラム実行中の状態をトレースする、いわゆるリアルタイムトレースの際には、トレースされた情報の重要性が考慮されていないため、トレースメモリが溢れた際に重要な情報が欠落し、デバッグ効率が悪いという問題がある。
【０００７】
本発明は、低コストでデバッグに必要な情報をトレースできるようにすることを目的とする。
【課題を解決するための手段】
【０００８】
本発明の実施形態によるデバッグ装置は、命令列を格納する命令メモリと、実行するべき命令が格納されたアドレスを出力するプログラムカウンタと、前記デバッグ装置の状態を格納するステータス保持部と、前記命令列の実行の結果を格納するデータメモリと、前記プログラムカウンタから出力されたアドレスに従って、前記命令列の命令を前記命令メモリから読み出して解釈し、データを格納すべきアドレス及び格納されるデータのサイズを出力する命令デコーダと、前記データを格納すべきアドレス及び前記格納されるデータのサイズに従って、前記プログラムカウンタの出力及び前記ステータス保持部の値を前記データメモリに格納させるメモリアクセス部と、トレースデータ読み出し要求を受けると、前記データを格納すべきアドレス及び前記格納されるデータのサイズに従って、前記データメモリからデータを読み出して出力するトレース読み出し部とを有する。
【０００９】
これによると、データメモリからデータを読み出してトレースするので、トレース用の専用のメモリを必要とすることなく、低コストでデバッグに必要な情報をトレースすることが可能となる。
【００１０】
本発明の実施形態によるプログラム変換方法は、命令列を解析して、前記命令列に含まれる複数のサブルーチンの間の依存関係を求めるステップと、前記複数のサブルーチンのそれぞれのスタックフレームに用いられる領域が重ならないように、前記依存関係に従って、前記複数のサブルーチンに、対応するスタックフレームの相対アドレスを割り当てるステップと、前記相対アドレスに従って前記スタックフレームを配置するための命令を生成して、前記命令列に挿入するステップとを有する。
【００１１】
これによると、複数のサブルーチンのそれぞれのスタックフレームに用いられる領域が重ならないように、スタックフレームが配置されるので、スタックフレームが他のサブルーチンのスタックフレームに上書きされずに残される。このため、データの読み出し速度が遅くてもトレースが可能となり、デバッグ効率を向上させることができる。
【発明の効果】
【００１２】
本発明の実施形態によれば、トレース専用のメモリを必要とすることなく、低コストで、データメモリからサブルーチン単位でトレースデータを読み出すことが可能となる。領域が互いに重ならないようスタックフレームを配置するので、データの読み出し速度が遅い場合であっても、また、プログラムの実行中断後においても、サブルーチン毎のスタックフレームをトレースすることが可能となる。
【図面の簡単な説明】
【００１３】
【図１】本発明の実施形態によるプログラム変換方法の処理の流れを示すフローチャートである。
【図２】図１のプログラム変換方法の処理の対象とされるソースプログラムの例を示す図である。
【図３】図２のソースプログラムから生成された命令列の例を示す図である。
【図４】図３の命令列を構成する各命令の説明を示す図である。
【図５】サブルーチンテーブル割り付け動作表の例を示す図である。
【図６】スタックフレームアドレス割り付け動作表の例を示す図である。
【図７】初期状態のサブルーチンテーブルを示す図である。
【図８】図３の命令Ｌ２が読み込まれた後のサブルーチンテーブルを示す図である。
【図９】図３の命令Ｌ３が読み込まれた後のサブルーチンテーブルを示す図である。
【図１０】図３の命令Ｌ６が読み込まれた後のサブルーチンテーブルを示す図である。
【図１１】図３の命令Ｌ７が読み込まれた後のサブルーチンテーブルを示す図である。
【図１２】図３の命令Ｌ１１が読み込まれた後のサブルーチンテーブルを示す図である。
【図１３】図３の命令Ｌ１３が読み込まれた後のサブルーチンテーブルを示す図である。
【図１４】図３の命令Ｌ１５が読み込まれた後のサブルーチンテーブルを示す図である。
【図１５】図３の命令Ｌ１６が読み込まれた後のサブルーチンテーブルを示す図である。
【図１６】図１のステップＳ１８で求められた最終的なサブルーチンテーブルを示す図である。
【図１７】図３の命令Ｌ２が読み込まれた後のスタックフレームを示す説明図である。
【図１８】図３の命令Ｌ３が読み込まれた後のスタックフレームを示す説明図である。
【図１９】図３の命令Ｌ６が読み込まれた後のスタックフレームを示す説明図である。
【図２０】図３の命令Ｌ７が読み込まれた後のスタックフレームを示す説明図である。
【図２１】図２０のときのサブルーチンテーブルを示す図である。
【図２２】図３の命令Ｌ２３が読み込まれた後のスタックフレームを示す説明図である。
【図２３】図３の命令Ｌ２７，Ｌ３０が読み込まれた後のスタックフレームを示す説明図である。
【図２４】図３の命令Ｌ３１が読み込まれた後のスタックフレームを示す説明図である。
【図２５】図３の命令Ｌ４５が読み込まれた後のスタックフレームを示す説明図である。
【図２６】図２５のときのサブルーチンテーブルを示す図である。
【図２７】図３の命令Ｌ３２が読み込まれた後のスタックフレームを示す説明図である。
【図２８】図３の命令Ｌ３３が読み込まれた後のスタックフレームを示す説明図である。
【図２９】図３の命令Ｌ８が読み込まれた後のスタックフレームを示す説明図である。
【図３０】図３の命令Ｌ１５が読み込まれた後のスタックフレームを示す説明図である。
【図３１】図３の命令Ｌ１６が読み込まれた後のスタックフレームを示す説明図である。
【図３２】図３の命令Ｌ５６が読み込まれた後のスタックフレームを示す説明図である。
【図３３】図３２のときのサブルーチンテーブルを示す図である。
【図３４】図３の命令Ｌ１７が読み込まれた後のスタックフレームを示す説明図である。
【図３５】図１のプログラム変換方法によって図３の命令列から変換された命令列の例を示す図である。
【図３６】本発明の実施形態によるデバッグ装置の構成例を示すブロック図である。
【図３７】トレースデータ読み出し要求の間隔が十分にある場合における、図３６のデバッグ装置のタイミングチャートである。
【図３８】トレースデータ読み出し要求の間隔が十分にない場合における、図３６のデバッグ装置のタイミングチャートである。
【図３９】図３６のデバッグ装置の変形例の構成を示すブロック図である。
【発明を実施するための形態】
【００１４】
以下、本発明の実施形態を、図面を参照しながら説明する。図面において同じ参照番号で示された構成要素は、同一の又は類似の構成要素である。
【００１５】
本明細書における各機能ブロックは、典型的にはハードウェアで実現され得る。例えば各機能ブロックは、ＩＣ（集積回路）の一部として半導体基板上に形成され得る。ここでＩＣは、ＬＳＩ（Large-Scale Integrated circuit）、ＡＳＩＣ（Application-Specific Integrated Circuit）、ゲートアレイ、ＦＰＧＡ（Field Programmable Gate Array）などを含む。代替としては各機能ブロックの一部又は全ては、ソフトウェアで実現され得る。
【００１６】
図１は、本発明の実施形態によるプログラム変換方法の処理の流れを示すフローチャートである。図２は、図１のプログラム変換方法の処理の対象とされるソースプログラムの例を示す図である。図２のソースプログラムは、Ｃ言語で記述されている。図３は、図２のソースプログラムから生成された命令列の例を示す図である。
【００１７】
図１のプログラム変換方法について説明する。ステップＳ１２では、ＣＰＵ（図示せず）は、図２のソースプログラムをコンパイルし、図３の命令列を生成する。図４は、図３の命令列を構成する各命令の説明を示す図である。命令列は１つ以上の命令を含んでいる。各命令は、演算子を有し、必要であれば更にオペランド１、又はオペランド１及びオペランド２を有している。
【００１８】
ステップＳ１４では、ＣＰＵは、図３の命令列から１命令を読み込む。ステップＳ１６では、ＣＰＵは、ＥＯＦを読み込んだか否かを判定する。読み込んだ場合にはステップＳ２０に、まだ読み込んでいない場合にはステップＳ１８に進む。
【００１９】
図５は、サブルーチンテーブル割り付け動作表の例を示す図である。ステップＳ１８では、ＣＰＵは、図３の命令列を解析して、命令列に含まれる複数のサブルーチンの間の依存関係を求める。具体的には、ＣＰＵは、読み込んだ命令の演算子とオペランドとを解釈し、図５のサブルーチンテーブル割り付け動作表に基づいて、サブルーチンテーブルを作成する。サブルーチンテーブルには、サブルーチンの間の依存関係、すなわち、サブルーチンと、そのサブルーチンから呼び出される子サブルーチンとの関係が示される。その後、ステップＳ１４に戻る。ステップＳ１８におけるサブルーチンテーブルの作成については後述する。
【００２０】
ステップＳ２０では、ＣＰＵは、作成されたサブルーチンテーブルに基づいて、親サブルーチンを決定する。図２のソースプログラムの場合、親サブルーチンはｆｕｎｃＡである。親サブルーチンが決定すると、サブルーチンテーブルを用いて、命令を実行される順に読み込むことが可能になる。親サブルーチンは複数存在することがある。
【００２１】
ステップＳ２２では、ＣＰＵは、ステップＳ１２で生成された図３の命令列を先頭から再度読み込むために、ポインタ等を初期化するとともに、ステップＳ１８で作成されたサブルーチンテーブルにオフセットフィールドを追加する。また、ＣＰＵは、ピークスタックアドレス及びサブルーチンの引数サイズＡＲを０に初期化する。
【００２２】
ステップＳ２４では、ＣＰＵは、図３の命令列から、１命令を実行される順に読み込む。ステップＳ２６では、ＣＰＵは、ＥＯＦを読み込んだか否かを判定する。読み込んだ場合にはステップＳ３０に、まだ読み込んでいない場合にはステップＳ２８に進む。
【００２３】
図６は、スタックフレームアドレス割り付け動作表の例を示す図である。ステップＳ２８では、ＣＰＵは、図３に含まれる複数のサブルーチンのそれぞれのスタックフレームに用いられる領域が重ならないように、ステップＳ１８で求められたサブルーチンテーブルに従って、図３の複数のサブルーチンに、対応するスタックフレームの相対アドレスを割り当てる。
【００２４】
具体的には、ＣＰＵは、図３の命令列から実行順に読み込まれた命令の演算子とオペランドとを解釈し、図５のサブルーチンテーブル割り付け動作表及び図６のスタックフレームアドレス割り付け動作表に基づいて、サブルーチンテーブルを更新する。サブルーチンテーブルの更新の際には、ＣＰＵは、サブルーチンの呼び出し毎に使用されるスタックフレームのサイズ（ローカル変数領域、引数領域、及び戻りアドレス領域の合計サイズ）を求め、各サブルーチンのスタックフレーム領域同士が互いに重ならないように、スタックフレームの先頭の相対アドレスであるオフセットを求める。その後、ステップＳ２４に戻る。ステップＳ２８におけるサブルーチンテーブルの更新については後述する。
【００２５】
ステップＳ３０では、ＣＰＵは、オフセットに従って、各サブルーチンのスタックフレーム領域同士が互いに重ならないように、スタックフレームを配置するための命令を生成して、図３の命令列に挿入する。
【００２６】
ステップＳ１８におけるサブルーチンテーブルの作成について説明する。図７は、初期状態のサブルーチンテーブルを示す図である。図８は、図３の命令Ｌ２が読み込まれた後のサブルーチンテーブルを示す図である。ＣＰＵは、まず、図７のサブルーチンテーブルを作成しておく。命令Ｌ２が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がｐｒｏｃ、オペランドがｆｕｎｃＡであると解釈し、図５のサブルーチンテーブル割り付け動作表に基づいて、サブルーチンテーブルの「サブルーチン名」のフィールドにｆｕｎｃＡを追加し、このｆｕｎｃＡを親サブルーチンとする。また、子サブルーチンのＡＲを０に初期化する。
【００２７】
図９は、図３の命令Ｌ３が読み込まれた後のサブルーチンテーブルを示す図である。命令Ｌ３が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がｓｕｂ、オペランドが１２であると解釈し、図５のサブルーチンテーブル割り付け動作表に基づいて、サブルーチンテーブル内のｆｕｎｃＡの行のローカル変数領域のフィールドに１２を追加する。
【００２８】
命令Ｌ３の次の命令が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がｍｏｖ、オペランド１が［ＳＰ−４］、オペランド２が１であると解釈する。しかし、このような命令は図５のサブルーチンテーブル割り付け動作表には存在しないため、ＣＰＵは、この命令に関してはサブルーチンテーブルの作成を行わない。以後も同様に、図５のサブルーチンテーブル割り付け動作表に存在しない命令は、サブルーチンテーブル作成に関与しない。
【００２９】
図１０は、図３の命令Ｌ６が読み込まれた後のサブルーチンテーブルを示す図である。命令Ｌ６が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がｐｕｓｈ、オペランドがＤ０であると解釈し、図５のサブルーチンテーブル割り付け動作表に基づいて、ＡＲに４を足す。
【００３０】
図１１は、図３の命令Ｌ７が読み込まれた後のサブルーチンテーブルを示す図である。命令Ｌ７が読み込まれたときには、ＣＰＵは、読み込んだ命令列から、演算子がｃａｌｌ、オペランドがｆｕｎｃＢであると解釈し、図５のサブルーチンテーブル割り付け動作表に基づいて、サブルーチンテーブル内のｆｕｎｃＡの行の子サブルーチン名のフィールドにｆｕｎｃＢを追加し、引数領域フィールドに４を追加した後、ＡＲを０に初期化する。
【００３１】
図１２は、図３の命令Ｌ１１が読み込まれた後のサブルーチンテーブルを示す図である。命令Ｌ１１が読み込まれたときには、ＣＰＵは、読み込んだ命令列から、演算子がｐｕｓｈ、オペランドがＤ１であると解釈し、図５のサブルーチンテーブル割り付け動作表に基づいて、ＡＲに４を足す。
【００３２】
図１３は、図３の命令Ｌ１３が読み込まれた後のサブルーチンテーブルを示す図である。命令Ｌ１３が読み込まれたときには、ＣＰＵは、読み込んだ命令列から、演算子がｐｕｓｈ、オペランドがＤ２であると解釈し、図５のサブルーチンテーブル割り付け動作表に基づいて、ＡＲに４を足す。
【００３３】
図１４は、図３の命令Ｌ１５が読み込まれた後のサブルーチンテーブルを示す図である。命令Ｌ１５が読み込まれたときには、ＣＰＵは、読み込んだ命令列から、演算子がｐｕｓｈ、オペランドがＤ０であると解釈し、図５のサブルーチンテーブル割り付け動作表に基づいて、ＡＲに４を足す。
【００３４】
図１５は、図３の命令Ｌ１６が読み込まれた後のサブルーチンテーブルを示す図である。命令Ｌ１６が読み込まれたときには、ＣＰＵは、読み込んだ命令列から、演算子がｃａｌｌ、オペランドがｆｕｎｃＤであると解釈し、図５のサブルーチンテーブル割り付け動作表に基づいて、サブルーチンテーブル内のｆｕｎｃＡの行の子サブルーチン名のフィールドにｆｕｎｃＤを追加し、引数領域フィールドに１２を追加した後、ＡＲを０に初期化する。
【００３５】
命令Ｌ１７以下、命令Ｌ６９（ＥＯＦ）を読み込むまで同様の動作を繰り返す。図１６は、図１のステップＳ１８で求められた最終的なサブルーチンテーブルを示す図である。ステップＳ２０では、図１６のサブルーチンテーブルに基づいて、ＣＰＵは、親サブルーチンを決定する。親サブルーチンは、サブルーチンテーブルにおいて、サブルーチン名のフィールドに存在し、かつ、子サブルーチン名のフィールドに存在しないサブルーチンである。図２のソースプログラムの場合、親サブルーチンはｆｕｎｃＡであることがわかる。
【００３６】
ステップＳ２８におけるサブルーチンテーブルの更新について説明する。ここでは、ＣＰＵは、図３の命令列を順に実行する場合に必要となるスタックフレームを求めることにより、スタックフレームの先頭アドレス（ピークスタックアドレス）を求める。図１７は、図３の命令Ｌ２が読み込まれた後のスタックフレームを示す説明図である。命令Ｌ２が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がｐｒｏｃ、オペランドがｆｕｎｃＡであると解釈し、図５のサブルーチンテーブル割り付け動作表に基づいて、アドレスＡＳをＡＲＧＳ（＝０）に初期化する。
【００３７】
図１８は、図３の命令Ｌ３が読み込まれた後のスタックフレームを示す説明図である。命令Ｌ３が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がｓｕｂ、オペランドが１２であると解釈し、図６のスタックフレームアドレス割り付け動作表のとおり、アドレスＡＳから１２を引く。
【００３８】
次に読み込まれた命令ｍｏｖは、図６のスタックフレームアドレス割り付け動作表には存在しないため、ＣＰＵは、この命令に関してはサブルーチンテーブルの作成を行わない。以後も同様に、図６のスタックフレームアドレス割り付け動作表に存在しない命令は、サブルーチンテーブル更新に関与しない。
【００３９】
図１９は、図３の命令Ｌ６が読み込まれた後のスタックフレームを示す説明図である。命令Ｌ６が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がｐｕｓｈ、オペランドがＤ０であると解釈し、図６のスタックフレームアドレス割り付け動作表に基づいて、アドレスＡＳから４を引く。
【００４０】
図２０は、図３の命令Ｌ７が読み込まれた後のスタックフレームを示す説明図である。図２１は、図２０のときのサブルーチンテーブルを示す図である。命令Ｌ７が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がｃａｌｌ、オペランドがｆｕｎｃＢであると解釈し、図６のスタックフレームアドレス割り付け動作表に基づいて、アドレスＡＳから４を引く。
【００４１】
図２２は、図３の命令Ｌ２３が読み込まれた後のスタックフレームを示す説明図である。命令Ｌ２３が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がｓｕｂ、オペランドが８であると解釈し、図６のスタックフレームアドレス割り付け動作表に基づいて、アドレスＡＳから８を引く。
【００４２】
図２３は、図３の命令Ｌ２７，Ｌ３０が読み込まれた後のスタックフレームを示す説明図である。命令Ｌ２７，Ｌ３０が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がｐｕｓｈ、オペランドがそれぞれＤ０，Ｄ１であると解釈し、図６のスタックフレームアドレス割り付け動作表に基づいて、アドレスＡＳから８を引く。
【００４３】
図２４は、図３の命令Ｌ３１が読み込まれた後のスタックフレームを示す説明図である。命令Ｌ３１が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がｃａｌｌ、オペランドがｆｕｎｃＣであると解釈し、図６のスタックフレームアドレス割り付け動作表に基づいて、アドレスＡＳから４を引く。このとき、ピークスタックアドレスは、ＡＳ＝ＡＲＧＳ−４０となる。
【００４４】
図２５は、図３の命令Ｌ４５が読み込まれた後のスタックフレームを示す説明図である。図２６は、図２５のときのサブルーチンテーブルを示す図である。命令Ｌ４５が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がｒｅｔであると解釈し、図６のスタックフレームアドレス割り付け動作表に基づいて、アドレスＡＳに４を足す。ここまでにピークスタックアドレスが更新されているため、ＣＰＵは、サブルーチンテーブル内の現在の親サブルーチンｆｕｎｃＣの行のオフセットフィールドにピークスタックアドレスに対応する値４０を追加する。
【００４５】
図２７は、図３の命令Ｌ３２が読み込まれた後のスタックフレームを示す説明図である。命令Ｌ３２が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がａｄｄ、オペランドが１６であると解釈し、図６のスタックフレームアドレス割り付け動作表に基づいて、アドレスＡＳに１６を足す。
【００４６】
図２８は、図３の命令Ｌ３３が読み込まれた後のスタックフレームを示す説明図である。命令Ｌ３３が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がｒｅｔであると解釈し、図６のスタックフレームアドレス割り付け動作表に基づいて、アドレスＡＳに４を足す。
【００４７】
図２９は、図３の命令Ｌ８が読み込まれた後のスタックフレームを示す説明図である。命令Ｌ８が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がａｄｄ、オペランドが４であると解釈し、図６のスタックフレームアドレス割り付け動作表に基づいて、アドレスＡＳに４を足す。
【００４８】
図３０は、図３の命令Ｌ１５が読み込まれた後のスタックフレームを示す説明図である。命令Ｌ１１，Ｌ１３，Ｌ１５が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がｐｕｓｈ、オペランドがそれぞれＤ１，Ｄ２，Ｄ０であると解釈し、図６のスタックフレームアドレス割り付け動作表に基づいて、ピークスタックアドレスから１２（４×３）を引き、得られた値をアドレスＡＳとする。
【００４９】
ここで、ＣＰＵは、スタックフレームとしてこれまでに用いられた領域に上書きをしないように、すなわち、アドレスがピークスタックアドレス以上の領域を用いないように、命令Ｌ１１，Ｌ１３，Ｌ１５の実行に必要な領域を確保している。このため、この時点で図３の命令列の実行を中断した場合においても、ｆｕｎｃＡ、ｆｕｎｃＢ、ｆｕｎｃＣ及びｆｕｎｃＤの全てのスタックフレームが上書きされずにデータメモリに存在するようになる。
【００５０】
図３１は、図３の命令Ｌ１６が読み込まれた後のスタックフレームを示す説明図である。命令Ｌ１６が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がｃａｌｌ、オペランドがｆｕｎｃＤであると解釈し、図６のスタックフレームアドレス割り付け動作表に基づいて、アドレスＡＳから４を引く。
【００５１】
図３２は、図３の命令Ｌ５６が読み込まれた後のスタックフレームを示す説明図である。図３３は、図３２のときのサブルーチンテーブルを示す図である。命令Ｌ５６が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がｒｅｔであると解釈し、図６のスタックフレームアドレス割り付け動作表に基づいて、アドレスＡＳに４を足す。このとき、ピークスタックアドレスは、ＡＳ＝ＡＲＧＳ−５６となる。ここまでにピークスタックアドレスが更新されているため、ＣＰＵは、サブルーチンテーブル内の現在の親サブルーチンｆｕｎｃＤの行のオフセットフィールドにピークスタックアドレスに対応する値５６を追加する。
【００５２】
図３４は、図３の命令Ｌ１７が読み込まれた後のスタックフレームを示す説明図である。命令Ｌ１７が読み込まれたときには、ＣＰＵは、読み込んだ命令から、演算子がａｄｄ、オペランドが１２であると解釈し、図６のスタックフレームアドレス割り付け動作表に基づいて、アドレスＡＳに１６を足す。
【００５３】
その後、命令Ｌ６９（ＥＯＦ）を読み込むと、ステップＳ３０が実行される。ステップＳ３０では、ＣＰＵは、図３３のサブルーチンテーブルに基づいて、各サブルーチンのスタックフレーム領域同士が互いに重ならないように、命令列の生成を行う。図３５は、図１のプログラム変換方法によって図３の命令列から変換された命令列の例を示す図である。
【００５４】
具体的には、ステップＳ３０では、ＣＰＵは、図３３のサブルーチンテーブルのｆｕｎｃＣの行に示されたオフセットの値４０に従って、スタックフレームを配置するための命令Ｌ９２及びＬ９４（図３５を参照）を生成して、図３の命令列に挿入し、図３５の命令列を生成する。すなわち、サブルーチンｆｕｎｃＤを呼び出す前に、命令Ｌ９２によってポインタＳＰを動かし、スタックフレーム領域同士が重ならないようにし、サブルーチンｆｕｎｃＤの終了後、命令Ｌ９４によってポインタＳＰを元の位置に戻すようにしている。
【００５５】
図３６は、本発明の実施形態によるデバッグ装置の構成例を示すブロック図である。図３６のデバッグ装置は、命令メモリ１２と、データメモリ１４と、ＣＰＵ２０とを有している。ＣＰＵ２０は、プログラムカウンタ２２と、ステータス保持部２４と、スタックアドレス保持部２６と、汎用データ保持部２８と、命令デコーダ３２と、メモリアクセス部３４と、トレース読み出し部３６とを有している。
【００５６】
命令メモリ１２には、例えば図３５の命令列が格納されている。プログラムカウンタ２２は、そのカウント値を、実行するべき命令が格納された命令メモリ１２のアドレスとして出力し、命令が実行されるとカウント値のインクリメント等を行う。命令デコーダ３２は、プログラムカウンタ２２のカウント値によって示された命令を命令メモリ１２から読み出し、命令の解釈及び実行をする。命令デコーダ３２は、読み出された命令がサブルーチン呼び出し命令であると解釈した場合には、この命令から、格納されるデータのサイズである転送サイズを取り出し、メモリアクセス部３４及びトレース読み出し部３６に対して、データを格納すべきアドレスである転送先アドレス及び転送サイズを出力する。命令デコーダ３２は、このような命令の解釈及び実行を繰り返す。
【００５７】
ステータス保持部２４は、図３６のデバッグ装置の状態を格納する。デバッグ装置の状態は、例えば、プログラムカウンタ２２、ステータス保持部２４、及び汎用データ保持部２８のデータに関する比較結果、ＣＰＵ２０に対する割込みの可否状態、並びにオーバーフローの発生状態である。スタックアドレス保持部２６は、スタック領域を示すポインタを格納する。汎用データ保持部２８は、命令列の実行に従って得られた結果を格納する。
【００５８】
メモリアクセス部３４は、命令デコーダ３２の出力に従って、プログラムカウンタ２２のカウント値、並びに、ステータス保持部２４、スタックアドレス保持部２６及び汎用データ保持部２８のそれぞれが保持する値等をデータメモリ１４に格納する。また、メモリアクセス部３４は、命令列の実行の際に必要なデータをデータメモリ１４から読み出して命令デコーダ３２に出力し、命令列の実行の結果として得られたデータをデータメモリ１４に格納する。
【００５９】
命令デコーダ３２は、トレース読み出し部３６には、トレースデータ読み出し要求も出力する。命令デコーダ３２は、例えば、サブルーチンの呼び出しやジャンプ命令を実行する毎に、トレースデータ読み出し要求を出力する。トレース読み出し部３６は、命令デコーダ３２からのトレースデータ読み出し要求に従い、転送先アドレスが示すデータメモリ１４のアドレスからデータ読み出しを開始する。トレース読み出し部３６は、読み出したトレースデータを図３６の装置の外部へ出力することを、転送サイズ分のデータを出力するまで繰り返す。ただし、トレース読み出し部３６は、新たなトレースデータ読み出し要求を受けると、データ読み出しを中止し、新たなトレースデータ読み出し要求に従ってデータ読み出しを開始する。
【００６０】
図３７は、トレースデータ読み出し要求の間隔が十分にある場合における、図３６のデバッグ装置のタイミングチャートである。図３８は、トレースデータ読み出し要求の間隔が十分にない場合における、図３６のデバッグ装置のタイミングチャートである。
【００６１】
図３７の場合、トレース読み出し部３６は、命令デコーダ３２からの１回目のトレースデータ読み出し要求（スタックアドレス＝０、スタックサイズ１６）によるアクセスが終了した後に、２回目のトレースデータ読み出し要求（スタックアドレス＝１０、スタックサイズ１２）を受けている。
【００６２】
図３８の場合、トレース読み出し部３６は、命令デコーダ３２からの１回目のトレースデータ読み出し要求（スタックアドレス＝０、スタックサイズ１６）によるアクセスが終了する前に、２回目のトレースデータ読み出し要求（スタックアドレス＝１０、スタックサイズ１２）を受け取っている。この場合、トレース読み出し部３６は、２回目のアクセスを優先させる。すなわち、トレース読み出し部３６は、２回目のトレースデータ読み出し要求を受けると、１回目のトレースデータ読み出し要求によるトレースデータの出力を中断し、２回目のトレースデータ読み出し要求に従って、転送先アドレス及び転送サイズが示すデータのデータメモリ１４からの読み出しを開始する。トレース読み出し部３６は、転送サイズ分のデータの出力を行う。
【００６３】
このように、図３６のデバッグ装置によると、データメモリからデータを読み出してトレースするので、トレース用の専用のメモリを必要とすることなく、低コストでデバッグに必要な情報をトレースすることが可能となる。また、図３８のように、新たなトレースデータ読み出し要求を受けると、その要求に従ってデータ読み出しを開始するので、サブルーチンが実行される毎に、そのサブルーチンについて、デバッグを行うのに最低限必要な情報をトレースして出力することが可能となる。したがって、デバッグの効率を向上させることができる。
【００６４】
更に、図１のプログラム変換方法によって命令列を変換しておくと、複数のサブルーチンのそれぞれのスタックフレームに用いられる領域が重ならないように、スタックフレームが配置されるので、スタックフレームが他のサブルーチンのスタックフレームに上書きされずに残される。命令列の実行中断時や実行終了後であってもトレースが可能となるので、データの読み出し速度が遅くても十分にトレースが可能となる。したがって、デバッグ効率を向上させることができる。
【００６５】
図３９は、図３６のデバッグ装置の変形例の構成を示すブロック図である。図３９のデバッグ装置は、メモリアクセス部３４及びトレース読み出し部３６から同時にアクセス可能なデュアルポートメモリであるキャッシュメモリ２１６を有している点が、図３６のデバッグ装置とは異なっている。キャッシュメモリ２１６は、メモリアクセス部３４からデータメモリ１４に書き込まれるデータを、一方のポートを経由させて格納しながらデータメモリ１４に出力し、格納されたデータを、もう一方のポートを経由させてトレース読み出し部３６に出力する。トレース読み出し部３６は、必要に応じてデータメモリ１４からもデータの読み出しを行う。
【００６６】
これによると、メモリアクセス部３４がキャッシュメモリ２１６の１つのポートに対してデバッグ情報を書き込みながら、トレース読み出し部３６がキャッシュメモリ２１６のもう１つのポートからデバッグ情報を読み出すことができる。したがって、命令を実行する性能を損ねることなく、デバッグに必要な情報をトレースすることが可能となり、デバッグ効率を向上させることができる。
【００６７】
なお、プログラムカウンタ２２、ステータス保持部２４、スタックアドレス保持部２６、及び汎用データ保持部２８をレジスタウィンドウに置き換えてもよい。
【００６８】
本発明の多くの特徴及び優位性は、記載された説明から明らかであり、よって添付の特許請求の範囲によって、本発明のそのような特徴及び優位性の全てをカバーすることが意図される。更に、多くの変更及び改変が当業者には容易に可能であるので、本発明は、図示され記載されたものと全く同じ構成及び動作に限定されるべきではない。したがって、全ての適切な改変物及び等価物は本発明の範囲に入るものとされる。
【産業上の利用可能性】
【００６９】
以上説明したように、本発明の実施形態によると、低コストでプログラムのデバッグが可能であるので、本発明は、デバッグ装置及びプログラム変換方法等について有用である。
【符号の説明】
【００７０】
１２  命令メモリ
１４  データメモリ
２２  プログラムカウンタ
２４  ステータス保持部
３２  命令デコーダ
３４  メモリアクセス部
３６  トレース読み出し部
２１６  キャッシュメモリ
【図１】
2011002934.tif 000003
【図２】
2011002934.tif 000004
【図３】
2011002934.tif 000005
【図４】
2011002934.tif 000006
【図５】
2011002934.tif 000007
【図６】
2011002934.tif 000008
【図７】
2011002934.tif 000009
【図８】
2011002934.tif 000010
【図９】
2011002934.tif 000011
【図１０】
2011002934.tif 000012
【図１１】
2011002934.tif 000013
【図１２】
2011002934.tif 000014
【図１３】
2011002934.tif 000015
【図１４】
2011002934.tif 000016
【図１５】
2011002934.tif 000017
【図１６】
2011002934.tif 000018
【図１７】
2011002934.tif 000019
【図１８】
2011002934.tif 000020
【図１９】
2011002934.tif 000021
【図２０】
2011002934.tif 000022
【図２１】
2011002934.tif 000023
【図２２】
2011002934.tif 000024
【図２３】
2011002934.tif 000025
【図２４】
2011002934.tif 000026
【図２５】
2011002934.tif 000027
【図２６】
2011002934.tif 000028
【図２７】
2011002934.tif 000029
【図２８】
2011002934.tif 000030
【図２９】
2011002934.tif 000031
【図３０】
2011002934.tif 000032
【図３１】
2011002934.tif 000033
【図３２】
2011002934.tif 000034
【図３３】
2011002934.tif 000035
【図３４】
2011002934.tif 000036
【図３５】
2011002934.tif 000037
【図３６】
2011002934.tif 000038
【図３７】
2011002934.tif 000039
【図３８】
2011002934.tif 000040
【図３９】
2011002934.tif 000041