2012-03-30 60 views
9

私は、関数ポインタを含むlinuxカーネル用のコールグラフを生成しています(詳細は前の質問Static call graph generation for the Linux kernelを参照してください)。私はLLVMは、この目的のために適したものでなければならないと言われてきた、しかし私はllvm.orgLLVMを使用してコールグラフを生成する方法は?

関連文書へのポインタを含むすべてのヘルプ、上の関連する情報を見つけることができませんでした、高く評価されるだろう。

答えて

12

まず、あなたが(代わりにネイティブオブジェクトファイルの)LLVM IRにあなたのカーネルをコンパイルする必要があります。その後、llvm-ldを使用して、すべてのIRオブジェクトファイルを1つの大きなモジュールに結合します。それはかなり難しいことかもしれません、あなたはmakefileを大きく変更する必要がありますが、私はそれが実行可能であると信じています。

これで分析を行うことができます。 ツールを使用して-dot-callgraphのパスを使用して簡単なコールグラフを生成できます。関数ポインタを扱うことはまずありませんので、それを変更したいかもしれません。

あなたの関数ポインタを運ぶ可能性のあるすべてのデータフローパスを追跡することは非常に困難です。一般的には不可能です(整数型キャストへのポインタがあれば、等。)。特定のケースの大部分については、ポインターのすべての可能なデータフローパスを概算するために、グローバル抽象解釈を実装しようとすることができます。もちろん、それは正確ではありませんが、少なくとも控えめな近似は得られます。

+2

あなたは本当に800万行のコードに対してドットコールグラフを作成したくありません。それはドットがそれを描くことができれば、それはできないテニスコートをカバーするだろう。これ以外にも、これは、OPによる他の質問ノートへの答えの素晴らしいエコーです: - 関数ポインタがどんなに楽しいかを特に重視しています。 –

+0

@IraBaxter、確かに、あなたは「hello、world!」よりも大きなものについてはドットコールグラフを表示したくないです。しかし、あなたはそれ以上の分析のためにその.dotファイルを使いたいかもしれません。私は通常、.dotファイルを解析し、データベースに格納します。 –

+0

「opt」ツールを指摘してくれてありがとう。 はい、Ira、私はコールグラフのグラフィカルな表現を生成していません。それを任意の解析可能なフォーマットにすることは、ドットフォーマットが適格であるOKです。 関数ポインタに関しては、LLVMが関数ポインタのポイントツー分析を行うことができるはずだと言われています。私は自分自身を明確に実装することを検討していません。 – addalbx

関連する問題