【问题标题】:How to make use of Clang's AST?如何使用 Clang 的 AST?
【发布时间】:2011-07-05 01:55:52
【问题描述】:

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

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

【问题讨论】:

    标签: c clang abstract-syntax-tree


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        目前最好的文档是讲座的视频/幻灯片,“libclang: Thinking Beyond the Compiler”可在LLVM Developers Meeting website 上找到。

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

        【讨论】:

          【解决方案4】:

          要获得 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。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-09-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-03
            相关资源
            最近更新 更多