看gcc-1.40有段时间了,14年左右看了一段时间,15年左右看了一段时间。
现在可以说基本上明白了gcc的大部分代码。
如果说能快速的明白其中的原理,总结我看代码的方法捷径我列举以下几条。
第一,gcc版本低,这是成功的前提,也是一条捷径。
第二,分析最基本的hello.c文件,就一条函数调用,一个函数声明,
一个函数定义,但是已经足够。
int printf (const char * , ... ) ;
int main()
{
printf("Hello, world!\n");
return 0;
}
第三,发现了debug_rtx ()函数和debug_tree ()函数。这两个函数可以说是看懂gcc的唯一的两把钥匙!
第四,思路正确,expand_call()如何产生各种rtx的?这个思路借助debug_rtx ()函数。
expand_call ()函数的参数也就是用到的tree如何得到的?
expand_expr_stmt()函数的参数是如何得到的?
形象的可以说tree的形成可以看成套娃模型,
最基本的小的套娃最先形成,然后各种操作tree的函数一层层的套上去,
我们debug_tree ()函数的print_node ()函数的作用则是把套娃分开!
大体的思路就是:就是如何从源代码到tree的,上面的可以说如何从tree到rtx的!
关注的是和printf相关的tree如何形成的?和"Hello,world!\n"相关的tree如何形成的?
第五,对语法分析bison的原理很熟悉。
判断一个人是否懂gcc可以分3个层次:
初级的:hello.c到hello.i到hello.s到hello.o到a.out
中级的:gcc前端,从源代码到rtl中间语言,后端从rtl到汇编语言。
高级的:c文件源代码到c-parse.tab.c到tree,tree到rtx,rtx到汇编语言。