Commit 035fc2ad by Jim Wilson Committed by Jim Wilson

RISC-V: Fix 32-bit stack pointer alignment problem.

	gcc/
	PR 84856
	* config/riscv/riscv.c (riscv_compute_frame_info): Add calls to
	RISCV_STACK_ALIGN when using outgoing_args_size and pretend_args_size.
	Set arg_pointer_offset after using pretend_args_size.

From-SVN: r259449
parent cbe679a4
2018-04-17 Jim Wilson <jimw@sifive.com>
PR 84856
* config/riscv/riscv.c (riscv_compute_frame_info): Add calls to
RISCV_STACK_ALIGN when using outgoing_args_size and pretend_args_size.
Set arg_pointer_offset after using pretend_args_size.
2018-04-17 Jakub Jelinek <jakub@redhat.com> 2018-04-17 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/85431 PR rtl-optimization/85431
......
...@@ -3307,7 +3307,7 @@ riscv_compute_frame_info (void) ...@@ -3307,7 +3307,7 @@ riscv_compute_frame_info (void)
} }
/* At the bottom of the frame are any outgoing stack arguments. */ /* At the bottom of the frame are any outgoing stack arguments. */
offset = crtl->outgoing_args_size; offset = RISCV_STACK_ALIGN (crtl->outgoing_args_size);
/* Next are local stack variables. */ /* Next are local stack variables. */
offset += RISCV_STACK_ALIGN (get_frame_size ()); offset += RISCV_STACK_ALIGN (get_frame_size ());
/* The virtual frame pointer points above the local variables. */ /* The virtual frame pointer points above the local variables. */
...@@ -3333,9 +3333,11 @@ riscv_compute_frame_info (void) ...@@ -3333,9 +3333,11 @@ riscv_compute_frame_info (void)
frame->hard_frame_pointer_offset = offset; frame->hard_frame_pointer_offset = offset;
/* Above the hard frame pointer is the callee-allocated varags save area. */ /* Above the hard frame pointer is the callee-allocated varags save area. */
offset += RISCV_STACK_ALIGN (cfun->machine->varargs_size); offset += RISCV_STACK_ALIGN (cfun->machine->varargs_size);
frame->arg_pointer_offset = offset;
/* Next is the callee-allocated area for pretend stack arguments. */ /* Next is the callee-allocated area for pretend stack arguments. */
offset += crtl->args.pretend_args_size; offset += RISCV_STACK_ALIGN (crtl->args.pretend_args_size);
/* Arg pointer must be below pretend args, but must be above alignment
padding. */
frame->arg_pointer_offset = offset - crtl->args.pretend_args_size;
frame->total_size = offset; frame->total_size = offset;
/* Next points the incoming stack pointer and any incoming arguments. */ /* Next points the incoming stack pointer and any incoming arguments. */
......
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