Skip to content

Commit 11a3b90

Browse files
author
hjl
committed
i386: Move struct ix86_frame to machine_function
Make ix86_frame available to i386 code generation. This is needed to backport the patch set of -mindirect-branch= to mitigate variant #2 of the speculative execution vulnerabilities on x86 processors identified by CVE-2017-5715, aka Spectre. Backport from mainline * config/i386/i386.c (ix86_frame): Moved to ... * config/i386/i386.h (ix86_frame): Here. (machine_function): Add frame. * config/i386/i386.c (ix86_compute_frame_layout): Repace the frame argument with &cfun->machine->frame. (ix86_can_use_return_insn_p): Don't pass &frame to ix86_compute_frame_layout. Copy frame from cfun->machine->frame. (ix86_can_eliminate): Likewise. (ix86_expand_prologue): Likewise. (ix86_expand_epilogue): Likewise. (ix86_expand_split_stack_prologue): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256691 138bc75d-0d04-0410-961f-82ee72b054a4
1 parent 2a1f3dd commit 11a3b90

File tree

3 files changed

+80
-56
lines changed

3 files changed

+80
-56
lines changed

gcc/config/i386/i386.c

Lines changed: 13 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2444,53 +2444,6 @@ struct GTY(()) stack_local_entry {
24442444
struct stack_local_entry *next;
24452445
};
24462446

2447-
/* Structure describing stack frame layout.
2448-
Stack grows downward:
2449-
2450-
[arguments]
2451-
<- ARG_POINTER
2452-
saved pc
2453-
2454-
saved static chain if ix86_static_chain_on_stack
2455-
2456-
saved frame pointer if frame_pointer_needed
2457-
<- HARD_FRAME_POINTER
2458-
[saved regs]
2459-
<- regs_save_offset
2460-
[padding0]
2461-
2462-
[saved SSE regs]
2463-
<- sse_regs_save_offset
2464-
[padding1] |
2465-
| <- FRAME_POINTER
2466-
[va_arg registers] |
2467-
|
2468-
[frame] |
2469-
|
2470-
[padding2] | = to_allocate
2471-
<- STACK_POINTER
2472-
*/
2473-
struct ix86_frame
2474-
{
2475-
int nsseregs;
2476-
int nregs;
2477-
int va_arg_size;
2478-
int red_zone_size;
2479-
int outgoing_arguments_size;
2480-
2481-
/* The offsets relative to ARG_POINTER. */
2482-
HOST_WIDE_INT frame_pointer_offset;
2483-
HOST_WIDE_INT hard_frame_pointer_offset;
2484-
HOST_WIDE_INT stack_pointer_offset;
2485-
HOST_WIDE_INT hfp_save_offset;
2486-
HOST_WIDE_INT reg_save_offset;
2487-
HOST_WIDE_INT sse_reg_save_offset;
2488-
2489-
/* When save_regs_using_mov is set, emit prologue using
2490-
move instead of push instructions. */
2491-
bool save_regs_using_mov;
2492-
};
2493-
24942447
/* Which cpu are we scheduling for. */
24952448
enum attr_cpu ix86_schedule;
24962449

@@ -2582,7 +2535,7 @@ static unsigned int ix86_function_arg_boundary (machine_mode,
25822535
const_tree);
25832536
static rtx ix86_static_chain (const_tree, bool);
25842537
static int ix86_function_regparm (const_tree, const_tree);
2585-
static void ix86_compute_frame_layout (struct ix86_frame *);
2538+
static void ix86_compute_frame_layout (void);
25862539
static bool ix86_expand_vector_init_one_nonzero (bool, machine_mode,
25872540
rtx, rtx, int);
25882541
static void ix86_add_new_builtins (HOST_WIDE_INT, HOST_WIDE_INT);
@@ -11903,7 +11856,8 @@ ix86_can_use_return_insn_p (void)
1190311856
if (crtl->args.pops_args && crtl->args.size >= 32768)
1190411857
return 0;
1190511858

