(57)【要約】      （修正有）【課題】コンピュータプログラムの実行をトレースするのに適した新規な命令及び装置を提供する。【解決手段】コンピュータ１は、ＣＰＵ１０及びＣＰＵ１０に結合されたトレースユニット１５を備える。ＣＰＵ１０は、定数を示す即値フィールドを有する第１の命令をデコードしたことに応答して、当該定数をトレースユニット１５に供給する。トレースユニット１５は、ＣＰＵ１０における当該第１の命令の実行に応答して、当該定数を含むトレースデータを出力する。【選択図】図２
2015069453.tif 000002
【特許請求の範囲】
【請求項１】
ＣＰＵ（Central Processing Unit）及び前記ＣＰＵに結合されたトレースユニットを備え、
前記ＣＰＵは、定数を示す即値フィールドを有する第１の命令をデコードしたことに応答して、前記定数を前記トレースユニットに供給するよう構成され、
前記トレースユニットは、前記ＣＰＵにおける前記第１の命令の実行に応答して、前記定数を含むトレースデータを出力するよう構成されている、
コンピュータシステム。
【請求項２】
前記定数は、プログラムに含まれる関数、スレッド、プロセス、又はタスクの識別子を示す、請求項１に記載のコンピュータシステム。
【請求項３】
前記第１の命令は、前記プログラム内において、前記関数、前記スレッド、前記プロセス、又は前記タスクの命令群の直前、前記命令群の中、又は前記命令群の直後に配置される、請求項２に記載のコンピュータシステム。
【請求項４】
前記第１の命令は、プログラムの実行をトレースするために定義された命令である、請求項１〜３のいずれか１項に記載のコンピュータシステム。
【請求項５】
前記第１の命令は、レジスタオペランドを指定するためのレジスタフィールドを含まない、請求項１〜４のいずれか１項に記載のコンピュータシステム。
【請求項６】
前記第１の命令は、１個の命令のみを含む、請求項１〜５のいずれか１項に記載のコンピュータシステム。
【請求項７】
前記ＣＰＵは、前記ＣＰＵで実行される命令においてレジスタオペランドとして指定される複数の汎用レジスタを備え、
前記ＣＰＵは、前記第１の命令の実行において、前記定数を前記複数の汎用レジスタに格納すること無く、前記定数を前記トレースユニットに供給する、
請求項１〜６のいずれか１項に記載のコンピュータシステム。
【請求項８】
前記ＣＰＵは、
命令デコード及びディスパッチユニットと、
実行ユニットと、
前記実行ユニットに入力されるデータ及び前記実行ユニットから出力されるデータを一時的に格納するために汎用的に使用される複数の汎用レジスタと、
完了ユニットと、
を備え、
前記命令デコード及びディスパッチユニットは、前記第１の命令をデコードしたことに応答して、前記即値フィールドに示された前記定数を前記実行ユニットに供給するよう構成され、
前記実行ユニットは、前記第１の命令の実行において、前記定数を前記複数の汎用レジスタに格納すること無く、前記定数を前記完了ユニットに供給するよう構成され、
前記完了ユニットは、前記定数を含む前記第１の命令の実行結果を前記トレースユニットに供給するよう構成されている、
請求項１〜６のいずれか１項に記載のコンピュータシステム。
【請求項９】
前記トレースデータは、前記第１の命令のアドレスをさらに含む、請求項１〜８のいずれか１項に記載のコンピュータシステム。
【請求項１０】
前記トレースユニットは、前記定数を第１の条件に基づいてフィルタし、前記定数が前記第１の条件に一致することを条件として、前記定数を前記トレースデータとして選択的に出力するフィルタ回路を備える、請求項１〜９のいずれか１項に記載のコンピュータシステム。
【請求項１１】
ＣＰＵ（Central Processing Unit）及び前記ＣＰＵに結合されたトレースユニットを備え、
前記ＣＰＵは、複数のレジスタを示すフィールドを有する１個の命令をデコードしたことに応答して、前記複数のレジスタの値を前記トレースユニットに供給するよう構成され、
前記トレースユニットは、前記ＣＰＵにおける前記１個の命令の実行に応答して、前記複数のレジスタの値を含むトレースデータを出力するよう構成されている、
コンピュータシステム。
【請求項１２】
前記１個の命令は、プログラムの実行をトレースするために定義された命令である、請求項１１に記載のコンピュータシステム。
【請求項１３】
前記フィールドは、前記複数のレジスタに含まれる先頭レジスタと最後のレジスタによって前記複数のレジスタの範囲を指定する、請求項１１又は１２に記載のコンピュータシステム。
【請求項１４】
前記フィールドは、複数のビットを含み、
前記複数のビットは、前記複数のレジスタにそれぞれ対応付けられており、
前記複数のビットの各々は、対応付けられたレジスタの値が前記トレースユニットに供給されるべきか否かを示す、
請求項１１又は１２に記載のコンピュータシステム。
【請求項１５】
前記ＣＰＵは、前記複数のレジスタの値を前記トレースユニットに順次供給する際に、前記１個の命令のアドレス及びマルチサイクル信号を前記トレースユニットにさらに供給し、
前記マルチサイクル信号は、前記ＣＰＵがマルチサイクル命令を実行していることを示し、
前記トレースユニットは、前記マルチサイクル信号を認識し、前記トレースデータに含まれる前記アドレスを示すデータ数が、前記複数のレジスタの数より小さくなるように削減する、
請求項１１〜１４のいずれか１項に記載のコンピュータシステム。
【請求項１６】
前記トレースユニットは、前記複数のレジスタを第１の条件に基づいてフィルタし、前複数のレジスタの値のうち前記第１の条件に一致する少なくとも１つの値を選択的に前記トレースデータとして出力するフィルタ回路を備える、請求項１１〜１５のいずれか１項に記載のコンピュータシステム。
【請求項１７】
ソースコードをメモリから読み込むこと、及び
前記ソースコードを解析し、前記ソースコードをアセンブリコードに変換すること、
を備え、
前記変換することは、（ａ）前記ソースコードに含まれている関数、スレッド、プロセス、又はタスクの処理を実行するためのアセンブリコード部分、及び（ｂ）前記関数、前記スレッド、前記プロセス、又は前記タスクの識別子を示す即値フィールドを有する第１のアセンブリ命令、を前記アセンブリコードに挿入することを備える、
コンパイリング方法をコンピュータに行わせるためのプログラム。
【請求項１８】
前記第１のアセンブリ命令は、前記アセンブリコードに基づく実行可能プログラムコードがＣＰＵ（Central Processing Unit）において実行された場合に、前記ＣＰＵに結合されたトレースユニットに前記即値フィールドに示された前記識別子を供給するよう前記ＣＰＵを動作させる、請求項１７に記載のプログラム。
【請求項１９】
前記ソースコードは、前記第１のアセンブリ命令に対応する明示的な命令を含んでいない、請求項１７又は１８に記載のプログラム。
【請求項２０】
前記変換することは、前記関数、前記スレッド、前記プロセス、又は前記タスクの検出に応じて、前記第１のアセンブリ命令に対応する明示的な命令を含んでいない前記ソースコードから、前記第１のアセンブリ命令を生成することをさらに備える、請求項１７〜１９のいずれか１項に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータに関し、例えば、プログラムの実行に基づくトレースデータを出力するコンピュータに好適に利用できるものである。
【背景技術】
【０００２】
マルチプログラミング環境とは、複数のプログラムを定期的に切り替えて実行したり、あるイベントの発生に応じて実行するプログラムを切り替えたりすることによって、複数のプログラムがあたかも並列実行されているような環境を意味する。マルチプログラミングは、マルチプロセス、マルチスレッド、マルチタスク等と呼ばれる場合もある。プロセス、スレッド及びタスクは、マルチプログラミング環境で並列実行される処理単位を意味する。これらの用語はしばしば混同して用いられるが、一般的には、プロセスは、メモリ空間などのプログラム実行環境が独立に割り当てられ、他のプロセスとの独立性の高い並列処理単位である。一方、スレッドは、並列処理されるプロセスに含まれるさらに細かな並列処理単位である。マルチスレッド環境では、プロセスは複数のスレッドを含む。各スレッドはプロセスに割り当てられた資源にアクセス可能であり、同じプロセス内の複数のスレッドは、メモリ空間を共用する。スレッド及びプロセスは、タスクと呼ばれることもある。
【０００３】
マルチプログラミング環境で実行されるプログラムのデバッグを支援するために、図１に示すように、関数、スレッド、又はプロセスの実行及びこれらの遷移を示すチャートを表示するツールが知られている。図１の例では、タスク（つまり、スレッド又はプロセス）の時間遷移が視覚的に表示されている。なお、関数は、特定の処理を行うための命令シーケンスを含むパッケージ化されたプログラムモジュールである。本明細書で使用される「関数」との用語は、代表的な構造化プログラミング言語であるC及びC++に従って、戻り値を返す厳密な意味での関数と戻り値を返さないプロシージャを含む概念を意味する。本明細書で使用される「関数」との用語は、サブルーチン、サブプログラム、またはメソッドと呼ぶこともできる。
【０００４】
関数、スレッド、又はプロセスの遷移を把握するため、ソースコードからアセンブリコードを生成するコンパイリングにおいて、マーカー命令又はチェックポイント命令と呼ばれるコードをアセンブリコードに挿入することが行われている。マーカー命令又はチェックポイント命令は、ソースコードに記述された本来の処理を行うための演算命令及びロード／ストア命令等とは異なり、プログラムの実行をトレースするために定義されたデバッグ用の命令である。チェックポイント命令又はマーカー命令は、プログラムの実行に基づくトレースデータを出力するよう構成されたコンピュータにおいて実行される。
【０００５】
例えば、特許文献１は、ＣＰＵ（Central Processing Unit）及びモニタユニットを有するコンピュータを開示している。特許文献１では、ＣＰＵ（Central Processing Unit）は、マーカー命令をデコードしたことに応答して、モニタユニットを起動するためにマーカー解読信号（パルス信号）をモニタユニットに供給する。そして、モニタユニットは、マーカー解読信号の受信に応答して、マーカー命令のアドレス（プログラムカウンタ値）、及びアキュムレータの値を取得し、マーカー命令であることを示す識別子（例えば、「Ｍ」のような識別子）、マーカー命令のアドレス、及びアキュムレータの値を含むトレースデータを出力する。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平１０−７８８８９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
特許文献１に示されているように、マーカー命令（又はチェックポイント命令）は、一般的に、マーカー命令であることを示す識別子、（例えば、「Ｍ」のような識別子）、マーカー命令のアドレス、及びアキュムレータ等のレジスタの値を含むトレースデータを出力するために使用される。しかしながら、このような、マーカー命令（又はチェックポイント命令）、及びマーカー命令に応じたコンピュータの動作は、複雑なコンピュータプログラムの実行をトレースするためには十分でないかもしれない。
【０００８】
例えば、マーカー命令が関数の直前に配置されたプログラムをコンピュータが実行する場合を考える。この場合、デバッガ（デバッグホスト）は、マーカー命令と関数ＩＤ（Identifier）との対応関係を定めたテーブルを準備し、トレースデータに含まれるマーカー命令のアドレスを当該テーブルと比較することで、マーカー命令のアドレスに対応する関数ＩＤを特定することが考えられる。しかしながら、マーカー命令のアドレスに対応する関数ＩＤが一意に決定できるとは限らない。例えば、オーバーレイプログラム等では、異なるプログラムが同じ命令アドレスを使用する可能性がある。したがって、命令アドレスのみでは関数ＩＤを一意に区別することができない。トレースデータの中に同じ命令アドレスを持つ複数のマーカー命令の実行結果が含まれている場合、コンピュータで実行された関数をマーカー命令の命令アドレスに基づいて特定することは困難である。したがって、コンピュータが動作しているときの関数、スレッド、又はプロセス等の遷移をトレースデータに基づいて把握することが困難であるという第１の課題がある。
【０００９】
また、例えば、複数のレジスタの値、例えば、関数又はスレッドの複数の引数又は複数の戻り値、をトレースデータとして出力することが必要とされる。この場合、一般的には、複数のレジスタに応じた数の複数の命令をプログラムに配置しなければならない。したがって、複数のレジスタの値をトレースデータとして出力するために多くの命令（一般的には出力されるレジスタの数と同じだけの命令）を必要とするという第２の課題がある。
【００１０】
以下では、上述した第１及び第２の課題を含む複数の課題のうち少なくとも１つの解決に寄与することが可能な複数の実施形態が説明される。その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１１】
一実施形態において、ＣＰＵは、定数を示す即値フィールドを有する第１の命令をデコードしたことに応答して、前記定数をトレースユニットに供給する。そして、前記トレースユニットは、前記ＣＰＵにおける前記第１の命令の実行に応答して、前記定数を含むトレースデータを出力する。
【００１２】
別の実施形態において、ＣＰＵは、複数のレジスタを示すフィールドを有する１個の命令をデコードしたことに応答して、前記複数のレジスタの値を前記トレースユニットに供給する。そして、前記トレースユニットは、前記ＣＰＵにおける前記１個の命令の実行に応答して、前記複数のレジスタの値を含むトレースデータを出力する。
前記
【発明の効果】
【００１３】
上述した複数の実施形態は、上述した第１及び第２の課題の少なくとも１つの解決に貢献することができる。
【図面の簡単な説明】
【００１４】
【図１】背景技術に係るタスクの遷移を示すチャートの一例である。
【図２】第１の実施形態に係るコンピュータとその周辺装置を示すブロック図である。
【図３】第１の実施形態に係るDBTAG命令の命令フォーマットの一例を示す図である。
【図４】第１の実施形態に係るＣＰＵの動作の一例を示すフローチャートである。
【図５】第１の実施形態に係るコンピュータの構成例を示すブロック図である。
【図６】第１の実施形態に係るＣＰＵの構成の一例を示すブロック図である。
【図７】第２の実施形態に係るコンピュータとその周辺装置を示すブロック図である。
【図８】第２の実施形態に係るDBPUSH命令の命令フォーマットの一例を示す図である。
【図９】第２の実施形態に係るDBPUSH命令の命令フォーマットの他の例を示す図である。
【図１０】第２の実施形態に係るＣＰＵの動作の一例を示すフローチャートである。
【図１１】第２の実施形態に係るＣＰＵの構成の一例を示すブロック図である。
【図１２】第３の実施形態に係るコンピュータとその周辺装置を示すブロック図である。
【図１３】第３の実施形態に係るＣＰＵの構成の一例を示すブロック図である。
【図１４】第３の実施形態に係るＣＰＵから出力されるトレース情報を示すタイミングチャートである。
【図１５】第３の実施形態に係るトレースユニットによって生成されるトレースデータのフォーマットの一例を示す図である。
【図１６】第４の実施形態に係るコンピュータとその周辺装置を示すブロック図である。
【図１７】第４の実施形態に係るフィルタの第１の構成例を示すブロック図である。
【図１８】第４の実施形態に係るフィルタの第２の構成例を示すブロック図である。
【図１９】第４の実施形態に係るフィルタの第３の構成例を示すブロック図である。
【図２０】第５の実施形態に係るコンピュータシステムの構成例を示すブロック図である。
【図２１】ソースコードを実行可能プログラムに変換する過程を示す図である。
【図２２】第５の実施形態に係るコンパイリング処理の一例を示すフローチャートである。
【発明を実施するための形態】
【００１５】
以下では、具体的な実施形態について、図面を参照しながら詳細に説明する。各図面において、同一又は対応する要素には同一の符号が付されており、説明の明確化のため、必要に応じて重複説明は省略される。
【００１６】
＜第１の実施形態＞
図２は、本実施形態に係るコンピュータ１とその周辺装置を示すブロック図である。本実施形態に係るコンピュータ１は、例えば、マイクロプロセッサ、マイクロコンピュータ、マイクロコントローラ、又はＳｏＣ（System on Chip）である。コンピュータ１は、１つのＩＣチップのみで構成されてもよいし、複数のＩＣチップにより構成されてもよい。コンピュータ１は、マルチプログラミング環境を提供し、コンピュータ１は、コンピュータプログラム（実行可能プログラム）を実行するとともに、コンピュータプログラムの実行に基づくトレースデータを出力するよう構成されており、メモリ５０及び記憶装置６０と結合される。
【００１７】
メモリ５０は、コンピュータ１において実行されるコンピュータプログラム（命令群）、及びコンピュータ１において演算されるデータ、コンピュータ１において演算されたデータ等を格納する。言い換えると、メモリ５０は、命令メモリ（又は命令キャッシュ）及びデータメモリ（又はデータキャシュ）を含む。メモリ５０は、揮発性メモリ若しくは不揮発性メモリ、又はこれらの組合せによって構成されてもよい。揮発性メモリは、例えば、ＳＲＡＭ（Static Random Access Memory）若しくはＤＲＡＭ（Dynamic Random Access Memory）又はこれらの組合せである。不揮発性メモリは、例えば、マスクＲＯＭ（Read Only Memory）、プログラマブルＲＯＭ、フラッシュメモリ、若しくはハードディスクドライブ、又はこれらの組合せである。
【００１８】
記憶装置６０は、コンピュータ１から出力されるトレースデータを格納する。記憶装置６０は、揮発性メモリ若しくは不揮発性メモリ、又はこれらの組合せによって構成されてもよい。記憶装置６０は、コンピュータ１と同じチップに配置されてもよいし（on-chip）、コンピュータ１の外部に配置されてもよい（off-chip）。記憶装置６０は、デバッガソフトウェアを実行し、コンピュータ１及びメモリ５０を含むターゲットシステムのデバッグを制御するコンピュータシステム（つまり、デバッグホスト）内に配置されてもよい。
【００１９】
コンピュータ１は、ＣＰＵ（Central Processing Unit）１０及びトレースユニット１５を含む。ＣＰＵ１０は、ＭＰＵ（Micro Processing Unit）、ＣＰＵコア、ＭＰＵコア、又はプロセッサコアと呼ぶこともできる。ＣＰＵ１０は、コンピュータプログラムに含まれる命令をメモリ５０から読み出し、命令をデコードし、命令に応じた演算及びメモリアクセス（ロード及びストア）等の処理を実行する。さらに、ＣＰＵ１０は、コンピュータプログラムに含まれるデバッグ又はトレース用に定義された命令をデコードしたことに応じて、トレース情報を生成し、トレース情報をトレースユニット１５に供給するよう動作する。ＣＰＵ１０は、キャッシュメモリ、命令フェッチユニット、命令デコードユニット、シーケンサ等の制御ユニット、ＡＬＵ（Arithmetic Logic Unit）、ロード／ストアユニット、及びその他の機能ユニットを含んでもよい。ＡＬＵは、加算器、乗算器及び除算器などの算術演算ユニット、論理演算ユニット、並びにシフタ等を含む。
【００２０】
トレースユニット１５は、ＣＰＵ１０からトレース情報を受信し、トレース情報を整形してトレースデータを生成し、トレースデータを記憶装置６０に出力する。トレースユニット１５は、トレースを制御するトレースコントローラ、トレース情報を一時的に蓄積するトレースバッファ、記憶装置６０と通信するためのインタフェースを含んでもよい。
【００２１】
さらに、本実施形態に係るコンピュータ１において、ＣＰＵ１０は、定数を示す即値フィールドを有するDBTAG命令をデコードしたことに応答して、DBTAG命令の即値フィールドに示された定数をトレースユニット１５に供給するよう動作する。そして、トレースユニット１５は、ＣＰＵ１０におけるDBTAG命令の実行に応答して、DBTAG命令の即値フィールドに示された定数を含むトレースデータを出力するよう動作する。
【００２２】
DBTAG命令は、ＣＰＵ１０において実行されるコンピュータプログラムの実行をトレースするために定義された命令である。例えば、DBTAG命令は、コンピュータプログラムに含まれている関数、スレッド、プロセス、又はタスクの実行をトレースするために用いることができる。この場合、DBTAG命令の即値フィールドは、コンピュータプログラムに含まれている関数、スレッド、プロセス、又はタスクの識別子を示してもよい。DBTAG命令は、コンピュータプログラム内において、関数、スレッド、プロセス、又はタスクに相当するモジュール（つまり、命令群）の近くに配置されるとよい。例えば、DBTAG命令は、関数、スレッド、プロセス、又はタスクの命令群の直前、命令群の中、又は命令群の直後に配置されてもよい。関数、スレッド、プロセス、又はタスクの識別子は、ソースコードからアセンブリコードを生成するコンパイリング処理において、コンパイラによって、アセンブリコードに自動的に挿入されてもよい。
【００２３】
また、DBTAG命令は、他の用途に使用されてもよい。例えば、DBTAG命令は、ユーザー（プログラマ）が、任意のビット列又は文字列をトレースデータとして出力するために使用されてもよい。この場合、ユーザー（プログラマ）は、任意のビット列を示す即値フィールドを有するデバッグ用の命令を、C言語又はC++言語等で記述された高級言語のソースコード内に配置してもよい。そして、コンパイラは、このデバッグ用の命令を１個のDBTAG命令に変換すればよい。
【００２４】
図３は、DBTAG命令の命令フォーマットの一例を示している。図３の例では、DBTAG命令は、全体で３２ビット長であり、６ビット長のオペコードフィールド１１、及び１０長ビットの即値フィールド１２を含む。オペコードフィールド１１は、DBTAG命令であることを示す。既に述べたように、即値フィールド１２は、例えば、関数、スレッド、プロセス、又はタスクの識別子を示すために使用される。なお、図３は一例であって、DBTAG命令のビット長は３２ビットでなくてもよいし、オペコードフィールド１１は６ビット長でなくてもよいし、即値フィールド１２のビット長は１０ビットでなくてもよい。
【００２５】
図４は、DBTAG命令を含むコンピュータプログラム（実行可能プログラム）を実行するＣＰＵ１０の動作の一例を示すフローチャートである。ステップＳ１１では、ＣＰＵ１０は、メモリ５０からフェッチされた命令のオペコードを解析する。ステップＳ１１でデコードされた命令がDBTAG命令である場合（ステップＳ１２でＹＥＳ）、ＣＰＵ１０は、DBTAG命令の即値フィールドの値及びプログラムカウンタ（ＰＣ）値をトレースユニット１５に供給する（ステップＳ１３）。プログラムカウンタ（ＰＣ）は、ＣＰＵ１０において次に実行するべき命令が格納されたメモリ上のアドレスを示すために使用される命令アドレスレジスタである。ステップＳ１３において、トレースユニット１５に供給されるＰＣ値は、ステップＳ１１においてデコードされたDBTAG命令のアドレスを示す。一方、ステップＳ１１でデコードされた命令がDBTAG命令でない場合（ステップＳ１２でＮＯ）、ＣＰＵ１０は、デコードされた命令に応じた処理を実行する（ステップＳ１４）。
【００２６】
以上に述べたことから理解されるように、本実施形態に係るコンピュータ１では、ＣＰＵ１０は、定数を示す即値フィールドを有するDBTAG命令をデコードしたことに応答して、DBTAG命令の即値フィールドに示された定数をトレースユニット１５に供給するよう動作する。そして、トレースユニット１５は、ＣＰＵ１０におけるDBTAG命令の実行に応答して、DBTAG命令の即値フィールドに示された定数を含むトレースデータを出力するよう動作する。
【００２７】
例えば、DBTAG命令の即値フィールドは、コンピュータプログラムに含まれている関数、スレッド、プロセス、又はタスクの識別子を示すために使用されてもよい。これにより、デバッガ（デバッグホスト）は、トレースデータに含まれるDBTAG命令の即値フィールドに示された定数値を参照することで、関数、スレッド、プロセス、又はタスクの識別子を直接的に取得することができる。言い換えると、デバッガ（デバッグホスト）は、DBTAG命令のアドレスと関数ＩＤ（又はスレッドＩＤ、プロセスＩＤ、タスクＩＤ）との対応関係を定めたテーブルを準備する必要がなく、DBTAG命令のアドレスに基づく関数ＩＤ（又はスレッドＩＤ、プロセスＩＤ、タスクＩＤ）の推定を行わなくてもよい。このため、異なるプログラムが同じ命令アドレスを使用する可能性があるオーバーレイプログラムのデバッグを行う場合にも、DBTAG命令の即値フィールドの値に基づいて関数ＩＤ（又はスレッドＩＤ、プロセスＩＤ、タスクＩＤ）を一意に特定することができる。
【００２８】
また、本実施形態に係るＣＰＵ１０は、DBTAG命令をデコードした場合に、DBTAG命令の即値を汎用レジスタ（General Purpose Register（ＧＰＲ））に格納することなく、DBTAG命令の即値をトレースユニット１５に供給するよう構成されるとよい。背景技術で述べたマーカー命令及びチェックポイント命令は、関数ＩＤ等の任意の値を予め格納しているＧＰＲの値を出力する用途で使用することが考えられる。しかしながら、このためには、ＣＰＵは、マーカー命令及びチェックポイント命令の実行の前に、関数ＩＤ等の任意の値をＧＰＲに格納する命令を実行（例えば、MOV命令）しなければならない。また、関数ＩＤ等の任意の値をＧＰＲにいったん格納する手法では、ユーザープログラムが別目的で使用している可能性のあるＧＰＲを本来のプログラムフローとは関係のないトレースのために使用することになる。このため、ユーザープログラムが使用していたＧＰＲの値が上書きされてしまう可能性がある。このレジスタの破壊を回避するためには、ＧＰＲに関数ＩＤ等の任意の値を格納する前に、当該ＧＰＲの値をメモリなどに一時的に退避する必要がある。そしてマーカー命令及びチェックポイント命令の実行後に、再びメモリなどに退避されていた値を元のＧＰＲに格納する必要がある。当然ながら、これらの処理の増加により、プログラムサイズおよびＣＰＵの処理時間が増加する。したがって、DBTAG命令の即値をＧＰＲに格納することなく、DBTAG命令の即値をトレースユニット１５に供給することで、冗長な命令及び処理を実行すること無く、関数ＩＤ等の任意の値を効率よくトレースデータに含めることができる。
【００２９】
さらに、DBTAG命令は、１個の命令として定義されてもよい。言い換えると、DBTAG命令は、アセンブリコードにおいて１個のアセンブリ命令として記述されるとよい。これにより、デバッグ又はトレースのためにプログラムに追加される命令数を削減でき、プログラムコードサイズを削減できる。
【００３０】
以下では、本実施形態に係るコンピュータ１の構成及び動作の具体例についてさらに詳細に説明する。図５は、コンピュータ１に含まれるＣＰＵ１０及びトレースユニット１５の構成例を示している。図５の構成例では、ＣＰＵ１０は、命令フェッチユニット１０１、命令デコードユニット１０２、制御ユニット１０３、汎用レジスタ（ＧＰＲ）ファイル１０４、命令実行ユニット１０５、及び完了ユニット１０６を含む。命令フェッチユニット１０１は、メモリ５０から命令をフェッチする。命令デコードユニット１０２は、フェッチされた命令をデコードする。
【００３１】
制御ユニット１０３は、命令のデコード結果に基づいて、ＣＰＵ１０内の機能ユニット（例えば、命令デコードユニット１０２、汎用レジスタファイル１０４、及び命令実行ユニット１０５）に動作を制御する。すなわち、制御ユニット１０３は、ＣＰＵ１０内の機能ユニット（例えば、命令デコードユニット１０２、汎用レジスタファイル１０４、及び命令実行ユニット１０５）に対して、デコードされた命令に応じた信号を出力する。例えば、制御ユニット１０３は、命令実行ユニット１０５に対して、演算の種類を示す制御信号を出力する。さらに、命令が即値命令である場合、制御ユニット１０３は、命令実行ユニット１０５に即値を供給する。制御ユニット１０３は、マルチサイクル命令の発行を制御するためのシーケンサ（マルチサイクル・シーケンサ）を有してもよい。制御ユニット１０３は、コマンド生成ユニットと呼ぶことがき、ディスパッチユニットと呼ぶこともできる。
【００３２】
汎用レジスタファイル１０４は、複数の汎用レジスタ（ＧＰＲ）を含む。汎用レジスタファイル１０４は、命令実行ユニット１０５に入力されるデータ及び命令実行ユニット１０５から出力されるデータを一時的に格納するために汎用的に使用される。したがって、汎用レジスタファイル１０４に含まれる複数のＧＰＲは、一般的に、ＣＰＵ１０で実行される命令においてレジスタオペランドとして指定される。
【００３３】
命令実行ユニット１０５は、命令に応じた具体的なデータ処理、例えば、算術演算、論理演算、及びロード／ストアを実行する。命令実行ユニット１０５は、ＡＬＵ（Arithmetic Logic Unit）及びロード／ストアユニットを含む。ＡＬＵは、加算器、乗算器及び除算器などの算術演算ユニット、論理演算ユニット、並びにシフタ等を含む。レジスタオペランドを有する一般的な算術演算命令、論理演算命令、及びレジスタ転送命令を実行する場合、命令実行ユニット１０５は、汎用レジスタファイル１０４からレジスタの値を受信し、そして演算を実行する。命令実行ユニット１０５は、完了ユニット１０６を介して、演算結果を汎用レジスタファイル１０４に書き戻す。
【００３４】
完了ユニット１０６は、命令の完了（リタイアメント）を制御する。例えば、完了ユニット１０６は、割り込み又は例外に係る命令より後の命令のエントリをパイプラインから破棄する。さらに、本実施形態の完了ユニット１０６は、トレースユニット１５とのインタフェースを有し、DBTAG命令などのトレース用命令の実行によって生成されるトレース情報をトレースユニット１５に供給する。
【００３５】
次に、図５に示されたトレースユニット１５の構成例について説明する。図５に示されたトレースユニット１５は、トレースコントローラ１５１、トレースバッファ１５２、及びインタフェース１５３を含む。トレースコントローラ１５１は、ＣＰＵ１０とのインタフェース、及びトレースバッファ１５２とのインタフェースを有する。トレースコントローラ１５１は、ＣＰＵ１０からトレース情報を受信し、トレースデータのフォーマットに整え、トレースデータをトレースバッファ１５２に蓄積する。トレースバッファ１５２は、トレースデータを一時的に蓄積するための記憶領域である。トレースコントローラ１５１は、トレースバッファ１５２に蓄積されたトレースデータを取得し、これをインタフェース１５３を介して記憶装置６０に書き込む。
【００３６】
続いて以下では、図６を参照しながら、DBTAG命令をデコードしたときのＣＰＵ１０の動作の具体例を説明する。図６の例では、ＣＰＵ１０は、DBTAG命令の実行おいて、DBTAG命令の即値フィールドに示された定数を汎用レジスタファイル１０４に格納することなく、当該定数をトレースユニット１５に供給するよう構成されている。具体的に述べると、命令デコードユニット１０２は、DBTAG命令をデコードしたことに応答して、DBTAG命令を示す通知DBTAG、DBTAG命令の命令アドレス（ＰＣ値）PC、及びDBTAG命令の即値（即値フィールドの値）IMMEDIATEを制御ユニット１０３に通知する。制御ユニット１０３は、DBTAG命令を示す制御信号を生成し、当該制御信号、DBTAG命令の命令アドレス（ＰＣ値）、及びDBTAG命令の即値を命令実行ユニット１０５に供給する。
【００３７】
図６に示された命令実行ユニット１０５は、算術演算及び論理演算等を行うＡＬＵ１０５１、ＡＬＵ１０５１の出力データを保持するラッチ１０５２、さらにラッチ１０５３〜１０５５を有する。ラッチ１０５３〜１０５５は、DBTAG命令を示す制御信号、DBTAG命令の命令アドレス（ＰＣ値）、及びDBTAG命令の即値を保持するために配置されている。命令実行ユニット１０５は、DBTAG命令の実行サイクルにおいて、DBTAG命令を示す制御信号、DBTAG命令の命令アドレス（ＰＣ値）、及びDBTAG命令の即値をラッチ１０５３〜１０５５に保持し、これらのデータを次のサイクルで完了ユニット１０６に出力する。すなわち、命令実行ユニット１０５は、DBTAG命令の即値をＡＬＵ１０５１に供給せず、DBTAG命令の即値を汎用レジスタファイル１０４に書き込まない。図６に破線で示された汎用レジスタファイル１０４、ＡＬＵ１０５１、及びラッチ１０５２は、これらの構成要素がDBTAG命令の実行のために使用されないことを示している。
【００３８】
完了ユニット１０６は、DBTAG命令を示す制御信号、DBTAG命令の命令アドレス（ＰＣ値）、及びDBTAG命令の即値を命令実行ユニット１０５から受信する。完了ユニット１０６は、DBTAG命令を示す制御信号を受信したことに応じて、命令実行ユニット１０５からの命令アドレス（ＰＣ値）、及び即値の受信が有効であることを検出する。そして、完了ユニット１０６は、DBTAGトレース有効（Valid）信号、DBTAG命令の命令アドレス（ＰＣ値）、及びDBTAG命令の即値をトレースユニット１５に出力する。ここで、DBTAGトレース有効（Valid）信号は、DBTAG命令の命令アドレス及び即値を含むトレース情報が有効であることをトレースユニット１５に通知する。
【００３９】
図６に示したＣＰＵ１０の構成及び動作によれば、DBTAG命令の即値フィールドの値を効率的にトレースユニット１５に供給できる。一例として、DBTAG命令の即値フィールドが関数ＩＤ（又はスレッドＩＤ、プロセスＩＤ、タスクＩＤ）を示す場合、図６のＣＰＵ１０は、関数ＩＤ（又はスレッドＩＤ、プロセスＩＤ、タスクＩＤ）を効率的にトレースユニット１５に供給できる。なぜなら、図６に示したＣＰＵ１０は、DBTAG命令の即値フィールドの値を汎用レジスタファイル１０４に書き込むような冗長な動作を必要としないためである。さらに、図６に示したＣＰＵ１０は、（ａ）マーカー命令及びチェックポイント命令の実行前に、汎用レジスタファイル１０４内のＧＰＲの値をメモリなどに一時的に退避する処理、（ｂ）マーカー命令及びチェックポイント命令の実行において、関数ＩＤ等の任意の値を当該ＧＰＲに格納する処理、並びに（ｃ）マーカー命令及びチェックポイント命令の実行後に、メモリなどに退避されていた値を元のＧＰＲに格納する処理、を必要としないためである。
【００４０】
以上の説明から理解されるように、本実施形態に係るコンピュータ１では、ＣＰＵ１０は、定数を示す即値フィールドを有するDBTAG命令をデコードしたことに応答して、DBTAG命令の即値フィールドに示された定数をトレースユニット１５に供給するよう動作する。そして、トレースユニット１５は、ＣＰＵ１０におけるDBTAG命令の実行に応答して、DBTAG命令の即値フィールドに示された定数を含むトレースデータを出力するよう動作する。例えば、DBTAG命令の即値フィールドは、コンピュータプログラムに含まれている関数、スレッド、プロセス、又はタスクの識別子を示すために使用されてもよい。これにより、デバッガ（デバッグホスト）は、トレースデータに含まれるDBTAG命令の即値フィールドに示された定数値を参照することで、関数、スレッド、プロセス、又はタスクの識別子を直接的に取得することができる。このため、本実施形態に係るコンピュータ１を利用することで、異なるプログラムが同じ命令アドレスを使用する可能性があるオーバーレイプログラムのデバッグを行う場合にも、DBTAG命令の即値フィールドの値に基づいて関数ＩＤ（又はスレッドＩＤ、プロセスＩＤ、タスクＩＤ）を一意に特定することができる。
【００４１】
＜第２の実施形態＞
図７は、本実施形態に係るコンピュータ２とその周辺装置を示すブロック図である。本実施形態に係るコンピュータ２は、ＣＰＵ２０とこれに結合されたトレースユニット２５を含む。コンピュータ２の全体的な構成は、図２又は図５に示した第１の実施形態のコンピュータ１の構成例と同様である。
【００４２】
コンピュータ２において、ＣＰＵ２０は、複数のレジスタを示すフィールドを有する１個のDBPUSH命令をデコードしたことに応答して、DBPUSH命令にて指定された複数のレジスタの値をトレースユニット２５に供給するよう動作する。トレースユニット２５は、ＣＰＵ２０における１個のDBPUSH命令の実行に応答して、DBPUSH命令にて指定された複数のレジスタの値を含むトレースデータを出力するよう動作する。
【００４３】
DBPUSH命令は、ＣＰＵ２０において実行されるコンピュータプログラムの実行をトレースするために定義された命令である。DBPUSH命令は、ＣＰＵ２０に実装された複数の汎用レジスタの値をトレースデータとして出力するために使用することができ、１個のDBPUSH命令によって複数の汎用レジスタの値がトレースデータとして出力される。したがって、DBPUSH命令は、複数の汎用レジスタの値をトレースデータとして出力するために複数の命令を必要としないため、プログラムコードサイズを削減できるという利点がある。
【００４４】
例えば、DBPUSH命令は、コンピュータプログラムに含まれている関数の複数の引数又は複数の戻り値を出力するために使用することができる。この場合DBPUSH命令は、関数の複数の引数が保持された複数の汎用レジスタ、又は関数の複数の戻り値が保持された複数の汎用レジスタを示す。DBPUSH命令は、コンピュータプログラム内において、関数に相当するモジュール（つまり、命令群）の近くに配置されるとよい。例えば、DBPUSH命令は、関数の命令群の直前、先頭、最後、又は直後配置されてもよい。DBPUSH命令は、コンパイリング処理において、コンパイラによって、アセンブリコードに自動的に挿入されてもよい。
【００４５】
また、DBPUSH命令は、ユーザー（プログラマ）が、任意の複数のレジスタの値をトレースするために使用されてもよい。この場合、DBPUSH命令は、ユーザー（プログラマ）によって高級言語のソースコード内に配置されてもよい。また、DBPUSH命令は、コンパイリング処理においてコンパイラによってアセンブリコードに自動的に挿入されてもよい。
【００４６】
図８は、DBPUSH命令の命令フォーマットの一例を示している。図８の例では、DBPUSH命令は、全体で３２ビット長であり、６ビット長のオペコードフィールド２１、５ビット長の第１のレジスタオペランドフィールド２２、及び５ビット長の第２のレジスタオペランドフィールド２３を含む。オペコードフィールド２１は、DBPUSH命令であることを示す。第１及び第２のレジスタオペランドフィールド２２及び２３は、トレースデータとして出力されるべき汎用レジスタの範囲を示す。例えば、第１のレジスタオペランドフィールド２２は、出力されるべき先頭のレジスタ番号を示し、第２のレジスタオペランドフィールド２３は、出力されるべき最後尾のレジスタ番号を示す。例えば、第１のレジスタオペランドフィールド２２がレジスタ番号２（汎用レジスタＲ２）を示し、第２のレジスタオペランドフィールド２３がレジスタ番号５（汎用レジスタＲ５）を示す場合、汎用レジスタＲ２、Ｒ３、Ｒ４、及びＲ５の４つのレジスタ値が出力される。
【００４７】
図９は、DBPUSH命令の命令フォーマットの他の例を示している。図９の例では、レジスタの範囲の指定ではなく、トレースデータとして出力されるべきレジスタのリストが指定される。具体的には、図９に示されたDBPUSH命令は、全体で３２ビット長であり、６ビット長のオペコードフィールド２１、及び２６ビット長の即値フィールド２４を含む。２６ビット長の即値フィールド２４の各ビットは、複数の汎用レジスタのいずれかに一対一で対応付けられている。図９の例では、１２本の汎用レジスタＲ２０〜Ｒ３１が即値フィールド２４のうちの１２ビットと対応付けられている。
【００４８】
図１０は、DBPUSH命令を含むコンピュータプログラム（実行可能プログラム）を実行するＣＰＵ２０の動作の一例を示すフローチャートである。ステップＳ２１では、ＣＰＵ２０は、メモリ５０からフェッチされた命令のオペコードを解析する。ステップＳ２１でデコードされた命令がDBPUSH命令である場合（ステップＳ２２でＹＥＳ）、ＣＰＵ２０は、DBPUSH命令のプログラムカウンタ（ＰＣ）値をトレースユニット２５に供給する（ステップＳ２３）。プログラムカウンタ（ＰＣ）は、ＣＰＵ２０において次に実行するべき命令が格納されたメモリ上のアドレスを示すために使用される命令アドレスレジスタである。ステップＳ２３において、トレースユニット２５に供給されるＰＣ値は、ステップＳ２１においてデコードされたDBPUSH命令のアドレスを示す。ステップＳ２４〜Ｓ２６では、ＣＰＵ２０は、DBPUSH命令で指定された複数の汎用レジスタを順次読み出すとともに、読み出されたレジスタ値とそのレジスタ番号をトレースユニット２５に供給する。ＣＰＵ２０は、DBPUSH命令で指定された複数の汎用レジスタの全ての読み出しが完了するまで、ステップＳ２４〜Ｓ２６を繰り返す。一方、ステップＳ２１でデコードされた命令がDBPUSH命令でない場合（ステップＳ２２でＮＯ）、ＣＰＵ２０は、デコードされた命令に応じた処理を実行する（ステップＳ２７）。
【００４９】
続いて以下では、図１１を参照しながら、DBPUSH命令をデコードしたときのＣＰＵ２０の動作の具体例を説明する。命令デコードユニット２０２は、DBPUSH命令をデコードしたことに応答して、DBPUSH命令を示す通知DBPUSH、DBPUSH命令の命令アドレス（ＰＣ値）PC、及びDBPUSH命令で指定された複数のレジスタ番号（又は先頭レジスタ番号と最後尾レジスタ番号で規定されるレジスタ範囲）REGISTER NOS.を制御ユニット２０３に通知する。制御ユニット２０３は、DBPUSH命令を示す制御信号を生成し、当該制御信号、及びDBPUSH命令の命令アドレス（ＰＣ値）を命令実行ユニット２０５に供給する。
【００５０】
さらに、制御ユニット２０３は、汎用レジスタファイル２０４からレジスタ値を読み出すために、汎用レジスタファイル２０４に対してレジスタ番号を指定する。汎用レジスタファイル２０４は、制御ユニット３０３から指定されたレジスタ番号のレジスタ値を命令実行ユニット２０５に供給する。図１１では、制御ユニット３０３と汎用レジスタファイル２０４の間の信号線が分岐されており、レジスタ番号は命令実行ユニット２０５にも供給される。さらに、制御ユニット２０３は、マルチサイクルシーケンサ２０３１を有する。DBPUSH命令で指定された複数の汎用レジスタの読み出しは、１サイクルにつき１つのレジスタずつ順次行われる。したがって、マルチサイクルシーケンサ２０３１は、マルチサイクルでの複数のレジスタ値の汎用レジスタファイル２０４からの読み出しと、命令実行ユニット２０５へのコマンド発行を制御する。
【００５１】
図１１に示された命令実行ユニット２０５は、算術演算及び論理演算等を行うＡＬＵ２０５１、ＡＬＵ２０５１の出力データを保持するラッチ２０５２、さらにラッチ２０５３〜２０５６を有する。ラッチ２０５３〜２０５６は、DBPUSH命令を示す制御信号、DBPUSH命令の命令アドレス（ＰＣ値）、レジスタ番号、及びレジスタ値を保持するために配置されている。命令実行ユニット２０５は、DBPUSH命令の実行サイクルにおいて、DBPUSH命令を示す制御信号、DBPUSH命令の命令アドレス（ＰＣ値）、レジスタ番号、及びレジスタ値をラッチ２０５３〜２０５６に保持し、これらのデータを次のサイクルで完了ユニット２０６に出力する。すなわち、命令実行ユニット２０５は、DBPUSH命令に基づいて汎用レジスタファイル２０４から出力されるレジスタ値をＡＬＵ２０５１に供給しない。図１１に破線で示されたＡＬＵ２０５１及びラッチ２０５２は、これらの構成要素がDBPUSH命令の実行のために使用されないことを示している。
【００５２】
完了ユニット２０６は、DBPUSH命令を示す制御信号、DBPUSH命令の命令アドレス（ＰＣ値）、汎用レジスタNo、及びDBPUSH命令に基づいて汎用レジスタファイル２０４から出力されたレジスタ値を命令実行ユニット２０５から受信する。完了ユニット２０６は、DBPUSH命令を示す制御信号を受信したことに応じて、命令実行ユニット２０５からの命令アドレス（ＰＣ値）、レジスタ番号、及びレジスタ値の受信が有効であることを検出する。そして、完了ユニット２０６は、DBPUSHトレース有効（Valid）信号、DBPUSH命令の命令アドレス（ＰＣ値）、レジスタ番号、及びレジスタ値をトレースユニット２５に出力する。ここで、DBPUSHトレース有効（Valid）信号は、DBPUSH命令の命令アドレス、レジスタ番号、及びレジスタ値を含むトレース情報が有効であることをトレースユニット２５に通知する。
【００５３】
以上の説明から理解されるように、本実施形態に係るコンピュータ２では、ＣＰＵ２０は、複数のレジスタを示すフィールドを有する１個のDBPUSH命令をデコードしたことに応答して、DBPUSH命令にて指定された複数のレジスタの値をトレースユニット２５に供給するよう動作する。そして、トレースユニット２５は、ＣＰＵ２０における１個のDBPUSH命令の実行に応答して、DBPUSH命令にて指定された複数のレジスタの値を含むトレースデータを出力するよう動作する。DBPUSH命令は、ＣＰＵ２０に実装された複数の汎用レジスタの値をトレースデータとして出力するために使用することができ、１個のDBPUSH命令によって複数の汎用レジスタの値がトレースデータとして出力される。したがって、本実施形態に係るコンピュータ２を利用することで、複数の汎用レジスタの値をトレースデータとして出力するために複数の命令を必要としないため、プログラムコードサイズを削減できる。
【００５４】
＜第３の実施形態＞
本実施形態では、上述した第２の実施形態の変形が説明される。図１２は、本実施形態に係るコンピュータ２とその周辺装置を示すブロック図である。コンピュータ３は、ＣＰＵ３０とこれに結合されたトレースユニット３５を含む。コンピュータ３の全体的な構成は、図２又は図５に示した第１の実施形態のコンピュータ１の構成例と同様である。
【００５５】
コンピュータ３の基本的な動作は、第２の実施形態で示したコンピュータ２と同様である。すなわち、ＣＰＵ３０は、複数のレジスタを示すフィールドを有する１個のDBPUSH命令をデコードしたことに応答して、DBPUSH命令にて指定された複数のレジスタの値をトレースユニット３５に供給するよう動作する。トレースユニット３５は、ＣＰＵ３０における１個のDBPUSH命令の実行に応答して、DBPUSH命令にて指定された複数のレジスタの値を含むトレースデータを出力するよう動作する。
【００５６】
さらに、本実施形態に係るコンピュータ３は、以下に述べるような説明及び動作によって、DBPUSH命令に基づくトレースデータのデータサイズを削減することができる。すなわち、ＣＰＵ３０は、DBPUSH命令にて指定された複数のレジスタの値をトレースユニット３５に順次供給する際に、マルチサイクル信号（以下、マルチサイクルステータス信号と呼ぶ）をトレースユニット３５に供給するよう構成されている。マルチサイクルステータス信号は、ＣＰＵ３０がマルチサイクル命令を実行していることを示す。そして、トレースユニット３５は、マルチサイクルステータス信号を認識し、マルチサイクルステータス信号が発行されている間は１個のDBPUSH命令に基づく複数のレジスタ値が順次出力されていると判断する。そして、トレースユニット３５は、トレースデータにおいて、１個のDBPUSH命令に基づく複数のレジスタ番号及びレジスタ値の出力に対して、１つのDBPUSH命令の命令アドレス（ＰＣ値）を関連付ける。言い換えると、トレースユニット３５は、トレースデータに含まれるDBPUSH命令の命令アドレス（ＰＣ値）の重複を除去する。これにより、トレースデータに含まれるDBPUSH命令のアドレスを示すデータ数が、DBPUSH命令で指定された複数のレジスタの数より小さくなるように削減される。
【００５７】
以下では、図１３を参照しながら、DBPUSH命令をデコードしたときのＣＰＵ３０の動作の具体例を説明する。命令デコードユニット３０２の動作は、図１１の命令デコードユニット２０２と同様である。制御ユニット３０３は、図１１に示された制御ユニット２０３と同様の構成及び機能を有する。さらに、制御ユニット３０３はDBPUSH命令の実行時に、マルチサイクルステータス信号を命令実行ユニット３０５に供給するよう動作する。
【００５８】
汎用レジスタファイル３０４は、図１１に示された汎用レジスタファイル２０４と同様の構成及び機能を有する。命令実行ユニット３０５も、図１１に示された命令実行ユニット２０５と同様の構成及び機能を有する。ＡＬＵ３０５１、並びにラッチ３０５２〜３０５６は、図１１に示されたＡＬＵ２０５１、並びにラッチ２０５２〜２０５６に対応する。ただし、ラッチ３０５３は、DBPUSH命令を示す制御信号に加えて、マルチサイクルステータス信号をラッチする。
【００５９】
完了ユニット３０６は、図１１に示された完了ユニット２０６と同様に、DBPUSHトレース有効（Valid）信号、DBPUSH命令の命令アドレス（ＰＣ値）、レジスタ番号、及びレジスタ値をトレースユニット３５に出力する。さらに、完了ユニット３０６は、これらのデータに加えて、マルチサイクルステータス信号をトレースユニット３５に供給する。
【００６０】
続いて、図１４及び図１５を参照しながら、コンピュータ３によってもたらされるトレースデータのデータサイズの削減効果について説明する。図１４は、ＣＰＵ３０からトレースユニット３５に供給されるトレース情報（DBPUSH命令に基づくトレース情報）を示すタイミングチャートである。図１４は、レジスタ番号０〜３１の３２個のレジスタＲ０〜Ｒ３１の値を出力する例を示している。
【００６１】
図１４中の波形（Ａ）は、クロック信号を示している。図１４中の波形（Ｂ）は、DBPUSHトレース有効（Valid）信号を示している。DBPUSHトレース有効（Valid）信号がハイレベルであることは、ＣＰＵ３０からのトレース情報の出力が有効であることを意味する。図１４中の波形（Ｃ）は、マルチサイクルステータス信号を示している。マルチサイクルステータス信号がハイレベルであることは、マルチサイクル命令に関するトレース情報であることを意味する。
【００６２】
図１４中の波形（Ｄ）は、命令アドレス（ＰＣ値）の出力を示している。図１４の例では、命令アドレス（ＰＣ値）は、マルチサイクルステータス信号（波形（Ｃ））がハイレベルである間、DBPUSH命令を示す同じ値（0x4000）である。図１４中の波形（Ｅ）及び（Ｆ）は、DBPUSH命令に基づいて出力されたレジスタ番号及びレジスタ値を示している。マルチサイクルステータス信号（波形（Ｃ））がハイレベルである間、レジスタＲ０から順にレジスタＲ３１までのレジスタ番号及びレジスタ値が出力される。
【００６３】
図１５は、トレースユニット３５が図１４に示されたトレース情報を受信した場合に生成するトレースデータの一例を示している。図１５の例では、先頭のレジスタＲ０（レジスタ番号＝０）のトレースデータのみ、DBPUSH命令のアドレス（0x4000）を含む。しかしながら、レジスタＲ１（レジスタ番号＝１）のトレースデータは、DBPUSH命令のアドレス（0x4000）を含まない。図示されていないレジスタＲ２〜レジスタＲ３１のトレースデータは、レジスタＲ１のトレースデータと同様である。１つのDBPUSH命令に基づく複数のレジスタのトレースデータに対して、同じDBPUSH命令を示す同じ命令アドレスを繰り返し含めることは冗長である。したがって、図１５の例では、レジスタＲ１〜Ｒ３１のトレースデータからは、DBPUSH命令のアドレス（0x4000）が除去されている。
【００６４】
＜第４の実施形態＞
本実施形態では、上述した第１〜第３の実施形態の変形が説明される。図１６は、本実施形態に係るコンピュータ４の構成例を示している。コンピュータ４は、ＣＰＵ４０及びトレースユニット４５を含む。ＣＰＵ４０は、第１〜第３の実施形態で説明したＣＰＵ１０、２０、又は３０と同様の構成及び機能を有する。トレースユニット４５は、第１〜第３の実施形態で説明したトレースユニット１５、２５、又は３５と同様の構成及び機能を有する。さらに、トレースユニット４５は、特定のDBTAG命令のトレースデータ、又は特定のDBPUSH命令のトレースデータを選択的に出力するためのフィルタ４５４を有する。
【００６５】
トレースコントローラ４５１は、ＣＰＵ４０から受信したトレース情報をフィルタ４５４においてフィルタし、フィルタ条件に一致するトレース情報のみを選択してトレースバッファ４５２に蓄積する。そして、トレースコントローラ４５１は、トレースバッファ４５２に蓄積されたフィルタ条件に一致したトレース情報をインタフェース４５３を介して記憶装置６０に書き込む。
【００６６】
以下では、図１７〜図１９を参照して、フィルタ４５４の構成例を説明する。図１７に示されたフィルタ４５４は、命令アドレス（ＰＣ値）によるフィルタリングを行う。フィルタ値レジスタ４５４１は、トレース情報内の命令アドレス（ＰＣ値）と比較されるアドレスの値を格納する。マスク値レジスタ４５４２は、命令アドレスの各ビットに対するマスク値を保持する。図１７の例では、比較対象のビットの値に０がセットされ、マスクされるビットの値に１がセットされる。フィルタ値レジスタ４５４１及びマスク値レジスタ４５４２は、デバッグ用の通信ポート（例えばＪＴＡＧ（Joint Test Action Group）ポート）を介して外部のデバッグホストから設定することができる。
【００６７】
同値ゲート４５４３は、ＸＮＯＲゲートである。同値ゲート４５４３は、命令アドレス（ＰＣ値）とフィルタ値レジスタ４５４１の値をビットバイビットで比較し、２つの入力ビットが同値であれば１を、異なる値であれば０を出力する。ＯＲゲート４５４４は、同値ゲート４５４３の出力値とマスク値レジスタ４５４２の値をビットバイビットで比較し、ビット毎の論理和を演算する。ＡＮＤ回路４５４５は、ＯＲゲート４５４４の出力値の全ビットの論理積を演算する。ＡＮＤ回路４５４５の出力は、マッチング結果を表しており、値が１であるときが一致を示し、値が０であるとき不一致を示す。
【００６８】
図１８は、第１の実施形態で説明されたDBTAG命令のトレース情報に含まれる即値によるフィルタリングを行う。フィルタ値レジスタ４５４６は、トレース情報内の即値と比較される値を格納する。マスク値レジスタ４５４７は、即値の各ビットに対するマスク値を保持する。図１８の例では、比較対象のビットの値に０がセットされ、マスクされるビットの値に１がセットされる。フィルタ値レジスタ４５４６及びマスク値レジスタ４５４７は、デバッグ用の通信ポート（例えばＪＴＡＧ（Joint Test Action Group）ポート）を介して外部のデバッグホストから設定することができる。
【００６９】
図１８の構成例は、図１７の構成例と同様である。すなわち、同値ゲート４５４８は、トレース情報内の即値とフィルタ値レジスタ４５４６の値をビットバイビットで比較し、２つの入力ビットが同値であれば１を、異なる値であれば０を出力する。ＯＲゲート４５４９は、同値ゲート４５４８の出力値とマスク値レジスタ４５４７の値をビットバイビットで比較し、ビット毎の論理和を演算する。ＡＮＤ回路４５５０は、ＯＲゲート４５４９の出力値の全ビットの論理積を演算する。ＡＮＤ回路４５５０の出力は、マッチング結果を表しており、値が１であるときが一致を示し、値が０であるとき不一致を示す。
【００７０】
図１９に示されたフィルタ４５４は、第２及び第３の実施形態で説明されたDBPUSH命令のトレース情報に含まれるレジスタ番号によるフィルタリングを行う。フィルタ値レジスタ４５５１は、トレース情報内のレジスタ番号と比較される値を格納する。フィルタ値レジスタ４５５１の各ビットは、いずれかのレジスタ番号と対応付けられている。例えば、フィルタ値レジスタ４５５１が３２ビットレジスタであるとき、レジスタの最下位ビットから順に、３２本のレジスタＲ０〜Ｒ３１に対応付けられる。
【００７１】
ビット変換回路４５５２は、トレース情報内の２進表記のレジスタ番号を受信し、１０進表記のレジスタ番号に対応するビットが１にセットされ、他のビットが０にセットされた出力データを生成する。例えば、汎用レジスタが３２本であり、トレース情報で示されるレジスタ番号が０〜３１である場合を考える。レジスタ番号が０であるとき、ビット変換回路４５５２は、全ビットが０にセットされた３２ビットデータを出力する。レジスタ番号が１であるとき、ビット変換回路４５５２は、最下位ビットが１にセットされ且つ他の３１ビットが全て０にセットされた３２ビットデータを出力する。レジスタ番号が３１であるとき、ビット変換回路４５５２は、最上位ビットが１にセットされ且つ他の３１ビットが全て０にセットされた３２ビットデータを出力する。
【００７２】
ＡＮＤゲート４５５３は、ビット変換回路４５５２の出力値とフィルタ値レジスタ４５４１の値をビットバイビットで比較し、ビット毎の論理積を演算する。ＯＲ回路４５５４は、ＡＮＤゲート４５５３の出力値の全ビットの論理和を演算する。ＯＲ回路４５５４の出力は、マッチング結果を表しており、値が１であるときが一致を示し、値が０であるとき不一致を示す。
【００７３】
本実施形態は、特定のトレースデータのみを選択して出力することができる。例えば、本実施形態は、本実施形態は、命令アドレス（ＰＣ値）が特定の値又は特定の範囲に一致するトレースデータのみを選択して出力することができる。また、本実施形態は、DBTAG命令の即値が特定の値又は特定の範囲に一致するトレースデータのみを選択して出力することができる。また、本実施形態は、DBPUSH命令に基づいて出力される複数のレジスタ値のうち、レジスタ番号が特定の値又は範囲に一致するトレースデータのみを選択して出力することができる。
【００７４】
＜第５の実施形態＞
本実施形態では、上述した第１〜第４の実施形態に係るコンピュータにより実行される実行可能プログラムを生成するための装置について説明する。図２０は、本実施形態に係るコンピュータシステム７０の構成例を示すブロック図である。コンピュータシステム７０は、プロセッサ７１、表示デバイス７２、入力デバイス７３、及びメモリ７５を含む。プロセッサ７１は、メモリ７５に格納されたオペレーティングシステム７５１、コンパイラ７５２、アセンブラ７５３、及びリンカ７５４等のコンピュータプログラムを読み出して実行することによって、ソースコード７５６から実行可能プログラム７５９を生成する処理を行う。プロセッサ７１は、例えば、１又は複数のＣＰＵを含む。
【００７５】
表示デバイス７２は、ユーザーに対して視覚的な情報を提供するデバイスである。表示デバイス７２は、例えば、液晶ディスプレイ、有機ＥＬ（electroluminescence）ディスプレイ、又はＣＲＴ（Cathode Ray Tube）ディスプレイである。入力デバイス７３は、ユーザーによる操作情報を受け付けるデバイスである。例えば、入力デバイス７３は、キーボード、ポインティングデバイス（マウス、トラックボール、タッチパッド等）、若しくはタッチパネル、又はこれらの組合せである。
【００７６】
メモリ７５は、揮発性メモリ若しくは不揮発性メモリ、又はこれらの組合せによって構成されてもよい。揮発性メモリは、例えば、ＳＲＡＭ若しくはＤＲＡＭ（Dynamic Random Access Memory）又はこれらの組合せである。不揮発性メモリは、例えば、マスクＲＯＭ、プログラマブルＲＯＭ、フラッシュメモリ、若しくはハードディスクドライブ、又はこれらの組合せである。また、メモリ７５は、プロセッサ７１から離れて配置されたストレージを含んでもよい。この場合、プロセッサ７１は、図示しない通信インタフェースを介してメモリ７５にアクセスしてもよい。
【００７７】
図２１は、ソースコードを実行可能プログラムに変換する過程を示す概念図である。コンパイラ７５２は、ソースコード７５６をアセンブリコード７５７に変換する。ソースコード７５６は、１又は複数のソースコードファイルを含む。アセンブリコード７５７は、１又は複数のアセンブリコードファイルを含む。アセンブラ７５３は、アセンブリコード７５７をオブジェクトコード７５８に変換する。オブジェクトコード７５８は、１又は複数のオブジェクトコードファイルを含む。なお、図２１のコンパイラ７５２及び７５３の機能を総称してコンパイラと呼ぶこともある。言い換えると、ソースコード７５６をオブジェクトコード７５８に変換する処理をコンパイリングと呼ぶこともある。
【００７８】
リンカ７５４は、オブジェクトコード７５８及びランタイムライブラリ７５５を結合することによって、１つの実行可能プログラム７５９を生成する。
【００７９】
続いて以下では、コンパイラ７５２におけるコンパイリング処理についてさらに詳細に説明する。コンパイラ７５２は、ソースコード７５６に含まれている関数、スレッド、プロセス、又はタスクの識別子を示す即値フィールドを有するDBTAG命令をアセンブリコード７５７に挿入するよう動作する。したがって、アセンブリコード７５７は、（ａ）ソースコード７５６に含まれている関数、スレッド、プロセス、又はタスクの処理を実行するためのアセンブリコード部分と、（ｂ）これら関数、スレッド、プロセス、又はタスクに関連付けられたDBTAG命令、を含む。DBTAG命令は、関数、スレッド、プロセス、又はタスクに相当するアセンブリコード部分の直前、中、又は直後に配置されてもよい。DBTAG命令の詳細については、第１の実施形態で既に説明したので重複説明を省略する。
【００８０】
コンパイラ７５２は、さらに、ソースコード７５６に含まれている関数、スレッド、プロセス、又はタスクの複数の引数又は複数の戻り値を格納する複数のレジスタの値をトレースするために、第２及び第３の実施形態で述べたDBPUSH命令をアセンブリコード７５７に挿入してもよい。
【００８１】
図２２は、本実施形態に係るコンパイリング処理の一例を示すフローチャートである。ステップＳ３１では、コンパイラ７５２は、ソースコード７５６を受信する。ステップＳ３２では、コンパイラ７５２は、ソースコード７５６内の関数を検出する。ステップＳ３３では、コンパイラ７５２は、検出された関数に識別子を割当てる。ステップＳ３４では、コンパイラは、検出された関数に対応するアセンブリコード部分を生成する。
【００８２】
ステップＳ３５では、コンパイラ７５２は、関数の識別子を示す即値フィールドを有するDBTAG命令を、ステップＳ３４で生成されたアセンブリコード部分の直前及び直後に挿入する。なお、ステップＳ３５では、DBTAG命令は、アセンブリコード部分の直前及び直後のいずれか一方のみに挿入されてもよい。また、DBTAG命令は、アセンブリコード部分の中に、例えば、アセンブリコード部分の先頭位置又は末尾位置、に配置されてもよい。
【００８３】
ステップＳ３６では、コンパイラ７５２は、検出された関数の引数を格納する複数の汎用レジスタを指定するフィールドを含むDBPUSH命令を、ステップＳ３４で生成されたアセンブリコード部分の直前に挿入する。DBPUSH命令は、アセンブリコード部分の中の先頭位置に配置されてもよい。
【００８４】
ステップＳ３７では、コンパイラ７５２は、検出された関数の戻り値を格納する複数の汎用レジスタを指定するフィールドを含むDBPUSH命令を、ステップＳ３４で生成されたアセンブリコード部分の直後に挿入する。DBPUSH命令は、アセンブリコード部分の中の末尾位置に配置されてもよい。
【００８５】
コンパイラ７５２は、ステップＳ３２〜Ｓ３７の処理をソースコード７５６の最後の関数まで繰り返し行う（ステップＳ３８）。
【００８６】
なお、図２２のフローチャートは、関数の識別子をトレースするためのDBTAG命令と関数の引数及び戻り値をトレースするためのDBPUSH命令を共に生成するコンパイリング処理の一例を示している。図２２に示されているようにDBTAG命令とDBPUSH命令を組み合わせて使用することで、コンピュータ１における関数の実行を詳細にトレースすることができる。しかしながら、DBTAG命令の生成とDBPUSH命令の生成は独立して行われてもよく、DBTAG命令とDBPUSH命令は独立に使用されてもよい。例えば、本実施形態に係るコンパイリング処理は、関数又はスレッド等の識別子をトレースするためのDBTAG命令の生成を行い、関数又はスレッド等の引数及び戻り値をトレースするためのDBPUSH命令の生成を行わなくてもよい。これとは反対に、本実施形態に係るコンパイリング処理は、関数又はスレッド等の引数及び戻り値をトレースするためのDBPUSH命令の生成を行い、関数又はスレッド等の識別子をトレースするためのDBTAG命令の生成を行わなくてもよい。本実施形態に係るコンパイリング処理は、ある特定の関数に関しては関数の識別子をトレースするためのDBTAG命令の生成を行い、他の特定の関数に関しては関数の引数及び戻り値をトレースするためのDBPUSH命令の生成を行ってもよい。
【００８７】
本実施形態に係るコンピュータシステム７０又はコンパイラ７５２によれば、第１の実施形態で説明されたDBTAG命令を、関数、スレッド、プロセス、又はタスクの識別子をトレースデータとして出力する用途に使用することができる。また、コンピュータシステム７０又はコンパイラ７５２によれば、第２及び第３の実施形態で説明されたDBPUSH命令を、関数、スレッド、プロセス、又はタスクの複数の引数又は複数の戻り値をトレースデータとして出力する用途に使用することができる。
【００８８】
＜その他の実施形態＞
上述した複数の実施形態は、適宜組み合わせて実施されてもよい。
【００８９】
第１〜第４の実施形態で説明されたコンピュータ１〜４は、複数のＣＰＵ（ＣＰＵコア、ＭＰＵコア、又はプロセッサコア）を有するマルチコア構成であってもよい。マルチコア構成のコンピュータは、関数、スレッド、プロセス、又はタスクの遷移がより複雑化するため、第１〜第４の実施形態で述べたDBTAG命令及びDBPUSH命令の使用がシングルコア構成に比べていっそう効果的であるかもしれない。
【００９０】
さらに、上述した実施形態は本件発明者により得られた技術思想の適用に関する例に過ぎない。すなわち、当該技術思想は、上述した実施形態のみに限定されるものではなく、種々の変更が可能であることは勿論である。
【００９１】
例えば、本件発明者等により得られた技術思想は、以下に示す実施形態Ａ１〜Ａ１９を含む。
（実施形態Ａ１）
ソースコードをメモリから読み込むこと、及び
前記ソースコードを解析し、前記ソースコードをアセンブリコードに変換すること、
を備え、
前記変換することは、（ａ）前記ソースコードに含まれている関数、スレッド、プロセス、又はタスクの処理を実行するためのアセンブリコード部分、及び（ｂ）前記関数、前記スレッド、前記プロセス、又は前記タスクの識別子を示す即値フィールドを有する第１のアセンブリ命令、を前記アセンブリコードに挿入することを備える、
コンパイリング方法。
（実施形態Ａ２）
前記第１のアセンブリ命令は、前記アセンブリコードに基づく実行可能プログラムコードがＣＰＵ（Central Processing Unit）において実行された場合に、前記ＣＰＵに結合されたトレースユニットに前記即値フィールドに示された前記識別子を供給するよう前記ＣＰＵを動作させる、実施形態Ａ１に記載のコンパイリング方法。
（実施形態Ａ３）
前記ソースコードは、前記第１のアセンブリ命令に対応する明示的な命令を含んでいない、実施形態Ａ１又はＡ２に記載のコンパイリング方法。
（実施形態Ａ４）
前記変換することは、前記関数、前記スレッド、前記プロセス、又は前記タスクの検出に応じて、前記第１のアセンブリ命令に対応する明示的な命令を含んでいない前記ソースコードから、前記第１のアセンブリ命令を生成することをさらに備える、実施形態Ａ１〜Ａ３のいずれか１項に記載のコンパイリング方法。
（実施形態Ａ５）
前記挿入することは、前記アセンブリコード部分の直前、前記アセンブリコード部分の中、又は前記アセンブリコード部分の直後に前記第１のアセンブリ命令を配置することを含む、実施形態Ａ１〜Ａ４いずれか１項に記載のコンパイリング方法。
（実施形態Ａ６）
前記第１のアセンブリ命令は、レジスタオペランドを指定するためのレジスタフィールドを含まない、実施形態Ａ１〜Ａ５のいずれか１項に記載のコンパイリング方法。
（実施形態Ａ７）
前記第１のアセンブリ命令は、１個の命令のみを含む、実施形態Ａ１〜Ａ６のいずれか１項に記載のコンパイリング方法。
（実施形態Ａ８）
前記変換することは、前記アセンブリコードに第２のアセンブリ命令を挿入することをさらに備え、
前記第２のアセンブリ命令は、前記関数、前記スレッド、前記プロセス、又は前記タスクの引数又は戻り値を格納する複数のレジスタを示すフィールドを有する、
実施形態Ａ１〜Ａ７のいずれか１項に記載のコンパイリング方法。
（実施形態Ａ９）
前記アセンブリコードに基づく実行可能プログラムコードがＣＰＵ（Central Processing Unit）において実行された場合に、前記第２のアセンブリ命令は、前記ＣＰＵに結合されたトレースユニットに前記複数のレジスタの値を供給するよう前記ＣＰＵを動作させる、実施形態Ａ８に記載のコンパイリング方法。
（実施形態Ａ１０）
実施形態Ａ１〜Ａ９のいずれか１項に記載のコンパイリング方法をコンピュータに行わせるためのプログラム。
（実施形態Ａ１１）
コンパイリング手順を実行するよう構成されたプロセッサを備え、
前記コンパイリング手順は、
ソースコードをメモリから読み込むこと、及び
前記ソースコードを解析し、前記ソースコードをアセンブリコードに変換すること、
を備え、
前記変換することは、（ａ）前記ソースコードに含まれている関数、スレッド、プロセス、又はタスクの処理を実行するためのアセンブリコード部分、及び（ｂ）前記関数、前記スレッド、前記プロセス、又は前記タスクの識別子を示す即値フィールドを有する第１のアセンブリ命令、を前記アセンブリコードに挿入することを備える、
コンパイリング装置。
（実施形態Ａ１２）
前記第１のアセンブリ命令は、前記アセンブリコードに基づく実行可能プログラムコードがＣＰＵ（Central Processing Unit）において実行された場合に、前記ＣＰＵに結合されたトレースユニットに前記即値フィールドに示された前記識別子を供給するよう前記ＣＰＵを動作させる、実施形態Ａ１１に記載のコンパイリング装置。
（実施形態Ａ１３）
前記ソースコードは、前記第１のアセンブリ命令に対応する明示的な命令を含んでいない、実施形態Ａ１１又はＡ１２に記載のコンパイリング装置。
（実施形態Ａ１４）
前記変換することは、前記関数、前記スレッド、前記プロセス、又は前記タスクの検出に応じて、前記第１のアセンブリ命令に対応する明示的な命令を含んでいない前記ソースコードから、前記第１のアセンブリ命令を生成することをさらに備える、実施形態Ａ１１〜Ａ１３のいずれか１項に記載のコンパイリング装置。
（実施形態Ａ１５）
前記挿入することは、前記アセンブリコード部分の直前、前記アセンブリコード部分の中、又は前記アセンブリコード部分の直後に前記第１のアセンブリ命令を配置することを含む、実施形態Ａ１１〜Ａ１４いずれか１項に記載のコンパイリング装置。
（実施形態Ａ１６）
前記第１のアセンブリ命令は、レジスタオペランドを指定するためのレジスタフィールドを含まない、実施形態Ａ１１〜Ａ１５のいずれか１項に記載のコンパイリング装置。
（実施形態Ａ１７）
前記第１のアセンブリ命令は、１個の命令のみを含む、実施形態Ａ１１〜Ａ１６のいずれか１項に記載のコンパイリング装置。
（実施形態Ａ１８）
前記変換することは、前記アセンブリコードに第２のアセンブリ命令を挿入することをさらに備え、
前記第２のアセンブリ命令は、前記関数、前記スレッド、前記プロセス、又は前記タスクの引数又は戻り値を格納する複数のレジスタを示すフィールドを有する、
実施形態Ａ１１〜Ａ１７のいずれか１項に記載のコンパイリング装置。
（実施形態Ａ１９）
前記アセンブリコードに基づく実行可能プログラムコードがＣＰＵ（Central Processing Unit）において実行された場合に、前記第２のアセンブリ命令は、前記ＣＰＵに結合されたトレースユニットに前記複数のレジスタの値を供給するよう前記ＣＰＵを動作させる、実施形態Ａ１８に記載のコンパイリング装置。
【符号の説明】
【００９２】
１、２、３、４  コンピュータ
１０、２０、３０、４０  ＣＰＵ（Central Processing Unit）
１５、２５、３５、４５  トレースユニット
５０  メモリ
６０  記憶回路
【図１】
2015069453.tif 000003
【図２】
2015069453.tif 000004
【図３】
2015069453.tif 000005
【図４】
2015069453.tif 000006
【図５】
2015069453.tif 000007
【図６】
2015069453.tif 000008
【図７】
2015069453.tif 000009
【図８】
2015069453.tif 000010
【図９】
2015069453.tif 000011
【図１０】
2015069453.tif 000012
【図１１】
2015069453.tif 000013
【図１２】
2015069453.tif 000014
【図１３】
2015069453.tif 000015
【図１４】
2015069453.tif 000016
【図１５】
2015069453.tif 000017
【図１６】
2015069453.tif 000018
【図１７】
2015069453.tif 000019
【図１８】
2015069453.tif 000020
【図１９】
2015069453.tif 000021
【図２０】
2015069453.tif 000022
【図２１】
2015069453.tif 000023
【図２２】
2015069453.tif 000024