On Mon, Feb 22, 2016 at 03:07:09PM +0000, Alan Lawrence wrote:
> On 22/01/16 17:16, Alan Lawrence wrote:
> >
> >On 21/01/16 17:23, Alan Lawrence wrote:
> >>On 18/01/16 17:10, Eric Botcazou wrote:
> >>>
> >>>Could you post the list of files that differ?  How do they differ exactly?
> >>
> >>Hmmm. Well, I definitely had this failing to bootstrap once. I repeated 
> >>that, to
> >>try to identify exactly what the differences were....and it succeeded even 
> >>with
> >>my pre-AAPCS64-update host compiler. So, this is probably a false alarm; I'm
> >>bootstrapping again, after a rebase, to make sure...
> >>
> >>--Alan
> >
> >Ok, rebased onto a more recent build, and bootstrapping with Ada posed no
> >problems. Sorry for the noise.
> >
> >However, I had to drop the assert that TYPE_FIELDS was non-null because of 
> >some
> >C++ testcases.
> >
> >Is this version OK for trunk?
> >
> >--Alan
> >
> >gcc/ChangeLog:
> >
> >     * gcc/config/aarch64/aarch64.c (aarch64_function_arg_alignment):
> >     Rewrite, looking one level down for records and arrays.
> >---
> >  gcc/config/aarch64/aarch64.c | 31 ++++++++++++++++---------------
> >  1 file changed, 16 insertions(+), 15 deletions(-)
> >
> >diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
> >index 9142ac0..b084f83 100644
> >--- a/gcc/config/aarch64/aarch64.c
> >+++ b/gcc/config/aarch64/aarch64.c
> >@@ -1925,22 +1925,23 @@ aarch64_vfp_is_call_candidate (cumulative_args_t 
> >pcum_v, machine_mode mode,
> >  static unsigned int
> >  aarch64_function_arg_alignment (machine_mode mode, const_tree type)
> >  {
> >-  unsigned int alignment;
> >+  if (!type)
> >+    return GET_MODE_ALIGNMENT (mode);
> >+  if (integer_zerop (TYPE_SIZE (type)))
> >+    return 0;
> >
> >-  if (type)
> >-    {
> >-      if (!integer_zerop (TYPE_SIZE (type)))
> >-    {
> >-      if (TYPE_MODE (type) == mode)
> >-        alignment = TYPE_ALIGN (type);
> >-      else
> >-        alignment = GET_MODE_ALIGNMENT (mode);
> >-    }
> >-      else
> >-    alignment = 0;
> >-    }
> >-  else
> >-    alignment = GET_MODE_ALIGNMENT (mode);
> >+  gcc_assert (TYPE_MODE (type) == mode);
> >+
> >+  if (!AGGREGATE_TYPE_P (type))
> >+    return TYPE_ALIGN (TYPE_MAIN_VARIANT (type));
> >+
> >+  if (TREE_CODE (type) == ARRAY_TYPE)
> >+    return TYPE_ALIGN (TREE_TYPE (type));
> >+
> >+  unsigned int alignment = 0;
> >+
> >+  for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
> >+    alignment = std::max (alignment, DECL_ALIGN (field));
> >
> >    return alignment;
> >  }
> >
> 
> 
> Ping.
> 
> If this is not appropriate for GCC6, then is it OK for Stage 1 of GCC 7?

I think this needs to be a GCC 7 fix at this point.

Additionally, I'd like to fully understand PR69841 before we take this
patch.

In particular, under what circumstances can the C++ front end set DECL_ALIGN
of a type to be wider than we expect. Can we ever end up with 128-bit
alignment of a template parameter when we were expecting 32- or 64-bit
alignment, and if we can what are the implications on this patch?

Thanks,
James

Reply via email to