3

なぜすべてのプログラムがValgrindによって200の基本ブロックに分割されているのですか?そして、どのように分割するのですか?

4

1 に答える 1

0

最初の質問

Valgrindツールに取り組んでからしばらく経ちますが(この質問が古いよりも長いです)、誰かがまだ興味を持っている場合に備えて、これが私が記憶から掘り起こしたものです:

まず、違い:スーパーブロックは基本ブロックとは少し異なります。Valgrindは、基本ブロックではなく、スーパーブロックを使用します。スーパーブロックはいつでも終了できますが、基本ブロックはその端から実行することによってのみ終了します。

Valgrindは、プログラムを200のスーパーブロックに分割しません。代わりに、プログラムを200 IRStatements以下のスーパーブロックに分割すると確信しています(これは、命令に直接変換される場合とされない場合があります)。

この理由は、翻訳者の効率のためだと確信しています。少なくとも現在のバージョンのValgrindでは、プログラム全体を事前に翻訳しないと合理的に確信しています。プログラムをIR形式に翻訳することは、時間とリソースを大量に消費するため、翻訳者は必要なだけのプログラムを翻訳しようとします。これは、コードが初めて実行されるときにコードを変換するだけで実行されます。

2番目の質問

さて、あなたの2番目の質問について...私はあなたが何を求めているのか完全にはわかりません。「Valgrindがプログラムを分割する方法をどのように決定するのか」と尋ねる場合、答えはコンパイラーと同様に決定するということです。プログラムのスーパーブロックへの変換を開始し、ブロック制限サイズに達するか、他の場所からブロックへのエントリポイントがあることを検出すると、新しいスーパーブロックを開始します(スーパーブロックと基本ブロックは1つのエントリポイントしか持てません)。

代わりに「IRSBスーパーブロックのサイズを変更できますか?」という意味の場合は、はい、ツール初期化コードでValgrindに戻して、必要なスーパーブロックのサイズを指定するオプションがあります(ただし、これを任意のサイズに増やすことができるかどうか思い出せません)。これはいずれもオンラインで文書化されておらず、ファイル自体にまばらにしか文書化されていません。他のツールのソースを見て、初期化中に構成オプションをValgrindに渡す方法を確認できます。これにより、少なくとも、Valgrindに返す必要のあるオプションを把握するためにどのヘッダーを確認するかについての良いアイデアが得られるはずです。

于 2012-10-25T21:06:15.803 に答える