Commit 35da54a6 by Chung-Ju Wu Committed by Chung-Ju Wu

[NDS32] Prepare necessary varargs information in compute_stack_frame().

	* config/nds32/nds32.c (nds32_compute_stack_frame): Prepare necessary
	varargs information.

From-SVN: r214862
parent d4a6a4d9
2014-09-03 Chung-Ju Wu <jasonwucj@gmail.com> 2014-09-03 Chung-Ju Wu <jasonwucj@gmail.com>
* config/nds32/nds32.c (nds32_compute_stack_frame): Prepare necessary
varargs information.
2014-09-03 Chung-Ju Wu <jasonwucj@gmail.com>
* config/nds32/nds32.c (nds32_setup_incoming_varargs): New * config/nds32/nds32.c (nds32_setup_incoming_varargs): New
implementation for TARGET_SETUP_INCOMING_VARARGS. implementation for TARGET_SETUP_INCOMING_VARARGS.
(nds32_strict_argument_naming): Refine comment. (nds32_strict_argument_naming): Refine comment.
...@@ -150,16 +150,30 @@ nds32_compute_stack_frame (void) ...@@ -150,16 +150,30 @@ nds32_compute_stack_frame (void)
cfun->machine->naked_p = 0; cfun->machine->naked_p = 0;
/* Get variadic arguments size to prepare pretend arguments and /* Get variadic arguments size to prepare pretend arguments and
push them into stack at prologue. we will push them into stack at prologue by ourself. */
Currently, we do not push variadic arguments by ourself. cfun->machine->va_args_size = crtl->args.pretend_args_size;
We have GCC handle all the works. if (cfun->machine->va_args_size != 0)
The caller will push all corresponding nameless arguments into stack, {
and the callee is able to retrieve them without problems. cfun->machine->va_args_first_regno
These variables are still preserved in case one day = NDS32_GPR_ARG_FIRST_REGNUM
we would like caller passing arguments with registers. */ + NDS32_MAX_GPR_REGS_FOR_ARGS
cfun->machine->va_args_size = 0; - (crtl->args.pretend_args_size / UNITS_PER_WORD);
cfun->machine->va_args_first_regno = SP_REGNUM; cfun->machine->va_args_last_regno
cfun->machine->va_args_last_regno = SP_REGNUM; = NDS32_GPR_ARG_FIRST_REGNUM + NDS32_MAX_GPR_REGS_FOR_ARGS - 1;
}
else
{
cfun->machine->va_args_first_regno = SP_REGNUM;
cfun->machine->va_args_last_regno = SP_REGNUM;
}
/* Important: We need to make sure that varargs area is 8-byte alignment. */
block_size = cfun->machine->va_args_size;
if (!NDS32_DOUBLE_WORD_ALIGN_P (block_size))
{
cfun->machine->va_args_area_padding_bytes
= NDS32_ROUND_UP_DOUBLE_WORD (block_size) - block_size;
}
/* Get local variables, incoming variables, and temporary variables size. /* Get local variables, incoming variables, and temporary variables size.
Note that we need to make sure it is 8-byte alignment because Note that we need to make sure it is 8-byte alignment because
...@@ -323,12 +337,10 @@ nds32_compute_stack_frame (void) ...@@ -323,12 +337,10 @@ nds32_compute_stack_frame (void)
} }
/* Important: We need to make sure that /* Important: We need to make sure that
(va_args_size + fp_size + gp_size (fp_size + gp_size + lp_size + callee_saved_regs_size)
+ lp_size + callee_saved_regs_size)
is 8-byte alignment. is 8-byte alignment.
If it is not, calculate the padding bytes. */ If it is not, calculate the padding bytes. */
block_size = cfun->machine->va_args_size block_size = cfun->machine->fp_size
+ cfun->machine->fp_size
+ cfun->machine->gp_size + cfun->machine->gp_size
+ cfun->machine->lp_size + cfun->machine->lp_size
+ cfun->machine->callee_saved_regs_size; + cfun->machine->callee_saved_regs_size;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment