sparc.c (function_arg_record_value_1): Skip fields with zero length.
authorEric Botcazou <ebotcazou@libertysurf.fr>
Sat, 6 Nov 2004 17:39:56 +0000 (18:39 +0100)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 6 Nov 2004 17:39:56 +0000 (17:39 +0000)
* config/sparc/sparc.c (function_arg_record_value_1): Skip
fields with zero length.
(function_arg_record_value_2): Likewise.
(function_arg_record_value_3): Use smallest_mode_for_size
instead of mode_for_size.
(function_arg_union_value): Return naked register for unions
with zero length.

From-SVN: r90180

gcc/ChangeLog
gcc/config/sparc/sparc.c

index 138c1406c60c9f45c2d2cfd6694f6ee26696186e..1c0215796d3d783296faa7786605f6bb3669641b 100644 (file)
@@ -1,3 +1,13 @@
+2004-11-06  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       * config/sparc/sparc.c (function_arg_record_value_1): Skip
+       fields with zero length.
+       (function_arg_record_value_2): Likewise.
+       (function_arg_record_value_3): Use smallest_mode_for_size
+       instead of mode_for_size.
+       (function_arg_union_value): Return naked register for unions
+       with zero length.
+
 2004-11-06  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        * config/sparc/sparc.c (scan_record_type): Handle vector types.
index d44ab95877c823ca0922333359653b2067ecb408..5c5b3267b4e261924a4a3e28ce3711836e82a006 100644 (file)
@@ -5262,9 +5262,14 @@ function_arg_record_value_1 (tree type, HOST_WIDE_INT startbitpos,
        {
          HOST_WIDE_INT bitpos = startbitpos;
 
-         if (DECL_SIZE (field) != 0
-             && host_integerp (bit_position (field), 1))
-           bitpos += int_bit_position (field);
+         if (DECL_SIZE (field) != 0)
+           {
+             if (integer_zerop (DECL_SIZE (field)))
+               continue;
+
+             if (host_integerp (bit_position (field), 1))
+               bitpos += int_bit_position (field);
+           }
 
          /* ??? FIXME: else assume zero offset.  */
 
@@ -5355,8 +5360,8 @@ function_arg_record_value_3 (HOST_WIDE_INT bitpos,
      at the moment but may wish to revisit.  */
 
   if (intoffset % BITS_PER_WORD != 0)
-    mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
-                         MODE_INT, 0);
+    mode = smallest_mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
+                                  MODE_INT);
   else
     mode = word_mode;
 
@@ -5405,9 +5410,14 @@ function_arg_record_value_2 (tree type, HOST_WIDE_INT startbitpos,
        {
          HOST_WIDE_INT bitpos = startbitpos;
 
-         if (DECL_SIZE (field) != 0
-             && host_integerp (bit_position (field), 1))
-           bitpos += int_bit_position (field);
+         if (DECL_SIZE (field) != 0)
+           {
+             if (integer_zerop (DECL_SIZE (field)))
+               continue;
+
+             if (host_integerp (bit_position (field), 1))
+               bitpos += int_bit_position (field);
+           }
 
          /* ??? FIXME: else assume zero offset.  */
 
@@ -5588,6 +5598,10 @@ function_arg_union_value (int size, enum machine_mode mode, int regno)
   int nwords = ROUND_ADVANCE (size), i;
   rtx regs;
 
+  /* See comment in previous function for empty structures.  */
+  if (nwords == 0)
+    return gen_rtx_REG (mode, regno);
+
   regs = gen_rtx_PARALLEL (mode, rtvec_alloc (nwords));
 
   for (i = 0; i < nwords; i++)