gcc源代码分析之gen_call_value()函数

gcc源代码分析之gen_call_value()函数_第1张图片


(call_insn 7 6 9 (set (reg:SI 0)
       (call (mem:QI (symbol_ref/v:SI ("printf")))
           (const_int 4))) -1 (nil)
   (nil))

(reg:SI 0)   就是 operand0

(mem:QI (symbol_ref/v:SI ("printf")))   就是 operand1

(const_int 4)   就是 operand2


rtx
gen_call_value (operand0, operand1, operand2)
     rtx operand0;
     rtx operand1;
     rtx operand2;
{
  return gen_rtx (SET, VOIDmode, operand0, gen_rtx (CALL, VOIDmode, operand1, operand2));
}


gcc源代码分析之gen_call_value()函数_第2张图片

gen_call_value

    emit_call_1

        expand_call

            expand_expr


static void
emit_call_1 (funexp, funtype, stack_size, next_arg_reg, valreg, old_inhibit_defer_pop, use_insns)
     rtx funexp;
     tree funtype;
     int stack_size;
     rtx next_arg_reg;
     rtx valreg;
     int old_inhibit_defer_pop;
     rtx use_insns;
{

 rtx stack_size_rtx = gen_rtx (CONST_INT, VOIDmode, stack_size);
  rtx call_insn;

  if (valreg)
    emit_call_insn (gen_call_value (valreg,
                    gen_rtx (MEM, FUNCTION_MODE, funexp),
                    stack_size_rtx, next_arg_reg));

emit_call_1()函数 通过 调用 emit_call_insn()函数来调用 gen_call_value()函数!



在gen_call_value()函数和gen_rtx()函数下断点的输出,保留以后看。

emit_call_1()函数下断点  emit_call_insn()函数下断点

说明了上面的: emit_call_1()函数 通过 调用 emit_call_insn()函数来调用 gen_call_value()函数!


expand_call
gen_rtx
gen_rtx GET_RTX_LENGTH (code) 1
gen_rtx fmt s
gen_rtx
gen_rtx GET_RTX_LENGTH (code) 1
gen_rtx fmt e
gen_rtx
gen_rtx GET_RTX_LENGTH (code) 1
gen_rtx fmt e
gen_rtx
gen_rtx GET_RTX_LENGTH (code) 1
gen_rtx fmt e
gen_rtx
gen_rtx GET_RTX_LENGTH (code) 2
gen_rtx fmt e
gen_rtx fmt e
gen_rtx
gen_rtx GET_RTX_LENGTH (code) 2
gen_rtx fmt u
gen_rtx fmt e
gen_rtx
gen_rtx GET_RTX_LENGTH (code) 2
gen_rtx fmt u
gen_rtx fmt e
gen_rtx
gen_rtx GET_RTX_LENGTH (code) 1
gen_rtx fmt E
gen_rtx
gen_rtx GET_RTX_LENGTH (code) 1
gen_rtx fmt i
gen_rtx
gen_rtx arg 4

emit_call_1 funexp symbol_ref

emit_call_1 reg
gen_rtx
gen_rtx GET_RTX_LENGTH (code) 1
gen_rtx fmt e

gen_call_value
gen_call_value operand0 reg
gen_call_value operand1 mem
gen_call_value operand2 const_int
gen_rtx
gen_rtx GET_RTX_LENGTH (code) 2
gen_rtx fmt e
gen_rtx fmt e
gen_rtx
gen_rtx GET_RTX_LENGTH (code) 2
gen_rtx fmt e
gen_rtx fmt e
emit_call_insn
gen_rtx
gen_rtx GET_RTX_LENGTH (code) 2
gen_rtx fmt e
gen_rtx fmt e
gen_rtx
gen_rtx GET_RTX_LENGTH (code) 1
gen_rtx fmt e
gen_jump
gen_jump operand0 code_label
gen_rtx
gen_rtx GET_RTX_LENGTH (code) 3
gen_rtx fmt u
gen_rtx fmt 0
gen_rtx fmt 0



#define XEXP(RTX, N)    ((RTX)->fld[N].rtx)

你可能感兴趣的:(gcc,源代码,分析)