我正在研究利用Clang的AST来编写我的C代码,并对AST做一些分析。一些关于从哪里开始,如何获得Clang的AST,教程或任何这方面的指示将有很大的帮助!如何使用Clang的AST?
我一直在试图找到一些,我得到了这两年前创建的这个link。但由于某种原因,它不适合我。示例代码在教程中给了我太多的错误。所以我不确定,如果我正确地构建代码或者本教程有一些错误。但我很乐意从其他页面开始。
我正在研究利用Clang的AST来编写我的C代码,并对AST做一些分析。一些关于从哪里开始,如何获得Clang的AST,教程或任何这方面的指示将有很大的帮助!如何使用Clang的AST?
我一直在试图找到一些,我得到了这两年前创建的这个link。但由于某种原因,它不适合我。示例代码在教程中给了我太多的错误。所以我不确定,如果我正确地构建代码或者本教程有一些错误。但我很乐意从其他页面开始。
开始与沙尔斯链接的教程。然后通过Clang的Doxygen。从SemaConsumer开始。
阅读了很多源代码。铿锵是一个移动的目标。如果你正在编写基于铿锵的工具,那么你需要认识到,铿锵是每天添加和修复功能,所以你应该准备阅读很多代码!
我觉得这个ASTUnit :: LoadFromCompilerInvocation()fn是构建AST的最简单的方法。
此链接可能会给你一些想法http://comments.gmane.org/gmane.comp.compilers.clang.devel/12471
你可能想在libclang库提供的稳定的C API,而不是不稳定的C++,其他人已经提到的内部API。
当前最好的文档是谈话视频/幻灯片,“libclang:思考超越编译器”,可在LLVM Developers Meeting website上找到。
但是请注意,API的稳定性是以全面性为代价的。您将无法使用此API执行所有内容,但使用起来要容易得多。
为了获得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。
我经历了代码。我发现很难理解,因为没有引用结构或类名,意味着什么以及为什么使用它。虽然这个链接看起来像一个好的开端,但是对于每个东西的意义的一些参考将有助于理解基础知识。 – bsoundra 2011-02-27 01:31:04