gcc源代码分析,expand_call()函数第三部分
2015-01-06 08:13
489 查看
(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 ()有关
(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 ()有关
相关文章推荐
- gcc源代码分析,expand_call ()函数分析第五部分,store_one_arg ()函数
- gcc源代码分析,在expand_call ()函数 和expand_expr_stmt ()函数的开始处加入debug_tree ()函数
- gcc源代码分析之gen_call_value()函数
- gcc源代码分析,expand_call ()函数第四部分,emit_call_1 ()函数
- gcc源代码分析emit_call_insn()函数
- gcc源代码分析,expand_expr_stmt()函数
- gcc源代码分析,build_function_call ()函数分析
- gcc源代码分析,insn_extract()函数和recog_operand[]数组的关系
- 关于 bison源代码分析--gcc源代码分析之语法分析部分 的说明
- gcc源代码分析,finish_decl ()函数和push_parm_decl ()函数分析
- gcc源代码分析gen_push_operand ()函数和emit_move_insn ()函数
- gcc源代码分析,get_parm_info ()函数分析
- gcc源代码分析,debug_tree()函数的利用
- gcc源代码分析,build_pointer_type ()函数分析
- gcc源代码分析,expand_call()函数和printf("Hello, world!\n");的关系
- gcc源代码分析,print_node()函数分析第一部分
- gcc源代码分析,end_final()函数把insn转化成汇编代码
- gcc源代码分析,finish_decl ()函数和rest_of_decl_compilation ()函数分析
- Visual Studio 2005的源代码分析利器:Call Browser/Call Graph
- TGEA渲染部分源代码分析--说明