【问题标题】:AST of whole program整个程序的 AST
【发布时间】:2016-10-04 22:23:33
【问题描述】:

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

总结一下:

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

【问题讨论】:

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

标签: clang llvm abstract-syntax-tree llvm-clang llvm-ir


【解决方案1】:

您可以尝试在所有生成的 .ll 文件上使用 llvm-link(来自带有 -S -emit-llvm 的 clang)来创建一个大型 llvm 源。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    相关资源
    最近更新 更多