2012-01-20 10 views
5

私はソースファイルを取得して計装された出力を生成するC言語(と多分C++)で少しの動的コード計測を行うことでClangの使用をスピードアップしようとしています。私は任意のブロックの先頭に関数呼び出しを追加したいと思います。また、すべてのブール式を変更して関数を呼び出して、それを追跡することもできます。たとえば:Dynamic Instrumentation with Clang

foo = a && (b || c); 

のようなものになるでしょう:

foo = EXPR_AND(a, EXPR_OR(b, c)); 

ので、私は起こる条件のすべての組み合わせを追跡することができます。

私はRecursiveASTVisitorを使用するのが最良のアプローチだと考えていますが、訪問した各ノードのCコードを出力する簡単な方法はありますか?

このようなことを達成するために何を見なければならないのですか?

注:さらに調査したところ、私は親友のように見えるlibclangを発見しました。リライターと組み合わせれば、私は必要なものを持っているかもしれません。良い例への指針(私はlibclangのビデオを集めた優秀なApple開発者を見つけたばかりです)は素晴らしいでしょう。

+0

'b'または' c'が副作用を含んでいると、提案された変換がコードのセマンティクスを大幅に変更します... –

+0

実際には、EXPR_ANDとEXPR_ORは次のようなマクロ展開です:#define EXPR_AND )(instr [0] = 1:instr [1] = 1,0)&&(b?instr [2] = 0:instr [3] = 1,0) –

答えて

2

良い例については、this projectを参照してください。

コール関数の入力と終了を計測するためにclangを使用し、渡された引数の型も検査します。

関連する問題