2013年12月11日水曜日

egypt によるコールグラフ生成

egypt
http://www.gson.org/egypt/

egypt は RTL ファイルを元に DOT 言語で記述されたコードを生成する。
RTL ファイルとは、 GCC がソースコードをコンパイルする際に内部で生成するソースコードの中間表現(IR)をダンプしたもので、コンパイルの際に CFLAGS に -fdump-rtl-expand を渡すことで得られる。

今回は egypt, dot, php-5.5.5 を用いて PHP 内部のコールグラフを作った。

$ cd php-5.5.5
$ ./configure
$ make CFLAGS=-fdump-rtl-expand

ここまでの手順で PHP がコンパイルされ *.o に対応する RTL ファイルが同じディレクトリ内に .expand という拡張子とともに作られる。

$ egypt Zend/zend_language_scanner.c.150r.expand \
 Zend/zend_language_parser.c.150r.expand  \
 Zend/zend_compile.c.150r.expand > ~/tmp/Zend-Engine.dot
$ dot -Tpng -o ~/tmp/Zend-Engine.png ~/tmp/Zend-Engine.dot

これにより所望の画像が得られるはずだが、実際には

dot: graph is too large for cairo-renderer bitmaps. Scaling by 0.968321 to fit

というメッセージと共に失敗する。
つまり、描画対象となるシンボルが多すぎるという事なので、全く見るつもりのない関数などを以下のように除外して dot ファイルを作りなおした。

$ egypt Zend/zend_language_scanner.c.150r.expand \  Zend/zend_language_parser.c.150r.expand  \
 Zend/zend_compile.c.150r.expand \
| egrep -v "do_|add_|highlight" > ~/tmp/Zend-Engine.dot
$ dot -Tpng -o ~/tmp/Zend-Engine.png ~/tmp/Zend-Engine.dot

これにより以下の画像が得られた。


横に長すぎるが、人様に見せる場合はもう少し細かく除外するシンボルを指定したほうがいいかもしれない。


0 件のコメント:

コメントを投稿