Clang作为整个LLVM框架下关于C、C++和Object-C的前端。其大致环节分为词法分析、预处理、语法分析、语义分析、中间代码生成几个环节。我们在阅读和修改Clang的代码的过程中,需要经常的调试代码,观察改动所带来的各个阶段所发生的改变,这就需要时刻了解各个阶段的输出。
要了解各个阶段的输出,目前常用有两种方法:
1、最朴实最实用但是效率不一定是最高的办法,那就是打log。这是毋庸置疑的。
2、还有一种办法,相对简洁,但是不一定能体现调试过程中的每一次变动,但是大的方面还是可以展现的。这就是直接使用clang的命令行,辅助以参数,来直接dump出各个阶段的产物。这种方法适合阅读代码和理解代码,也适合一部分的代码调试。
下面就第二种方法做简要介绍:
1、词法分析
待分析代码:
min.c
int min(int a, int b) {
if (a < b)
return a;
return b;
}
命令行输入:clang -cc1 -dump-tokens min.c
输出:
int 'int' [StartOfLine] Loc=<../min.c:1:1>
identifier 'min' [LeadingSpace] Loc=<../min.c:1:5>
l_paren '(' Loc=<../min.c:1:8>
int 'int' Loc=<../min.c:1:9>
identifier 'a' [LeadingSpace] Loc=<../min.c:1:13>
comma ',' Loc=<../min.c:1:14>
int 'int' [LeadingSpace] Loc=<../min.c:1:16>
identifier 'b' [LeadingSpace] Loc=<../min.c:1:20>
r_paren ')' Loc=<../min.c:1:21>
l_brace '{' [LeadingSpace] Loc=<../min.c:1:23>
if 'if' [StartOfLine] [LeadingSpace] Loc=<../min.c:2:3>
l_paren '(' [LeadingSpace] Loc=<../min.c:2:6>
identifier 'a' Loc=<../min.c:2:7>
less '<' [LeadingSpace] Loc=<../min.c:2:9>
identifier 'b' [LeadingSpace] Loc=<../min.c:2:11>
r_paren ')' Loc=<../min.c:2:12>
return 'return' [StartOfLine] [LeadingSpace] Loc=<../mi