gcc源代码分析,expand_call()函数第三部分

(insn_list 6 (nil))

(insn_list 2 (insn_list 6 (nil)))

(sequence[ ] )

(reg:SI 0)

(const_int 4)

这次是解释这5条rtx的产生过程

相关的代码片段:

/* Mark all register-parms as living through the call.  */

start_sequence ();

for (i = 0; i < num_actuals; i++)

if (args[i].reg != 0)

{

if (args[i].partial > 0)

use_regs (REGNO (args[i].reg), args[i].partial);

else if (GET_MODE (args[i].reg) == BLKmode)

use_regs (REGNO (args[i].reg),

((int_size_in_bytes (TREE_TYPE (args[i].tree_value))

+ UNITS_PER_WORD - 1)

/ UNITS_PER_WORD));

else

emit_insn (gen_rtx (USE, VOIDmode, args[i].reg));

}

if (structure_value_addr && ! structure_value_addr_parm

&& GET_CODE (struct_value_rtx) == REG)

emit_insn (gen_rtx (USE, VOIDmode, struct_value_rtx));

use_insns = gen_sequence ();

end_sequence ();

/* Figure out the register where the value, if any, will come back.  */

valreg = 0;

if (TYPE_MODE (TREE_TYPE (exp)) != VOIDmode

&& ! structure_value_addr)

{

if (pcc_struct_value)

valreg = hard_libcall_value (Pmode);

else

valreg = hard_function_value (TREE_TYPE (exp), fndecl);

}

/* Generate the actual call instruction.  */

/* This also has the effect of turning off any pop-inhibition

done in expand_call.  */

if (args_size.constant < 0)

args_size.constant = 0;

emit_call_1 (funexp, funtype, args_size.constant,

FUNCTION_ARG (args_so_far, VOIDmode, void_type_node, 1),

valreg, old_inhibit_defer_pop, use_insns);

下面是加了fprintf()的调试结果

before start_sequence

(insn_list 6 (nil))

(insn_list 2 (insn_list 6 (nil)))

after start_sequence

after for if

before gen_sequence

(sequence[ ] )

after end_sequence

before hard

(reg:SI 0)

hard_funtion_value

(const_int 4)

emit_call_1 funexp symbol_ref

逐一说明:

(insn_list 6 (nil))

(insn_list 2 (insn_list 6 (nil)))

和  start_sequence ();有关。

(sequence[ ] )和

use_insns = gen_sequence ();

有关。

(reg:SI 0)和    valreg = hard_function_value (TREE_TYPE (exp), fndecl);  有关。

(const_int 4) 和函数  emit_call_1 ()有关

时间: 2024-12-03 06:50:21

gcc源代码分析,expand_call()函数第三部分的相关文章

gcc源代码分析gen_push_operand ()函数和emit_move_insn ()函数

如何生成下面红色的3个指令? 和gen_push_operand ()函数和emit_move_insn ()函数有关,他们都在expand_call()函数中被调用. 具体位置: rtx addr; #ifdef PUSH_ROUNDING if (args_addr == 0) addr = gen_push_operand (); else #endif if (GET_CODE (args_so_far) == CONST_INT) addr = memory_address (mode

gcc源代码分析,debug_tree()函数,又一利器啊

gcc源代码分析,debug_rtx()函数,利器啊 print-tree.c #include "config.h" #include "tree.h" #include <stdio.h> /* Names of tree components. Used for printing out the tree and error messages.  */ #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,

gcc源代码分析,expand_call()函数和printf(&quot;Hello, world!\n&quot;);的关系

expand_call()函数在expr.c文件中. 下面是expand_call()函数的主要调试结果,记录之. 主要是加入了debug_tree()函数和debug_rtx()函数. debug_tree()函数加入到了expand_expr()函数的开始. debug_rtx()函数加入到了gen_rtx()函数的结束处. emit_call_1()函数是何时调用的也能看出.emit_call_insn()是何时调用的也能看出. 主要的调试目的是expand_call()函数是如何生成rt

gcc源代码分析,expand_call ()函数分析第五部分,store_one_arg ()函数

本文主要是分析store_one_arg ()函数和expand_expr ()的关系来说明如何处理 函数的参数.printf("Hello, world!\n");中的"Hello, world!\n"这个字符串常量的! expand_call () 函数中的相关代码: if (args[i].reg == 0 && TYPE_SIZE (TREE_TYPE (args[i].tree_value)) != 0) { fprintf(stderr,

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

对于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

gcc源代码分析,expand_call ()函数第四部分,emit_call_1 ()函数

本文是为了解释下面这4个rtx是如何产生的,和emit_call_1 ()函数有关. (const_int 4) (mem:QI (symbol_ref/v:SI ("printf"))) (call (mem:QI (symbol_ref/v:SI ("printf"))) (const_int 4)) (set (reg:SI 0) (call (mem:QI (symbol_ref/v:SI ("printf"))) (const_int

gcc源代码分析的方法【总结】

看gcc-1.40有段时间了,14年左右看了一段时间,15年左右看了一段时间. 现在可以说基本上明白了gcc的大部分代码. 如果说能快速的明白其中的原理,总结我看代码的方法捷径我列举以下几条. 第一,gcc版本低,这是成功的前提,也是一条捷径. 第二,分析最基本的hello.c文件,就一条函数调用,但是已经足够. 第三,发现了debug_rtx ()函数和debug_tree ()函数.这两个函数可以说是看懂gcc的唯一的两把钥匙! 第四,思路正确,expand_call()如何产生各种rtx的

gcc源代码分析,finish_decl ()函数和push_parm_decl ()函数分析

parms: parm { push_parm_decl ($1); } /* This is what appears inside the parens in a function declarator. Is value is represented in the format that grokdeclarator expects.  */ parmlist_2:  /* empty */ { $$ = get_parm_info (0); } | parms { $$ = get_pa

gcc源代码分析,debug_tree()函数的利用

tree.def 中第0x3d个元素是 DEFTREECODE (CALL_EXPR, "call_expr", "e", 3) 下面是debug_tree()函数的结果,可以看出expand_expr()函数到gen_rtx()函数的调用过程! expand_expr code = 3d <call_expr 840f0 type <integer_type 824d0 int permanent SI size <integer_cst 825