[PATCH 1/2][AArch64] Implement AAPCS64 updates for alignment attribute
authorAlan Lawrence <alan.lawrence@arm.com>
Wed, 8 Jun 2016 17:00:23 +0000 (17:00 +0000)
committerJames Greenhalgh <jgreenhalgh@gcc.gnu.org>
Wed, 8 Jun 2016 17:00:23 +0000 (17:00 +0000)
gcc/ChangeLog:

* config/aarch64/aarch64.c (aarch64_function_arg_alignment):
Rewrite, looking one level down for records and arrays.

From-SVN: r237224

gcc/ChangeLog
gcc/config/aarch64/aarch64.c

index 8c1a79cb90d64949cf2e30072ffa247bf7622470..0634872332b38a27c3137f7ade3f7dbc50a19934 100644 (file)
@@ -1,3 +1,8 @@
+2016-06-08  Alan Lawrence  <alan.lawrence@arm.com>
+
+       * config/aarch64/aarch64.c (aarch64_function_arg_alignment):
+       Rewrite, looking one level down for records and arrays.
+
 2016-06-08  David Malcolm  <dmalcolm@redhat.com>
 
        * pretty-print.c: Include "selftest.h".
index b60e5c52df6310a87635c523d723eee9768d7aef..a0db3a4f6326c2e95824db29b9e4dc16f0220eea 100644 (file)
@@ -1961,22 +1961,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;
 }