re PR target/16430 (ICE when returning non-C aggregates larger than 16 bytes)
authorEric Botcazou <ebotcazou@libertysurf.fr>
Thu, 8 Jul 2004 14:33:20 +0000 (16:33 +0200)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 8 Jul 2004 14:33:20 +0000 (14:33 +0000)
PR target/16430
* config/sparc/sparc.c (function_value): In 64-bit mode,
return the aggregates larger than 16 bytes like unions.

From-SVN: r84289

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

index d9cf1950f88e2c99c41a37f733e6d775e13d0c06..8e24df935fdc44e1e4751e18ae1e1ded1c32641c 100644 (file)
@@ -1,3 +1,9 @@
+2004-07-08  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       PR target/16430
+       * config/sparc/sparc.c (function_value): In 64-bit mode,
+       return the aggregates larger than 16 bytes like unions.
+
 2004-07-08  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        PR target/16199
index 02a804013a64e394bae8e7d5b12e0a3e4d7dadf4..26c9e1e35f3e67c57eb76ede4a116434f2716cbe 100644 (file)
@@ -5750,6 +5750,18 @@ function_value (tree type, enum machine_mode mode, int incoming_p)
            abort (); /* shouldn't get here */
 
          mode = mode_for_size (bytes * BITS_PER_UNIT, MODE_INT, 0);
+
+         /* ??? We probably should have made the same ABI change in
+            3.4.0 as the one we made for unions.   The latter was
+            required by the SCD though, while the former is not
+            specified, so we favored compatibility and efficiency.
+
+            Now we're stuck for aggregates larger than 16 bytes,
+            because OImode vanished in the meantime.  Let's not
+            try to be unduly clever, and simply follow the ABI
+            for unions in that case.  */
+         if (mode == BLKmode)
+           return function_arg_union_value (bytes, mode, regbase);
        }
       else if (GET_MODE_CLASS (mode) == MODE_INT
               && GET_MODE_SIZE (mode) < UNITS_PER_WORD)