1

Valgrind は中間コード表現を使用して、バイナリ コードを計測できるようにするため、プログラミング言語レベルの構成要素を処理する必要はありません。バイナリ コードを Valgrind の中間表現 (IR) コードに変換するプロセスでは、加算などの操作にレジスタを使用することが示されています。これらは 1024 個使用されています。私が得られないのはtX、X が何らかの数値として表される一時レジスターと呼ばれる別のタイプのレジスターです。したがって、私はこれを見ることができます:

t28 = Add32(t26,0xFFFFFFFC:I32)
t4 = LDle:I32(t28)

t一時レジスタを意味します。私が見る限り、それらは通常のレジスターと非常によく似た動作をしているように見えますが、それらがどのように異なるのかを理解することはできません. 一時レジスターとは何か、通常のレジスターとどのように違うのか教えてもらえますか?

4

1 に答える 1

2

コンパイラ構築クラスで、中間コードのレジスタは仮想レジスタであると教えられました。それらは、必ずしもターゲット プラットフォームの実行可能ファイルと関係があるとは限りません。それらは実際の CPU レジスタである場合もあれば、メモリ内の一時的なものである場合もあります。それはすべて、コード ジェネレーターとオプティマイザーに依存します。テンポラリをどこに割り当てるかを決定するのはコード ジェネレータです。

IR を生成する大きな理由は、コンパイラの移植性を最大限にすることです。すべてのプラットフォームに対して 1 つのコンパイラ フロント エンドを使用し、IR をプラットフォーム固有のコード ジェネレーターに渡すことができます。GCC はこのように動作します。すべてではないにしても、ほとんどの適切なコンパイラがこのように動作すると確信しています。

もう 1 つの利点は、コード ジェネレーターに送信される前に、IR コードに対して特定の最適化を実行できることです。一部の最適化はプラットフォーム固有ではありません。たとえば、ループの影響を受けないコードはループから除外できます。プラットフォーム オプティマイザは通常、レジスタの割り当て、分岐など、CPU のプロパティに実際に依存するものなど、より低いレベルで最適化します。

于 2010-12-10T14:38:52.970 に答える