Adjust structure parameter passing to match ABI change.
authorJim Wilson <wilson@cygnus.com>
Tue, 1 Aug 2000 03:22:53 +0000 (03:22 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Tue, 1 Aug 2000 03:22:53 +0000 (20:22 -0700)
* config/ia64/ia64.c (ia64_function_arg): Use alignment not size
when computing offset.

From-SVN: r35401

gcc/ChangeLog
gcc/config/ia64/ia64.c

index f2f83e8..7c9d309 100644 (file)
@@ -1,3 +1,8 @@
+2000-07-31  Jim Wilson  <wilson@cygnus.com>
+
+       * config/ia64/ia64.c (ia64_function_arg): Use alignment not size
+       when computing offset.
+
 Mon Jul 31 20:35:50 2000  Denis Chertykov  <denisc@overta.ru>
 
        * genpeep.c (main): Handle DEFINE_PEEPHOLE2.
index 7153620..7c015f4 100644 (file)
@@ -1542,8 +1542,14 @@ ia64_function_arg (cum, mode, type, named, incoming)
   int offset = 0;
   enum machine_mode hfa_mode = VOIDmode;
 
-  /* Arguments larger than 8 bytes start at the next even boundary.  */
-  if (words > 1 && (cum->words & 1))
+  /* Integer and float arguments larger than 8 bytes start at the next even
+     boundary.  Aggregates larger than 8 bytes start at the next even boundary
+     if the aggregate has 16 byte alignment.  */
+  /* ??? The ABI does not specify how to handle aggregates with alignment from
+     9 to 15 bytes, or greater than 16.   We handle them all as if they had
+     16 byte alignment.  Such aggregates can occur only if gcc extensions are
+     used.  */
+  if ((TYPE_ALIGN (type) > 8 * BITS_PER_UNIT) && (cum->words & 1))
     offset = 1;
 
   /* If all argument slots are used, then it must go on the stack.  */