2017-01-21 5 views
0

特定のコール命令が何回呼び出されたかをカウントしていますが、命令を一意に識別するのには苦労しています。私はドキュメンテーションの指示IDとして何かを見つけることができませんでした。私はIDを取得し、それを仕事をする方法を知っている外部関数に渡したいと思います。LLVM Passで命令を一意に識別する方法は?

これらの命令の一意のIDを取得するにはどうすればよいですか(できれば整数として)?

+1

私は、あなたの 'Instruction *'のポインタ値を単にIDとして使うことができます。 – arrowd

+0

こんにちは@arrowd!コメントありがとう。命令のアドレスはどういう意味ですか?さらに、アドレスは変更できませんか? –

+0

また、質問の2番目の部分は、どうやってIntやその他のプリミティブなデータ型(命令型へのポインタではない)として取得できますか? –

答えて

1

ランタイムでカウントを行い、興味のあるコール命令を数えるコードを挿入するだけです。この場合、Instructionポインタは正常に動作するはずです。 Instructionを移動するとポインタが変更されず、Instructionを削除した場合にのみ無効になります。

ポインタを整数に変換するには、static_cast<uintptr_t>(i)を使用します。

0

可能なコール命令のタイプを知っている場合は、可能なすべてのタイプのコール命令の列挙型を宣言して、列挙型のコール命令に遭遇するたびに列挙型の値をカウント関数に渡すことができます。パラメータ値。

すべての可能な呼び出し命令がわからない場合は、呼び出し命令によって呼び出されている関数の名前をカウント関数に渡すことができます。この場合、関数名のマップとその関数のカウントを維持するように、関数countを実装する必要があります。

呼び出し命令はその特定の呼び出しの値(Value*)を返すので、私が得たInstruction*ポインタはすべて一意であると思います。したがって、ポインタ値をIDとして使用すると、目的を果たせません。

関連する問題