aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Wilson <wilson@cygnus.com>1999-10-28 17:14:59 +0000
committerJim Wilson <wilson@gcc.gnu.org>1999-10-28 10:14:59 -0700
commit7ab282a5a0880dea9e75e04113676d7e4139d4b9 (patch)
treeab48848df5dedb554799fafb1b6a1a176065e424
parent9ed5879d10ca2f21840431c9ba32eed1813d29d5 (diff)
downloadgcc-7ab282a5a0880dea9e75e04113676d7e4139d4b9.zip
gcc-7ab282a5a0880dea9e75e04113676d7e4139d4b9.tar.gz
gcc-7ab282a5a0880dea9e75e04113676d7e4139d4b9.tar.bz2
Fix i960 varargs/stdarg build failures.
* config/i960/i960.c (i960_va_start): New locals base, num. Use INDIRECT_REF instead of ARRAY_REF on valist. (i960_va_arg): Use INDIRECT_REF instead of ARRAY_REF on valist. From-SVN: r30244
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i960/i960.c23
2 files changed, 22 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b1aca2e..d4f2b4ee 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+Thu Oct 28 10:02:00 1999 Jim Wilson <wilson@cygnus.com>
+
+ * config/i960/i960.c (i960_va_start): New locals base, num.
+ Use INDIRECT_REF instead of ARRAY_REF on valist.
+ (i960_va_arg): Use INDIRECT_REF instead of ARRAY_REF on valist.
+
Thu Oct 28 09:45:48 1999 Mark Mitchell <mark@codesourcery.com>
* gcse.c (delete_null_pointer_checks): Fix typo in previous change.
diff --git a/gcc/config/i960/i960.c b/gcc/config/i960/i960.c
index fa98ad4..2dd17ae 100644
--- a/gcc/config/i960/i960.c
+++ b/gcc/config/i960/i960.c
@@ -2652,18 +2652,23 @@ i960_va_start (stdarg_p, valist, nextarg)
tree valist;
rtx nextarg ATTRIBUTE_UNUSED;
{
- tree d, s, t;
+ tree s, t, base, num;
+
+ /* The array type always decays to a pointer before we get here, so we
+ can't use ARRAY_REF. */
+ base = build1 (INDIRECT_REF, unsigned_type_node, valist);
+ num = build1 (INDIRECT_REF, unsigned_type_node,
+ build (PLUS_EXPR, unsigned_type_node, valist,
+ TYPE_SIZE_UNIT (TREE_TYPE (valist))));
s = make_tree (unsigned_type_node, arg_pointer_rtx);
- d = build (ARRAY_REF, unsigned_type_node, valist, size_zero_node);
- t = build (MODIFY_EXPR, unsigned_type_node, d, s);
+ t = build (MODIFY_EXPR, unsigned_type_node, base, s);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
s = build_int_2 ((current_function_args_info.ca_nregparms
+ current_function_args_info.ca_nstackparms) * 4, 0);
- d = build (ARRAY_REF, unsigned_type_node, valist, size_one_node);
- t = build (MODIFY_EXPR, unsigned_type_node, d, s);
+ t = build (MODIFY_EXPR, unsigned_type_node, num, s);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
}
@@ -2678,8 +2683,12 @@ i960_va_arg (valist, type)
tree base, num, pad, next, this, t1, t2, int48;
rtx addr_rtx;
- base = build (ARRAY_REF, unsigned_type_node, valist, size_zero_node);
- num = build (ARRAY_REF, unsigned_type_node, valist, size_one_node);
+ /* The array type always decays to a pointer before we get here, so we
+ can't use ARRAY_REF. */
+ base = build1 (INDIRECT_REF, unsigned_type_node, valist);
+ num = build1 (INDIRECT_REF, unsigned_type_node,
+ build (PLUS_EXPR, unsigned_type_node, valist,
+ TYPE_SIZE_UNIT (TREE_TYPE (valist))));
/* Round up sizeof(type) to a word. */
siz = (int_size_in_bytes (type) + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;