From 58dbcf0581d6a91c9374d1087f1e9cd384319121 Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Tue, 22 Jan 2002 02:36:54 +0000 Subject: [PATCH] tm.texi: Remove STARTING_FRAME_PHASE. * doc/tm.texi: Remove STARTING_FRAME_PHASE. * config/rs6000/rs6000.h: Same. * function.c (instantiate_virtual_regs): Remove STARTING_FRAME_PHASE. (assign_stack_local_1): Same. Calculate frame phase. From-SVN: r49063 --- gcc/config/rs6000/rs6000.h | 5 ----- gcc/doc/tm.texi | 12 ------------ gcc/function.c | 30 +++++++++--------------------- 3 files changed, 9 insertions(+), 38 deletions(-) diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 10e16196232..2deaf75bf4b 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -1382,11 +1382,6 @@ typedef struct rs6000_stack { + RS6000_VARARGS_AREA \ + RS6000_SAVE_AREA) -/* How far (in bytes) is the start of the frame from the stack - alignment. For ppc 32bits, the stack is aligned to 128 bits, but - the frame starts 64bits later. */ -#define STARTING_FRAME_PHASE (TARGET_32BIT ? 8 : 0) - /* Offset from the stack pointer register to an item dynamically allocated on the stack, e.g., by `alloca'. diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index bb296eee386..c81461d1b5a 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -2598,18 +2598,6 @@ value @code{STARTING_FRAME_OFFSET}. @c i'm not sure if the above is still correct.. had to change it to get @c rid of an overfull. --mew 2feb93 -@findex STARTING_FRAME_PHASE -@item STARTING_FRAME_PHASE -This option species how many bytes the frame is out of phase from the -stack alignment. - -For example, some ports assume a stack alignment of 128 bits, but the -start of the frame is 64 bits displaced from this alignment. In this -case, you would define @code{STARTING_FRAME_PHASE} to be 8. - -This macro defaults to 0, so there is no need to define it if the start -of the frame maintains the stack alignment. - @findex STACK_POINTER_OFFSET @item STACK_POINTER_OFFSET Offset from the stack pointer register to the first location at which diff --git a/gcc/function.c b/gcc/function.c index cd397579865..bf294ea7c34 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -68,10 +68,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #define LOCAL_ALIGNMENT(TYPE, ALIGNMENT) ALIGNMENT #endif -#ifndef STARTING_FRAME_PHASE -#define STARTING_FRAME_PHASE 0 -#endif - /* Some systems use __main in a way incompatible with its use in gcc, in these cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to give the same symbol without quotes for an alternative entry point. You @@ -528,6 +524,7 @@ assign_stack_local_1 (mode, size, align, function) rtx x, addr; int bigend_correction = 0; int alignment; + int frame_off, frame_alignment, frame_phase; if (align == 0) { @@ -565,15 +562,21 @@ assign_stack_local_1 (mode, size, align, function) if (function->stack_alignment_needed < alignment * BITS_PER_UNIT) function->stack_alignment_needed = alignment * BITS_PER_UNIT; + /* Calculate how many bytes the start of local variables is off from + stack alignment. */ + frame_alignment = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT; + frame_off = STARTING_FRAME_OFFSET % frame_alignment; + frame_phase = frame_off ? frame_alignment - frame_off : 0; + /* Round frame offset to that alignment. We must be careful here, since FRAME_OFFSET might be negative and division with a negative dividend isn't as well defined as we might like. So we instead assume that ALIGNMENT is a power of two and use logical operations which are unambiguous. */ #ifdef FRAME_GROWS_DOWNWARD - function->x_frame_offset = FLOOR_ROUND (function->x_frame_offset - STARTING_FRAME_PHASE, alignment) + STARTING_FRAME_PHASE; + function->x_frame_offset = FLOOR_ROUND (function->x_frame_offset - frame_phase, alignment) + frame_phase; #else - function->x_frame_offset = CEIL_ROUND (function->x_frame_offset - STARTING_FRAME_PHASE, alignment) + STARTING_FRAME_PHASE; + function->x_frame_offset = CEIL_ROUND (function->x_frame_offset - frame_phase, alignment) + frame_phase; #endif /* On a big-endian machine, if we are allocating more space than we will use, @@ -3481,21 +3484,6 @@ instantiate_virtual_regs (fndecl, insns) rtx insn; unsigned int i; - if (STARTING_FRAME_PHASE > 0) - { - /* Make sure the frame offset and phase displacement are aligned as - advertised. - - Only do the sanity check if we have a STARTING_FRAME_PHASE, - else we might trigger this abort on ports who claim to have - STARTING_FRAME_OFFSET aligned properly, but don't. I suppose - we could enable this and fix those ports. */ - - if ((STARTING_FRAME_OFFSET + STARTING_FRAME_PHASE) - % (STACK_BOUNDARY / BITS_PER_UNIT)) - abort (); - } - /* Compute the offsets to use for this function. */ in_arg_offset = FIRST_PARM_OFFSET (fndecl); var_offset = STARTING_FRAME_OFFSET;