Clang 整个程序的AST

Clang 整个程序的AST,clang,llvm,abstract-syntax-tree,llvm-clang,llvm-ir,Clang,Llvm,Abstract Syntax Tree,Llvm Clang,Llvm Ir,我想对c程序的AST进行转换,但我需要访问为程序创建的所有AST,以便进行正确的更改。LLVM一次处理一个翻译单元,因此我不能同时访问所有翻译单元的AST。您对我如何访问为一个程序创建的所有AST、对AST进行分析以及对AST进行修改有何建议 作为总结: 我需要同时访问程序的AST 对ASTs进行分析 根据我的分析修改AST,并从修改后的AST创建llvm IR 您可以尝试在所有生成的.ll文件上使用llvm链接(从clang with-S-emit llvm)来创建一个大型llvm源 此时您可

我想对c程序的AST进行转换,但我需要访问为程序创建的所有AST,以便进行正确的更改。LLVM一次处理一个翻译单元,因此我不能同时访问所有翻译单元的AST。您对我如何访问为一个程序创建的所有AST、对AST进行分析以及对AST进行修改有何建议

作为总结:

  • 我需要同时访问程序的AST
  • 对ASTs进行分析
  • 根据我的分析修改AST,并从修改后的AST创建llvm IR

  • 您可以尝试在所有生成的.ll文件上使用llvm链接(从clang with-S-emit llvm)来创建一个大型llvm源


    此时您可以访问所有内容。

    您可以告诉clang编译一个文件并提供AST。您只需对所需的每个文件执行此操作。你不能把它当作一个插件,但你可以编写自己的前端操作,做任何你想做的事情。就我个人而言,我只是做了一个unity构建并在其上运行了一个插件——它并不完全相同,但它足以满足我的需要。@xaxxon:如果您将每个编译单元作为一个单独的工件进行处理,则无法实现将代码从一个编译单元移动到另一个编译单元的任何转换。(您甚至不能检查一个编译单元中的代码,并使该检查的结果影响另一个编译单元)。因此,你不能进行任何“全局”分析/转换[除非你在一个包中插入一个工作来记住东西]。@IraBaxter我不完全理解你的意思,但是有一个API说“编译这个文件并给我AST”。所以如果你想要的话,你可以把所有的AST同时放在内存中——或者至少我是这么理解的。@xaxxon:同意。您说过“将每个编译单元作为单独的工件进行处理”。如果您可以这样做并将AST保留在单个流程实例中,那么您就可以避免我的反对。你是否能做到这一点还不清楚。(在我下面的回答中,我假设你能做到,我只是不知道机制。)@IraBaxter我甚至不知道什么是“人工制品”,更不用说说说了。页面上只提到了两个“工件”,从我所看到的(除了这条评论),无论如何,我很确定一个ClangLibTooling工具可以做他想做的事情。