From 3e42d56b4b6fa2d03a6bd52e7135df62e12a3385 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Sun, 13 Apr 1997 21:24:37 +0000 Subject: [PATCH] integrate.c (copy_rtx_and_substitute): If FRAME_GROWS_DOWNWARD and regno == VIRTUAL_STACK_VARS_REGNUM... * integrate.c (copy_rtx_and_substitute): If FRAME_GROWS_DOWNWARD and regno == VIRTUAL_STACK_VARS_REGNUM, round size of stack slot up before calling assign_stack_temp. From-SVN: r13895 --- gcc/integrate.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/gcc/integrate.c b/gcc/integrate.c index 831a6959997..693304ab3d1 100644 --- a/gcc/integrate.c +++ b/gcc/integrate.c @@ -2196,18 +2196,22 @@ copy_rtx_and_substitute (orig, map) { rtx loc, seq; int size = DECL_FRAME_SIZE (map->fndecl); - int rounded; +#ifdef FRAME_GROWS_DOWNWARD + /* In this case, virtual_stack_vars_rtx points to one byte + higher than the top of the frame area. So make sure we + allocate a big enough chunk to keep the frame pointer + aligned like a real one. */ + size = CEIL_ROUND (size, BIGGEST_ALIGNMENT / BITS_PER_UNIT); +#endif start_sequence (); loc = assign_stack_temp (BLKmode, size, 1); loc = XEXP (loc, 0); #ifdef FRAME_GROWS_DOWNWARD /* In this case, virtual_stack_vars_rtx points to one byte higher than the top of the frame area. So compute the offset - to one byte higher than our substitute frame. - Keep the fake frame pointer aligned like a real one. */ - rounded = CEIL_ROUND (size, BIGGEST_ALIGNMENT / BITS_PER_UNIT); - loc = plus_constant (loc, rounded); + to one byte higher than our substitute frame. */ + loc = plus_constant (loc, size); #endif map->reg_map[regno] = temp = force_reg (Pmode, force_operand (loc, NULL_RTX)); -- 2.30.2