Skip to content

Commit 922c222

Browse files
hjljw4242
authored andcommitted
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 gcc-mirror#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 45dd06c commit 922c222

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
@@ -2434,53 +2434,6 @@ struct GTY(()) stack_local_entry {
24342434
struct stack_local_entry *next;
24352435
};
24362436

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

@@ -2572,7 +2525,7 @@ static unsigned int ix86_function_arg_boundary (machine_mode,
25722525
const_tree);
25732526
static rtx ix86_static_chain (const_tree, bool);
25742527
static int ix86_function_regparm (const_tree, const_tree);
2575-
static void ix86_compute_frame_layout (struct ix86_frame *);
2528+
static void ix86_compute_frame_layout (void);
25762529
static bool ix86_expand_vector_init_one_nonzero (bool, machine_mode,
25772530
rtx, rtx, int);
25782531
static void ix86_add_new_builtins (HOST_WIDE_INT);
@@ -10937,7 +10890,8 @@ ix86_can_use_return_insn_p (void)
1093710890
if (crtl->args.pops_args && crtl->args.size >= 32768)
1093810891
return 0;
1093910892

10940-
ix86_compute_frame_layout (&frame);
10893+
ix86_compute_frame_layout ();
10894+
frame = cfun->machine->frame;
1094110895
return (frame.stack_pointer_offset == UNITS_PER_WORD
1094210896
&& (frame.nregs + frame.nsseregs) == 0);
1094310897
}
@@ -11348,8 +11302,8 @@ ix86_can_eliminate (const int from, const int to)
1134811302
HOST_WIDE_INT
1134911303
ix86_initial_elimination_offset (int from, int to)
1135011304
{
11351-
struct ix86_frame frame;
11352-
ix86_compute_frame_layout (&frame);
11305+
ix86_compute_frame_layout ();
11306+
struct ix86_frame frame = cfun->machine->frame;
1135311307

1135411308
if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
1135511309
return frame.hard_frame_pointer_offset;
@@ -11388,8 +11342,9 @@ ix86_builtin_setjmp_frame_value (void)
1138811342
/* Fill structure ix86_frame about frame of currently computed function. */
1138911343

1139011344
static void
11391-
ix86_compute_frame_layout (struct ix86_frame *frame)
11345+
ix86_compute_frame_layout (void)
1139211346
{
11347+
struct ix86_frame *frame = &cfun->machine->frame;
1139311348
unsigned HOST_WIDE_INT stack_alignment_needed;
1139411349
HOST_WIDE_INT offset;
1139511350
unsigned HOST_WIDE_INT preferred_alignment;
@@ -12695,7 +12650,8 @@ ix86_expand_prologue (void)
1269512650
m->fs.sp_offset = INCOMING_FRAME_SP_OFFSET;
1269612651
m->fs.sp_valid = true;
1269712652

12698-
ix86_compute_frame_layout (&frame);
12653+
ix86_compute_frame_layout ();
12654+
frame = m->frame;
1269912655

1270012656
if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl))
1270112657
{
@@ -13372,7 +13328,8 @@ ix86_expand_epilogue (int style)
1337213328
bool using_drap;
1337313329

1337413330
ix86_finalize_stack_realign_flags ();
13375-
ix86_compute_frame_layout (&frame);
13331+
ix86_compute_frame_layout ();
13332+
frame = m->frame;
1337613333

1337713334
m->fs.sp_valid = (!frame_pointer_needed
1337813335
|| (crtl->sp_is_unchanging
@@ -13869,7 +13826,8 @@ ix86_expand_split_stack_prologue (void)
1386913826
gcc_assert (flag_split_stack && reload_completed);
1387013827

1387113828
ix86_finalize_stack_realign_flags ();
13872-
ix86_compute_frame_layout (&frame);
13829+
ix86_compute_frame_layout ();
13830+
frame = cfun->machine->frame;
1387313831
allocate = frame.stack_pointer_offset - INCOMING_FRAME_SP_OFFSET;
1387413832

1387513833
/* 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
@@ -2422,9 +2422,56 @@ enum avx_u128_state
24222422

24232423
#define FASTCALL_PREFIX '@'
24242424

2425+
#ifndef USED_FOR_TARGET
2426+
/* Structure describing stack frame layout.
2427+
Stack grows downward:
2428+
2429+
[arguments]
2430+
<- ARG_POINTER
2431+
saved pc
2432+
2433+
saved static chain if ix86_static_chain_on_stack
2434+
2435+
saved frame pointer if frame_pointer_needed
2436+
<- HARD_FRAME_POINTER
2437+
[saved regs]
2438+
<- regs_save_offset
2439+
[padding0]
2440+
2441+
[saved SSE regs]
2442+
<- sse_regs_save_offset
2443+
[padding1] |
2444+
| <- FRAME_POINTER
2445+
[va_arg registers] |
2446+
|
2447+
[frame] |
2448+
|
2449+
[padding2] | = to_allocate
2450+
<- STACK_POINTER
2451+
*/
2452+
struct GTY(()) ix86_frame
2453+
{
2454+
int nsseregs;
2455+
int nregs;
2456+
int va_arg_size;
2457+
int red_zone_size;
2458+
int outgoing_arguments_size;
2459+
2460+
/* The offsets relative to ARG_POINTER. */
2461+
HOST_WIDE_INT frame_pointer_offset;
2462+
HOST_WIDE_INT hard_frame_pointer_offset;
2463+
HOST_WIDE_INT stack_pointer_offset;
2464+
HOST_WIDE_INT hfp_save_offset;
2465+
HOST_WIDE_INT reg_save_offset;
2466+
HOST_WIDE_INT sse_reg_save_offset;
2467+
2468+
/* When save_regs_using_mov is set, emit prologue using
2469+
move instead of push instructions. */
2470+
bool save_regs_using_mov;
2471+
};
2472+
24252473
/* Machine specific frame tracking during prologue/epilogue generation. */
24262474

2427-
#ifndef USED_FOR_TARGET
24282475
struct GTY(()) machine_frame_state
24292476
{
24302477
/* This pair tracks the currently active CFA as reg+offset. When reg
@@ -2470,6 +2517,9 @@ struct GTY(()) machine_function {
24702517
int varargs_fpr_size;
24712518
int optimize_mode_switching[MAX_386_ENTITIES];
24722519

2520+
/* Cached initial frame layout for the current function. */
2521+
struct ix86_frame frame;
2522+
24732523
/* Number of saved registers USE_FAST_PROLOGUE_EPILOGUE
24742524
has been computed for. */
24752525
int use_fast_prologue_epilogue_nregs;
@@ -2549,6 +2599,7 @@ struct GTY(()) machine_function {
25492599
#define ix86_current_function_calls_tls_descriptor \
25502600
(ix86_tls_descriptor_calls_expanded_in_cfun && df_regs_ever_live_p (SP_REG))
25512601
#define ix86_static_chain_on_stack (cfun->machine->static_chain_on_stack)
2602+
#define ix86_red_zone_size (cfun->machine->frame.red_zone_size)
25522603

25532604
/* Control behavior of x86_file_start. */
25542605
#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
2017-07-04 Release Manager
217

318
* GCC 6.4.0 released.

0 commit comments

Comments
 (0)