]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
RISC-V: Fix 32-bit stack pointer alignment problem.
authorJim Wilson <jimw@sifive.com>
Tue, 17 Apr 2018 21:41:07 +0000 (21:41 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Tue, 17 Apr 2018 21:41:07 +0000 (14:41 -0700)
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

gcc/ChangeLog
gcc/config/riscv/riscv.c

index 1fba2d92215d4856be42d96f2b0cf3016adf0e6c..bf4f7cc92217d8687e45e47d1b7054f0b82e59e9 100644 (file)
@@ -1,3 +1,10 @@
+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>
 
        PR rtl-optimization/85431
index 9e1005e8f105edec1009026bbc08a509513aa8e6..2870177fa97e4561b3d60d53dffe2b17e1182510 100644 (file)
@@ -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. */