diff options
author | David Edelsohn <dje.gcc@gmail.com> | 2018-12-04 15:51:51 +0000 |
---|---|---|
committer | David Edelsohn <dje@gcc.gnu.org> | 2018-12-04 10:51:51 -0500 |
commit | b1e2e9063fc3e3ca32a91afeb3c8069586e15ddc (patch) | |
tree | c0e7059c07b99faefe41a4fd58b9c0e07681b158 /gcc | |
parent | 44a0738e202bc0db9e623aaf7fe50e4a62a1ad5a (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 6 |
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; |