On Wed, Aug 15, 2018 at 8:41 AM, Iain Sandoe <i...@sandoe.co.uk> wrote:
> Hi HJ,
>
> I am trying to track down a misalignment of the stack on Darwin (pr78444).
>
> In r163971 you applied this:
>
> --- gcc/config/i386/darwin.h    (revision 163970)
> +++ gcc/config/i386/darwin.h    (revision 163971)
> @@ -79,7 +79,9 @@
>     Failure to ensure this will lead to a crash in the system libraries
>     or dynamic loader.  */
>  #undef STACK_BOUNDARY
> -#define STACK_BOUNDARY 128
> +#define STACK_BOUNDARY \
> + ((profile_flag || (TARGET_64BIT && ix86_abi == MS_ABI)) \
> +  ? 128 : BITS_PER_WORD)
>
>  #undef MAIN_STACK_BOUNDARY
>  #define MAIN_STACK_BOUNDARY 128
> @@ -91,7 +93,7 @@
>     it's below the minimum.  */
>  #undef PREFERRED_STACK_BOUNDARY
>  #define PREFERRED_STACK_BOUNDARY                       \
> -  MAX (STACK_BOUNDARY, ix86_preferred_stack_boundary)
> +  MAX (128, ix86_preferred_stack_boundary
>
> ===
>
> I realise it’s a long time ago …
> .. but, have you any pointer to the reasoning here or what problem was being 
> solved?
> (perhaps mail list discussion?)

Please see PR target/36502, PR target/42313 and PR target/44651.

> ===
>
> Darwin’s 32b ABI mandates 128b alignment at functions calls:
>
>  "The function calling conventions used in the IA-32 environment are the same 
> as those used in the System V IA-32 ABI, with the following exceptions:
> ■ Different rules for returning structures
> ■ The stack is 16-byte aligned at the point of function calls
> “
>
> Darwin’s 64b ABI refers directly to the SysV document, which also mandates 
> [section 3.2.2] 128b (or 256b when __m256 is passed).
>
> ===
>
> The following patch resolves pr78444 - but it’s not clear if it’s a correct 
> fix - or we should be looking for an alternate solution to whatever r193671 
> was intending to achieve.
>
> thanks,
> Iain
>
> [PATCH] Fix for PR78444.
>
> maybe.
> ---
>  gcc/config/i386/i386.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
>
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index 163682bdff..405bfd082b 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -11530,6 +11530,15 @@ ix86_compute_frame_layout (void)
>        crtl->preferred_stack_boundary = 128;
>        crtl->stack_alignment_needed = 128;
>      }
> +  else if (TARGET_MACHO && crtl->preferred_stack_boundary < 128
> +          && !crtl->is_leaf)
> +    {
> +      /* Darwin's ABI specifies 128b alignment for both 32 and
> +        64 bit variants at call sites.  So we apply this if the
> +        current function is not a leaf.  */
> +      crtl->preferred_stack_boundary = 128;
> +      crtl->stack_alignment_needed = 128;
> +    }
>

Can you change ix86_update_stack_boundary instead?


-- 
H.J.

Reply via email to