diff options
author | nemet <nemet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-04-30 22:42:58 +0000 |
---|---|---|
committer | nemet <nemet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-04-30 22:42:58 +0000 |
commit | f9eddbcf9362be50d58bd7c3b9187cbe9890b399 (patch) | |
tree | a2fbab0c0d8cccb4ef750f9172ebccc21227f0f4 | |
parent | 67b0f2ed90c90cab821c080577ab3774d5cec975 (diff) | |
download | gcc-f9eddbcf9362be50d58bd7c3b9187cbe9890b399.tar.gz |
* config/mips/mips.h (FRAME_GROWS_DOWNWARD,
MIPS_GP_SAVE_AREA_SIZE): Define new macros.
(STARTING_FRAME_OFFSET): Return 0 if FRAME_GROWS_DOWNWARD. Use
MIPS_GP_SAVE_AREA_SIZE.
* config/mips/mips.c (struct mips_frame_info): Update comment
before arg_pointer_offset and hard_frame_pointer_offset.
(mips_compute_frame_info): Update diagram before function: to
correctly use stack_pointer_rtx for fp_sp_offset and gp_sp_offset, to
indicate the position of frame_pointer_rtx with -fstack-protector and
to show args_size. Don't allocate cprestore area for leaf functions
if FRAME_GROWS_DOWNWARD. Use MIPS_GP_SAVE_AREA_SIZE to set
cprestore_size.
(mips_initial_elimination_offset): Update for FRAME_GROWS_DOWNWARD.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@147024 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 20 | ||||
-rw-r--r-- | gcc/config/mips/mips.c | 53 | ||||
-rw-r--r-- | gcc/config/mips/mips.h | 18 |
3 files changed, 60 insertions, 31 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1035331f0fa..cff75d260b5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,7 +1,23 @@ +2009-04-30 Adam Nemet <anemet@caviumnetworks.com> + + * config/mips/mips.h (FRAME_GROWS_DOWNWARD, + MIPS_GP_SAVE_AREA_SIZE): Define new macros. + (STARTING_FRAME_OFFSET): Return 0 if FRAME_GROWS_DOWNWARD. Use + MIPS_GP_SAVE_AREA_SIZE. + * config/mips/mips.c (struct mips_frame_info): Update comment + before arg_pointer_offset and hard_frame_pointer_offset. + (mips_compute_frame_info): Update diagram before function: to + correctly use stack_pointer_rtx for fp_sp_offset and gp_sp_offset, to + indicate the position of frame_pointer_rtx with -fstack-protector and + to show args_size. Don't allocate cprestore area for leaf functions + if FRAME_GROWS_DOWNWARD. Use MIPS_GP_SAVE_AREA_SIZE to set + cprestore_size. + (mips_initial_elimination_offset): Update for FRAME_GROWS_DOWNWARD. + 2009-04-30 Michael Matz <matz@suse.de> - PR tree-optimization/39955 - * config/rs6000/rs6000.c (rs6000_check_sdmode): Also check SSA_NAMEs. + PR tree-optimization/39955 + * config/rs6000/rs6000.c (rs6000_check_sdmode): Also check SSA_NAMEs. 2009-04-30 Dave Korn <dave.korn.cygwin@gmail.com> diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 8dfd3c2e9fa..e03e6adb304 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -285,10 +285,10 @@ struct GTY(()) mips_frame_info { HOST_WIDE_INT acc_sp_offset; HOST_WIDE_INT cop0_sp_offset; - /* The offset of arg_pointer_rtx from frame_pointer_rtx. */ + /* The offset of arg_pointer_rtx from the bottom of the frame. */ HOST_WIDE_INT arg_pointer_offset; - /* The offset of hard_frame_pointer_rtx from frame_pointer_rtx. */ + /* The offset of hard_frame_pointer_rtx from the bottom of the frame. */ HOST_WIDE_INT hard_frame_pointer_offset; }; @@ -8673,16 +8673,16 @@ mips_save_reg_p (unsigned int regno) | | + UNITS_PER_WORD | accumulator save area | | | - +-------------------------------+ <-- frame_pointer_rtx + fp_sp_offset + +-------------------------------+ <-- stack_pointer_rtx + fp_sp_offset | | + UNITS_PER_HWFPVALUE | FPR save area | | | - +-------------------------------+ <-- frame_pointer_rtx + gp_sp_offset + +-------------------------------+ <-- stack_pointer_rtx + gp_sp_offset | | + UNITS_PER_WORD | GPR save area | | | - +-------------------------------+ - | | \ + +-------------------------------+ <-- frame_pointer_rtx with + | | \ -fstack-protector | local variables | | var_size | | / +-------------------------------+ @@ -8690,16 +8690,17 @@ mips_save_reg_p (unsigned int regno) | $gp save area | | cprestore_size | | / P +-------------------------------+ <-- hard_frame_pointer_rtx for - | | MIPS16 code - | outgoing stack arguments | - | | - +-------------------------------+ - | | - | caller-allocated save area | - | for register arguments | - | | + | | \ MIPS16 code + | outgoing stack arguments | | + | | | + +-------------------------------+ | args_size + | | | + | caller-allocated save area | | + | for register arguments | | + | | / +-------------------------------+ <-- stack_pointer_rtx - frame_pointer_rtx + frame_pointer_rtx without + -fstack-protector hard_frame_pointer_rtx for non-MIPS16 code. @@ -8744,11 +8745,11 @@ mips_compute_frame_info (void) cfun->machine->global_pointer = mips_global_pointer (); - /* The first STARTING_FRAME_OFFSET bytes contain the outgoing argument - area and the $gp save slot. This area isn't needed in leaf functions, - but if the target-independent frame size is nonzero, we're committed - to allocating it anyway. */ - if (size == 0 && current_function_is_leaf) + /* The first two blocks contain the outgoing argument area and the $gp save + slot. This area isn't needed in leaf functions, but if the + target-independent frame size is nonzero, we have already committed to + allocating these in STARTING_FRAME_OFFSET for !FRAME_GROWS_DOWNWARD. */ + if ((size == 0 || FRAME_GROWS_DOWNWARD) && current_function_is_leaf) { /* The MIPS 3.0 linker does not like functions that dynamically allocate the stack and have 0 for STACK_DYNAMIC_OFFSET, since it @@ -8763,7 +8764,7 @@ mips_compute_frame_info (void) else { frame->args_size = crtl->outgoing_args_size; - frame->cprestore_size = STARTING_FRAME_OFFSET - frame->args_size; + frame->cprestore_size = MIPS_GP_SAVE_AREA_SIZE; } offset = frame->args_size + frame->cprestore_size; @@ -8942,12 +8943,16 @@ mips_initial_elimination_offset (int from, int to) mips_compute_frame_info (); - /* Set OFFSET to the offset from the soft frame pointer, which is also - the offset from the end-of-prologue stack pointer. */ + /* Set OFFSET to the offset from the end-of-prologue stack pointer. */ switch (from) { case FRAME_POINTER_REGNUM: - offset = 0; + if (FRAME_GROWS_DOWNWARD) + offset = (cfun->machine->frame.args_size + + cfun->machine->frame.cprestore_size + + cfun->machine->frame.var_size); + else + offset = 0; break; case ARG_POINTER_REGNUM: diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index 7e3d57e7300..e14073ab2be 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -2081,12 +2081,20 @@ enum reg_class #define STACK_GROWS_DOWNWARD -/* The offset of the first local variable from the beginning of the frame. - See mips_compute_frame_info for details about the frame layout. */ +#define FRAME_GROWS_DOWNWARD flag_stack_protect -#define STARTING_FRAME_OFFSET \ - (crtl->outgoing_args_size \ - + (TARGET_CALL_CLOBBERED_GP ? MIPS_STACK_ALIGN (UNITS_PER_WORD) : 0)) +/* Size of the area allocated in the frame to save the GP. */ + +#define MIPS_GP_SAVE_AREA_SIZE \ + (TARGET_CALL_CLOBBERED_GP ? MIPS_STACK_ALIGN (UNITS_PER_WORD) : 0) + +/* The offset of the first local variable from the frame pointer. See + mips_compute_frame_info for details about the frame layout. */ + +#define STARTING_FRAME_OFFSET \ + (FRAME_GROWS_DOWNWARD \ + ? 0 \ + : crtl->outgoing_args_size + MIPS_GP_SAVE_AREA_SIZE) #define RETURN_ADDR_RTX mips_return_addr |