(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2022-04-19
(54)【発明の名称】コールスタックサンプリング
(51)【国際特許分類】
G06F 11/36 20060101AFI20220412BHJP
【FI】
G06F11/36 112
【審査請求】未請求
【予備審査請求】未請求
(21)【出願番号】P 2021551906
(86)(22)【出願日】2020-03-04
(85)【翻訳文提出日】2021-10-28
(86)【国際出願番号】 GB2020050510
(87)【国際公開番号】W WO2020178578
(87)【国際公開日】2020-09-10
(32)【優先日】2019-03-05
(33)【優先権主張国・地域又は機関】US
(81)【指定国・地域】
(71)【出願人】
【識別番号】500395107
【氏名又は名称】アーム・リミテッド
(74)【代理人】
【識別番号】110000855
【氏名又は名称】特許業務法人浅村特許事務所
(72)【発明者】
【氏名】グラント、アラスター
【テーマコード(参考)】
5B042
【Fターム(参考)】
5B042GA05
5B042HH10
5B042MA08
5B042MC13
(57)【要約】
【解決手段】 装置及びそれらの動作方法を開示する。データ処理動作中に呼び出され、まだリターンされていないサブルーチンに関するサブルーチン情報を含むコールスタックが保持される。スタックポインタは、データ処理動作中に呼び出され、まだリターンされていない、直近に呼び出されたサブルーチンに関連付けられたコールスタックの末端を示す。コールスタックサンプリングは、スタックポインタを参照して実行することができる。処理回路がコールスタックサンプリング手順を最後に完了したときにスタックポインタが有していた値を示すタイドマークポインタが保持される。コールスタックサンプリング手順は、タイドマークポインタの値とスタックポインタの現在値との間に示されるコールスタックからサブルーチン情報を取得することを含む。それにより、コールスタックに対する修正のみをがサンプリングするだけでよいという点で、より効率的なコールスタックサンプリングがサポートされる。
【選択図】
図2
【特許請求の範囲】
【請求項1】
装置であって、
サブルーチンを含むデータ処理動作を実行する処理回路と、
前記データ処理動作中に呼び出され、まだリターンされていないサブルーチンに関連するサブルーチン情報を含むコールスタックを格納するコールスタックストレージと、
スタックポインタを格納するスタックポインタストレージであって、前記スタックポインタの現在値が、前記データ処理動作中に呼び出されて、まだリターンされていない直近に呼び出されたサブルーチンに関連付けられたコールスタックの末端を示す、スタックポインタストレージと、
ただし、前記処理回路は、コールスタックサンプリングトリガに応答して、前記スタックポインタを参照して前記コールスタックにアクセスすることを含むコールスタックサンプリング手順を実行し、
タイドマークポインタを格納するタイドマークポインタストレージであって、前記タイドマークポインタの値が、前記処理回路が前記コールスタックサンプリング手順を最後に完了したときに前記スタックポインタが有していた先行値を示す、タイドマークポインタストレージと、
を備え、
前記処理回路は、前記タイドマークポインタの前記値と前記スタックポインタの前記現在値との間に示されたサブルーチン情報を取得することを含む前記コールスタックサンプリング手順を実行するように構成されており、
前記タイドマークポインタストレージは、前記コールスタックサンプリング手順の実行に応答して、前記スタックポインタの前記現在値と一致するように前記タイドマークポインタを修正し、
前記タイドマークポインタストレージは、前記コールスタックからサブルーチン情報を除去することに応答して、前記コールスタックからサブルーチン情報を除去することから生じる前記スタックポインタの前記現在値と一致するように前記タイドマークポインタを修正する、装置。
【請求項2】
前記タイドマークポインタストレージは、前記スタックポインタの前記現在値を、前記タイドマークポインタの前記値によって示されるよりも以前に呼び出されたサブルーチンに対応させるサブルーチンリターン命令の実行に応答して、前記スタックポインタの前記現在値と一致するように前記タイドマークポインタを修正する、請求項1に記載の装置。
【請求項3】
前記タイドマークポインタストレージは、前記スタックポインタの前記現在値を、前記タイドマークポインタの前記値によって示されるよりも以前に呼び出されたサブルーチンに対応させる前記スタックポインタへの書き込みに応答して、前記スタックポインタへの前記書き込みから生じる前記スタックポインタの前記現在値と一致するように前記タイドマークポインタを修正する、請求項1又は請求項2に記載の装置。
【請求項4】
前記コールスタックサンプリングトリガは、所定のコールスタックサンプリング割り込みの受信である、請求項1~3のいずれか一項に記載の装置。
【請求項5】
前記タイドマークポインタストレージ及び前記スタックポインタストレージは、前記スタックポインタの前記現在値が、前記タイドマークポインタの前記値によって示される前記コールスタック内のタイドマーク位置よりも後に呼び出されたサブルーチンに対応する前記コールスタック内のスタックポインタ位置を示す場合、前記所定のコールスタックサンプリング割り込みを生成するように構成されている、請求項4に記載の装置。
【請求項6】
前記コールスタックサンプリングトリガは、所定期間の経過後である、請求項1~5のいずれか一項に記載の装置。
【請求項7】
前記処理回路は、ソフトウェアマルチスレッドであり、第1のスレッドから第2のスレッドへのスレッド切替を実行するとき、前記タイドマークポインタの第1のスレッド値を含む前記第1のスレッドに関するスレッドコンテキストをエクスポートし、前記第2のスレッドについて、前記タイドマークポインタの第2のスレッド値を含む前記第2のスレッドに関するスレッドコンテキストをインポートするように構成されている、請求項1~6のいずれか一項に記載の装置。
【請求項8】
前記処理回路は、ソフトウェアマルチスレッドであり、第1のスレッドから第2のスレッドへのスレッド切替を実行するとき、前記タイドマークポインタの第1のスレッド値を無効化し、前記第2のスレッドについて、前記タイドマークポインタの第2のスレッド値をデフォルト値に設定するように構成されている、請求項1~6のいずれか一項に記載の装置。
【請求項9】
前記処理回路は、ハードウェアマルチスレッドであり、
前記コールスタックストレージは、スレッドコールスタックのセットを格納することが可能であり、
前記スタックポインタストレージは、スレッドスタックポインタのセットを格納することが可能であり、
前記タイドマークポインタストレージは、スレッドタイドマークポインタのセットを格納することが可能である、請求項1~6のいずれか一項に記載の装置。
【請求項10】
記録を格納するコールスタックバッファであって、前記記録はそれぞれ、
前記データ処理動作中に呼び出され、まだリターンされていないサブルーチンに関するソースアドレス及びターゲットアドレスと、
前記記録が作成された時点での前記スタックポインタのレコード値と、
を含む、コールスタックバッファと、
前記装置からのエクスポートのためのトレースデータを格納するトレースバッファと、
コールスタックバッファサンプリングトリガに応答して、前記コールスタックバッファ内に格納された記録を前記トレースバッファにコピーすることを含むレコードコピープロセスを実行するコールスタックバッファサンプリング回路と、
を更に備える、請求項1~9のいずれか一項に記載の装置。
【請求項11】
前記レコードコピープロセスを実行するとき、前記コールスタックバッファサンプリング回路は、前記スタックポインタの前記レコード値が、前記タイドマークポインタの前記値によって示される前記コールスタック内のタイドマーク位置よりも以前に呼び出されたサブルーチンに対応する前記コールスタック内のスタックポインタ位置を示す記録に到達したことに応答して、前記レコードコピープロセスを終了し、前記コールスタックバッファに示される直近に呼び出されたサブルーチンを示すように前記タイドマークポインタを更新する、請求項10に記載の装置。
【請求項12】
前記レコードコピー処理を実行するとき、前記コールスタックバッファサンプリング回路は、前記コールスタックバッファ内に記録を有する最も前に呼び出されたサブルーチンに対応する前記コールスタックバッファ内の最も古い記録に到達したことに応答して、前記最も古い記録の前記レコード値が、前記タイドマークポインタの前記値によって示される前記コールスタック内のタイドマーク位置よりも後に呼び出されたサブルーチンに対応する前記コールスタック内のスタックポインタ位置を示す場合、前記処理回路に前記コールスタックサンプリング手順を実行させる、請求項10又は11に記載の装置。
【請求項13】
前記コールスタックバッファサンプリング回路は、コールスタックサンプリング割り込みを発行することによって、前記処理回路に前記コールスタックサンプリング手順を実行させるように構成されている、請求項10~12のいずれか一項に記載の装置。
【請求項14】
前記コールスタックバッファは、前記スタックポインタの前記値の修正に応答して、前記スタックポインタの前記レコード値が、前記スタックポインタの前記修正値によって示される前記コールスタック内のスタックポインタ位置よりも後に呼び出されたサブルーチンに対応する前記コールスタック内のスタックポインタ位置を示す記録を破棄する、請求項10~13のいずれか一項に記載の装置。
【請求項15】
前記コールスタックバッファサンプリング回路は、新たなサブルーチンコールに応答して、前記新たなサブルーチンコールに対する新たな記録の作成が、前記タイドマークポインタの値によって示される前記コールスタック内のタイドマーク位置よりも後に呼び出されたサブルーチンに対応する前記コールスタック内のスタックポインタ位置を示す前記スタックポインタの前記レコード値を有する新たな記録をもたらす場合、前記レコードコピープロセスを実行し、前記タイドマークポインタの前記値を前記スタックポインタの現在値に更新する、請求項10~14のいずれか一項に記載の装置。
【請求項16】
前記コールスタックバッファサンプリング回路は、所定のコールスタックバッファコピータイミング間隔に更に応じて前記レコードコピープロセスを実行するように構成されている、請求項15に記載の装置。
【請求項17】
前記トレースバッファは、トレースバッファ上書きに応答し、前記トレースバッファ上書きは、エクスポートされていないトレースデータを上書きさせ、前記タイドマークポインタの前記値が前記コールスタック内の最も古い位置を示すスタックポインタ位置に対応するように設定する、請求項10~16のいずれか一項に記載の装置。
【請求項18】
前記トレースバッファは、トレースバッファオーバー上書きに応答し、前記トレースバッファ上書きは、エクスポートされていないトレースデータを上書きさせ、前記タイドマークポインタを無効化させる、請求項10~16のいずれか一項に記載の装置。
【請求項19】
データ処理方法であって、
サブルーチンを含むデータ処理動作を実行することと、
前記データ処理動作中に呼び出され、まだリターンされていないサブルーチンに関連するサブルーチン情報を含むコールスタックを格納することと、
スタックポインタを格納することであって、前記スタックポインタの現在値が、前記データ処理動作中に呼び出されて、まだ戻されていない直近に呼び出されたサブルーチンに関連付けられた前記コールスタックの末端を示す、ことと、
コールスタックサンプリングトリガに応答して、前記スタックポインタを参照して前記コールスタックにアクセスすることを含むコールスタックサンプリング手順を実行することと、
タイドマークポインタを格納することであって、前記タイドマークポインタの値が、前記コールスタックサンプリング手順が最後に完了したときに前記スタックポインタが有していた値を示す、ことと、
前記コールスタックサンプリング手順の実行に応答して、前記スタックポインタの修正値と一致するように前記タイドマークポインタを修正することと、
前記コールスタックからサブルーチン情報を除去することから生じる前記スタックポインタの前記現在値と一致するように前記タイドマークポインタを修正することと、
を含み、
前記コールスタックサンプリング手順を実行することは、前記タイドマークポインタの前記値と前記スタックポインタの前記現在値との間に示されたサブルーチン情報を取得することを含む、方法。
【請求項20】
装置であって、
サブルーチンを含むデータ処理動作を実行する手段と、
データ処理動作中に呼び出され、まだリターンされていないサブルーチンに関連するサブルーチン情報を含むコールスタックを格納する手段と、
スタックポインタを格納する手段であって、前記スタックポインタの現在値が、前記データ処理動作中に呼び出されて、まだ戻されていない直近に呼び出されたサブルーチンに関連付けられた前記コールスタックの末端を示す、手段と、
コールスタックサンプリングトリガに応答して、前記スタックポインタを参照して前記コールスタックにアクセスすることを含むコールスタックサンプリング手順を実行する手段と、
タイドマークポインタを格納する手段であって、前記タイドマークポインタの値が、前記コールスタックサンプリング手順が最後に完了したときに前記スタックポインタが有していた先行値を示す、手段と、
前記コールスタックサンプリング手順の実行に応答して、前記スタックポインタの修正値と一致するように前記タイドマークポインタを修正する手段と、
前記コールスタックからサブルーチン情報を除去することから生じる前記スタックポインタの前記現在値と一致するように前記タイドマークポインタを修正する手段と、
を備え、
前記コールスタックサンプリング手順を実行することは、前記タイドマークポインタの前記値と前記スタックポインタの前記現在値との間に示されたサブルーチン情報を取得することを含む、装置。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、データ処理に関する。具体的には、本開示は、データ処理装置におけるコールスタックのサンプリングに関する。
【発明の概要】
【発明が解決しようとする課題】
【0002】
プログラム性能分析は、データ処理装置がデータ処理動作を実行するときに、データ処理装置によって保持されたコールスタックをサンプリングすることによって実行することができる。このサンプリングは、例えば、周期的に、又は特定のイベントに応答して実行してもよい。サブルーチンがソフトウェアによって呼び出されると、対応するフレームがコールスタックに追加され、そのサブルーチンがリターンされると、そのフレームが除去される。したがって、コールスタックの現在のコンテンツは、現在アクティブな関数に関する情報を提供する。ソフトウェアは、コールスタックのコンテンツに関する情報を提供するように構成することができるが、このことは、実行されているソフトウェアが、例えばフレームポインタチェーン又はフレームアンワインドメタデータを使用してスタックを「ウォーク」するために中断しなければならないため妨害的である。これはまた、データキャッシュコンテンツにとっても妨害的であり得る。データ処理装置にはハードウェアコールスタックバッファを設けてもよく、このバッファは、コール命令及びリターン命令によって更新されるコールスタックレコード用の小さい固定サイズバッファである。このコールスタックバッファは、別個にサンプリングすることができるが、固定サイズであり、不都合であり得る。
【0003】
本明細書に記載される一例示的実施形態では、サブルーチンを含むデータ処理動作を実行する処理回路と、データ処理動作中に呼び出され、まだリターンされていないサブルーチンに関連するサブルーチン情報を含むコールスタックを格納するコールスタックストレージと、スタックポインタを格納するスタックポインタストレージであって、スタックポインタの現在値が、データ処理動作中に呼び出され、まだリターンされていない直近に呼び出されたサブルーチンに関連付けられたコールスタックの末端を示す、スタックポインタストレージと、ただし、処理回路は、コールスタックサンプリングトリガに応答して、スタックポインタを参照してコールスタックにアクセスすることを含むコールスタックサンプリング手順を実行し、タイドマークポインタを格納するタイドマークポインタストレージであって、タイドマークポインタの値が、処理回路がコールスタックサンプリング手順を最後に完了したときにスタックポインタが有していた先行値を示す、タイドマークポインタストレージと、を備え、処理回路は、タイドマークポインタの値とスタックポインタの現在値との間に示されたサブルーチン情報を取得することを含むコールスタックサンプリング手順を実行するように構成されており、タイドマークポインタストレージは、コールスタックサンプリング手順の実行に応答して、スタックポインタの現在値と一致するようにタイドマークポインタを修正し、タイドマークポインタストレージは、コールスタックからサブルーチン情報を除去することに応答して、コールスタックからサブルーチン情報を除去することから生じるスタックポインタの現在値と一致するようにタイドマークポインタを修正する、装置が提供される。
【0004】
本明細書に記載される一例示的実施形態では、サブルーチンを含むデータ処理動作を実行することと、データ処理動作中に呼び出され、まだリターンされていないサブルーチンに関連するサブルーチン情報を含むコールスタックを格納することと、スタックポインタを格納することであって、スタックポインタの現在値が、データ処理動作中に呼び出され、まだリターンされていない直近に呼び出されたサブルーチンに関連付けられたコールスタックの末端を示す、ことと、コールスタックサンプリングトリガに応答して、スタックポインタを参照してコールスタックにアクセスすることを含むコールスタックサンプリング手順を実行することと、タイドマークポインタを格納することであって、タイドマークポインタの値が、コールスタックサンプリング手順が最後に完了したときにスタックポインタが有していた先行値を示す、ことと、コールスタックサンプリング手順の実行に応答して、スタックポインタの修正値と一致するようにタイドマークポインタを修正することと、コールスタックからサブルーチン情報を除去することから生じるスタックポインタの現在値と一致するようにタイドマークポインタを修正することと、を含み、コールスタックサンプリング手順を実行することは、タイドマークポインタの値とスタックポインタの現在値との間に示されたサブルーチン情報を取得することを含む、方法が提供される。
【0005】
本明細書に記載される一例示的実施形態では、サブルーチンを含むデータ処理動作を実行する手段と、データ処理動作中に呼び出され、まだリターンされていないサブルーチンに関連するサブルーチン情報を含むコールスタックを格納する手段と、スタックポインタを格納する手段であって、スタックポインタの現在値が、データ処理動作中に呼び出され、まだリターンされていない直近に呼び出されたサブルーチンに関連付けられたコールスタックの末端を示す、手段と、コールスタックサンプリングトリガに応答して、スタックポインタを参照してコールスタックにアクセスすることを含むコールスタックサンプリング手順を実行する手段と、タイドマークポインタを格納する手段であって、タイドマークポインタの値が、コールスタックサンプリング手順が最後に完了したときにスタックポインタが有していた先行値を示す、手段と、コールスタックサンプリング手順の実行に応答して、スタックポインタの修正値と一致するようにタイドマークポインタを修正する手段と、コールスタックからサブルーチン情報を除去することから生じるスタックポインタの現在値と一致するようにタイドマークポインタを修正する手段と、を備え、コールスタックサンプリング手順を実行することは、タイドマークポインタの値とスタックポインタの現在値との間に示されたサブルーチン情報を取得することを含む、装置が提供される。
【図面の簡単な説明】
【0006】
添付図面に示されるそれらの実施形態を参照して、あくまで一例として本発明を更に説明する。
【
図1】
図1は、一例示的実施形態における装置の概略図である。
【
図2】
図2A及び
図2Bは、それぞれの例示的実施形態によりサンプリングされるコールスタックの進展を示す図である。
【
図3】
図3は、コールスタックを保持しサンプリングするときの一実施形態における方法により実行される一連の工程を示すフローチャートである。
【
図4A】
図4Aは、ソフトウェアマルチスレッドが行われ、現行スレッドに関するコンテキストが、新たなスレッドへの切替のために異なるコンテキストによって置き換えられ得る、一例示的実施形態におけるデータ処理装置の概略図である。
【
図4B】
図4Bは、コールスタックサンプリング手順が、タイマーによって生成される割り込みによって、又はスタックポインタとタイドマークポインタとの比較により生成される割り込みによってトリガされ得る一例示的実施形態における装置を概略的に示す図である。
【
図5】
図5は、処理回路がハードウェアマルチスレッドである一例示的実施形態における装置の概略図であり、各コールスタックのためのスタックポインタ及びタイドマークポインタを保持するように装置が構成されている。
【
図6A】
図6Aは、コールスタックバッファを含む一実施形態における装置の概略図である。
【
図6B】
図6Bは、一例示的実施形態におけるコールスタックバッファのコンテンツの概略図である。
【
図7】
図7は、コールスタックサンプリング手順が実行されるときの一実施形態例の方法により実行される一連の工程を示すフローチャートである。
【
図8】
図8は、コールスタックバッファを保持するときに一実施形態の方法により実行される一連の工程を示すフローチャートである。
【発明を実施するための形態】
【0007】
添付図面を参照して実施形態を検討する前に、以下の実施形態の説明を行う。
【0008】
一例示的構成では、サブルーチンを含むデータ処理動作を実行する処理回路と、データ処理動作中に呼び出され、まだリターンされていないサブルーチンに関連するサブルーチン情報を含むコールスタックを格納するコールスタックストレージと、スタックポインタを格納するスタックポインタストレージであって、スタックポインタの現在値が、データ処理動作中に呼び出され、まだリターンされていない直近に呼び出されたサブルーチンに関連付けられたコールスタックの末端を示す、スタックポインタストレージと、ただし、処理回路は、コールスタックサンプリングトリガに応答して、スタックポインタを参照してコールスタックにアクセスすることを含むコールスタックサンプリング手順を実行し、タイドマークポインタを格納するタイドマークポインタストレージであって、タイドマークポインタの値が、処理回路がコールスタックサンプリング手順を最後に完了したときにスタックポインタが有していた先行値を示す、タイドマークポインタストレージと、を備え、処理回路は、タイドマークポインタの値とスタックポインタの現在値との間に示されたサブルーチン情報を取得することを含むコールスタックサンプリング手順を実行するように構成されており、タイドマークポインタストレージは、コールスタックサンプリング手順の実行に応答して、スタックポインタの現在値と一致するようにタイドマークポインタを修正し、タイドマークポインタストレージは、コールスタックからサブルーチン情報を除去することに応答して、コールスタックからサブルーチン情報を除去することから生じるスタックポインタの現在値と一致するようにタイドマークポインタを修正する、装置が提供される。
【0009】
タイドマークポインタの値が、コールスタックが最後にサンプリングされたときにスタックポインタが有していた値を示すタイドマークポインタを記憶するタイドマークポインタストレージを提供することは、コールスタックサンプリングが実行されるとき、コールスタックは特定の「深さ」までサンプリングするだけでよいことを意味する。というのは、その時点より後のコールスタックレコードは変更されていないことが既知だからである。実際、タイドマークポインタ及びコールスタックポインタが同じ値を有する場合には、コールスタックサンプリングを実行する必要はない。これは、例えば、非常に大きい行列の乗算など、非常に長い時間実行される続関数中の反復サンプリングの場合に有用であることを証明できる。いったんコールスタックの第1のサンプリングが行われると(及びそれに対応してタイドマークポインタが設定されると)、同じ関数がまだ実行されている間に、コールスタックサンプリングがトリガされると、タイドマークポインタの同じ値が見られる。タイドマークの同じ値は、サンプリングが同じコールスタックと同じ関数にあることを示すだけでなく、更にそれが、関数の同じインスタンスである(すなわち、関数がリターンされておらず、その間に再び呼び出された)ことを示す。
【0010】
本装置は、タイドマークポインタストレージにタイドマークポインタ値を保持するために様々に構成してもよいが、いくつかの実施形態では、タイドマークポインタストレージは、タイドマークポインタの値によって示されるよりも以前に呼び出されたサブルーチンに、スタックポインタの現在値を対応させるサブルーチンリターン命令の実行に応答して、スタックポインタの現在値と一致するようにタイドマークポインタを修正する。同様に、いくつかの実施形態では、タイドマークポインタストレージは、タイドマークポインタの値によって示されるよりも以前に呼び出されたサブルーチンにスタックポインタの現在値を対応させるスタックポインタへの書き込みに応答して、スタックポインタへの書き込みから生じるスタックポインタの現在値と一致するようにタイドマークポインタを修正する。したがって、これにより、タイドマークポインタを、「ポップ」スタイル命令に関してだけでなく、スタックポインタへのリターン及び/又は直接書き込みに関しても更新することができ、(コールサンプリング手順の一部として)コールスタックの通常のリターンと展開の両方をカバーする。
【0011】
コールスタックサンプリングトリガは、様々な形態をとることができるが、いくつかの実施形態では、コールスタックサンプリングトリガは、所定のコールスタックサンプリング割り込みの受信である。
【0012】
コールスタックサンプリング割り込みは、本技術の実施に適した様々な方法及び様々なソースによって生成してもよいが、いくつかの実施形態では、タイドマークポインタストレージ及びスタックポインタストレージは、スタックポインタの現在値が、タイドマークポインタの値によって示されるコールスタック内のタイドマーク位置よりも後に呼び出されたサブルーチンに対応するコールスタック内のスタックポインタ位置を示す場合、所定のコールスタックサンプリング割り込みを生成するように構成されている。したがって、この状態(スタックポインタの現在値が、現在のタイドマーク位置によって示されるよりも後に呼び出されたサブルーチンが存在することを示す)は、コールスタックサンプリング割り込みの生成におけるトリガ及び/又はフィルタとして使用することができる。したがって、一方では、新たな関数が呼び出されるときにコールスタックサンプリングを開始させることができ、他方では、これが当てはまらなければコールスタックサンプリングが行われないように防止することができる。このようにして、必要な場合にのみ実行されるコールスタックサンプリングの効率的なアプローチがサポートされる。
【0013】
いくつかの実施形態では、コールスタックのサンプリングは周期的であってもよく、したがって、コールスタックサンプリングトリガは、所定期間の経過後である。処理回路がソフトウェアマルチスレッドである例示的実施形態では、タイドマークポインタ値は、スレッドコンテキストの一部を形成する。それゆえ、スレッド切替が行われるとき、タイドマークポインタ値は、新たなスレッドコンテキストに対して適切に更新されなければならないか、又は無効化されなければならない。したがって、いくつかの実施形態では、処理回路はソフトウェアマルチスレッドであり、第1のスレッドから第2のスレッドへのスレッド切替を実行するとき、タイドマークポインタの第1のスレッド値を含む第1のスレッドに関するスレッドコンテキストをエクスポートし、第2のスレッドについては、タイドマークポインタの第2のスレッド値を含む第2のスレッドに関するスレッドコンテキストをインポートするように構成されている。あるいは、いくつかの実施形態では、処理回路はソフトウェアマルチスレッドであり、第1のスレッドから第2のスレッドへのスレッド切替を実行するとき、タイドマークポインタの第1のスレッド値を無効化し、第2のスレッドについては、タイドマークポインタの第2のスレッド値をデフォルト値に設定するように構成されている。いくつかの例示的実施形態では、処理回路はハードウェアマルチスレッドであり、コールスタックストレージは、スレッドコールスタックのセットを格納することが可能であり、スタックポインタストレージは、スレッドスタックポインタのセットを格納することが可能であり、タイドマークポインタストレージは、スレッドタイドマークポインタのセットを格納することが可能である。
【0014】
いくつかの実施形態では、本装置は、記録を格納するためのコールスタックバッファであって、各記録が、データ処理動作中に呼び出され、まだリターンされていないサブルーチンに関するソースアドレス及びターゲットアドレスと、記録が作成された時点におけるスタックポインタのレコード値とを含む、コールスタックバッファと、装置からのエクスポートのためのトレースデータを格納するトレースバッファと、コールスタックバッファサンプリングトリガに応答して、コールスタックバッファ内に格納された記録をトレースバッファにコピーすることを含むレコードコピープロセスを実行するコールスタックバッファサンプリング回路と、を更に備える。コールスタックバッファサンプリングトリガは、様々な形態をとることができるが、例えば、コールスタックサンプリングトリガであってもよい。したがって、コールスタックサンプリング手順が実行されるとき、コールスタックバッファのコンテンツ(すなわち、ソースアドレス、ターゲットアドレス、及びスタックポインタ値を含む記録)が、トレースバッファにコピーされる。これは、例えば、コールスタックサンプリングトリガに応答して第1の工程として実行してもよい。というのも、状況によっては、このコールスタックバッファコンテンツは、コールスタックのサンプリングに関しては十分だからである。
【0015】
いくつかの実施形態では、レコードコピープロセスを実行するとき、コールスタックバッファサンプリング回路は、スタックポインタのレコード値が、タイドマークポインタの値によって示されるコールスタック内のタイドマーク位置よりも以前に呼び出されたサブルーチンに対応するコールスタック内のスタックポインタ位置を示す記録に到達したことに応答して、レコードコピープロセスを終了し、コールスタックバッファに示される直近に呼び出されたサブルーチンを示すようにタイドマークポインタを更新する。したがって、このような実施形態は、コールスタックバッファの全コンテンツがコピーされる必要がないことを認識しており、先のコールスタックサンプリングプロセスがある程度までコールスタックをサンプリングしている場合、コンテンツのコピーが必要とされないことを意味する。この状況は、タイドマーク位置を参照することにより認識され、よって、記録のスタックポインタ値が既にコピーされた領域内にあるとき、コピープロセスを停止することができる。更に、タイドマークポインタ自体は、コールスタックバッファに直近に呼び出された記録に更新することができる。なぜなら、この記録は、コピーされた記録のセットの一部が形成しているからである。
【0016】
いくつかの実施形態では、レコードコピー処理を実行するとき、コールスタックバッファサンプリング回路は、コールスタックバッファ内に記録を有する最も前に呼び出されたサブルーチンに対応するコールスタックバッファ内の最も古い記録に到達したことに応答して、最も古い記録のレコード値が、タイドマークポインタの値によって示されるコールスタック内のタイドマーク位置よりも後に呼び出されたサブルーチンに対応するコールスタック内のスタックポインタ位置を示す場合、処理回路にコールスタックサンプリング手順を実行させる。したがって、コールスタックバッファ内の最も古い記録が、タイドマークポインタによって示されるタイドマーク位置よりも後のスタックポインタ値を有する場合、コールスタックバッファのコンテンツと先に実行されたコールスタックサンプリングとの間にギャップが存在することを意味する。この状況では、ソフトウェアがコールスタックを展開する必要がある。いったんこれが完了すると、コールスタックバッファ内の直近に呼び出されたサブルーチンから、コールスタックの正確な記録が得られる。次いで、タイドマーカを現在のスタックポインタ値に設定することができる。いくつかの実施形態では、コールスタックバッファサンプリング回路は、コールスタックサンプリング割り込みを発行することによって、処理回路にコールスタックサンプリング手順を実行させるように構成されている。
【0017】
いくつかの実施形態では、コールスタックバッファは、スタックポインタの値の修正に応答して、スタックポインタのレコード値が、スタックポインタの修正値によって示されるコールスタック内のスタックポインタ位置よりも後に呼び出されたサブルーチンに対応するコールスタック内のスタックポインタ位置を示す記録を破棄する。したがって、スタックポインタを更新すると(例えば、複数のコールをポップするソフトウェア例外展開時に)、スタックポインタ値の修正に起因して不明瞭になったスタックバッファレコードが破棄される。
【0018】
いくつかの実施形態では、コールスタックバッファサンプリング回路は、新たなサブルーチンコールに応答して、新たなサブルーチンコールの新たな記録の作成が、タイドマークポインタの値によって示されるコールスタック内のタイドマーク位置よりも後に呼び出されたサブルーチンに対応するコールスタック内のスタックポインタ位置を示す、スタックポインタのレコード値を有する新たな記録をもたらす場合、レコードコピープロセスを実行し、タイドマークポインタの値をスタックポインタの現在値に更新する。したがって、これにより、新たなコールをコールスタックバッファ上にプッシュするとき、コールスタックバッファのコンテンツを、トレースバッファにプリエンプティブに捕捉させることが可能になり、そうでなければ、タイドマークポインタ値よりも新しい最新エントリスタックポインタとなる。したがって、トレースバッファのコンテンツは、既に最新であり、コールスタックサンプリングの後続のトリガが発生するとき、トレースバッファは必要なコンテンツを既に有しており、ソフトウェアがコールスタックを展開させる必要はない。
【0019】
いくつかの実施形態では、コールスタックバッファサンプリング回路は、所定のコールスタックバッファコピータイミング間隔に更に応じてレコードコピープロセスを実行するように構成されている。したがって、これにより、例えば、密に入れ子にされたプログラムコードにおいて頻繁な関数コールが行われる場合に生じ得る過剰なコピーが防止される。
【0020】
いくつかの実施形態では、トレースバッファは、トレースバッファ上書きに応答し、トレースバッファ上書きは、エクスポートされていないトレースデータを上書きさせ、タイドマークポインタの値が、コールスタック内の最も古い位置を示すスタックポインタ位置に対応するように設定する。したがって、トレースバッファ内の先行してコピーされたコールスタック情報が失われる場合、タイドマークポインタをコールスタック内の最も古い位置に修正することは、上述の機構が完全なスタック展開を実行させることを意味する。同様に、いくつかの例示的実施形態では、トレースバッファは、トレースバッファオーバー上書きに応答し、トレースバッファ上書きは、エクスポートされていないトレースデータを上書きさせて、タイドマークポインタを無効化する。これは、同じ効果を有する。すなわち、次のコールスタックサンプリングトリガが、全コールスタック展開を実行させる。
【0021】
一例示的構成によれば、サブルーチンを含むデータ処理動作を実行することと、データ処理動作中に呼び出され、まだリターンされていないサブルーチンに関連するサブルーチン情報を含むコールスタックを格納することと、スタックポインタを格納することであって、スタックポインタの現在値が、データ処理動作中に呼び出されて、まだリターンされていない直近に呼び出されたサブルーチンに関連付けられたコールスタックの末端を示す、ことと、コールスタックサンプリングトリガに応答して、スタックポインタを参照してコールスタックにアクセスすることを含むコールスタックサンプリング手順を実行することと、タイドマークポインタを格納することであって、タイドマークポインタの値が、コールスタックサンプリング手順が最後に完了したときにスタックポインタが有していた先行値を示す、ことと、コールスタックサンプリング手順の実行に応答して、スタックポインタの修正値と一致するようにタイドマークポインタを修正することと、コールスタックからサブルーチン情報を除去することから生じるスタックポインタの現在値と一致するようにタイドマークポインタを修正することと、を含み、コールスタックサンプリング手順を実行することは、タイドマークポインタの値とスタックポインタの現在値との間に示されたサブルーチン情報を取得することを含む、方法が提供される。
【0022】
一例示的構成によれば、サブルーチンを含むデータ処理動作を実行する手段と、データ処理動作中に呼び出され、まだリターンされていないサブルーチンに関連するサブルーチン情報を含むコールスタックを格納する手段と、スタックポインタを格納する手段であって、スタックポインタの現在値が、データ処理動作中に呼び出されて、まだ戻されていない直近に呼び出されたサブルーチンに関連付けられたコールスタックの末端を示す、手段と、コールスタックサンプリングトリガに応答して、スタックポインタを参照してコールスタックにアクセスすることを含むコールスタックサンプリング手順を実行する手段と、タイドマークポインタを格納する手段であって、タイドマークポインタの値が、コールスタックサンプリング手順が最後に完了したときにスタックポインタが有していた先行値を示す、手段と、コールスタックサンプリング手順の実行に応答して、スタックポインタの修正値と一致するようにタイドマークポインタを修正する手段と、コールスタックからサブルーチン情報を除去することから生じるスタックポインタの現在値と一致するようにタイドマークポインタを修正する手段と、を備え、コールスタックサンプリング手順を実行することは、タイドマークポインタの値とスタックポインタの現在値との間に示されたサブルーチン情報を取得することを含む、装置が提供される。
【0023】
ここで、特定の実施形態を、図面を参照して説明する。
【0024】
図1は、一例示的実施形態におけるデータ処理装置10を概略的に示す。同装置は、データ処理動作を実行する処理回路12を備える。これらのデータ処理動作において、特にプログラム命令を実行する際に、コールスタック14が保持される。コールスタック14は、(データ)ストレージ16内に格納されているものとして概略的に示されている。当業者に既知であるように、コールスタックは、処理回路12によって実行されるソフトウェアにおけるアクティブ関数に対応してリターン関数が追加されるデータ構造である。したがって、関数又はサブルーチンがソフトウェア内で呼び出されると、リターン命令がコールスタック14にプッシュされ、その関数又はサブルーチンが終了すると、リターンアドレスがコールスタック14からポップされ、処理回路がプログラム命令内の正しいポイントに戻り、実行を継続することができる。処理回路は、スタックポインタ値13を、例えば局所的にアクセス可能なレジスタ内に保持し、そこでスタックポインタの値はスタックの「トップ」を示す(成長する、上昇的なスタックの意味で)。装置10は、スタックポインタ値19のコピーも保持し、更にタイドマークポインタ20を保持するコールスタック制御回路18を更に備える。処理回路12のデータ処理動作は、コールスタックサンプリング手順を実行するために一時的に中断してもよく、コールスタック14はサンプリングされ、そのコンテンツは、例えば、検査のためにプログラマーに対してエクスポートされてもよい。周期的に、又は特定のイベントに応答して行われるそのようなコールスタックのサンプリングは、プログラム性能分析に有用であり得る。例えば、スタックの上部レベルは現在アクティブな関数を示すが、より深いレベルは、どのサブシステムがアクティブであるか、例えば、位相及びモジュールを示すことができる。
【0025】
コールスタックサンプリング手順を実行するとき、処理回路は、コールスタックの直近に追加された部分を特定するためにスタックポインタを参照し、また、実行するコールスタックサンプリングの限界を判定するために、コールスタック制御18によって保持されるタイドマークポインタを参照する。換言すれば、コールスタックサンプリング手順は、スタックポインタ値とタイドマークポインタ値との間に見出される、コールスタック14にプッシュされる情報を取得する。タイドマークポインタ値がどのように保持されるかについて、以下の図を参照して以下でより詳細に説明する。
【0026】
図2A及び
図2Bは、関数がソフトウェアによって呼び出され、対応するリターンアドレスをコールスタックにプッシュさせる、それぞれの実施例におけるコールスタックのコンテンツの進展を示す。リターンアドレスは、典型的には、呼び出される関数(サブルーチン)に対応する「スタックフレーム」の一部であるが、まだリターンにより終了していない。フレームは、この関数又はサブルーチンの呼び出しに関する追加情報を含んでもよいが、これは本説明にとっては重要ではない。
図2Aは、コールスタックがスタックフレームAを含む20から開始され、サブルーチンAが呼び出されたがまだリターンされていないことを示す。したがって、スタックポインタSPの値は、このフレームのトップを示す。上方に成長するコールスタックについての説明全体を通じてこの規則が採用されているが、これは任意の表現の選択であることに留意されたい。この時点で、タイドマークポインタTMは、そのデフォルト値又は「ゼロレベル」値であり(又は、実際には単に無効とされてもよい)、コールスタックのサンプリングがまだ行われていないことを示す。次に、21において、更なるサブルーチンBが呼び出され、スタックフレームBがコールスタックのトップにプッシュされる。SPは、コールスタックの新たなトップを示すように更新されており、TMはゼロレベルのままである。同様に、22で、更なるサブルーチンCが呼び出され、更なるスタックフレームCがコールスタック上にプッシュされる。SPはスタックのトップを示し、TMはボトムを示す。この状態では、ソフトウェアは、コールスタックをサンプリングするために中断され、スタックフレームC、B、及びA(スタックを通って下方に進む)が、エクスポート及び別個の分析のためにサンプリングされる。いったんコールスタックサンプリングが完了すると、タイドマークポインタTMは、スタックポインタの現在値に一致するように更新され、したがって、
図2Aの23では、SP及びTMの両方がコールスタックのトップを指す。その後、更なるサブルーチンDが呼び出され、その結果、24に示されるように、更なるスタックフレームDがコールスタック上にプッシュされる。SPは、スタックのトップを示し続けているが、タイドマークポインタTMは、サンプリング後に設定されたレベルに留まることに留意されたい。更なるサブルーチンEが呼び出され、25では、対応するスタックフレームEがコールスタック上にプッシュされているのが示されている。この時点で、ソフトウェアは、コールスタックサンプリングを実行するために再び中断され、ここでサンプリングは、スタックフレームD及びEのみ、すなわち、SPとTMポインタとの間のコールスタックコンテンツのみをコピーする。というのは、TMポインタの位置が指し示すように、最後にコールスタックサンプリングが実行されてからコールスタック内のこのポイントより下のサンプリングは、その部分が変更されていないため必要でないからである。
【0027】
図2Bは、
図2Aに示される進展の変形を示す。実際には、30から33への進展は20~23の進展と同一であるため、ここでは説明しない。
図2Bの33と34との間で、サブルーチンCがリターンし、スタックフレームCがコールスタックからポップされる。このポップに関連して、スタックポインタSP及びタイドマークポインタTMの両方が、コールスタックの新たな状態に対応するように更新される。続いて、新たなサブルーチンDが呼び出され、35では、コールスタック上にプッシュされたスタックフレームDが示され、その後、更なるサブルーチンEが呼び出され、36では、コールスタック上にプッシュされたスタックフレームEが示されている。したがって、
図2Bの36に示される状態を有するコールスタックでは、ソフトウェアがコールスタックサンプリング手順を実行するために中断されると、サンプリングはSPとTMとの間のコールスタックのコンテンツ(すなわち、フレームE及びD)のみをコピーする。
【0028】
図3は、一例示的実施形態の方法により行われる工程を示すフローチャートである。フローは、関数(サブルーチン)が呼び出されたか、又はリターンされたかを判定する工程50から開始すると考えられ得る。この場合、フローは工程51に進み、これが関数(サブルーチン)コールであるかどうかが判定される。その後、フローは工程52に進み、この新たな関数コールに対応する新たなスタックフレームがコールスタック上にプッシュされる。この結果、スタックポインタSPは、現在、この新たに追加されたスタックフレームを示していると理解される。次いで、フローは工程50に戻る。工程51の検討に戻ると、これは関数コールでなければリターンであり、フローは工程53に進み、リターンされた関数フレームがコールスタックのトップからポップされる。また、このコールスタックからのフレームのポップにより、スタックポインタがリセットされ、残りのコールスタックの新たなトップを示すことが理解されるであろう。次に、工程54で、必要に応じて、現在値及び更新されたスタックポインタ値の最小値に設定されるという点で、タイドマークポインタも更新される。次いで、フローは工程50に戻る。工程50で、関数コールも関数リターンも発生していないと判定されると、フローは工程55に進み、コールスタックのサンプリングを実行すべきかどうかが判定される。実行すべきでない場合、フローは単純に工程50に戻る。しかしながら、コールスタックサンプリングを実行すべき場合、フローは工程56に進み、最初に、タイドマークポインタ値がスタックポインタ値と一致するかどうかが判定される。一致する場合、これは、このコールスタックが最後にサンプリングされたため変更されていないことを示し、更なるコールスタックサンプリングの実行が必要でないため、フローは単純に工程50に戻る。しかしながら、一致していない場合、フローは工程57に進み、スタックポインタ及びタイドマークポインタによって示されるレベルの間でコールスタックがサンプリングされる。次いで、工程58において、タイドマークポインタがスタックポインタの現在値に設定される。次いで、フローは工程50に戻る。
【0029】
図4Aは、一例示的実施形態における装置17を概略的に示す。処理回路71は、ソフトウェアマルチスレッドであり、したがって、複数のソフトウェアスレッド間を切り替えることができる。各ソフトウェアスレッドは関連するコンテキスト(データ処理装置の状態の様々な態様を定義する)を有し、
図4Aに示されるように、現在実行中のソフトウェアスレッドに関する現在のコンテキスト73は、スタックポインタ値74並びにタイドマークポインタ値75を含むことが分かる。したがって、処理回路71がソフトウェアスレッドを切り替えるとき、現在のコンテキスト73は保存され、ストレージ72に格納されるようにエクスポートされる一方、ストレージ72に格納されたコンテキスト76(スタックポインタ値76及びタイドマークポインタ値78を格納した値を含む)は、処理回路が切り換えるソフトウェアスレッドにインポートされる。タイドマークの現在値が単に無効化又はリセットされる(
図2A及び2Bを参照すると、ゼロレベルに設定されている)場合に、異なるソフトウェアスレッドに切り替えるときの代替アプローチは、処理回路が実行するデータ処理動作に関数的に影響を与えないが、コールスタックが次にサンプリングされるとき、コールスタック全体をサンプリングする必要がある。タイドマークポインタ値がスレッドのコンテキストの一部として保持されるとき、例えば、バンクレジスタ又はメモリからのコンテキストの遅延ローディングなどの任意のコンテキスト切替機構に従って、処理回路へ及び処理回路からタイドマークポインタ値を転送してもよい。
【0030】
図4Bは、一例示的実施形態における装置80を概略的に示す。具体的には、
図4Bは、処理回路にコールスタックサンプリング手順を実行させることができる2つの例示的な機構を概略的に示す。
図4Bに示されるように、装置80は、処理回路81及びタイマー82を備える。タイマー82は、コールスタックサンプリングを実行するのに好適な間隔に設定され、適切な頻度で割り込みを生成することができる。タイマー82から割り込みIRQ1を受信すると、処理回路81は、コールスタックサンプリング手順を実行することができる。また、
図4Bに示されるように(しかし、両方の機構が存在してもよく、又は一方のみが存在してもよいことに留意すべきである)、コールスタック監視回路83は比較回路84を備える。比較回路84は、スタックポインタ値85及びタイドマークポインタ値86を受信する。これらの値の比較に基づいて、比較回路84は、コールスタックサンプリング手順を実行させるために、処理回路81に対して割り込みIRQ2を生成することができる。比較回路84の構成は、例えば、スタックポインタ値85がタイドマークポインタ値86を超えると(例えば、
図2A及び2Bを参照)、コールスタックのサンプリングがトリガされるように設定することができる。また、コールスタック監視回路83は、SPとTMとの間の比較が連続的には実行されず、所定間隔で実行されるように、タイマー87から入力を受信してもよいことに留意されたい。
【0031】
図5は、一例示的実施形態における装置100を概略的に示す。ここで、処理回路101は、ハードウェアマルチスレッドであり、したがって、複数スレッドに対して個々のハードウェア制御部を備える。これは、
図5では、スレッドA制御102及びスレッドB制御103により表されている。簡略化のため、2つのハードウェアスレッドのみが示されている。したがって、2つのコールスタック104及び105は、ストレージ106内に保持され、コールスタック制御回路107は、それぞれのコールスタックに対応するスタックポインタ値108及びタイドマークポインタ値109並びにスタックポインタ値110及びタイドマークポインタ値111を保持する。
【0032】
図6Aは、一例示的実施形態における装置120を概略的に示す。同装置は、データ処理動作を実行し、データ処理動作を実行する際にストレージ140に格納されたコールスタックデータ構造130を利用する処理回路121を備える。処理回路は、コールスタック130を参照してスタックポインタ122を保持する。装置120は、コールスタックバッファ124を更に含み、コールスタックバッファは、
図6Bに示されるように、それぞれがソースアドレス、ターゲットアドレス、及びスタックポインタ値を含む固定数の記録125を格納することができる。コールスタックバッファ124は、コール及びリターン命令によって更新される。また、スタックポインタを(例えば、複数のコールをポップするソフトウェア例外展開に基づき)更新することにより、より新しい(高い)スタックポインタ値を有する任意のコールスタックバッファ記録を廃棄させる。装置120は、コールスタックバッファ128からトレースバッファ150にコンテンツをコピーするコピープロセスを制御するように構成されたコールスタックバッファサンプラー128を更に備える。トレースバッファ150のコンテンツは、周期的に又は特定の信号に応答してエクスポートされる。コールスタックバッファサンプラー128は、タイドマークポインタ値131及びスタックポインタ値132(これは、処理回路121によって保持されるスタックポインタ122のコピーである)を保持する。コールスタックバッファサンプラー128は、コールスタックバッファ124のコンテンツを所定の間隔でトレースバッファ150にコピーするようにコールスタックバッファサンプラーをトリガするタイマー133を更に備える。コールスタックバッファ124からトレースバッファ150へのコピーを実行するとき、コールスタックバッファサンプラーは、その記録のスタックポインタ値とサンプラーが保持するタイドマークポインタ値131とを比較し、コールスタックバッファ124内で検査される次の記録が、タイドマーク値131によって示されるものよりも古いサブルーチンに対応する場合、コピープロセスを停止するように構成されている。
図2A及び2Bに示されるコールスタックの観点から見れば、これは、スタックポインタレベルが、タイドマークポインタ値131が現在示しているレベルよりも下であることに対応する。しかしながら、コピープロセスが終了し、コールスタックバッファ124内の最も古い記録(すなわち、
図2A及び2Bの表示において最も低いスタックポインタ値を有する記録)が、タイドマークポインタ値131を上回るスタックポインタ値を有する場合、これは、コールスタックバッファ124内で利用可能なコンテンツと、サンプリングが前に実行されたコールスタック130の部分との間にギャップが存在することを示す。この場合、ソフトウェアは、コールスタックを展開する必要があり、コールスタックバッファサンプラーは、処理回路121に実行を中断させるために割り込みIRQを生成する。これが完了すると、コールスタックの正確な記録が、コールスタックバッファ内の最も新しい記録より下方に作成され、その後、タイドマークポインタ値131が現在のスタックポインタ値SPに設定される。装置120は、トレースバッファ上書きモニタ151を更に備える。このトレースバッファ上書きモニタは、トレースバッファ150の使用を監視し、具体的には、まだエクスポートされていないトレースバッファのコンテンツがいつ上書きされるかを特定する。この状況で、トレースバッファ上書きモニタが、コールスタックバッファサンプラー128に信号を送信し、タイドマークポインタ131がリセットされ(すなわち、
図2A及び
図2Bの表示においてゼロにされる)、これにより、この情報を再捕捉するために、次のサンプリング時点でフルコールスタック展開が実行される。
【0033】
図7は、例えば、
図6Aの装置120内で実行され得るような、一例示的実施形態における方法で行われる一連の工程を示すフローチャートである。同フローは、工程200から開始されると考えることができ、ここで、コールスタックのサンプリングが必要であるかどうかが判定される。必要でない場合、フローはこのポイントで待機する。コールスタックサンプリングを実行すべき場合、フローは工程201に進み、コールスタックバッファのコンテンツをトレースバッファにコピーするコピープロセスが開始される。次に、工程202において、出会う第1の記録が、現在のタイドマークポインタ値よりも大きいスタックポインタ値を有するかどうかが判定される。有していればその後、フローは工程203に進み、コピープロセスが停止され、工程204では、タイドマークポインタ値が、コールスタックバッファに格納された直近に呼び出された記録と一致するように更新される。次いで、フローは工程200に戻る。工程202の検討に戻ると、この条件が真でない場合、工程205で、記録がコールスタックバッファからトレースバッファにコピーされる。次に、工程206で、コールスタックバッファ内の最も古い記録に到達したかどうかが判定される。到達していない場合、フローは工程202に戻る。しかしながら、コールスタックバッファ内の最も古い記録に到達している場合、工程207で、この最も古い記録が、現在のタイドマークポインタ値よりも大きいスタックポインタ値を有するかどうかが判定される。これが当てはまらない場合、フローは工程200に戻る。そうでなく工程207で、これが真である場合、フローは工程208に進み、ソフトウェアは、(このギャップを補うために)フルコールスタックを展開させ、次いで工程209で、タイドマークポインタをスタックポインタの現在値に設定する。次いで、フローは工程200に戻る。
【0034】
図8は、例えば、
図6Aの装置120によって実行され得る、一実施形態における方法で実行される一連の工程を示すフローチャートである。フローは工程250から開始されると考えることができ、新たな関数コールがコールスタックバッファにプッシュされたかどうかが判定される。これが当てはまるまで、フローはこのポイントで待機する。これが真である場合、フローは工程251に進み、コールスタックバッファ内に新たな記録を作成することが、タイドマークポインタの現在値よりも大きいスタックポインタ値を有する新たな記録をもたらすかどうかが判定される。これが当てはまらない場合、フローは工程252に進み、新たなコールスタックバッファレコードが作成され、フローは工程250に戻る。しかしながら、この条件が真である場合、フローは工程253に進み、コールスタックバッファのコンテンツがトレースバッファにコピーされ、工程254では、タイドマークポインタが現在のスタックポインタ値に更新される。この方法及び手法は、その後、コールスタックサンプリングトリガが発生し、コールスタックサンプリングが必要とされるとき、トレースバッファが、この時点までに取得されたコールスタックコンテンツを既に有しており、ソフトウェアを中断してスタックを展開する必要がないことを意味する。密に入れ子になったコード(すなわち、多数のコールとそれに続く多数のリターンを繰り返し実行するコード)が要求されるものよりも多くのプリエンプティブトレースを引き起こすことを回避するため、
図8のフロー工程に遅延を導入してもよいことに留意されたい。
【0035】
要約して、装置とそれらの動作方法を開示する。データ処理動作中に呼び出され、まだリターンされていないサブルーチンに関するサブルーチン情報を含むコールスタックが保持される。スタックポインタは、データ処理動作中に呼び出され、まだリターンされていない、直近に呼び出されたサブルーチンに関連付けられたコールスタックの末端を示す。コールスタックサンプリングは、スタックポインタを参照して実行することができる。処理回路がコールスタックサンプリング手順を最後に完了したときに、スタックポインタが有していた値を示すタイドマークポインタが保持される。コールスタックサンプリング手順は、タイドマークポインタの値とスタックポインタの現在値との間に示されるコールスタックから、サブルーチン情報を取得することを含む。それにより、コールスタックに対する修正のみをサンプリングするだけでよいという点で、より効率的なコールスタックサンプリングがサポートされる。
【0036】
本出願において、「~ように構成される(configured to)」という用語は、装置の要素が、定義された動作を実行することができる構成を有することを意味するために使用される。このコンテキストにおいて、「構成」は、ハードウェア又はソフトウェアの相互接続の構成又は方法を意味する。例えば、装置は、定義された動作を提供する専用ハードウェアを有してもよく、又はプロセッサ若しくは他の処理デバイスは、機能を実行するようにプログラムされてもよい。「~ように構成される」は、定義された動作を提供するために、装置要素を任意の方法で変更する必要を意味しない。
【0037】
本発明の例示的な実施形態が添付の図面を参照して本明細書で詳細に説明されてきたが、本発明はそれらの正確な実施形態に限定されず、添付の特許請求の範囲によって定義される本発明の範囲から逸脱することなく、当業者によって様々な変更、追加、及び修正を行うことができることを理解されたい。例えば、従属請求項の特徴の様々な組み合わせは、本発明の範囲から逸脱することなく、独立請求項の特徴とともに行うことができる。
【国際調査報告】