aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/pa/pa.h3
-rw-r--r--gcc/function.c8
3 files changed, 16 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2913509..7f361f9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
2004-10-07 Richard Sandiford <rsandifo@redhat.com>
+ PR target/16815
+ * function.c (assign_parm_setup_block_p): Tighten BLOCK_REG_PADDING
+ check.
+ * config/pa/pa.h (BLOCK_REG_PADDING): Define in terms of
+ function_arg_padding.
+
+2004-10-07 Richard Sandiford <rsandifo@redhat.com>
+
PR bootstrap/17857
* Makefile.in (stmp-fixproto): Pass FIX_HEADER=build/... to fixproto.
diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h
index 5c5d8bf..18fb217 100644
--- a/gcc/config/pa/pa.h
+++ b/gcc/config/pa/pa.h
@@ -918,7 +918,8 @@ struct hppa_args {int words, nargs_prototype, incoming, indirect; };
We use a DImode register in the parallel for 5 to 7 byte structures
so that there is only one element. This allows the object to be
correctly padded. */
-#define BLOCK_REG_PADDING(MODE, TYPE, FIRST) (TARGET_64BIT ? upward : downward)
+#define BLOCK_REG_PADDING(MODE, TYPE, FIRST) \
+ function_arg_padding ((MODE), (TYPE))
/* Do not expect to understand this without reading it several times. I'm
tempted to try and simply it, but I worry about breaking something. */
diff --git a/gcc/function.c b/gcc/function.c
index 0545b05..4c8d6c4 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -2513,8 +2513,12 @@ assign_parm_setup_block_p (struct assign_parm_data_one *data)
return true;
#ifdef BLOCK_REG_PADDING
- if (data->locate.where_pad == (BYTES_BIG_ENDIAN ? upward : downward)
- && GET_MODE_SIZE (data->promoted_mode) < UNITS_PER_WORD)
+ /* Only assign_parm_setup_block knows how to deal with register arguments
+ that are padded at the least significant end. */
+ if (REG_P (data->entry_parm)
+ && GET_MODE_SIZE (data->promoted_mode) < UNITS_PER_WORD
+ && (BLOCK_REG_PADDING (data->passed_mode, data->passed_type, 1)
+ == (BYTES_BIG_ENDIAN ? upward : downward)))
return true;
#endif