aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2005-12-15 07:22:10 +0000
committerAlan Modra <amodra@gcc.gnu.org>2005-12-15 17:52:10 +1030
commitfa5b097201b78abf1313614cdf8079460a54e687 (patch)
tree68441a56b11856966154a0bb679e8533b594c0fe /gcc
parent018c145d971406e5d9fa81b9ba1122b57446a24b (diff)
downloadgcc-fa5b097201b78abf1313614cdf8079460a54e687.zip
gcc-fa5b097201b78abf1313614cdf8079460a54e687.tar.gz
gcc-fa5b097201b78abf1313614cdf8079460a54e687.tar.bz2
re PR target/25406 (gcc.dg/20030625-1.c, gcc.dg/20050620-1.c, gcc.dg/940510-1.c, gcc.dg/c99-flex-array-1.c, gcc.dg/pr14475.c, and gcc.dg/noncompile/incomplete-1.c fail on powerpc-darwin)
PR target/25406 * config/rs6000/rs6000.c (rs6000_special_round_type_align): Handle error_mark_node. Make alignment params unsigned. * config/rs6000/rs6000-protos.h (rs6000_special_round_type_align): Update prototype. (rs6000_machopic_legitimize_pic_address): Remove arg names. From-SVN: r108562
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/rs6000/rs6000-protos.h9
-rw-r--r--gcc/config/rs6000/rs6000.c20
3 files changed, 26 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 71260a2..0546407 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2005-12-15 Alan Modra <amodra@bigpond.net.au>
+
+ PR target/25406
+ * config/rs6000/rs6000.c (rs6000_special_round_type_align): Handle
+ error_mark_node. Make alignment params unsigned.
+ * config/rs6000/rs6000-protos.h
+ (rs6000_special_round_type_align): Update prototype.
+ (rs6000_machopic_legitimize_pic_address): Remove arg names.
+
2005-12-14 Ulrich Weigand <uweigand@de.ibm.com>
PR rtl-optimization/25310
diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h
index dbde3d5..a7cc3a6 100644
--- a/gcc/config/rs6000/rs6000-protos.h
+++ b/gcc/config/rs6000/rs6000-protos.h
@@ -105,14 +105,13 @@ extern rtx rs6000_return_addr (int, rtx);
extern void rs6000_output_symbol_ref (FILE*, rtx);
extern HOST_WIDE_INT rs6000_initial_elimination_offset (int, int);
-extern rtx rs6000_machopic_legitimize_pic_address (rtx orig,
- enum machine_mode mode,
- rtx reg);
-
+extern rtx rs6000_machopic_legitimize_pic_address (rtx, enum machine_mode,
+ rtx);
#endif /* RTX_CODE */
#ifdef TREE_CODE
-extern unsigned int rs6000_special_round_type_align (tree, int, int);
+extern unsigned int rs6000_special_round_type_align (tree, unsigned int,
+ unsigned int);
extern void function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode,
tree, int, int);
extern int function_arg_boundary (enum machine_mode, tree);
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 9f547da..e196279 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -2505,21 +2505,27 @@ invalid_e500_subreg (rtx op, enum machine_mode mode)
field is an FP double while the FP fields remain word aligned. */
unsigned int
-rs6000_special_round_type_align (tree type, int computed, int specified)
+rs6000_special_round_type_align (tree type, unsigned int computed,
+ unsigned int specified)
{
+ unsigned int align = MAX (computed, specified);
tree field = TYPE_FIELDS (type);
/* Skip all non field decls */
while (field != NULL && TREE_CODE (field) != FIELD_DECL)
field = TREE_CHAIN (field);
- if (field == NULL || field == type
- || TYPE_MODE (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
- ? get_inner_array_type (field)
- : TREE_TYPE (field)) != DFmode)
- return MAX (computed, specified);
+ if (field != NULL && field != type)
+ {
+ type = TREE_TYPE (field);
+ while (TREE_CODE (type) == ARRAY_TYPE)
+ type = TREE_TYPE (type);
+
+ if (type != error_mark_node && TYPE_MODE (type) == DFmode)
+ align = MAX (align, 64);
+ }
- return MAX (MAX (computed, specified), 64);
+ return align;
}
/* Return 1 for an operand in small memory on V.4/eabi. */