您的位置:首页 > 编程语言

gcc源代码分析,在expand_call ()函数 和expand_expr_stmt ()函数的开始处加入debug_tree ()函数

2015-01-08 21:38 295 查看
对于expand_call函数来说最主要的参数就是exp这个tree树,

打印出来之后我们终于看到了printf和Hello,world!

expand_call

 <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)

下面是在 函数开始处加入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 (); }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gcc 源代码 分析