aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Edelsohn <dje.gcc@gmail.com>2018-12-04 15:51:51 +0000
committerDavid Edelsohn <dje@gcc.gnu.org>2018-12-04 10:51:51 -0500
commitb1e2e9063fc3e3ca32a91afeb3c8069586e15ddc (patch)
treec0e7059c07b99faefe41a4fd58b9c0e07681b158
parent44a0738e202bc0db9e623aaf7fe50e4a62a1ad5a (diff)
downloadgcc-b1e2e9063fc3e3ca32a91afeb3c8069586e15ddc.zip
gcc-b1e2e9063fc3e3ca32a91afeb3c8069586e15ddc.tar.gz
gcc-b1e2e9063fc3e3ca32a91afeb3c8069586e15ddc.tar.bz2
re PR target/61976 (aix64: Data corruption in struct passed by value)
PR target/61976 * config/rs6000/rs6000.c (rs6000_function_arg): Don't pass aggregates in FPRs on AIX. (rs6000_arg_partial_bytes): Same. From-SVN: r266786
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/rs6000/rs6000.c6
2 files changed, 11 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1214f44..bbfe5ae 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2018-12-04 David Edelsohn <dje.gcc@gmail.com>
+
+ PR target/61976
+ * config/rs6000/rs6000.c (rs6000_function_arg): Don't pass aggregates
+ in FPRs on AIX.
+ (rs6000_arg_partial_bytes): Same.
+
2018-12-04 Vladimir Makarov <vmakarov@redhat.com>
PR target/88282
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 03b983b..4e35a05 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -11989,7 +11989,8 @@ rs6000_function_arg (cumulative_args_t cum_v, machine_mode mode,
if (elt_mode == TDmode && (cum->fregno % 2) == 1)
cum->fregno++;
- if (USE_FP_FOR_ARG_P (cum, elt_mode))
+ if (USE_FP_FOR_ARG_P (cum, elt_mode)
+ && !(TARGET_AIX && AGGREGATE_TYPE_P (type)))
{
rtx rvec[GP_ARG_NUM_REG + AGGR_ARG_NUM_REG + 1];
rtx r, off;
@@ -12125,7 +12126,8 @@ rs6000_arg_partial_bytes (cumulative_args_t cum_v, machine_mode mode,
align_words = rs6000_parm_start (mode, type, cum->words);
- if (USE_FP_FOR_ARG_P (cum, elt_mode))
+ if (USE_FP_FOR_ARG_P (cum, elt_mode)
+ && !(TARGET_AIX && AGGREGATE_TYPE_P (type)))
{
unsigned long n_fpreg = (GET_MODE_SIZE (elt_mode) + 7) >> 3;