对于expand_call函数来说最主要的参数就是exp这个tree树,
打印出来之后我们终于看到了printf和Hello,world!
expand_call
<call_expr 840f0
下面是在 函数开始处加入debug_tree ()函数的结果
expand_expr_stmt
<call_expr 840f0
type <integer_type 824d0 int permanent SI
size <integer_cst 8254c literal permanent 4
align 32 size_unit 8 sep_unit 32 symtab 0
sep <integer_cst 8251c literal permanent -2147483648 precision 32 min <integer_cst 8251c -2147483648>
max <integer_cst 82534 literal permanent 2147483647
pointer_to_this <pointer_type 88b4c> chain <integer_type 825bc* char>
volatile
arg 0 <addr_expr 84090
type <pointer_type 98f48 type <function_type 956e8>
permanent unsigned SI size <integer_cst 8254c 4>
align 32 size_unit 8 sep_unit 32 symtab 0
arg 0 <function_decl 95740 printf type <function_type 956e8>
external public permanent used QI file /usr/include/stdio.h line 214
align 1 size_unit 1 offset 0 chain <function_decl 954d8 ungetc>
arg 1 <tree_list 83270
value <nop_expr 840d8 type <pointer_type 9117c>
literal
arg 0 <nop_expr 840c0 type <pointer_type 88a44>
literal
arg 0 <addr_expr 840a8 type <pointer_type 94f58>
literal
arg 0 <string_cst 84014 type <array_type 94ef4>
static literal "Hello, world!
"(nil)
在c-parse.tab.c文件里面的stmt的定义出有对expand_expr_stmt()的调用,调用关系终于明朗了!
stmt:
compstmt {}
| expr ';'
{ emit_line_note (input_filename, lineno);
/* Do default conversion if safe and possibly important,
in case within ({...}). */
if ((TREE_CODE (TREE_TYPE ($1)) == ARRAY_TYPE
&& lvalue_p ($1))
|| TREE_CODE (TREE_TYPE ($1)) == FUNCTION_TYPE)
$1 = default_conversion ($1);
expand_expr_stmt ($1);
clear_momentary (); }