temp/gcc6: add until Alpine builds it for arm
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.
This commit is contained in:
parent
ee659a5bb4
commit
5cef6135da
48 changed files with 9590 additions and 0 deletions
|
@ -0,0 +1,241 @@
|
|||
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
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
From b1fc91cda7c15264116f3dde6944ead149123653 Mon Sep 17 00:00:00 2001
|
||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
||||
Date: Mon, 15 Jan 2018 11:28:44 +0000
|
||||
Subject: [PATCH 02/13] i386: Use reference of struct ix86_frame to avoid copy
|
||||
|
||||
When there is no need to make a copy of ix86_frame, we can use reference
|
||||
of struct ix86_frame to avoid copy.
|
||||
|
||||
Backport from mainline
|
||||
2017-11-06 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* config/i386/i386.c (ix86_can_use_return_insn_p): Use reference
|
||||
of struct ix86_frame.
|
||||
(ix86_initial_elimination_offset): Likewise.
|
||||
(ix86_expand_split_stack_prologue): Likewise.
|
||||
---
|
||||
gcc/config/i386/i386.c | 8 +++-----
|
||||
1 file changed, 3 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
||||
index a1ff32b648b..13ebf107e90 100644
|
||||
--- a/gcc/config/i386/i386.c
|
||||
+++ b/gcc/config/i386/i386.c
|
||||
@@ -10887,7 +10887,6 @@ symbolic_reference_mentioned_p (rtx op)
|
||||
bool
|
||||
ix86_can_use_return_insn_p (void)
|
||||
{
|
||||
- struct ix86_frame frame;
|
||||
|
||||
if (! reload_completed || frame_pointer_needed)
|
||||
return 0;
|
||||
@@ -10898,7 +10897,7 @@ ix86_can_use_return_insn_p (void)
|
||||
return 0;
|
||||
|
||||
ix86_compute_frame_layout ();
|
||||
- frame = cfun->machine->frame;
|
||||
+ struct ix86_frame &frame = cfun->machine->frame;
|
||||
return (frame.stack_pointer_offset == UNITS_PER_WORD
|
||||
&& (frame.nregs + frame.nsseregs) == 0);
|
||||
}
|
||||
@@ -11310,7 +11309,7 @@ HOST_WIDE_INT
|
||||
ix86_initial_elimination_offset (int from, int to)
|
||||
{
|
||||
ix86_compute_frame_layout ();
|
||||
- struct ix86_frame frame = cfun->machine->frame;
|
||||
+ struct ix86_frame &frame = cfun->machine->frame;
|
||||
|
||||
if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
|
||||
return frame.hard_frame_pointer_offset;
|
||||
@@ -13821,7 +13820,6 @@ static GTY(()) rtx split_stack_fn_large;
|
||||
void
|
||||
ix86_expand_split_stack_prologue (void)
|
||||
{
|
||||
- struct ix86_frame frame;
|
||||
HOST_WIDE_INT allocate;
|
||||
unsigned HOST_WIDE_INT args_size;
|
||||
rtx_code_label *label;
|
||||
@@ -13834,7 +13832,7 @@ ix86_expand_split_stack_prologue (void)
|
||||
|
||||
ix86_finalize_stack_realign_flags ();
|
||||
ix86_compute_frame_layout ();
|
||||
- frame = cfun->machine->frame;
|
||||
+ struct ix86_frame &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
|
||||
--
|
||||
2.16.3
|
||||
|
|
@ -0,0 +1,126 @@
|
|||
From 3e39c0a8053b3e960cf4c3aea3c814e7dc97cfd6 Mon Sep 17 00:00:00 2001
|
||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
||||
Date: Sat, 27 Jan 2018 13:10:24 +0000
|
||||
Subject: [PATCH 03/13] i386: Use const reference of struct ix86_frame to avoid
|
||||
copy
|
||||
|
||||
We can use const reference of struct ix86_frame to avoid making a local
|
||||
copy of ix86_frame. ix86_expand_epilogue makes a local copy of struct
|
||||
ix86_frame and uses the reg_save_offset field as a local variable. This
|
||||
patch uses a separate local variable for reg_save_offset.
|
||||
|
||||
Tested on x86-64 with ada.
|
||||
|
||||
Backport from mainline
|
||||
PR target/83905
|
||||
* config/i386/i386.c (ix86_expand_prologue): Use cost reference
|
||||
of struct ix86_frame.
|
||||
(ix86_expand_epilogue): Likewise. Add a local variable for
|
||||
the reg_save_offset field in struct ix86_frame.
|
||||
|
||||
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@257123 138bc75d-0d04-0410-961f-82ee72b054a4
|
||||
---
|
||||
gcc/config/i386/i386.c | 24 ++++++++++++------------
|
||||
1 file changed, 12 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
||||
index 13ebf107e90..6c98f7581e2 100644
|
||||
--- a/gcc/config/i386/i386.c
|
||||
+++ b/gcc/config/i386/i386.c
|
||||
@@ -12633,7 +12633,6 @@ ix86_expand_prologue (void)
|
||||
{
|
||||
struct machine_function *m = cfun->machine;
|
||||
rtx insn, t;
|
||||
- struct ix86_frame frame;
|
||||
HOST_WIDE_INT allocate;
|
||||
bool int_registers_saved;
|
||||
bool sse_registers_saved;
|
||||
@@ -12657,7 +12656,7 @@ ix86_expand_prologue (void)
|
||||
m->fs.sp_valid = true;
|
||||
|
||||
ix86_compute_frame_layout ();
|
||||
- frame = m->frame;
|
||||
+ const struct ix86_frame &frame = cfun->machine->frame;
|
||||
|
||||
if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl))
|
||||
{
|
||||
@@ -13329,13 +13328,12 @@ ix86_expand_epilogue (int style)
|
||||
{
|
||||
struct machine_function *m = cfun->machine;
|
||||
struct machine_frame_state frame_state_save = m->fs;
|
||||
- struct ix86_frame frame;
|
||||
bool restore_regs_via_mov;
|
||||
bool using_drap;
|
||||
|
||||
ix86_finalize_stack_realign_flags ();
|
||||
ix86_compute_frame_layout ();
|
||||
- frame = m->frame;
|
||||
+ const struct ix86_frame &frame = cfun->machine->frame;
|
||||
|
||||
m->fs.sp_valid = (!frame_pointer_needed
|
||||
|| (crtl->sp_is_unchanging
|
||||
@@ -13377,11 +13375,13 @@ ix86_expand_epilogue (int style)
|
||||
+ UNITS_PER_WORD);
|
||||
}
|
||||
|
||||
+ HOST_WIDE_INT reg_save_offset = frame.reg_save_offset;
|
||||
+
|
||||
/* Special care must be taken for the normal return case of a function
|
||||
using eh_return: the eax and edx registers are marked as saved, but
|
||||
not restored along this path. Adjust the save location to match. */
|
||||
if (crtl->calls_eh_return && style != 2)
|
||||
- frame.reg_save_offset -= 2 * UNITS_PER_WORD;
|
||||
+ reg_save_offset -= 2 * UNITS_PER_WORD;
|
||||
|
||||
/* EH_RETURN requires the use of moves to function properly. */
|
||||
if (crtl->calls_eh_return)
|
||||
@@ -13397,11 +13397,11 @@ ix86_expand_epilogue (int style)
|
||||
else if (TARGET_EPILOGUE_USING_MOVE
|
||||
&& cfun->machine->use_fast_prologue_epilogue
|
||||
&& (frame.nregs > 1
|
||||
- || m->fs.sp_offset != frame.reg_save_offset))
|
||||
+ || m->fs.sp_offset != reg_save_offset))
|
||||
restore_regs_via_mov = true;
|
||||
else if (frame_pointer_needed
|
||||
&& !frame.nregs
|
||||
- && m->fs.sp_offset != frame.reg_save_offset)
|
||||
+ && m->fs.sp_offset != reg_save_offset)
|
||||
restore_regs_via_mov = true;
|
||||
else if (frame_pointer_needed
|
||||
&& TARGET_USE_LEAVE
|
||||
@@ -13439,7 +13439,7 @@ ix86_expand_epilogue (int style)
|
||||
rtx t;
|
||||
|
||||
if (frame.nregs)
|
||||
- ix86_emit_restore_regs_using_mov (frame.reg_save_offset, style == 2);
|
||||
+ ix86_emit_restore_regs_using_mov (reg_save_offset, style == 2);
|
||||
|
||||
/* eh_return epilogues need %ecx added to the stack pointer. */
|
||||
if (style == 2)
|
||||
@@ -13529,19 +13529,19 @@ ix86_expand_epilogue (int style)
|
||||
epilogues. */
|
||||
if (!m->fs.sp_valid
|
||||
|| (TARGET_SEH
|
||||
- && (m->fs.sp_offset - frame.reg_save_offset
|
||||
+ && (m->fs.sp_offset - reg_save_offset
|
||||
>= SEH_MAX_FRAME_SIZE)))
|
||||
{
|
||||
pro_epilogue_adjust_stack (stack_pointer_rtx, hard_frame_pointer_rtx,
|
||||
GEN_INT (m->fs.fp_offset
|
||||
- - frame.reg_save_offset),
|
||||
+ - reg_save_offset),
|
||||
style, false);
|
||||
}
|
||||
- else if (m->fs.sp_offset != frame.reg_save_offset)
|
||||
+ else if (m->fs.sp_offset != reg_save_offset)
|
||||
{
|
||||
pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
|
||||
GEN_INT (m->fs.sp_offset
|
||||
- - frame.reg_save_offset),
|
||||
+ - reg_save_offset),
|
||||
style,
|
||||
m->fs.cfa_reg == stack_pointer_rtx);
|
||||
}
|
||||
--
|
||||
2.16.3
|
||||
|
2149
temp/gcc6/0004-x86-Add-mindirect-branch.patch
Normal file
2149
temp/gcc6/0004-x86-Add-mindirect-branch.patch
Normal file
File diff suppressed because it is too large
Load diff
1565
temp/gcc6/0005-x86-Add-mfunction-return.patch
Normal file
1565
temp/gcc6/0005-x86-Add-mfunction-return.patch
Normal file
File diff suppressed because it is too large
Load diff
941
temp/gcc6/0006-x86-Add-mindirect-branch-register.patch
Normal file
941
temp/gcc6/0006-x86-Add-mindirect-branch-register.patch
Normal file
|
@ -0,0 +1,941 @@
|
|||
From 61bb7f0e152ce5be700a44007d036ea0de4b254d Mon Sep 17 00:00:00 2001
|
||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
||||
Date: Sat, 6 Jan 2018 22:29:56 -0800
|
||||
Subject: [PATCH 06/13] x86: Add -mindirect-branch-register
|
||||
|
||||
Add -mindirect-branch-register to force indirect branch via register.
|
||||
This is implemented by disabling patterns of indirect branch via memory,
|
||||
similar to TARGET_X32.
|
||||
|
||||
-mindirect-branch= and -mfunction-return= tests are updated with
|
||||
-mno-indirect-branch-register to avoid false test failures when
|
||||
-mindirect-branch-register is added to RUNTESTFLAGS for "make check".
|
||||
|
||||
gcc/
|
||||
|
||||
Backport from mainline
|
||||
2018-01-14 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* config/i386/constraints.md (Bs): Disallow memory operand for
|
||||
-mindirect-branch-register.
|
||||
(Bw): Likewise.
|
||||
* config/i386/predicates.md (indirect_branch_operand): Likewise.
|
||||
(GOT_memory_operand): Likewise.
|
||||
(call_insn_operand): Likewise.
|
||||
(sibcall_insn_operand): Likewise.
|
||||
(GOT32_symbol_operand): Likewise.
|
||||
* config/i386/i386.md (indirect_jump): Call convert_memory_address
|
||||
for -mindirect-branch-register.
|
||||
(tablejump): Likewise.
|
||||
(*sibcall_memory): Likewise.
|
||||
(*sibcall_value_memory): Likewise.
|
||||
Disallow peepholes of indirect call and jump via memory for
|
||||
-mindirect-branch-register.
|
||||
(*call_pop): Replace m with Bw.
|
||||
(*call_value_pop): Likewise.
|
||||
(*sibcall_pop_memory): Replace m with Bs.
|
||||
* config/i386/i386.opt (mindirect-branch-register): New option.
|
||||
* doc/invoke.texi: Document -mindirect-branch-register option.
|
||||
|
||||
gcc/testsuite/
|
||||
|
||||
Backport from mainline
|
||||
2018-01-14 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* gcc.target/i386/indirect-thunk-1.c (dg-options): Add
|
||||
-mno-indirect-branch-register.
|
||||
* gcc.target/i386/indirect-thunk-2.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-3.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-4.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-5.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-6.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-7.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-attr-1.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-attr-2.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-attr-3.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-attr-4.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-attr-5.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-attr-6.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-attr-7.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-bnd-1.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-bnd-2.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-bnd-3.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-bnd-4.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-extern-1.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-extern-2.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-extern-3.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-extern-4.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-extern-5.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-extern-6.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-extern-7.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-inline-1.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-inline-2.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-inline-3.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-inline-4.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-inline-5.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-inline-6.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-inline-7.c: Likewise.
|
||||
* gcc.target/i386/ret-thunk-10.c: Likewise.
|
||||
* gcc.target/i386/ret-thunk-11.c: Likewise.
|
||||
* gcc.target/i386/ret-thunk-12.c: Likewise.
|
||||
* gcc.target/i386/ret-thunk-13.c: Likewise.
|
||||
* gcc.target/i386/ret-thunk-14.c: Likewise.
|
||||
* gcc.target/i386/ret-thunk-15.c: Likewise.
|
||||
* gcc.target/i386/ret-thunk-9.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-register-1.c: New test.
|
||||
* gcc.target/i386/indirect-thunk-register-2.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-register-3.c: Likewise.
|
||||
|
||||
i386: Rename to ix86_indirect_branch_register
|
||||
|
||||
Rename the variable for -mindirect-branch-register to
|
||||
ix86_indirect_branch_register to match the command-line option name.
|
||||
|
||||
Backport from mainline
|
||||
2018-01-15 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* config/i386/constraints.md (Bs): Replace
|
||||
ix86_indirect_branch_thunk_register with
|
||||
ix86_indirect_branch_register.
|
||||
(Bw): Likewise.
|
||||
* config/i386/i386.md (indirect_jump): Likewise.
|
||||
(tablejump): Likewise.
|
||||
(*sibcall_memory): Likewise.
|
||||
(*sibcall_value_memory): Likewise.
|
||||
Peepholes of indirect call and jump via memory: Likewise.
|
||||
* config/i386/i386.opt: Likewise.
|
||||
* config/i386/predicates.md (indirect_branch_operand): Likewise.
|
||||
(GOT_memory_operand): Likewise.
|
||||
(call_insn_operand): Likewise.
|
||||
(sibcall_insn_operand): Likewise.
|
||||
(GOT32_symbol_operand): Likewise.
|
||||
|
||||
x86: Rewrite ix86_indirect_branch_register logic
|
||||
|
||||
Rewrite ix86_indirect_branch_register logic with
|
||||
|
||||
(and (not (match_test "ix86_indirect_branch_register"))
|
||||
(original condition before r256662))
|
||||
|
||||
Backport from mainline
|
||||
2018-01-15 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* config/i386/predicates.md (constant_call_address_operand):
|
||||
Rewrite ix86_indirect_branch_register logic.
|
||||
(sibcall_insn_operand): Likewise.
|
||||
|
||||
Don't check ix86_indirect_branch_register for GOT operand
|
||||
|
||||
Since GOT_memory_operand and GOT32_symbol_operand are simple pattern
|
||||
matches, don't check ix86_indirect_branch_register here. If needed,
|
||||
-mindirect-branch= will convert indirect branch via GOT slot to a call
|
||||
and return thunk.
|
||||
|
||||
Backport from mainline
|
||||
2018-01-15 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* config/i386/constraints.md (Bs): Update
|
||||
ix86_indirect_branch_register check. Don't check
|
||||
ix86_indirect_branch_register with GOT_memory_operand.
|
||||
(Bw): Likewise.
|
||||
* config/i386/predicates.md (GOT_memory_operand): Don't check
|
||||
ix86_indirect_branch_register here.
|
||||
(GOT32_symbol_operand): Likewise.
|
||||
|
||||
i386: Rewrite indirect_branch_operand logic
|
||||
|
||||
Backport from mainline
|
||||
2018-01-15 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* config/i386/predicates.md (indirect_branch_operand): Rewrite
|
||||
ix86_indirect_branch_register logic.
|
||||
---
|
||||
gcc/config/i386/constraints.md | 6 ++--
|
||||
gcc/config/i386/i386.md | 34 ++++++++++++++--------
|
||||
gcc/config/i386/i386.opt | 4 +++
|
||||
gcc/config/i386/predicates.md | 21 +++++++------
|
||||
gcc/doc/invoke.texi | 6 +++-
|
||||
gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | 2 +-
|
||||
gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | 2 +-
|
||||
gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | 2 +-
|
||||
gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | 2 +-
|
||||
gcc/testsuite/gcc.target/i386/indirect-thunk-5.c | 2 +-
|
||||
gcc/testsuite/gcc.target/i386/indirect-thunk-6.c | 2 +-
|
||||
gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-attr-1.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-attr-2.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-attr-3.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-attr-4.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-attr-5.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-attr-6.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-attr-7.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-bnd-1.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-bnd-2.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-bnd-3.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-bnd-4.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-extern-1.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-extern-2.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-extern-3.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-extern-4.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-extern-5.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-extern-6.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-extern-7.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-inline-1.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-inline-2.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-inline-3.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-inline-4.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-inline-5.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-inline-6.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-inline-7.c | 2 +-
|
||||
.../gcc.target/i386/indirect-thunk-register-1.c | 22 ++++++++++++++
|
||||
.../gcc.target/i386/indirect-thunk-register-2.c | 20 +++++++++++++
|
||||
.../gcc.target/i386/indirect-thunk-register-3.c | 19 ++++++++++++
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-10.c | 2 +-
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-11.c | 2 +-
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-12.c | 2 +-
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-13.c | 2 +-
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-14.c | 2 +-
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-15.c | 2 +-
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-9.c | 2 +-
|
||||
47 files changed, 147 insertions(+), 63 deletions(-)
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c
|
||||
|
||||
diff --git a/gcc/config/i386/constraints.md b/gcc/config/i386/constraints.md
|
||||
index 1a4c701ad13..9204c8e8487 100644
|
||||
--- a/gcc/config/i386/constraints.md
|
||||
+++ b/gcc/config/i386/constraints.md
|
||||
@@ -172,14 +172,16 @@
|
||||
|
||||
(define_constraint "Bs"
|
||||
"@internal Sibcall memory operand."
|
||||
- (ior (and (not (match_test "TARGET_X32"))
|
||||
+ (ior (and (not (match_test "ix86_indirect_branch_register"))
|
||||
+ (not (match_test "TARGET_X32"))
|
||||
(match_operand 0 "sibcall_memory_operand"))
|
||||
(and (match_test "TARGET_X32 && Pmode == DImode")
|
||||
(match_operand 0 "GOT_memory_operand"))))
|
||||
|
||||
(define_constraint "Bw"
|
||||
"@internal Call memory operand."
|
||||
- (ior (and (not (match_test "TARGET_X32"))
|
||||
+ (ior (and (not (match_test "ix86_indirect_branch_register"))
|
||||
+ (not (match_test "TARGET_X32"))
|
||||
(match_operand 0 "memory_operand"))
|
||||
(and (match_test "TARGET_X32 && Pmode == DImode")
|
||||
(match_operand 0 "GOT_memory_operand"))))
|
||||
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
|
||||
index 2da671e9f2d..05a88fff356 100644
|
||||
--- a/gcc/config/i386/i386.md
|
||||
+++ b/gcc/config/i386/i386.md
|
||||
@@ -11805,7 +11805,7 @@
|
||||
[(set (pc) (match_operand 0 "indirect_branch_operand"))]
|
||||
""
|
||||
{
|
||||
- if (TARGET_X32)
|
||||
+ if (TARGET_X32 || ix86_indirect_branch_register)
|
||||
operands[0] = convert_memory_address (word_mode, operands[0]);
|
||||
cfun->machine->has_local_indirect_jump = true;
|
||||
})
|
||||
@@ -11859,7 +11859,7 @@
|
||||
OPTAB_DIRECT);
|
||||
}
|
||||
|
||||
- if (TARGET_X32)
|
||||
+ if (TARGET_X32 || ix86_indirect_branch_register)
|
||||
operands[0] = convert_memory_address (word_mode, operands[0]);
|
||||
cfun->machine->has_local_indirect_jump = true;
|
||||
})
|
||||
@@ -12048,7 +12048,7 @@
|
||||
[(call (mem:QI (match_operand:W 0 "memory_operand" "m"))
|
||||
(match_operand 1))
|
||||
(unspec [(const_int 0)] UNSPEC_PEEPSIB)]
|
||||
- "!TARGET_X32"
|
||||
+ "!TARGET_X32 && !ix86_indirect_branch_register"
|
||||
"* return ix86_output_call_insn (insn, operands[0]);"
|
||||
[(set_attr "type" "call")])
|
||||
|
||||
@@ -12057,7 +12057,9 @@
|
||||
(match_operand:W 1 "memory_operand"))
|
||||
(call (mem:QI (match_dup 0))
|
||||
(match_operand 3))]
|
||||
- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (1))
|
||||
+ "!TARGET_X32
|
||||
+ && !ix86_indirect_branch_register
|
||||
+ && SIBLING_CALL_P (peep2_next_insn (1))
|
||||
&& !reg_mentioned_p (operands[0],
|
||||
CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"
|
||||
[(parallel [(call (mem:QI (match_dup 1))
|
||||
@@ -12070,7 +12072,9 @@
|
||||
(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
|
||||
(call (mem:QI (match_dup 0))
|
||||
(match_operand 3))]
|
||||
- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (2))
|
||||
+ "!TARGET_X32
|
||||
+ && !ix86_indirect_branch_register
|
||||
+ && SIBLING_CALL_P (peep2_next_insn (2))
|
||||
&& !reg_mentioned_p (operands[0],
|
||||
CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"
|
||||
[(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
|
||||
@@ -12092,7 +12096,7 @@
|
||||
})
|
||||
|
||||
(define_insn "*call_pop"
|
||||
- [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lmBz"))
|
||||
+ [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lBwBz"))
|
||||
(match_operand 1))
|
||||
(set (reg:SI SP_REG)
|
||||
(plus:SI (reg:SI SP_REG)
|
||||
@@ -12112,7 +12116,7 @@
|
||||
[(set_attr "type" "call")])
|
||||
|
||||
(define_insn "*sibcall_pop_memory"
|
||||
- [(call (mem:QI (match_operand:SI 0 "memory_operand" "m"))
|
||||
+ [(call (mem:QI (match_operand:SI 0 "memory_operand" "Bs"))
|
||||
(match_operand 1))
|
||||
(set (reg:SI SP_REG)
|
||||
(plus:SI (reg:SI SP_REG)
|
||||
@@ -12166,7 +12170,9 @@
|
||||
[(set (match_operand:W 0 "register_operand")
|
||||
(match_operand:W 1 "memory_operand"))
|
||||
(set (pc) (match_dup 0))]
|
||||
- "!TARGET_X32 && peep2_reg_dead_p (2, operands[0])"
|
||||
+ "!TARGET_X32
|
||||
+ && !ix86_indirect_branch_register
|
||||
+ && peep2_reg_dead_p (2, operands[0])"
|
||||
[(set (pc) (match_dup 1))])
|
||||
|
||||
;; Call subroutine, returning value in operand 0
|
||||
@@ -12244,7 +12250,7 @@
|
||||
(call (mem:QI (match_operand:W 1 "memory_operand" "m"))
|
||||
(match_operand 2)))
|
||||
(unspec [(const_int 0)] UNSPEC_PEEPSIB)]
|
||||
- "!TARGET_X32"
|
||||
+ "!TARGET_X32 && !ix86_indirect_branch_register"
|
||||
"* return ix86_output_call_insn (insn, operands[1]);"
|
||||
[(set_attr "type" "callv")])
|
||||
|
||||
@@ -12254,7 +12260,9 @@
|
||||
(set (match_operand 2)
|
||||
(call (mem:QI (match_dup 0))
|
||||
(match_operand 3)))]
|
||||
- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (1))
|
||||
+ "!TARGET_X32
|
||||
+ && !ix86_indirect_branch_register
|
||||
+ && SIBLING_CALL_P (peep2_next_insn (1))
|
||||
&& !reg_mentioned_p (operands[0],
|
||||
CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"
|
||||
[(parallel [(set (match_dup 2)
|
||||
@@ -12269,7 +12277,9 @@
|
||||
(set (match_operand 2)
|
||||
(call (mem:QI (match_dup 0))
|
||||
(match_operand 3)))]
|
||||
- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (2))
|
||||
+ "!TARGET_X32
|
||||
+ && !ix86_indirect_branch_register
|
||||
+ && SIBLING_CALL_P (peep2_next_insn (2))
|
||||
&& !reg_mentioned_p (operands[0],
|
||||
CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"
|
||||
[(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
|
||||
@@ -12294,7 +12304,7 @@
|
||||
|
||||
(define_insn "*call_value_pop"
|
||||
[(set (match_operand 0)
|
||||
- (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lmBz"))
|
||||
+ (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lBwBz"))
|
||||
(match_operand 2)))
|
||||
(set (reg:SI SP_REG)
|
||||
(plus:SI (reg:SI SP_REG)
|
||||
diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
|
||||
index ad5916fb643..a97f84f68f2 100644
|
||||
--- a/gcc/config/i386/i386.opt
|
||||
+++ b/gcc/config/i386/i386.opt
|
||||
@@ -921,3 +921,7 @@ Enum(indirect_branch) String(thunk-inline) Value(indirect_branch_thunk_inline)
|
||||
|
||||
EnumValue
|
||||
Enum(indirect_branch) String(thunk-extern) Value(indirect_branch_thunk_extern)
|
||||
+
|
||||
+mindirect-branch-register
|
||||
+Target Report Var(ix86_indirect_branch_register) Init(0)
|
||||
+Force indirect call and jump via register.
|
||||
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
|
||||
index 93dda7bb0e7..d1f0a7dbf61 100644
|
||||
--- a/gcc/config/i386/predicates.md
|
||||
+++ b/gcc/config/i386/predicates.md
|
||||
@@ -593,7 +593,8 @@
|
||||
;; Test for a valid operand for indirect branch.
|
||||
(define_predicate "indirect_branch_operand"
|
||||
(ior (match_operand 0 "register_operand")
|
||||
- (and (not (match_test "TARGET_X32"))
|
||||
+ (and (not (match_test "ix86_indirect_branch_register"))
|
||||
+ (not (match_test "TARGET_X32"))
|
||||
(match_operand 0 "memory_operand"))))
|
||||
|
||||
;; Return true if OP is a memory operands that can be used in sibcalls.
|
||||
@@ -636,20 +637,22 @@
|
||||
(ior (match_test "constant_call_address_operand
|
||||
(op, mode == VOIDmode ? mode : Pmode)")
|
||||
(match_operand 0 "call_register_no_elim_operand")
|
||||
- (ior (and (not (match_test "TARGET_X32"))
|
||||
- (match_operand 0 "memory_operand"))
|
||||
- (and (match_test "TARGET_X32 && Pmode == DImode")
|
||||
- (match_operand 0 "GOT_memory_operand")))))
|
||||
+ (and (not (match_test "ix86_indirect_branch_register"))
|
||||
+ (ior (and (not (match_test "TARGET_X32"))
|
||||
+ (match_operand 0 "memory_operand"))
|
||||
+ (and (match_test "TARGET_X32 && Pmode == DImode")
|
||||
+ (match_operand 0 "GOT_memory_operand"))))))
|
||||
|
||||
;; Similarly, but for tail calls, in which we cannot allow memory references.
|
||||
(define_special_predicate "sibcall_insn_operand"
|
||||
(ior (match_test "constant_call_address_operand
|
||||
(op, mode == VOIDmode ? mode : Pmode)")
|
||||
(match_operand 0 "register_no_elim_operand")
|
||||
- (ior (and (not (match_test "TARGET_X32"))
|
||||
- (match_operand 0 "sibcall_memory_operand"))
|
||||
- (and (match_test "TARGET_X32 && Pmode == DImode")
|
||||
- (match_operand 0 "GOT_memory_operand")))))
|
||||
+ (and (not (match_test "ix86_indirect_branch_register"))
|
||||
+ (ior (and (not (match_test "TARGET_X32"))
|
||||
+ (match_operand 0 "sibcall_memory_operand"))
|
||||
+ (and (match_test "TARGET_X32 && Pmode == DImode")
|
||||
+ (match_operand 0 "GOT_memory_operand"))))))
|
||||
|
||||
;; Return true if OP is a 32-bit GOT symbol operand.
|
||||
(define_predicate "GOT32_symbol_operand"
|
||||
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
|
||||
index 337a761015a..94374661f2d 100644
|
||||
--- a/gcc/doc/invoke.texi
|
||||
+++ b/gcc/doc/invoke.texi
|
||||
@@ -1170,7 +1170,7 @@ See RS/6000 and PowerPC Options.
|
||||
-mavx256-split-unaligned-load -mavx256-split-unaligned-store @gol
|
||||
-malign-data=@var{type} -mstack-protector-guard=@var{guard} @gol
|
||||
-mmitigate-rop -mindirect-branch=@var{choice} @gol
|
||||
--mfunction-return=@var{choice}}
|
||||
+-mfunction-return=@var{choice} -mindirect-branch-register}
|
||||
|
||||
@emph{x86 Windows Options}
|
||||
@gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol
|
||||
@@ -24253,6 +24253,10 @@ object file. You can control this behavior for a specific function by
|
||||
using the function attribute @code{function_return}.
|
||||
@xref{Function Attributes}.
|
||||
|
||||
+@item -mindirect-branch-register
|
||||
+@opindex -mindirect-branch-register
|
||||
+Force indirect call and jump via register.
|
||||
+
|
||||
@end table
|
||||
|
||||
These @samp{-m} switches are supported in addition to the above
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
|
||||
index e365ef5698a..60d09881a99 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
|
||||
index 05a51ad9157..aac75163794 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
|
||||
index 3c0d4c39f0b..9e24a385387 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
|
||||
index 14d4ef6dd98..127b5d94523 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
|
||||
index b4836c38d6c..fcaa18d10b7 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile { target *-*-linux* } } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
|
||||
|
||||
extern void bar (void);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
|
||||
index 1f06bd1af74..e4649283d10 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile { target *-*-linux* } } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
|
||||
|
||||
extern void bar (void);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
|
||||
index bc6b47a636e..17c2d0faf88 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
||||
|
||||
void func0 (void);
|
||||
void func1 (void);
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
|
||||
index 2257be3affa..9194ccf3cbc 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
|
||||
index e9cfdc5879e..e51f261a612 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
|
||||
index f938db050f7..4aeec1833cd 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
|
||||
index 4e58599692a..ac0e5999f63 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
|
||||
index b8d50249d8b..573cf1ef09e 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
|
||||
index 455adabfe0e..b2b37fc6e2e 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
|
||||
index 4595b841ec0..4a43e199931 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */
|
||||
|
||||
void func0 (void);
|
||||
void func1 (void);
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
|
||||
index 5e3e118e9bd..ac84ab623fa 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile { target { ! x32 } } } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
|
||||
|
||||
void (*dispatch) (char *);
|
||||
char buf[10];
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
|
||||
index 2801aa4192e..ce655e8be1c 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile { target { ! x32 } } } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
|
||||
|
||||
void (*dispatch) (char *);
|
||||
char buf[10];
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
|
||||
index 70b4fb36eea..d34485a0010 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
|
||||
|
||||
void bar (char *);
|
||||
char buf[10];
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
|
||||
index 3baf03ee77c..0e19830de4d 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
|
||||
|
||||
void bar (char *);
|
||||
char buf[10];
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
|
||||
index edeb264218c..579441f250e 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
|
||||
index 1d00413a76a..c92e6f2b02d 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
|
||||
index 06ebf1c9063..d9964c25bbd 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
|
||||
index 1c8f9446636..d4dca4dc5fe 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
|
||||
index 21740ac5b7f..5c07e02df6a 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile { target *-*-linux* } } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
|
||||
|
||||
extern void bar (void);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
|
||||
index a77c1f470b8..3eb440693a0 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile { target *-*-linux* } } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
|
||||
|
||||
extern void bar (void);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
|
||||
index 86e9fd1f1e4..aece9383697 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
||||
|
||||
void func0 (void);
|
||||
void func1 (void);
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
|
||||
index 3ecde878867..3aba5e8c81f 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
|
||||
index df32a19a2b5..0f0181d6672 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
|
||||
index 9540996de01..2eef6f35a75 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
|
||||
index f3db6e2441f..e825a10f14c 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
||||
|
||||
typedef void (*dispatch_t)(long offset);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
|
||||
index 0f687c3b027..c6d77e10352 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile { target *-*-linux* } } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
|
||||
|
||||
extern void bar (void);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
|
||||
index b27c6fc96a2..6454827b780 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile { target *-*-linux* } } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
|
||||
|
||||
extern void bar (void);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
|
||||
index 764a375fc37..c67066cf197 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
||||
|
||||
void func0 (void);
|
||||
void func1 (void);
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c
|
||||
new file mode 100644
|
||||
index 00000000000..7d396a31953
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c
|
||||
@@ -0,0 +1,22 @@
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O2 -mindirect-branch=thunk -mindirect-branch-register -fno-pic" } */
|
||||
+
|
||||
+typedef void (*dispatch_t)(long offset);
|
||||
+
|
||||
+dispatch_t dispatch;
|
||||
+
|
||||
+void
|
||||
+male_indirect_jump (long offset)
|
||||
+{
|
||||
+ dispatch(offset);
|
||||
+}
|
||||
+
|
||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } */
|
||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
|
||||
+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
|
||||
+/* { dg-final { scan-assembler "mov\[ \t\](%eax|%rax), \\((%esp|%rsp)\\)" } } */
|
||||
+/* { dg-final { scan-assembler {\tpause} } } */
|
||||
+/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */
|
||||
+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */
|
||||
+/* { dg-final { scan-assembler-not "__x86_indirect_thunk\n" } } */
|
||||
+/* { dg-final { scan-assembler-not "__x86_indirect_thunk_bnd\n" } } */
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c
|
||||
new file mode 100644
|
||||
index 00000000000..e7e616bb271
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c
|
||||
@@ -0,0 +1,20 @@
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O2 -mindirect-branch=thunk-inline -mindirect-branch-register -fno-pic" } */
|
||||
+
|
||||
+typedef void (*dispatch_t)(long offset);
|
||||
+
|
||||
+dispatch_t dispatch;
|
||||
+
|
||||
+void
|
||||
+male_indirect_jump (long offset)
|
||||
+{
|
||||
+ dispatch(offset);
|
||||
+}
|
||||
+
|
||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
|
||||
+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
|
||||
+/* { dg-final { scan-assembler "mov\[ \t\](%eax|%rax), \\((%esp|%rsp)\\)" } } */
|
||||
+/* { dg-final { scan-assembler {\tpause} } } */
|
||||
+/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */
|
||||
+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */
|
||||
+/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c
|
||||
new file mode 100644
|
||||
index 00000000000..5320e923be2
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c
|
||||
@@ -0,0 +1,19 @@
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O2 -mindirect-branch=thunk-extern -mindirect-branch-register -fno-pic" } */
|
||||
+
|
||||
+typedef void (*dispatch_t)(long offset);
|
||||
+
|
||||
+dispatch_t dispatch;
|
||||
+
|
||||
+void
|
||||
+male_indirect_jump (long offset)
|
||||
+{
|
||||
+ dispatch(offset);
|
||||
+}
|
||||
+
|
||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } */
|
||||
+/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */
|
||||
+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */
|
||||
+/* { dg-final { scan-assembler-not {\t(pause|pause|nop)} } } */
|
||||
+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
|
||||
+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-10.c b/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
|
||||
index 3a6727b5c54..e6fea84a4d9 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic" } */
|
||||
|
||||
extern void (*bar) (void);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-11.c b/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
|
||||
index b8f68188313..e239ec4542f 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=thunk-extern -mindirect-branch=thunk -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk-extern -mindirect-branch=thunk -fno-pic" } */
|
||||
|
||||
extern void (*bar) (void);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-12.c b/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
|
||||
index 01b0a02f80b..fa3181303c9 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
|
||||
|
||||
extern void (*bar) (void);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-13.c b/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
|
||||
index 4b497b5f8af..fd5b41fdd3f 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
|
||||
|
||||
extern void (*bar) (void);
|
||||
extern int foo (void) __attribute__ ((function_return("thunk")));
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-14.c b/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
|
||||
index 4ae4c44a3fd..d606373ead1 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
|
||||
|
||||
extern void (*bar) (void);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-15.c b/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
|
||||
index 5b5bc765a7e..75e45e226b8 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=keep -fno-pic" } */
|
||||
|
||||
extern void (*bar) (void);
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
||||
index fa24a1f7365..d1db41cc128 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
-/* { dg-options "-O2 -mfunction-return=thunk -mindirect-branch=thunk -fno-pic" } */
|
||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk -mindirect-branch=thunk -fno-pic" } */
|
||||
|
||||
extern void (*bar) (void);
|
||||
|
||||
--
|
||||
2.16.3
|
||||
|
134
temp/gcc6/0007-x86-Add-V-register-operand-modifier.patch
Normal file
134
temp/gcc6/0007-x86-Add-V-register-operand-modifier.patch
Normal file
|
@ -0,0 +1,134 @@
|
|||
From 92308185917678406afee3c165ea5e71b53b3cc1 Mon Sep 17 00:00:00 2001
|
||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
||||
Date: Sat, 6 Jan 2018 22:29:56 -0800
|
||||
Subject: [PATCH 07/13] x86: Add 'V' register operand modifier
|
||||
|
||||
Add 'V', a special modifier which prints the name of the full integer
|
||||
register without '%'. For
|
||||
|
||||
extern void (*func_p) (void);
|
||||
|
||||
void
|
||||
foo (void)
|
||||
{
|
||||
asm ("call __x86_indirect_thunk_%V0" : : "a" (func_p));
|
||||
}
|
||||
|
||||
it generates:
|
||||
|
||||
foo:
|
||||
movq func_p(%rip), %rax
|
||||
call __x86_indirect_thunk_rax
|
||||
ret
|
||||
|
||||
gcc/
|
||||
|
||||
Backport from mainline
|
||||
2018-01-14 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* config/i386/i386.c (print_reg): Print the name of the full
|
||||
integer register without '%'.
|
||||
(ix86_print_operand): Handle 'V'.
|
||||
* doc/extend.texi: Document 'V' modifier.
|
||||
|
||||
gcc/testsuite/
|
||||
|
||||
Backport from mainline
|
||||
2018-01-14 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* gcc.target/i386/indirect-thunk-register-4.c: New test.
|
||||
---
|
||||
gcc/config/i386/i386.c | 13 ++++++++++++-
|
||||
gcc/doc/extend.texi | 3 +++
|
||||
gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c | 13 +++++++++++++
|
||||
3 files changed, 28 insertions(+), 1 deletion(-)
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c
|
||||
|
||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
||||
index 34e26a3a3c7..eeca7e5e490 100644
|
||||
--- a/gcc/config/i386/i386.c
|
||||
+++ b/gcc/config/i386/i386.c
|
||||
@@ -16869,6 +16869,7 @@ put_condition_code (enum rtx_code code, machine_mode mode, bool reverse,
|
||||
If CODE is 'h', pretend the reg is the 'high' byte register.
|
||||
If CODE is 'y', print "st(0)" instead of "st", if the reg is stack op.
|
||||
If CODE is 'd', duplicate the operand for AVX instruction.
|
||||
+ If CODE is 'V', print naked full integer register name without %.
|
||||
*/
|
||||
|
||||
void
|
||||
@@ -16879,7 +16880,7 @@ print_reg (rtx x, int code, FILE *file)
|
||||
unsigned int regno;
|
||||
bool duplicated;
|
||||
|
||||
- if (ASSEMBLER_DIALECT == ASM_ATT)
|
||||
+ if (ASSEMBLER_DIALECT == ASM_ATT && code != 'V')
|
||||
putc ('%', file);
|
||||
|
||||
if (x == pc_rtx)
|
||||
@@ -16922,6 +16923,14 @@ print_reg (rtx x, int code, FILE *file)
|
||||
&& regno != FPSR_REG
|
||||
&& regno != FPCR_REG);
|
||||
|
||||
+ if (code == 'V')
|
||||
+ {
|
||||
+ if (GENERAL_REGNO_P (regno))
|
||||
+ msize = GET_MODE_SIZE (word_mode);
|
||||
+ else
|
||||
+ error ("'V' modifier on non-integer register");
|
||||
+ }
|
||||
+
|
||||
duplicated = code == 'd' && TARGET_AVX;
|
||||
|
||||
switch (msize)
|
||||
@@ -17035,6 +17044,7 @@ print_reg (rtx x, int code, FILE *file)
|
||||
& -- print some in-use local-dynamic symbol name.
|
||||
H -- print a memory address offset by 8; used for sse high-parts
|
||||
Y -- print condition for XOP pcom* instruction.
|
||||
+ V -- print naked full integer register name without %.
|
||||
+ -- print a branch hint as 'cs' or 'ds' prefix
|
||||
; -- print a semicolon (after prefixes due to bug in older gas).
|
||||
~ -- print "i" if TARGET_AVX2, "f" otherwise.
|
||||
@@ -17259,6 +17269,7 @@ ix86_print_operand (FILE *file, rtx x, int code)
|
||||
case 'X':
|
||||
case 'P':
|
||||
case 'p':
|
||||
+ case 'V':
|
||||
break;
|
||||
|
||||
case 's':
|
||||
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
|
||||
index 2cb6bd1ef3e..76ba1d4f913 100644
|
||||
--- a/gcc/doc/extend.texi
|
||||
+++ b/gcc/doc/extend.texi
|
||||
@@ -8511,6 +8511,9 @@ The table below shows the list of supported modifiers and their effects.
|
||||
@tab @code{2}
|
||||
@end multitable
|
||||
|
||||
+@code{V} is a special modifier which prints the name of the full integer
|
||||
+register without @code{%}.
|
||||
+
|
||||
@anchor{x86floatingpointasmoperands}
|
||||
@subsubsection x86 Floating-Point @code{asm} Operands
|
||||
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c
|
||||
new file mode 100644
|
||||
index 00000000000..f0cd9b75be8
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c
|
||||
@@ -0,0 +1,13 @@
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O2 -mindirect-branch=keep -fno-pic" } */
|
||||
+
|
||||
+extern void (*func_p) (void);
|
||||
+
|
||||
+void
|
||||
+foo (void)
|
||||
+{
|
||||
+ asm("call __x86_indirect_thunk_%V0" : : "a" (func_p));
|
||||
+}
|
||||
+
|
||||
+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_eax" { target ia32 } } } */
|
||||
+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_rax" { target { ! ia32 } } } } */
|
||||
--
|
||||
2.16.3
|
||||
|
|
@ -0,0 +1,299 @@
|
|||
From 087b12213a5b4b8654c70320c671bb05c1b1b012 Mon Sep 17 00:00:00 2001
|
||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
||||
Date: Sat, 13 Jan 2018 18:01:54 -0800
|
||||
Subject: [PATCH 08/13] x86: Disallow -mindirect-branch=/-mfunction-return=
|
||||
with -mcmodel=large
|
||||
|
||||
Since the thunk function may not be reachable in large code model,
|
||||
-mcmodel=large is incompatible with -mindirect-branch=thunk,
|
||||
-mindirect-branch=thunk-extern, -mfunction-return=thunk and
|
||||
-mfunction-return=thunk-extern. Issue an error when they are used with
|
||||
-mcmodel=large.
|
||||
|
||||
gcc/
|
||||
|
||||
Backport from mainline
|
||||
2018-01-14 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* config/i386/i386.c (ix86_set_indirect_branch_type): Disallow
|
||||
-mcmodel=large with -mindirect-branch=thunk,
|
||||
-mindirect-branch=thunk-extern, -mfunction-return=thunk and
|
||||
-mfunction-return=thunk-extern.
|
||||
* doc/invoke.texi: Document -mcmodel=large is incompatible with
|
||||
-mindirect-branch=thunk, -mindirect-branch=thunk-extern,
|
||||
-mfunction-return=thunk and -mfunction-return=thunk-extern.
|
||||
|
||||
gcc/testsuite/
|
||||
|
||||
Backport from mainline
|
||||
2018-01-14 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* gcc.target/i386/indirect-thunk-10.c: New test.
|
||||
* gcc.target/i386/indirect-thunk-8.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-9.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-attr-10.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-attr-11.c: Likewise.
|
||||
* gcc.target/i386/indirect-thunk-attr-9.c: Likewise.
|
||||
* gcc.target/i386/ret-thunk-17.c: Likewise.
|
||||
* gcc.target/i386/ret-thunk-18.c: Likewise.
|
||||
* gcc.target/i386/ret-thunk-19.c: Likewise.
|
||||
* gcc.target/i386/ret-thunk-20.c: Likewise.
|
||||
* gcc.target/i386/ret-thunk-21.c: Likewise.
|
||||
---
|
||||
gcc/config/i386/i386.c | 26 ++++++++++++++++++++++
|
||||
gcc/doc/invoke.texi | 11 +++++++++
|
||||
gcc/testsuite/gcc.target/i386/indirect-thunk-10.c | 7 ++++++
|
||||
gcc/testsuite/gcc.target/i386/indirect-thunk-8.c | 7 ++++++
|
||||
gcc/testsuite/gcc.target/i386/indirect-thunk-9.c | 7 ++++++
|
||||
.../gcc.target/i386/indirect-thunk-attr-10.c | 9 ++++++++
|
||||
.../gcc.target/i386/indirect-thunk-attr-11.c | 9 ++++++++
|
||||
.../gcc.target/i386/indirect-thunk-attr-9.c | 9 ++++++++
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-17.c | 7 ++++++
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-18.c | 8 +++++++
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-19.c | 8 +++++++
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-20.c | 9 ++++++++
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-21.c | 9 ++++++++
|
||||
13 files changed, 126 insertions(+)
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-10.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-8.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-9.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-10.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-11.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-9.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-17.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-18.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-19.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-20.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-21.c
|
||||
|
||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
||||
index eeca7e5e490..9c038bee000 100644
|
||||
--- a/gcc/config/i386/i386.c
|
||||
+++ b/gcc/config/i386/i386.c
|
||||
@@ -6389,6 +6389,19 @@ ix86_set_indirect_branch_type (tree fndecl)
|
||||
}
|
||||
else
|
||||
cfun->machine->indirect_branch_type = ix86_indirect_branch;
|
||||
+
|
||||
+ /* -mcmodel=large is not compatible with -mindirect-branch=thunk
|
||||
+ nor -mindirect-branch=thunk-extern. */
|
||||
+ if ((ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC)
|
||||
+ && ((cfun->machine->indirect_branch_type
|
||||
+ == indirect_branch_thunk_extern)
|
||||
+ || (cfun->machine->indirect_branch_type
|
||||
+ == indirect_branch_thunk)))
|
||||
+ error ("%<-mindirect-branch=%s%> and %<-mcmodel=large%> are not "
|
||||
+ "compatible",
|
||||
+ ((cfun->machine->indirect_branch_type
|
||||
+ == indirect_branch_thunk_extern)
|
||||
+ ? "thunk-extern" : "thunk"));
|
||||
}
|
||||
|
||||
if (cfun->machine->function_return_type == indirect_branch_unset)
|
||||
@@ -6414,6 +6427,19 @@ ix86_set_indirect_branch_type (tree fndecl)
|
||||
}
|
||||
else
|
||||
cfun->machine->function_return_type = ix86_function_return;
|
||||
+
|
||||
+ /* -mcmodel=large is not compatible with -mfunction-return=thunk
|
||||
+ nor -mfunction-return=thunk-extern. */
|
||||
+ if ((ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC)
|
||||
+ && ((cfun->machine->function_return_type
|
||||
+ == indirect_branch_thunk_extern)
|
||||
+ || (cfun->machine->function_return_type
|
||||
+ == indirect_branch_thunk)))
|
||||
+ error ("%<-mfunction-return=%s%> and %<-mcmodel=large%> are not "
|
||||
+ "compatible",
|
||||
+ ((cfun->machine->function_return_type
|
||||
+ == indirect_branch_thunk_extern)
|
||||
+ ? "thunk-extern" : "thunk"));
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
|
||||
index 94374661f2d..1dee495c86b 100644
|
||||
--- a/gcc/doc/invoke.texi
|
||||
+++ b/gcc/doc/invoke.texi
|
||||
@@ -24242,6 +24242,11 @@ to external call and return thunk provided in a separate object file.
|
||||
You can control this behavior for a specific function by using the
|
||||
function attribute @code{indirect_branch}. @xref{Function Attributes}.
|
||||
|
||||
+Note that @option{-mcmodel=large} is incompatible with
|
||||
+@option{-mindirect-branch=thunk} nor
|
||||
+@option{-mindirect-branch=thunk-extern} since the thunk function may
|
||||
+not be reachable in large code model.
|
||||
+
|
||||
@item -mfunction-return=@var{choice}
|
||||
@opindex -mfunction-return
|
||||
Convert function return with @var{choice}. The default is @samp{keep},
|
||||
@@ -24253,6 +24258,12 @@ object file. You can control this behavior for a specific function by
|
||||
using the function attribute @code{function_return}.
|
||||
@xref{Function Attributes}.
|
||||
|
||||
+Note that @option{-mcmodel=large} is incompatible with
|
||||
+@option{-mfunction-return=thunk} nor
|
||||
+@option{-mfunction-return=thunk-extern} since the thunk function may
|
||||
+not be reachable in large code model.
|
||||
+
|
||||
+
|
||||
@item -mindirect-branch-register
|
||||
@opindex -mindirect-branch-register
|
||||
Force indirect call and jump via register.
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-10.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-10.c
|
||||
new file mode 100644
|
||||
index 00000000000..a0674bd2363
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-10.c
|
||||
@@ -0,0 +1,7 @@
|
||||
+/* { dg-do compile { target { lp64 } } } */
|
||||
+/* { dg-options "-O2 -mindirect-branch=thunk-inline -mfunction-return=keep -mcmodel=large" } */
|
||||
+
|
||||
+void
|
||||
+bar (void)
|
||||
+{
|
||||
+}
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-8.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-8.c
|
||||
new file mode 100644
|
||||
index 00000000000..7a80a8986e8
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-8.c
|
||||
@@ -0,0 +1,7 @@
|
||||
+/* { dg-do compile { target { lp64 } } } */
|
||||
+/* { dg-options "-O2 -mindirect-branch=thunk -mfunction-return=keep -mcmodel=large" } */
|
||||
+
|
||||
+void
|
||||
+bar (void)
|
||||
+{ /* { dg-error "'-mindirect-branch=thunk' and '-mcmodel=large' are not compatible" } */
|
||||
+}
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-9.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-9.c
|
||||
new file mode 100644
|
||||
index 00000000000..d4d45c5114d
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-9.c
|
||||
@@ -0,0 +1,7 @@
|
||||
+/* { dg-do compile { target { lp64 } } } */
|
||||
+/* { dg-options "-O2 -mindirect-branch=thunk-extern -mfunction-return=keep -mcmodel=large" } */
|
||||
+
|
||||
+void
|
||||
+bar (void)
|
||||
+{ /* { dg-error "'-mindirect-branch=thunk-extern' and '-mcmodel=large' are not compatible" } */
|
||||
+}
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-10.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-10.c
|
||||
new file mode 100644
|
||||
index 00000000000..3a2aeaddbc5
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-10.c
|
||||
@@ -0,0 +1,9 @@
|
||||
+/* { dg-do compile { target { lp64 } } } */
|
||||
+/* { dg-options "-O2 -mindirect-branch=keep -mfunction-return=keep -mcmodel=large" } */
|
||||
+/* { dg-additional-options "-fPIC" { target fpic } } */
|
||||
+
|
||||
+__attribute__ ((indirect_branch("thunk-extern")))
|
||||
+void
|
||||
+bar (void)
|
||||
+{ /* { dg-error "'-mindirect-branch=thunk-extern' and '-mcmodel=large' are not compatible" } */
|
||||
+}
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-11.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-11.c
|
||||
new file mode 100644
|
||||
index 00000000000..8e52f032b6c
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-11.c
|
||||
@@ -0,0 +1,9 @@
|
||||
+/* { dg-do compile { target { lp64 } } } */
|
||||
+/* { dg-options "-O2 -mindirect-branch=keep -mfunction-return=keep -mcmodel=large" } */
|
||||
+/* { dg-additional-options "-fPIC" { target fpic } } */
|
||||
+
|
||||
+__attribute__ ((indirect_branch("thunk-inline")))
|
||||
+void
|
||||
+bar (void)
|
||||
+{
|
||||
+}
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-9.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-9.c
|
||||
new file mode 100644
|
||||
index 00000000000..bdaa4f6911b
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-9.c
|
||||
@@ -0,0 +1,9 @@
|
||||
+/* { dg-do compile { target { lp64 } } } */
|
||||
+/* { dg-options "-O2 -mindirect-branch=keep -mfunction-return=keep -mcmodel=large" } */
|
||||
+/* { dg-additional-options "-fPIC" { target fpic } } */
|
||||
+
|
||||
+__attribute__ ((indirect_branch("thunk")))
|
||||
+void
|
||||
+bar (void)
|
||||
+{ /* { dg-error "'-mindirect-branch=thunk' and '-mcmodel=large' are not compatible" } */
|
||||
+}
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-17.c b/gcc/testsuite/gcc.target/i386/ret-thunk-17.c
|
||||
new file mode 100644
|
||||
index 00000000000..0605e2c6542
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-17.c
|
||||
@@ -0,0 +1,7 @@
|
||||
+/* { dg-do compile { target { lp64 } } } */
|
||||
+/* { dg-options "-O2 -mfunction-return=thunk -mindirect-branch=keep -mcmodel=large" } */
|
||||
+
|
||||
+void
|
||||
+bar (void)
|
||||
+{ /* { dg-error "'-mfunction-return=thunk' and '-mcmodel=large' are not compatible" } */
|
||||
+}
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-18.c b/gcc/testsuite/gcc.target/i386/ret-thunk-18.c
|
||||
new file mode 100644
|
||||
index 00000000000..307019dc242
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-18.c
|
||||
@@ -0,0 +1,8 @@
|
||||
+/* { dg-do compile { target { lp64 } } } */
|
||||
+/* { dg-options "-O2 -mfunction-return=thunk-extern -mindirect-branch=keep -mcmodel=large" } */
|
||||
+/* { dg-additional-options "-fPIC" { target fpic } } */
|
||||
+
|
||||
+void
|
||||
+bar (void)
|
||||
+{ /* { dg-error "'-mfunction-return=thunk-extern' and '-mcmodel=large' are not compatible" } */
|
||||
+}
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-19.c b/gcc/testsuite/gcc.target/i386/ret-thunk-19.c
|
||||
new file mode 100644
|
||||
index 00000000000..772617f4010
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-19.c
|
||||
@@ -0,0 +1,8 @@
|
||||
+/* { dg-do compile { target { lp64 } } } */
|
||||
+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -mcmodel=large" } */
|
||||
+
|
||||
+__attribute__ ((function_return("thunk")))
|
||||
+void
|
||||
+bar (void)
|
||||
+{ /* { dg-error "'-mfunction-return=thunk' and '-mcmodel=large' are not compatible" } */
|
||||
+}
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-20.c b/gcc/testsuite/gcc.target/i386/ret-thunk-20.c
|
||||
new file mode 100644
|
||||
index 00000000000..1e9f9bd5a66
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-20.c
|
||||
@@ -0,0 +1,9 @@
|
||||
+/* { dg-do compile { target { lp64 } } } */
|
||||
+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -mcmodel=large" } */
|
||||
+/* { dg-additional-options "-fPIC" { target fpic } } */
|
||||
+
|
||||
+__attribute__ ((function_return("thunk-extern")))
|
||||
+void
|
||||
+bar (void)
|
||||
+{ /* { dg-error "'-mfunction-return=thunk-extern' and '-mcmodel=large' are not compatible" } */
|
||||
+}
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-21.c b/gcc/testsuite/gcc.target/i386/ret-thunk-21.c
|
||||
new file mode 100644
|
||||
index 00000000000..eea07f7abe1
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-21.c
|
||||
@@ -0,0 +1,9 @@
|
||||
+/* { dg-do compile { target { lp64 } } } */
|
||||
+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -mcmodel=large" } */
|
||||
+/* { dg-additional-options "-fPIC" { target fpic } } */
|
||||
+
|
||||
+__attribute__ ((function_return("thunk-inline")))
|
||||
+void
|
||||
+bar (void)
|
||||
+{
|
||||
+}
|
||||
--
|
||||
2.16.3
|
||||
|
|
@ -0,0 +1,121 @@
|
|||
From 07857bd9fb9ccab67a932ad9df3e53f3f0c2c617 Mon Sep 17 00:00:00 2001
|
||||
From: uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
|
||||
Date: Thu, 25 Jan 2018 19:39:01 +0000
|
||||
Subject: [PATCH 09/13] Use INVALID_REGNUM in indirect thunk processing
|
||||
|
||||
Backport from mainline
|
||||
2018-01-17 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
* config/i386/i386.c (indirect_thunk_name): Declare regno
|
||||
as unsigned int. Compare regno with INVALID_REGNUM.
|
||||
(output_indirect_thunk): Ditto.
|
||||
(output_indirect_thunk_function): Ditto.
|
||||
(ix86_code_end): Declare regno as unsigned int. Use INVALID_REGNUM
|
||||
in the call to output_indirect_thunk_function.
|
||||
|
||||
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@257067 138bc75d-0d04-0410-961f-82ee72b054a4
|
||||
---
|
||||
gcc/config/i386/i386.c | 30 +++++++++++++++---------------
|
||||
1 file changed, 15 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
||||
index 9c038bee000..40126579c22 100644
|
||||
--- a/gcc/config/i386/i386.c
|
||||
+++ b/gcc/config/i386/i386.c
|
||||
@@ -11087,16 +11087,16 @@ static int indirect_thunks_bnd_used;
|
||||
/* Fills in the label name that should be used for the indirect thunk. */
|
||||
|
||||
static void
|
||||
-indirect_thunk_name (char name[32], int regno, bool need_bnd_p,
|
||||
- bool ret_p)
|
||||
+indirect_thunk_name (char name[32], unsigned int regno,
|
||||
+ bool need_bnd_p, bool ret_p)
|
||||
{
|
||||
- if (regno >= 0 && ret_p)
|
||||
+ if (regno != INVALID_REGNUM && ret_p)
|
||||
gcc_unreachable ();
|
||||
|
||||
if (USE_HIDDEN_LINKONCE)
|
||||
{
|
||||
const char *bnd = need_bnd_p ? "_bnd" : "";
|
||||
- if (regno >= 0)
|
||||
+ if (regno != INVALID_REGNUM)
|
||||
{
|
||||
const char *reg_prefix;
|
||||
if (LEGACY_INT_REGNO_P (regno))
|
||||
@@ -11114,7 +11114,7 @@ indirect_thunk_name (char name[32], int regno, bool need_bnd_p,
|
||||
}
|
||||
else
|
||||
{
|
||||
- if (regno >= 0)
|
||||
+ if (regno != INVALID_REGNUM)
|
||||
{
|
||||
if (need_bnd_p)
|
||||
ASM_GENERATE_INTERNAL_LABEL (name, "LITBR", regno);
|
||||
@@ -11166,7 +11166,7 @@ indirect_thunk_name (char name[32], int regno, bool need_bnd_p,
|
||||
*/
|
||||
|
||||
static void
|
||||
-output_indirect_thunk (bool need_bnd_p, int regno)
|
||||
+output_indirect_thunk (bool need_bnd_p, unsigned int regno)
|
||||
{
|
||||
char indirectlabel1[32];
|
||||
char indirectlabel2[32];
|
||||
@@ -11196,7 +11196,7 @@ output_indirect_thunk (bool need_bnd_p, int regno)
|
||||
|
||||
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2);
|
||||
|
||||
- if (regno >= 0)
|
||||
+ if (regno != INVALID_REGNUM)
|
||||
{
|
||||
/* MOV. */
|
||||
rtx xops[2];
|
||||
@@ -11220,12 +11220,12 @@ output_indirect_thunk (bool need_bnd_p, int regno)
|
||||
}
|
||||
|
||||
/* Output a funtion with a call and return thunk for indirect branch.
|
||||
- If BND_P is true, the BND prefix is needed. If REGNO != -1, the
|
||||
- function address is in REGNO. Otherwise, the function address is
|
||||
+ If BND_P is true, the BND prefix is needed. If REGNO != INVALID_REGNUM,
|
||||
+ the function address is in REGNO. Otherwise, the function address is
|
||||
on the top of stack. */
|
||||
|
||||
static void
|
||||
-output_indirect_thunk_function (bool need_bnd_p, int regno)
|
||||
+output_indirect_thunk_function (bool need_bnd_p, unsigned int regno)
|
||||
{
|
||||
char name[32];
|
||||
tree decl;
|
||||
@@ -11274,7 +11274,7 @@ output_indirect_thunk_function (bool need_bnd_p, int regno)
|
||||
ASM_OUTPUT_LABEL (asm_out_file, name);
|
||||
}
|
||||
|
||||
- if (regno < 0)
|
||||
+ if (regno == INVALID_REGNUM)
|
||||
{
|
||||
/* Create alias for __x86.return_thunk/__x86.return_thunk_bnd. */
|
||||
char alias[32];
|
||||
@@ -11348,16 +11348,16 @@ static void
|
||||
ix86_code_end (void)
|
||||
{
|
||||
rtx xops[2];
|
||||
- int regno;
|
||||
+ unsigned int regno;
|
||||
|
||||
if (indirect_thunk_needed)
|
||||
- output_indirect_thunk_function (false, -1);
|
||||
+ output_indirect_thunk_function (false, INVALID_REGNUM);
|
||||
if (indirect_thunk_bnd_needed)
|
||||
- output_indirect_thunk_function (true, -1);
|
||||
+ output_indirect_thunk_function (true, INVALID_REGNUM);
|
||||
|
||||
for (regno = FIRST_REX_INT_REG; regno <= LAST_REX_INT_REG; regno++)
|
||||
{
|
||||
- int i = regno - FIRST_REX_INT_REG + LAST_INT_REG + 1;
|
||||
+ unsigned int i = regno - FIRST_REX_INT_REG + LAST_INT_REG + 1;
|
||||
if ((indirect_thunks_used & (1 << i)))
|
||||
output_indirect_thunk_function (false, regno);
|
||||
|
||||
--
|
||||
2.16.3
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
From 3815e98f0f46b6c4c41e6810bad987bd083691aa Mon Sep 17 00:00:00 2001
|
||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
||||
Date: Fri, 2 Feb 2018 16:47:02 +0000
|
||||
Subject: [PATCH 10/13] i386: Pass INVALID_REGNUM as invalid register number
|
||||
|
||||
Backport from mainline
|
||||
* config/i386/i386.c (ix86_output_function_return): Pass
|
||||
INVALID_REGNUM, instead of -1, as invalid register number to
|
||||
indirect_thunk_name and output_indirect_thunk.
|
||||
|
||||
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@257341 138bc75d-0d04-0410-961f-82ee72b054a4
|
||||
---
|
||||
gcc/config/i386/i386.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
||||
index 40126579c22..66502ee6da6 100644
|
||||
--- a/gcc/config/i386/i386.c
|
||||
+++ b/gcc/config/i386/i386.c
|
||||
@@ -28056,7 +28056,8 @@ ix86_output_function_return (bool long_p)
|
||||
{
|
||||
bool need_thunk = (cfun->machine->function_return_type
|
||||
== indirect_branch_thunk);
|
||||
- indirect_thunk_name (thunk_name, -1, need_bnd_p, true);
|
||||
+ indirect_thunk_name (thunk_name, INVALID_REGNUM, need_bnd_p,
|
||||
+ true);
|
||||
if (need_bnd_p)
|
||||
{
|
||||
indirect_thunk_bnd_needed |= need_thunk;
|
||||
@@ -28069,7 +28070,7 @@ ix86_output_function_return (bool long_p)
|
||||
}
|
||||
}
|
||||
else
|
||||
- output_indirect_thunk (need_bnd_p, -1);
|
||||
+ output_indirect_thunk (need_bnd_p, INVALID_REGNUM);
|
||||
|
||||
return "";
|
||||
}
|
||||
--
|
||||
2.16.3
|
||||
|
|
@ -0,0 +1,456 @@
|
|||
From 771535dec733e4b85924f00a3a94c29683d614e5 Mon Sep 17 00:00:00 2001
|
||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
||||
Date: Mon, 26 Feb 2018 15:29:30 +0000
|
||||
Subject: [PATCH 11/13] i386: Update -mfunction-return= for return with pop
|
||||
|
||||
When -mfunction-return= is used, simple_return_pop_internal should pop
|
||||
return address into ECX register, adjust stack by bytes to pop from stack
|
||||
and jump to the return thunk via ECX register.
|
||||
|
||||
Revision 257992 removed the bool argument from ix86_output_indirect_jmp.
|
||||
Update comments to reflect it.
|
||||
|
||||
Tested on i686 and x86-64.
|
||||
|
||||
gcc/
|
||||
|
||||
Backport from mainline
|
||||
2018-02-26 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* config/i386/i386.c (ix86_output_indirect_jmp): Update comments.
|
||||
|
||||
2018-02-26 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR target/84530
|
||||
* config/i386/i386-protos.h (ix86_output_indirect_jmp): Remove
|
||||
the bool argument.
|
||||
(ix86_output_indirect_function_return): New prototype.
|
||||
(ix86_split_simple_return_pop_internal): Likewise.
|
||||
* config/i386/i386.c (indirect_return_via_cx): New.
|
||||
(indirect_return_via_cx_bnd): Likewise.
|
||||
(indirect_thunk_name): Handle return va CX_REG.
|
||||
(output_indirect_thunk_function): Create alias for
|
||||
__x86_return_thunk_[re]cx and __x86_return_thunk_[re]cx_bnd.
|
||||
(ix86_output_indirect_jmp): Remove the bool argument.
|
||||
(ix86_output_indirect_function_return): New function.
|
||||
(ix86_split_simple_return_pop_internal): Likewise.
|
||||
* config/i386/i386.md (*indirect_jump): Don't pass false
|
||||
to ix86_output_indirect_jmp.
|
||||
(*tablejump_1): Likewise.
|
||||
(simple_return_pop_internal): Change it to define_insn_and_split.
|
||||
Call ix86_split_simple_return_pop_internal to split it for
|
||||
-mfunction-return=.
|
||||
(simple_return_indirect_internal): Call
|
||||
ix86_output_indirect_function_return instead of
|
||||
ix86_output_indirect_jmp.
|
||||
|
||||
gcc/testsuite/
|
||||
|
||||
Backport from mainline
|
||||
2018-02-26 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR target/84530
|
||||
* gcc.target/i386/ret-thunk-22.c: New test.
|
||||
* gcc.target/i386/ret-thunk-23.c: Likewise.
|
||||
* gcc.target/i386/ret-thunk-24.c: Likewise.
|
||||
* gcc.target/i386/ret-thunk-25.c: Likewise.
|
||||
* gcc.target/i386/ret-thunk-26.c: Likewise.
|
||||
---
|
||||
gcc/config/i386/i386-protos.h | 4 +-
|
||||
gcc/config/i386/i386.c | 127 +++++++++++++++++++++++----
|
||||
gcc/config/i386/i386.md | 11 ++-
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-22.c | 15 ++++
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-23.c | 15 ++++
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-24.c | 15 ++++
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-25.c | 15 ++++
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-26.c | 40 +++++++++
|
||||
8 files changed, 222 insertions(+), 20 deletions(-)
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-22.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-23.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-24.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-25.c
|
||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-26.c
|
||||
|
||||
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
|
||||
index 620d70ef9f6..c7a0ccb58d3 100644
|
||||
--- a/gcc/config/i386/i386-protos.h
|
||||
+++ b/gcc/config/i386/i386-protos.h
|
||||
@@ -311,8 +311,10 @@ extern enum attr_cpu ix86_schedule;
|
||||
#endif
|
||||
|
||||
extern const char * ix86_output_call_insn (rtx_insn *insn, rtx call_op);
|
||||
-extern const char * ix86_output_indirect_jmp (rtx call_op, bool ret_p);
|
||||
+extern const char * ix86_output_indirect_jmp (rtx call_op);
|
||||
extern const char * ix86_output_function_return (bool long_p);
|
||||
+extern const char * ix86_output_indirect_function_return (rtx ret_op);
|
||||
+extern void ix86_split_simple_return_pop_internal (rtx);
|
||||
extern bool ix86_operands_ok_for_move_multiple (rtx *operands, bool load,
|
||||
enum machine_mode mode);
|
||||
|
||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
||||
index 66502ee6da6..21c3c18bd3c 100644
|
||||
--- a/gcc/config/i386/i386.c
|
||||
+++ b/gcc/config/i386/i386.c
|
||||
@@ -11080,6 +11080,12 @@ static int indirect_thunks_used;
|
||||
by call and return thunks functions with the BND prefix. */
|
||||
static int indirect_thunks_bnd_used;
|
||||
|
||||
+/* True if return thunk function via CX is needed. */
|
||||
+static bool indirect_return_via_cx;
|
||||
+/* True if return thunk function via CX with the BND prefix is
|
||||
+ needed. */
|
||||
+static bool indirect_return_via_cx_bnd;
|
||||
+
|
||||
#ifndef INDIRECT_LABEL
|
||||
# define INDIRECT_LABEL "LIND"
|
||||
#endif
|
||||
@@ -11090,12 +11096,13 @@ static void
|
||||
indirect_thunk_name (char name[32], unsigned int regno,
|
||||
bool need_bnd_p, bool ret_p)
|
||||
{
|
||||
- if (regno != INVALID_REGNUM && ret_p)
|
||||
+ if (regno != INVALID_REGNUM && regno != CX_REG && ret_p)
|
||||
gcc_unreachable ();
|
||||
|
||||
if (USE_HIDDEN_LINKONCE)
|
||||
{
|
||||
const char *bnd = need_bnd_p ? "_bnd" : "";
|
||||
+ const char *ret = ret_p ? "return" : "indirect";
|
||||
if (regno != INVALID_REGNUM)
|
||||
{
|
||||
const char *reg_prefix;
|
||||
@@ -11103,14 +11110,11 @@ indirect_thunk_name (char name[32], unsigned int regno,
|
||||
reg_prefix = TARGET_64BIT ? "r" : "e";
|
||||
else
|
||||
reg_prefix = "";
|
||||
- sprintf (name, "__x86_indirect_thunk%s_%s%s",
|
||||
- bnd, reg_prefix, reg_names[regno]);
|
||||
+ sprintf (name, "__x86_%s_thunk%s_%s%s",
|
||||
+ ret, bnd, reg_prefix, reg_names[regno]);
|
||||
}
|
||||
else
|
||||
- {
|
||||
- const char *ret = ret_p ? "return" : "indirect";
|
||||
- sprintf (name, "__x86_%s_thunk%s", ret, bnd);
|
||||
- }
|
||||
+ sprintf (name, "__x86_%s_thunk%s", ret, bnd);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -11274,9 +11278,23 @@ output_indirect_thunk_function (bool need_bnd_p, unsigned int regno)
|
||||
ASM_OUTPUT_LABEL (asm_out_file, name);
|
||||
}
|
||||
|
||||
+ /* Create alias for __x86_return_thunk/__x86_return_thunk_bnd or
|
||||
+ __x86_return_thunk_ecx/__x86_return_thunk_ecx_bnd. */
|
||||
+ bool need_alias;
|
||||
if (regno == INVALID_REGNUM)
|
||||
+ need_alias = true;
|
||||
+ else if (regno == CX_REG)
|
||||
+ {
|
||||
+ if (need_bnd_p)
|
||||
+ need_alias = indirect_return_via_cx_bnd;
|
||||
+ else
|
||||
+ need_alias = indirect_return_via_cx;
|
||||
+ }
|
||||
+ else
|
||||
+ need_alias = false;
|
||||
+
|
||||
+ if (need_alias)
|
||||
{
|
||||
- /* Create alias for __x86.return_thunk/__x86.return_thunk_bnd. */
|
||||
char alias[32];
|
||||
|
||||
indirect_thunk_name (alias, regno, need_bnd_p, true);
|
||||
@@ -28019,18 +28037,17 @@ ix86_output_indirect_branch (rtx call_op, const char *xasm,
|
||||
else
|
||||
ix86_output_indirect_branch_via_push (call_op, xasm, sibcall_p);
|
||||
}
|
||||
-/* Output indirect jump. CALL_OP is the jump target. Jump is a
|
||||
- function return if RET_P is true. */
|
||||
+
|
||||
+/* Output indirect jump. CALL_OP is the jump target. */
|
||||
|
||||
const char *
|
||||
-ix86_output_indirect_jmp (rtx call_op, bool ret_p)
|
||||
+ix86_output_indirect_jmp (rtx call_op)
|
||||
{
|
||||
if (cfun->machine->indirect_branch_type != indirect_branch_keep)
|
||||
{
|
||||
- /* We can't have red-zone if this isn't a function return since
|
||||
- "call" in the indirect thunk pushes the return address onto
|
||||
- stack, destroying red-zone. */
|
||||
- if (!ret_p && ix86_red_zone_size != 0)
|
||||
+ /* We can't have red-zone since "call" in the indirect thunk
|
||||
+ pushes the return address onto stack, destroying red-zone. */
|
||||
+ if (ix86_red_zone_size != 0)
|
||||
gcc_unreachable ();
|
||||
|
||||
ix86_output_indirect_branch (call_op, "%0", true);
|
||||
@@ -28081,6 +28098,86 @@ ix86_output_function_return (bool long_p)
|
||||
return "rep%; ret";
|
||||
}
|
||||
|
||||
+/* Output indirect function return. RET_OP is the function return
|
||||
+ target. */
|
||||
+
|
||||
+const char *
|
||||
+ix86_output_indirect_function_return (rtx ret_op)
|
||||
+{
|
||||
+ if (cfun->machine->function_return_type != indirect_branch_keep)
|
||||
+ {
|
||||
+ char thunk_name[32];
|
||||
+ bool need_bnd_p = ix86_bnd_prefixed_insn_p (current_output_insn);
|
||||
+ unsigned int regno = REGNO (ret_op);
|
||||
+ gcc_assert (regno == CX_REG);
|
||||
+
|
||||
+ if (cfun->machine->function_return_type
|
||||
+ != indirect_branch_thunk_inline)
|
||||
+ {
|
||||
+ bool need_thunk = (cfun->machine->function_return_type
|
||||
+ == indirect_branch_thunk);
|
||||
+ indirect_thunk_name (thunk_name, regno, need_bnd_p, true);
|
||||
+ if (need_bnd_p)
|
||||
+ {
|
||||
+ if (need_thunk)
|
||||
+ {
|
||||
+ indirect_return_via_cx_bnd = true;
|
||||
+ indirect_thunks_bnd_used |= 1 << CX_REG;
|
||||
+ }
|
||||
+ fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ if (need_thunk)
|
||||
+ {
|
||||
+ indirect_return_via_cx = true;
|
||||
+ indirect_thunks_used |= 1 << CX_REG;
|
||||
+ }
|
||||
+ fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ output_indirect_thunk (need_bnd_p, regno);
|
||||
+
|
||||
+ return "";
|
||||
+ }
|
||||
+ else
|
||||
+ return "%!jmp\t%A0";
|
||||
+}
|
||||
+
|
||||
+/* Split simple return with popping POPC bytes from stack to indirect
|
||||
+ branch with stack adjustment . */
|
||||
+
|
||||
+void
|
||||
+ix86_split_simple_return_pop_internal (rtx popc)
|
||||
+{
|
||||
+ struct machine_function *m = cfun->machine;
|
||||
+ rtx ecx = gen_rtx_REG (SImode, CX_REG);
|
||||
+ rtx_insn *insn;
|
||||
+
|
||||
+ /* There is no "pascal" calling convention in any 64bit ABI. */
|
||||
+ gcc_assert (!TARGET_64BIT);
|
||||
+
|
||||
+ insn = emit_insn (gen_pop (ecx));
|
||||
+ m->fs.cfa_offset -= UNITS_PER_WORD;
|
||||
+ m->fs.sp_offset -= UNITS_PER_WORD;
|
||||
+
|
||||
+ rtx x = plus_constant (Pmode, stack_pointer_rtx, UNITS_PER_WORD);
|
||||
+ x = gen_rtx_SET (stack_pointer_rtx, x);
|
||||
+ add_reg_note (insn, REG_CFA_ADJUST_CFA, x);
|
||||
+ add_reg_note (insn, REG_CFA_REGISTER, gen_rtx_SET (ecx, pc_rtx));
|
||||
+ RTX_FRAME_RELATED_P (insn) = 1;
|
||||
+
|
||||
+ x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, popc);
|
||||
+ x = gen_rtx_SET (stack_pointer_rtx, x);
|
||||
+ insn = emit_insn (x);
|
||||
+ add_reg_note (insn, REG_CFA_ADJUST_CFA, x);
|
||||
+ RTX_FRAME_RELATED_P (insn) = 1;
|
||||
+
|
||||
+ /* Now return address is in ECX. */
|
||||
+ emit_jump_insn (gen_simple_return_indirect_internal (ecx));
|
||||
+}
|
||||
+
|
||||
/* Output the assembly for a call instruction. */
|
||||
|
||||
const char *
|
||||
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
|
||||
index 05a88fff356..857466a6361 100644
|
||||
--- a/gcc/config/i386/i386.md
|
||||
+++ b/gcc/config/i386/i386.md
|
||||
@@ -11813,7 +11813,7 @@
|
||||
(define_insn "*indirect_jump"
|
||||
[(set (pc) (match_operand:W 0 "indirect_branch_operand" "rBw"))]
|
||||
""
|
||||
- "* return ix86_output_indirect_jmp (operands[0], false);"
|
||||
+ "* return ix86_output_indirect_jmp (operands[0]);"
|
||||
[(set (attr "type")
|
||||
(if_then_else (match_test "(cfun->machine->indirect_branch_type
|
||||
!= indirect_branch_keep)")
|
||||
@@ -11868,7 +11868,7 @@
|
||||
[(set (pc) (match_operand:W 0 "indirect_branch_operand" "rBw"))
|
||||
(use (label_ref (match_operand 1)))]
|
||||
""
|
||||
- "* return ix86_output_indirect_jmp (operands[0], false);"
|
||||
+ "* return ix86_output_indirect_jmp (operands[0]);"
|
||||
[(set (attr "type")
|
||||
(if_then_else (match_test "(cfun->machine->indirect_branch_type
|
||||
!= indirect_branch_keep)")
|
||||
@@ -12520,11 +12520,14 @@
|
||||
(set_attr "prefix_rep" "1")
|
||||
(set_attr "modrm" "0")])
|
||||
|
||||
-(define_insn "simple_return_pop_internal"
|
||||
+(define_insn_and_split "simple_return_pop_internal"
|
||||
[(simple_return)
|
||||
(use (match_operand:SI 0 "const_int_operand"))]
|
||||
"reload_completed"
|
||||
"%!ret\t%0"
|
||||
+ "&& cfun->machine->function_return_type != indirect_branch_keep"
|
||||
+ [(const_int 0)]
|
||||
+ "ix86_split_simple_return_pop_internal (operands[0]); DONE;"
|
||||
[(set_attr "length" "3")
|
||||
(set_attr "atom_unit" "jeu")
|
||||
(set_attr "length_immediate" "2")
|
||||
@@ -12535,7 +12538,7 @@
|
||||
[(simple_return)
|
||||
(use (match_operand:SI 0 "register_operand" "r"))]
|
||||
"reload_completed"
|
||||
- "* return ix86_output_indirect_jmp (operands[0], true);"
|
||||
+ "* return ix86_output_indirect_function_return (operands[0]);"
|
||||
[(set (attr "type")
|
||||
(if_then_else (match_test "(cfun->machine->indirect_branch_type
|
||||
!= indirect_branch_keep)")
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-22.c b/gcc/testsuite/gcc.target/i386/ret-thunk-22.c
|
||||
new file mode 100644
|
||||
index 00000000000..89e086de97b
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-22.c
|
||||
@@ -0,0 +1,15 @@
|
||||
+/* PR target/r84530 */
|
||||
+/* { dg-do compile { target ia32 } } */
|
||||
+/* { dg-options "-O2 -mfunction-return=thunk" } */
|
||||
+
|
||||
+struct s { _Complex unsigned short x; };
|
||||
+struct s gs = { 100 + 200i };
|
||||
+struct s __attribute__((noinline)) foo (void) { return gs; }
|
||||
+
|
||||
+/* { dg-final { scan-assembler-times "popl\[\\t \]*%ecx" 1 } } */
|
||||
+/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*4\\(%esp\\), %esp" } } */
|
||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk_ecx" } } */
|
||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
|
||||
+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
|
||||
+/* { dg-final { scan-assembler {\tpause} } } */
|
||||
+/* { dg-final { scan-assembler {\tlfence} } } */
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-23.c b/gcc/testsuite/gcc.target/i386/ret-thunk-23.c
|
||||
new file mode 100644
|
||||
index 00000000000..43f0ccaa854
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-23.c
|
||||
@@ -0,0 +1,15 @@
|
||||
+/* PR target/r84530 */
|
||||
+/* { dg-do compile { target ia32 } } */
|
||||
+/* { dg-options "-O2 -mfunction-return=thunk-extern" } */
|
||||
+
|
||||
+struct s { _Complex unsigned short x; };
|
||||
+struct s gs = { 100 + 200i };
|
||||
+struct s __attribute__((noinline)) foo (void) { return gs; }
|
||||
+
|
||||
+/* { dg-final { scan-assembler-times "popl\[\\t \]*%ecx" 1 } } */
|
||||
+/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*4\\(%esp\\), %esp" } } */
|
||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk_ecx" } } */
|
||||
+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
|
||||
+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
|
||||
+/* { dg-final { scan-assembler-not {\tpause} } } */
|
||||
+/* { dg-final { scan-assembler-not {\tlfence} } } */
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-24.c b/gcc/testsuite/gcc.target/i386/ret-thunk-24.c
|
||||
new file mode 100644
|
||||
index 00000000000..8729e35147e
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-24.c
|
||||
@@ -0,0 +1,15 @@
|
||||
+/* PR target/r84530 */
|
||||
+/* { dg-do compile { target ia32 } } */
|
||||
+/* { dg-options "-O2 -mfunction-return=thunk-inline" } */
|
||||
+
|
||||
+struct s { _Complex unsigned short x; };
|
||||
+struct s gs = { 100 + 200i };
|
||||
+struct s __attribute__((noinline)) foo (void) { return gs; }
|
||||
+
|
||||
+/* { dg-final { scan-assembler-times "popl\[\\t \]*%ecx" 1 } } */
|
||||
+/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*4\\(%esp\\), %esp" } } */
|
||||
+/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk_ecx" } } */
|
||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
|
||||
+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
|
||||
+/* { dg-final { scan-assembler {\tpause} } } */
|
||||
+/* { dg-final { scan-assembler {\tlfence} } } */
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-25.c b/gcc/testsuite/gcc.target/i386/ret-thunk-25.c
|
||||
new file mode 100644
|
||||
index 00000000000..f73553c9a9f
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-25.c
|
||||
@@ -0,0 +1,15 @@
|
||||
+/* PR target/r84530 */
|
||||
+/* { dg-do compile { target ia32 } } */
|
||||
+/* { dg-options "-O2 -mfunction-return=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
|
||||
+
|
||||
+struct s { _Complex unsigned short x; };
|
||||
+struct s gs = { 100 + 200i };
|
||||
+struct s __attribute__((noinline)) foo (void) { return gs; }
|
||||
+
|
||||
+/* { dg-final { scan-assembler-times "popl\[\\t \]*%ecx" 1 } } */
|
||||
+/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*4\\(%esp\\), %esp" } } */
|
||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk_bnd_ecx" } } */
|
||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
|
||||
+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
|
||||
+/* { dg-final { scan-assembler {\tpause} } } */
|
||||
+/* { dg-final { scan-assembler {\tlfence} } } */
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-26.c b/gcc/testsuite/gcc.target/i386/ret-thunk-26.c
|
||||
new file mode 100644
|
||||
index 00000000000..9144e988735
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-26.c
|
||||
@@ -0,0 +1,40 @@
|
||||
+/* PR target/r84530 */
|
||||
+/* { dg-do run } */
|
||||
+/* { dg-options "-Os -mfunction-return=thunk" } */
|
||||
+
|
||||
+struct S { int i; };
|
||||
+__attribute__((const, noinline, noclone))
|
||||
+struct S foo (int x)
|
||||
+{
|
||||
+ struct S s;
|
||||
+ s.i = x;
|
||||
+ return s;
|
||||
+}
|
||||
+
|
||||
+int a[2048], b[2048], c[2048], d[2048];
|
||||
+struct S e[2048];
|
||||
+
|
||||
+__attribute__((noinline, noclone)) void
|
||||
+bar (void)
|
||||
+{
|
||||
+ int i;
|
||||
+ for (i = 0; i < 1024; i++)
|
||||
+ {
|
||||
+ e[i] = foo (i);
|
||||
+ a[i+2] = a[i] + a[i+1];
|
||||
+ b[10] = b[10] + i;
|
||||
+ c[i] = c[2047 - i];
|
||||
+ d[i] = d[i + 1];
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main ()
|
||||
+{
|
||||
+ int i;
|
||||
+ bar ();
|
||||
+ for (i = 0; i < 1024; i++)
|
||||
+ if (e[i].i != i)
|
||||
+ __builtin_abort ();
|
||||
+ return 0;
|
||||
+}
|
||||
--
|
||||
2.16.3
|
||||
|
1003
temp/gcc6/0012-i386-Add-TARGET_INDIRECT_BRANCH_REGISTER.patch
Normal file
1003
temp/gcc6/0012-i386-Add-TARGET_INDIRECT_BRANCH_REGISTER.patch
Normal file
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,225 @@
|
|||
From e7fbaebc8ff650df76f43e92cb9ca59d5174ebe7 Mon Sep 17 00:00:00 2001
|
||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
||||
Date: Thu, 15 Mar 2018 17:54:40 +0000
|
||||
Subject: [PATCH 13/13] i386: Don't generate alias for function return thunk
|
||||
|
||||
Function return thunks shouldn't be aliased to indirect branch thunks
|
||||
since indirect branch thunks are placed in COMDAT section and a COMDAT
|
||||
section with indirect branch may not have function return thunk. This
|
||||
patch generates function return thunks directly.
|
||||
|
||||
gcc/
|
||||
|
||||
Backport from mainline
|
||||
PR target/84574
|
||||
* config/i386/i386.c (indirect_thunk_needed): Update comments.
|
||||
(indirect_thunk_bnd_needed): Likewise.
|
||||
(indirect_thunks_used): Likewise.
|
||||
(indirect_thunks_bnd_used): Likewise.
|
||||
(indirect_return_needed): New.
|
||||
(indirect_return_bnd_needed): Likewise.
|
||||
(output_indirect_thunk_function): Add a bool argument for
|
||||
function return.
|
||||
(output_indirect_thunk_function): Don't generate alias for
|
||||
function return thunk.
|
||||
(ix86_code_end): Call output_indirect_thunk_function to generate
|
||||
function return thunks.
|
||||
(ix86_output_function_return): Set indirect_return_bnd_needed
|
||||
and indirect_return_needed instead of indirect_thunk_bnd_needed
|
||||
and indirect_thunk_needed.
|
||||
|
||||
gcc/testsuite/
|
||||
|
||||
Backport from mainline
|
||||
PR target/84574
|
||||
* gcc.target/i386/ret-thunk-9.c: Expect __x86_return_thunk
|
||||
label instead of __x86_indirect_thunk label.
|
||||
---
|
||||
gcc/config/i386/i386.c | 92 ++++++++++-------------------
|
||||
gcc/testsuite/gcc.target/i386/ret-thunk-9.c | 2 +-
|
||||
2 files changed, 33 insertions(+), 61 deletions(-)
|
||||
|
||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
||||
index 21c3c18bd3c..f4cd1c6f4e9 100644
|
||||
--- a/gcc/config/i386/i386.c
|
||||
+++ b/gcc/config/i386/i386.c
|
||||
@@ -11067,19 +11067,23 @@ ix86_setup_frame_addresses (void)
|
||||
labels in call and return thunks. */
|
||||
static int indirectlabelno;
|
||||
|
||||
-/* True if call and return thunk functions are needed. */
|
||||
+/* True if call thunk function is needed. */
|
||||
static bool indirect_thunk_needed = false;
|
||||
-/* True if call and return thunk functions with the BND prefix are
|
||||
- needed. */
|
||||
+/* True if call thunk function with the BND prefix is needed. */
|
||||
static bool indirect_thunk_bnd_needed = false;
|
||||
|
||||
/* Bit masks of integer registers, which contain branch target, used
|
||||
- by call and return thunks functions. */
|
||||
+ by call thunk functions. */
|
||||
static int indirect_thunks_used;
|
||||
/* Bit masks of integer registers, which contain branch target, used
|
||||
- by call and return thunks functions with the BND prefix. */
|
||||
+ by call thunk functions with the BND prefix. */
|
||||
static int indirect_thunks_bnd_used;
|
||||
|
||||
+/* True if return thunk function is needed. */
|
||||
+static bool indirect_return_needed = false;
|
||||
+/* True if return thunk function with the BND prefix is needed. */
|
||||
+static bool indirect_return_bnd_needed = false;
|
||||
+
|
||||
/* True if return thunk function via CX is needed. */
|
||||
static bool indirect_return_via_cx;
|
||||
/* True if return thunk function via CX with the BND prefix is
|
||||
@@ -11226,16 +11230,18 @@ output_indirect_thunk (bool need_bnd_p, unsigned int regno)
|
||||
/* Output a funtion with a call and return thunk for indirect branch.
|
||||
If BND_P is true, the BND prefix is needed. If REGNO != INVALID_REGNUM,
|
||||
the function address is in REGNO. Otherwise, the function address is
|
||||
- on the top of stack. */
|
||||
+ on the top of stack. Thunk is used for function return if RET_P is
|
||||
+ true. */
|
||||
|
||||
static void
|
||||
-output_indirect_thunk_function (bool need_bnd_p, unsigned int regno)
|
||||
+output_indirect_thunk_function (bool need_bnd_p, unsigned int regno,
|
||||
+ bool ret_p)
|
||||
{
|
||||
char name[32];
|
||||
tree decl;
|
||||
|
||||
/* Create __x86_indirect_thunk/__x86_indirect_thunk_bnd. */
|
||||
- indirect_thunk_name (name, regno, need_bnd_p, false);
|
||||
+ indirect_thunk_name (name, regno, need_bnd_p, ret_p);
|
||||
decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
|
||||
get_identifier (name),
|
||||
build_function_type_list (void_type_node, NULL_TREE));
|
||||
@@ -11278,50 +11284,6 @@ output_indirect_thunk_function (bool need_bnd_p, unsigned int regno)
|
||||
ASM_OUTPUT_LABEL (asm_out_file, name);
|
||||
}
|
||||
|
||||
- /* Create alias for __x86_return_thunk/__x86_return_thunk_bnd or
|
||||
- __x86_return_thunk_ecx/__x86_return_thunk_ecx_bnd. */
|
||||
- bool need_alias;
|
||||
- if (regno == INVALID_REGNUM)
|
||||
- need_alias = true;
|
||||
- else if (regno == CX_REG)
|
||||
- {
|
||||
- if (need_bnd_p)
|
||||
- need_alias = indirect_return_via_cx_bnd;
|
||||
- else
|
||||
- need_alias = indirect_return_via_cx;
|
||||
- }
|
||||
- else
|
||||
- need_alias = false;
|
||||
-
|
||||
- if (need_alias)
|
||||
- {
|
||||
- char alias[32];
|
||||
-
|
||||
- indirect_thunk_name (alias, regno, need_bnd_p, true);
|
||||
-#if TARGET_MACHO
|
||||
- if (TARGET_MACHO)
|
||||
- {
|
||||
- fputs ("\t.weak_definition\t", asm_out_file);
|
||||
- assemble_name (asm_out_file, alias);
|
||||
- fputs ("\n\t.private_extern\t", asm_out_file);
|
||||
- assemble_name (asm_out_file, alias);
|
||||
- putc ('\n', asm_out_file);
|
||||
- ASM_OUTPUT_LABEL (asm_out_file, alias);
|
||||
- }
|
||||
-#else
|
||||
- ASM_OUTPUT_DEF (asm_out_file, alias, name);
|
||||
- if (USE_HIDDEN_LINKONCE)
|
||||
- {
|
||||
- fputs ("\t.globl\t", asm_out_file);
|
||||
- assemble_name (asm_out_file, alias);
|
||||
- putc ('\n', asm_out_file);
|
||||
- fputs ("\t.hidden\t", asm_out_file);
|
||||
- assemble_name (asm_out_file, alias);
|
||||
- putc ('\n', asm_out_file);
|
||||
- }
|
||||
-#endif
|
||||
- }
|
||||
-
|
||||
DECL_INITIAL (decl) = make_node (BLOCK);
|
||||
current_function_decl = decl;
|
||||
allocate_struct_function (decl, false);
|
||||
@@ -11368,19 +11330,29 @@ ix86_code_end (void)
|
||||
rtx xops[2];
|
||||
unsigned int regno;
|
||||
|
||||
+ if (indirect_return_needed)
|
||||
+ output_indirect_thunk_function (false, INVALID_REGNUM, true);
|
||||
+ if (indirect_return_bnd_needed)
|
||||
+ output_indirect_thunk_function (true, INVALID_REGNUM, true);
|
||||
+
|
||||
+ if (indirect_return_via_cx)
|
||||
+ output_indirect_thunk_function (false, CX_REG, true);
|
||||
+ if (indirect_return_via_cx_bnd)
|
||||
+ output_indirect_thunk_function (true, CX_REG, true);
|
||||
+
|
||||
if (indirect_thunk_needed)
|
||||
- output_indirect_thunk_function (false, INVALID_REGNUM);
|
||||
+ output_indirect_thunk_function (false, INVALID_REGNUM, false);
|
||||
if (indirect_thunk_bnd_needed)
|
||||
- output_indirect_thunk_function (true, INVALID_REGNUM);
|
||||
+ output_indirect_thunk_function (true, INVALID_REGNUM, false);
|
||||
|
||||
for (regno = FIRST_REX_INT_REG; regno <= LAST_REX_INT_REG; regno++)
|
||||
{
|
||||
unsigned int i = regno - FIRST_REX_INT_REG + LAST_INT_REG + 1;
|
||||
if ((indirect_thunks_used & (1 << i)))
|
||||
- output_indirect_thunk_function (false, regno);
|
||||
+ output_indirect_thunk_function (false, regno, false);
|
||||
|
||||
if ((indirect_thunks_bnd_used & (1 << i)))
|
||||
- output_indirect_thunk_function (true, regno);
|
||||
+ output_indirect_thunk_function (true, regno, false);
|
||||
}
|
||||
|
||||
for (regno = AX_REG; regno <= SP_REG; regno++)
|
||||
@@ -11389,10 +11361,10 @@ ix86_code_end (void)
|
||||
tree decl;
|
||||
|
||||
if ((indirect_thunks_used & (1 << regno)))
|
||||
- output_indirect_thunk_function (false, regno);
|
||||
+ output_indirect_thunk_function (false, regno, false);
|
||||
|
||||
if ((indirect_thunks_bnd_used & (1 << regno)))
|
||||
- output_indirect_thunk_function (true, regno);
|
||||
+ output_indirect_thunk_function (true, regno, false);
|
||||
|
||||
if (!(pic_labels_used & (1 << regno)))
|
||||
continue;
|
||||
@@ -28077,12 +28049,12 @@ ix86_output_function_return (bool long_p)
|
||||
true);
|
||||
if (need_bnd_p)
|
||||
{
|
||||
- indirect_thunk_bnd_needed |= need_thunk;
|
||||
+ indirect_return_bnd_needed |= need_thunk;
|
||||
fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
- indirect_thunk_needed |= need_thunk;
|
||||
+ indirect_return_needed |= need_thunk;
|
||||
fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);
|
||||
}
|
||||
}
|
||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
||||
index d2df8b874e0..eee230ca2f6 100644
|
||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
||||
@@ -13,7 +13,7 @@ foo (void)
|
||||
/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */
|
||||
/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
|
||||
/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
|
||||
-/* { dg-final { scan-assembler "__x86_indirect_thunk:" } } */
|
||||
+/* { dg-final { scan-assembler "__x86_return_thunk:" } } */
|
||||
/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?bar" { target *-*-linux* } } } */
|
||||
/* { dg-final { scan-assembler-times {\tpause} 2 } } */
|
||||
/* { dg-final { scan-assembler-times {\tlfence} 2 } } */
|
||||
--
|
||||
2.16.3
|
||||
|
215
temp/gcc6/001_all_default-ssp-strong.patch
Normal file
215
temp/gcc6/001_all_default-ssp-strong.patch
Normal file
|
@ -0,0 +1,215 @@
|
|||
# DP: Turn on -fstack-protector by default for C, C++, ObjC, ObjC++.
|
||||
# DP: Build libgcc using -fno-stack-protector.
|
||||
|
||||
---
|
||||
gcc/Makefile.in | 2 ++
|
||||
gcc/cp/lang-specs.h | 6 +++---
|
||||
gcc/doc/invoke.texi | 4 ++++
|
||||
gcc/gcc.c | 18 ++++++++++++++----
|
||||
gcc/objc/lang-specs.h | 10 +++++-----
|
||||
gcc/objcp/lang-specs.h | 8 ++++----
|
||||
6 files changed, 32 insertions(+), 16 deletions(-)
|
||||
|
||||
Index: b/gcc/gcc.c
|
||||
===================================================================
|
||||
--- a/gcc/gcc.c
|
||||
+++ b/gcc/gcc.c
|
||||
@@ -858,6 +858,14 @@ proper position among the other output f
|
||||
#define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G"
|
||||
#endif
|
||||
|
||||
+#ifndef SSP_DEFAULT_SPEC
|
||||
+#ifdef TARGET_LIBC_PROVIDES_SSP
|
||||
+#define SSP_DEFAULT_SPEC "%{!fno-stack-protector:%{!fstack-protector-all:%{!ffreestanding:%{!nostdlib:%{!fstack-protector:-fstack-protector-strong}}}}}"
|
||||
+#else
|
||||
+#define SSP_DEFAULT_SPEC ""
|
||||
+#endif
|
||||
+#endif
|
||||
+
|
||||
#ifndef LINK_SSP_SPEC
|
||||
#ifdef TARGET_LIBC_PROVIDES_SSP
|
||||
#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
|
||||
@@ -1057,6 +1065,7 @@ static const char *cc1_spec = CC1_SPEC;
|
||||
static const char *cc1plus_spec = CC1PLUS_SPEC;
|
||||
static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
|
||||
static const char *link_ssp_spec = LINK_SSP_SPEC;
|
||||
+static const char *ssp_default_spec = SSP_DEFAULT_SPEC;
|
||||
static const char *asm_spec = ASM_SPEC;
|
||||
static const char *asm_final_spec = ASM_FINAL_SPEC;
|
||||
static const char *link_spec = LINK_SPEC;
|
||||
@@ -1112,7 +1121,7 @@ static const char *cpp_unique_options =
|
||||
static const char *cpp_options =
|
||||
"%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
|
||||
%{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*}\
|
||||
- %{undef} %{save-temps*:-fpch-preprocess}";
|
||||
+ %{undef} %{save-temps*:-fpch-preprocess} %(ssp_default)";
|
||||
|
||||
/* This contains cpp options which are not passed when the preprocessor
|
||||
output will be used by another program. */
|
||||
@@ -1301,9 +1310,9 @@ static const struct compiler default_com
|
||||
%{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
|
||||
%(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
|
||||
cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
|
||||
- %(cc1_options)}\
|
||||
+ %(cc1_options) %(ssp_default)}\
|
||||
%{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
|
||||
- cc1 %(cpp_unique_options) %(cc1_options)}}}\
|
||||
+ cc1 %(cpp_unique_options) %(cc1_options) %(ssp_default)}}}\
|
||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
|
||||
{"-",
|
||||
"%{!E:%e-E or -x required when input is from standard input}\
|
||||
@@ -1328,7 +1337,7 @@ static const struct compiler default_com
|
||||
%W{o*:--output-pch=%*}}%V}}}}}}}", 0, 0, 0},
|
||||
{".i", "@cpp-output", 0, 0, 0},
|
||||
{"@cpp-output",
|
||||
- "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
||||
+ "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %(ssp_default) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
||||
{".s", "@assembler", 0, 0, 0},
|
||||
{"@assembler",
|
||||
"%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
|
||||
@@ -1560,6 +1569,7 @@ static struct spec_list static_specs[] =
|
||||
INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
|
||||
INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
|
||||
INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
|
||||
+ INIT_STATIC_SPEC ("ssp_default", &ssp_default_spec),
|
||||
INIT_STATIC_SPEC ("endfile", &endfile_spec),
|
||||
INIT_STATIC_SPEC ("link", &link_spec),
|
||||
INIT_STATIC_SPEC ("lib", &lib_spec),
|
||||
Index: b/gcc/cp/lang-specs.h
|
||||
===================================================================
|
||||
--- a/gcc/cp/lang-specs.h
|
||||
+++ b/gcc/cp/lang-specs.h
|
||||
@@ -46,7 +46,7 @@ along with GCC; see the file COPYING3.
|
||||
%(cpp_options) %2 -o %{save-temps*:%b.ii} %{!save-temps*:%g.ii} \n}\
|
||||
cc1plus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.ii} %{!save-temps*:%g.ii}}\
|
||||
%{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
|
||||
- %(cc1_options) %2\
|
||||
+ %(cc1_options) %(ssp_default) %2\
|
||||
%{!fsyntax-only:-o %g.s \
|
||||
%{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
|
||||
%W{o*:--output-pch=%*}}%V}}}}",
|
||||
@@ -58,11 +58,11 @@ along with GCC; see the file COPYING3.
|
||||
%(cpp_options) %2 -o %{save-temps*:%b.ii} %{!save-temps*:%g.ii} \n}\
|
||||
cc1plus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.ii} %{!save-temps*:%g.ii}}\
|
||||
%{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
|
||||
- %(cc1_options) %2\
|
||||
+ %(cc1_options) %(ssp_default) %2\
|
||||
%{!fsyntax-only:%(invoke_as)}}}}",
|
||||
CPLUSPLUS_CPP_SPEC, 0, 0},
|
||||
{".ii", "@c++-cpp-output", 0, 0, 0},
|
||||
{"@c++-cpp-output",
|
||||
"%{!M:%{!MM:%{!E:\
|
||||
- cc1plus -fpreprocessed %i %(cc1_options) %2\
|
||||
+ cc1plus -fpreprocessed %i %(cc1_options) %(ssp_default) %2\
|
||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
||||
Index: b/gcc/params.def
|
||||
===================================================================
|
||||
--- a/gcc/params.def
|
||||
+++ b/gcc/params.def
|
||||
@@ -673,7 +673,7 @@ DEFPARAM (PARAM_INTEGER_SHARE_LIMIT,
|
||||
DEFPARAM (PARAM_SSP_BUFFER_SIZE,
|
||||
"ssp-buffer-size",
|
||||
"The lower bound for a buffer to be considered for stack smashing protection.",
|
||||
- 8, 1, 0)
|
||||
+ 4, 1, 0)
|
||||
|
||||
DEFPARAM (PARAM_MIN_SIZE_FOR_STACK_SHARING,
|
||||
"min-size-for-stack-sharing",
|
||||
Index: b/gcc/objc/lang-specs.h
|
||||
===================================================================
|
||||
--- a/gcc/objc/lang-specs.h
|
||||
+++ b/gcc/objc/lang-specs.h
|
||||
@@ -29,9 +29,9 @@ along with GCC; see the file COPYING3.
|
||||
%{traditional|traditional-cpp:\
|
||||
%eGNU Objective C no longer supports traditional compilation}\
|
||||
%{save-temps*|no-integrated-cpp:cc1obj -E %(cpp_options) -o %{save-temps*:%b.mi} %{!save-temps*:%g.mi} \n\
|
||||
- cc1obj -fpreprocessed %{save-temps*:%b.mi} %{!save-temps*:%g.mi} %(cc1_options) %{print-objc-runtime-info} %{gen-decls}}\
|
||||
+ cc1obj -fpreprocessed %{save-temps*:%b.mi} %{!save-temps*:%g.mi} %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}}\
|
||||
%{!save-temps*:%{!no-integrated-cpp:\
|
||||
- cc1obj %(cpp_unique_options) %(cc1_options) %{print-objc-runtime-info} %{gen-decls}}}\
|
||||
+ cc1obj %(cpp_unique_options) %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}}}\
|
||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
||||
{"@objective-c-header",
|
||||
"%{E|M|MM:cc1obj -E %{traditional|traditional-cpp:-traditional-cpp}\
|
||||
@@ -40,18 +40,18 @@ along with GCC; see the file COPYING3.
|
||||
%{traditional|traditional-cpp:\
|
||||
%eGNU Objective C no longer supports traditional compilation}\
|
||||
%{save-temps*|no-integrated-cpp:cc1obj -E %(cpp_options) -o %{save-temps*:%b.mi} %{!save-temps*:%g.mi} \n\
|
||||
- cc1obj -fpreprocessed %b.mi %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
|
||||
+ cc1obj -fpreprocessed %b.mi %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}\
|
||||
-o %g.s %{!o*:--output-pch=%i.gch}\
|
||||
%W{o*:--output-pch=%*}%V}\
|
||||
%{!save-temps*:%{!no-integrated-cpp:\
|
||||
- cc1obj %(cpp_unique_options) %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
|
||||
+ cc1obj %(cpp_unique_options) %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}\
|
||||
-o %g.s %{!o*:--output-pch=%i.gch}\
|
||||
%W{o*:--output-pch=%*}%V}}}}}", 0, 0, 0},
|
||||
{".mi", "@objective-c-cpp-output", 0, 0, 0},
|
||||
{"@objective-c-cpp-output",
|
||||
- "%{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
|
||||
+ "%{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}\
|
||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
||||
{"@objc-cpp-output",
|
||||
"%nobjc-cpp-output is deprecated; please use objective-c-cpp-output instead\n\
|
||||
- %{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
|
||||
+ %{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}\
|
||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
||||
Index: b/gcc/objcp/lang-specs.h
|
||||
===================================================================
|
||||
--- a/gcc/objcp/lang-specs.h
|
||||
+++ b/gcc/objcp/lang-specs.h
|
||||
@@ -36,7 +36,7 @@ along with GCC; see the file COPYING3.
|
||||
%(cpp_options) %2 -o %{save-temps*:%b.mii} %{!save-temps*:%g.mii} \n}\
|
||||
cc1objplus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.mii} %{!save-temps*:%g.mii}}\
|
||||
%{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
|
||||
- %(cc1_options) %2\
|
||||
+ %(cc1_options) %(ssp_default) %2\
|
||||
-o %g.s %{!o*:--output-pch=%i.gch} %W{o*:--output-pch=%*}%V}}}",
|
||||
CPLUSPLUS_CPP_SPEC, 0, 0},
|
||||
{"@objective-c++",
|
||||
@@ -46,16 +46,16 @@ along with GCC; see the file COPYING3.
|
||||
%(cpp_options) %2 -o %{save-temps*:%b.mii} %{!save-temps*:%g.mii} \n}\
|
||||
cc1objplus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.mii} %{!save-temps*:%g.mii}}\
|
||||
%{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
|
||||
- %(cc1_options) %2\
|
||||
+ %(cc1_options) %(ssp_default) %2\
|
||||
%{!fsyntax-only:%(invoke_as)}}}}",
|
||||
CPLUSPLUS_CPP_SPEC, 0, 0},
|
||||
{".mii", "@objective-c++-cpp-output", 0, 0, 0},
|
||||
{"@objective-c++-cpp-output",
|
||||
"%{!M:%{!MM:%{!E:\
|
||||
- cc1objplus -fpreprocessed %i %(cc1_options) %2\
|
||||
+ cc1objplus -fpreprocessed %i %(cc1_options) %(ssp_default) %2\
|
||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
||||
{"@objc++-cpp-output",
|
||||
"%nobjc++-cpp-output is deprecated; please use objective-c++-cpp-output instead\n\
|
||||
%{!M:%{!MM:%{!E:\
|
||||
- cc1objplus -fpreprocessed %i %(cc1_options) %2\
|
||||
+ cc1objplus -fpreprocessed %i %(cc1_options) %(ssp_default) %2\
|
||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
||||
Index: b/gcc/doc/invoke.texi
|
||||
===================================================================
|
||||
--- a/gcc/doc/invoke.texi
|
||||
+++ b/gcc/doc/invoke.texi
|
||||
@@ -9247,6 +9247,9 @@
|
||||
The minimum size of variables taking part in stack slot sharing when not
|
||||
optimizing. The default value is 32.
|
||||
|
||||
+The Alpine Linux default is "4", to increase
|
||||
+the number of functions protected by the stack protector.
|
||||
+
|
||||
@item max-jump-thread-duplication-stmts
|
||||
Maximum number of statements allowed in a block that needs to be
|
||||
duplicated when threading jumps.
|
||||
@@ -10185,6 +10188,11 @@
|
||||
Like @option{-fstack-protector} but includes additional functions to
|
||||
be protected --- those that have local array definitions, or have
|
||||
references to local frame addresses.
|
||||
+
|
||||
+NOTE: In Alpine Linux,
|
||||
+@option{-fstack-protector-strong} is enabled by default for C,
|
||||
+C++, ObjC, ObjC++, if none of @option{-fno-stack-protector},
|
||||
+@option{-nostdlib}, nor @option{-ffreestanding} are found.
|
||||
|
||||
@item -fstack-protector-explicit
|
||||
@opindex fstack-protector-explicit
|
33
temp/gcc6/002_all_default-relro.patch
Normal file
33
temp/gcc6/002_all_default-relro.patch
Normal file
|
@ -0,0 +1,33 @@
|
|||
# Turn on -Wl,-z,relro,-z,now by default.
|
||||
|
||||
---
|
||||
gcc/doc/invoke.texi | 3 +++
|
||||
gcc/gcc.c | 1 +
|
||||
2 files changed, 4 insertions(+), 0 deletions(-)
|
||||
|
||||
Index: b/gcc/doc/invoke.texi
|
||||
===================================================================
|
||||
--- a/gcc/doc/invoke.texi
|
||||
+++ b/gcc/doc/invoke.texi
|
||||
@@ -11424,6 +11424,9 @@ For example, @option{-Wl,-Map,output.map
|
||||
linker. When using the GNU linker, you can also get the same effect with
|
||||
@option{-Wl,-Map=output.map}.
|
||||
|
||||
+NOTE: In Alpine Linux, for LDFLAGS, the option
|
||||
+@option{-Wl,-z,relro,now} is used. To disable, use @option{-Wl,-z,norelro}.
|
||||
+
|
||||
@item -u @var{symbol}
|
||||
@opindex u
|
||||
Pretend the symbol @var{symbol} is undefined, to force linking of
|
||||
Index: b/gcc/gcc.c
|
||||
===================================================================
|
||||
--- a/gcc/gcc.c
|
||||
+++ b/gcc/gcc.c
|
||||
@@ -890,6 +890,7 @@ proper position among the other output f
|
||||
"%{flto|flto=*:%<fcompare-debug*} \
|
||||
%{flto} %{fno-lto} %{flto=*} %l " LINK_PIE_SPEC \
|
||||
"%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
|
||||
+ "-z relro -z now " \
|
||||
"%X %{o*} %{e*} %{N} %{n} %{r}\
|
||||
%{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}} " VTABLE_VERIFICATION_SPEC " \
|
||||
%{static:} %{L*} %(mfwrap) %(link_libgcc) " SANITIZER_EARLY_SPEC " %o\
|
40
temp/gcc6/003_all_default-fortify-source.patch
Normal file
40
temp/gcc6/003_all_default-fortify-source.patch
Normal file
|
@ -0,0 +1,40 @@
|
|||
# DP: Turn on -D_FORTIFY_SOURCE=2 by default for C, C++, ObjC, ObjC++,
|
||||
# DP: if the optimization level is > 0
|
||||
|
||||
---
|
||||
gcc/doc/invoke.texi | 6 ++++++
|
||||
gcc/c-family/c-cppbuiltin.c | 3 +
|
||||
2 files changed, 9 insertions(+), 0 deletions(-)
|
||||
|
||||
Index: b/gcc/doc/invoke.texi
|
||||
===================================================================
|
||||
--- a/gcc/doc/invoke.texi
|
||||
+++ b/gcc/doc/invoke.texi
|
||||
@@ -7840,6 +7840,12 @@ also turns on the following optimization
|
||||
Please note the warning under @option{-fgcse} about
|
||||
invoking @option{-O2} on programs that use computed gotos.
|
||||
|
||||
+NOTE: In Alpine Linux, @option{-D_FORTIFY_SOURCE=2} is
|
||||
+set by default, and is activated when @option{-O} is set to 2 or higher.
|
||||
+This enables additional compile-time and run-time checks for several libc
|
||||
+functions. To disable, specify either @option{-U_FORTIFY_SOURCE} or
|
||||
+@option{-D_FORTIFY_SOURCE=0}.
|
||||
+
|
||||
@item -O3
|
||||
@opindex O3
|
||||
Optimize yet more. @option{-O3} turns on all optimizations specified
|
||||
Index: b/gcc/c-family/c-cppbuiltin.c
|
||||
===================================================================
|
||||
--- a/gcc/c-family/c-cppbuiltin.c
|
||||
+++ b/gcc/c-family/c-cppbuiltin.c
|
||||
@@ -1176,6 +1176,10 @@ c_cpp_builtins (cpp_reader *pfile)
|
||||
builtin_define_with_value ("__REGISTER_PREFIX__", REGISTER_PREFIX, 0);
|
||||
builtin_define_with_value ("__USER_LABEL_PREFIX__", user_label_prefix, 0);
|
||||
|
||||
+ /* Fortify Source enabled by default for optimization levels > 0 */
|
||||
+ if (optimize)
|
||||
+ builtin_define_with_int_value ("_FORTIFY_SOURCE", 2);
|
||||
+
|
||||
/* Misc. */
|
||||
if (flag_gnu89_inline)
|
||||
cpp_define (pfile, "__GNUC_GNU_INLINE__");
|
241
temp/gcc6/005_all_default-as-needed.patch
Normal file
241
temp/gcc6/005_all_default-as-needed.patch
Normal file
|
@ -0,0 +1,241 @@
|
|||
# DP: On linux targets pass --as-needed by default to the linker, but always
|
||||
# DP: link the sanitizer libraries with --no-as-needed.
|
||||
|
||||
--- a/gcc/gcc.c
|
||||
+++ b/gcc/gcc.c
|
||||
@@ -568,8 +568,11 @@ proper position among the other output f
|
||||
#ifdef LIBTSAN_EARLY_SPEC
|
||||
#define LIBTSAN_SPEC STATIC_LIBTSAN_LIBS
|
||||
#elif defined(HAVE_LD_STATIC_DYNAMIC)
|
||||
-#define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \
|
||||
- "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
|
||||
+#define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION "}" \
|
||||
+ " %{!static-libtsan:%{!fuse-ld=gold:--push-state }--no-as-needed}" \
|
||||
+ " -ltsan " \
|
||||
+ " %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
|
||||
+ " %{!static-libtsan:%{fuse-ld=gold:--as-needed;:--pop-state}}" \
|
||||
STATIC_LIBTSAN_LIBS
|
||||
#else
|
||||
#define LIBTSAN_SPEC "-ltsan" STATIC_LIBTSAN_LIBS
|
||||
--- a/gcc/config/gnu-user.h
|
||||
+++ b/gcc/config/gnu-user.h
|
||||
@@ -124,13 +124,13 @@
|
||||
#define LIBASAN_EARLY_SPEC "%{!shared:libasan_preinit%O%s} " \
|
||||
"%{static-libasan:%{!shared:" \
|
||||
LD_STATIC_OPTION " --whole-archive -lasan --no-whole-archive " \
|
||||
- LD_DYNAMIC_OPTION "}}%{!static-libasan:-lasan}"
|
||||
+ LD_DYNAMIC_OPTION "}}%{!static-libasan:%{!fuse-ld=gold:--push-state} --no-as-needed -lasan %{fuse-ld=gold:--as-needed;:--pop-state}}"
|
||||
#undef LIBTSAN_EARLY_SPEC
|
||||
#define LIBTSAN_EARLY_SPEC "%{static-libtsan:%{!shared:" \
|
||||
LD_STATIC_OPTION " --whole-archive -ltsan --no-whole-archive " \
|
||||
- LD_DYNAMIC_OPTION "}}%{!static-libtsan:-ltsan}"
|
||||
+ LD_DYNAMIC_OPTION "}}%{!static-libtsan:%{!fuse-ld=gold:--push-state} --no-as-needed -ltsan %{fuse-ld=gold:--as-needed;:--pop-state}}"
|
||||
#undef LIBLSAN_EARLY_SPEC
|
||||
#define LIBLSAN_EARLY_SPEC "%{static-liblsan:%{!shared:" \
|
||||
LD_STATIC_OPTION " --whole-archive -llsan --no-whole-archive " \
|
||||
- LD_DYNAMIC_OPTION "}}%{!static-liblsan:-llsan}"
|
||||
+ LD_DYNAMIC_OPTION "}}%{!static-liblsan:%{!fuse-ld=gold:--push-state} --no-as-needed -llsan %{fuse-ld=gold:--as-needed;:--pop-state}}"
|
||||
#endif
|
||||
Index: b/gcc/config/aarch64/aarch64-linux.h
|
||||
===================================================================
|
||||
--- a/gcc/config/aarch64/aarch64-linux.h
|
||||
+++ b/gcc/config/aarch64/aarch64-linux.h
|
||||
@@ -36,5 +36,6 @@
|
||||
|
||||
#define LINUX_TARGET_LINK_SPEC "%{h*} \
|
||||
+ --as-needed \
|
||||
%{static:-Bstatic} \
|
||||
%{shared:-shared} \
|
||||
%{symbolic:-Bsymbolic} \
|
||||
Index: b/gcc/config/ia64/linux.h
|
||||
===================================================================
|
||||
--- a/gcc/config/ia64/linux.h
|
||||
+++ b/gcc/config/ia64/linux.h
|
||||
@@ -58,7 +58,7 @@ do { \
|
||||
#define GLIBC_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2"
|
||||
|
||||
#undef LINK_SPEC
|
||||
-#define LINK_SPEC "\
|
||||
+#define LINK_SPEC " --as-needed \
|
||||
%{shared:-shared} \
|
||||
%{!shared: \
|
||||
%{!static: \
|
||||
Index: b/gcc/config/sparc/linux.h
|
||||
===================================================================
|
||||
--- a/gcc/config/sparc/linux.h
|
||||
+++ b/gcc/config/sparc/linux.h
|
||||
@@ -86,7 +86,7 @@ extern const char *host_detect_local_cpu
|
||||
#define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2"
|
||||
|
||||
#undef LINK_SPEC
|
||||
-#define LINK_SPEC "-m elf32_sparc %{shared:-shared} \
|
||||
+#define LINK_SPEC "-m elf32_sparc --as-needed %{shared:-shared} \
|
||||
%{!mno-relax:%{!r:-relax}} \
|
||||
%{!shared: \
|
||||
%{!static: \
|
||||
Index: b/gcc/config/s390/linux.h
|
||||
===================================================================
|
||||
--- a/gcc/config/s390/linux.h
|
||||
+++ b/gcc/config/s390/linux.h
|
||||
@@ -65,7 +65,7 @@ along with GCC; see the file COPYING3.
|
||||
|
||||
#undef LINK_SPEC
|
||||
#define LINK_SPEC \
|
||||
- "%{m31:-m elf_s390}%{m64:-m elf64_s390} \
|
||||
+ "%{m31:-m elf_s390}%{m64:-m elf64_s390} --as-needed \
|
||||
%{shared:-shared} \
|
||||
%{!shared: \
|
||||
%{static:-static} \
|
||||
Index: b/gcc/config/rs6000/linux64.h
|
||||
===================================================================
|
||||
--- a/gcc/config/rs6000/linux64.h
|
||||
+++ b/gcc/config/rs6000/linux64.h
|
||||
@@ -466,12 +466,12 @@ extern int dot_symbols;
|
||||
" -m elf64ppc")
|
||||
#endif
|
||||
|
||||
-#define LINK_OS_LINUX_SPEC32 LINK_OS_LINUX_EMUL32 " %{!shared: %{!static: \
|
||||
+#define LINK_OS_LINUX_SPEC32 LINK_OS_LINUX_EMUL32 " --as-needed %{!shared: %{!static: \
|
||||
%{rdynamic:-export-dynamic} \
|
||||
-dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "}} \
|
||||
%(link_os_extra_spec32)"
|
||||
|
||||
-#define LINK_OS_LINUX_SPEC64 LINK_OS_LINUX_EMUL64 " %{!shared: %{!static: \
|
||||
+#define LINK_OS_LINUX_SPEC64 LINK_OS_LINUX_EMUL64 " --as-needed %{!shared: %{!static: \
|
||||
%{rdynamic:-export-dynamic} \
|
||||
-dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "}} \
|
||||
%(link_os_extra_spec64)"
|
||||
Index: b/gcc/config/rs6000/sysv4.h
|
||||
===================================================================
|
||||
--- a/gcc/config/rs6000/sysv4.h
|
||||
+++ b/gcc/config/rs6000/sysv4.h
|
||||
@@ -784,7 +784,7 @@ ENDIAN_SELECT(" -mbig", " -mlittle", DEF
|
||||
CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER, \
|
||||
MUSL_DYNAMIC_LINKER)
|
||||
|
||||
-#define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \
|
||||
+#define LINK_OS_LINUX_SPEC "-m elf32ppclinux --as-needed %{!shared: %{!static: \
|
||||
%{rdynamic:-export-dynamic} \
|
||||
-dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}"
|
||||
|
||||
Index: b/gcc/config/i386/gnu-user64.h
|
||||
===================================================================
|
||||
--- a/gcc/config/i386/gnu-user64.h
|
||||
+++ b/gcc/config/i386/gnu-user64.h
|
||||
@@ -57,5 +57,6 @@ see the files COPYING3 and COPYING.RUNTI
|
||||
%{" SPEC_32 ":-m " GNU_USER_LINK_EMULATION32 "} \
|
||||
%{" SPEC_X32 ":-m " GNU_USER_LINK_EMULATIONX32 "} \
|
||||
+ --as-needed \
|
||||
%{shared:-shared} \
|
||||
%{!shared: \
|
||||
%{!static: \
|
||||
Index: b/gcc/config/i386/gnu-user.h
|
||||
===================================================================
|
||||
--- a/gcc/config/i386/gnu-user.h
|
||||
+++ b/gcc/config/i386/gnu-user.h
|
||||
@@ -74,7 +74,7 @@ along with GCC; see the file COPYING3.
|
||||
{ "link_emulation", GNU_USER_LINK_EMULATION },\
|
||||
{ "dynamic_linker", GNU_USER_DYNAMIC_LINKER }
|
||||
|
||||
-#define GNU_USER_TARGET_LINK_SPEC "-m %(link_emulation) %{shared:-shared} \
|
||||
+#define GNU_USER_TARGET_LINK_SPEC "-m %(link_emulation) --as-needed %{shared:-shared} \
|
||||
%{!shared: \
|
||||
%{!static: \
|
||||
%{rdynamic:-export-dynamic} \
|
||||
Index: b/gcc/config/alpha/linux-elf.h
|
||||
===================================================================
|
||||
--- a/gcc/config/alpha/linux-elf.h
|
||||
+++ b/gcc/config/alpha/linux-elf.h
|
||||
@@ -37,7 +37,7 @@ along with GCC; see the file COPYING3.
|
||||
|
||||
#define ELF_DYNAMIC_LINKER GNU_USER_DYNAMIC_LINKER
|
||||
|
||||
-#define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax} \
|
||||
+#define LINK_SPEC "-m elf64alpha --as-needed %{G*} %{relax:-relax} \
|
||||
%{O*:-O3} %{!O*:-O1} \
|
||||
%{shared:-shared} \
|
||||
%{!shared: \
|
||||
Index: b/gcc/config/arm/linux-elf.h
|
||||
===================================================================
|
||||
--- a/gcc/config/arm/linux-elf.h
|
||||
+++ b/gcc/config/arm/linux-elf.h
|
||||
@@ -73,5 +73,6 @@
|
||||
%{!shared:-dynamic-linker " GNU_USER_DYNAMIC_LINKER "}} \
|
||||
-X \
|
||||
+ --as-needed \
|
||||
%{mbig-endian:-EB} %{mlittle-endian:-EL}" \
|
||||
SUBTARGET_EXTRA_LINK_SPEC
|
||||
|
||||
Index: b/gcc/config/mips/gnu-user.h
|
||||
===================================================================
|
||||
--- a/gcc/config/mips/gnu-user.h
|
||||
+++ b/gcc/config/mips/gnu-user.h
|
||||
@@ -55,6 +55,7 @@ along with GCC; see the file COPYING3.
|
||||
#undef GNU_USER_TARGET_LINK_SPEC
|
||||
#define GNU_USER_TARGET_LINK_SPEC "\
|
||||
%{G*} %{EB} %{EL} %{mips*} %{shared} \
|
||||
+ -as-needed \
|
||||
%{!shared: \
|
||||
%{!static: \
|
||||
%{rdynamic:-export-dynamic} \
|
||||
Index: b/libjava/Makefile.am
|
||||
===================================================================
|
||||
--- a/libjava/Makefile.am
|
||||
+++ b/libjava/Makefile.am
|
||||
@@ -627,14 +631,14 @@
|
||||
rm .libs/libgcj_bc.so; \
|
||||
mv .libs/libgcj_bc.so.1.0.0 .libs/libgcj_bc.so; \
|
||||
$(libgcj_bc_dummy_LINK) -xc /dev/null -Wl,-soname,libgcj_bc.so.1 \
|
||||
- -o .libs/libgcj_bc.so.1.0.0 -lgcj || exit; \
|
||||
+ -o .libs/libgcj_bc.so.1.0.0 -Wl,--no-as-needed -lgcj || exit; \
|
||||
rm .libs/libgcj_bc.so.1; \
|
||||
$(LN_S) libgcj_bc.so.1.0.0 .libs/libgcj_bc.so.1
|
||||
|
||||
## This rule creates the libgcj_bc library that is actually installed.
|
||||
install/libgcj_bc.la: $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_DEPENDENCIES) install/$(am__dirstamp)
|
||||
$(libgcj_bc_la_LINK) $(am_libgcj_bc_la_rpath) $(libgcj_bc_la_LDFLAGS) \
|
||||
- $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_LIBADD) $(LIBS)
|
||||
+ $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_LIBADD) $(LIBS) -Wl,--no-as-needed -lgcj
|
||||
|
||||
## Note that property_files is defined in sources.am.
|
||||
propertyo_files = $(patsubst classpath/resource/%,%,$(addsuffix .lo,$(property_files)))
|
||||
@@ -762,7 +766,7 @@
|
||||
rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \
|
||||
mv $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \
|
||||
$(libgcj_bc_dummy_LINK) -xc /dev/null -Wl,-soname,libgcj_bc.so.1 \
|
||||
- -o $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 -lgcj || exit; \
|
||||
+ -o $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 -Wl,--no-as-needed -lgcj || exit; \
|
||||
rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1; \
|
||||
$(LN_S) libgcj_bc.so.1.0.0 $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1; \
|
||||
rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.la;
|
||||
|
||||
Index: b/libjava/Makefile.in
|
||||
===================================================================
|
||||
--- a/libjava/Makefile.in
|
||||
+++ b/libjava/Makefile.in
|
||||
@@ -10644,13 +10648,13 @@
|
||||
rm .libs/libgcj_bc.so; \
|
||||
mv .libs/libgcj_bc.so.1.0.0 .libs/libgcj_bc.so; \
|
||||
$(libgcj_bc_dummy_LINK) -xc /dev/null -Wl,-soname,libgcj_bc.so.1 \
|
||||
- -o .libs/libgcj_bc.so.1.0.0 -lgcj || exit; \
|
||||
+ -o .libs/libgcj_bc.so.1.0.0 -Wl,--no-as-needed -lgcj || exit; \
|
||||
rm .libs/libgcj_bc.so.1; \
|
||||
$(LN_S) libgcj_bc.so.1.0.0 .libs/libgcj_bc.so.1
|
||||
|
||||
install/libgcj_bc.la: $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_DEPENDENCIES) install/$(am__dirstamp)
|
||||
$(libgcj_bc_la_LINK) $(am_libgcj_bc_la_rpath) $(libgcj_bc_la_LDFLAGS) \
|
||||
- $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_LIBADD) $(LIBS)
|
||||
+ $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_LIBADD) $(LIBS) -Wl,--no-as-needed -lgcj
|
||||
|
||||
$(propertyo_files): %.lo: classpath/resource/%
|
||||
$(mkinstalldirs) `dirname $@`; \
|
||||
@@ -12494,7 +12498,7 @@
|
||||
@USE_LIBGCJ_BC_TRUE@ rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \
|
||||
@USE_LIBGCJ_BC_TRUE@ mv $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \
|
||||
@USE_LIBGCJ_BC_TRUE@ $(libgcj_bc_dummy_LINK) -xc /dev/null -Wl,-soname,libgcj_bc.so.1 \
|
||||
-@USE_LIBGCJ_BC_TRUE@ -o $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 -lgcj || exit; \
|
||||
+@USE_LIBGCJ_BC_TRUE@ -o $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 -Wl,--no-as-needed -lgcj || exit; \
|
||||
@USE_LIBGCJ_BC_TRUE@ rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1; \
|
||||
@USE_LIBGCJ_BC_TRUE@ $(LN_S) libgcj_bc.so.1.0.0 $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1; \
|
||||
@USE_LIBGCJ_BC_TRUE@ rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.la;
|
||||
|
43
temp/gcc6/011_all_default-warn-format-security.patch
Normal file
43
temp/gcc6/011_all_default-warn-format-security.patch
Normal file
|
@ -0,0 +1,43 @@
|
|||
Enable -Wformat and -Wformat-security by default.
|
||||
|
||||
|
||||
--- a/gcc/c-family/c.opt
|
||||
+++ b/gcc/c-family/c.opt
|
||||
@@ -412,7 +412,7 @@ C ObjC C++ ObjC++ Var(warn_format_nonliteral) Warning LangEnabledBy(C ObjC C++ O
|
||||
Warn about format strings that are not literals
|
||||
|
||||
Wformat-security
|
||||
-C ObjC C++ ObjC++ Var(warn_format_security) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=, warn_format >= 2, 0)
|
||||
+C ObjC C++ ObjC++ Var(warn_format_security) Init(1) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=, warn_format >= 2, 0)
|
||||
Warn about possible security problems with format functions
|
||||
|
||||
Wformat-y2k
|
||||
@@ -424,7 +424,7 @@ C ObjC C++ ObjC++ Var(warn_format_zero_length) Warning LangEnabledBy(C ObjC C++
|
||||
Warn about zero-length formats
|
||||
|
||||
Wformat=
|
||||
-C ObjC C++ ObjC++ Joined RejectNegative UInteger Var(warn_format) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall, 1, 0)
|
||||
+C ObjC C++ ObjC++ Joined RejectNegative UInteger Var(warn_format) Init(1) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall, 1, 0)
|
||||
Warn about printf/scanf/strftime/strfmon format string anomalies
|
||||
|
||||
Wignored-qualifiers
|
||||
--- a/gcc/doc/gcc.info
|
||||
+++ b/gcc/doc/gcc.info
|
||||
@@ -3451,6 +3451,8 @@ compiler warns that an unrecognized option is present.
|
||||
'-Wno-format-contains-nul', '-Wno-format-extra-args', and
|
||||
'-Wno-format-zero-length'. '-Wformat' is enabled by '-Wall'.
|
||||
|
||||
+ This option is enabled by default in Alpine Linux.
|
||||
+
|
||||
'-Wno-format-contains-nul'
|
||||
If '-Wformat' is specified, do not warn about format strings
|
||||
that contain NUL bytes.
|
||||
@@ -3496,6 +3498,8 @@ compiler warns that an unrecognized option is present.
|
||||
future warnings may be added to '-Wformat-security' that are
|
||||
not included in '-Wformat-nonliteral'.)
|
||||
|
||||
+ This option is enabled by default in Alpine Linux.
|
||||
+
|
||||
'-Wformat-y2k'
|
||||
If '-Wformat' is specified, also warn about 'strftime' formats
|
||||
that may yield only a two-digit year.
|
25
temp/gcc6/012_all_default-warn-trampolines.patch
Normal file
25
temp/gcc6/012_all_default-warn-trampolines.patch
Normal file
|
@ -0,0 +1,25 @@
|
|||
Enable -Wtrampolines by default.
|
||||
|
||||
|
||||
--- a/gcc/common.opt
|
||||
+++ b/gcc/common.opt
|
||||
@@ -648,7 +648,7 @@ Common Var(warn_system_headers) Warning
|
||||
Do not suppress warnings from system headers
|
||||
|
||||
Wtrampolines
|
||||
-Common Var(warn_trampolines) Warning
|
||||
+Common Var(warn_trampolines) Init(1) Warning
|
||||
Warn whenever a trampoline is generated
|
||||
|
||||
Wtype-limits
|
||||
--- a/gcc/doc/gcc.info
|
||||
+++ b/gcc/doc/gcc.info
|
||||
@@ -4021,6 +4021,8 @@ compiler warns that an unrecognized option is present.
|
||||
and thus requires the stack to be made executable in order for the
|
||||
program to work properly.
|
||||
|
||||
+ This warning is enabled by default in Gentoo.
|
||||
+
|
||||
'-Wfloat-equal'
|
||||
Warn if floating-point values are used in equality comparisons.
|
||||
|
39
temp/gcc6/020_all_msgfmt-libstdc++-link.patch
Normal file
39
temp/gcc6/020_all_msgfmt-libstdc++-link.patch
Normal file
|
@ -0,0 +1,39 @@
|
|||
Ensure that msgfmt doesn't encounter problems during gcc bootstrapping.
|
||||
|
||||
Solves error messages like the following:
|
||||
|
||||
msgfmt: /var/tmp/portage/sys-devel/gcc-4.1.2/work/build/./gcc/libgcc_s.so.1: version `GCC_4.2.0' not found (required by /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/libstdc++.so.6)
|
||||
|
||||
The libgcc_s.so used during build doesn't satisfy the needs of the
|
||||
libstdc++.so that msgfmt is linked against. On the other hand, msgfmt
|
||||
is used as a stand-alone application here, and what library it uses
|
||||
behind the scenes is of no concern to the gcc build process.
|
||||
Therefore, simply invoking it "as usual", i.e. without any special
|
||||
library path, will make it work as expected here.
|
||||
|
||||
2011-09-19 Martin von Gagern
|
||||
|
||||
References:
|
||||
https://bugs.gentoo.org/372377
|
||||
https://bugs.gentoo.org/295480
|
||||
|
||||
--- gcc-4.1.2.orig/libstdc++-v3/po/Makefile.am
|
||||
+++ gcc-4.1.2/libstdc++-v3/po/Makefile.am
|
||||
@@ -39,6 +39,7 @@ MSGFMT = msgfmt
|
||||
EXTRA_DIST = string_literals.cc POTFILES.in $(PACKAGE).pot $(LOCALE_IN)
|
||||
|
||||
.po.mo:
|
||||
+ env --unset=LD_LIBRARY_PATH \
|
||||
$(MSGFMT) -o $@ $<
|
||||
|
||||
all-local: all-local-$(USE_NLS)
|
||||
--- gcc-4.1.2.orig/libstdc++-v3/po/Makefile.in
|
||||
+++ gcc-4.1.2/libstdc++-v3/po/Makefile.in
|
||||
@@ -419,6 +419,7 @@ uninstall-am: uninstall-info-am
|
||||
|
||||
|
||||
.po.mo:
|
||||
+ env --unset=LD_LIBRARY_PATH \
|
||||
$(MSGFMT) -o $@ $<
|
||||
|
||||
all-local: all-local-$(USE_NLS)
|
18
temp/gcc6/050_all_libiberty-asprintf.patch
Normal file
18
temp/gcc6/050_all_libiberty-asprintf.patch
Normal file
|
@ -0,0 +1,18 @@
|
|||
2008-07-25 Magnus Granberg <zorry@ume.nu>
|
||||
|
||||
* include/libiberty.h (asprintf): Don't declare if defined as a macro
|
||||
|
||||
--- a/include/libiberty.h
|
||||
+++ b/include/libiberty.h
|
||||
@@ -609,8 +609,11 @@ extern int pwait (int, int *, int);
|
||||
/* Like sprintf but provides a pointer to malloc'd storage, which must
|
||||
be freed by the caller. */
|
||||
|
||||
+/* asprintf may be declared as a macro by glibc with __USE_FORTIFY_LEVEL. */
|
||||
+#ifndef asprintf
|
||||
extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2;
|
||||
#endif
|
||||
+#endif
|
||||
|
||||
#if !HAVE_DECL_VASPRINTF
|
||||
/* Like vsprintf but provides a pointer to malloc'd storage, which
|
10
temp/gcc6/051_all_libiberty-pic.patch
Normal file
10
temp/gcc6/051_all_libiberty-pic.patch
Normal file
|
@ -0,0 +1,10 @@
|
|||
--- a/libiberty/Makefile.in
|
||||
+++ b/libiberty/Makefile.in
|
||||
@@ -246,6 +246,7 @@ $(TARGETLIB): $(REQUIRED_OFILES) $(EXTRA_OFILES) $(LIBOBJS)
|
||||
$(AR) $(AR_FLAGS) $(TARGETLIB) \
|
||||
$(REQUIRED_OFILES) $(EXTRA_OFILES) $(LIBOBJS); \
|
||||
$(RANLIB) $(TARGETLIB); \
|
||||
+ cp $(TARGETLIB) ../ ; \
|
||||
cd ..; \
|
||||
else true; fi
|
||||
|
27
temp/gcc6/053_all_libitm-no-fortify-source.patch
Normal file
27
temp/gcc6/053_all_libitm-no-fortify-source.patch
Normal file
|
@ -0,0 +1,27 @@
|
|||
https://bugs.gentoo.org/508852
|
||||
https://gcc.gnu.org/PR61164
|
||||
|
||||
2014-04-27 Magnus Granberg <zorry@gentoo.org>
|
||||
|
||||
#508852
|
||||
* libitm/configure.tgt: Disable FORTIFY
|
||||
|
||||
--- a/libitm/configure.tgt
|
||||
+++ b/libitm/configure.tgt
|
||||
@@ -43,6 +43,16 @@ if test "$gcc_cv_have_tls" = yes ; then
|
||||
esac
|
||||
fi
|
||||
|
||||
+# FIXME: error: inlining failed in call to always_inline
|
||||
+# ‘int vfprintf(FILE*, const char*, __va_list_tag*)’
|
||||
+# : function body can be overwritten at link time
|
||||
+# Disable Fortify in libitm for now. #508852
|
||||
+case "${target}" in
|
||||
+ *-*-linux*)
|
||||
+ XCFLAGS="${XCFLAGS} -U_FORTIFY_SOURCE"
|
||||
+ ;;
|
||||
+esac
|
||||
+
|
||||
# Map the target cpu to an ARCH sub-directory. At the same time,
|
||||
# work out any special compilation flags as necessary.
|
||||
case "${target_cpu}" in
|
194
temp/gcc6/067_all_gcc-poison-system-directories.patch
Normal file
194
temp/gcc6/067_all_gcc-poison-system-directories.patch
Normal file
|
@ -0,0 +1,194 @@
|
|||
http://cgit.openembedded.org/openembedded-core/plain/meta/recipes-devtools/gcc/gcc-6.1/0010-gcc-poison-system-directories.patch
|
||||
|
||||
From d76250323dad69212c958e4857a98d99ab51a39e Mon Sep 17 00:00:00 2001
|
||||
From: Khem Raj <raj.khem@gmail.com>
|
||||
Date: Fri, 29 Mar 2013 08:59:00 +0400
|
||||
Subject: [PATCH 10/46] gcc: poison-system-directories
|
||||
|
||||
Signed-off-by: Khem Raj <raj.khem@gmail.com>
|
||||
|
||||
Upstream-Status: Inappropriate [distribution: codesourcery]
|
||||
---
|
||||
gcc/common.opt | 4 ++++
|
||||
gcc/config.in | 6 ++++++
|
||||
gcc/configure | 16 ++++++++++++++++
|
||||
gcc/configure.ac | 10 ++++++++++
|
||||
gcc/doc/invoke.texi | 9 +++++++++
|
||||
gcc/gcc.c | 2 ++
|
||||
gcc/incpath.c | 19 +++++++++++++++++++
|
||||
7 files changed, 66 insertions(+)
|
||||
|
||||
diff --git a/gcc/common.opt b/gcc/common.opt
|
||||
index 67048db..733185c 100644
|
||||
--- a/gcc/common.opt
|
||||
+++ b/gcc/common.opt
|
||||
@@ -659,6 +659,10 @@ Wreturn-local-addr
|
||||
Common Var(warn_return_local_addr) Init(1) Warning
|
||||
Warn about returning a pointer/reference to a local or temporary variable.
|
||||
|
||||
+Wpoison-system-directories
|
||||
+Common Var(flag_poison_system_directories) Init(1) Warning
|
||||
+Warn for -I and -L options using system directories if cross compiling
|
||||
+
|
||||
Wshadow
|
||||
Common Var(warn_shadow) Warning
|
||||
Warn when one local variable shadows another.
|
||||
diff --git a/gcc/config.in b/gcc/config.in
|
||||
index 115cb61..105b30f 100644
|
||||
--- a/gcc/config.in
|
||||
+++ b/gcc/config.in
|
||||
@@ -187,6 +187,12 @@
|
||||
#endif
|
||||
|
||||
|
||||
+/* Define to warn for use of native system header directories */
|
||||
+#ifndef USED_FOR_TARGET
|
||||
+#undef ENABLE_POISON_SYSTEM_DIRECTORIES
|
||||
+#endif
|
||||
+
|
||||
+
|
||||
/* Define if you want all operations on RTL (the basic data structure of the
|
||||
optimizer and back end) to be checked for dynamic type safety at runtime.
|
||||
This is quite expensive. */
|
||||
diff --git a/gcc/configure b/gcc/configure
|
||||
index 1c6e340..8f83152 100755
|
||||
--- a/gcc/configure
|
||||
+++ b/gcc/configure
|
||||
@@ -942,6 +942,7 @@ with_system_zlib
|
||||
enable_maintainer_mode
|
||||
enable_link_mutex
|
||||
enable_version_specific_runtime_libs
|
||||
+enable_poison_system_directories
|
||||
enable_plugin
|
||||
enable_host_shared
|
||||
enable_libquadmath_support
|
||||
@@ -1681,6 +1682,8 @@ Optional Features:
|
||||
--enable-version-specific-runtime-libs
|
||||
specify that runtime libraries should be installed
|
||||
in a compiler-specific directory
|
||||
+ --enable-poison-system-directories
|
||||
+ warn for use of native system header directories
|
||||
--enable-plugin enable plugin support
|
||||
--enable-host-shared build host code as shared libraries
|
||||
--disable-libquadmath-support
|
||||
@@ -28908,6 +28911,19 @@ if test "${enable_version_specific_runtime_libs+set}" = set; then :
|
||||
fi
|
||||
|
||||
|
||||
+# Check whether --enable-poison-system-directories was given.
|
||||
+if test "${enable_poison_system_directories+set}" = set; then :
|
||||
+ enableval=$enable_poison_system_directories;
|
||||
+else
|
||||
+ enable_poison_system_directories=no
|
||||
+fi
|
||||
+
|
||||
+if test "x${enable_poison_system_directories}" = "xyes"; then
|
||||
+
|
||||
+$as_echo "#define ENABLE_POISON_SYSTEM_DIRECTORIES 1" >>confdefs.h
|
||||
+
|
||||
+fi
|
||||
+
|
||||
# Substitute configuration variables
|
||||
|
||||
|
||||
diff --git a/gcc/configure.ac b/gcc/configure.ac
|
||||
index 6c1dcd9..0fccaef 100644
|
||||
--- a/gcc/configure.ac
|
||||
+++ b/gcc/configure.ac
|
||||
@@ -5861,6 +5861,16 @@ AC_ARG_ENABLE(version-specific-runtime-libs,
|
||||
[specify that runtime libraries should be
|
||||
installed in a compiler-specific directory])])
|
||||
|
||||
+AC_ARG_ENABLE([poison-system-directories],
|
||||
+ AS_HELP_STRING([--enable-poison-system-directories],
|
||||
+ [warn for use of native system header directories]),,
|
||||
+ [enable_poison_system_directories=no])
|
||||
+if test "x${enable_poison_system_directories}" = "xyes"; then
|
||||
+ AC_DEFINE([ENABLE_POISON_SYSTEM_DIRECTORIES],
|
||||
+ [1],
|
||||
+ [Define to warn for use of native system header directories])
|
||||
+fi
|
||||
+
|
||||
# Substitute configuration variables
|
||||
AC_SUBST(subdirs)
|
||||
AC_SUBST(srcdir)
|
||||
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
|
||||
index 821f8fd..8bb49e7 100644
|
||||
--- a/gcc/doc/invoke.texi
|
||||
+++ b/gcc/doc/invoke.texi
|
||||
@@ -284,6 +284,7 @@ Objective-C and Objective-C++ Dialects}.
|
||||
-Wparentheses -Wno-pedantic-ms-format @gol
|
||||
-Wplacement-new -Wplacement-new=@var{n} @gol
|
||||
-Wpointer-arith -Wno-pointer-to-int-cast @gol
|
||||
+-Wno-poison-system-directories @gol
|
||||
-Wno-pragmas -Wredundant-decls -Wno-return-local-addr @gol
|
||||
-Wreturn-type -Wsequence-point -Wshadow -Wno-shadow-ivar @gol
|
||||
-Wshift-overflow -Wshift-overflow=@var{n} @gol
|
||||
@@ -4723,6 +4724,14 @@ made up of data only and thus requires no special treatment. But, for
|
||||
most targets, it is made up of code and thus requires the stack to be
|
||||
made executable in order for the program to work properly.
|
||||
|
||||
+@item -Wno-poison-system-directories
|
||||
+@opindex Wno-poison-system-directories
|
||||
+Do not warn for @option{-I} or @option{-L} options using system
|
||||
+directories such as @file{/usr/include} when cross compiling. This
|
||||
+option is intended for use in chroot environments when such
|
||||
+directories contain the correct headers and libraries for the target
|
||||
+system rather than the host.
|
||||
+
|
||||
@item -Wfloat-equal
|
||||
@opindex Wfloat-equal
|
||||
@opindex Wno-float-equal
|
||||
diff --git a/gcc/gcc.c b/gcc/gcc.c
|
||||
index 1af5920..4cfef7f 100644
|
||||
--- a/gcc/gcc.c
|
||||
+++ b/gcc/gcc.c
|
||||
@@ -1017,6 +1017,8 @@ proper position among the other output files. */
|
||||
"%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
|
||||
"%X %{o*} %{e*} %{N} %{n} %{r}\
|
||||
%{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}} \
|
||||
+ %{Wno-poison-system-directories:--no-poison-system-directories} \
|
||||
+ %{Werror=poison-system-directories:--error-poison-system-directories} \
|
||||
%{static:} %{L*} %(mfwrap) %(link_libgcc) " \
|
||||
VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o " CHKP_SPEC " \
|
||||
%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
|
||||
diff --git a/gcc/incpath.c b/gcc/incpath.c
|
||||
index ea40f4a..856da41 100644
|
||||
--- a/gcc/incpath.c
|
||||
+++ b/gcc/incpath.c
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "intl.h"
|
||||
#include "incpath.h"
|
||||
#include "cppdefault.h"
|
||||
+#include "diagnostic-core.h"
|
||||
|
||||
/* Microsoft Windows does not natively support inodes.
|
||||
VMS has non-numeric inodes. */
|
||||
@@ -381,6 +382,24 @@ merge_include_chains (const char *sysroot, cpp_reader *pfile, int verbose)
|
||||
}
|
||||
fprintf (stderr, _("End of search list.\n"));
|
||||
}
|
||||
+
|
||||
+#ifdef ENABLE_POISON_SYSTEM_DIRECTORIES
|
||||
+ if (flag_poison_system_directories)
|
||||
+ {
|
||||
+ struct cpp_dir *p;
|
||||
+
|
||||
+ for (p = heads[QUOTE]; p; p = p->next)
|
||||
+ {
|
||||
+ if ((!strncmp (p->name, "/usr/include", 12))
|
||||
+ || (!strncmp (p->name, "/usr/local/include", 18))
|
||||
+ || (!strncmp (p->name, "/usr/X11R6/include", 18)))
|
||||
+ warning (OPT_Wpoison_system_directories,
|
||||
+ "include location \"%s\" is unsafe for "
|
||||
+ "cross-compilation",
|
||||
+ p->name);
|
||||
+ }
|
||||
+ }
|
||||
+#endif
|
||||
}
|
||||
|
||||
/* Use given -I paths for #include "..." but not #include <...>, and
|
||||
--
|
||||
2.8.2
|
||||
|
18
temp/gcc6/090_all_pr55930-dependency-tracking.patch
Normal file
18
temp/gcc6/090_all_pr55930-dependency-tracking.patch
Normal file
|
@ -0,0 +1,18 @@
|
|||
libatomic build failure if configured with --disable-dependency-tracking
|
||||
load_n.c:115:1: fatal error: opening dependency file .deps/load_1_.lo.Ppo: No such file or directory
|
||||
|
||||
https://bugs.gentoo.org/463463
|
||||
http://gcc.gnu.org/PR55930
|
||||
|
||||
--- a/libatomic/Makefile.in
|
||||
+++ b/libatomic/Makefile.in
|
||||
@@ -298,7 +298,8 @@ PAT_N = $(word 2,$(PAT_SPLIT))
|
||||
PAT_S = $(word 3,$(PAT_SPLIT))
|
||||
IFUNC_DEF = -DIFUNC_ALT=$(PAT_S)
|
||||
IFUNC_OPT = $(word $(PAT_S),$(IFUNC_OPTIONS))
|
||||
-M_DEPS = -MT $@ -MD -MP -MF $(DEPDIR)/$(@F).Ppo
|
||||
+@AMDEP_TRUE@M_DEPS = -MT $@ -MD -MP -MF $(DEPDIR)/$(@F).Ppo
|
||||
+@AMDEP_FALSE@M_DEPS =
|
||||
M_SIZE = -DN=$(PAT_N)
|
||||
M_IFUNC = $(if $(PAT_S),$(IFUNC_DEF) $(IFUNC_OPT))
|
||||
M_FILE = $(PAT_BASE)_n.c
|
59
temp/gcc6/201-cilkrts.patch
Normal file
59
temp/gcc6/201-cilkrts.patch
Normal file
|
@ -0,0 +1,59 @@
|
|||
From 594e3c1ab576daddeb86015efc8b1677020b1878 Mon Sep 17 00:00:00 2001
|
||||
From: Szabolcs Nagy <nsz@port70.net>
|
||||
Date: Sat, 24 Oct 2015 20:39:30 +0000
|
||||
Subject: [PATCH 1/6] cilkrts
|
||||
|
||||
---
|
||||
libcilkrts/runtime/os-unix.c | 22 +++++++---------------
|
||||
1 file changed, 7 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/libcilkrts/runtime/os-unix.c b/libcilkrts/runtime/os-unix.c
|
||||
index cb582dd..e43d7d5 100644
|
||||
--- a/libcilkrts/runtime/os-unix.c
|
||||
+++ b/libcilkrts/runtime/os-unix.c
|
||||
@@ -51,6 +51,7 @@
|
||||
#if defined __linux__
|
||||
# include <sys/sysinfo.h>
|
||||
# include <sys/syscall.h>
|
||||
+# include <sched.h>
|
||||
#elif defined __APPLE__
|
||||
# include <sys/sysctl.h>
|
||||
// Uses sysconf(_SC_NPROCESSORS_ONLN) in verbose output
|
||||
@@ -400,28 +401,19 @@ COMMON_SYSDEP void __cilkrts_sleep(void)
|
||||
|
||||
COMMON_SYSDEP void __cilkrts_yield(void)
|
||||
{
|
||||
-#if __APPLE__ || __FreeBSD__ || __VXWORKS__
|
||||
- // On MacOS, call sched_yield to yield quantum. I'm not sure why we
|
||||
- // don't do this on Linux also.
|
||||
- sched_yield();
|
||||
-#elif defined(__DragonFly__)
|
||||
- // On DragonFly BSD, call sched_yield to yield quantum.
|
||||
- sched_yield();
|
||||
-#elif defined(__MIC__)
|
||||
+#if defined(__MIC__)
|
||||
// On MIC, pthread_yield() really trashes things. Arch's measurements
|
||||
// showed that calling _mm_delay_32() (or doing nothing) was a better
|
||||
// option. Delaying 1024 clock cycles is a reasonable compromise between
|
||||
// giving up the processor and latency starting up when work becomes
|
||||
// available
|
||||
_mm_delay_32(1024);
|
||||
-#elif defined(__ANDROID__) || (defined(__sun__) && defined(__svr4__))
|
||||
- // On Android and Solaris, call sched_yield to yield quantum. I'm not
|
||||
- // sure why we don't do this on Linux also.
|
||||
- sched_yield();
|
||||
-#else
|
||||
- // On Linux, call pthread_yield (which in turn will call sched_yield)
|
||||
- // to yield quantum.
|
||||
+#elif defined(__sun__) && !defined(__svr4__)
|
||||
+ // On old SunOS call pthread_yield to yield a quantum.
|
||||
pthread_yield();
|
||||
+#else
|
||||
+ // On other platforms call sched_yield to yield a quantum.
|
||||
+ sched_yield();
|
||||
#endif
|
||||
}
|
||||
|
||||
--
|
||||
2.8.1
|
||||
|
56
temp/gcc6/203-libgcc_s.patch
Normal file
56
temp/gcc6/203-libgcc_s.patch
Normal file
|
@ -0,0 +1,56 @@
|
|||
From 9e3eab51e518018d9d99b3123598b1e2322a6af3 Mon Sep 17 00:00:00 2001
|
||||
From: Szabolcs Nagy <nsz@port70.net>
|
||||
Date: Sat, 24 Oct 2015 20:09:53 +0000
|
||||
Subject: [PATCH 3/6] libgcc_s
|
||||
|
||||
---
|
||||
gcc/config/i386/i386.c | 4 ++--
|
||||
libgcc/config/i386/cpuinfo.c | 6 +++---
|
||||
libgcc/config/i386/t-linux | 2 +-
|
||||
3 files changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
||||
index 3d044e8..82523e1 100644
|
||||
--- a/gcc/config/i386/i386.c
|
||||
+++ b/gcc/config/i386/i386.c
|
||||
@@ -40269,10 +40269,10 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
|
||||
{
|
||||
case IX86_BUILTIN_CPU_INIT:
|
||||
{
|
||||
- /* Make it call __cpu_indicator_init in libgcc. */
|
||||
+ /* Make it call __cpu_indicator_init_local in libgcc.a. */
|
||||
tree call_expr, fndecl, type;
|
||||
type = build_function_type_list (integer_type_node, NULL_TREE);
|
||||
- fndecl = build_fn_decl ("__cpu_indicator_init", type);
|
||||
+ fndecl = build_fn_decl ("__cpu_indicator_init_local", type);
|
||||
call_expr = build_call_expr (fndecl, 0);
|
||||
return expand_expr (call_expr, target, mode, EXPAND_NORMAL);
|
||||
}
|
||||
diff --git a/libgcc/config/i386/cpuinfo.c b/libgcc/config/i386/cpuinfo.c
|
||||
index 8c2248d..6c82f15 100644
|
||||
--- a/libgcc/config/i386/cpuinfo.c
|
||||
+++ b/libgcc/config/i386/cpuinfo.c
|
||||
@@ -485,7 +485,7 @@ __cpu_indicator_init (void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-#if defined SHARED && defined USE_ELF_SYMVER
|
||||
-__asm__ (".symver __cpu_indicator_init, __cpu_indicator_init@GCC_4.8.0");
|
||||
-__asm__ (".symver __cpu_model, __cpu_model@GCC_4.8.0");
|
||||
+#ifndef SHARED
|
||||
+int __cpu_indicator_init_local (void)
|
||||
+ __attribute__ ((weak, alias ("__cpu_indicator_init")));
|
||||
#endif
|
||||
diff --git a/libgcc/config/i386/t-linux b/libgcc/config/i386/t-linux
|
||||
index 11bb46e..4f47f7b 100644
|
||||
--- a/libgcc/config/i386/t-linux
|
||||
+++ b/libgcc/config/i386/t-linux
|
||||
@@ -3,4 +3,4 @@
|
||||
# t-slibgcc-elf-ver and t-linux
|
||||
SHLIB_MAPFILES = libgcc-std.ver $(srcdir)/config/i386/libgcc-glibc.ver
|
||||
|
||||
-HOST_LIBGCC2_CFLAGS += -mlong-double-80 -DUSE_ELF_SYMVER
|
||||
+HOST_LIBGCC2_CFLAGS += -mlong-double-80
|
||||
--
|
||||
2.8.1
|
||||
|
25
temp/gcc6/204-linux_libc_has_function.patch
Normal file
25
temp/gcc6/204-linux_libc_has_function.patch
Normal file
|
@ -0,0 +1,25 @@
|
|||
From edec78452d693fb524daa9a6efd45c850b27b25c Mon Sep 17 00:00:00 2001
|
||||
From: Szabolcs Nagy <nsz@port70.net>
|
||||
Date: Fri, 6 Nov 2015 23:59:20 +0000
|
||||
Subject: [PATCH 4/6] linux_libc_has_function
|
||||
|
||||
---
|
||||
gcc/config/linux.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gcc/config/linux.c b/gcc/config/linux.c
|
||||
index 250296b..16c3768 100644
|
||||
--- a/gcc/config/linux.c
|
||||
+++ b/gcc/config/linux.c
|
||||
@@ -26,7 +26,7 @@ along with GCC; see the file COPYING3. If not see
|
||||
bool
|
||||
linux_libc_has_function (enum function_class fn_class)
|
||||
{
|
||||
- if (OPTION_GLIBC)
|
||||
+ if (OPTION_GLIBC || OPTION_MUSL)
|
||||
return true;
|
||||
if (OPTION_BIONIC)
|
||||
if (fn_class == function_c94
|
||||
--
|
||||
2.8.1
|
||||
|
75
temp/gcc6/205-nopie.patch
Normal file
75
temp/gcc6/205-nopie.patch
Normal file
|
@ -0,0 +1,75 @@
|
|||
From b6015aca9c9cc83739fd0ed637a835119b2c4e34 Mon Sep 17 00:00:00 2001
|
||||
From: Szabolcs Nagy <nsz@port70.net>
|
||||
Date: Sat, 7 Nov 2015 02:08:05 +0000
|
||||
Subject: [PATCH 5/6] nopie
|
||||
|
||||
---
|
||||
gcc/configure | 27 +++++++++++++++++++++++++++
|
||||
gcc/configure.ac | 13 +++++++++++++
|
||||
2 files changed, 40 insertions(+)
|
||||
|
||||
diff --git a/gcc/configure b/gcc/configure
|
||||
index 1c6e340..7e8b5d6 100755
|
||||
--- a/gcc/configure
|
||||
+++ b/gcc/configure
|
||||
@@ -29390,6 +29390,33 @@ fi
|
||||
$as_echo "$gcc_cv_no_pie" >&6; }
|
||||
if test "$gcc_cv_no_pie" = "yes"; then
|
||||
NO_PIE_FLAG="-no-pie"
|
||||
+else
|
||||
+ # Check if -nopie works.
|
||||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -nopie option" >&5
|
||||
+$as_echo_n "checking for -nopie option... " >&6; }
|
||||
+if test "${gcc_cv_nopie+set}" = set; then :
|
||||
+ $as_echo_n "(cached) " >&6
|
||||
+else
|
||||
+ saved_LDFLAGS="$LDFLAGS"
|
||||
+ LDFLAGS="$LDFLAGS -nopie"
|
||||
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
+/* end confdefs.h. */
|
||||
+int main(void) {return 0;}
|
||||
+_ACEOF
|
||||
+if ac_fn_cxx_try_link "$LINENO"; then :
|
||||
+ gcc_cv_nopie=yes
|
||||
+else
|
||||
+ gcc_cv_nopie=no
|
||||
+fi
|
||||
+rm -f core conftest.err conftest.$ac_objext \
|
||||
+ conftest$ac_exeext conftest.$ac_ext
|
||||
+ LDFLAGS="$saved_LDFLAGS"
|
||||
+fi
|
||||
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_nopie" >&5
|
||||
+$as_echo "$gcc_cv_nopie" >&6; }
|
||||
+ if test "$gcc_cv_nopie" = "yes"; then
|
||||
+ NO_PIE_FLAG="-nopie"
|
||||
+ fi
|
||||
fi
|
||||
|
||||
|
||||
diff --git a/gcc/configure.ac b/gcc/configure.ac
|
||||
index 6c1dcd9..0ca7647 100644
|
||||
--- a/gcc/configure.ac
|
||||
+++ b/gcc/configure.ac
|
||||
@@ -6098,6 +6098,19 @@ AC_CACHE_CHECK([for -no-pie option],
|
||||
LDFLAGS="$saved_LDFLAGS"])
|
||||
if test "$gcc_cv_no_pie" = "yes"; then
|
||||
NO_PIE_FLAG="-no-pie"
|
||||
+else
|
||||
+ # Check if -nopie works.
|
||||
+ AC_CACHE_CHECK([for -nopie option],
|
||||
+ [gcc_cv_nopie],
|
||||
+ [saved_LDFLAGS="$LDFLAGS"
|
||||
+ LDFLAGS="$LDFLAGS -nopie"
|
||||
+ AC_LINK_IFELSE([int main(void) {return 0;}],
|
||||
+ [gcc_cv_nopie=yes],
|
||||
+ [gcc_cv_nopie=no])
|
||||
+ LDFLAGS="$saved_LDFLAGS"])
|
||||
+ if test "$gcc_cv_nopie" = "yes"; then
|
||||
+ NO_PIE_FLAG="-nopie"
|
||||
+ fi
|
||||
fi
|
||||
AC_SUBST([NO_PIE_FLAG])
|
||||
|
||||
--
|
||||
2.8.1
|
||||
|
40
temp/gcc6/207-static-pie.patch
Normal file
40
temp/gcc6/207-static-pie.patch
Normal file
|
@ -0,0 +1,40 @@
|
|||
diff --git a/gcc/config/gnu-user.h b/gcc/config/gnu-user.h
|
||||
index b0bf40a..d4b56fe 100644
|
||||
--- a/gcc/config/gnu-user.h
|
||||
+++ b/gcc/config/gnu-user.h
|
||||
@@ -51,10 +51,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
#if defined HAVE_LD_PIE
|
||||
#define GNU_USER_TARGET_STARTFILE_SPEC \
|
||||
"%{!shared: %{pg|p|profile:gcrt1.o%s;: \
|
||||
- %{" PIE_SPEC ":Scrt1.o%s} %{" NO_PIE_SPEC ":crt1.o%s}}} \
|
||||
- crti.o%s %{static:crtbeginT.o%s;: %{shared:crtbeginS.o%s} \
|
||||
+ %{" PIE_SPEC ":%{static:rcrt1.o%s;:Scrt1.o%s}} %{" NO_PIE_SPEC ":crt1.o%s}}} \
|
||||
+ crti.o%s %{shared:crtbeginS.o%s;: \
|
||||
%{" PIE_SPEC ":crtbeginS.o%s} \
|
||||
- %{" NO_PIE_SPEC ":crtbegin.o%s}} \
|
||||
+ %{" NO_PIE_SPEC ":%{static:crtbeginT.o%s;:crtbegin.o%s}}} \
|
||||
%{fvtable-verify=none:%s; \
|
||||
fvtable-verify=preinit:vtv_start_preinit.o%s; \
|
||||
fvtable-verify=std:vtv_start.o%s} \
|
||||
diff --git a/gcc/gcc.c b/gcc/gcc.c
|
||||
index 0208d61..731564e 100644
|
||||
--- a/gcc/gcc.c
|
||||
+++ b/gcc/gcc.c
|
||||
@@ -870,7 +870,7 @@ proper position among the other output files. */
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_DEFAULT_PIE
|
||||
-#define NO_PIE_SPEC "no-pie|static"
|
||||
+#define NO_PIE_SPEC "no-pie"
|
||||
#define PIE_SPEC NO_PIE_SPEC "|r|shared:;"
|
||||
#define NO_FPIE1_SPEC "fno-pie"
|
||||
#define FPIE1_SPEC NO_FPIE1_SPEC ":;"
|
||||
@@ -916,7 +916,7 @@ proper position among the other output files. */
|
||||
#ifndef LINK_PIE_SPEC
|
||||
#ifdef HAVE_LD_PIE
|
||||
#ifndef LD_PIE_SPEC
|
||||
-#define LD_PIE_SPEC "-pie"
|
||||
+#define LD_PIE_SPEC "-pie %{static:--no-dynamic-linker -Bsymbolic}"
|
||||
#endif
|
||||
#else
|
||||
#define LD_PIE_SPEC ""
|
32
temp/gcc6/300-main-gcc-add-musl-s390x-dynamic-linker.patch
Normal file
32
temp/gcc6/300-main-gcc-add-musl-s390x-dynamic-linker.patch
Normal file
|
@ -0,0 +1,32 @@
|
|||
From be841c16dd544553c67faac79bd4cc3cd10a1dc0 Mon Sep 17 00:00:00 2001
|
||||
From: "Tuan M. Hoang" <tmhoang@flatglobe.org>
|
||||
Date: Mon, 21 Nov 2016 01:42:16 +0700
|
||||
Subject: [PATCH] main/gcc: add musl s390x dynamic linker
|
||||
|
||||
---
|
||||
gcc/config/s390/linux.h | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/gcc/config/s390/linux.h b/gcc/config/s390/linux.h
|
||||
index 1e3ed35..a244214 100644
|
||||
--- a/gcc/config/s390/linux.h
|
||||
+++ b/gcc/config/s390/linux.h
|
||||
@@ -63,6 +63,15 @@ along with GCC; see the file COPYING3. If not see
|
||||
#define GLIBC_DYNAMIC_LINKER32 "/lib/ld.so.1"
|
||||
#define GLIBC_DYNAMIC_LINKER64 "/lib/ld64.so.1"
|
||||
|
||||
+#undef MUSL_DYNAMIC_LINKER
|
||||
+#define MUSL_DYNAMIC_LINKER "/lib/ld-musl-s390x.so.1"
|
||||
+#undef MUSL_DYNAMIC_LINKER32
|
||||
+#define MUSL_DYNAMIC_LINKER32 "/lib/ld-musl-s390x.so.1"
|
||||
+#undef MUSL_DYNAMIC_LINKER64
|
||||
+#define MUSL_DYNAMIC_LINKER64 "/lib/ld-musl-s390x.so.1"
|
||||
+#undef MUSL_DYNAMIC_LINKERX32
|
||||
+#define MUSL_DYNAMIC_LINKERX32 "/lib/ld-musl-s390x.so.1"
|
||||
+
|
||||
#undef LINK_SPEC
|
||||
#define LINK_SPEC \
|
||||
"%{m31:-m elf_s390}%{m64:-m elf64_s390} --as-needed \
|
||||
--
|
||||
2.10.2
|
||||
|
28
temp/gcc6/310-build-gcj-s390x.patch
Normal file
28
temp/gcc6/310-build-gcj-s390x.patch
Normal file
|
@ -0,0 +1,28 @@
|
|||
From 697a7ba791fce2ffab2ed723d909a89684019e3d Mon Sep 17 00:00:00 2001
|
||||
From: "Tuan M. Hoang" <tmhoang@flatglobe.org>
|
||||
Date: Sun, 19 Feb 2017 17:03:33 +0000
|
||||
Subject: [PATCH] main/gcc : when building gcc-java on s390x, libgcj.so
|
||||
complains about undefined reference to __data_start. Using
|
||||
SEARCH_FOR_DATA_START instead solved it. Credit to Andrew Haley at RedHat.
|
||||
|
||||
---
|
||||
boehm-gc/include/private/gcconfig.h | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/boehm-gc/include/private/gcconfig.h b/boehm-gc/include/private/gcconfig.h
|
||||
index 4ca6a80..a15fff6 100644
|
||||
--- a/boehm-gc/include/private/gcconfig.h
|
||||
+++ b/boehm-gc/include/private/gcconfig.h
|
||||
@@ -1837,8 +1837,7 @@
|
||||
# define OS_TYPE "LINUX"
|
||||
# define LINUX_STACKBOTTOM
|
||||
# define DYNAMIC_LOADING
|
||||
- extern int __data_start[];
|
||||
-# define DATASTART ((ptr_t)(__data_start))
|
||||
+# define SEARCH_FOR_DATA_START
|
||||
extern int _end[];
|
||||
# define DATAEND (_end)
|
||||
# define CACHE_LINE_SIZE 256
|
||||
--
|
||||
2.11.1
|
||||
|
13
temp/gcc6/320-libffi-gnulinux.patch
Normal file
13
temp/gcc6/320-libffi-gnulinux.patch
Normal file
|
@ -0,0 +1,13 @@
|
|||
diff --git a/libffi/closures.c.orig b/libffi/closures.c
|
||||
index 721ff00..22a699c 100644
|
||||
--- a/libffi/src/closures.c.orig
|
||||
+++ b/libffi/src/closures.c
|
||||
@@ -34,7 +34,7 @@
|
||||
#include <ffi_common.h>
|
||||
|
||||
#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE
|
||||
-# if __gnu_linux__ && !defined(__ANDROID__)
|
||||
+# if __linux__ && !defined(__ANDROID__)
|
||||
/* This macro indicates it may be forbidden to map anonymous memory
|
||||
with both write and execute permission. Code compiled when this
|
||||
option is defined will attempt to map such pages once, but if it
|
352
temp/gcc6/APKBUILD
Normal file
352
temp/gcc6/APKBUILD
Normal file
|
@ -0,0 +1,352 @@
|
|||
# Forked from Alpine, because their buildbots for edge armhf/aarch64 are stuck and
|
||||
# did not build this package yet. We need it to build some old kernels, see #138.
|
||||
pkgname=gcc6
|
||||
pkgver=6.4.0
|
||||
_ver=${pkgver%%.*}
|
||||
pkgname="$pkgname"
|
||||
pkgrel=7
|
||||
pkgdesc="The GNU Compiler Collection"
|
||||
url="http://gcc.gnu.org"
|
||||
arch="all"
|
||||
license="GPL LGPL"
|
||||
_gccrel=$pkgver-r$pkgrel
|
||||
depends="binutils isl"
|
||||
makedepends_build="gcc$_cross g++$_cross paxmark bison flex texinfo gawk zip gmp-dev mpfr-dev mpc1-dev zlib-dev"
|
||||
makedepends_host="linux-headers gmp-dev mpfr-dev mpc1-dev isl-dev zlib-dev !gettext-dev"
|
||||
subpackages="$pkgname-doc"
|
||||
|
||||
STRIP_FOR_TARGET=${CROSS_COMPILE}strip
|
||||
_builddir="$srcdir/build"
|
||||
|
||||
_languages="c,c++,java"
|
||||
subpackages="$subpackages libstdc++6:libcxx:$CTARGET_ARCH g++6:gpp"
|
||||
subpackages="$subpackages libgcj6:libgcj:$CTARGET_ARCH gcc6-java:java"
|
||||
makedepends="$makedepends_build $makedepends_host"
|
||||
|
||||
source="ftp://gcc.gnu.org/pub/gcc/releases/gcc-${_pkgbase:-$pkgver}/gcc-${_pkgbase:-$pkgver}.tar.xz
|
||||
ftp://sourceware.org/pub/java/ecj-4.9.jar
|
||||
|
||||
001_all_default-ssp-strong.patch
|
||||
002_all_default-relro.patch
|
||||
003_all_default-fortify-source.patch
|
||||
005_all_default-as-needed.patch
|
||||
011_all_default-warn-format-security.patch
|
||||
012_all_default-warn-trampolines.patch
|
||||
020_all_msgfmt-libstdc++-link.patch
|
||||
050_all_libiberty-asprintf.patch
|
||||
051_all_libiberty-pic.patch
|
||||
053_all_libitm-no-fortify-source.patch
|
||||
067_all_gcc-poison-system-directories.patch
|
||||
090_all_pr55930-dependency-tracking.patch
|
||||
|
||||
201-cilkrts.patch
|
||||
203-libgcc_s.patch
|
||||
204-linux_libc_has_function.patch
|
||||
205-nopie.patch
|
||||
207-static-pie.patch
|
||||
|
||||
libgcc-always-build-gcceh.a.patch
|
||||
gcc-4.9-musl-fortify.patch
|
||||
gcc-6.1-musl-libssp.patch
|
||||
boehm-gc-musl.patch
|
||||
gcc-pure64.patch
|
||||
fix-gcj-stdgnu14-link.patch
|
||||
fix-gcj-musl.patch
|
||||
fix-gcj-iconv-musl.patch
|
||||
|
||||
gcc-4.8-build-args.patch
|
||||
fix-cxxflags-passing.patch
|
||||
|
||||
300-main-gcc-add-musl-s390x-dynamic-linker.patch
|
||||
310-build-gcj-s390x.patch
|
||||
320-libffi-gnulinux.patch
|
||||
|
||||
fix-rs6000-pie.patch
|
||||
fix-linux-header-use-in-libgcc.patch
|
||||
gcc-pure64-mips.patch
|
||||
fix-ppc64le-coercion-r261621.patch
|
||||
"
|
||||
|
||||
sonameprefix="$pkgname:"
|
||||
|
||||
# we build out-of-tree
|
||||
_gccdir="$srcdir"/gcc-${_pkgbase:-$pkgver}
|
||||
_gcclibdir=/usr/lib/gcc/${CTARGET}/$pkgver
|
||||
_gcclibexec=/usr/libexec/gcc/${CTARGET}/$pkgver
|
||||
|
||||
prepare() {
|
||||
cd "$_gccdir"
|
||||
|
||||
_err=
|
||||
for i in $source; do
|
||||
case "$i" in
|
||||
*.patch)
|
||||
msg "Applying $i"
|
||||
patch -p1 -F3 -i "$srcdir"/$i || _err="$_err $i"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ -n "$_err" ]; then
|
||||
error "The following patches failed:"
|
||||
for i in $_err; do
|
||||
echo " $i"
|
||||
done
|
||||
return 1
|
||||
fi
|
||||
|
||||
# see https://gcc.gnu.org/ml/java/2008-04/msg00027.html
|
||||
mv "$srcdir"/ecj-*.jar ecj.jar
|
||||
|
||||
echo ${pkgver} > gcc/BASE-VER
|
||||
}
|
||||
|
||||
build() {
|
||||
local _arch_configure=
|
||||
local _libc_configure=
|
||||
local _bootstrap_configure=
|
||||
local _symvers=
|
||||
|
||||
cd "$_gccdir"
|
||||
|
||||
case "$CTARGET" in
|
||||
aarch64-*-*-*) _arch_configure="--with-arch=armv8-a --with-abi=lp64";;
|
||||
armv5-*-*-*eabi) _arch_configure="--with-arch=armv5te --with-tune=arm926ej-s --with-float=soft --with-abi=aapcs-linux";;
|
||||
armv6-*-*-*eabihf) _arch_configure="--with-arch=armv6zk --with-tune=arm1176jzf-s --with-fpu=vfp --with-float=hard --with-abi=aapcs-linux";;
|
||||
armv7-*-*-*eabihf) _arch_configure="--with-arch=armv7-a --with-tune=generic-armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-abi=aapcs-linux --with-mode=thumb";;
|
||||
mips-*-*-*) _arch_configure="--with-arch=mips32 --with-mips-plt --with-float=soft --with-abi=32";;
|
||||
mips64-*-*-*) _arch_configure="--with-arch=mips3 --with-tune=mips64 --with-mips-plt --with-float=soft --with-abi=64";;
|
||||
mips64el-*-*-*) _arch_configure="--with-arch=mips3 --with-tune=mips64 --with-mips-plt --with-float=soft --with-abi=64";;
|
||||
mipsel-*-*-*) _arch_configure="--with-arch=mips32 --with-mips-plt --with-float=soft --with-abi=32";;
|
||||
powerpc-*-*-*) _arch_configure="--enable-secureplt --enable-decimal-float=no";;
|
||||
powerpc64*-*-*-*) _arch_configure="--with-abi=elfv2 --enable-secureplt --enable-decimal-float=no --enable-targets=powerpcle-linux";;
|
||||
i486-*-*-*) _arch_configure="--with-arch=i486 --with-tune=generic --enable-cld";;
|
||||
i586-*-*-*) _arch_configure="--with-arch=i586 --with-tune=generic --enable-cld";;
|
||||
s390x-*-*-*) _arch_configure="--with-arch=z196 --with-tune=zEC12 --with-zarch --with-long-double-128 --enable-decimal-float";;
|
||||
esac
|
||||
|
||||
case "$CTARGET_ARCH" in
|
||||
mips*) _hash_style_configure="--with-linker-hash-style=sysv" ;;
|
||||
*) _hash_style_configure="--with-linker-hash-style=gnu" ;;
|
||||
esac
|
||||
|
||||
case "$CTARGET_LIBC" in
|
||||
musl)
|
||||
# musl does not support mudflap, or libsanitizer
|
||||
# libmpx uses secure_getenv and struct _libc_fpstate not present in musl
|
||||
# alpine musl provides libssp_nonshared.a, so we don't need libssp either
|
||||
_libc_configure="--disable-libssp --disable-libmpx --disable-libmudflap --disable-libsanitizer"
|
||||
_symvers="--disable-symvers"
|
||||
export libat_cv_have_ifunc=no
|
||||
;;
|
||||
esac
|
||||
|
||||
_bootstrap_configure="--enable-shared --enable-threads --enable-tls"
|
||||
|
||||
msg "Building the following:"
|
||||
echo ""
|
||||
echo " CBUILD=$CBUILD"
|
||||
echo " CHOST=$CHOST"
|
||||
echo " CTARGET=$CTARGET"
|
||||
echo " CTARGET_ARCH=$CTARGET_ARCH"
|
||||
echo " CTARGET_LIBC=$CTARGET_LIBC"
|
||||
echo " languages=$_languages"
|
||||
echo " arch_configure=$_arch_configure"
|
||||
echo " libc_configure=$_libc_configure"
|
||||
echo " bootstrap_configure=$_bootstrap_configure"
|
||||
echo " hash_style_configure=$_hash_style_configure"
|
||||
echo ""
|
||||
|
||||
mkdir -p "$_builddir"
|
||||
cd "$_builddir"
|
||||
"$_gccdir"/configure --prefix=/usr \
|
||||
--mandir=/usr/share/man \
|
||||
--infodir=/usr/share/info \
|
||||
--build=${CBUILD} \
|
||||
--host=${CHOST} \
|
||||
--target=${CTARGET} \
|
||||
--program-suffix="-$_ver" \
|
||||
--with-pkgversion="Alpine ${pkgver}" \
|
||||
--enable-checking=release \
|
||||
--disable-bootstrap \
|
||||
--disable-fixed-point \
|
||||
--disable-libstdcxx-pch \
|
||||
--disable-multilib \
|
||||
--disable-nls \
|
||||
--disable-werror \
|
||||
--disable-libatomic \
|
||||
--disable-libgomp \
|
||||
--disable-libitm \
|
||||
--disable-libquadmath \
|
||||
$_symvers \
|
||||
--enable-__cxa_atexit \
|
||||
--enable-default-pie \
|
||||
--enable-cloog-backend \
|
||||
--enable-version-specific-runtime-libs \
|
||||
--enable-languages=$_languages \
|
||||
$_arch_configure \
|
||||
$_libc_configure \
|
||||
$_bootstrap_configure \
|
||||
--with-system-zlib \
|
||||
--with-jvm-root=/usr/lib/jvm/java-1.5-gcj \
|
||||
$_hash_style_configure
|
||||
make
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$_builddir"
|
||||
make -j1 DESTDIR="${pkgdir}" install
|
||||
|
||||
ln -s gcc-$_ver "$pkgdir"/usr/bin/cc-$_ver
|
||||
|
||||
# we dont support gcj -static
|
||||
# and saving 35MB is not bad.
|
||||
find "$pkgdir" -name libgcj.a -o -name libgtkpeer.a \
|
||||
-o -name libgjsmalsa.a -o -name libgcj-tools.a \
|
||||
-o -name libjvm.a -o -name libgij.a -o -name libgcj_bc.a \
|
||||
-o -name libjavamath.a \
|
||||
| xargs rm -f
|
||||
|
||||
# strip debug info from some static libs
|
||||
${STRIP_FOR_TARGET} -g `find "$pkgdir" \( -name \
|
||||
-o -name libmudflap.a -o -name libmudflapth.a \
|
||||
-o -name libgcc.a -o -name libgcov.a \
|
||||
-o -name libitm.a -o -name libcaf\*.a \
|
||||
-o -name libasan.a -o -name libtsan.a \) \
|
||||
-a -type f`
|
||||
|
||||
sed -i -e 's/lib: /&%{static:%eJava programs cannot be linked statically}/' \
|
||||
"$pkgdir"/$_gcclibdir/libgcj.spec
|
||||
|
||||
# avoid conlict with gcc
|
||||
mv "$pkgdir"/usr/lib/libcc1* "$pkgdir"/$_gcclibdir/
|
||||
|
||||
# remove ffi
|
||||
rm -f "$pkgdir"/usr/lib/libffi* "$pkgdir"/usr/share/man/man3/ffi*
|
||||
find "$pkgdir" -name 'ffi*.h' | xargs rm -f
|
||||
|
||||
# remove conflicting files
|
||||
rm -f "$pkgdir"/usr/lib/gcc/${CHOST}/lib/libgcc_s.so* \
|
||||
"$pkgdir"/usr/lib/libgcc_s.so*
|
||||
|
||||
local gdblib=${CTARGET}lib
|
||||
for i in $(find "$pkgdir"/usr/$gdblib/ -type f -maxdepth 1 -name "*-gdb.py" ); do
|
||||
mkdir -p "$pkgdir"/usr/share/gdb/python/auto-load/usr/$gdblib
|
||||
mv "$i" "$pkgdir"/usr/share/gdb/python/auto-load/usr/$gdblib/
|
||||
done
|
||||
|
||||
paxmark -pmrs "$pkgdir"/$_gcclibexec/cc1
|
||||
}
|
||||
|
||||
libcxx() {
|
||||
pkgdesc="GNU C++ standard runtime library"
|
||||
depends=
|
||||
|
||||
mkdir -p "$subpkgdir"/$_gcclibdir
|
||||
mv "$pkgdir"/$_gcclibdir/libstdc++.so.* "$subpkgdir"/$_gcclibdir/
|
||||
}
|
||||
|
||||
gpp() {
|
||||
pkgdesc="GNU C++ standard library and compiler"
|
||||
depends="libstdc++=$_gccrel gcc=$_gccrel libc-dev"
|
||||
mkdir -p "$subpkgdir/$_gcclibexec" \
|
||||
"$subpkgdir"/usr/bin \
|
||||
"$subpkgdir"/$_gcclibdir/include
|
||||
|
||||
mv "$pkgdir/$_gcclibexec/cc1plus" "$subpkgdir/$_gcclibexec/"
|
||||
paxmark -pmrs "$subpkgdir/$_gcclibexec/cc1plus"
|
||||
|
||||
mv "$pkgdir"/$_gcclibdir/*++* "$subpkgdir"/$_gcclibdir/
|
||||
mv "$pkgdir"/$_gcclibdir/include/c++ "$subpkgdir"/$_gcclibdir/include/
|
||||
mv "$pkgdir"/usr/bin/*++* "$subpkgdir"/usr/bin/
|
||||
}
|
||||
|
||||
java() {
|
||||
pkgdesc="Java support for GCC"
|
||||
depends="zlib-dev gcc6=$_gccrel libgcj6=$_gccrel"
|
||||
|
||||
paxmark -pm "$pkgdir"/$_gcclibexec/ecj1
|
||||
mkdir -p "$subpkgdir"/usr/bin "$subpkgdir"/usr/lib "$subpkgdir"/$_gcclibdir/
|
||||
cd "$pkgdir"/usr/bin
|
||||
mv gcj-$_ver gcj-dbtool-$_ver gjavah-$_ver gcjh-$_ver jcf-dump-$_ver "$subpkgdir"/usr/bin/
|
||||
cd "$pkgdir"
|
||||
for i in $(find usr/ -name ecj1 -o -name jc1 -o -name jvgenmain); do
|
||||
mkdir -p "$subpkgdir"/${i%/*}
|
||||
mv "$pkgdir"/$i "$subpkgdir"/$i
|
||||
done
|
||||
for i in "$pkgdir"/$_gcclibdir/libgcj*.so; do
|
||||
if [ -L "$i" ]; then
|
||||
mv "$i" "$subpkgdir"/usr/lib/
|
||||
fi
|
||||
done
|
||||
mv "$pkgdir"/$_gcclibdir/libgij.so \
|
||||
"$pkgdir"/$_gcclibdir/libgcj.spec \
|
||||
"$subpkgdir"/$_gcclibdir/
|
||||
}
|
||||
|
||||
libgcj() {
|
||||
pkgdesc="Java runtime library for gcc"
|
||||
depends=
|
||||
|
||||
mkdir -p "$subpkgdir"/usr/bin
|
||||
cd "$pkgdir"/usr/bin
|
||||
paxmark -pmse "$pkgdir"/usr/bin/gij-$_ver
|
||||
mv aot-compile-$_ver gappletviewer-$_ver gc-analyze-$_ver gij-$_ver \
|
||||
gjar-$_ver gjarsigner-$_ver gkeytool-$_ver gnative2ascii-$_ver gorbd-$_ver \
|
||||
grmic-$_ver grmid-$_ver grmiregistry-$_ver gserialver-$_ver \
|
||||
gtnameserv-$_ver jv-convert-$_ver rebuild-gcj-db-$_ver \
|
||||
"$subpkgdir"/usr/bin/
|
||||
cd "$pkgdir"
|
||||
for i in $(find usr/lib -name jc1 -o -name jvgenmain); do
|
||||
mkdir -p "$subpkgdir"/${i%/*}
|
||||
mv "$pkgdir"/$i "$subpkgdir"/$i
|
||||
done
|
||||
mkdir -p "$subpkgdir"/$_gcclibdir
|
||||
mv "$pkgdir"/$_gcclibdir/gcj-* \
|
||||
"$pkgdir"/$_gcclibdir/libgcj_bc.so \
|
||||
"$pkgdir"/$_gcclibdir/libgcj*.so.* \
|
||||
"$pkgdir"/$_gcclibdir/libgij.so.* \
|
||||
"$pkgdir"/$_gcclibdir/logging.properties \
|
||||
"$pkgdir"/$_gcclibdir/security \
|
||||
"$subpkgdir"/usr/lib/
|
||||
|
||||
mkdir -p "$subpkgdir"/usr/share/
|
||||
mv "$pkgdir"/usr/share/java "$subpkgdir"/usr/share/
|
||||
}
|
||||
|
||||
sha512sums="02c60e54527c7adf584798d5251f8a0b80c93d5deafce82501b2c28e6692e0bd783927bbfc4bc527a863c0cccc025150a34740a9e29badb02d4b48e56a8aba90 gcc-6.4.0.tar.xz
|
||||
28f8c6fdbcb19e950b1d0bafb3bcc7a8cba87bc673aa6027cece116599cdee80f0cf5e95a1440544890239f5c754e8a93ab46d9daedd937faef445d7ea33b226 ecj-4.9.jar
|
||||
a1335adc2fbee98e36c4437ff2587771b98ed4180726779020f65039498235626a411cdb0100dbd20cd19d12f0d94f9a21af179ff624676c28cead9d60598b5d 001_all_default-ssp-strong.patch
|
||||
e36e95b81489163abd6fe9d58f7867bdca43e61143afacbfb17f4698c0b16ec5fd0061d8fab7b2ae615540bebd721c2e2227f80401b4e7fc253da9da62e6b513 002_all_default-relro.patch
|
||||
f86466c62b8291fac46f9c250c7ad8fa5ab7b1cce2504442fd07ddc4543665b317ae28951f244e39aba29aeaf3fff252ec4f6a147aa16adb2b7aed747dd89188 003_all_default-fortify-source.patch
|
||||
51282fea54c7e616367bbeb2479ba13fec6f24eb47bd04e2071907b3b36273b2ff24676f46ef8d22f241c8ab4857307861eee076eab66797c3a50a8ecaa1809a 005_all_default-as-needed.patch
|
||||
3398386dd1e079d6545dd9799adc799c6b80e3984fac6899d0e1a7ee21b66d0c7e53cddf17a65d590c883db750f9f79aaedd857355a8b9f7fb9476c906237919 011_all_default-warn-format-security.patch
|
||||
9adb0d2b9b67dd957df6c609b8714c7c078efb52cd88770905c37c67827be8fc83d1125037b9c29d77db21ce78756aa2bb0bacdb0b98d869ac126da76a298e21 012_all_default-warn-trampolines.patch
|
||||
d35a3ac7e13a4446921a90e1ff3eec1079840c845f9d523c868e24ae21f94cf69ba041de5341ebef96432a6f57598e223381d4286e8fb8baaa25906707f29fbd 020_all_msgfmt-libstdc++-link.patch
|
||||
840070a3c423e6206aaa6e63e1d9a0fcd6efd53626cd1240a193f0b60aa5d84216acc4a2a4fa8bce74549b07e6a316b01d638f20cea13dc62473491a302fb3d6 050_all_libiberty-asprintf.patch
|
||||
0a0bc72b9366158f5d23fff1928e756fdd212433bac6ab1f00d632f241382820db8db5d475ddf11ea020eaf7e2e71b12fb9b1c3c870cf84adf6c2b16f15aabca 051_all_libiberty-pic.patch
|
||||
e7a2eb1b1870e199d6fd753d065781575656fa12baa264f96c5d179689d88c31b8a3f92a5dae96088c05e96aa2bda138364ad7dbcc79e1819a102f192cbb7bab 053_all_libitm-no-fortify-source.patch
|
||||
e87da18aa7ab92b02b06168658c63b42a6c73a08fad2a30f81ef6296100fdbe3c3a91548fd0cb24eaf591e862bb08e4b67249bc4b977b07da33523aee0c686bc 067_all_gcc-poison-system-directories.patch
|
||||
4a328d1e1a56c20166307edcfa322068915784d9c08025b7f81cf69714da48fc266b6d34f77b9135c2f10da830d9df408276a1b78d1fd218637c2823506593c2 090_all_pr55930-dependency-tracking.patch
|
||||
ef052d0c3c9642fcb5ed570069c5a49c8ef523c47ac8ce3f201a801766f72ae4ff7c3725a70ee66e52c0fb559621e35fe0cf5b88b901d71ceadd381f49653a08 201-cilkrts.patch
|
||||
808e206f5e107084156fba333d4e091dcbd62f5d7756142bc292d4b0a52619f8c2aaca3617defc2f5b6552ba0439aebd33f4141329d88eab6ddf2dd637d92c08 203-libgcc_s.patch
|
||||
fc0de05b36613b732a0222ea005c90653c6a40d6761b6894af2419272f4e74875f37e26af33a9b9940669ef89269c44c46d17ca5bcd54b5cd1176e5eaf2992c1 204-linux_libc_has_function.patch
|
||||
98473bcaa77903a223ca9b0d2087c0921b287a2816d308cc32c8fe009e6cbf5dd1ae7fba27794ab8d9c09e117fe534413d91a464d1218474fc123ce0adfdc2c1 205-nopie.patch
|
||||
3287d5b443bea8ec64132bcabe869c738ae98ea8f1a86df1c5d18c927f8816edbfcefeefc47792dbbb2bcacf50319af00e01b3735d34525913b64350770ad453 207-static-pie.patch
|
||||
d08d7ead2de0429e5c9055d5b029ec2be9a8c821d22cecaf9b51f633652c493333f98963d9267fa2fa63850c50ae5eefd5f59e5910ec10d20044dac082182a8b libgcc-always-build-gcceh.a.patch
|
||||
600fe5098dc54edaa9808fd5717af9dec058953f9ad37d49cfba1db4f7e9a7a8f02019342f75157fc575946fa693259422184de27b7ecc8386d9f3ecc0f7cc5d gcc-4.9-musl-fortify.patch
|
||||
dbe0ee917fc7668571722364ab7c806731e3a31e8bfa30b4941b28b16b877d2a32b4a3897ef533399a28f82d43cac9b28e92de0493f0e779046db56584e07fa4 gcc-6.1-musl-libssp.patch
|
||||
bda845a6aa1854d2c883910b115f79ccfa93dfc2b5eac69a3a236d83eb34cadc140731d616ffc24698c7abc8878dd15f231bcc5119f1860e575a120b311706c7 boehm-gc-musl.patch
|
||||
fa62556719449caec6b2b434355bfbcaa5ae55ffe017b3e1f827f66a2aae21b79c571ee7a4ce723ea69169bc3a6447e73650991a200cc372adf2f102677518d7 gcc-pure64.patch
|
||||
2253941f3d19b6d08801d3782f5f5ed56c3b73fbc9d3561a8f01c702963ac4fab91599c686076e7081eb6a80c37ccd33591ae978996d6eee1dc0ce0f1c50259a fix-gcj-stdgnu14-link.patch
|
||||
f89ddeb21bc8f97e6a850a6b70b4501a8f3e49a4bc8cc82897488decda5d98ad01cb7f6c8b392d452e9579924a523bc75da6e0648c1c976d42e40af48b10343b fix-gcj-musl.patch
|
||||
54d67cc008b735e47771314171930c5d8b8f5f5dc97fcf4214824c105c808f3e75d22d5a4fdf5068ed0457fa0d46c60cfb442e276259a4a5e9b8722a027d18e6 fix-gcj-iconv-musl.patch
|
||||
abe9aaf9aa956058d0386a4396a511d176a46bb3906b90e952383646cdc158cbeb0a5dc616a1ccb1ca7d49fd0b5e351532aa15a3b13362abbf1ca4266f54a687 gcc-4.8-build-args.patch
|
||||
35d6d59f0b7b968f282f56767c9e0823a7bdc5aa0d450aca50fbd802649a7ca608b47671244a3faa208a9b0d6832cabb5a22724157dc817b2c0ad63d09f93282 fix-cxxflags-passing.patch
|
||||
4b4a0ff306a8ef34ff6e3284fbfca869012164a47ba7cb099085c1dd03e6ca0cdd462f82710e08c9a02895adc7484e4c5eef17b5aa264cf5d978fe8ad78eea93 300-main-gcc-add-musl-s390x-dynamic-linker.patch
|
||||
385bc2fa50204f678964e5148c6170f572701dab920fbec8301f505bda34d182cde0adb7da042fee71719e12fb59f59181897f9b1bb4f4716ff59aad46ca1998 310-build-gcj-s390x.patch
|
||||
f4ef08454e28c8732db69115e4998ec153399e8d229dd27f923dbdcf57b68128a65640d026cc7f45b58ba8764ab1eb575d4eb6d6dfc550a87a183f8b94e76181 320-libffi-gnulinux.patch
|
||||
01c71cd5881fc07ea3b9b980697e89b3ca0fe98502958ceafc3fca18b2604c844e2f457feab711baf8e03f00a5383b0e38aac7eb954034e306f43d4a37f165ed fix-rs6000-pie.patch
|
||||
34a818d5be67eb1f34e44a80b83c28a9b9c17d37fc9fac639f490d6bb5b53ebe3318140d09c236a17d7c98f5a7792ae3d6cefccda8067a5e942d6305b9d1f87c fix-linux-header-use-in-libgcc.patch
|
||||
86be3338cc9c33089608bc4c5e3b7918c4e500a345c338f361b18c342119a6ed69af5495d72950de7106d760f003528b46ad14795e805f8a3331e206dcb234e3 gcc-pure64-mips.patch
|
||||
aae9d510326bed6eca0b1f680d2caf64dd804e73fb9d726c8932faa845c07e1be6ab12920972d8fb80a33dafedcaafca71487b0eaf10e6d5fa7deb853926b933 fix-ppc64le-coercion-r261621.patch"
|
62
temp/gcc6/boehm-gc-musl.patch
Normal file
62
temp/gcc6/boehm-gc-musl.patch
Normal file
|
@ -0,0 +1,62 @@
|
|||
--- gcc-4.8.1/boehm-gc/os_dep.c.orig 2013-09-17 07:46:00.969884340 +0000
|
||||
+++ gcc-4.8.1/boehm-gc/os_dep.c 2013-09-17 06:53:53.629884946 +0000
|
||||
@@ -26,7 +26,7 @@
|
||||
# define __KERNEL__
|
||||
# include <asm/signal.h>
|
||||
# undef __KERNEL__
|
||||
-# else
|
||||
+# elif defined(__GLIBC__)
|
||||
/* Kernels prior to 2.1.1 defined struct sigcontext_struct instead of */
|
||||
/* struct sigcontext. libc6 (glibc2) uses "struct sigcontext" in */
|
||||
/* prototypes, so we have to include the top-level sigcontext.h to */
|
||||
--- gcc-4.8.2/boehm-gc/dyn_load.c.orig 2014-02-17 14:13:09.519850231 +0200
|
||||
+++ gcc-4.8.2/boehm-gc/dyn_load.c 2014-02-17 14:14:27.906093514 +0200
|
||||
@@ -459,9 +459,7 @@
|
||||
/* For glibc 2.2.4+. Unfortunately, it doesn't work for older */
|
||||
/* versions. Thanks to Jakub Jelinek for most of the code. */
|
||||
|
||||
-# if (defined(LINUX) || defined (__GLIBC__)) /* Are others OK here, too? */ \
|
||||
- && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) \
|
||||
- || (__GLIBC__ == 2 && __GLIBC_MINOR__ == 2 && defined(DT_CONFIG)))
|
||||
+# if (defined(LINUX) || defined (__GLIBC__))
|
||||
|
||||
/* We have the header files for a glibc that includes dl_iterate_phdr. */
|
||||
/* It may still not be available in the library on the target system. */
|
||||
--- gcc-4.8.2/boehm-gc/include/private/gcconfig.h.orig 2014-02-17 14:14:36.026049422 +0200
|
||||
+++ gcc-4.8.2/boehm-gc/include/private/gcconfig.h 2014-02-17 14:17:11.345207887 +0200
|
||||
@@ -684,7 +684,7 @@
|
||||
# ifdef __ELF__
|
||||
# define DYNAMIC_LOADING
|
||||
# include <features.h>
|
||||
-# if defined(__GLIBC__)&& __GLIBC__>=2
|
||||
+# if 1
|
||||
# define SEARCH_FOR_DATA_START
|
||||
# else /* !GLIBC2 */
|
||||
extern char **__environ;
|
||||
@@ -1147,7 +1147,7 @@
|
||||
# define DATASTART ((ptr_t)((((word) (_etext)) + 0xfff) & ~0xfff))
|
||||
# endif
|
||||
# include <features.h>
|
||||
-# if defined(__GLIBC__) && __GLIBC__ >= 2
|
||||
+# if 1
|
||||
# define SEARCH_FOR_DATA_START
|
||||
# else
|
||||
extern char **__environ;
|
||||
@@ -1367,7 +1367,7 @@
|
||||
# define HBLKSIZE 4096
|
||||
# endif
|
||||
# define USE_GENERIC_PUSH_REGS
|
||||
-# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 2 || __GLIBC__ > 2
|
||||
+# if 1
|
||||
# define LINUX_STACKBOTTOM
|
||||
# else
|
||||
# define STACKBOTTOM 0x80000000
|
||||
@@ -1858,7 +1858,7 @@
|
||||
# ifdef __ELF__
|
||||
# define DYNAMIC_LOADING
|
||||
# include <features.h>
|
||||
-# if defined(__GLIBC__) && __GLIBC__ >= 2
|
||||
+# if 1
|
||||
# define SEARCH_FOR_DATA_START
|
||||
# else
|
||||
extern char **__environ;
|
10
temp/gcc6/fix-cxxflags-passing.patch
Normal file
10
temp/gcc6/fix-cxxflags-passing.patch
Normal file
|
@ -0,0 +1,10 @@
|
|||
--- gcc-4.8.1/Makefile.in.orig
|
||||
+++ gcc-4.8.1/Makefile.in
|
||||
@@ -169,6 +169,7 @@
|
||||
# built for the build system to override those in BASE_FLAGS_TO_PASSS.
|
||||
EXTRA_BUILD_FLAGS = \
|
||||
CFLAGS="$(CFLAGS_FOR_BUILD)" \
|
||||
+ CXXFLAGS="$(CXXFLAGS_FOR_BUILD)" \
|
||||
LDFLAGS="$(LDFLAGS_FOR_BUILD)"
|
||||
|
||||
# This is the list of directories to built for the host system.
|
120
temp/gcc6/fix-gcj-iconv-musl.patch
Normal file
120
temp/gcc6/fix-gcj-iconv-musl.patch
Normal file
|
@ -0,0 +1,120 @@
|
|||
--- gcc-4.8.2/libjava/gnu/gcj/convert/natIconv.cc.orig 2014-02-18 18:46:14.897880526 +0200
|
||||
+++ gcc-4.8.2/libjava/gnu/gcj/convert/natIconv.cc 2014-02-18 18:50:08.766613550 +0200
|
||||
@@ -24,6 +24,13 @@
|
||||
|
||||
#ifdef HAVE_ICONV
|
||||
#include <iconv.h>
|
||||
+#include <endian.h>
|
||||
+
|
||||
+#if __BYTE_ORDER == __BIG_ENDIAN
|
||||
+#define UCS2_CHARSET "UCS-2BE"
|
||||
+#else
|
||||
+#define UCS2_CHARSET "UCS-2LE"
|
||||
+#endif
|
||||
|
||||
template<typename T>
|
||||
static inline size_t
|
||||
@@ -45,7 +52,7 @@
|
||||
_Jv_GetStringUTFRegion (encoding, 0, encoding->length(), buffer);
|
||||
buffer[len] = '\0';
|
||||
|
||||
- iconv_t h = iconv_open ("UCS-2", buffer);
|
||||
+ iconv_t h = iconv_open (UCS2_CHARSET, buffer);
|
||||
if (h == (iconv_t) -1)
|
||||
throw new ::java::io::UnsupportedEncodingException (encoding);
|
||||
|
||||
@@ -99,18 +106,6 @@
|
||||
throw new ::java::io::CharConversionException ();
|
||||
}
|
||||
|
||||
- if (iconv_byte_swap)
|
||||
- {
|
||||
- size_t max = (old_out - outavail) / sizeof (jchar);
|
||||
- for (size_t i = 0; i < max; ++i)
|
||||
- {
|
||||
- // Byte swap.
|
||||
- jchar c = (((out[outpos + i] & 0xff) << 8)
|
||||
- | ((out[outpos + i] >> 8) & 0xff));
|
||||
- outbuf[i] = c;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
inpos += old_in - inavail;
|
||||
return (old_out - outavail) / sizeof (jchar);
|
||||
#else /* HAVE_ICONV */
|
||||
@@ -145,7 +140,7 @@
|
||||
_Jv_GetStringUTFRegion (encoding, 0, encoding->length(), buffer);
|
||||
buffer[len] = '\0';
|
||||
|
||||
- iconv_t h = iconv_open (buffer, "UCS-2");
|
||||
+ iconv_t h = iconv_open (buffer, UCS2_CHARSET);
|
||||
if (h == (iconv_t) -1)
|
||||
throw new ::java::io::UnsupportedEncodingException (encoding);
|
||||
|
||||
@@ -187,20 +182,6 @@
|
||||
char *inbuf = (char *) &chars[inpos];
|
||||
char *outbuf = (char *) &out[count];
|
||||
|
||||
- if (iconv_byte_swap)
|
||||
- {
|
||||
- // Ugly performance penalty -- don't use losing systems!
|
||||
- temp_buffer = (jchar *) _Jv_Malloc (inlength * sizeof (jchar));
|
||||
- for (int i = 0; i < inlength; ++i)
|
||||
- {
|
||||
- // Byte swap.
|
||||
- jchar c = (((chars[inpos + i] & 0xff) << 8)
|
||||
- | ((chars[inpos + i] >> 8) & 0xff));
|
||||
- temp_buffer[i] = c;
|
||||
- }
|
||||
- inbuf = (char *) temp_buffer;
|
||||
- }
|
||||
-
|
||||
size_t loop_old_in = old_in;
|
||||
while (1)
|
||||
{
|
||||
@@ -252,44 +233,7 @@
|
||||
jboolean
|
||||
gnu::gcj::convert::IOConverter::iconv_init (void)
|
||||
{
|
||||
- // Some versions of iconv() always return their UCS-2 results in
|
||||
- // big-endian order, and they also require UCS-2 inputs to be in
|
||||
- // big-endian order. For instance, glibc 2.1.3 does this. If the
|
||||
- // UTF-8=>UCS-2 iconv converter has this feature, then we assume
|
||||
- // that all UCS-2 converters do. (This might not be the best
|
||||
- // heuristic, but is is all we've got.)
|
||||
- jboolean result = false;
|
||||
-#ifdef HAVE_ICONV
|
||||
- iconv_t handle = iconv_open ("UCS-2", "UTF-8");
|
||||
- if (handle != (iconv_t) -1)
|
||||
- {
|
||||
- jchar c;
|
||||
- unsigned char in[4];
|
||||
- char *inp, *outp;
|
||||
- size_t inc, outc, r;
|
||||
-
|
||||
- // This is the UTF-8 encoding of \ufeff. At least Tru64 UNIX libiconv
|
||||
- // needs the trailing NUL byte, otherwise iconv fails with EINVAL.
|
||||
- in[0] = 0xef;
|
||||
- in[1] = 0xbb;
|
||||
- in[2] = 0xbf;
|
||||
- in[3] = 0x00;
|
||||
-
|
||||
- inp = (char *) in;
|
||||
- inc = 4;
|
||||
- outp = (char *) &c;
|
||||
- outc = 2;
|
||||
-
|
||||
- r = iconv_adapter (iconv, handle, &inp, &inc, &outp, &outc);
|
||||
- // Conversion must be complete for us to use the result.
|
||||
- if (r != (size_t) -1 && inc == 0 && outc == 0)
|
||||
- result = (c != 0xfeff);
|
||||
-
|
||||
- // Release iconv handle.
|
||||
- iconv_close (handle);
|
||||
- }
|
||||
-#endif /* HAVE_ICONV */
|
||||
- return result;
|
||||
+ return false;
|
||||
}
|
||||
|
||||
void
|
49
temp/gcc6/fix-gcj-musl.patch
Normal file
49
temp/gcc6/fix-gcj-musl.patch
Normal file
|
@ -0,0 +1,49 @@
|
|||
--- gcc-4.8.2/libjava/gnu/classpath/natSystemProperties.cc.orig 2014-02-18 10:55:08.617678779 +0200
|
||||
+++ gcc-4.8.2/libjava/gnu/classpath/natSystemProperties.cc 2014-02-18 10:56:31.927227453 +0200
|
||||
@@ -289,7 +289,7 @@
|
||||
// just default to `en_US'.
|
||||
setlocale (LC_ALL, "");
|
||||
char *locale = setlocale (LC_MESSAGES, "");
|
||||
- if (locale && strlen (locale) >= 2)
|
||||
+ if (locale && strlen (locale) >= 2 && (locale[2] == '\0' || locale[2] == '_'))
|
||||
{
|
||||
char buf[3];
|
||||
buf[2] = '\0';
|
||||
--- gcc-4.8.2/libjava/posix-threads.cc.orig 2014-02-18 13:22:01.789933726 +0200
|
||||
+++ gcc-4.8.2/libjava/posix-threads.cc 2014-02-18 13:29:50.924058875 +0200
|
||||
@@ -657,6 +657,7 @@
|
||||
struct sched_param param;
|
||||
pthread_attr_t attr;
|
||||
struct starter *info;
|
||||
+ size_t ss;
|
||||
|
||||
if (data->flags & FLAG_START)
|
||||
return;
|
||||
@@ -675,8 +676,25 @@
|
||||
// Set stack size if -Xss option was given.
|
||||
if (gcj::stack_size > 0)
|
||||
{
|
||||
- int e = pthread_attr_setstacksize (&attr, gcj::stack_size);
|
||||
+ ss = gcj::stack_size;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ int e = pthread_attr_getstacksize (&attr, &ss);
|
||||
+ if (e != 0)
|
||||
+ JvFail (strerror (e));
|
||||
+
|
||||
+ // Request at least 1meg of stack
|
||||
+ if (ss >= 1024 * 1024)
|
||||
+ ss = 0;
|
||||
+ else
|
||||
+ ss = 1024 * 1024;
|
||||
+ }
|
||||
+
|
||||
+ if (ss)
|
||||
+ {
|
||||
+ int e = pthread_attr_setstacksize (&attr, ss);
|
||||
if (e != 0)
|
||||
JvFail (strerror (e));
|
||||
}
|
||||
|
||||
info = (struct starter *) _Jv_AllocBytes (sizeof (struct starter));
|
35
temp/gcc6/fix-gcj-stdgnu14-link.patch
Normal file
35
temp/gcc6/fix-gcj-stdgnu14-link.patch
Normal file
|
@ -0,0 +1,35 @@
|
|||
--- gcc-6.1.0/libjava/Makefile.am
|
||||
+++ gcc-6.1.0/libjava/Makefile.am
|
||||
@@ -488,10 +488,14 @@
|
||||
nat_files = $(nat_source_files:.cc=.lo)
|
||||
xlib_nat_files = $(xlib_nat_source_files:.cc=.lo)
|
||||
|
||||
+libgcj_la_CPPFLAGS = \
|
||||
+ $(AM_CPPFLAGS) \
|
||||
+ $(LIBSTDCXX_RAW_CXX_CXXFLAGS)
|
||||
+
|
||||
# Include THREADLIBS here to ensure that the correct version of
|
||||
# certain linuxthread functions get linked:
|
||||
## The mysterious backslash in the grep pattern is consumed by make.
|
||||
-libgcj_la_LDFLAGS = -rpath $(toolexeclibdir) $(THREADLDFLAGS) $(extra_ldflags) $(THREADLIBS) \
|
||||
+libgcj_la_LDFLAGS = $(LIBSTDCXX_RAW_CXX_LDFLAGS) -rpath $(toolexeclibdir) $(THREADLDFLAGS) $(extra_ldflags) $(THREADLIBS) \
|
||||
$(LIBLTDL) $(SYS_ZLIBS) $(LIBJAVA_LDFLAGS_NOUNDEF) \
|
||||
-version-info `grep -v '^\#' $(srcdir)/libtool-version` \
|
||||
$(LIBGCJ_LD_SYMBOLIC_FUNCTIONS) $(LIBGCJ_LD_EXPORT_ALL)
|
||||
--- gcc-6.1.0/libjava/Makefile.in
|
||||
+++ gcc-6.1.0/libjava/Makefile.in
|
||||
@@ -1103,9 +1103,13 @@
|
||||
nat_files = $(nat_source_files:.cc=.lo)
|
||||
xlib_nat_files = $(xlib_nat_source_files:.cc=.lo)
|
||||
|
||||
+libgcj_la_CPPFLAGS = \
|
||||
+ $(AM_CPPFLAGS) \
|
||||
+ $(LIBSTDCXX_RAW_CXX_CXXFLAGS)
|
||||
+
|
||||
# Include THREADLIBS here to ensure that the correct version of
|
||||
# certain linuxthread functions get linked:
|
||||
-libgcj_la_LDFLAGS = -rpath $(toolexeclibdir) $(THREADLDFLAGS) $(extra_ldflags) $(THREADLIBS) \
|
||||
+libgcj_la_LDFLAGS = $(LIBSTDCXX_RAW_CXX_LDFLAGS) -rpath $(toolexeclibdir) $(THREADLDFLAGS) $(extra_ldflags) $(THREADLIBS) \
|
||||
$(LIBLTDL) $(SYS_ZLIBS) $(LIBJAVA_LDFLAGS_NOUNDEF) \
|
||||
-version-info `grep -v '^\#' $(srcdir)/libtool-version` \
|
||||
$(LIBGCJ_LD_SYMBOLIC_FUNCTIONS) $(LIBGCJ_LD_EXPORT_ALL)
|
44
temp/gcc6/fix-linux-header-use-in-libgcc.patch
Normal file
44
temp/gcc6/fix-linux-header-use-in-libgcc.patch
Normal file
|
@ -0,0 +1,44 @@
|
|||
From 9cd4503714c4e596818c4ea8e15905c249b7a319 Mon Sep 17 00:00:00 2001
|
||||
From: nsz <nsz@138bc75d-0d04-0410-961f-82ee72b054a4>
|
||||
Date: Thu, 25 Aug 2016 14:08:27 +0000
|
||||
Subject: [PATCH] [mips] Fix linux header use in libgcc
|
||||
|
||||
libgcc/
|
||||
* config/mips/linux-unwind.h: Use sys/syscall.h.
|
||||
|
||||
|
||||
|
||||
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@239759 138bc75d-0d04-0410-961f-82ee72b054a4
|
||||
---
|
||||
libgcc/ChangeLog | 4 ++++
|
||||
libgcc/config/mips/linux-unwind.h | 2 +-
|
||||
2 files changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
|
||||
index b78c4b2..99bd2f1 100644
|
||||
--- a/libgcc/ChangeLog
|
||||
+++ b/libgcc/ChangeLog
|
||||
@@ -1,3 +1,7 @@
|
||||
+2016-08-25 Szabolcs Nagy <szabolcs.nagy@arm.com>
|
||||
+
|
||||
+ * config/mips/linux-unwind.h: Use sys/syscall.h.
|
||||
+
|
||||
2016-08-16 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
PR libgcc/77265
|
||||
diff --git a/libgcc/config/mips/linux-unwind.h b/libgcc/config/mips/linux-unwind.h
|
||||
index bf12de5..4035c121 100644
|
||||
--- a/libgcc/config/mips/linux-unwind.h
|
||||
+++ b/libgcc/config/mips/linux-unwind.h
|
||||
@@ -27,7 +27,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
state data appropriately. See unwind-dw2.c for the structs. */
|
||||
|
||||
#include <signal.h>
|
||||
-#include <asm/unistd.h>
|
||||
+#include <sys/syscall.h>
|
||||
|
||||
/* The third parameter to the signal handler points to something with
|
||||
* this structure defined in asm/ucontext.h, but the name clashes with
|
||||
--
|
||||
2.9.3
|
||||
|
11
temp/gcc6/fix-ppc64le-coercion-r261621.patch
Normal file
11
temp/gcc6/fix-ppc64le-coercion-r261621.patch
Normal file
|
@ -0,0 +1,11 @@
|
|||
--- a/libcpp/lex.c
|
||||
+++ b/libcpp/lex.c
|
||||
@@ -568,7 +568,7 @@
|
||||
{
|
||||
vc m_nl, m_cr, m_bs, m_qm;
|
||||
|
||||
- data = *((const vc *)s);
|
||||
+ data = __builtin_vec_vsx_ld (0, s);
|
||||
s += 16;
|
||||
|
||||
m_nl = (vc) __builtin_vec_cmpeq(data, repl_nl);
|
59
temp/gcc6/fix-rs6000-pie.patch
Normal file
59
temp/gcc6/fix-rs6000-pie.patch
Normal file
|
@ -0,0 +1,59 @@
|
|||
--- gcc-6.3.0.orig/gcc/config/rs6000/sysv4.h
|
||||
+++ gcc-6.3.0/gcc/config/rs6000/sysv4.h
|
||||
@@ -753,23 +753,42 @@
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LD_PIE
|
||||
-#define STARTFILE_LINUX_SPEC "\
|
||||
-%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
|
||||
-%{mnewlib:ecrti.o%s;:crti.o%s} \
|
||||
-%{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s} \
|
||||
-" CRTOFFLOADBEGIN
|
||||
+#define STARTFILE_LINUX_SPEC \
|
||||
+ "%{!shared: %{pg|p|profile:gcrt1.o%s;: \
|
||||
+ %{" PIE_SPEC ":%{static:rcrt1.o%s;:Scrt1.o%s}} %{" NO_PIE_SPEC ":crt1.o%s}}} \
|
||||
+ crti.o%s %{shared:crtbeginS.o%s;: \
|
||||
+ %{" PIE_SPEC ":crtbeginS.o%s} \
|
||||
+ %{" NO_PIE_SPEC ":%{static:crtbeginT.o%s;:crtbegin.o%s}}} \
|
||||
+ %{fvtable-verify=none:%s; \
|
||||
+ fvtable-verify=preinit:vtv_start_preinit.o%s; \
|
||||
+ fvtable-verify=std:vtv_start.o%s} \
|
||||
+ " CRTOFFLOADBEGIN
|
||||
#else
|
||||
-#define STARTFILE_LINUX_SPEC "\
|
||||
-%{!shared: %{pg|p|profile:gcrt1.o%s;:crt1.o%s}} \
|
||||
-%{mnewlib:ecrti.o%s;:crti.o%s} \
|
||||
-%{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s} \
|
||||
-" CRTOFFLOADBEGIN
|
||||
+#define STARTFILE_LINUX_SPEC \
|
||||
+ "%{!shared: %{pg|p|profile:gcrt1.o%s;:crt1.o%s}} \
|
||||
+ crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s} \
|
||||
+ %{fvtable-verify=none:%s; \
|
||||
+ fvtable-verify=preinit:vtv_start_preinit.o%s; \
|
||||
+ fvtable-verify=std:vtv_start.o%s} \
|
||||
+ " CRTOFFLOADBEGIN
|
||||
#endif
|
||||
|
||||
-#define ENDFILE_LINUX_SPEC "\
|
||||
-%{shared|pie:crtendS.o%s;:crtend.o%s} \
|
||||
-%{mnewlib:ecrtn.o%s;:crtn.o%s} \
|
||||
-" CRTOFFLOADEND
|
||||
+#ifdef HAVE_LD_PIE
|
||||
+#define ENDFILE_LINUX_SPEC \
|
||||
+ "%{fvtable-verify=none:%s; \
|
||||
+ fvtable-verify=preinit:vtv_end_preinit.o%s; \
|
||||
+ fvtable-verify=std:vtv_end.o%s} \
|
||||
+ %{shared:crtendS.o%s;: %{" PIE_SPEC ":crtendS.o%s} \
|
||||
+ %{" NO_PIE_SPEC ":crtend.o%s}} crtn.o%s \
|
||||
+ " CRTOFFLOADEND
|
||||
+#else
|
||||
+#define ENDFILE_LINUX_SPEC \
|
||||
+ "%{fvtable-verify=none:%s; \
|
||||
+ fvtable-verify=preinit:vtv_end_preinit.o%s; \
|
||||
+ fvtable-verify=std:vtv_end.o%s} \
|
||||
+ %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s \
|
||||
+ " CRTOFFLOADEND
|
||||
+#endif
|
||||
|
||||
#define LINK_START_LINUX_SPEC ""
|
||||
|
41
temp/gcc6/gcc-4.8-build-args.patch
Normal file
41
temp/gcc6/gcc-4.8-build-args.patch
Normal file
|
@ -0,0 +1,41 @@
|
|||
When cross compiling a target gcc, target flags may be used on the host
|
||||
|
||||
Configure identifies a number of warning flags (WARN_CFLAGS and
|
||||
WARN_CXXFLAGS) from the $CC value. The cross compiler may be different
|
||||
from the host compiler and may not support the same set of flags. This
|
||||
leads to problems such as:
|
||||
|
||||
cc1plus: error: unrecognized command line option "-Wno-narrowing"
|
||||
cc1plus: error: unrecognized command line option "-Wno-overlength-strings"
|
||||
|
||||
Work around this problem by removing the warning flags from the
|
||||
BUILD_CXXFLAGS value, in a way similar to the BUILD_CFLAGS.
|
||||
|
||||
Upstream-Status: Pending
|
||||
|
||||
Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
|
||||
|
||||
Index: gcc-4.8.0/gcc/configure
|
||||
===================================================================
|
||||
--- gcc-4.8.0.orig/gcc/configure
|
||||
+++ gcc-4.8.0/gcc/configure
|
||||
@@ -11720,6 +10581,7 @@ STMP_FIXINC=stmp-fixinc
|
||||
if test x$build != x$host || test "x$coverage_flags" != x
|
||||
then
|
||||
BUILD_CFLAGS='$(INTERNAL_CFLAGS) $(T_CFLAGS) $(CFLAGS_FOR_BUILD)'
|
||||
+ BUILD_CXXFLAGS='$(INTERNAL_CFLAGS) $(T_CFLAGS) $(CFLAGS_FOR_BUILD)'
|
||||
BUILD_LDFLAGS='$(LDFLAGS_FOR_BUILD)'
|
||||
fi
|
||||
|
||||
Index: gcc-4.8.0/gcc/configure.ac
|
||||
===================================================================
|
||||
--- gcc-4.8.0.orig/gcc/configure.ac
|
||||
+++ gcc-4.8.0/gcc/configure.ac
|
||||
@@ -1901,6 +1901,7 @@ STMP_FIXINC=stmp-fixinc AC_SUBST(STMP_F
|
||||
if test x$build != x$host || test "x$coverage_flags" != x
|
||||
then
|
||||
BUILD_CFLAGS='$(INTERNAL_CFLAGS) $(T_CFLAGS) $(CFLAGS_FOR_BUILD)'
|
||||
+ BUILD_CXXFLAGS='$(INTERNAL_CFLAGS) $(T_CFLAGS) $(CFLAGS_FOR_BUILD)'
|
||||
BUILD_LDFLAGS='$(LDFLAGS_FOR_BUILD)'
|
||||
fi
|
||||
|
11
temp/gcc6/gcc-4.9-musl-fortify.patch
Normal file
11
temp/gcc6/gcc-4.9-musl-fortify.patch
Normal file
|
@ -0,0 +1,11 @@
|
|||
--- gcc-4.9.2/gcc/config/linux.h.orig 2015-03-09 13:27:13.289736710 +0000
|
||||
+++ gcc-4.9.2/gcc/config/linux.h 2015-03-09 13:29:32.295625046 +0000
|
||||
@@ -146,6 +146,8 @@
|
||||
|
||||
#ifdef NATIVE_SYSTEM_HEADER_DIR
|
||||
#define INCLUDE_DEFAULTS_MUSL_NATIVE \
|
||||
+ { NATIVE_SYSTEM_HEADER_DIR "/fortify", 0, 0, 0, 1, 2 }, \
|
||||
+ { NATIVE_SYSTEM_HEADER_DIR "/fortify", 0, 0, 0, 1, 0 }, \
|
||||
{ NATIVE_SYSTEM_HEADER_DIR, 0, 0, 0, 1, 2 }, \
|
||||
{ NATIVE_SYSTEM_HEADER_DIR, 0, 0, 0, 1, 0 },
|
||||
#else
|
20
temp/gcc6/gcc-6.1-musl-libssp.patch
Normal file
20
temp/gcc6/gcc-6.1-musl-libssp.patch
Normal file
|
@ -0,0 +1,20 @@
|
|||
Author: Timo Teräs <timo.teras@iki.fi>
|
||||
|
||||
Alpine musl package provides libssp_nonshared.a. We link to it unconditionally,
|
||||
as otherwise we get link failures if some objects are -fstack-protector built
|
||||
and final link happens with -fno-stack-protector. This seems to be the common
|
||||
case when bootstrapping gcc, the piepatches do not seem to fully fix the
|
||||
crosstoolchain and bootstrap sequence wrt. stack-protector flag usage.
|
||||
|
||||
--- gcc-6.1.0/gcc/gcc.c.orig
|
||||
+++ gcc-6.1.0/gcc/gcc.c
|
||||
@@ -870,8 +870,7 @@
|
||||
|
||||
#ifndef LINK_SSP_SPEC
|
||||
#ifdef TARGET_LIBC_PROVIDES_SSP
|
||||
-#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
|
||||
- "|fstack-protector-strong|fstack-protector-explicit:}"
|
||||
+#define LINK_SSP_SPEC "-lssp_nonshared"
|
||||
#else
|
||||
#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
|
||||
"|fstack-protector-strong|fstack-protector-explicit" \
|
47
temp/gcc6/gcc-pure64-mips.patch
Normal file
47
temp/gcc6/gcc-pure64-mips.patch
Normal file
|
@ -0,0 +1,47 @@
|
|||
From b8c4e45d052adc247341066f748421743704b481 Mon Sep 17 00:00:00 2001
|
||||
From: Nils Andreas Svee <me@lochnair.net>
|
||||
Date: Thu, 21 Dec 2017 03:14:33 +0100
|
||||
Subject: [PATCH] Pure 64-bit MIPS
|
||||
|
||||
---
|
||||
gcc/config/mips/mips.h | 8 ++++----
|
||||
gcc/config/mips/t-linux64 | 6 +++---
|
||||
2 files changed, 7 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
|
||||
index 803ab98e7..afd74752f 100644
|
||||
--- a/gcc/config/mips/mips.h
|
||||
+++ b/gcc/config/mips/mips.h
|
||||
@@ -3330,11 +3330,11 @@ struct GTY(()) machine_function {
|
||||
/* If we are *not* using multilibs and the default ABI is not ABI_32 we
|
||||
need to change these from /lib and /usr/lib. */
|
||||
#if MIPS_ABI_DEFAULT == ABI_N32
|
||||
-#define STANDARD_STARTFILE_PREFIX_1 "/lib32/"
|
||||
-#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib32/"
|
||||
+#define STANDARD_STARTFILE_PREFIX_1 "/lib/"
|
||||
+#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
|
||||
#elif MIPS_ABI_DEFAULT == ABI_64
|
||||
-#define STANDARD_STARTFILE_PREFIX_1 "/lib64/"
|
||||
-#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib64/"
|
||||
+#define STANDARD_STARTFILE_PREFIX_1 "/lib/"
|
||||
+#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
|
||||
#endif
|
||||
|
||||
/* Load store bonding is not supported by micromips and fix_24k. The
|
||||
diff --git a/gcc/config/mips/t-linux64 b/gcc/config/mips/t-linux64
|
||||
index 16c8adf85..bb46204db 100644
|
||||
--- a/gcc/config/mips/t-linux64
|
||||
+++ b/gcc/config/mips/t-linux64
|
||||
@@ -21,6 +21,6 @@ MULTILIB_DIRNAMES = n32 32 64
|
||||
MIPS_EL = $(if $(filter %el, $(firstword $(subst -, ,$(target)))),el)
|
||||
MIPS_SOFT = $(if $(strip $(filter MASK_SOFT_FLOAT_ABI, $(target_cpu_default)) $(filter soft, $(with_float))),soft)
|
||||
MULTILIB_OSDIRNAMES = \
|
||||
- ../lib32$(call if_multiarch,:mips64$(MIPS_EL)-linux-gnuabin32$(MIPS_SOFT)) \
|
||||
- ../lib$(call if_multiarch,:mips$(MIPS_EL)-linux-gnu$(MIPS_SOFT)) \
|
||||
- ../lib64$(call if_multiarch,:mips64$(MIPS_EL)-linux-gnuabi64$(MIPS_SOFT))
|
||||
+ ../lib \
|
||||
+ ../lib32 \
|
||||
+ ../lib
|
||||
--
|
||||
2.15.1
|
||||
|
89
temp/gcc6/gcc-pure64.patch
Normal file
89
temp/gcc6/gcc-pure64.patch
Normal file
|
@ -0,0 +1,89 @@
|
|||
--- ./gcc/config/i386/t-linux64.orig 2013-01-14 16:32:37.000000000 +0000
|
||||
+++ ./gcc/config/i386/t-linux64 2013-04-22 06:12:32.984439677 +0000
|
||||
@@ -34,6 +34,6 @@
|
||||
comma=,
|
||||
MULTILIB_OPTIONS = $(subst $(comma),/,$(TM_MULTILIB_CONFIG))
|
||||
MULTILIB_DIRNAMES = $(patsubst m%, %, $(subst /, ,$(MULTILIB_OPTIONS)))
|
||||
-MULTILIB_OSDIRNAMES = m64=../lib64$(call if_multiarch,:x86_64-linux-gnu)
|
||||
-MULTILIB_OSDIRNAMES+= m32=$(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:i386-linux-gnu)
|
||||
+MULTILIB_OSDIRNAMES = m64=../lib
|
||||
+MULTILIB_OSDIRNAMES+= m32=../lib32
|
||||
MULTILIB_OSDIRNAMES+= mx32=../libx32$(call if_multiarch,:x86_64-linux-gnux32)
|
||||
--- ./gcc/config/aarch64/t-aarch64-linux.orig
|
||||
+++ ./gcc/config/aarch64/t-aarch64-linux
|
||||
@@ -22,7 +22,7 @@
|
||||
LIB1ASMFUNCS = _aarch64_sync_cache_range
|
||||
|
||||
AARCH_BE = $(if $(findstring TARGET_BIG_ENDIAN_DEFAULT=1, $(tm_defines)),_be)
|
||||
-MULTILIB_OSDIRNAMES = mabi.lp64=../lib64$(call if_multiarch,:aarch64$(AARCH_BE)-linux-gnu)
|
||||
+MULTILIB_OSDIRNAMES = mabi.lp64=../lib
|
||||
MULTIARCH_DIRNAME = $(call if_multiarch,aarch64$(AARCH_BE)-linux-gnu)
|
||||
|
||||
MULTILIB_OSDIRNAMES += mabi.ilp32=../libilp32
|
||||
--- ./gcc/config/s390/t-linux64.orig
|
||||
+++ ./gcc/config/s390/t-linux64
|
||||
@@ -7,5 +7,5 @@
|
||||
MULTILIB_OPTIONS = m64/m31
|
||||
MULTILIB_DIRNAMES = 64 32
|
||||
-MULTILIB_OSDIRNAMES = ../lib64$(call if_multiarch,:s390x-linux-gnu)
|
||||
-MULTILIB_OSDIRNAMES += $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:s390-linux-gnu)
|
||||
+MULTILIB_OSDIRNAMES = m64=../lib
|
||||
+MULTILIB_OSDIRNAMES+= m32=../lib32
|
||||
|
||||
--- ./gcc/config/rs6000/t-linux.orig
|
||||
+++ ./gcc/config/rs6000/t-linux
|
||||
@@ -2,7 +2,8 @@
|
||||
# or soft-float.
|
||||
ifeq (,$(filter $(with_cpu),$(SOFT_FLOAT_CPUS))$(findstring soft,$(with_float)))
|
||||
ifneq (,$(findstring powerpc64,$(target)))
|
||||
-MULTILIB_OSDIRNAMES := .=../lib64$(call if_multiarch,:powerpc64-linux-gnu)
|
||||
+MULTILIB_OSDIRNAMES := m64=../lib
|
||||
+MULTILIB_OSDIRNAMES += m32=../lib32
|
||||
else
|
||||
ifneq (,$(findstring spe,$(target)))
|
||||
MULTIARCH_DIRNAME := powerpc-linux-gnuspe$(if $(findstring 8548,$(with_cpu)),,v1)
|
||||
@@ -14,7 +15,8 @@
|
||||
MULTIARCH_DIRNAME := $(subst -linux,le-linux,$(MULTIARCH_DIRNAME))
|
||||
endif
|
||||
ifneq (,$(findstring powerpc64le,$(target)))
|
||||
-MULTILIB_OSDIRNAMES := $(subst -linux,le-linux,$(MULTILIB_OSDIRNAMES))
|
||||
+MULTILIB_OSDIRNAMES := m64=../lib
|
||||
+MULTILIB_OSDIRNAMES += m32=../lib32
|
||||
endif
|
||||
endif
|
||||
|
||||
--- ./gcc/config/rs6000/t-linux64.orig
|
||||
+++ ./gcc/config/rs6000/t-linux64
|
||||
@@ -28,8 +28,8 @@
|
||||
MULTILIB_OPTIONS := m64/m32
|
||||
MULTILIB_DIRNAMES := 64 32
|
||||
MULTILIB_EXTRA_OPTS :=
|
||||
-MULTILIB_OSDIRNAMES := m64=../lib64$(call if_multiarch,:powerpc64-linux-gnu)
|
||||
-MULTILIB_OSDIRNAMES += m32=$(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:powerpc-linux-gnu)
|
||||
+MULTILIB_OSDIRNAMES := m64=../lib
|
||||
+MULTILIB_OSDIRNAMES += m32=../lib32
|
||||
|
||||
rs6000-linux.o: $(srcdir)/config/rs6000/rs6000-linux.c
|
||||
$(COMPILE) $<
|
||||
--- ./gcc/config/rs6000/t-linux64bele.orig
|
||||
+++ ./gcc/config/rs6000/t-linux64bele
|
||||
@@ -2,6 +2,6 @@
|
||||
|
||||
MULTILIB_OPTIONS += mlittle
|
||||
MULTILIB_DIRNAMES += le
|
||||
-MULTILIB_OSDIRNAMES += $(subst =,.mlittle=,$(subst lible32,lib32le,$(subst lible64,lib64le,$(subst lib,lible,$(subst -linux,le-linux,$(MULTILIB_OSDIRNAMES))))))
|
||||
-MULTILIB_OSDIRNAMES += $(subst $(if $(findstring 64,$(target)),m64,m32).,,$(filter $(if $(findstring 64,$(target)),m64,m32).mlittle%,$(MULTILIB_OSDIRNAMES)))
|
||||
+MULTILIB_OSDIRNAMES = m64=../lib
|
||||
+MULTILIB_OSDIRNAMES+= m32=../lib32
|
||||
MULTILIB_MATCHES := ${MULTILIB_MATCHES_ENDIAN}
|
||||
--- ./gcc/config/rs6000/t-linux64lebe.orig
|
||||
+++ ./gcc/config/rs6000/t-linux64lebe
|
||||
@@ -2,6 +2,6 @@
|
||||
|
||||
MULTILIB_OPTIONS += mbig
|
||||
MULTILIB_DIRNAMES += be
|
||||
-MULTILIB_OSDIRNAMES += $(subst =,.mbig=,$(subst libbe32,lib32be,$(subst libbe64,lib64be,$(subst lib,libbe,$(subst le-linux,-linux,$(MULTILIB_OSDIRNAMES))))))
|
||||
-MULTILIB_OSDIRNAMES += $(subst $(if $(findstring 64,$(target)),m64,m32).,,$(filter $(if $(findstring 64,$(target)),m64,m32).mbig%,$(MULTILIB_OSDIRNAMES)))
|
||||
+MULTILIB_OSDIRNAMES := m64=../lib
|
||||
+MULTILIB_OSDIRNAMES += m32=../lib32
|
||||
MULTILIB_MATCHES := ${MULTILIB_MATCHES_ENDIAN}
|
39
temp/gcc6/libgcc-always-build-gcceh.a.patch
Normal file
39
temp/gcc6/libgcc-always-build-gcceh.a.patch
Normal file
|
@ -0,0 +1,39 @@
|
|||
Highly inspired by:
|
||||
http://landley.net/hg/aboriginal/file/7e0747a665ab/sources/patches/gcc-core-libgcceh.patch
|
||||
|
||||
diff -durN gcc-4.6.0.orig/libgcc/Makefile.in gcc-4.6.0/libgcc/Makefile.in
|
||||
--- gcc-4.6.0.orig/libgcc/Makefile.in 2011-01-26 05:19:58.000000000 +0100
|
||||
+++ gcc-4.6.0/libgcc/Makefile.in 2011-09-12 18:17:12.743718974 +0200
|
||||
@@ -772,8 +772,9 @@
|
||||
libgcc_s$(SHLIB_EXT): libunwind$(SHLIB_EXT)
|
||||
endif
|
||||
|
||||
+all: libgcc_eh.a
|
||||
ifeq ($(enable_shared),yes)
|
||||
-all: libgcc_eh.a libgcc_s$(SHLIB_EXT)
|
||||
+all: libgcc_s$(SHLIB_EXT)
|
||||
ifneq ($(LIBUNWIND),)
|
||||
all: libunwind$(SHLIB_EXT)
|
||||
endif
|
||||
@@ -950,10 +951,6 @@
|
||||
install-shared:
|
||||
$(mkinstalldirs) $(DESTDIR)$(inst_libdir)
|
||||
|
||||
- $(INSTALL_DATA) libgcc_eh.a $(DESTDIR)$(inst_libdir)/
|
||||
- chmod 644 $(DESTDIR)$(inst_libdir)/libgcc_eh.a
|
||||
- $(RANLIB) $(DESTDIR)$(inst_libdir)/libgcc_eh.a
|
||||
-
|
||||
$(subst @multilib_dir@,$(MULTIDIR),$(subst \
|
||||
@shlib_base_name@,libgcc_s,$(subst \
|
||||
@shlib_slibdir_qual@,$(MULTIOSSUBDIR),$(SHLIB_INSTALL))))
|
||||
@@ -968,6 +965,10 @@
|
||||
chmod 644 $(DESTDIR)$(inst_libdir)/libgcov.a
|
||||
$(RANLIB) $(DESTDIR)$(inst_libdir)/libgcov.a
|
||||
|
||||
+ $(INSTALL_DATA) libgcc_eh.a $(DESTDIR)$(inst_libdir)/
|
||||
+ chmod 644 $(DESTDIR)$(inst_libdir)/libgcc_eh.a
|
||||
+ $(RANLIB) $(DESTDIR)$(inst_libdir)/libgcc_eh.a
|
||||
+
|
||||
parts="$(INSTALL_PARTS)"; \
|
||||
for file in $$parts; do \
|
||||
rm -f $(DESTDIR)$(inst_libdir)/$$file; \
|
Loading…
Reference in a new issue