darwin - fix powerpc-darwin stack alignments
authorIain Sandoe <iain@sandoe.co.uk>
Sun, 28 Oct 2018 09:25:43 +0000 (09:25 +0000)
committerIain Sandoe <iains@gcc.gnu.org>
Sun, 28 Oct 2018 09:25:43 +0000 (09:25 +0000)
2018-10-28  Iain Sandoe  <iain@sandoe.co.uk>

PR target/85669
* config/rs6000/darwin.h (STACK_BOUNDARY): New.
(RS6000_STARTING_FRAME_OFFSET): Adjust to preserve 16byte alignment.
(STACK_DYNAMIC_OFFSET): Likewise.

From-SVN: r265568

gcc/ChangeLog
gcc/config/rs6000/darwin.h

index cc940c83febbdde47fe4f29459daa9ef0ff1faca..349716f74cb8d1cb1e9c5bc1c2c97266ecf5d108 100644 (file)
@@ -1,3 +1,10 @@
+2018-10-28  Iain Sandoe  <iain@sandoe.co.uk>
+
+       PR target/85669
+       * config/rs6000/darwin.h (STACK_BOUNDARY): New.
+       (RS6000_STARTING_FRAME_OFFSET): Adjust to preserve 16byte alignment.
+       (STACK_DYNAMIC_OFFSET): Likewise.
+
 2018-10-27  Sandra Loosemore  <sandra@codesourcery.com>
 
        PR target/80024
index 6b0f18e1189cdc042bcfcf19ff1d15a2c13a13c3..2b5628cac5686f9d943ec193f7adecc0a7303323 100644 (file)
@@ -159,17 +159,45 @@ extern int darwin_emit_branch_islands;
 #undef  RS6000_PIC_OFFSET_TABLE_REGNUM
 #define RS6000_PIC_OFFSET_TABLE_REGNUM 31
 
-/* Pad the outgoing args area to 16 bytes instead of the usual 8.  */
+/* Darwin's stack must remain 16-byte aligned for both 32 and 64 bit
+   ABIs.  */
+
+#undef  STACK_BOUNDARY
+#define STACK_BOUNDARY 128
+
+/* Offset within stack frame to start allocating local variables at.
+   For supported Darwin versions, FRAME_GROWS_DOWNWARD is true, therefore
+   this value is the offset to the END of the first local allocated.
+
+   On the RS/6000, the frame pointer is the same as the stack pointer,
+   except for dynamic allocations.  So we start after the fixed area and
+   outgoing parameter area.
+
+   If the function uses dynamic stack space (CALLS_ALLOCA is set), that
+   space needs to be aligned to STACK_BOUNDARY, i.e. the sum of the
+   sizes of the fixed area and the parameter area must be a multiple of
+   STACK_BOUNDARY.  */
 
 #undef RS6000_STARTING_FRAME_OFFSET
 #define RS6000_STARTING_FRAME_OFFSET                                   \
-  (RS6000_ALIGN (crtl->outgoing_args_size, 16)                         \
-   + RS6000_SAVE_AREA)
+  (cfun->calls_alloca                                                  \
+   ? RS6000_ALIGN (crtl->outgoing_args_size + RS6000_SAVE_AREA, 16)    \
+   : (RS6000_ALIGN (crtl->outgoing_args_size, 16) + RS6000_SAVE_AREA))
+
+/* Offset from the stack pointer register to an item dynamically
+   allocated on the stack, e.g., by `alloca'.
+
+   The default value for this macro is `STACK_POINTER_OFFSET' plus the
+   length of the outgoing arguments.  The default is correct for most
+   machines.  See `function.c' for details.
+
+   This value must be a multiple of STACK_BOUNDARY (hard coded in
+   `emit-rtl.c').  */
 
 #undef STACK_DYNAMIC_OFFSET
 #define STACK_DYNAMIC_OFFSET(FUNDECL)                                  \
-  (RS6000_ALIGN (crtl->outgoing_args_size.to_constant (), 16)          \
-   + (STACK_POINTER_OFFSET))
+  RS6000_ALIGN (crtl->outgoing_args_size.to_constant()                 \
+               + STACK_POINTER_OFFSET, 16)
 
 /* Darwin uses a function call if everything needs to be saved/restored.  */