11906-
ix86_compute_frame_layout (&frame);
11859+
ix86_compute_frame_layout ();
11860+
frame = cfun->machine->frame;
1190711861
return (frame.stack_pointer_offset == UNITS_PER_WORD
1190811862
&& (frame.nregs + frame.nsseregs) == 0);
1190911863
}
@@ -12389,8 +12343,8 @@ ix86_can_eliminate (const int from, const int to)
1238912343
HOST_WIDE_INT
1239012344
ix86_initial_elimination_offset (int from, int to)
1239112345
{
12392-
struct ix86_frame frame;
12393-
ix86_compute_frame_layout (&frame);
12346+
ix86_compute_frame_layout ();
12347+
struct ix86_frame frame = cfun->machine->frame;
1239412348

1239512349
if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
1239612350
return frame.hard_frame_pointer_offset;
@@ -12429,8 +12383,9 @@ ix86_builtin_setjmp_frame_value (void)
1242912383
/* Fill structure ix86_frame about frame of currently computed function. */
1243012384

1243112385
static void
12432-
ix86_compute_frame_layout (struct ix86_frame *frame)
12386+
ix86_compute_frame_layout (void)
1243312387
{
12388+
struct ix86_frame *frame = &cfun->machine->frame;
1243412389
unsigned HOST_WIDE_INT stack_alignment_needed;
1243512390
HOST_WIDE_INT offset;
1243612391
unsigned HOST_WIDE_INT preferred_alignment;
@@ -13737,7 +13692,8 @@ ix86_expand_prologue (void)
1373713692
m->fs.sp_offset = INCOMING_FRAME_SP_OFFSET;
1373813693
m->fs.sp_valid = true;
1373913694

13740-
ix86_compute_frame_layout (&frame);
13695+
ix86_compute_frame_layout ();
13696+
frame = m->frame;
1374113697

1374213698
if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl))
1374313699
{
@@ -14405,7 +14361,8 @@ ix86_expand_epilogue (int style)
1440514361
bool using_drap;
1440614362

1440714363
ix86_finalize_stack_realign_flags ();
14408-
ix86_compute_frame_layout (&frame);
14364+
ix86_compute_frame_layout ();
14365+
frame = m->frame;
1440914366

1441014367
m->fs.sp_valid = (!frame_pointer_needed
1441114368
|| (crtl->sp_is_unchanging
@@ -14915,7 +14872,8 @@ ix86_expand_split_stack_prologue (void)
1491514872
gcc_assert (flag_split_stack && reload_completed);
1491614873

1491714874
ix86_finalize_stack_realign_flags ();
14918-
ix86_compute_frame_layout (&frame);
14875+
ix86_compute_frame_layout ();
14876+
frame = cfun->machine->frame;
1491914877
allocate = frame.stack_pointer_offset - INCOMING_FRAME_SP_OFFSET;
1492014878

1492114879
/* This is the label we will branch to if we have enough stack

gcc/config/i386/i386.h

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2451,9 +2451,56 @@ enum avx_u128_state
24512451

24522452
#define FASTCALL_PREFIX '@'
24532453

2454+
#ifndef USED_FOR_TARGET
2455+
/* Structure describing stack frame layout.
2456+
Stack grows downward:
2457+
2458+
[arguments]
2459+
<- ARG_POINTER
2460+
saved pc
2461+
2462+
saved static chain if ix86_static_chain_on_stack
2463+
2464+
saved frame pointer if frame_pointer_needed
2465+
<- HARD_FRAME_POINTER
2466+
[saved regs]
2467+
<- regs_save_offset
2468+
[padding0]
2469+
2470+
[saved SSE regs]
2471+
<- sse_regs_save_offset
2472+
[padding1] |
2473+
| <- FRAME_POINTER
2474+
[va_arg registers] |
2475+
|
2476+
[frame] |
2477+
|
2478+
[padding2] | = to_allocate
2479+
<- STACK_POINTER
2480+
*/
2481+
struct GTY(()) ix86_frame
2482+
{
2483+
int nsseregs;
2484+
int nregs;
2485+
int va_arg_size;
2486+
int red_zone_size;
2487+
int outgoing_arguments_size;
2488+
2489+
/* The offsets relative to ARG_POINTER. */
2490+
HOST_WIDE_INT frame_pointer_offset;
2491+
HOST_WIDE_INT hard_frame_pointer_offset;
2492+
HOST_WIDE_INT stack_pointer_offset;
2493+
HOST_WIDE_INT hfp_save_offset;
2494+
HOST_WIDE_INT reg_save_offset;
2495+
HOST_WIDE_INT sse_reg_save_offset;
2496+
2497+
/* When save_regs_using_mov is set, emit prologue using
2498+
move instead of push instructions. */
2499+
bool save_regs_using_mov;
2500+
};
2501+
24542502
/* Machine specific frame tracking during prologue/epilogue generation. */
24552503

2456-
#ifndef USED_FOR_TARGET
24572504
struct GTY(()) machine_frame_state
24582505
{
24592506
/* This pair tracks the currently active CFA as reg+offset. When reg
@@ -2512,6 +2559,9 @@ struct GTY(()) machine_function {
25122559
int varargs_fpr_size;
25132560
int optimize_mode_switching[MAX_386_ENTITIES];
25142561

2562+
/* Cached initial frame layout for the current function. */
2563+
struct ix86_frame frame;
2564+
25152565
/* Number of saved registers USE_FAST_PROLOGUE_EPILOGUE
25162566
has been computed for. */
25172567
int use_fast_prologue_epilogue_nregs;
@@ -2594,6 +2644,7 @@ struct GTY(()) machine_function {
25942644
#define ix86_current_function_calls_tls_descriptor \
25952645
(ix86_tls_descriptor_calls_expanded_in_cfun && df_regs_ever_live_p (SP_REG))
25962646
#define ix86_static_chain_on_stack (cfun->machine->static_chain_on_stack)
2647+
#define ix86_red_zone_size (cfun->machine->frame.red_zone_size)
25972648

25982649
/* Control behavior of x86_file_start. */
25992650
#define X86_FILE_START_VERSION_DIRECTIVE false

gcc/testsuite/ChangeLog

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1+
2018-01-15 H.J. Lu <[email protected]>
2+
3+
Backport from mainline
4+
* config/i386/i386.c (ix86_frame): Moved to ...
5+
* config/i386/i386.h (ix86_frame): Here.
6+
(machine_function): Add frame.
7+
* config/i386/i386.c (ix86_compute_frame_layout): Repace the
8+
frame argument with &cfun->machine->frame.
9+
(ix86_can_use_return_insn_p): Don't pass &frame to
10+
ix86_compute_frame_layout. Copy frame from cfun->machine->frame.
11+
(ix86_can_eliminate): Likewise.
12+
(ix86_expand_prologue): Likewise.
13+
(ix86_expand_epilogue): Likewise.
14+
(ix86_expand_split_stack_prologue): Likewise.
15+
116
2018-01-14 Jerry DeLisle <[email protected]>
217

318
Backport from trunk

0 commit comments

Comments
 (0)