aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@libertysurf.fr>2004-07-08 16:33:20 +0200
committerEric Botcazou <ebotcazou@gcc.gnu.org>2004-07-08 14:33:20 +0000
commitc74fd3f1fd593b4696fadd8264743248d05ad178 (patch)
treec51aaaad405d8e5ce8b4debcdb4938aaff278119
parent1d511ed5fc76892c3f5dca6b78a1b7254bc15bd1 (diff)
downloadgcc-c74fd3f1fd593b4696fadd8264743248d05ad178.zip
gcc-c74fd3f1fd593b4696fadd8264743248d05ad178.tar.gz
gcc-c74fd3f1fd593b4696fadd8264743248d05ad178.tar.bz2
re PR target/16430 (ICE when returning non-C aggregates larger than 16 bytes)
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/sparc/sparc.c12
2 files changed, 18 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d9cf195..8e24df9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
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
* config/sparc/sparc.c (sparc_emit_set_symbolic_const64): When
'temp' is zero, generate new pseudos as needed and emit the
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index 02a8040..26c9e1e 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -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)