1

特定のイントロスペクション機能を利用できるようにしたいライブラリに取り組んでいます。私はclangでコンパイルしているので、libtoolingなどにアクセスできるとしましょう。

私が具体的に望んでいるのは、誰かがプログラムの一部として既にコンパイルされた関数の LLVM IR を表示できるようにすることです。コンパイル時に -emit-llvm を使用して IR を取得できることはわかっています。しかし、それはファイルに保存されます。私が望むのは、LLVM IR がプログラム自体に埋め込まれ、プログラム自体から取得できるようにすることです。たとえば、 my_function_object.llvm_ir()

そのようなことは可能ですか?ありがとう!

4

1 に答える 1

2

基本的に、プログラムに反映させようとしています。リフレクションでは、バイナリにメタデータが存在する必要があります。私が知る限り、これは LLVM にはそのままでは存在しません。

このような効果を得るには、エクスポートされた関数を介して公開される、プログラム内にグローバルなキー値ディクショナリを作成することができますIRInstruction* retrieve_llvm_ir_stream(char* name)

このディクショナリは、特定の関数のある種の識別子 (エクスポートされた名前など) を、その関数の IR ストリームを表すメモリ内配列 (カスタムIRInstruction構造体として表される各命令など) にマップします。表現形式 (カスタムIRInstruction構造体など) の型と関数は、ソースに含める必要があります。

IR 生成の段階では、この辞書は空になります。IR 生成ステップの直後に、カスタム ビルド ステップを追加する必要があります。IR ファイルを開き、データをディクショナリに入力します。プログラムのエクスポートされた関数ごとに、その名前をキーとしてディクショナリとその IR に挿入します。値としてストリームします。IR ストリームは、カスタム ビルド ツール (LLVM API を利用して生成された IR を読み取り、それを独自の形式に変換する) によって読み取られるように、関数の定義から生成されます。

次に、前と同じようにアセンブラとリンカに進みます。

于 2015-09-05T19:52:11.360 に答える