使用Clang生成多个源文件的抽象语法树(AST)

11

我正在使用clang进行跨过程的数据流分析。目前我正在使用libtooling解析源文件并调用AST访问器。 问题是,如何为几个.c文件创建单个AST?

我尝试使用ASTImport类,但它不支持导入某些AST节点。此外,在创建和操作CompilerIstance时我做错了一些事情,并且在析构函数中崩溃。

一个非常相似的选项是ASTImportAction,但我不太清楚在这种情况下应该向ClangTool传递哪些命令行参数。

第三个选择是为每个.c文件创建ASTUnits,并在每个文件中查找定义,但不清楚如何找到用户定义类型(例如记录)之间的对应关系。在ASTImport中,他们使用IsStructurallyEquivalent()函数,但它声明在匿名名称空间中,因此我只能将所有这些代码复制到我的程序中。而且,它仅支持部分AST节点。

从互联网上看,这个链接http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-August/023865.html似乎是最合适的,但是对于我来说,解决方案的技术细节还不清楚。

欢迎任何建议。 非常感谢。


1
为什么你想要为多个文件生成“一个”AST呢?为什么不能为每个文件处理一个AST呢? - Ira Baxter
1
我希望有人能解决这个问题:\ 我现在也在尝试做同样的事情。 - Jeremy Kuah
1个回答

4
我曾经尝试过类似的操作,不过我没有尝试创建单个AST。相反,我正在解析多个AST并尝试自行映射函数。 我使用AST匹配器来获取函数调用,然后在其他AST中检查它们。
我正在使用compile_commands.json文件提供源文件列表。 OptionsParser.getCompilations().getAllFiles()可以获得在compile_commands.json中指定的所有源文件。
当我们创建一个clangTool并在工具上运行frontendAction与我们的匹配器时,它会在所有源文件中搜索匹配项。
可能有更优化的操作方式。如果您知道,请指出来。

1
你是如何自己映射这些函数的呢?如果我错了,请纠正我,但每个AST的ID都会不同。 你是通过某种哈希方式来映射它的吗?这个哈希是使用文件名、函数名和其参数计算出来的吗?谢谢。 - Marco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接