From: Jim Wilson Date: Tue, 17 Apr 2018 21:41:07 +0000 (+0000) Subject: RISC-V: Fix 32-bit stack pointer alignment problem. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=035fc2add18c0dd06c22bd158a47bf35b8c1c528;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1fba2d92215..bf4f7cc9221 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-04-17 Jim Wilson + + 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 PR rtl-optimization/85431 diff --git a/gcc/config/riscv/riscv.c b/gcc/config/riscv/riscv.c index 9e1005e8f10..2870177fa97 100644 --- a/gcc/config/riscv/riscv.c +++ b/gcc/config/riscv/riscv.c @@ -3307,7 +3307,7 @@ riscv_compute_frame_info (void) } /* 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. */ offset += RISCV_STACK_ALIGN (get_frame_size ()); /* The virtual frame pointer points above the local variables. */ @@ -3333,9 +3333,11 @@ riscv_compute_frame_info (void) frame->hard_frame_pointer_offset = offset; /* Above the hard frame pointer is the callee-allocated varags save area. */ offset += RISCV_STACK_ALIGN (cfun->machine->varargs_size); - frame->arg_pointer_offset = offset; /* 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; /* Next points the incoming stack pointer and any incoming arguments. */