我正在考虑将Clang的AST用于我的C代码并对AST进行一些分析。关于从哪里开始,如何获得Clang的AST,教程或这方面的任何内容的一些指示将是非常有帮助的!
我一直试图找到一些,我得到了这个link,这是2年前创建的。但由于某种原因,它不适合我。教程中的示例代码给出了太多错误。所以我不确定,如果我正确构建代码或者教程有些问题。但我也很乐意从其他一些页面开始。
答案 0 :(得分:14)
从sharth链接的教程开始。然后通过Clang的Doxygen。从SemaConsumer开始。
阅读了很多源代码。 Clang是一个移动目标。如果您正在编写基于clang的工具,那么您需要认识到clang每天都在添加和修复功能,因此您应该准备好阅读大量代码!
答案 1 :(得分:9)
您可能想要libclang库中提供的稳定C API,而不是其他人提到的不稳定的C ++内部API。
目前最好的文档是谈话的视频/幻灯片,“{3}}上提供的”libclang:思考超越编译器“。
但请注意,API的稳定性是以全面性为代价的。您将无法使用此API执行所有,但它更容易使用。
答案 2 :(得分:1)
我发现这个ASTUnit :: LoadFromCompilerInvocation()fn是构建AST的最简单方法。
此链接可能会为您提供一些想法http://comments.gmane.org/gmane.comp.compilers.clang.devel/12471
答案 3 :(得分: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
最后一个函数处理整个翻译单元(此时已经处理了顶层decls),并调用EmitBackendOutput
来执行后端操作。所以这个函数是一个很好的位置,你可以用完整的AST做一些事情,然后发出后端输出。
关于如何操纵AST,clang有一些基本的教程:http://clang.llvm.org/docs/RAVFrontendAction.html。
另请参阅ASTDumper.cpp
。这是访问AST的最好例子。
另一个好的教程:https://jonasdevlieghere.com/understanding-the-clang-ast/教你如何通过三种不同的方法在AST中找到特定的呼叫expr。