From: "Aric Belsito" <lluixhi@gmail.com>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/musl:master commit in: sys-devel/gcc/files/, sys-devel/gcc/
Date: Thu, 18 Jan 2018 02:41:33 +0000 (UTC) [thread overview]
Message-ID: <1516243220.d3a28f37f79a474ffd89f1e4b9b5daf980c6d4a2.lluixhi@gentoo> (raw)
commit: d3a28f37f79a474ffd89f1e4b9b5daf980c6d4a2
Author: Aric Belsito <lluixhi <AT> gmail <DOT> com>
AuthorDate: Thu Jan 18 02:40:20 2018 +0000
Commit: Aric Belsito <lluixhi <AT> gmail <DOT> com>
CommitDate: Thu Jan 18 02:40:20 2018 +0000
URL: https://gitweb.gentoo.org/proj/musl.git/commit/?id=d3a28f37
sys-devel/gcc: update spectre patches
Use the officially merged ones from the gcc-7-branch, remove testsuite
stuff so we can hopefully shrink the filesize down to appease repoman..
...ove-struct-ix86_frame-to-machine-function.patch | 62 +
.../gcc/files/spectre-0001-mindirect-branch.patch | 1181 ++------------------
.../gcc/files/spectre-0002-mfunction-return.patch | 917 ++-------------
.../spectre-0003-mindirect-branch-register.patch | 843 +++-----------
.../gcc/files/spectre-0005-mcmodel-large.patch | 219 +---
sys-devel/gcc/gcc-7.2.0-r2.ebuild | 1 +
6 files changed, 386 insertions(+), 2837 deletions(-)
diff --git a/sys-devel/gcc/files/0004-gcc-7.2.0-move-struct-ix86_frame-to-machine-function.patch b/sys-devel/gcc/files/0004-gcc-7.2.0-move-struct-ix86_frame-to-machine-function.patch
new file mode 100644
index 0000000..dc12402
--- /dev/null
+++ b/sys-devel/gcc/files/0004-gcc-7.2.0-move-struct-ix86_frame-to-machine-function.patch
@@ -0,0 +1,62 @@
+From c25b81ba01fa9ac0c1baa3aabd64190c47928f03 Mon Sep 17 00:00:00 2001
+From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date: Tue, 16 Jan 2018 12:49:29 +0000
+Subject: [PATCH 1/1] i386: Don't use reference of struct ix86_frame
+
+Use reference of struct ix86_frame in ix86_expand_prologue and
+ix86_expand_epilogue caused:
+
+raised STORAGE_ERROR : stack overflow or erroneous memory access
+make[5]: *** [/export/gnu/import/git/sources/gcc/gcc/ada/Make-generated.in:45: ada/sinfo.h] Error 1
+
+on trunk when bootstrapping GCC with ada on x86-64.
+
+ * config/i386/i386.c (ix86_expand_prologue): Don't use reference
+ of struct ix86_frame.
+ (ix86_expand_epilogue): Likewise.
+
+
+git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256742 138bc75d-0d04-0410-961f-82ee72b054a4
+---
+ gcc/config/i386/i386.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
+index e758387..ba2abc5 100644
+--- a/gcc/config/i386/i386.c
++++ b/gcc/config/i386/i386.c
+@@ -14061,6 +14061,7 @@ 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;
+@@ -14084,7 +14085,7 @@ ix86_expand_prologue (void)
+ m->fs.sp_valid = true;
+
+ ix86_compute_frame_layout ();
+- struct ix86_frame &frame = cfun->machine->frame;
++ frame = m->frame;
+
+ if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl))
+ {
+@@ -14747,12 +14748,13 @@ 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 ();
+- struct ix86_frame &frame = cfun->machine->frame;
++ frame = m->frame;
+
+ m->fs.sp_valid = (!frame_pointer_needed
+ || (crtl->sp_is_unchanging
+--
+2.9.3
+
diff --git a/sys-devel/gcc/files/spectre-0001-mindirect-branch.patch b/sys-devel/gcc/files/spectre-0001-mindirect-branch.patch
index 2e03cee..c0267fa 100644
--- a/sys-devel/gcc/files/spectre-0001-mindirect-branch.patch
+++ b/sys-devel/gcc/files/spectre-0001-mindirect-branch.patch
@@ -1,7 +1,7 @@
-From: "H dot J dot Lu" <hjl dot tools at gmail dot com>
-To: gcc-patches at gcc dot gnu dot org
-Subject: [PATCH 1/4] x86: Add -mindirect-branch=
-Date: Fri, 12 Jan 2018 05:15:46 -0800
+From c6b72be421ded17e0c156070ba6e90aa6c335ed6 Mon Sep 17 00:00:00 2001
+From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date: Tue, 16 Jan 2018 10:59:42 +0000
+Subject: [PATCH] x86: Add -mindirect-branch=
Add -mindirect-branch= option to convert indirect call and jump to call
and return thunks. The default is 'keep', which keeps indirect call and
@@ -19,6 +19,7 @@ __x86_indirect_thunk:
call L2
L1:
pause
+ lfence
jmp L1
L2:
lea 8(%rsp), %rsp|lea 4(%esp), %esp
@@ -44,6 +45,7 @@ __x86_indirect_thunk_reg:
call L2
L1:
pause
+ lfence
jmp L1
L2:
movq %reg, (%rsp)|movl %reg, (%esp)
@@ -62,6 +64,7 @@ Indirect call via register, "call reg", is converted to
gcc/
+ Backport from mainline
* config/i386/i386-opts.h (indirect_branch): New.
* config/i386/i386-protos.h (ix86_output_indirect_jmp): Likewise.
* config/i386/i386.c (ix86_using_red_zone): Disallow red-zone
@@ -77,6 +80,8 @@ gcc/
(indirect_thunk_name): Likewise.
(output_indirect_thunk): Likewise.
(output_indirect_thunk_function): Likewise.
+ (ix86_output_indirect_branch_via_reg): Likewise.
+ (ix86_output_indirect_branch_via_push): Likewise.
(ix86_output_indirect_branch): Likewise.
(ix86_output_indirect_jmp): Likewise.
(ix86_code_end): Call output_indirect_thunk_function if needed.
@@ -101,122 +106,23 @@ gcc/
* doc/extend.texi: Document indirect_branch function attribute.
* doc/invoke.texi: Document -mindirect-branch= option.
-gcc/testsuite/
-
- * gcc.target/i386/indirect-thunk-1.c: New test.
- * 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-attr-8.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.
+git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256732 138bc75d-0d04-0410-961f-82ee72b054a4
---
- gcc/config/i386/i386-opts.h | 8 +
+ gcc/config/i386/i386-opts.h | 13 +
gcc/config/i386/i386-protos.h | 1 +
- gcc/config/i386/i386.c | 512 ++++++++++++++++++++-
+ gcc/config/i386/i386.c | 648 ++++++++++++++++++++-
gcc/config/i386/i386.h | 7 +
- gcc/config/i386/i386.md | 8 +-
+ gcc/config/i386/i386.md | 26 +-
gcc/config/i386/i386.opt | 20 +
gcc/doc/extend.texi | 10 +
gcc/doc/invoke.texi | 14 +-
- gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | 19 +
- gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | 19 +
- gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | 20 +
- gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | 20 +
- gcc/testsuite/gcc.target/i386/indirect-thunk-5.c | 16 +
- gcc/testsuite/gcc.target/i386/indirect-thunk-6.c | 17 +
- gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | 43 ++
- .../gcc.target/i386/indirect-thunk-attr-1.c | 22 +
- .../gcc.target/i386/indirect-thunk-attr-2.c | 20 +
- .../gcc.target/i386/indirect-thunk-attr-3.c | 21 +
- .../gcc.target/i386/indirect-thunk-attr-4.c | 20 +
- .../gcc.target/i386/indirect-thunk-attr-5.c | 22 +
- .../gcc.target/i386/indirect-thunk-attr-6.c | 21 +
- .../gcc.target/i386/indirect-thunk-attr-7.c | 44 ++
- .../gcc.target/i386/indirect-thunk-attr-8.c | 41 ++
- .../gcc.target/i386/indirect-thunk-bnd-1.c | 19 +
- .../gcc.target/i386/indirect-thunk-bnd-2.c | 20 +
- .../gcc.target/i386/indirect-thunk-bnd-3.c | 18 +
- .../gcc.target/i386/indirect-thunk-bnd-4.c | 19 +
- .../gcc.target/i386/indirect-thunk-extern-1.c | 19 +
- .../gcc.target/i386/indirect-thunk-extern-2.c | 19 +
- .../gcc.target/i386/indirect-thunk-extern-3.c | 20 +
- .../gcc.target/i386/indirect-thunk-extern-4.c | 20 +
- .../gcc.target/i386/indirect-thunk-extern-5.c | 16 +
- .../gcc.target/i386/indirect-thunk-extern-6.c | 17 +
- .../gcc.target/i386/indirect-thunk-extern-7.c | 43 ++
- .../gcc.target/i386/indirect-thunk-inline-1.c | 18 +
- .../gcc.target/i386/indirect-thunk-inline-2.c | 18 +
- .../gcc.target/i386/indirect-thunk-inline-3.c | 19 +
- .../gcc.target/i386/indirect-thunk-inline-4.c | 19 +
- .../gcc.target/i386/indirect-thunk-inline-5.c | 15 +
- .../gcc.target/i386/indirect-thunk-inline-6.c | 16 +
- .../gcc.target/i386/indirect-thunk-inline-7.c | 42 ++
- 41 files changed, 1306 insertions(+), 16 deletions(-)
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
- create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
+ 43 files changed, 1575 insertions(+), 19 deletions(-)
-diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386-opts.h gcc-7.2.0/gcc/config/i386/i386-opts.h
---- gcc-7.2.0.orig/gcc/config/i386/i386-opts.h 2018-01-15 17:52:48.888745684 -0800
-+++ gcc-7.2.0/gcc/config/i386/i386-opts.h 2018-01-15 17:54:02.363744368 -0800
-@@ -99,4 +99,17 @@
+diff --git a/gcc/config/i386/i386-opts.h b/gcc/config/i386/i386-opts.h
+index 542cd0f..efcdc3b 100644
+--- a/gcc/config/i386/i386-opts.h
++++ b/gcc/config/i386/i386-opts.h
+@@ -99,4 +99,17 @@ enum stack_protector_guard {
SSP_GLOBAL /* global canary */
};
@@ -234,10 +140,11 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386-opts.h gcc-7.2.0/gcc/config/i386/
+};
+
#endif
-diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386-protos.h gcc-7.2.0/gcc/config/i386/i386-protos.h
---- gcc-7.2.0.orig/gcc/config/i386/i386-protos.h 2018-01-15 17:52:48.894745684 -0800
-+++ gcc-7.2.0/gcc/config/i386/i386-protos.h 2018-01-15 17:54:28.538743900 -0800
-@@ -315,6 +315,7 @@
+diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
+index d2cccf1..bcdd987 100644
+--- a/gcc/config/i386/i386-protos.h
++++ b/gcc/config/i386/i386-protos.h
+@@ -313,6 +313,7 @@ extern enum attr_cpu ix86_schedule;
#endif
extern const char * ix86_output_call_insn (rtx_insn *insn, rtx call_op);
@@ -245,10 +152,11 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386-protos.h gcc-7.2.0/gcc/config/i38
extern bool ix86_operands_ok_for_move_multiple (rtx *operands, bool load,
enum machine_mode mode);
-diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.c
---- gcc-7.2.0.orig/gcc/config/i386/i386.c 2018-01-15 17:52:48.896745684 -0800
-+++ gcc-7.2.0/gcc/config/i386/i386.c 2018-01-15 18:13:56.240722988 -0800
-@@ -4209,12 +4209,23 @@
+diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
+index 1786640..7e779c1 100644
+--- a/gcc/config/i386/i386.c
++++ b/gcc/config/i386/i386.c
+@@ -4212,12 +4212,23 @@ make_pass_stv (gcc::context *ctxt)
return new pass_stv (ctxt);
}
@@ -274,7 +182,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
}
\f
/* Return a string that documents the current -m options. The caller is
-@@ -7137,6 +7144,37 @@
+@@ -7148,6 +7159,37 @@ ix86_set_func_type (tree fndecl)
}
}
@@ -312,7 +220,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
/* Establish appropriate back-end context for processing the function
FNDECL. The argument might be NULL to indicate processing at top
level, outside of any function scope. */
-@@ -7152,7 +7190,10 @@
+@@ -7163,7 +7205,10 @@ ix86_set_current_function (tree fndecl)
one is extern inline and one isn't. Call ix86_set_func_type
to set the func_type field. */
if (fndecl != NULL_TREE)
@@ -324,7 +232,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
return;
}
-@@ -7172,6 +7213,7 @@
+@@ -7183,6 +7228,7 @@ ix86_set_current_function (tree fndecl)
}
ix86_set_func_type (fndecl);
@@ -332,7 +240,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
tree new_tree = DECL_FUNCTION_SPECIFIC_TARGET (fndecl);
if (new_tree == NULL_TREE)
-@@ -11909,6 +11951,220 @@
+@@ -11930,6 +11976,220 @@ ix86_setup_frame_addresses (void)
# endif
#endif
@@ -442,8 +350,8 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
+
+ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel1);
+
-+ /* Pause . */
-+ fprintf (asm_out_file, "\tpause\n");
++ /* Pause + lfence. */
++ fprintf (asm_out_file, "\tpause\n\tlfence\n");
+
+ /* Jump. */
+ fputs ("\tjmp\t", asm_out_file);
@@ -553,7 +461,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
static int pic_labels_used;
/* Fills in the label name that should be used for a pc thunk for
-@@ -11935,11 +12162,32 @@
+@@ -11956,11 +12216,32 @@ ix86_code_end (void)
rtx xops[2];
int regno;
@@ -564,7 +472,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
+
+ for (regno = FIRST_REX_INT_REG; regno <= LAST_REX_INT_REG; regno++)
+ {
-+ int i = regno - FIRST_REX_INT_REG + SP_REG + 1;
++ int i = regno - FIRST_REX_INT_REG + LAST_INT_REG + 1;
+ if ((indirect_thunks_used & (1 << i)))
+ output_indirect_thunk_function (false, regno);
+
@@ -586,7 +494,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
if (!(pic_labels_used & (1 << regno)))
continue;
-@@ -28452,12 +28700,292 @@
+@@ -28461,12 +28742,292 @@ ix86_nopic_noplt_attribute_p (rtx call_op)
return false;
}
@@ -617,7 +525,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
+ {
+ int i = regno;
+ if (i >= FIRST_REX_INT_REG)
-+ i -= (FIRST_REX_INT_REG - SP_REG - 1);
++ i -= (FIRST_REX_INT_REG - LAST_INT_REG - 1);
+ if (need_bnd_p)
+ indirect_thunks_bnd_used |= 1 << i;
+ else
@@ -879,7 +787,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
bool seh_nop_p = false;
const char *xasm;
-@@ -28467,10 +28892,21 @@
+@@ -28476,10 +29037,21 @@ ix86_output_call_insn (rtx_insn *insn, rtx call_op)
{
if (ix86_nopic_noplt_attribute_p (call_op))
{
@@ -903,7 +811,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
}
else
xasm = "%!jmp\t%P0";
-@@ -28480,9 +28916,17 @@
+@@ -28489,9 +29061,17 @@ ix86_output_call_insn (rtx_insn *insn, rtx call_op)
else if (TARGET_SEH)
xasm = "%!rex.W jmp\t%A0";
else
@@ -923,7 +831,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
return "";
}
-@@ -28520,18 +28964,37 @@
+@@ -28529,18 +29109,37 @@ ix86_output_call_insn (rtx_insn *insn, rtx call_op)
{
if (ix86_nopic_noplt_attribute_p (call_op))
{
@@ -965,7 +873,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
if (seh_nop_p)
return "nop";
-@@ -41435,7 +41898,7 @@
+@@ -41459,7 +42058,7 @@ ix86_handle_struct_attribute (tree *node, tree name, tree, int,
}
static tree
@@ -974,7 +882,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
bool *no_add_attrs)
{
if (TREE_CODE (*node) != FUNCTION_DECL)
-@@ -41444,6 +41907,29 @@
+@@ -41468,6 +42067,29 @@ ix86_handle_fndecl_attribute (tree *node, tree name, tree, int,
name);
*no_add_attrs = true;
}
@@ -1004,19 +912,20 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
return NULL_TREE;
}
-@@ -45738,6 +46224,8 @@
+@@ -45776,6 +46398,8 @@ static const struct attribute_spec ix86_attribute_table[] =
ix86_handle_interrupt_attribute, false },
{ "no_caller_saved_registers", 0, 0, false, true, true,
ix86_handle_no_caller_saved_registers_attribute, false },
+ { "indirect_branch", 1, 1, true, false, false,
-+ ix86_handle_fndecl_attribute, NULL },
++ ix86_handle_fndecl_attribute, false },
/* End element. */
{ NULL, 0, 0, false, false, false, NULL, false }
-diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.h gcc-7.2.0/gcc/config/i386/i386.h
---- gcc-7.2.0.orig/gcc/config/i386/i386.h 2018-01-15 17:52:48.895745684 -0800
-+++ gcc-7.2.0/gcc/config/i386/i386.h 2018-01-15 18:14:15.055722651 -0800
-@@ -2604,6 +2604,13 @@
+diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
+index 11727e5..d8370ae 100644
+--- a/gcc/config/i386/i386.h
++++ b/gcc/config/i386/i386.h
+@@ -2609,6 +2609,13 @@ struct GTY(()) machine_function {
/* Function type. */
ENUM_BITFIELD(function_type) func_type : 2;
@@ -1030,10 +939,11 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.h gcc-7.2.0/gcc/config/i386/i386.
/* If true, the current function is a function specified with
the "interrupt" or "no_caller_saved_registers" attribute. */
BOOL_BITFIELD no_caller_saved_registers : 1;
-diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.md gcc-7.2.0/gcc/config/i386/i386.md
---- gcc-7.2.0.orig/gcc/config/i386/i386.md 2018-01-15 17:52:48.888745684 -0800
-+++ gcc-7.2.0/gcc/config/i386/i386.md 2018-01-15 18:16:32.476720190 -0800
-@@ -11610,12 +11610,17 @@
+diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
+index dbe88f4..cd2e73c 100644
+--- a/gcc/config/i386/i386.md
++++ b/gcc/config/i386/i386.md
+@@ -11627,13 +11627,18 @@
{
if (TARGET_X32)
operands[0] = convert_memory_address (word_mode, operands[0]);
@@ -1053,7 +963,8 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.md gcc-7.2.0/gcc/config/i386/i386
+ (const_string "ibr")))
(set_attr "length_immediate" "0")
(set_attr "maybe_prefix_bnd" "1")])
-@@ -11659,13 +11660,18 @@
+
+@@ -11676,14 +11681,19 @@
if (TARGET_X32)
operands[0] = convert_memory_address (word_mode, operands[0]);
@@ -1074,7 +985,8 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.md gcc-7.2.0/gcc/config/i386/i386
+ (const_string "ibr")))
(set_attr "length_immediate" "0")
(set_attr "maybe_prefix_bnd" "1")])
-@@ -12337,7 +12339,11 @@
+ \f
+@@ -12354,8 +12364,12 @@
[(simple_return)
(use (match_operand:SI 0 "register_operand" "r"))]
"reload_completed"
@@ -1088,10 +1000,12 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.md gcc-7.2.0/gcc/config/i386/i386
+ (const_string "ibr")))
(set_attr "length_immediate" "0")
(set_attr "maybe_prefix_bnd" "1")])
-diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.opt gcc-7.2.0/gcc/config/i386/i386.opt
---- gcc-7.2.0.orig/gcc/config/i386/i386.opt 2018-01-15 17:52:48.890745684 -0800
-+++ gcc-7.2.0/gcc/config/i386/i386.opt 2018-01-15 18:17:13.972719447 -0800
-@@ -927,3 +927,23 @@
+
+diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
+index 9384e29..c076d9c 100644
+--- a/gcc/config/i386/i386.opt
++++ b/gcc/config/i386/i386.opt
+@@ -927,3 +927,23 @@ Attempt to avoid generating instruction sequences containing ret bytes.
mgeneral-regs-only
Target Report RejectNegative Mask(GENERAL_REGS_ONLY) Var(ix86_target_flags) Save
Generate code which uses only the general registers.
@@ -1115,10 +1029,11 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.opt gcc-7.2.0/gcc/config/i386/i38
+
+EnumValue
+Enum(indirect_branch) String(thunk-extern) Value(indirect_branch_thunk_extern)
-diff -Naur gcc-7.2.0.orig/gcc/doc/extend.texi gcc-7.2.0/gcc/doc/extend.texi
---- gcc-7.2.0.orig/gcc/doc/extend.texi 2018-01-15 17:52:47.196745715 -0800
-+++ gcc-7.2.0/gcc/doc/extend.texi 2018-01-15 18:17:49.790718806 -0800
-@@ -5540,6 +5540,16 @@
+diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
+index ba309d0..935381d 100644
+--- a/gcc/doc/extend.texi
++++ b/gcc/doc/extend.texi
+@@ -5540,6 +5540,16 @@ Specify which floating-point unit to use. You must specify the
@code{target("fpmath=sse,387")} option as
@code{target("fpmath=sse+387")} because the comma would separate
different options.
@@ -1135,10 +1050,11 @@ diff -Naur gcc-7.2.0.orig/gcc/doc/extend.texi gcc-7.2.0/gcc/doc/extend.texi
@end table
On the x86, the inliner does not inline a
-diff -Naur gcc-7.2.0.orig/gcc/doc/invoke.texi gcc-7.2.0/gcc/doc/invoke.texi
---- gcc-7.2.0.orig/gcc/doc/invoke.texi 2018-01-15 17:52:47.197745715 -0800
-+++ gcc-7.2.0/gcc/doc/invoke.texi 2018-01-15 18:20:56.174715468 -0800
-@@ -1210,7 +1210,8 @@
+diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
+index 7311c10..4979c8c 100644
+--- a/gcc/doc/invoke.texi
++++ b/gcc/doc/invoke.texi
+@@ -1210,7 +1210,8 @@ See RS/6000 and PowerPC Options.
-msse2avx -mfentry -mrecord-mcount -mnop-mcount -m8bit-idiv @gol
-mavx256-split-unaligned-load -mavx256-split-unaligned-store @gol
-malign-data=@var{type} -mstack-protector-guard=@var{guard} @gol
@@ -1148,7 +1064,7 @@ diff -Naur gcc-7.2.0.orig/gcc/doc/invoke.texi gcc-7.2.0/gcc/doc/invoke.texi
@emph{x86 Windows Options}
@gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol
-@@ -25648,6 +25649,17 @@
+@@ -25686,6 +25687,17 @@ Generate code that uses only the general-purpose registers. This
prevents the compiler from using floating-point, vector, mask and bound
registers.
@@ -1166,946 +1082,3 @@ diff -Naur gcc-7.2.0.orig/gcc/doc/invoke.texi gcc-7.2.0/gcc/doc/invoke.texi
@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
-new file mode 100644
-index 00000000000..d1d2ee78797
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
-@@ -0,0 +1,19 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch;
-+
-+void
-+male_indirect_jump (long offset)
-+{
-+ dispatch(offset);
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler {\tpause} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
-new file mode 100644
-index 00000000000..08646c6b823
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
-@@ -0,0 +1,19 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch[256];
-+
-+void
-+male_indirect_jump (long offset)
-+{
-+ dispatch[offset](offset);
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler {\tpause} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
-new file mode 100644
-index 00000000000..af244de2238
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
-@@ -0,0 +1,20 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch;
-+
-+int
-+male_indirect_jump (long offset)
-+{
-+ dispatch(offset);
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler {\tpause} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
-new file mode 100644
-index 00000000000..b8aedd5a4e6
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
-@@ -0,0 +1,20 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch[256];
-+
-+int
-+male_indirect_jump (long offset)
-+{
-+ dispatch[offset](offset);
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler {\tpause} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
-new file mode 100644
-index 00000000000..6ffb9235f94
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
-@@ -0,0 +1,16 @@
-+/* { dg-do compile { target *-*-linux* } } */
-+/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk" } */
-+
-+extern void bar (void);
-+
-+void
-+foo (void)
-+{
-+ bar ();
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler {\tpause} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
-new file mode 100644
-index 00000000000..e6d9d148cd2
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
-@@ -0,0 +1,17 @@
-+/* { dg-do compile { target *-*-linux* } } */
-+/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk" } */
-+
-+extern void bar (void);
-+
-+int
-+foo (void)
-+{
-+ bar ();
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */
-+/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */
-+/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */
-+/* { dg-final { scan-assembler {\tpause} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
-new file mode 100644
-index 00000000000..d892d8f5992
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
-@@ -0,0 +1,43 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */
-+
-+void func0 (void);
-+void func1 (void);
-+void func2 (void);
-+void func3 (void);
-+void func4 (void);
-+void func4 (void);
-+void func5 (void);
-+
-+void
-+bar (int i)
-+{
-+ switch (i)
-+ {
-+ default:
-+ func0 ();
-+ break;
-+ case 1:
-+ func1 ();
-+ break;
-+ case 2:
-+ func2 ();
-+ break;
-+ case 3:
-+ func3 ();
-+ break;
-+ case 4:
-+ func4 ();
-+ break;
-+ case 5:
-+ func5 ();
-+ break;
-+ }
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler {\tpause} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
-new file mode 100644
-index 00000000000..24188d0b62d
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
-@@ -0,0 +1,22 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch;
-+
-+extern void male_indirect_jump (long)
-+ __attribute__ ((indirect_branch("thunk")));
-+
-+void
-+male_indirect_jump (long offset)
-+{
-+ dispatch(offset);
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler {\tpause} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
-new file mode 100644
-index 00000000000..03184b90cda
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
-@@ -0,0 +1,20 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch[256];
-+
-+__attribute__ ((indirect_branch("thunk")))
-+void
-+male_indirect_jump (long offset)
-+{
-+ dispatch[offset](offset);
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler {\tpause} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
-new file mode 100644
-index 00000000000..af167840b81
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
-@@ -0,0 +1,21 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch;
-+extern int male_indirect_jump (long)
-+ __attribute__ ((indirect_branch("thunk-inline")));
-+
-+int
-+male_indirect_jump (long offset)
-+{
-+ dispatch(offset);
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */
-+/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */
-+/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */
-+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
-new file mode 100644
-index 00000000000..146124894a0
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
-@@ -0,0 +1,20 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch[256];
-+
-+__attribute__ ((indirect_branch("thunk-inline")))
-+int
-+male_indirect_jump (long offset)
-+{
-+ dispatch[offset](offset);
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */
-+/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */
-+/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */
-+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
-new file mode 100644
-index 00000000000..568327cd8e7
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
-@@ -0,0 +1,22 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch;
-+extern int male_indirect_jump (long)
-+ __attribute__ ((indirect_branch("thunk-extern")));
-+
-+int
-+male_indirect_jump (long offset)
-+{
-+ dispatch(offset);
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */
-+/* { dg-final { scan-assembler-not {\t(pause|pause)} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
-new file mode 100644
-index 00000000000..bd8a99e7828
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
-@@ -0,0 +1,21 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch[256];
-+
-+__attribute__ ((indirect_branch("thunk-extern")))
-+int
-+male_indirect_jump (long offset)
-+{
-+ dispatch[offset](offset);
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */
-+/* { dg-final { scan-assembler-not {\t(pause|pause)} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
-new file mode 100644
-index 00000000000..356015c9799
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
-@@ -0,0 +1,44 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -fno-pic" } */
-+
-+void func0 (void);
-+void func1 (void);
-+void func2 (void);
-+void func3 (void);
-+void func4 (void);
-+void func4 (void);
-+void func5 (void);
-+
-+__attribute__ ((indirect_branch("thunk-extern")))
-+void
-+bar (int i)
-+{
-+ switch (i)
-+ {
-+ default:
-+ func0 ();
-+ break;
-+ case 1:
-+ func1 ();
-+ break;
-+ case 2:
-+ func2 ();
-+ break;
-+ case 3:
-+ func3 ();
-+ break;
-+ case 4:
-+ func4 ();
-+ break;
-+ case 5:
-+ func5 ();
-+ break;
-+ }
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */
-+/* { dg-final { scan-assembler-not {\t(pause|pause)} } } */
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c
-new file mode 100644
-index 00000000000..6960fa0bbfb
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c
-@@ -0,0 +1,41 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */
-+
-+void func0 (void);
-+void func1 (void);
-+void func2 (void);
-+void func3 (void);
-+void func4 (void);
-+void func4 (void);
-+void func5 (void);
-+
-+__attribute__ ((indirect_branch("keep")))
-+void
-+bar (int i)
-+{
-+ switch (i)
-+ {
-+ default:
-+ func0 ();
-+ break;
-+ case 1:
-+ func1 ();
-+ break;
-+ case 2:
-+ func2 ();
-+ break;
-+ case 3:
-+ func3 ();
-+ break;
-+ case 4:
-+ func4 ();
-+ break;
-+ case 5:
-+ func5 ();
-+ break;
-+ }
-+}
-+
-+/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
-new file mode 100644
-index 00000000000..febf32d76ea
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
-@@ -0,0 +1,19 @@
-+/* { dg-do compile { target { ! x32 } } } */
-+/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
-+
-+void (*dispatch) (char *);
-+char buf[10];
-+
-+void
-+foo (void)
-+{
-+ dispatch (buf);
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "pushq\[ \t\]%rax" { target x32 } } } */
-+/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "bnd call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "bnd ret" } } */
-+/* { dg-final { scan-assembler {\tpause} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
-new file mode 100644
-index 00000000000..319ba30b78b
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
-@@ -0,0 +1,20 @@
-+/* { dg-do compile { target { ! x32 } } } */
-+/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
-+
-+void (*dispatch) (char *);
-+char buf[10];
-+
-+int
-+foo (void)
-+{
-+ dispatch (buf);
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "pushq\[ \t\]%rax" { target x32 } } } */
-+/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } */
-+/* { dg-final { scan-assembler "bnd jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "bnd call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "bnd ret" } } */
-+/* { dg-final { scan-assembler {\tpause} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
-new file mode 100644
-index 00000000000..9168b3146f5
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
-@@ -0,0 +1,18 @@
-+/* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */
-+/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
-+
-+void bar (char *);
-+char buf[10];
-+
-+void
-+foo (void)
-+{
-+ bar (buf);
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */
-+/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "bnd call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "bnd ret" } } */
-+/* { dg-final { scan-assembler {\tpause} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
-new file mode 100644
-index 00000000000..d3b36d44c7c
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
-@@ -0,0 +1,19 @@
-+/* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */
-+/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
-+
-+void bar (char *);
-+char buf[10];
-+
-+int
-+foo (void)
-+{
-+ bar (buf);
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */
-+/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk" } } */
-+/* { dg-final { scan-assembler "bnd jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-times "bnd call\[ \t\]*\.LIND" 2 } } */
-+/* { dg-final { scan-assembler "bnd ret" } } */
-+/* { dg-final { scan-assembler {\tpause} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
-new file mode 100644
-index 00000000000..9e50b282f77
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
-@@ -0,0 +1,19 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch;
-+
-+void
-+male_indirect_jump (long offset)
-+{
-+ dispatch(offset);
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */
-+/* { dg-final { scan-assembler-not {\t(pause|pause)} } } */
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
-new file mode 100644
-index 00000000000..f897d1c0497
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
-@@ -0,0 +1,19 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch[256];
-+
-+void
-+male_indirect_jump (long offset)
-+{
-+ dispatch[offset](offset);
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */
-+/* { dg-final { scan-assembler-not {\t(pause|pause)} } } */
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
-new file mode 100644
-index 00000000000..25905cd0016
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
-@@ -0,0 +1,20 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch;
-+
-+int
-+male_indirect_jump (long offset)
-+{
-+ dispatch(offset);
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */
-+/* { dg-final { scan-assembler-not {\t(pause|pause)} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
-new file mode 100644
-index 00000000000..a7fa12183af
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
-@@ -0,0 +1,20 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch[256];
-+
-+int
-+male_indirect_jump (long offset)
-+{
-+ dispatch[offset](offset);
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */
-+/* { dg-final { scan-assembler-not {\t(pause|pause)} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
-new file mode 100644
-index 00000000000..48a49760be6
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
-@@ -0,0 +1,16 @@
-+/* { dg-do compile { target *-*-linux* } } */
-+/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk-extern" } */
-+
-+extern void bar (void);
-+
-+void
-+foo (void)
-+{
-+ bar ();
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */
-+/* { dg-final { scan-assembler-not {\t(pause|pause)} } } */
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
-new file mode 100644
-index 00000000000..a1c662f7d23
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
-@@ -0,0 +1,17 @@
-+/* { dg-do compile { target *-*-linux* } } */
-+/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk-extern" } */
-+
-+extern void bar (void);
-+
-+int
-+foo (void)
-+{
-+ bar ();
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */
-+/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 } } */
-+/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */
-+/* { dg-final { scan-assembler-not {\t(pause|pause)} } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
-new file mode 100644
-index 00000000000..40a665ea640
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
-@@ -0,0 +1,43 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */
-+
-+void func0 (void);
-+void func1 (void);
-+void func2 (void);
-+void func3 (void);
-+void func4 (void);
-+void func4 (void);
-+void func5 (void);
-+
-+void
-+bar (int i)
-+{
-+ switch (i)
-+ {
-+ default:
-+ func0 ();
-+ break;
-+ case 1:
-+ func1 ();
-+ break;
-+ case 2:
-+ func2 ();
-+ break;
-+ case 3:
-+ func3 ();
-+ break;
-+ case 4:
-+ func4 ();
-+ break;
-+ case 5:
-+ func5 ();
-+ break;
-+ }
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */
-+/* { dg-final { scan-assembler-not {\t(pause|pause)} } } */
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
-new file mode 100644
-index 00000000000..3ace8d1b031
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
-@@ -0,0 +1,18 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch;
-+
-+void
-+male_indirect_jump (long offset)
-+{
-+ dispatch(offset);
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */
-+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
-new file mode 100644
-index 00000000000..6c97b96f1f2
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
-@@ -0,0 +1,18 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch[256];
-+
-+void
-+male_indirect_jump (long offset)
-+{
-+ dispatch[offset](offset);
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */
-+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
-new file mode 100644
-index 00000000000..8f6759cbf06
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
-@@ -0,0 +1,19 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch;
-+
-+int
-+male_indirect_jump (long offset)
-+{
-+ dispatch(offset);
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */
-+/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */
-+/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */
-+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
-new file mode 100644
-index 00000000000..b07d08cab0f
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
-@@ -0,0 +1,19 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */
-+
-+typedef void (*dispatch_t)(long offset);
-+
-+dispatch_t dispatch[256];
-+
-+int
-+male_indirect_jump (long offset)
-+{
-+ dispatch[offset](offset);
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */
-+/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */
-+/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */
-+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
-new file mode 100644
-index 00000000000..10794886b1b
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
-@@ -0,0 +1,15 @@
-+/* { dg-do compile { target *-*-linux* } } */
-+/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk-inline" } */
-+
-+extern void bar (void);
-+
-+void
-+foo (void)
-+{
-+ bar ();
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
-new file mode 100644
-index 00000000000..a26ec4b06ed
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
-@@ -0,0 +1,16 @@
-+/* { dg-do compile { target *-*-linux* } } */
-+/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk-inline" } */
-+
-+extern void bar (void);
-+
-+int
-+foo (void)
-+{
-+ bar ();
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */
-+/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */
-+/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */
-+/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */
-diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
-new file mode 100644
-index 00000000000..77253af17c6
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
-@@ -0,0 +1,42 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */
-+
-+void func0 (void);
-+void func1 (void);
-+void func2 (void);
-+void func3 (void);
-+void func4 (void);
-+void func4 (void);
-+void func5 (void);
-+
-+void
-+bar (int i)
-+{
-+ switch (i)
-+ {
-+ default:
-+ func0 ();
-+ break;
-+ case 1:
-+ func1 ();
-+ break;
-+ case 2:
-+ func2 ();
-+ break;
-+ case 3:
-+ func3 ();
-+ break;
-+ case 4:
-+ func4 ();
-+ break;
-+ case 5:
-+ func5 ();
-+ break;
-+ }
-+}
-+
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */
---
-2.14.3
-
diff --git a/sys-devel/gcc/files/spectre-0002-mfunction-return.patch b/sys-devel/gcc/files/spectre-0002-mfunction-return.patch
index d3fa601..391e89d 100644
--- a/sys-devel/gcc/files/spectre-0002-mfunction-return.patch
+++ b/sys-devel/gcc/files/spectre-0002-mfunction-return.patch
@@ -1,7 +1,7 @@
-From: "H dot J dot Lu" <hjl dot tools at gmail dot com>
-To: gcc-patches at gcc dot gnu dot org
-Subject: [PATCH 2/4] x86: Add -mfunction-return=
-Date: Fri, 12 Jan 2018 05:15:47 -0800
+From 357311dd400f7f72d2132f2f94161ece39bf08c6 Mon Sep 17 00:00:00 2001
+From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date: Tue, 16 Jan 2018 11:10:44 +0000
+Subject: [PATCH] x86: Add -mfunction-return=
Add -mfunction-return= option to convert function return to call and
return thunks. The default is 'keep', which keeps function return
@@ -18,6 +18,7 @@ __x86_return_thunk:
call L2
L1:
pause
+ lfence
jmp L1
L2:
lea 8(%rsp), %rsp|lea 4(%esp), %esp
@@ -27,12 +28,11 @@ and function return becomes
jmp __x86_return_thunk
--mindirect-branch= tests are updated with -mfunction-return=keep to
-avoid false test failures when -mfunction-return=thunk is added to
-RUNTESTFLAGS for "make check".
-
gcc/
+ Backport from mainline
+ 2018-01-14 H.J. Lu <hongjiu.lu@intel.com>
+
* config/i386/i386-protos.h (ix86_output_function_return): New.
* config/i386/i386.c (ix86_set_indirect_branch_type): Also
set function_return_type.
@@ -40,7 +40,8 @@ gcc/
return.
(output_indirect_thunk_function): Pass false to
indirect_thunk_name.
- (ix86_output_indirect_branch): Likewise.
+ (ix86_output_indirect_branch_via_reg): Likewise.
+ (ix86_output_indirect_branch_via_push): Likewise.
(output_indirect_thunk_function): Create alias for function
return thunk if regno < 0.
(ix86_output_function_return): New function.
@@ -56,137 +57,41 @@ gcc/
* doc/extend.texi: Document function_return function attribute.
* doc/invoke.texi: Document -mfunction-return= option.
-gcc/testsuite/
+i386: Don't use ASM_OUTPUT_DEF for TARGET_MACHO
+
+ASM_OUTPUT_DEF isn't defined for TARGET_MACHO. Use ASM_OUTPUT_LABEL to
+generate the __x86_return_thunk label, instead of the set directive.
+Update testcase to remove the __x86_return_thunk label check. Since
+-fno-pic is ignored on Darwin, update testcases to sscan or "push"
+only on Linux.
+
+gcc/
- * gcc.target/i386/indirect-thunk-1.c (dg-options): Add
- -mfunction-return=keep.
- * 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-attr-8.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-1.c: New test.
- * 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-16.c: Likewise.
- * gcc.target/i386/ret-thunk-2.c: Likewise.
- * gcc.target/i386/ret-thunk-3.c: Likewise.
- * gcc.target/i386/ret-thunk-4.c: Likewise.
- * gcc.target/i386/ret-thunk-5.c: Likewise.
- * gcc.target/i386/ret-thunk-6.c: Likewise.
- * gcc.target/i386/ret-thunk-7.c: Likewise.
- * gcc.target/i386/ret-thunk-8.c: Likewise.
- * gcc.target/i386/ret-thunk-9.c: Likewise.
+ Backport from mainline
+ 2018-01-15 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR target/83839
+ * config/i386/i386.c (output_indirect_thunk_function): Use
+ ASM_OUTPUT_LABEL, instead of ASM_OUTPUT_DEF, for TARGET_MACHO
+ for __x86.return_thunk.
+
+
+git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256734 138bc75d-0d04-0410-961f-82ee72b054a4
---
gcc/config/i386/i386-protos.h | 1 +
- gcc/config/i386/i386.c | 149 ++++++++++++++++++++-
+ gcc/config/i386/i386.c | 152 +++++++++++++++++++--
gcc/config/i386/i386.h | 3 +
gcc/config/i386/i386.md | 9 +-
gcc/config/i386/i386.opt | 6 +-
gcc/doc/extend.texi | 9 ++
gcc/doc/invoke.texi | 13 +-
- 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-attr-8.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/testsuite/gcc.target/i386/ret-thunk-1.c | 12 ++
- gcc/testsuite/gcc.target/i386/ret-thunk-10.c | 22 +++
- gcc/testsuite/gcc.target/i386/ret-thunk-11.c | 22 +++
- gcc/testsuite/gcc.target/i386/ret-thunk-12.c | 21 +++
- gcc/testsuite/gcc.target/i386/ret-thunk-13.c | 21 +++
- gcc/testsuite/gcc.target/i386/ret-thunk-14.c | 21 +++
- gcc/testsuite/gcc.target/i386/ret-thunk-15.c | 21 +++
- gcc/testsuite/gcc.target/i386/ret-thunk-16.c | 18 +++
- gcc/testsuite/gcc.target/i386/ret-thunk-2.c | 12 ++
- gcc/testsuite/gcc.target/i386/ret-thunk-3.c | 12 ++
- gcc/testsuite/gcc.target/i386/ret-thunk-4.c | 12 ++
- gcc/testsuite/gcc.target/i386/ret-thunk-5.c | 14 ++
- gcc/testsuite/gcc.target/i386/ret-thunk-6.c | 13 ++
- gcc/testsuite/gcc.target/i386/ret-thunk-7.c | 13 ++
- gcc/testsuite/gcc.target/i386/ret-thunk-8.c | 14 ++
- gcc/testsuite/gcc.target/i386/ret-thunk-9.c | 23 ++++
- 56 files changed, 478 insertions(+), 49 deletions(-)
- create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-1.c
- create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-10.c
- create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-11.c
- create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-12.c
- create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-13.c
- create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-14.c
- create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-15.c
- create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-16.c
- create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-2.c
- create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-3.c
- create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-4.c
- create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-5.c
- create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-6.c
- create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-7.c
- create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-8.c
- create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-9.c
+ 58 files changed, 641 insertions(+), 74 deletions(-)
-diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386-protos.h gcc-7.2.0/gcc/config/i386/i386-protos.h
---- gcc-7.2.0.orig/gcc/config/i386/i386-protos.h 2018-01-15 19:51:30.252618154 -0800
-+++ gcc-7.2.0/gcc/config/i386/i386-protos.h 2018-01-15 19:51:44.370617901 -0800
-@@ -316,6 +316,7 @@
+diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
+index bcdd987..42eece3 100644
+--- a/gcc/config/i386/i386-protos.h
++++ b/gcc/config/i386/i386-protos.h
+@@ -314,6 +314,7 @@ extern enum attr_cpu ix86_schedule;
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);
@@ -194,10 +99,11 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386-protos.h gcc-7.2.0/gcc/config/i38
extern bool ix86_operands_ok_for_move_multiple (rtx *operands, bool load,
enum machine_mode mode);
-diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.c
---- gcc-7.2.0.orig/gcc/config/i386/i386.c 2018-01-15 19:51:30.252618154 -0800
-+++ gcc-7.2.0/gcc/config/i386/i386.c 2018-01-15 19:54:59.663614404 -0800
-@@ -7177,6 +7177,31 @@
+diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
+index 7e779c1..8fb8902 100644
+--- a/gcc/config/i386/i386.c
++++ b/gcc/config/i386/i386.c
+@@ -7188,6 +7188,31 @@ ix86_set_indirect_branch_type (tree fndecl)
else
cfun->machine->indirect_branch_type = ix86_indirect_branch;
}
@@ -229,7 +135,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
}
/* Establish appropriate back-end context for processing the function
-@@ -11979,8 +12004,12 @@
+@@ -12000,8 +12025,12 @@ static int indirect_thunks_bnd_used;
/* Fills in the label name that should be used for the indirect thunk. */
static void
@@ -243,7 +149,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
if (USE_HIDDEN_LINKONCE)
{
const char *bnd = need_bnd_p ? "_bnd" : "";
-@@ -11995,7 +12024,10 @@
+@@ -12016,7 +12045,10 @@ indirect_thunk_name (char name[32], int regno, bool need_bnd_p)
bnd, reg_prefix, reg_names[regno]);
}
else
@@ -255,7 +161,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
}
else
{
-@@ -12008,10 +12040,20 @@
+@@ -12029,10 +12061,20 @@ indirect_thunk_name (char name[32], int regno, bool need_bnd_p)
}
else
{
@@ -279,7 +185,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
}
}
}
-@@ -12106,7 +12148,7 @@
+@@ -12127,7 +12169,7 @@ output_indirect_thunk_function (bool need_bnd_p, int regno)
tree decl;
/* Create __x86_indirect_thunk/__x86_indirect_thunk_bnd. */
@@ -288,7 +194,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
get_identifier (name),
build_function_type_list (void_type_node, NULL_TREE));
-@@ -12149,6 +12191,35 @@
+@@ -12170,6 +12212,36 @@ output_indirect_thunk_function (bool need_bnd_p, int regno)
ASM_OUTPUT_LABEL (asm_out_file, name);
}
@@ -298,7 +204,6 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
+ char alias[32];
+
+ indirect_thunk_name (alias, regno, need_bnd_p, true);
-+ ASM_OUTPUT_DEF (asm_out_file, alias, name);
+#if TARGET_MACHO
+ if (TARGET_MACHO)
+ {
@@ -307,8 +212,10 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
+ 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);
@@ -324,7 +231,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
DECL_INITIAL (decl) = make_node (BLOCK);
current_function_decl = decl;
allocate_struct_function (decl, false);
-@@ -28766,7 +28837,7 @@
+@@ -28775,7 +28847,7 @@ ix86_output_indirect_branch_via_reg (rtx call_op, bool sibcall_p)
else
indirect_thunks_used |= 1 << i;
}
@@ -333,7 +240,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
thunk_name = thunk_name_buf;
}
else
-@@ -28875,7 +28946,7 @@
+@@ -28884,7 +28956,7 @@ ix86_output_indirect_branch_via_push (rtx call_op, const char *xasm,
else
indirect_thunk_needed = true;
}
@@ -342,7 +249,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
thunk_name = thunk_name_buf;
}
else
-@@ -29010,6 +29081,46 @@
+@@ -29019,6 +29091,46 @@ ix86_output_indirect_jmp (rtx call_op, bool ret_p)
return "%!jmp\t%A0";
}
@@ -389,7 +296,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
/* Output the assembly for a call instruction. */
const char *
-@@ -42066,6 +42177,28 @@
+@@ -42090,6 +42202,28 @@ ix86_handle_fndecl_attribute (tree *node, tree name, tree args, int,
}
}
@@ -418,19 +325,20 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.c gcc-7.2.0/gcc/config/i386/i386.
return NULL_TREE;
}
-@@ -46362,6 +46495,8 @@
+@@ -46400,6 +46534,8 @@ static const struct attribute_spec ix86_attribute_table[] =
ix86_handle_no_caller_saved_registers_attribute, false },
{ "indirect_branch", 1, 1, true, false, false,
- ix86_handle_fndecl_attribute, NULL },
+ ix86_handle_fndecl_attribute, false },
+ { "function_return", 1, 1, true, false, false,
-+ ix86_handle_fndecl_attribute, NULL },
++ ix86_handle_fndecl_attribute, false },
/* End element. */
{ NULL, 0, 0, false, false, false, NULL, false }
-diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.h gcc-7.2.0/gcc/config/i386/i386.h
---- gcc-7.2.0.orig/gcc/config/i386/i386.h 2018-01-15 19:51:30.252618154 -0800
-+++ gcc-7.2.0/gcc/config/i386/i386.h 2018-01-15 19:51:44.381617901 -0800
-@@ -2611,6 +2611,9 @@
+diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
+index d8370ae..e7da790 100644
+--- a/gcc/config/i386/i386.h
++++ b/gcc/config/i386/i386.h
+@@ -2616,6 +2616,9 @@ struct GTY(()) machine_function {
"indirect_jump" or "tablejump". */
BOOL_BITFIELD has_local_indirect_jump : 1;
@@ -440,10 +348,11 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.h gcc-7.2.0/gcc/config/i386/i386.
/* If true, the current function is a function specified with
the "interrupt" or "no_caller_saved_registers" attribute. */
BOOL_BITFIELD no_caller_saved_registers : 1;
-diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.md gcc-7.2.0/gcc/config/i386/i386.md
---- gcc-7.2.0.orig/gcc/config/i386/i386.md 2018-01-15 19:51:30.252618154 -0800
-+++ gcc-7.2.0/gcc/config/i386/i386.md 2018-01-15 19:51:44.385617901 -0800
-@@ -12298,7 +12298,7 @@
+diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
+index cd2e73c..d112bdb 100644
+--- a/gcc/config/i386/i386.md
++++ b/gcc/config/i386/i386.md
+@@ -12315,7 +12315,7 @@
(define_insn "simple_return_internal"
[(simple_return)]
"reload_completed"
@@ -452,7 +361,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.md gcc-7.2.0/gcc/config/i386/i386
[(set_attr "length" "1")
(set_attr "atom_unit" "jeu")
(set_attr "length_immediate" "0")
-@@ -12320,12 +12320,7 @@
+@@ -12337,12 +12337,7 @@
[(simple_return)
(unspec [(const_int 0)] UNSPEC_REP)]
"reload_completed"
@@ -466,10 +375,11 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.md gcc-7.2.0/gcc/config/i386/i386
[(set_attr "length" "2")
(set_attr "atom_unit" "jeu")
(set_attr "length_immediate" "0")
-diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.opt gcc-7.2.0/gcc/config/i386/i386.opt
---- gcc-7.2.0.orig/gcc/config/i386/i386.opt 2018-01-15 19:51:30.252618154 -0800
-+++ gcc-7.2.0/gcc/config/i386/i386.opt 2018-01-15 19:51:44.386617901 -0800
-@@ -932,9 +932,13 @@
+diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
+index c076d9c..b07388d 100644
+--- a/gcc/config/i386/i386.opt
++++ b/gcc/config/i386/i386.opt
+@@ -932,9 +932,13 @@ mindirect-branch=
Target Report RejectNegative Joined Enum(indirect_branch) Var(ix86_indirect_branch) Init(indirect_branch_keep)
Convert indirect call and jump to call and return thunks.
@@ -484,10 +394,11 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.opt gcc-7.2.0/gcc/config/i386/i38
EnumValue
Enum(indirect_branch) String(keep) Value(indirect_branch_keep)
-diff -Naur gcc-7.2.0.orig/gcc/doc/extend.texi gcc-7.2.0/gcc/doc/extend.texi
---- gcc-7.2.0.orig/gcc/doc/extend.texi 2018-01-15 19:51:28.536618185 -0800
-+++ gcc-7.2.0/gcc/doc/extend.texi 2018-01-15 19:51:44.392617901 -0800
-@@ -5550,6 +5550,15 @@
+diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
+index 935381d..46e0a36 100644
+--- a/gcc/doc/extend.texi
++++ b/gcc/doc/extend.texi
+@@ -5550,6 +5550,15 @@ call and jump to call and return thunk. @samp{thunk-inline} converts
indirect call and jump to inlined call and return thunk.
@samp{thunk-extern} converts indirect call and jump to external call
and return thunk provided in a separate object file.
@@ -503,10 +414,11 @@ diff -Naur gcc-7.2.0.orig/gcc/doc/extend.texi gcc-7.2.0/gcc/doc/extend.texi
@end table
On the x86, the inliner does not inline a
-diff -Naur gcc-7.2.0.orig/gcc/doc/invoke.texi gcc-7.2.0/gcc/doc/invoke.texi
---- gcc-7.2.0.orig/gcc/doc/invoke.texi 2018-01-15 19:51:28.537618185 -0800
-+++ gcc-7.2.0/gcc/doc/invoke.texi 2018-01-15 19:51:44.397617901 -0800
-@@ -1211,7 +1211,7 @@
+diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
+index 4979c8c..f3eb54b 100644
+--- a/gcc/doc/invoke.texi
++++ b/gcc/doc/invoke.texi
+@@ -1211,7 +1211,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 -mgeneral-regs-only @gol
@@ -515,7 +427,7 @@ diff -Naur gcc-7.2.0.orig/gcc/doc/invoke.texi gcc-7.2.0/gcc/doc/invoke.texi
@emph{x86 Windows Options}
@gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol
-@@ -25660,6 +25660,17 @@
+@@ -25698,6 +25698,17 @@ 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}.
@@ -533,668 +445,3 @@ diff -Naur gcc-7.2.0.orig/gcc/doc/invoke.texi gcc-7.2.0/gcc/doc/invoke.texi
@end table
These @samp{-m} switches are supported in addition to the above
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c 2018-01-15 19:51:28.901618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c 2018-01-15 19:51:44.398617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c 2018-01-15 19:51:28.901618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c 2018-01-15 19:51:44.398617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c 2018-01-15 19:51:28.901618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c 2018-01-15 19:51:44.398617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c 2018-01-15 19:51:28.901618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c 2018-01-15 19:51:44.398617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c 2018-01-15 19:51:28.901618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c 2018-01-15 19:51:44.398617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile { target *-*-linux* } } */
--/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk" } */
-+/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
-
- extern void bar (void);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c 2018-01-15 19:51:28.901618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c 2018-01-15 19:51:44.398617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile { target *-*-linux* } } */
--/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk" } */
-+/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
-
- extern void bar (void);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c 2018-01-15 19:51:28.901618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c 2018-01-15 19:51:44.398617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
-
- void func0 (void);
- void func1 (void);
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c 2018-01-15 19:51:28.901618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c 2018-01-15 19:51:44.398617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c 2018-01-15 19:51:28.901618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c 2018-01-15 19:51:44.398617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c 2018-01-15 19:51:44.398617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c 2018-01-15 19:51:44.399617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c 2018-01-15 19:51:44.399617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c 2018-01-15 19:51:28.901618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c 2018-01-15 19:51:44.399617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c 2018-01-15 19:51:44.399617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */
-
- void func0 (void);
- void func1 (void);
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c 2018-01-15 19:51:44.399617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
-
- void func0 (void);
- void func1 (void);
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c 2018-01-15 19:51:44.399617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile { target { ! x32 } } } */
--/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
-
- void (*dispatch) (char *);
- char buf[10];
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c 2018-01-15 19:51:44.399617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile { target { ! x32 } } } */
--/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
-
- void (*dispatch) (char *);
- char buf[10];
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c 2018-01-15 19:51:44.399617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */
--/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
-
- void bar (char *);
- char buf[10];
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c 2018-01-15 19:51:44.399617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */
--/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
-
- void bar (char *);
- char buf[10];
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c 2018-01-15 19:51:44.399617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c 2018-01-15 19:51:44.400617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c 2018-01-15 19:51:44.400617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c 2018-01-15 19:51:44.400617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c 2018-01-15 19:51:44.400617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile { target *-*-linux* } } */
--/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk-extern" } */
-+/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
-
- extern void bar (void);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c 2018-01-15 19:51:44.400617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile { target *-*-linux* } } */
--/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk-extern" } */
-+/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
-
- extern void bar (void);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c 2018-01-15 19:51:44.400617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
-
- void func0 (void);
- void func1 (void);
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c 2018-01-15 19:51:44.400617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c 2018-01-15 19:51:44.400617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c 2018-01-15 19:51:44.400617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c 2018-01-15 19:51:44.401617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
-
- typedef void (*dispatch_t)(long offset);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c 2018-01-15 19:51:44.401617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile { target *-*-linux* } } */
--/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk-inline" } */
-+/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
-
- extern void bar (void);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c 2018-01-15 19:51:44.401617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile { target *-*-linux* } } */
--/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk-inline" } */
-+/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
-
- extern void bar (void);
-
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c 2018-01-15 19:51:28.902618178 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c 2018-01-15 19:51:44.401617901 -0800
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
-
- void func0 (void);
- void func1 (void);
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-1.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-1.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-1.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-1.c 2018-01-15 19:51:44.401617901 -0800
-@@ -0,0 +1,12 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mfunction-return=thunk" } */
-+
-+void
-+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 {\tpause} } } */
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-10.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-10.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-10.c 2018-01-15 19:51:44.401617901 -0800
-@@ -0,0 +1,22 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic" } */
-+
-+extern void (*bar) (void);
-+
-+int
-+foo (void)
-+{
-+ bar ();
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */
-+/* { dg-final { scan-assembler-times {\tpause} 2 } } */
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "__x86_indirect_thunk:" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target { x32 } } } } */
-+/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:" { target { x32 } } } } */
-+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-11.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-11.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-11.c 2018-01-15 19:51:44.401617901 -0800
-@@ -0,0 +1,22 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mfunction-return=thunk-extern -mindirect-branch=thunk -fno-pic" } */
-+
-+extern void (*bar) (void);
-+
-+int
-+foo (void)
-+{
-+ bar ();
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */
-+/* { dg-final { scan-assembler-times {\tpause} 1 } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "__x86_indirect_thunk:" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target { x32 } } } } */
-+/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:" { target { x32 } } } } */
-+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-12.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-12.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-12.c 2018-01-15 19:51:44.401617901 -0800
-@@ -0,0 +1,21 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */
-+
-+extern void (*bar) (void);
-+
-+int
-+foo (void)
-+{
-+ bar ();
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */
-+/* { dg-final { scan-assembler-times {\tpause} 1 } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "__x86_indirect_thunk:" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target { x32 } } } } */
-+/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:" { target { x32 } } } } */
-+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-13.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-13.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-13.c 2018-01-15 19:51:44.401617901 -0800
-@@ -0,0 +1,21 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */
-+
-+extern void (*bar) (void);
-+extern int foo (void) __attribute__ ((function_return("thunk")));
-+
-+int
-+foo (void)
-+{
-+ bar ();
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */
-+/* { dg-final { scan-assembler-times {\tpause} 2 } } */
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 3 } } */
-+/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 3 } } */
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_indirect_thunk" } } */
-+/* { dg-final { scan-assembler-not "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target { x32 } } } } */
-+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-14.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-14.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-14.c 2018-01-15 19:51:44.401617901 -0800
-@@ -0,0 +1,21 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */
-+
-+extern void (*bar) (void);
-+
-+__attribute__ ((function_return("thunk-inline")))
-+int
-+foo (void)
-+{
-+ bar ();
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler-times {\tpause} 1 } } */
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target { x32 } } } } */
-+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-15.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-15.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-15.c 2018-01-15 19:51:44.402617901 -0800
-@@ -0,0 +1,21 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -fno-pic" } */
-+
-+extern void (*bar) (void);
-+
-+__attribute__ ((function_return("thunk-extern"), indirect_branch("thunk")))
-+int
-+foo (void)
-+{
-+ bar ();
-+ return 0;
-+}
-+
-+/* { 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-times {\tpause} 1 } } */
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */
-+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-16.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-16.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-16.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-16.c 2018-01-15 19:51:44.402617901 -0800
-@@ -0,0 +1,18 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mfunction-return=thunk-inline -mindirect-branch=thunk-extern -fno-pic" } */
-+
-+extern void (*bar) (void);
-+
-+__attribute__ ((function_return("keep"), indirect_branch("keep")))
-+int
-+foo (void)
-+{
-+ bar ();
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */
-+/* { dg-final { scan-assembler-not "__x86_return_thunk" } } */
-+/* { dg-final { scan-assembler-not {\tpause} } } */
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-2.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-2.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-2.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-2.c 2018-01-15 19:51:44.402617901 -0800
-@@ -0,0 +1,12 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mfunction-return=thunk-inline" } */
-+
-+void
-+foo (void)
-+{
-+}
-+
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler {\tpause} } } */
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-3.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-3.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-3.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-3.c 2018-01-15 19:51:44.402617901 -0800
-@@ -0,0 +1,12 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mfunction-return=thunk-extern" } */
-+
-+void
-+foo (void)
-+{
-+}
-+
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */
-+/* { dg-final { scan-assembler-not {\tpause} } } */
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-4.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-4.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-4.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-4.c 2018-01-15 19:51:44.402617901 -0800
-@@ -0,0 +1,12 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mfunction-return=keep" } */
-+
-+void
-+foo (void)
-+{
-+}
-+
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */
-+/* { dg-final { scan-assembler-not {\tpause} } } */
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-5.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-5.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-5.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-5.c 2018-01-15 19:51:44.402617901 -0800
-@@ -0,0 +1,14 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mfunction-return=keep" } */
-+
-+extern void foo (void) __attribute__ ((function_return("thunk")));
-+
-+void
-+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 {\tpause} } } */
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-6.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-6.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-6.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-6.c 2018-01-15 19:51:44.403617901 -0800
-@@ -0,0 +1,13 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mfunction-return=keep" } */
-+
-+__attribute__ ((function_return("thunk-inline")))
-+void
-+foo (void)
-+{
-+}
-+
-+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler {\tpause} } } */
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-7.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-7.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-7.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-7.c 2018-01-15 19:51:44.403617901 -0800
-@@ -0,0 +1,13 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mfunction-return=keep" } */
-+
-+__attribute__ ((function_return("thunk-extern")))
-+void
-+foo (void)
-+{
-+}
-+
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */
-+/* { dg-final { scan-assembler-not {\tpause} } } */
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-8.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-8.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-8.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-8.c 2018-01-15 19:51:44.403617901 -0800
-@@ -0,0 +1,14 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mfunction-return=thunk-inline" } */
-+
-+extern void foo (void) __attribute__ ((function_return("keep")));
-+
-+void
-+foo (void)
-+{
-+}
-+
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */
-+/* { dg-final { scan-assembler-not {\tpause} } } */
-+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
-+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
-diff -Naur gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-9.c gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
---- gcc-7.2.0.orig/gcc/testsuite/gcc.target/i386/ret-thunk-9.c 1969-12-31 16:00:00.000000000 -0800
-+++ gcc-7.2.0/gcc/testsuite/gcc.target/i386/ret-thunk-9.c 2018-01-15 19:51:44.403617901 -0800
-@@ -0,0 +1,23 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -mfunction-return=thunk -mindirect-branch=thunk -fno-pic" } */
-+
-+extern void (*bar) (void);
-+
-+int
-+foo (void)
-+{
-+ bar ();
-+ return 0;
-+}
-+
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */
-+/* { dg-final { scan-assembler-not "__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-times {\tpause} 1 { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */
-+/* { dg-final { scan-assembler-times {\tpause} 2 { target { x32 } } } } */
-+/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target { x32 } } } } */
-+/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */
diff --git a/sys-devel/gcc/files/spectre-0003-mindirect-branch-register.patch b/sys-devel/gcc/files/spectre-0003-mindirect-branch-register.patch
index 50aff5a..2e5e779 100644
--- a/sys-devel/gcc/files/spectre-0003-mindirect-branch-register.patch
+++ b/sys-devel/gcc/files/spectre-0003-mindirect-branch-register.patch
@@ -1,7 +1,7 @@
-From: "H dot J dot Lu" <hjl dot tools at gmail dot com>
-To: gcc-patches at gcc dot gnu dot org
-Subject: [PATCH 3/4] x86: Add -mindirect-branch-register
-Date: Fri, 12 Jan 2018 05:15:48 -0800
+From 86118fbdbafe6af54b2da467e1073c49e1742116 Mon Sep 17 00:00:00 2001
+From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date: Tue, 16 Jan 2018 11:17:49 +0000
+Subject: [PATCH] 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,
@@ -13,6 +13,9 @@ similar to TARGET_X32.
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.
@@ -34,185 +37,157 @@ gcc/
* config/i386/i386.opt (mindirect-branch-register): New option.
* doc/invoke.texi: Document -mindirect-branch-register option.
-gcc/testsuite/
+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.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.
+git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256735 138bc75d-0d04-0410-961f-82ee72b054a4
---
- gcc/config/i386/constraints.md | 12 +++++---
- gcc/config/i386/i386.md | 34 ++++++++++++++--------
- gcc/config/i386/i386.opt | 4 +++
- gcc/config/i386/predicates.md | 21 ++++++++-----
- gcc/doc/invoke.texi | 7 ++++-
- 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, 154 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
+ 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 | 7 ++-
+ 49 files changed, 266 insertions(+), 63 deletions(-)
-diff -Naur gcc-7.2.0.orig/gcc/config/i386/constraints.md gcc-7.2.0/gcc/config/i386/constraints.md
---- gcc-7.2.0.orig/gcc/config/i386/constraints.md 2018-01-15 18:36:46.557698449 -0800
-+++ gcc-7.2.0/gcc/config/i386/constraints.md 2018-01-15 18:39:17.685695742 -0800
-@@ -198,16 +198,20 @@
+diff --git a/gcc/config/i386/constraints.md b/gcc/config/i386/constraints.md
+index 38d604f..a0a632a 100644
+--- a/gcc/config/i386/constraints.md
++++ b/gcc/config/i386/constraints.md
+@@ -198,14 +198,16 @@
(define_constraint "Bs"
"@internal Sibcall memory operand."
- (ior (and (not (match_test "TARGET_X32"))
-+ (ior (and (not (match_test "TARGET_X32
-+ || ix86_indirect_branch_thunk_register"))
++ (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")
-+ (and (match_test "TARGET_X32 && Pmode == DImode
-+ && !ix86_indirect_branch_thunk_register")
+ (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 "TARGET_X32
-+ || ix86_indirect_branch_thunk_register"))
++ (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")
-+ (and (match_test "TARGET_X32 && Pmode == DImode
-+ && !ix86_indirect_branch_thunk_register")
+ (and (match_test "TARGET_X32 && Pmode == DImode")
(match_operand 0 "GOT_memory_operand"))))
-
- (define_constraint "Bz"
-diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.md gcc-7.2.0/gcc/config/i386/i386.md
---- gcc-7.2.0.orig/gcc/config/i386/i386.md 2018-01-15 18:36:46.571698448 -0800
-+++ gcc-7.2.0/gcc/config/i386/i386.md 2018-01-15 18:44:19.035690346 -0800
-@@ -11608,7 +11608,7 @@
+diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
+index d112bdb..d074c2f 100644
+--- a/gcc/config/i386/i386.md
++++ b/gcc/config/i386/i386.md
+@@ -11625,7 +11625,7 @@
[(set (pc) (match_operand 0 "indirect_branch_operand"))]
""
{
- if (TARGET_X32)
-+ if (TARGET_X32 || ix86_indirect_branch_thunk_register)
++ if (TARGET_X32 || ix86_indirect_branch_register)
operands[0] = convert_memory_address (word_mode, operands[0]);
cfun->machine->has_local_indirect_jump = true;
})
-@@ -11658,7 +11658,7 @@
+@@ -11679,7 +11679,7 @@
OPTAB_DIRECT);
}
- if (TARGET_X32)
-+ if (TARGET_X32 || ix86_indirect_branch_thunk_register)
++ if (TARGET_X32 || ix86_indirect_branch_register)
operands[0] = convert_memory_address (word_mode, operands[0]);
cfun->machine->has_local_indirect_jump = true;
})
-@@ -11846,7 +11846,7 @@
+@@ -11871,7 +11871,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_thunk_register"
++ "!TARGET_X32 && !ix86_indirect_branch_register"
"* return ix86_output_call_insn (insn, operands[0]);"
[(set_attr "type" "call")])
-@@ -11855,7 +11855,9 @@
+@@ -11880,7 +11880,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_thunk_register
++ && !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))
-@@ -11868,7 +11870,9 @@
+@@ -11893,7 +11895,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_thunk_register
++ && !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)
-@@ -11890,7 +11894,7 @@
+@@ -11915,7 +11919,7 @@
})
(define_insn "*call_pop"
@@ -221,7 +196,7 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.md gcc-7.2.0/gcc/config/i386/i386
(match_operand 1))
(set (reg:SI SP_REG)
(plus:SI (reg:SI SP_REG)
-@@ -11910,7 +11914,7 @@
+@@ -11935,7 +11939,7 @@
[(set_attr "type" "call")])
(define_insn "*sibcall_pop_memory"
@@ -230,49 +205,49 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.md gcc-7.2.0/gcc/config/i386/i386
(match_operand 1))
(set (reg:SI SP_REG)
(plus:SI (reg:SI SP_REG)
-@@ -11964,7 +11968,9 @@
+@@ -11989,7 +11993,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_thunk_register
++ && !ix86_indirect_branch_register
+ && peep2_reg_dead_p (2, operands[0])"
[(set (pc) (match_dup 1))])
;; Call subroutine, returning value in operand 0
-@@ -12045,7 +12051,7 @@
+@@ -12070,7 +12076,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_thunk_register"
++ "!TARGET_X32 && !ix86_indirect_branch_register"
"* return ix86_output_call_insn (insn, operands[1]);"
[(set_attr "type" "callv")])
-@@ -12055,7 +12061,9 @@
+@@ -12080,7 +12086,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_thunk_register
++ && !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)
-@@ -12070,7 +12078,9 @@
+@@ -12095,7 +12103,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_thunk_register
++ && !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)
-@@ -12095,7 +12105,7 @@
+@@ -12120,7 +12130,7 @@
(define_insn "*call_value_pop"
[(set (match_operand 0)
@@ -281,79 +256,68 @@ diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.md gcc-7.2.0/gcc/config/i386/i386
(match_operand 2)))
(set (reg:SI SP_REG)
(plus:SI (reg:SI SP_REG)
-diff -Naur gcc-7.2.0.orig/gcc/config/i386/i386.opt gcc-7.2.0/gcc/config/i386/i386.opt
---- gcc-7.2.0.orig/gcc/config/i386/i386.opt 2018-01-15 18:36:46.572698448 -0800
-+++ gcc-7.2.0/gcc/config/i386/i386.opt 2018-01-15 18:44:35.515690050 -0800
-@@ -951,3 +951,7 @@
+diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
+index b07388d..b90da9f 100644
+--- a/gcc/config/i386/i386.opt
++++ b/gcc/config/i386/i386.opt
+@@ -951,3 +951,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_thunk_register) Init(0)
++Target Report Var(ix86_indirect_branch_register) Init(0)
+Force indirect call and jump via register.
-diff -Naur gcc-7.2.0.orig/gcc/config/i386/predicates.md gcc-7.2.0/gcc/config/i386/predicates.md
---- gcc-7.2.0.orig/gcc/config/i386/predicates.md 2018-01-15 18:36:46.564698448 -0800
-+++ gcc-7.2.0/gcc/config/i386/predicates.md 2018-01-15 18:46:50.757687629 -0800
+diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
+index 2fc2c60..e4da309 100644
+--- a/gcc/config/i386/predicates.md
++++ b/gcc/config/i386/predicates.md
@@ -635,7 +635,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 "TARGET_X32
-+ || ix86_indirect_branch_thunk_register"))
++ (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.
-@@ -664,7 +665,8 @@
-
- ;; Return true if OP is a GOT memory operand.
- (define_predicate "GOT_memory_operand"
-- (match_operand 0 "memory_operand")
-+ (and (match_test "!ix86_indirect_branch_thunk_register")
-+ (match_operand 0 "memory_operand"))
- {
- op = XEXP (op, 0);
- return (GET_CODE (op) == CONST
-@@ -678,9 +680,11 @@
+@@ -678,20 +679,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"))
-+ (ior (and (not (match_test "TARGET_X32
-+ || ix86_indirect_branch_thunk_register"))
- (match_operand 0 "memory_operand"))
+- (match_operand 0 "memory_operand"))
- (and (match_test "TARGET_X32 && Pmode == DImode")
-+ (and (match_test "TARGET_X32 && Pmode == DImode
-+ && !ix86_indirect_branch_thunk_register")
- (match_operand 0 "GOT_memory_operand")))))
+- (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.
-@@ -688,14 +692,17 @@
+ (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"))
-+ (ior (and (not (match_test "TARGET_X32
-+ || ix86_indirect_branch_thunk_register"))
- (match_operand 0 "sibcall_memory_operand"))
+- (match_operand 0 "sibcall_memory_operand"))
- (and (match_test "TARGET_X32 && Pmode == DImode")
-+ (and (match_test "TARGET_X32 && Pmode == DImode
-+ && !ix86_indirect_branch_thunk_register")
- (match_operand 0 "GOT_memory_operand")))))
+- (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"
-- (match_test "GET_CODE (op) == CONST
-+ (match_test "!ix86_indirect_branch_thunk_register
-+ && GET_CODE (op) == CONST
- && GET_CODE (XEXP (op, 0)) == UNSPEC
- && XINT (XEXP (op, 0), 1) == UNSPEC_GOT"))
-
-diff -Naur gcc-7.2.0.orig/gcc/doc/invoke.texi gcc-7.2.0/gcc/doc/invoke.texi
---- gcc-7.2.0.orig/gcc/doc/invoke.texi 2018-01-15 18:36:44.485698486 -0800
-+++ gcc-7.2.0/gcc/doc/invoke.texi 2018-01-15 18:47:25.682687003 -0800
-@@ -1211,7 +1211,8 @@
+diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
+index f3eb54b..1e572b1 100644
+--- a/gcc/doc/invoke.texi
++++ b/gcc/doc/invoke.texi
+@@ -1211,7 +1211,8 @@ 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 -mgeneral-regs-only @gol
@@ -363,7 +327,7 @@ diff -Naur gcc-7.2.0.orig/gcc/doc/invoke.texi gcc-7.2.0/gcc/doc/invoke.texi
@emph{x86 Windows Options}
@gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol
-@@ -25671,6 +25672,10 @@
+@@ -25709,6 +25710,10 @@ object file. You can control this behavior for a specific function by
using the function attribute @code{function_return}.
@xref{Function Attributes}.
@@ -374,514 +338,3 @@ diff -Naur gcc-7.2.0.orig/gcc/doc/invoke.texi gcc-7.2.0/gcc/doc/invoke.texi
@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 527e447aea5..3f9b5f58ecc 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 7dbc7607e2e..19f4d5e3a1e 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 c085b21582c..304a641db28 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 f92968bf616..c4eabadea7d 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 4d19fac21d8..defe4389354 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 5cbdd85303e..5b202526968 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 c59dd049883..d5aa68f52ca 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 61b9c80de33..09c35e73443 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 dcd2381c514..246300e8d71 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 21b69728796..02223f8d0f4 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 0bd6aab2fd6..a80b46af934 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 99226dbdd1f..e85057bc098 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 aceb4041275..50a2d72ae16 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 43d19bbe876..eac9b3dee22 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 bbfaf6ba7e7..58285f6ee6c 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 6c82a236c1b..d3dec5623eb 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 299940de399..c2e07d59ca4 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 77ee84b938b..16b64a46dbd 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 782960375af..cf499879513 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 240c15be8a6..54c6e300295 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 6e49707875e..925c7943662 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 e1d8891380c..0f7e39f914a 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 6ad05b70604..1d34cb197a7 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 cfb0894ae49..8d591d562a5 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 205b9b405bf..a288e3d61b9 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 efa0096e1e0..f7fad345ca4 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 775d0b8c53e..91388544a20 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 788271f049f..69f03e6472e 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 ef8a2c746a7..226b776abcf 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 848ceefca02..b9120017c10 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 64608100782..fbd6f9ec457 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 3c2758360f5..2553c56f97f 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 b5164bfc5ad..c440d68ec0d 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 a26ac963ea5..674a6bf96e8 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 d0106da38ee..3f37e4375de 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 185ad366190..f96e6847f13 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 cce8b20b5f1..4c47b28691e 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 0316d301d9c..43d84743851 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 92298c362ec..a56a4849f76 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.14.3
-
diff --git a/sys-devel/gcc/files/spectre-0005-mcmodel-large.patch b/sys-devel/gcc/files/spectre-0005-mcmodel-large.patch
index 51c56c9..25574d4 100644
--- a/sys-devel/gcc/files/spectre-0005-mcmodel-large.patch
+++ b/sys-devel/gcc/files/spectre-0005-mcmodel-large.patch
@@ -1,7 +1,8 @@
-From: "H dot J dot Lu" <hjl dot tools at gmail dot com>
-To: gcc-patches at gcc dot gnu dot org
-Subject: [PATCH 5/5] x86: Disallow -mindirect-branch=/-mfunction-return= with -mcmodel=large
-Date: Sat, 13 Jan 2018 19:37:07 -0800
+From 5d1c53c6fd593de2360c1a2ae44ebf5fa3c5263b Mon Sep 17 00:00:00 2001
+From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date: Tue, 16 Jan 2018 11:22:01 +0000
+Subject: [PATCH] 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,
@@ -11,6 +12,9 @@ Since the thunk function may not be reachable in large code model,
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
@@ -19,51 +23,18 @@ gcc/
-mindirect-branch=thunk, -mindirect-branch=thunk-extern,
-mfunction-return=thunk and -mfunction-return=thunk-extern.
-gcc/testsuite/
- * 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.
+git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256737 138bc75d-0d04-0410-961f-82ee72b054a4
---
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
+ 15 files changed, 156 insertions(+)
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
-index 9807de0c117..92b328ebfc2 100644
+index 1bbdd0c..e758387 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
-@@ -5836,6 +5836,19 @@ ix86_set_indirect_branch_type (tree fndecl)
+@@ -7187,6 +7187,19 @@ ix86_set_indirect_branch_type (tree fndecl)
}
else
cfun->machine->indirect_branch_type = ix86_indirect_branch;
@@ -83,7 +54,7 @@ index 9807de0c117..92b328ebfc2 100644
}
if (cfun->machine->function_return_type == indirect_branch_unset)
-@@ -5861,6 +5874,19 @@ ix86_set_indirect_branch_type (tree fndecl)
+@@ -7212,6 +7225,19 @@ ix86_set_indirect_branch_type (tree fndecl)
}
else
cfun->machine->function_return_type = ix86_function_return;
@@ -104,10 +75,10 @@ index 9807de0c117..92b328ebfc2 100644
}
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
-index d16006e653a..2495a45c957 100644
+index 1e572b1..6f3c344 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
-@@ -26851,6 +26851,11 @@ to external call and return thunk provided in a separate object file.
+@@ -25699,6 +25699,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}.
@@ -119,7 +90,7 @@ index d16006e653a..2495a45c957 100644
@item -mfunction-return=@var{choice}
@opindex -mfunction-return
Convert function return with @var{choice}. The default is @samp{keep},
-@@ -26862,6 +26867,12 @@ object file. You can control this behavior for a specific function by
+@@ -25710,6 +25715,12 @@ object file. You can control this behavior for a specific function by
using the function attribute @code{function_return}.
@xref{Function Attributes}.
@@ -132,161 +103,3 @@ index d16006e653a..2495a45c957 100644
@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..5623f162dea
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-10.c
-@@ -0,0 +1,7 @@
-+/* { dg-do compile { target { ! ia32 } } } */
-+/* { 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..d6c1437bcf1
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-8.c
-@@ -0,0 +1,7 @@
-+/* { dg-do compile { target { ! ia32 } } } */
-+/* { 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..6914dac27ce
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-9.c
-@@ -0,0 +1,7 @@
-+/* { dg-do compile { target { ! ia32 } } } */
-+/* { 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..87c7684aa92
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-10.c
-@@ -0,0 +1,9 @@
-+/* { dg-do compile { target { ! ia32 } } } */
-+/* { 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..0499c1d7d27
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-11.c
-@@ -0,0 +1,9 @@
-+/* { dg-do compile { target { ! ia32 } } } */
-+/* { 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..3f1d4f54884
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-9.c
-@@ -0,0 +1,9 @@
-+/* { dg-do compile { target { ! ia32 } } } */
-+/* { 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..930f72713ae
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-17.c
-@@ -0,0 +1,7 @@
-+/* { dg-do compile { target { ! ia32 } } } */
-+/* { 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..5763fde84b1
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-18.c
-@@ -0,0 +1,8 @@
-+/* { dg-do compile { target { ! ia32 } } } */
-+/* { 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..ff710d4c1fe
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-19.c
-@@ -0,0 +1,8 @@
-+/* { dg-do compile { target { ! ia32 } } } */
-+/* { 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..eeffbd2289a
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-20.c
-@@ -0,0 +1,9 @@
-+/* { dg-do compile { target { ! ia32 } } } */
-+/* { 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..49ab118e04f
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-21.c
-@@ -0,0 +1,9 @@
-+/* { dg-do compile { target { ! ia32 } } } */
-+/* { 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.14.3
-
diff --git a/sys-devel/gcc/gcc-7.2.0-r2.ebuild b/sys-devel/gcc/gcc-7.2.0-r2.ebuild
index 2862d12..138a077 100644
--- a/sys-devel/gcc/gcc-7.2.0-r2.ebuild
+++ b/sys-devel/gcc/gcc-7.2.0-r2.ebuild
@@ -28,6 +28,7 @@ src_prepare() {
epatch "${FILESDIR}"/0001-gcc-7.2.0-move-struct-ix86_frame-to-machine-function.patch
epatch "${FILESDIR}"/0002-gcc-7.2.0-move-struct-ix86_frame-to-machine-function.patch
epatch "${FILESDIR}"/0003-gcc-7.2.0-move-struct-ix86_frame-to-machine-function.patch
+ epatch "${FILESDIR}"/0004-gcc-7.2.0-move-struct-ix86_frame-to-machine-function.patch
epatch "${FILESDIR}"/spectre-0001-mindirect-branch.patch
epatch "${FILESDIR}"/spectre-0002-mfunction-return.patch
next reply other threads:[~2018-01-18 2:41 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-18 2:41 Aric Belsito [this message]
-- strict thread matches above, loose matches on Subject: below --
2021-11-20 23:24 [gentoo-commits] proj/musl:master commit in: sys-devel/gcc/files/, sys-devel/gcc/ Sam James
2021-09-13 2:01 Jory Pratt
2018-01-16 4:51 Aric Belsito
2017-07-02 14:47 Anthony G. Basile
2017-07-02 14:47 Anthony G. Basile
2016-09-22 6:48 Anthony G. Basile
2016-09-19 20:12 Anthony G. Basile
2016-05-18 11:09 Anthony G. Basile
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1516243220.d3a28f37f79a474ffd89f1e4b9b5daf980c6d4a2.lluixhi@gentoo \
--to=lluixhi@gmail.com \
--cc=gentoo-commits@lists.gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox