GCC 中 Clang AST 的模拟

Analog of Clang AST in GCC

GCC 中是否有类似 Clang AST 的东西?

有时像编译器看到的那样查看代码很有用。 Clang AST 选项 -ast-view-ast-tree-ast-print 在这里非常有用。

如果 GCC 有这样的选项或一些工具来生成适用于 GCC 的 AST 树,我很感兴趣。

您可以通过 -fdump-tree-all 转储树传递(的结果),并通过 -fdump-ipa-all 传递过程间分析。对于编译单元 module.c,这将分别写入转储文件 module.c.<num>t.<name>module.c.<num>i.<name><num>表示这些pass的顺序运行,<name>表示pass名称。

还有 100 多个选项控制仅针对特定通道的转储,请参阅 GCC Developer Options

这些转储的语法主要是 C-ish。在树通过之后是依赖于机器的 RTL 通过。您可以使用 -fdump-rtl-all-da 转储它们。这些转储是 LISP-ish 并命名为 module.c.<num>r.<name>。 您还可以使用 -fdump-final-insns.

转储最终 RTL

为了查看哪个 RTL 与哪些汇编指令相关联,您可以 -save-temps -dP 然后检查汇编文件 module.s.

在您使用 LTO (-flto) 的情况下,程序集文件将仅包含 lto1 乱码。可以通过-ffat-lto-objects的方式添加汇编代码。但是请注意,对于 LTO,这不是 lto 运行 生成的最终代码。要查看该代码,请使用 -save-temps -flto -o program.exe 并且来自 LTO 运行 的转储被命名为 program.exe.ltrans<id>.<num>[tir].<name>.