aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Wilson <bob.wilson@acm.org>2002-04-01 19:52:18 +0000
committerBob Wilson <bwilson@gcc.gnu.org>2002-04-01 19:52:18 +0000
commitbcf88f9b91e911d01ba43026f15eaa4858e23e4c (patch)
treec00059b72636edee78bb612232b5a761d9aaa7f0
parented4168d56fca29ef1678edcde2346f18bea80c1d (diff)
downloadgcc-bcf88f9b91e911d01ba43026f15eaa4858e23e4c.zip
gcc-bcf88f9b91e911d01ba43026f15eaa4858e23e4c.tar.gz
gcc-bcf88f9b91e911d01ba43026f15eaa4858e23e4c.tar.bz2
xtensa.c (xtensa_va_arg): Fix to handle arguments for which MUST_PASS_IN_STACK is true (e.g....
* config/xtensa/xtensa.c (xtensa_va_arg): Fix to handle arguments for which MUST_PASS_IN_STACK is true (e.g., variable-sized types). From-SVN: r51700
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/xtensa/xtensa.c33
2 files changed, 25 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ba1c60b..fa98fbb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2002-04-01 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/xtensa.c (xtensa_va_arg): Fix to handle arguments
+ for which MUST_PASS_IN_STACK is true (e.g., variable-sized types).
+
2002-04-01 Neil Booth <neil@daikokuya.demon.co.uk>
* c-common.c (unsigned_conversion_warning, convert_and_check,
diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c
index 0455737..c6bc959 100644
--- a/gcc/config/xtensa/xtensa.c
+++ b/gcc/config/xtensa/xtensa.c
@@ -2496,26 +2496,32 @@ xtensa_va_arg (valist, type)
/* Check if the argument is in registers:
- if ((AP).__va_ndx <= __MAX_ARGS_IN_REGISTERS * 4)
+ if ((AP).__va_ndx <= __MAX_ARGS_IN_REGISTERS * 4
+ && !MUST_PASS_IN_STACK (type))
__array = (AP).__va_reg;
*/
- lab_false = gen_label_rtx ();
- lab_over = gen_label_rtx ();
array = gen_reg_rtx (Pmode);
- emit_cmp_and_jump_insns (expand_expr (ndx, NULL_RTX, SImode, EXPAND_NORMAL),
- GEN_INT (MAX_ARGS_IN_REGISTERS * UNITS_PER_WORD),
- GT, const1_rtx, SImode, 0, lab_false);
+ if (!MUST_PASS_IN_STACK (VOIDmode, type))
+ {
+ lab_false = gen_label_rtx ();
+ lab_over = gen_label_rtx ();
- r = expand_expr (reg, array, Pmode, EXPAND_NORMAL);
- if (r != array)
- emit_move_insn (array, r);
+ emit_cmp_and_jump_insns (expand_expr (ndx, NULL_RTX, SImode,
+ EXPAND_NORMAL),
+ GEN_INT (MAX_ARGS_IN_REGISTERS
+ * UNITS_PER_WORD),
+ GT, const1_rtx, SImode, 0, lab_false);
- emit_jump_insn (gen_jump (lab_over));
- emit_barrier ();
- emit_label (lab_false);
+ r = expand_expr (reg, array, Pmode, EXPAND_NORMAL);
+ if (r != array)
+ emit_move_insn (array, r);
+ emit_jump_insn (gen_jump (lab_over));
+ emit_barrier ();
+ emit_label (lab_false);
+ }
/* ...otherwise, the argument is on the stack (never split between
registers and the stack -- change __va_ndx if necessary):
@@ -2545,7 +2551,8 @@ xtensa_va_arg (valist, type)
if (r != array)
emit_move_insn (array, r);
- emit_label (lab_over);
+ if (!MUST_PASS_IN_STACK (VOIDmode, type))
+ emit_label (lab_over);
/* Given the base array pointer (__array) and index to the subsequent