2011-02-27 89 views
22

我正在研究利用Clang的AST来编写我的C代码,并对AST做一些分析。一些关于从哪里开始,如何获得Clang的AST,教程或任何这方面的指示将有很大的帮助!如何使用Clang的AST?

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

回答

14

开始与沙尔斯链接的教程。然后通过Clang的Doxygen。从SemaConsumer开始。

阅读了很多源代码。铿锵是一个移动的目标。如果你正在编写基于铿锵的工具,那么你需要认识到,铿锵是每天添加和修复功能,所以你应该准备阅读很多代码!

9

你可能想在libclang库提供的稳定的C API,而不是不稳定的C++,其他人已经提到的内部API。

当前最好的文档是谈话视频/幻灯片,“libclang:思考超越编译器”,可在LLVM Developers Meeting website上找到。

但是请注意,API的稳定性是以全面性为代价的。您将无法使用此API执行所有内容,但使用起来要容易得多。

0

为了获得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

的最后一个函数处理整个翻译单元(此时已经处理了最高级别的翻译),并且调用EmitBackendOutput来做后端材料。所以这个函数是一个很好的地方,你可以用完整的AST做一些事情,然后发布后端输出。

在如何操纵AST方面,铿锵有一些基本的教程:http://clang.llvm.org/docs/RAVFrontendAction.html

也看看ASTDumper.cpp。这是访问AST的最好例子。

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