5cef6135da
Copy Alpine's gcc6 aport to temp. They don't have it built for aarch64 and armhf at the moment. Due to dependency checks, this means we can't build the kernels that need gcc6, even when cross compiling with gcc6-armhf etc. See #138 for details.
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
|
||
|