Commit 5057f9e0 by Max Filippov Committed by Max Filippov

xtensa: add support for SSP

gcc/
2017-05-08  Max Filippov  <jcmvbkbc@gmail.com>

	* config/xtensa/xtensa-protos.h
       	(xtensa_initial_elimination_offset): New declaration.
	* config/xtensa/xtensa.c (xtensa_initial_elimination_offset):
	New function. Move its body from the INITIAL_ELIMINATION_OFFSET
	macro definition, add case for FRAME_POINTER_REGNUM when
	FRAME_GROWS_DOWNWARD.
	* config/xtensa/xtensa.h (FRAME_GROWS_DOWNWARD): New macro
	definition.
	(INITIAL_ELIMINATION_OFFSET): Replace body with call to
	xtensa_initial_elimination_offset.

From-SVN: r247771
parent 26ffe694
2017-05-08 Max Filippov <jcmvbkbc@gmail.com>
* config/xtensa/xtensa-protos.h
(xtensa_initial_elimination_offset): New declaration.
* config/xtensa/xtensa.c (xtensa_initial_elimination_offset):
New function. Move its body from the INITIAL_ELIMINATION_OFFSET
macro definition, add case for FRAME_POINTER_REGNUM when
FRAME_GROWS_DOWNWARD.
* config/xtensa/xtensa.h (FRAME_GROWS_DOWNWARD): New macro
definition.
(INITIAL_ELIMINATION_OFFSET): Replace body with call to
xtensa_initial_elimination_offset.
2017-05-08 Nathan Sidwell <nathan@acm.org> 2017-05-08 Nathan Sidwell <nathan@acm.org>
* doc/invoke.texi: Alphabetize -fdump options. * doc/invoke.texi: Alphabetize -fdump options.
......
...@@ -73,5 +73,6 @@ extern void xtensa_expand_prologue (void); ...@@ -73,5 +73,6 @@ extern void xtensa_expand_prologue (void);
extern void xtensa_expand_epilogue (void); extern void xtensa_expand_epilogue (void);
extern void order_regs_for_local_alloc (void); extern void order_regs_for_local_alloc (void);
extern enum reg_class xtensa_regno_to_class (int regno); extern enum reg_class xtensa_regno_to_class (int regno);
extern HOST_WIDE_INT xtensa_initial_elimination_offset (int from, int to);
#endif /* !__XTENSA_PROTOS_H__ */ #endif /* !__XTENSA_PROTOS_H__ */
...@@ -2676,6 +2676,30 @@ xtensa_frame_pointer_required (void) ...@@ -2676,6 +2676,30 @@ xtensa_frame_pointer_required (void)
return false; return false;
} }
HOST_WIDE_INT
xtensa_initial_elimination_offset (int from, int to)
{
long frame_size = compute_frame_size (get_frame_size ());
HOST_WIDE_INT offset;
switch (from)
{
case FRAME_POINTER_REGNUM:
if (FRAME_GROWS_DOWNWARD)
offset = frame_size - (WINDOW_SIZE * UNITS_PER_WORD)
- cfun->machine->callee_save_size;
else
offset = 0;
break;
case ARG_POINTER_REGNUM:
offset = frame_size;
break;
default:
gcc_unreachable ();
}
return offset;
}
/* minimum frame = reg save area (4 words) plus static chain (1 word) /* minimum frame = reg save area (4 words) plus static chain (1 word)
and the total number of words must be a multiple of 128 bits. */ and the total number of words must be a multiple of 128 bits. */
......
...@@ -460,9 +460,11 @@ enum reg_class ...@@ -460,9 +460,11 @@ enum reg_class
#define STACK_GROWS_DOWNWARD 1 #define STACK_GROWS_DOWNWARD 1
#define FRAME_GROWS_DOWNWARD flag_stack_protect
/* Offset within stack frame to start allocating local variables at. */ /* Offset within stack frame to start allocating local variables at. */
#define STARTING_FRAME_OFFSET \ #define STARTING_FRAME_OFFSET \
crtl->outgoing_args_size (FRAME_GROWS_DOWNWARD ? 0 : crtl->outgoing_args_size)
/* The ARG_POINTER and FRAME_POINTER are not real Xtensa registers, so /* The ARG_POINTER and FRAME_POINTER are not real Xtensa registers, so
they are eliminated to either the stack pointer or hard frame pointer. */ they are eliminated to either the stack pointer or hard frame pointer. */
...@@ -474,20 +476,7 @@ enum reg_class ...@@ -474,20 +476,7 @@ enum reg_class
/* Specify the initial difference between the specified pair of registers. */ /* Specify the initial difference between the specified pair of registers. */
#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
do { \ (OFFSET) = xtensa_initial_elimination_offset ((FROM), (TO))
long frame_size = compute_frame_size (get_frame_size ()); \
switch (FROM) \
{ \
case FRAME_POINTER_REGNUM: \
(OFFSET) = 0; \
break; \
case ARG_POINTER_REGNUM: \
(OFFSET) = frame_size; \
break; \
default: \
gcc_unreachable (); \
} \
} while (0)
/* If defined, the maximum amount of space required for outgoing /* If defined, the maximum amount of space required for outgoing
arguments will be computed and placed into the variable arguments will be computed and placed into the variable
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment