本节将以一个最简单的函数来分析gcc 的执行过程,这个函数没有函数体,也没有传入的参数。
例子如下:
void main( )
{
}
执行之后产生的汇编应该是这个样子
.file "test.c"
gcc_compiled.:
.text .align 2
.globl _main
_main:
pushl %ebp
movl %esp,%ebp
L1:
leave
ret
这是用1.40 gcc 的cc1 程序直接产生,后续版本可能会增加其他一些内容,但可以看出这个
版本产生的代码是最简洁的,它只产生了一个栈帧。
首先作词法分析:
我们这里没有按照gcc源代码的做法,用手工做词法分析,而是采用词法分析工具flex,来完成词法分析,这样做的结果,代码看起来很简洁直观。涉及到的词法分析规则如下:
void {
yylval.ttype = ridpointers[RID_VOID];
return TYPESPEC;
}
[ \t] ;
[a-zA-Z0-9]+ {
yylval.ttype = get_identifier (yytext);
lastiddecl = lookup_name (yylval.ttype);
if (lastiddecl != 0 && TREE_CODE (lastiddecl) == TYPE_DECL)
{
return TYPENAME;
}
return IDENTIFIER;
}
\n {
lineno++;
}
.

本文通过分析一个简单的无参数无函数体的C语言程序,详细介绍了GCC编译器的词法分析过程。从源代码到汇编代码的转换,展示了GCC如何处理词法单元,生成对应的tree_node节点。
最低0.47元/天 解锁文章
1062

被折叠的 条评论
为什么被折叠?



