diff options
author | Jim Wilson <wilson@cygnus.com> | 1999-10-28 17:14:59 +0000 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 1999-10-28 10:14:59 -0700 |
commit | 7ab282a5a0880dea9e75e04113676d7e4139d4b9 (patch) | |
tree | ab48848df5dedb554799fafb1b6a1a176065e424 | |
parent | 9ed5879d10ca2f21840431c9ba32eed1813d29d5 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i960/i960.c | 23 |
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; |