以下、図面にしたがって本発明の実施の形態について説明する。ただし、本発明の技術的範囲はこれらの実施の形態に限定されず、特許請求の範囲に記載された事項とその均等物まで及ぶものである。
図1は、本実施の形態例におけるトレース圧縮システムを表す図である。同図のトレース圧縮システムは、トレースデータ取得対象のユーザシステム30と、当該ユーザシステム30のデバッグを行うインサーキットエミュレータ(以下、ICE)20、ICE20の制御を行う制御プログラムを実行するホストPC10を有する。同図のユーザシステム30は、マイクロコントローラ(以下、MCU)201を有し、MCU201のメモリ(図示せず)に格納された組み込みプログラム(図示せず)を実行する。同図において、ユーザシステム30とICE20とは各コネクタC2、C3とトレースデータバス302を介して接続される。また、ICE20とホストPC10とはコネクタC1とUSB等の通信ケーブル301を介して接続される。
図1のICE20は、MCUが実行したプログラムの命令アドレスや命令情報を有するトレースデータを取得するトレース機能を有する。ICE20は、ホストPC10からユーザシステム30のプログラム実行開始、トレースデータの取得開始等の指示を受けてトレースデータの取得を開始する。ユーザシステム30から出力されたトレースデータは、順次、トレースデータバスを介してICE20に出力され、ICE20内のメモリ(以下、トレースメモリTM)に格納される。本実施の形態例において、トレースデータは少なくとも命令アドレスを有するが、さらに、実行した命令名やメモリアクセス情報等を有していてもよい。
なお、図1の本実施の形態例におけるトレース圧縮システムは、ICE20とユーザシステム30の間をトレースデータバス302で接続しているが、例えば、制御バス等の各バスが並列に接続されてもよいし、ICE20がMCU201にコードフェッチしてトレースデータを生成してもよい。また、図1の本実施の形態例におけるトレース圧縮システムでは、ICE20とホストPC10とを別々に構成しているが、ICE20の構成をホストPC10内に設けてもよい。
図2は、図1のトレース圧縮システムにおけるICE20の構成を表す図である。同図のICE20は、本実施の形態例におけるトレース圧縮装置の一例を表す。同図のICE20は、差分検出部10、ネストループバッファ部11、圧縮されたトレースデータが格納されるトレースメモリTM、トレースメモリライト制御部12、トレースメモリリード制御部13、ループ情報生成回路EC6を有する。差分検出部10及びネストループバッファ部11は、ループを検出し、トレースメモリライト制御部12及びトレースメモリリード制御部13は、検出したループ部分のトレースデータのうち冗長したトレースデータのトレースメモリTMへの書き込みを行わない。
図2の差分検出部10は、命令アドレス設定回路EC1、命令アドレスレジスタ[0]R0、命令アドレスレジスタ[1]R1、減算器SUB、命令アドレス比較回路EC2を有する。差分検出部10は、トレースデータを順次取得し、直前のトレースデータとの命令アドレスの差分値が負の値となるトレースデータを、以前実行した命令に分岐しているトレースデータとして検出する。そして、差分検出部10は、当該差分値が負の値となるトレースデータの命令アドレスをループ候補の先頭命令アドレスとして、ネストループバッファ部11にひとつ以上保持し、再度、同じ命令アドレスで差分値が負の値となった場合、同じ命令アドレスに2回分岐したことから、ループと判定することによってループを検出する。
図3は、図2のネストループバッファ部11を表す図である。ネストループバッファ部11は、ループ候補先頭命令アドレスレジスタRha[i]、トレースアドレスレジスタRta[i]、ループサイズカウンタCl[i]及び総実行命令数カウンタCt[i]を1セットとして(以下、ループ候補情報[i])、ネストループの深さに応じて1つ以上(図3ではn+1個)有する。このように、ネストループバッファ部11は、ループ候補の先頭命令アドレスレジスタRha[i]を含むループ候補情報[i]を1セット以上保持することができる。
また、ループ候補情報[i]のトレースアドレスレジスタRta[i]は、トレースメモリTMにおけるループ候補先頭命令アドレスに対応するトレースデータが書き込まれたアドレスである。そして、ループ候補情報[i]のループサイズカウンタCl[i]は、ループの1周分のトレースデータ数(以下、ループサイズ)を計測するためのカウンタであり、総実行命令数カウンタCt[i]はループ候補として保持されてからループの終わりまでのトレースデータ数(以下、総実行命令数)を計測するためのカウンタである。
また、トレースメモリライト制御部12は、トレースメモリライト制御回路EC3、トレースデータバッファ[0]Bt0、トレースデータバッファ[1]Bt1、ライトポインタPwを有する。トレースメモリライト制御回路EC3は、ユーザシステム30から取得したトレースデータをトレースデータバッファ[0]Bt0、[1]Bt1に、順次書き込み、ライトポインタPwをインクリメントしながら、トレースデータバッファ[0]Bt0のデータをトレースメモリTMに書き込む。ただし、トレースメモリライト制御回路EC3は、ループが検出されてから当該ループが終了するまでのトレースデータについては、トレースメモリTMへ書き込まない。また、トレースメモリライト制御部12は、ループが終了した時に、ループ情報生成回路EC6の生成したループ情報データをトレースメモリTMに書き込む。このループ情報データが圧縮データであり、この圧縮データによってトレースメモリTMに書き込まれなかったループ部分のトレースデータが復元される。
そして、トレースメモリリード制御部13は、トレースメモリリード制御回路EC4、トレースデータ比較回路EC5、リードポインタPr、トレースデータリードバッファBtr、リターンアドレスレジスタRraを有する。トレースメモリリード制御部13は、ループ検出されたループ候補先頭命令アドレスレジスタRha[i]以降のループ1周分のトレースデータをトレースメモリTMから読み出し、取得したトレースデータと順次比較する。トレースメモリリード制御部13は、トレースデータが一致する間は、ループ検出状態を維持し、トレースデータが一致しなくなった場合、検出中のループが終了したものとみなし、ループ検出状態を終了する。
また、トレースメモリリード制御部13は、さらに、トレースアドレスバッファBta[0〜n]、ループ比較終了レジスタRlc[0〜n]、ループ比較カウンタClc[0〜n]、総実行命令数比較終了レジスタRtc[0〜n]、総実行命令数比較カウンタCtc[0〜n]を1セットとして、ネストループの深さnに応じて1つ以上有する。これらの詳細については後述する。
次に、まず、本実施の形態例のトレース圧縮装置におけるトレースの圧縮例について説明する。
図4は、ネストループを有するプログラムの一例を表す図である。同図のソースプログラムS1はC言語で記述され、ネストループを有するプログラムである。ループとは、同じ命令処理が連続して繰り返し行われる部分を指し、ネストループとは、あるループの中に、さらに別の小さいループを1つ以上内包するループを指す。同図のソースプログラムS1では、点線で囲まれた大きいループBlbが、破線で囲まれた小さいループAlaを内包する。
具体的に、図4のソースプログラムS1には命令c1〜c7が記述されており、命令c3〜c5に対応するループAlaは4周、命令c2〜c6に対応するループBlbは3周、繰り返し実行されるように記述されている。このため、ソースプログラムS1では、ループBlbが1回実行される度に、ループAlaが4回ループする。従って、同図のソースプログラムS1では、「c1、c2、c3〜c5[×4]、c6、c2、c3〜c5[×4]、c6、c2、c3〜c5[×4]、c6、c7」の順に命令が実行される。また、各命令c1〜c7は、それぞれトレースデータt1〜t7を出力するものとする。
図5は、図4のソースプログラムS1を実行した時に生成されるトレースの一例を表す図である。同図では、圧縮処理が行われていない非圧縮のトレースT1と、本実施の形態例のトレース圧縮装置によって圧縮された圧縮後のトレースT1@とを表す。
具体的に、非圧縮のトレースT1には、図4で前述した命令実行順に沿って各トレースデータt1〜t7が書き込まれている。一方、圧縮後のトレースT1@には、ループAlaのトレースデータtaの繰り返し4周分のうち2周分のトレースデータtaが書き込まれずその代わりにループAlaのループ情報データta@が、点線で囲んだループBlbのトレースデータtbの繰り返し3周分のうち1周分のトレースデータtbが書き込まれずその代わりにループBlbのループ情報データtb@が書き込まれている。
このため、(図5のトレースT1では、トレースデータt3〜t5を1つのトレースデータtaとして図示しているが、3個のトレースデータとして計算すると)非圧縮のトレースT1は44個のトレースデータを有するのに対し、圧縮後のトレースT1@は21個のトレースデータを有する。このように、本実施の形態例のトレース圧縮装置によるトレースは、n周繰り返し行われるループの場合、トレースメモリTMに対してn周のうちn−2周分のトレースデータが書き込まれず、当該ループに係るループ情報データが書き込まれることによってそのデータ量が削減される。
図6は、本実施の形態例のトレース圧縮装置の主な処理の流れを説明するフローチャート図である。まず、本実施の形態例のトレース圧縮装置の差分検出部10は、トレースデータを順次取得し(S11)、連続するトレースデータの命令アドレスの差分値、つまり、直前のトレースデータの有する命令アドレスとの差分値を演算する。差分値が正の値である間(S12のNO)、トレースメモリライト制御部12は、通常通り、ライトポインタPwをインクリメントしながら取得したトレースデータをトレースメモリTMへ書き込む(S16)。
一方、差分値が負の値であるトレースデータが検出された場合(S12のYES)、差分検出部10は、命令が以前実行した命令に分岐したものとみなし、当該検出したトレースデータの命令アドレスと一致する値が、ネストループバッファ部11に保持された各ループ候補先頭命令アドレスレジスタRha[0〜n]にあるか否かを判定する(S13)。初め、ネストループバッファ部11には、ひとつのループ候補先頭命令アドレスレジスタRha[0〜n]も保持されていないため、値の一致するループ候補先頭命令アドレスレジスタRha[0〜n]はない。
一致する値がない場合(S14のNO)、差分検出部10は、当該差分値が負の値であるトレースデータの命令アドレスを、ネストループバッファ部11のループ候補先頭アドレスレジスタ[i]に新たに保持させる(S15)。このように、差分値が負の値となった命令アドレスのリストが、ループ候補先頭命令アドレスレジスタRha[0〜n]として、ネストループバッファ部11に保持される。続いて、トレースメモリライト制御部12は、取得したトレースデータをトレースメモリTMへ書き込む(S16)。
一方、一致する値がある場合(S14のYES)、差分検出部10は、以前実行した命令に2回分岐している、つまり、ループしていると判定し、一致したループ候補先頭命令アドレスレジスタRha[i]の値を正式にループの先頭アドレスとして検出(ループ検出)する(S17)。
図7Aは、図4のソースプログラムS1を実行した場合の命令アドレス、各フラグ及びループ候補情報[0〜n]の値の変移を表す図である。また、図7Aの上部は、ソースプログラムS1を実行した時の命令アドレスの時系列の変移を表す図(以下、命令アドレス変移図)であり、横軸は時間、縦軸は命令アドレスである。命令アドレス変移図において、横軸の時間は左から右に向かって流れ、縦軸の命令アドレスは上から下に大きくなる。また、命令アドレス変移図において、黒四角(■)で表された各命令に対して、その命令アドレスe1〜e7と、各命令の実行時に出力されるトレースデータt1〜t7が書き込まれるトレースメモリTM上のアドレスa1〜a21が表示されている。
命令c1〜c7に対応する各命令アドレスe1〜e7には、先頭の命令c1に対応する命令アドレスe1から、最後の命令c7に対応する命令アドレスe7の順に大きい値が割り当てられる。図7Aのアドレス変移図では、図4で前述した命令順に命令アドレスが変移しており、タイミングp1までは、命令c1からc5まで順に実行されることから、命令アドレスe1からe5は順次大きい値に変移する。従って、タイミングp1までは、差分検出部10は負の差分値を検出しない(S12のNO)。
そして、タイミングp1において、ループAlaの最後尾の命令c5の後、ループAlaの先頭に分岐し命令c3が再実行されるため、タイミングp1における差分値(命令アドレスe3−命令アドレスe5)は、「命令アドレスe3<命令アドレスe5」により、負の値となる(S12のYES)。また、この時、ネストループバッファ部11には1つのループ候補情報[0〜n]も保持されていないため、新たに、ネストループバッファ部11に、ループ候補先頭命令アドレスレジスタRha[0]として、命令アドレスe3が保持される(S15)。
そして、図7Aのタイミングp2において、差分検出部10が、再び、負の差分値を検出する(S12のYES)。この場合、差分値が負の値となった命令アドレスe3と一致する値が、ループ候補先頭命令アドレスレジスタRha[0]にあるため(S14のYES)、命令アドレスe3がループAlaの先頭アドレスとして検出される(S17)。
図6のフローチャート図に戻り、ループが検出されると(S17)、トレースメモリリード制御部13は、ループ候補先頭命令アドレスレジスタRha[0]以降のトレースデータをトレースメモリTMから読み出して、ユーザシステム30から取得したトレースデータと比較する(S18)。トレースデータが一致する間(S19のYES)、トレースメモリライト制御部12は、取得したトレースデータをトレースメモリTMに書き込まない。そして、一致しなくなると(S19のNO)検出中のループが終了したものとみなし、トレースメモリライト制御部12は、検出したループのループ情報データをトレースメモリTMに書き込み(S21)、トレースデータの書き込みを再開する(S22)。上記の処理(S12〜S22)を、トレースデータを取得している間(S11のYES)、繰り返し行う。
図7Aの命令アドレス変移図に戻り、トレースメモリリード制御部13は、タイミングp2におけるループAlaのループ検出後、当該ループAlaの先頭命令アドレスe3以降のトレースデータをトレースメモリTMから読み出し、取得したトレースデータと順次比較する(S18)。この場合、トレースメモリTMから読み出した図7A中の点線内のトレースtaと順次取得したタイミングp2からタイミングp4までのトレースデータとが一致するため、トレースデータはトレースメモリTMに書き込まれない。そして、タイミングp4にて、命令c5の命令アドレスe5を有するトレースデータt5を取得した時に、トレースデータの不一致が発生し(S19のNO)、トレースメモリTMに、ループAlaのループ情報データが書き込まれ(S21)、取得したトレースデータの書き込みが再開される(S22)。
これにより、図7Aの命令アドレス変移図において点線で表した部分のトレースデータがトレースメモリTMに書き込まれず圧縮される。このように、以前実行した命令への分岐の検出時に分岐先の命令アドレスをループ候補先頭命令アドレスとして保持し、当該分岐先の命令アドレスに2回分岐した時にループしているものとしてループ検出する。従って、本実施の形態例におけるトレース圧縮装置によると、ループが4周繰り返される場合、ループ検出(2回分岐)以降のトレースデータ、つまり、ループ3周目以降のトレースデータが圧縮される。そして、圧縮されたトレースデータの代わりにループ情報データが書き込まれる。このループ情報データは、少なくとも、ループ先頭命令アドレスを有するトレースデータが書き込まれたトレースメモリTM上のアドレスと、ループ検出以降(上記の例では、タイミングp2)トレースメモリTMに書き込まれなかったトレースデータ数の情報を有する。これにより、ループ情報データからトレースメモリTMに書き込まれなかったトレースデータを復元することができる。
続いて、図6のフローチャート図のより詳細な処理について、図8〜図12、図15のフローチャート図、及び、図7A、図7B、図13、図14の具体例に沿って説明する。
[差分検出部10]
図8は、図2の差分検出部10とネストループバッファ部11の処理を表すフローチャート図である。まず、命令アドレス設定回路EC1は、ユーザシステム30から出力されたトレースデータを検出すると(S31)、1回目のトレースデータか否かを判定する(S32)。1回目、即ち、一番初めのトレースデータである場合(S32のYES)、命令アドレス設定回路EC1は、取得したトレースデータから命令アドレスを抽出し、命令アドレスレジスタ[1]R0に格納する(S33)。一方、取得したトレースデータが1回目のトレースデータではない場合、つまり2回目以降のトレースデータである場合(S32のNO)、命令アドレス設定回路EC1は、命令アドレスを抽出し、命令アドレスレジスタ[1]R1が保持する命令アドレスを命令アドレスレジスタ[0]R0に格納すると共に、新たに抽出した命令アドレスを命令アドレスレジスタ[1]R1に格納する(S34)。
各命令アドレスレジスタ[0]R0[1]R1に命令アドレスが格納されると(S34)、命令アドレス設定回路EC1は、演算開始フラグFosを立てる(S35)。以下、命令アドレスレジスタ[0]R0に格納された値をa[0]、命令アドレスレジスタ[1]R1に格納された値をa[1]と称する。演算開始フラグFosが立ったことを検出すると、減算器SUBは、当該フラグをネゲートすると共に、差分値(a[1]−a[0])を演算する(S36)。
演算した差分値が負の値ではない場合(S37のNO)、減算器SUBは演算終了フラグFoeを立てる(S38)。命令アドレス設定回路EC1は、当該フラグFoeが立ったことを検出すると、当該フラグをネゲートすると共に(S39)次のトレースデータを取得する(S31)。差分検出部10は、負の差分値が検出されるまで(S37のYES)、順次、S31〜S39の処理を行う。
一方、演算した差分値が負の値の場合(S37のYES)、減算器SUBは、マイナス検出フラグFmと演算終了フラグFoeとを立てる(S40)。命令アドレス設定回路EC1は、両フラグFm、Foeが立ったことを検出すると、当該両フラグをネゲートすると共に(S41)アドレス比較要求フラグFarを立てる(S42)。そして、命令アドレス比較回路EC2は、アドレス比較要求フラグFarが立ったことを確認すると、当該フラグをネゲートすると共に、a[1]の値とネストループバッファ部11の保持する各ループ候補先頭命令アドレスレジスタRha[0〜n]の値とを比較する(S43)。
比較の結果、a[1]の値と一致するループ候補先頭命令アドレスレジスタRha[0〜n]がない場合(S44のNO)、命令アドレス比較回路EC2は命令アドレス不一致フラグFadを立てる(S45)。アドレス不一致フラグFadが立ったことを検出すると、命令アドレス設定回路EC1は、当該フラグをネゲートすると共に、a[1]の値を、ネストループバッファ部11に、ループ候補先頭命令アドレスレジスタRha[0〜n]として、[0]番目から順に保持させる(S46)。
また、トレースメモリライト制御部12の処理にて後述するが、この時、ネストループバッファ部11に、トレースアドレスレジスタRta[i]として、a[1]のトレースデータが書き込まれるトレースメモリTMのアドレスを示すトレースメモリライト制御部12のライトポインタPwの値が、ループ候補先頭命令アドレスレジスタRha[i]に対応して保持される。
一方、比較の結果、a[1]の値と一致するループ候補先頭命令アドレスレジスタRha[i]があった場合(S44のYES)、命令アドレス比較回路EC2は、一致したループ候補先頭命令アドレスレジスタRha[i]に対応するループ検出フラグFld[i]及びトレースデータ比較開始要求フラグFcsを立てる。トレースメモリリード制御回路EC4は、トレースデータ比較開始要求フラグFcsが立ったことを検出すると、当該フラグをネゲートすると共に(S48)、トレースデータの比較を開始する。トレースデータの比較処理については、トレースメモリリード制御部13の処理として後述する。
差分検出部10及びネストループバッファ部11は、このように、同じ命令アドレスに2回分岐した場合に、その分岐命令アドレスをループの先頭命令アドレスとして検出する。このため、2重のネストループ(小さいループと、それを内包する大きいループ)がある場合、大きいループよりも先に小さいループがその先頭命令に2回分岐することによりループ検出される。そこで、本実施の形態例のトレース圧縮装置は、ネストループバッファ部11に複数のループ候補情報の保持を可能にすることにより、大きいループのループ候補先頭命令アドレスを保持しながら、当該大きいループに内包される小さいループを検出可能にすることによって、ネストしたループを検出することができる。
上記の図8のフローチャート図の処理を、図7Aの具体例に沿って説明する。図7Aにおいて、差分検出部10は、初め、命令c1のトレースデータt1を検出すると(S31、S32のYES)、命令アドレスe1を抽出して命令アドレスレジスタ[1]R1に書き込む(S33)。そして、次のトレースデータt2を検出すると、命令アドレスレジスタ[1]R1の値e1を命令アドレスレジスタ[0]R0に書き換え、新たにトレースデータから抽出した命令アドレスe2を命令アドレスレジスタ[1]R1に書き込む。このように順次、トレースデータが検出され(S31)、差分値が演算される。そして、図6のフローチャート図に沿って前述したとおり、タイミングp1にて負の差分値が検出される(S37のYES)。
図7Aの下部の表tb1は、上部の命令アドレス変移図に対応する各レジスタ、カウンタ及びフラグの変移を表す図である。また、表tb1のタイミングp1において、マイナス検出フラグFmが立ち、a[1]の値(命令アドレスe3)とループ候補先頭命令アドレスレジスタRha[0〜n]の値とが比較される(S43)。前述した通り、この時、一致する値がないため(S44のNO)、表tb1のタイミングp1において、ネストループバッファ部11に、ループ候補先頭命令アドレスレジスタRha[0]として命令アドレスe3が、トレースアドレスレジスタRta[0]としてトレースアドレスa6が保持されている。
続いて、図7Aのタイミングp2において(命令アドレスe3)、再び、負の差分値が検出されるが(S37のYES)、命令アドレスe3は、ネストループバッファ部11に保持されるループ候補先頭命令アドレスレジスタRha[0]の値と一致するため(S44のYES)、ループとして検出される。従って、同図の表tb1のタイミングp2において、マイナス検出フラグFmと共にループ検出フラグFld[0]が立てられている。なお、ループサイズカウンタCl[0〜n]及び総実行命令数カウンタCt[0〜n]については、トレースメモリライト制御部12の処理にて後述する。
続いて、図8のフローチャート図のS49に戻り、既に、あるループ検出フラグFld[i]が立っている状態で、新たにアドレス比較要求フラグFarが立てられる場合について説明する。これは、ループの検出中に、差分値が負となるトレースデータが新たに検出された場合を表す。
この場合(S49のYES)、命令アドレス比較回路EC2は、当該アドレス比較要求フラグFarをネゲートし、差分値が負となった命令アドレスa[1]の値と各ループ候補先頭命令アドレスレジスタRha[0〜n]の値とを比較する(S50)。値の一致するループ候補先頭命令アドレスレジスタRha[i]がない場合(S51のNO)、分岐先の命令アドレスがループ候補先頭命令アドレスレジスタRha[0〜n]に保持されていないこと、即ち、当該分岐先の命令アドレスに初めて分岐したことを表す。従って、命令アドレス比較回路EC2は、検出中のループが終了したものとみなして、アドレス不一致フラグFadを立ててループ検出フラグFld[i]をネゲートする(S54)。ループ検出フラグFld[i]がネゲート時の処理については、ループ情報生成回路EC6の処理にて後述する。
一方、値の一致したループ候補先頭命令アドレスレジスタRha[i]がある場合(S51のYES)、命令アドレス比較回路EC2は、さらに、当該値の一致したループ候補先頭命令アドレスレジスタRha[i]が、検出中のループ検出フラグFld[i]に対応するか否か、即ち、検出中のループの先頭命令に再び分岐したのか否かを判定する(S52)。一致する場合(S52のYES)、即ち、検出中のループの先頭命令に再び分岐した場合、命令アドレス比較回路EC2は、ループ検出フラグFld[i]をネゲートせずに、再度、トレースデータ比較開始要求フラグFcsを立てて(S53)、トレースデータの比較を継続する。
具体的に、図7Aのタイミングp3(命令アドレスe3)では、既にループ検出フラグFld[0]が立っている状態で、再び負の差分値が検出されアドレス比較開始要求フラグFarが立てられた場合に該当する(S49のYES)。この場合、a[1](=命令アドレスe3)は、検出中のループ検出フラグFld[0]に対応するループ候補先頭命令アドレスレジスタRha[0]の値と一致し(S50、S51のYES、S52のYES)、ループAlaの先頭命令c3に再び分岐したことを表す。このため、図7Aの表tb1のタイミングp3において、ループ検出フラグFld[0]はネゲートされず(S53)、ループAlaのトレースデータの比較が継続される。
図7Bは、ループAlaのループ検出状態がループ候補先頭命令アドレスレジスタRha[0〜n]の各アドレスとの不一致によって終了する場合の命令アドレス、各フラグ及びループ候補情報[0〜n]の値の変移を表す図である。同図のタイミングp3において、仮に、命令c5の次に命令cx(命令アドレスex)が実行された場合を例示する。この場合も同様に、ループ検出フラグFld[0]が立っている状態で、アドレス比較要求フラグFarが立てられる場合に該当する(S49のYES)。ただし、この場合は、a[1](=命令アドレスex)の値と一致するループ候補先頭命令アドレスレジスタRha[0〜n]がなく(S51のNO)、検出中のループAlaの先頭命令c3以外の命令に分岐したことを表す。このため、ループが終了したものと判定され、図7Bの表tb1xのタイミングp3において、ループAlaに対応するループ検出フラグFld[0]がネゲートされている(S54)。以上が、差分検出部10の処理である。
続いて、トレースメモリライト制御部12の処理について説明する。
[トレースメモリライト制御部12]
図9、図10は、トレースメモリライト制御部12の処理を表すフローチャート図である。
図9の上部のフローチャート図は、トレースメモリライト制御部12のトレースデータの書き込み処理を表すフローチャート図である。ユーザシステム30から出力されたトレースデータは、差分検出部10に加えて、トレースメモリライト制御部12にも送られる。取得したトレースデータが1回目のトレースデータである場合(S62のYES)、トレースメモリライト制御回路EC3は、トレースデータバッファ[1]Bt1に書き込む(S63)。そして、トレースメモリライト制御回路EC3は、次のトレースデータを取得すると(S62のNO)、トレースデータバッファ[1]Bt1のトレースデータをトレースデータバッファ[0]Bt0に書き換えると共に、新たに取得したトレースデータをトレースデータバッファ[1]Bt1に書き込む(S64)。そして、トレースメモリライト制御回路EC3は、減算器SUBの演算終了フラグFoeが立ったことを検出すると(S65のYES)、トレースデータバッファ[0]Bt0のデータをトレースメモリTMに書き込む(S66)。
また、図9の下部のフローチャート図は、トレースメモリライト制御部12の各フラグに応答した処理を表すフローチャート図である。トレースメモリライト制御回路EC3は、ループ検出フラグFld[i]が検出されない間は、ライトポインタPwをインクリメントしながらトレースデータバッファ[0]Bt0のデータを順次トレースメモリTMへ書き込む(S71)。トレースメモリライト制御回路EC3は、ループ検出フラグFld[i]が立ったことを検出すると(S72のYES2)、トレースメモリTMへのトレースデータの書き込みを停止する(S73)。
また、トレースメモリライト制御回路EC3は、マイナス検出フラグFmが立ったことを検出した場合(S72のYES1)、ネストループバッファ部11に新たなループ候補先頭命令アドレスレジスタRha[i]が保持されたことを確認すると、差分検出部10にて前述したように、ライトポインタPwの値、即ち、トレースデータが書き込まれるトレースメモリTMのアドレスを、トレースアドレスレジスタRta[i]として書き込む(S74)。
続いて、図9のフローチャート図の処理を、図7Aの具体例に基づいて説明する。図9の上部のフローチャート図について、出力された各トレースデータt1〜t7がトレースデータバッファ[1]Bta1に順次書き込まれると共に(S63、S64)、図7Aの表tb1のように、減算器SUBによって演算終了フラグFoeが立てられる。トレースメモリライト制御回路EC3は、演算終了フラグFoeが立ったことを検出する度に(S65のYES)、トレースデータバッファ[0]Bta0に書き込まれた各トレースデータt1〜t7をトレースメモリTMに書き込む(S66)。このようにして、トレースデータt1〜t7がトレースメモリTMに順次書き込まれる。
また、図9の下部のフローチャート図について、図7Aの表tb1のタイミングp1において、マイナス検出フラグFmが立ち(S72のYES1)新たなループ候補情報[0]が保持されると、ライトポインタPwの値a6がトレースアドレスレジスタRta[0]に書き込まれる(S74)。また、図7Aの表tb1のタイミングp2において、ループ検出フラグFld[0]が立ったことが検出されると(S72のYES2)、トレースメモリTMへのトレースデータの書き込みが停止する(S73)。このため、図7Aの上図において、タイミングp2から点線部分のトレースデータの書き込みが停止されている。そして、トレースデータの書き込みは、ループ検出フラグFld[0]がネゲートされた時に再開される。
図10の上部のフローチャート図は、ネストループバッファ部11が保持するループサイズカウンタCl[0〜n]についての処理を表すフローチャート図である。マイナス検出部ラグFmが立って(S81、S82のYES)、ネストループバッファ部11に新たにループ候補情報[i]が保持されると、トレースメモリライト制御回路EC3は、トレースデータを検出する度に(S83のYES)、ループサイズカウンタCl[0〜n]をカウントアップする(S84)。ただし、トレースメモリライト制御回路EC3は、ループ検出フラグFld[i]が立ったことを確認すると(S85のYES)、当該ループ検出フラグFld[i]に対応するループサイズカウンタCl[i]のカウントアップを停止する(S86)。これにより、1回目に以前実行した命令に分岐してループ候補情報[i]として保持されてから、2回目に再分岐してループ検出されるまでのループ1周分のトレースデータ数がループサイズとして、ループサイズカウンタCl[i]に保持される。
また、図10の下部のフローチャート図は、ネストループバッファ部11が保持する総実行命令数カウンタCt[0〜n]についての処理を説明するフローチャート図である。マイナス検出部ラグFmが立って(S91、S92のYES)、ネストループバッファ部11に新たにループ候補情報[i]が保持されると、トレースメモリライト制御回路EC3は、トレースデータを検出する度に(S93のYES)、総実行命令数カウンタCt[0〜n]をカウントアップする(S94)。そして、トレースメモリライト制御回路EC3は、ループが検出されてループ検出フラグFld[i]が検出後(S95のYES)、ループ検出フラグFld[i]がネゲートされると(S96のYES)、当該ループ検出フラグFld[i]に対応する総実行命令数カウンタCt[i]のカウントアップを停止する(S97)。これにより、1回目の以前実行した命令に分岐してループ候補情報[i]として保持されてからループが終了するまでのトレースデータ数が総実行命令数として、総実行命令数カウンタCt[i]に保持される。
続いて、図10のフローチャート図の処理を、図7Aの具体例に基づいて説明する。図7Aの表tb1のタイミングp1においてマイナス検出フラグFmが立ったことが検出され、ループ候補先頭命令アドレスレジスタRha[0]として命令アドレスe3が保持されると同時に、ループサイズカウンタCl[0]及び総実行命令数カウンタCt[0]のカウントアップが開始されている。各カウンタは、トレースデータを取得する度にカウントアップされるが(S84、S94)、ループサイズカウンタCl[0]は、タイミングp2にてループ検出フラグFld[0]が立てられた時に(S85のYES)、カウントアップが停止している(S86)。これにより、ループAlaのループサイズ3がループサイズカウンタCl[0]に保持される。
一方、総実行命令数カウンタCt[0]のカウントアップは、図7Aの表tb1のタイミングp2にてループ検出フラグFld[0]が立てられても継続し、タイミングp4で当該ループ検出フラグFld[0]がネゲートされた時に停止する(S95のYES、かつ、S96のYES)。これにより、ループAlaの総実行命令数9が総実行命令数カウンタCt[0]に保持される。
続いて、トレースメモリリード制御部13の処理について説明する。
[トレースメモリリード制御部13(ネストループなし)]
図11、図12は、トレースメモリリード制御部13の処理を表すフローチャート図である。図11は、トレースメモリリード制御部13のトレースデータの読み出し準備処理を説明するフローチャート図である。ユーザシステム30から出力されたトレースデータは、トレースメモリリード制御部13にも送られ、トレースデータリードバッファBtrに順次格納される。トレースメモリリード制御回路EC4は、ループ検出フラグFld[0〜n]を確認し(S101)、ループ検出フラグFld[i]が立ったことを検出すると(S102のYES)、トレースデータの比較を開始する。
まず、トレースメモリリード制御回路EC4は、ネストループバッファ部11から、ループ検出フラグFld[i]に対応するトレースアドレスレジスタRta[i]、ループサイズカウンタCl[i]の値を読み出す(S103)。そして、トレースメモリリード制御回路EC4は、読み出したトレースアドレスレジスタRta[i]の値をリードポインタPrに書き込み(S104)、読み出したループサイズカウンタCl[i]の値を停止している、つまり、非使用のループ比較カウンタClc[i]に対応するループ比較終了レジスタRlc[i]に書き込む(S105)。
そして、トレースメモリリード制御回路EC4は、ループ検出フラグFld[i]がネゲートされない間(S106のNO)、次の図12のフローチャート図においてトレースデータの比較処理を行う。一方、トレースメモリリード制御回路EC4は、ループ検出フラグFld[i]がネゲートされると(S106のYES)、図12のトレースデータの比較処理を終了する(S107)。
図12のフローチャート図は、トレースデータの比較処理を説明するフローチャート図である。図11の処理の後、トレースメモリリード制御回路EC4は、トレースデータ比較開始要求フラグFcsを確認する(S111)。そして、トレースメモリリード制御回路EC4は、トレースデータ比較開始要求フラグFcsが立ったことを検出し(S112のYES)、さらに、トレースデータを検出すると(S113のYES)、リードポインタPrの指すトレースメモリTM上の比較対象のデータがループ情報データか否かを判定する(S114)。
ループがネストしている場合、比較対象としてトレースメモリTMからループ情報データが読みだされる場合がある(S114のYES)。その場合については、「トレースメモリリード制御部13(ネストループ有り)」にて後述する。ここでは、まず、ネストしてないループのトレースデータとの比較について引き続き述べる。
図12のフローチャート図において、トレースメモリTMから読み出したトレースデータがループ情報データではない場合(S114のNO)、トレースメモリリード制御回路EC4は、読み出したトレースデータを、検出したトレースデータと共に、トレースデータ比較回路EC5に送る(S117)。そして、トレースデータ比較回路EC5は、トレースデータを比較し(S118)、一致する場合はトレースデータ一致フラグFtaを(S119のYES、S120)、一致しない場合はトレースデータ不一致フラグFtdを立てる(S119のNO、S122)。
トレースデータ一致フラグFtaが立った場合(S120)、トレースメモリリード制御回路EC4は、当該フラグをネゲートし(S121)、トレースデータの検出処理に戻る(S113)。一方、トレースデータ不一致フラグFtdが立った場合(S123)、トレースメモリリード制御回路EC4は、トレースデータが異なることにより検出中のループが終了したものとみなし、トレースデータ不一致フラグFtd及びループ検出フラグFld[i]をネゲートし(S123)、トレースデータの比較処理を終了する。ループ検出フラグFld[i]がネゲートされた場合の処理については、ループ情報生成回路EC6の処理にて後述する。
また、トレースメモリリード制御回路EC4は、トレースデータを比較する度に、ループ検出フラグFld[i]に対応するループ比較カウンタClc[i]をカウントアップし(S131)、リードポインタPrの値をインクリメントする(S132)。フローチャート図には示していないが、トレースメモリリード制御回路EC4は、カウントアップしたループ比較カウンタClc[i]とループ比較終了レジスタRlc[i]の値が一致した場合、トレースデータがループ1周分比較されたとみなし、トレースデータ比較開始要求フラグFcsをネゲートする。ただし、ループ2周目のトレースデータが引き続き比較される場合、トレースデータ比較開始要求フラグFcsが一旦ネゲートされるものの、ループ2周目のトレースデータ検出時に、再び、ループの先頭命令に分岐することによりマイナス検出フラグFm、トレースデータ比較開始要求フラグFcsが立てられ(図8のS47、図12のS112のYES)、引き続きトレースデータの比較が行われる。
なお、図12のS133がYESの場合以降の処理は、トレースメモリTMからループ情報データを読み出した場合(S114のYES)に該当するため、「トレースメモリリード制御部13(ネストループ有り)」部分において後述する。続いて、上記のトレースデータの比較処理を具体例に基づいて説明する。
このように、トレースメモリリード制御部13は、検出したループのループ候補情報[i]に基づいて、トレースメモリTMから、検出中のループに対応するループ候補先頭命令アドレス以降のループ1周分のトレースデータを読み出し、取得したトレースデータと順次比較する。そして、トレースデータが一致している間、当該取得したトレースがトレースメモリTMに書き込まれないことにより、トレースデータのデータ量が削減される。
上記の図11、図12のトレースメモリリード制御部13の処理を具体例に沿って説明する。
図13は、図4のソースプログラムS1を実行した場合のトレースメモリリード制御部13の処理に係る各レジスタ及びカウンタの値の変移を表す図である。なお、図13の上部の命令アドレス変移図は、図7Aの上部の命令アドレス変移図と同じ図である。
前述したとおり、図13のタイミングp2において、ループAlaが検出される。従って、同図の表tb2のタイミングp2において、ループ検出フラグFld[0]が立てられ、ネストループバッファ部11のトレースアドレスレジスタRta[0]の値a6がリードポインタPrに(S103、S104)、ループサイズカウンタCl[0]の値3がループ比較終了レジスタRlc[0]に保持される(S105)。これにより、比較対象のトレースデータとして、トレースメモリTMからリードポインタPrの値a6の示すトレースデータが読み出される(図12のS114)。
図14は、図4のソースプログラムS1を実行時のトレースメモリTMを表す図である。同様にして、図14の命令アドレス変移図は、図7Aの命令アドレス変移図と同じ図である。同図のトレースメモリTMによると、リードポインタPrの値a6は、トレースデータt3を示すため、タイミングp2において、新たに取得されるトレースデータt3と、トレースメモリTMから読み出されたトレースデータt3とが比較される(S117、S118)。トレースデータが一致することから、続いて、次に取得したトレースデータt4と、インクリメントしたリードポインタPrの値a7の示すトレースデータt4とが比較される。
このように、順次比較すると、ループ比較カウンタClc[i]の値3とループ比較終了レジスタRlc[0]の値3とが一致する。これにより、ループAlaの1周分の比較が終わったとみなされ、トレースデータ比較開始要求フラグFcsがネゲートされる。ただし、次のトレースデータt3の取得時に、再びトレースデータ比較開始要求フラグFcsが立てられる(図12のS112のYES)。そして、図13の表tb2のタイミングp3にて、再び、トレースアドレスレジスタRta[0]の値a6がリードポインタPrに書き込まれ、ループ比較カウンタClc[i]が0からカウントアップされることにより、2周目のループの比較が再開される。
同様にして、順次比較を行っていくと、図14のタイミングp4にて、取得したトレースデータt6と、トレースメモリTMのアドレスa9のトレースデータとが比較される。しかし、この時、トレースメモリTMのアドレスa9にはトレースデータが書き込まれておらず、トレースデータは一致しないため(図12のS119のNO)、ループAlaのループ検出フラグFld[0]がネゲートされる(図12のS123)。図13の表tb2のタイミングp4において、ループ検出フラグFld[0]はネゲートされている。
ここで、図12のフローチャート図において、比較対象のデータがループ情報データである場合(S114のYES)の前に、ループ検出フラグFld[i]がネゲートされた場合における図2のループ情報データ生成回路EC6の処理について説明する。
[ループ情報生成回路EC6]
ループ情報生成回路EC6は、ループ検出フラグFld[i]がネゲートされた時、つまり、ループが終了されたと判定された時に、ループ候補情報[i]に基づいて当該ループのループ情報データを生成する。ループ情報データは、トレースメモリライト制御部12によってトレースメモリTMに書き込まれ、ネストループ部分のトレースデータの比較や、圧縮されたトレースの復元に利用される。
図15は、ループ情報生成回路EC6のループ情報データの生成処理を示すフローチャート図である。ループ情報生成回路EC6は、ループ検出フラグFld[0〜n]を監視し(S141)、ループ検出フラグFld[i]がネゲートされたことを検知する(S142のYES、S143のYES)。ループ検出フラグFld[i]がネゲートされるケースは2つある。
1つ目は、前述の差分検出部10の処理において、ネストループバッファ部11のループ候補先頭命令アドレスレジスタRha[0〜n]に、差分値が負の値となったトレースデータの命令アドレスと一致する値が保持されていない場合である(図8のS54、図15のS142のYES)。2つ目は、前述したトレースメモリリード制御部13におけるトレースデータの比較処理において、トレースデータの不一致が発生した場合である(図12のS123、図15のS143のYES)。
あるループ検出フラグFld[i]のネゲートを検出すると(図15のS142のYES、S143のYES)、命令アドレス比較回路EC2は対応するループ情報生成要求フラグFir[i]を立てる(S144)。そして、ループ情報生成回路EC6は、ループ情報生成要求フラグFir[i]が立っていることを確認すると、当該フラグをネゲートし(S145)、ループ情報生成要求フラグFir[i]に対応するループ候補情報[i]のトレースアドレスレジスタRta[i]、ループサイズカウンタCl[i]、及び、総実行命令数カウンタCt[i]の値を読み出して、ループ情報データを生成する(S146)。そして、ループ情報生成回路EC6は、生成したループ情報データをトレースデータバッファ[0]Bt0に書き込み(S147)、トレースメモリライト制御部12は、トレースデータバッファ[0]Bt0に格納されたループ情報データをトレースメモリTMに書き込む(S148)。
ところで、あるループ検出フラグFld[i]がネゲートされた場合、ネストループバッファ部11に保持された全てのループ候補情報[0〜n]のうちネゲートされた[i〜n]番目のループ候補情報[i〜n]が無効化、即ち、クリアされる。これは、ネゲートされたループ検出フラグFld[i]に対応するループ候補先頭命令アドレスが保持された後、ループ終了までの間に新たに保持されたループ候補先頭命令アドレスは、当該ループ検出フラグFld[i]に対応するループ内に含まれるとみなされるためである。
以下、図15のフローチャート図の処理を具体例に基づいて説明する。図14のトレースメモリTMのタイミングp2にて、ループAlaの検出後タイミングp4までは、トレースデータが一致するため、トレースデータは書き込まれず、その代わりにループAlaのループ情報データが書き込まれる。ループAlaのループ情報データは、ループAlaに対応するネストループバッファ部11のトレースアドレスレジスタRta[0]の値a6をトレースアドレスとして、ループサイズカウンタCl[0]の値3をループサイズとして、総実行命令数カウンタCt[0]の値9を総実行命令数として保持する。
[トレースメモリリード制御部13(ネストループ有り)]
続いて、図12のトレースメモリリード制御部13のフローチャート図に戻り、リードポインタPrの指すトレースメモリTM上の比較対象のデータがループ情報データである場合(S114のYES)について、説明する。この場合、トレースメモリリード制御回路EC4は、トレースメモリTMから読み出したループ情報データに基づいて、圧縮されたトレースデータを展開(復元)する。
具体的に、本実施の形態例におけるトレースメモリリード制御回路EC4は、トレースメモリTMから、ループ情報データのトレースアドレスからループサイズ分のトレースデータを、トレースデータ数が「ループ情報データの総実行命令数−ループサイズ」分に達するまで読み出すことによってトレースデータを展開する。従って、ループ情報データは、少なくとも、ループ候補先頭命令アドレスのトレースメモリTM上のアドレス(トレースアドレス)と、トレースメモリTMに書き込まれなかったトレースデータ数(総実行命令数−ループサイズ)の情報を有する。これにより、トレースメモリリード制御回路EC4は、ループ情報データに基づいて、圧縮された(書き込まれなかった)トレースデータを展開(復元)することができる。以下、具体的に述べる。
図12のフローチャート図において、比較対象のデータとしてループ情報データを読み出した場合(S114のYES)、トレースメモリリード制御回路EC4は、リードポインタPrが保持するアドレスをインクリメントしてリターンアドレスレジスタRraに退避しておく(S115)。これにより、リターンアドレスレジスタRraには、読み出したループ情報データに基づいたトレースデータの比較終了後、通常の比較に戻った時のトレースアドレス(ループ情報データの次のトレースデータのアドレス)が保持される。続いて、トレースメモリリード制御回路EC4は、ループ情報データのトレースアドレスをリードポインタPr及びトレースアドレスバッファBta[i]に、ループサイズを停止中のループ比較カウンタClc[i]に対応するループ比較終了レジスタRlc[i]に、総実行命令数を停止中の総実行命令数比較カウンタCtc[i]に対応する総実行命令数終了レジスタRtc[i]に格納する(S116)。
同様にして、リードポインタPrの示すトレースデータをトレースメモリTMから読み出し、取得したトレースデータと比較しながら、対応するループ比較カウンタClc[i]をカウントアップし、リードポインタPrの値をインクリメントする。ただし、ループ情報データに基づいて展開されたトレースデータとの比較を行う場合(S133のYES)、トレースメモリリード制御回路EC4は、トレースデータを比較する度に、ループ比較カウンタClc[i]に加えて、総実行命令数比較カウンタCtc[i]の値をカウントアップする(S134)。そして、総実行命令数比較カウンタCtc[i]の値が、「総実行命令数比較終了レジスタRtc[i]−ループ比較終了レジスタRlc[i]」と一致したら(S135のYES)、トレースメモリリード制御回路EC4は、ループ情報データに基づいて展開されたトレースデータ数分の比較が終了したものと判定する。そして、トレースメモリリード制御回路EC4は、リターンアドレスレジスタRraの値をリードポインタPrに戻し(S136)、次のトレースデータを検出する(S113)。
また、トレースメモリリード制御回路EC4は、ループ比較カウンタClc[i]の値がループ比較終了レジスタRlc[i]の値に達する度に、トレースアドレスバッファBta[i]に保持されたループ情報データのトレースアドレスの値をリードポインタPrに書き込む。
以上のようにして、トレースメモリリード制御部13は、トレースメモリTMからループ情報データを読み出した場合、読みだしたループ情報データに基づいて圧縮されたトレースデータを展開(復元)しながら、取得したトレースデータと比較する。これにより、ネストしたループのトレースデータを比較することができる。上記のネストループしたトレースデータの比較を行う場合について、具体例に沿って説明する。
図7Aの表tb1のタイミングp5では、ループBlbの先頭の命令c2に分岐して、差分値(命令アドレスe2−命令アドレスe6)が負の値となり、マイナス検出フラグFmが立てられる。この時、ネストループバッファ部11には1つのループ候補情報[0〜n]も保持されていないため(ループAlaのループ候補情報[0]は、ループ検出フラグFld[0]ネゲート時にクリアされているため)、表tb1のタイミングp5において、ネストループバッファ部11は、ループ候補先頭命令アドレスレジスタRha[0]としてループBlbの先頭命令アドレスe2を、トレースアドレスレジスタRta[0]としてトレースアドレスa11を保持する。
引き続き、表tb1のタイミングp6において、ループAlaの先頭の命令c3に分岐し、差分値(命令アドレスe3−命令アドレスe5)が負の値となり、マイナス検出フラグFmが立てられる。この時、命令アドレスe3は、ネストループバッファ部11に保持されているループ候補先頭命令アドレスレジスタRha[0]の値e2とは一致しない。従って、表tb1のタイミングp6において、ネストループバッファ部11は、新たに、ループAlaのループ候補先頭命令アドレスレジスタRha[1]として先頭命令アドレスe3を、トレースアドレスレジスタRta[1]としてトレースアドレスa15を保持する。
続いて、図7Aの表tb1のタイミングp7において、再び、ループAlaの先頭命令c3に分岐し、差分値が負の値となりマイナス検出フラグFmが立てられるが、命令アドレスe3はループ候補先頭命令アドレスレジスタRha[1]の値e3と一致することにより、ループ検出フラグFld[1]が立てられる。続いて、ループAlaのトレースデータと、取得したトレースデータとが順次比較されるが、タイミングp8において、トレースデータの不一致が発生してループAlaのループ検出フラグFld[1]がネゲートされ、ループ情報生成要求フラグFir[1]が立てられる。
このように、本実施の形態例のトレース圧縮装置は、複数のループ候補命令アドレスレジスタ[0〜n]を保持することによって、大きいループBlbのループ候補先頭命令アドレスをループ候補情報[0]保持しながら、当該大きいループBlbに内包された小さなループAlaを検出することができる。さらに深いネストループの検出についても同様である。
そして、図14のトレースメモリTMのように、ループAlaの検出後(タイミングp7)トレースデータの不一致によりループが終了するまで(タイミングp8)のトレースデータが書き込まれず、ループAlaのループ情報データが書き込まれている。当該ループ情報データは、ネストループバッファ部11のトレースアドレスレジスタRta[1]の値a15をトレースアドレスとして、ループサイズカウンタCl[1]の値3をループサイズとして、総実行命令数カウンタCt[1]の値9を総実行命令数として保持する。
続いて、比較対象のデータとして、トレースメモリTMからループ情報データが読み出される場合について説明する。図7Aの表tb1のタイミングp9において、差分値(命令アドレスe2−命令アドレスe6)が負の値となり、マイナス検出フラグFmが立てられるが、命令アドレスe2は、ループ候補先頭命令アドレスレジスタRha[0]の値e2と一致することにより、ループ検出フラグFld[0]が立てられる。続いて、ループBlbのトレースデータと、取得したトレースデータとが順次比較されるが、タイミングp10において、トレースメモリリード制御部13は、トレースメモリTMのトレースアドレスa18@からループAlaのループ情報データを読み出す(図12のS114のYES)。図14のタイミングp10のとおり、比較対象(cm1)のループAlaのループ情報データは、トレースアドレスa15、ループサイズ3、総実行命令数9を有する。
そこで、図13の表tb2のタイミングp10において、まず、リターンアドレスレジスタRraに、リードポインタPrの値a18をさらにインクリメントした値a19が格納される(S115)。また、表tb2のB1部分のように、リードポインタPr及びトレースアドレスバッファBta[1]にループ情報データのトレースアドレスa15が、ループ比較終了レジスタRlc[1]にループサイズ3が、総実行命令数比較終了レジスタRtc[1]に総実行命令数9が書き込まれる(S116)。そして、図14のトレースメモリTMにおいて、トレースアドレスa15の示すトレースデータt3が、比較対象のトレースデータとしてトレースメモリTMから読み出され、比較される。引き続き、リードポインタPrがインクリメントされると共に、ループ比較カウンタClc[1]及び総実行命令数比較カウンタCtc[1]がそれぞれカウントアップされる(S131、S134)。
同様に順次比較を行うと、図13の表tb2のタイミングp11において、ループ比較カウンタClc[1]の値3とループ比較終了レジスタRlc[1]の値3とが一致する。そこで、トレースアドレスレジスタRta[1]の値a15がリードポインタPrに書き込み直され、ループ比較カウンタClc[1]は0からカウントし直す。これにより、ループ情報データに基づくトレースデータにおいて複数周分ループが繰り返される場合であっても、トレースデータの比較が可能となる。
そして、順次比較が行われ、図13のタイミングp12において、総実行命令数比較カウンタCtc[1]の値6が、「総実行命令数比較終了レジスタRtc[1]−ループ比較終了カウンタCl[1](=9−3)」、即ち、トレースメモリTMに書き込まれなかったトレースデータ数に達し(S135のYES)、ループBlbのループ情報データに基づくトレースデータの比較が終了する。そして、リターンアドレスレジスタRraに退避された値a19がリードポインタPrに格納され(S136)、リードポインタPrの値a19の示すトレースデータt6がトレースメモリTMから読み出され、通常の比較が再開される。
このように、本実施の形態例におけるトレース圧縮装置は、ループ候補先頭命令アドレスを複数保持可能にすることによって、ネストループを検出することができる。また、トレース圧縮装置は、ループ検出時、ループ候補の先頭命令アドレス以降のトレースデータと、新たに取得したトレースデータとを比較し、一致する間はトレースメモリTMに書き込まず、不一致を検出した時に、ループ情報データをトレースメモリTMに書き込む。
また、トレース情報データは、書き込まなかったトレースデータ数とループ候補の先頭命令アドレスのトレースデータが書き込まれた前記トレースメモリ上のアドレス情報とを有する。これにより、トレース圧縮装置は、ループ情報データに基づいて、圧縮されたトレースデータを展開(復元)することができる。復元は前述したとおりである。
このように、本実施の形態例におけるトレース圧縮装置は、ネストループを検出すると共に、圧縮されたネストループ部分のトレースデータとの比較を可能にすることにより、ネストループしたトレースデータの圧縮を行うことができる。この結果、本実施の形態例におけるトレース圧縮装置によると、ループ部分のトレースデータの数が、非圧縮のトレースでは、ループ情報データの総実行命令数に相当する数だったのに対し、圧縮後のトレースではループ情報データの「ループサイズ+1(ループ情報データ分)」に相当する数に圧縮され、そのデータ量が抑えられる。
なお、本実施の形態例におけるトレース圧縮装置は、ループ候補情報[0〜n]、即ち、ループの情報として、ループ候補先頭命令アドレスレジスタRha[0〜n]、トレースアドレスレジスタRta[0〜n]、ループサイズカウンタCl[0〜n]及び総実行命令数カウンタCt[0〜n]を有する。しかしながら、この例に限定されるものではなく、トレース圧縮装置は、例えば、ループの情報として、ループ1周分の命令アドレスリストを有していてもよいし、ループ1周分の初めと最後の命令アドレスを有していてもよい。同様にして、トレース圧縮装置は、ループに対応するトレースデータが書き込まれたトレースメモリTM上のアドレスリストを有していてもよい。
<第2の実施の形態例>
第1の実施の形態例では、ネストループが2重のトレースデータの圧縮について述べたが、第2の実施の形態例では、ネストループが3重のトレースデータの圧縮について述べる。3重のネストループを有するトレースデータの圧縮では、トレース情報データに基づいて展開したトレースデータ内に、さらに、別の小さなループのループ情報データを有する。
図16は、3重のネストループを有するプログラムの一例を表す図である。同図のソースプログラムS2は、図4のソースプログラムS1と同様に、C言語で記述されたプログラムである。同図のソースプログラムS2は、破線で囲まれた深さ1のループZlzが点線で囲まれた深さ2のループYlyを内包し、さらに、ループYlyがさらに小さい二重線で囲まれた深さ3のループXlxを内包する。
具体的に、図16のソースプログラムS2には命令c11〜c18が記述されており、命令c14〜c15に対応するループXlx、命令c13〜c16に対応するループYly、命令c12〜c17に対応するループZlzが、それぞれ3周繰り返されるように記述されている。同図のソースプログラムS2では、「c11、c12(※1)、c13、c14〜c15[×3]、c16、c13、c14〜15[×3]、c16、c13、c14〜15[×3]、c16、c17(※2)、※1〜※2[×2]、c18」の順に命令が実行される。また、各命令c11〜c18は、それぞれトレースデータt11〜t18を出力するものとする。
以下、ネストループが3重の場合のトレースデータの圧縮について、図17〜図19の具体例に沿って説明する。
図17は、図16のソースプログラムS2を実行した場合の深さ1のループZlzの2〜3周目の命令アドレス及び各情報の変移を表す図である。ただし、同図の左部分omにおいて、ループYlyの1周目から2周目の途中までの変移が省略されている。また、同図の命令アドレス変移図において、上述したループ情報データに基づいて展開したトレースデータがさらに別のループ情報データを有する場合は、タイミングp27からタイミングp29の区間で発生する。本実施の形態例では、その区間について説明する。
図17の表tb3のタイミングp27において、ネストループバッファ部11は、ループ候補先頭命令アドレスレジスタRha[0]としてループZlzの先頭命令アドレスe12を(タイミングp21にて保持)、トレースアドレスレジスタRta[0]としてa23を、ループサイズカウンタCl[0]として26(e12、e13(※3)、e14〜e15[×3]、e16(※4)、※3〜※4[×2]、e17)を有する。なお、総実行命令数カウンタCt[0]については、タイミングp21からカウントアップが継続している。
図18は、図16のソースプログラムS2を実行した場合のトレースメモリTMを表す図である。図18の命令アドレス変移図は、図17の命令アドレス変移図と同じ図である。図18のトレースメモリTMのタイミングp24においてループZlzが検出されたため、それ以降のトレースデータが書き込まれていない。そして、タイミングp27において、トレースメモリリード制御部13は、トレースメモリTMのトレースアドレスp38@からループYlyのループ情報データを読み出す。図18のとおり、比較対象(cm2)のループYlyのループ情報データは、トレースアドレスa31、ループサイズ8、総実行命令数16を有する。
図19は、図16のソースプログラムS2を実行した場合のトレースメモリリード制御部13の処理に係る各レジスタ及びカウンタの値の変移を表す図である。同図の表tb4のタイミングp27において、リターンアドレスレジスタRraに、リードポインタPrの値をさらにインクリメントした値a39が格納され、B2部分のように、リードポインタPr及びトレースアドレスバッファBta[1]にループYlyのループ情報データのトレースアドレスa31が、ループ比較終了レジスタRlc[1]にループサイズ8が、総実行命令数比較終了レジスタRtc[1]に総実行命令数16が保持される。
そして、トレースアドレスa31の示すトレースデータがトレースメモリTMから読みだされて順次比較されるが、その比較の途中で、トレースメモリリード制御部13は、さらに、ループXlxのループ情報データを読み出す。図18のトレースメモリTMにおいてループYlyに基づく1周分のトレースデータは、トレース範囲tyの通りである。当該トレース範囲tyのトレースアドレスa36@には、ループXlxのループ情報データが書き込まれている。図18のとおり、トレースアドレスa36@に書き込まれたループXlxのループ情報データは、トレースアドレスa34、ループサイズ2、総実行命令数4を有する。
従って、トレースメモリリード制御部13は、ループYのループ情報データに加え、さらに、ループXのループ情報データを展開する。具体的に、トレースメモリリード制御部13は、ループYのループ情報データに基づく比較が継続中であるため、ループXのループ情報データをトレースアドレスバッファBta[2]、ループ比較終了レジスタRlc[2]、総実行命令数比較終了レジスタRtc[2]に展開する。
従って、図19の表tb4のタイミングp28において、B3部分のように、リードポインタPr及びトレースアドレスバッファBta[2]にループXlxのループ情報データのトレースアドレスa34が、ループ比較終了レジスタRlc[2]にループサイズ2が、総実行命令数比較終了レジスタRtc[2]に総実行命令数4が保持される。また、リターンアドレスレジスタRraは、ループXlxのループ情報データの次のトレースアドレスa37を保持する。
同様にして順次比較を行い、総実行命令数比較カウンタCtc[2]の値が「総実行命令数比較終了レジスタRtc[2]−ループ比較終了レジスタRlc[2](=4−2)」に達すると、トレースメモリリード制御部13は、ループXlxのループ情報データに基づく比較を終了する。続いて、トレースメモリリード制御部13は、リターンアドレスレジスタRraに退避したループXlxのループ情報データの次のトレースアドレスa37をリードポインタPrに書き込み、ループYlyのループ情報データに基づく比較に戻る。
同様にして順次比較を行い、総実行命令数比較カウンタCtc[1]の値が「総実行命令数比較終了レジスタRtc[1]−ループ比較終了レジスタRlc[1](=16−8)」に達すると、トレースメモリリード制御部13は、ループYlyのループ情報データに基づく比較を終了する。続いて、トレースメモリリード制御部13は、リターンアドレスレジスタRraに退避したループYlyのループ情報データの次のトレースアドレスa39をリードポインタPrに書き込み、通常のトレースデータの比較を行う。
このように、トレースメモリリード制御回路EC4は、ループ情報データのネスト階層に応じて、当該ループ情報データから読み出したトレースアドレスをトレースアドレスバッファ[0〜n]に、トレースデータ数をループ比較終了レジスタRlc[0〜n]及び総実行命令数比較終了レジスタRtc[0〜n]に保持させる。これにより、トレースメモリリード制御回路EC4は、ループ情報データに基づいて展開されたトレースデータがさらに別のループ情報データを有するようなネストループ部分の圧縮トレースデータを展開しながら取得したトレースデータとの比較を行うことができる。
なお、本実施の形態例では、3重のネストループを有する場合のトレースデータの圧縮例について説明したが、任意の深さm−1のネストループを有するトレースデータの圧縮にも有効である。この場合、トレースメモリリード制御部13は、ループ情報データを展開するループ情報バッファをmセット有する。
[圧縮されたトレースの復元]
また、本実施の形態例におけるトレース圧縮装置によって圧縮されたトレースは、圧縮前のトレースに復元可能である。例えば、トレースメモリリード制御部13の処理で前述したように、復元手段は、順次トレースを読み込み、ループ情報データを読み出した場合に、当該ループ情報データに基づいてトレースデータを展開する。また、その時、ループ情報データに基づいて復元したトレースデータがさらにループ情報データを有する場合、同様にして、ループ情報データの各値を例えば階層毎のバッファに保持しながら、ネストループ部分の圧縮トレースデータを復元する。
なお、以上、本実施の形態例のトレース圧縮装置をハードによって構成する例を述べた。しかし、本実施の形態例のトレース圧縮装置は、トレース圧縮プログラム等のソフトウェアが実行されることによって実現されてもよい。
図20は、トレース圧縮プログラムが実行されるコンピュータ70の構成を表す図である。コンピュータ70は、一般的なコンピュータであり、CPU51、メモリ52、入出力インターフェイス53を備える。また、メモリ52には、トレース圧縮プログラム61が格納され、トレース圧縮プログラム61はCPU51と協働することによって、トレース圧縮機能が実現される。なお、圧縮対象のトレースTMは予め、コンピュータ70のメモリ52に保持されていてもよいし、コンピュータ70のメモリ52に格納されたユーザプログラム62によって生成されてもよい。
以上の実施の形態をまとめると、次の付記のとおりである。
(付記1)
プロセッサが実行した命令の命令アドレスを有するトレースデータをトレースメモリに順次書き込むトレースメモリライト制御手段と、
連続する前記トレースデータの第1、第2の命令アドレスの差分値が負であるか否かを判定する差分検出手段と、
前記差分値が負である第2の命令アドレスをループ候補先頭命令アドレスとして1つ以上保持するループ候補保持手段と、
前記差分値が負である第2の命令アドレスを前記ループ候補先頭命令アドレスと比較し、一致した場合にループ検出し、一致しない場合に、一致しなかった前記第2の命令アドレスを新たなループ候補先頭命令アドレスとして前記ループ候補保持手段に保持する命令アドレス比較手段と、
前記ループ検出した前記第2の命令アドレス以降のトレースデータと、前記トレースメモリ内の前記ループ候補先頭命令アドレス以降のトレースデータとを比較するトレースデータ比較手段とを有し、
前記トレースメモリライト制御手段は、前記トレースデータ比較手段が、前記第2の命令アドレス以降のトレースデータと、前記ループ候補先頭命令アドレス以降のトレースデータとの一致を検出する間は、前記第2の命令アドレス以降のトレースデータを前記トレースメモリに書き込まず、不一致を検出した時に、前記第2の命令アドレス以降のトレースデータ数と前記ループ候補先頭命令アドレスが書き込まれた前記トレースメモリ内のアドレス情報とを含むループ情報データを前記トレースメモリに書き込むことを特徴とするトレース圧縮装置。
(付記2)
付記1において、
前記命令アドレス比較手段が、前記第1のループ情報データに対応する第1のループを検出した場合、
前記トレースデータ比較手段は、前記第1のループの前記ループ候補先頭命令アドレス以降のトレースデータが、当該第1のループが内包する第2のループの第2のループ情報データを有する場合、前記トレースメモリ内に書き込まれた前記第2のループ情報データの前記ループ候補先頭命令アドレス以降のトレースデータを、当該第2のループ情報データのトレースデータ数に達するまで読み出すことによって前記第2のループのトレースデータを復元しながら、前記ループ検出した前記第2の命令アドレス以降のトレースデータと比較することを特徴とするトレース圧縮装置。
(付記3)
付記1または2において、
前記ループ候補保持手段は、前記ループ候補先頭命令アドレスを複数保持し、
前記命令アドレス比較手段は、前記差分値が負である第2の命令アドレスを当該複数のループ候補先頭命令アドレスと比較し、一致する前記ループ候補先頭命令アドレスに対応するループを検出することを特徴とするトレース圧縮装置。
(付記4)
付記2において、
前記トレースデータ比較手段は、さらに、前記第2のループの前記ループ候補先頭命令アドレス以降のトレースデータが、当該第2のループが内包する第3のループの第3のループ情報データを有する場合、前記トレースメモリ内に書き込まれた前記第3のループ情報データの前記ループ候補先頭命令アドレス以降のトレースデータを、当該第3のループ情報データのトレースデータ数に達するまで読み出すことによって前記第3のループのトレースデータを復元しながら、前記ループ検出した前記第2の命令アドレス以降のトレースデータと比較することを特徴とするトレース圧縮装置。
(付記5)
付記1乃至4のいずれかにおいて、
前記前記第2の命令アドレス以降のトレースデータ数は、前記命令アドレス比較手段によってループ検出されてから、前記トレースデータ比較手段によって前記不一致を検出した時までのトレースデータ数であることを特徴とするトレース圧縮装置。
(付記6)
付記1乃至5のいずれかにおいて、
前記トレースデータは、さらに、前記命令の命令内容、または、前記命令のメモリアクセス情報のいずれかまたは両方を有する命令情報を有し、
前記トレースデータ比較手段は、前記トレースデータの前記命令アドレスに加えて、前記命令情報についても比較することを特徴とするトレース圧縮手段。
(付記7)
プロセッサが実行した命令の命令アドレスを有するトレースデータをトレースメモリに順次書き込むトレースメモリライト制御工程と、
連続する前記トレースデータの第1、第2の命令アドレスの差分値が負であるか否かを判定する差分検出工程と、
前記差分値が負である第2の命令アドレスをループ候補先頭命令アドレスとして1つ以上保持するループ候補保持工程と、
前記差分値が負である第2の命令アドレスを前記ループ候補先頭命令アドレスと比較し、一致した場合にループ検出し、一致しない場合に、一致しなかった前記第2の命令アドレスを新たなループ候補先頭命令アドレスとして前記ループ候補保持工程に保持する命令アドレス比較工程と、
前記ループ検出した前記第2の命令アドレス以降のトレースデータと、前記トレースメモリ内の前記ループ候補先頭命令アドレス以降のトレースデータとを比較するトレースデータ比較工程とをコンピュータに実行させ、
前記トレースメモリライト制御工程では、前記トレースデータ比較工程において、前記第2の命令アドレス以降のトレースデータと、前記ループ候補先頭命令アドレス以降のトレースデータとの一致を検出する間は、前記第2の命令アドレス以降のトレースデータを前記トレースメモリに書き込まず、不一致を検出した時に、前記第2の命令アドレス以降のトレースデータ数と前記ループ候補先頭命令アドレスが書き込まれた前記トレースメモリ内のアドレス情報とを含むループ情報データを前記トレースメモリに書き込むことを特徴とするコンピュータ読み取り可能なトレース圧縮プログラム。
(付記8)
付記7において、
前記命令アドレス比較工程が、前記第1のループ情報データに対応する第1のループを検出した場合、
前記トレースデータ比較工程は、前記第1のループの前記ループ候補先頭命令アドレス以降のトレースデータが、当該第1のループが内包する第2のループの第2のループ情報データを有する場合、前記トレースメモリ内に書き込まれた前記第2のループ情報データの前記ループ候補先頭命令アドレス以降のトレースデータを、当該第2のループ情報データのトレースデータ数に達するまで読み出すことによって前記第2のループのトレースデータを復元しながら、前記ループ検出した前記第2の命令アドレス以降のトレースデータと比較することを特徴とするトレース圧縮プログラム。
(付記9)
付記7または8において、
前記ループ候補保持工程は、前記ループ候補先頭命令アドレスを複数保持し、
前記命令アドレス比較工程は、前記差分値が負である第2の命令アドレスを当該複数のループ候補先頭命令アドレスと比較し、一致する前記ループ候補先頭命令アドレスに対応するループを検出することを特徴とするトレース圧縮プログラム。
(付記10)
付記8において、
前記トレースデータ比較工程は、さらに、前記第2のループの前記ループ候補先頭命令アドレス以降のトレースデータが、当該第2のループが内包する第3のループの第3のループ情報データを有する場合、前記トレースメモリ内に書き込まれた前記第3のループ情報データの前記ループ候補先頭命令アドレス以降のトレースデータを、当該第3のループ情報データのトレースデータ数に達するまで読み出すことによって前記第3のループのトレースデータを復元しながら、前記ループ検出した前記第2の命令アドレス以降のトレースデータと比較することを特徴とするトレース圧縮プログラム。