xtensa: add support for SSP
gcc/ 2017-12-05 Max Filippov <jcmvbkbc@gmail.com> Backport from mainline 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: r255421
This commit is contained in:
parent
1247cb582c
commit
6c118c0f70
@ -1,3 +1,18 @@
|
||||
2017-12-05 Max Filippov <jcmvbkbc@gmail.com>
|
||||
|
||||
Backport from mainline
|
||||
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-12-04 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* config/sparc/sparc.c (sparc_do_work_around_errata): Use mem_ref
|
||||
|
@ -73,5 +73,6 @@ extern void xtensa_expand_prologue (void);
|
||||
extern void xtensa_expand_epilogue (void);
|
||||
extern void order_regs_for_local_alloc (void);
|
||||
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__ */
|
||||
|
@ -2678,6 +2678,30 @@ xtensa_frame_pointer_required (void)
|
||||
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)
|
||||
and the total number of words must be a multiple of 128 bits. */
|
||||
|
@ -460,9 +460,11 @@ enum reg_class
|
||||
|
||||
#define STACK_GROWS_DOWNWARD 1
|
||||
|
||||
#define FRAME_GROWS_DOWNWARD flag_stack_protect
|
||||
|
||||
/* Offset within stack frame to start allocating local variables at. */
|
||||
#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
|
||||
they are eliminated to either the stack pointer or hard frame pointer. */
|
||||
@ -474,20 +476,7 @@ enum reg_class
|
||||
|
||||
/* Specify the initial difference between the specified pair of registers. */
|
||||
#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
|
||||
do { \
|
||||
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)
|
||||
(OFFSET) = xtensa_initial_elimination_offset ((FROM), (TO))
|
||||
|
||||
/* If defined, the maximum amount of space required for outgoing
|
||||
arguments will be computed and placed into the variable
|
||||
|
Loading…
Reference in New Issue
Block a user