2013-02-15 35 views
8

私はclangで手続き型のデータフロー解析を行っています。現在、私はlibtoolingを使ってソースファイルを解析し、AST訪問者を呼び出しています。 問題は、いくつかの.cファイルに対して1つのASTを作成する方法です。clangを持つ複数のソースファイルのAST

私はASTImportクラスを使用しようとしましたが、いくつかのASTノードのインポートをサポートしていません。さらに、私はCompilerIstanceを作成し操作するときに何か間違ったことをしており、デストラクタでクラッシュします。

非常によく似たオプションがASTImportActionでしたが、この場合はどのコマンドラインパラメータをClangToolに渡すべきかはわかりません。

第3の選択肢は、すべての.cファイルに対してASTUnitsを作成し、それぞれの定義を探すことでした。ユーザー定義型間の対応を見つける方法がはっきりしません。記録。 ASTImportではIsStructurallyEquivalent()関数を使用していますが、匿名の名前空間で宣言されているため、このコードをすべて自分のプログラムにコピーすることしかできません。また、すべてのASTノードをサポートするわけではありません。

インターネットからこのリンクhttp://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-August/023865.htmlが最も適切だと思われますが、私にとって解決策の技術的な詳細は不明です。

ご提案は大歓迎です。 多くのありがとうございます。

+1

なぜ、複数のファイルに対して「1つの」ASTを生成したいのですか?各ファイルに対して1つのASTを処理するだけの理由は何ですか? –

+1

私は誰かがこれについての答えを持っていれば幸いです:\私は今同じことをやろうとしています。 –

答えて

0

私は同様のことをやろうとしていました。私は単一のASTを作成しようとはしませんでした。私は複数のASTを解析していて、関数を自分でマップしていました。 私はASTマッチャーを使用して関数呼び出しを取得し、他のASTでそれらをチェックしています。

私は、ソースファイルリストを提供するためにcompile_commands.jsonファイルを使用しています。 OptionsParser.getCompilations()。getAllFiles()は、compile_commands.jsonで指定されたすべてのソースファイルを取得できます。

私たちがclangToolを作成し、私たちのマッチャーでツール上でfrontendActionを実行すると、すべてのソースファイル内で一致するものが検索されます。

これを実行する最適な方法があります。それを知っている人もいれば、それを指摘してください。

関連する問題