9

IRを生成するLLVMをターゲットとするフロントエンドを構築しました。その後、完全に予想通り、IR 出力が正しくない場合があります (正しいように見えても、結果のプログラムを実行するとクラッシュするなど)。ただし、これに対処するための便利なツールはあまり見つかりませんでした。

lli を使用してみましたが、エラー メッセージの出力は驚くほど役に立ちません (インタープリターが非常に正確なエラーの詳細を提供できると想定する場合)。

IR を C コードに変換し、それを Visual Studio でデバッグすることを検討しましたが、この機能は LLVM から削除されたようです。

GDBの扱いも調べました。ただし、DWARF デバッグ情報の形式は、いくつかの既存の言語にかなり固有のようです。さらに、フロントエンドで翻訳しているソースは正しく、間違っているのは生成された IR であるため、元のソースのデバッグ シンボルはたとえば、どのソース変数にも対応しない一連の中間レジスタ値の値、またはコンパイラによって生成された関数のブレークポイントを確認する必要があります。

LLVM IR 出力をデバッグするためのツールとテクニックは何ですか?

4

2 に答える 2

5

あなたの問題を完全に理解しているかどうかわかりません。コンパイラ (言語 X から LLVM IR まで) が間違った出力 (間違った LLVM IR) を生成していて、それをデバッグする方法がわからないということですか? つまり、次の 2 つの可能性があります。

  1. コンパイラによって生成された IR は正しくありません - いくつかの命令を指して言うことができます - これは私が生成しようとしていたものではありません。
  2. IR は正しいようですが、期待した結果が得られません。

あなたが話しているのは(1)だと思います(これは、更新する前に質問が言っていたことだからです)

これは LLVM 固有の問題ではありません。言語 X からネイティブ コードへのコンパイラを作成しているとします。生成されたネイティブ コードが正しくありません。問題をどのようにデバッグしますか? 当然、コンパイラをデバッグします。入力に対するコンパイラの理解が正しかった最後の場所、または正しくなかった最初の場所を見つけようとします。これを行う方法は、コンパイラのアーキテクチャに大きく依存します。ただし、多くの場合に役立つのは、コンパイラで他の中間層を印刷可能な表現にすることです。

たとえば、Clang (C、C++、および Objective C から LLVM IR を生成する) は、完全な AST をダンプできます。したがって、不正なコードの AST を調べると、コンパイラを半分に削減でき、問題がフロントエンド (C ソース -> AST) にあるのか、コード生成 (AST -> LLVM IR) にあるのかを判断するのに役立ちます。LLVM バックエンド (LLVM IR をネイティブ コードにコンパイルする) には、いくつかの中間レイヤー (最も顕著なのは SelectionDAG と MI) もあり、デバッグのために調べることができます。これらは、他の既存のコンパイラの例にすぎません。YMMV とあなたのものです。

于 2013-05-29T15:31:27.043 に答える