如何利用Clang的AST?

我正在考虑将Clang的AST用于我的C代码并对AST进行一些分析。 关于从哪里开始,如何获得Clang的AST,教程或这方面的任何内容的一些指示将是非常有帮助的!

我一直试图找到一些,我得到了这个链接 ,这是2年前创建的。 但由于某种原因,它不适合我。 教程中的示例代码给了我太多错误。 所以我不确定,如果我正确构建代码或者教程有些问题。 但我也很乐意从其他一些页面开始。

从sharth链接的教程开始。 然后通过Clang的Doxygen。 从SemaConsumer开始。

阅读了很多源代码。 Clang是一个移动目标。 如果您正在编写基于clang的工具,那么您需要认识到clang每天都在添加和修复function,因此您应该准备好阅读大量代码!

您可能想要libclang库中提供的稳定C API,而不是其他人提到的不稳定的C ++内部API。

目前最好的文档是LLVM开发人员会议网站上提供的“libclang:思考超越编译器”的video/幻灯片。

但请注意,API的稳定性是以全面性为代价的。 您将无法使用此API执行所有操作 ,但它更易于使用。

我发现这个ASTUnit :: LoadFromCompilerInvocation()fn是构建AST的最简单方法。

这个链接可能会给你一些想法http://comments.gmane.org/gmane.comp.compilers.clang.devel/12471

要获得AST以及了解前端的各个阶段,“LLVM核心库”一书中有一个前端章节。 基本上它有这样的流程(在llvm-4.0.1的情况下,对于更高版本应该类似):

  • cc1_main.cpp:cc1_main (ExecuteCompilerInvocation)
  • CompilerInstance.cpp:CompilerInstance::ExecuteAction
  • ParseAST.cpp:clang::ParseAST (Consumer>HandleTranslationUnit(S.getASTContext())
  • CodeGenAction.cpp:HandleTranslationUnit

最后一个函数处理整个翻译单元(此时已经处理了顶层decls),并调用EmitBackendOutput来执行后端操作。 所以这个函数是一个很好的位置,你可以用完整的AST做一些事情,然后发出后端输出。

关于如何操纵AST,clang有一些基本的教程: http : //clang.llvm.org/docs/RAVFrontendAction.html 。

另请ASTDumper.cpp 。 这是访问AST的最好例子。

另一个很好的教程: https : //jonasdevlieghere.com/understanding-the-clang-ast/教你如何通过三种不同的方法在AST中找到特定的呼叫expr。