如何查看编译期间解析树,中间代码,优化代码和汇编代码?(How can I see parse tr

2019-07-20 04:38发布

我学习编译过程中,程序编译如下下面的步骤

  1. 词法分析
  2. 语法分析
  3. 语义分析
  4. 中间代码生成
  5. 代码优化
  6. 生成目标代码。

我怎么能看到每一步例如,我想看看语法分析后分析树的输出。

我的Linux机器上编译的程序与GCC编译器。

我们可以通过使用GCC编译器-Wa选项,查看该程序的汇编代码,同样是有选择看令牌,解析树和Inetmediate代码。

Answer 1:

虽然你可以使用-fdump-tree-all-fdump-rtl-all gcc的选择,我不认为他们的输出是一个编译器的学生非常有用的。 FWIW,我开始对海湾合作委员会的工作为我的博士研究的一部分,在已经完成了两个本科课程,我发现gcc和调试文件是不透明的,难以跟踪。

此外,海湾合作委员会并没有真正遵循编译器的教科书设计。 没有人做,真的,因为它不能很好地工作的方式。 我敢肯定的gcc不会产生一个解析树,或抽象语法树。 它建立在其上执行它的高级优化的IR(称为GIMPLE)。

我会建议尝试LLVM代替,这对被精心设计和易于遵循的声誉。 另一种方法是从一本教科书,尤其是阿佩尔本书下载代码,假设其可用。

另一项建议,如果我可以推荐我自己了一下,就是用PHC 。 原发性肝癌,可以看到解析树为图像,并查看AST和源代码在编译器中的每一个传球后。 这里是AST和解析树的部件比较 。 他们使用PHC产生平凡。 你可以看到编译国税局,地CFG,SSA形式和类型推断和别名分析的调试输出。 您还可以将优化并通过开启和关闭,看看他们有没有效果。

我认为这可能是对你有用。



Answer 2:

你可以看到预处理器输出-E-fdump-tree-*转储树内部represenation,如-fdump-tree-all 。 各种-d选项存在转储RTL中间表示,如-fdump-rtl-all (请参阅invidual手工传递,你得到的转储); 此外, -dD转储所有的宏定义。



Answer 3:

从图中的点clang编译器,你不能看到由编译器生成的每一个输出。 这是因为铛以不同的方式工作相比其他的编译器。

词法分析

令牌可以发射通过:

clang test.c -Xclang -dump-tokens
clang test.c -Xclang -dump-raw-tokens

中间代码生成

字节代码可以被发射通过:铛test.c的-S -emit-LLVM

语义分析

同时产生的AST被同时进行语义分析。 在AST可以发射通过:

clang test.c -Xclang -ast-dump
clang test.c -Xclang -ast-view (this generates a graph for the textual AST)

代码优化

你可以通过它应用到C代码打印优化管道查询代码优化:

clang test.c -S -mllvm -print-after-all

目标代码生成

所生成的代码(即,组件输出)可以被看作通过:

clang test.c -S

奖金

您还可以看到完整的流水线铛所调用的程序。 例如,对于发射目标文件中的管道可通过viewd:

clang -ccc-print-phases test.c -c

在终端上产生的输出是:

0: input, "test.c", c
1: preprocessor, {0}, cpp-output
2: compiler, {1}, ir
3: backend, {2}, assembler
4: assembler, {3}, object


文章来源: How can I see parse tree, intermediate code, optimization code and assembly code during COMPILATION?