241 lines
7.6 KiB
Diff
241 lines
7.6 KiB
Diff
From b1d2df5090abc9202a7bf2d224ac90de22908d21 Mon Sep 17 00:00:00 2001
|
||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
||
Date: Mon, 15 Jan 2018 11:27:24 +0000
|
||
Subject: [PATCH 01/13] 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
|
||
2017-06-01 Bernd Edlinger <bernd.edlinger@hotmail.de>
|
||
|
||
* 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.
|
||
---
|
||
gcc/config/i386/i386.c | 68 ++++++++++----------------------------------------
|
||
gcc/config/i386/i386.h | 53 ++++++++++++++++++++++++++++++++++++++-
|
||
2 files changed, 65 insertions(+), 56 deletions(-)
|
||
|
||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
||
index 8b5faac5129..a1ff32b648b 100644
|
||
--- a/gcc/config/i386/i386.c
|
||
+++ b/gcc/config/i386/i386.c
|
||
@@ -2434,53 +2434,6 @@ struct GTY(()) stack_local_entry {
|
||
struct stack_local_entry *next;
|
||
};
|
||
|
||
-/* Structure describing stack frame layout.
|
||
- Stack grows downward:
|
||
-
|
||
- [arguments]
|
||
- <- ARG_POINTER
|
||
- saved pc
|
||
-
|
||
- saved static chain if ix86_static_chain_on_stack
|
||
-
|
||
- saved frame pointer if frame_pointer_needed
|
||
- <- HARD_FRAME_POINTER
|
||
- [saved regs]
|
||
- <- regs_save_offset
|
||
- [padding0]
|
||
-
|
||
- [saved SSE regs]
|
||
- <- sse_regs_save_offset
|
||
- [padding1] |
|
||
- | <- FRAME_POINTER
|
||
- [va_arg registers] |
|
||
- |
|
||
- [frame] |
|
||
- |
|
||
- [padding2] | = to_allocate
|
||
- <- STACK_POINTER
|
||
- */
|
||
-struct ix86_frame
|
||
-{
|
||
- int nsseregs;
|
||
- int nregs;
|
||
- int va_arg_size;
|
||
- int red_zone_size;
|
||
- int outgoing_arguments_size;
|
||
-
|
||
- /* The offsets relative to ARG_POINTER. */
|
||
- HOST_WIDE_INT frame_pointer_offset;
|
||
- HOST_WIDE_INT hard_frame_pointer_offset;
|
||
- HOST_WIDE_INT stack_pointer_offset;
|
||
- HOST_WIDE_INT hfp_save_offset;
|
||
- HOST_WIDE_INT reg_save_offset;
|
||
- HOST_WIDE_INT sse_reg_save_offset;
|
||
-
|
||
- /* When save_regs_using_mov is set, emit prologue using
|
||
- move instead of push instructions. */
|
||
- bool save_regs_using_mov;
|
||
-};
|
||
-
|
||
/* Which cpu are we scheduling for. */
|
||
enum attr_cpu ix86_schedule;
|
||
|
||
@@ -2572,7 +2525,7 @@ static unsigned int ix86_function_arg_boundary (machine_mode,
|
||
const_tree);
|
||
static rtx ix86_static_chain (const_tree, bool);
|
||
static int ix86_function_regparm (const_tree, const_tree);
|
||
-static void ix86_compute_frame_layout (struct ix86_frame *);
|
||
+static void ix86_compute_frame_layout (void);
|
||
static bool ix86_expand_vector_init_one_nonzero (bool, machine_mode,
|
||
rtx, rtx, int);
|
||
static void ix86_add_new_builtins (HOST_WIDE_INT);
|
||
@@ -10944,7 +10897,8 @@ ix86_can_use_return_insn_p (void)
|
||
if (crtl->args.pops_args && crtl->args.size >= 32768)
|
||
return 0;
|
||
|
||
- ix86_compute_frame_layout (&frame);
|
||
+ ix86_compute_frame_layout ();
|
||
+ frame = cfun->machine->frame;
|
||
return (frame.stack_pointer_offset == UNITS_PER_WORD
|
||
&& (frame.nregs + frame.nsseregs) == 0);
|
||
}
|
||
@@ -11355,8 +11309,8 @@ ix86_can_eliminate (const int from, const int to)
|
||
HOST_WIDE_INT
|
||
ix86_initial_elimination_offset (int from, int to)
|
||
{
|
||
- struct ix86_frame frame;
|
||
- ix86_compute_frame_layout (&frame);
|
||
+ ix86_compute_frame_layout ();
|
||
+ struct ix86_frame frame = cfun->machine->frame;
|
||
|
||
if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
|
||
return frame.hard_frame_pointer_offset;
|
||
@@ -11395,8 +11349,9 @@ ix86_builtin_setjmp_frame_value (void)
|
||
/* Fill structure ix86_frame about frame of currently computed function. */
|
||
|
||
static void
|
||
-ix86_compute_frame_layout (struct ix86_frame *frame)
|
||
+ix86_compute_frame_layout (void)
|
||
{
|
||
+ struct ix86_frame *frame = &cfun->machine->frame;
|
||
unsigned HOST_WIDE_INT stack_alignment_needed;
|
||
HOST_WIDE_INT offset;
|
||
unsigned HOST_WIDE_INT preferred_alignment;
|
||
@@ -12702,7 +12657,8 @@ ix86_expand_prologue (void)
|
||
m->fs.sp_offset = INCOMING_FRAME_SP_OFFSET;
|
||
m->fs.sp_valid = true;
|
||
|
||
- ix86_compute_frame_layout (&frame);
|
||
+ ix86_compute_frame_layout ();
|
||
+ frame = m->frame;
|
||
|
||
if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl))
|
||
{
|
||
@@ -13379,7 +13335,8 @@ ix86_expand_epilogue (int style)
|
||
bool using_drap;
|
||
|
||
ix86_finalize_stack_realign_flags ();
|
||
- ix86_compute_frame_layout (&frame);
|
||
+ ix86_compute_frame_layout ();
|
||
+ frame = m->frame;
|
||
|
||
m->fs.sp_valid = (!frame_pointer_needed
|
||
|| (crtl->sp_is_unchanging
|
||
@@ -13876,7 +13833,8 @@ ix86_expand_split_stack_prologue (void)
|
||
gcc_assert (flag_split_stack && reload_completed);
|
||
|
||
ix86_finalize_stack_realign_flags ();
|
||
- ix86_compute_frame_layout (&frame);
|
||
+ ix86_compute_frame_layout ();
|
||
+ frame = cfun->machine->frame;
|
||
allocate = frame.stack_pointer_offset - INCOMING_FRAME_SP_OFFSET;
|
||
|
||
/* This is the label we will branch to if we have enough stack
|
||
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
|
||
index 8113f83c7fd..54144166172 100644
|
||
--- a/gcc/config/i386/i386.h
|
||
+++ b/gcc/config/i386/i386.h
|
||
@@ -2427,9 +2427,56 @@ enum avx_u128_state
|
||
|
||
#define FASTCALL_PREFIX '@'
|
||
|
||
+#ifndef USED_FOR_TARGET
|
||
+/* Structure describing stack frame layout.
|
||
+ Stack grows downward:
|
||
+
|
||
+ [arguments]
|
||
+ <- ARG_POINTER
|
||
+ saved pc
|
||
+
|
||
+ saved static chain if ix86_static_chain_on_stack
|
||
+
|
||
+ saved frame pointer if frame_pointer_needed
|
||
+ <- HARD_FRAME_POINTER
|
||
+ [saved regs]
|
||
+ <- regs_save_offset
|
||
+ [padding0]
|
||
+
|
||
+ [saved SSE regs]
|
||
+ <- sse_regs_save_offset
|
||
+ [padding1] |
|
||
+ | <- FRAME_POINTER
|
||
+ [va_arg registers] |
|
||
+ |
|
||
+ [frame] |
|
||
+ |
|
||
+ [padding2] | = to_allocate
|
||
+ <- STACK_POINTER
|
||
+ */
|
||
+struct GTY(()) ix86_frame
|
||
+{
|
||
+ int nsseregs;
|
||
+ int nregs;
|
||
+ int va_arg_size;
|
||
+ int red_zone_size;
|
||
+ int outgoing_arguments_size;
|
||
+
|
||
+ /* The offsets relative to ARG_POINTER. */
|
||
+ HOST_WIDE_INT frame_pointer_offset;
|
||
+ HOST_WIDE_INT hard_frame_pointer_offset;
|
||
+ HOST_WIDE_INT stack_pointer_offset;
|
||
+ HOST_WIDE_INT hfp_save_offset;
|
||
+ HOST_WIDE_INT reg_save_offset;
|
||
+ HOST_WIDE_INT sse_reg_save_offset;
|
||
+
|
||
+ /* When save_regs_using_mov is set, emit prologue using
|
||
+ move instead of push instructions. */
|
||
+ bool save_regs_using_mov;
|
||
+};
|
||
+
|
||
/* Machine specific frame tracking during prologue/epilogue generation. */
|
||
|
||
-#ifndef USED_FOR_TARGET
|
||
struct GTY(()) machine_frame_state
|
||
{
|
||
/* This pair tracks the currently active CFA as reg+offset. When reg
|
||
@@ -2475,6 +2522,9 @@ struct GTY(()) machine_function {
|
||
int varargs_fpr_size;
|
||
int optimize_mode_switching[MAX_386_ENTITIES];
|
||
|
||
+ /* Cached initial frame layout for the current function. */
|
||
+ struct ix86_frame frame;
|
||
+
|
||
/* Number of saved registers USE_FAST_PROLOGUE_EPILOGUE
|
||
has been computed for. */
|
||
int use_fast_prologue_epilogue_nregs;
|
||
@@ -2554,6 +2604,7 @@ struct GTY(()) machine_function {
|
||
#define ix86_current_function_calls_tls_descriptor \
|
||
(ix86_tls_descriptor_calls_expanded_in_cfun && df_regs_ever_live_p (SP_REG))
|
||
#define ix86_static_chain_on_stack (cfun->machine->static_chain_on_stack)
|
||
+#define ix86_red_zone_size (cfun->machine->frame.red_zone_size)
|
||
|
||
/* Control behavior of x86_file_start. */
|
||
#define X86_FILE_START_VERSION_DIRECTIVE false
|
||
--
|
||
2.16.3
|
||
|