21

まず、私は LLVM パスの初心者です。

変換パス (C++ API を使用) の後、LLVM の命令にメタデータを追加しようとしています。ツール チェーン内の別のツールで使用するために、この情報を保存するつもりです。これに関して2つの質問があります。

  1. メタデータとして保存した情報が、LLVM IR で動作する別のツールにフィードされることを期待しています。では、メタデータは良い考えですか? 文字列をいくつかの指示とともにメタデータとして保存するつもりです。

  2. ここでメタデータが正しい方法である場合は、メタデータ ノードを作成するための助けが必要です。setMedata() 関数を使用して命令にアタッチする予定です。setMetadata() のどのバリアントを使用するのが適切か。私のデータがどの MDKind であるべきかわかりません。MDString を作成し、それを MDNode にアタッチしてから、命令で setMetadata() を呼び出します。関数内の命令にメタデータを添付する場合、setMedata() でどのコンテキストを使用する必要がありますか。コンテキストとメタデータとの関連性は?

フォーラムや llvm doxygen のドキュメントで多くの議論を読み上げようとしましたが、すべての質問に対する明確で完全な回答が得られませんでした。私はこれを理解するのに役立つあなたの助け、またはいくつかの資料に感謝します.

4

1 に答える 1

28

私の意見では:

1.メタデータは使用するのに適切なメカニズムですか?

「他のツール」自体がパスではない場合は、そうです。メタデータが最善のアプローチだと思います。すべてをIRに保持し、目で簡単に識別でき、テスト用に手動で追加するのが簡単です。おそらく最も重要なことですが、既存のメタデータの種類を再利用しない限り、他のものと衝突しないでください。

ただし、「他のツール」がそれ自体でパスである場合は、別の方法があります。一方のパスをもう一方のパスに依存させ、前のパスの情報を後のパスで直接使用することができます。利点は、IRを変更する必要がないことです。

2.カスタムメタデータノードを使用するにはどうすればよいですか?

次のように、のchar*バリアントを使用します。setMetadata

LLVMContext& C = Inst->getContext();
MDNode* N = MDNode::get(C, MDString::get(C, "my md string content"));
Inst->setMetadata("my.md.name", N);

また、文字列がで初めて使用されるsetMetadata場合は、モジュールに新しい種類として自動的に登録さmy.md.nameれます(実際には、コンテキスト全体で一貫していると思います)。後で、次を使用して文字列を取得できます。

cast<MDString>(Inst->getMetadata("my.md.name")->getOperand(0))->getString();

ただし、同じスコープから呼び出しgetMetadataたりsetMetadata、同じスコープから繰り返し実行したりする場合Module::getMDKindIDは、実際に使用されている種類を取得し、種類の値を使用するこれらのメソッドのバリエーションを使用することもできます。

最後に、メタデータノードスコープを関数内に制限できることに注意してください-そのためのMDNode::get(..., ..., true)バリアントを使用します-私自身は使用したことがありませんが。

于 2012-12-11T08:14:19.503 に答える