From 86118fbdbafe6af54b2da467e1073c49e1742116 Mon Sep 17 00:00:00 2001 From: hjl Date: Tue, 16 Jan 2018 11:17:49 +0000 Subject: [PATCH 7/9] x86: Add -mindirect-branch-register (documentation) Add -mindirect-branch-register to force indirect branch via register. This is implemented by disabling patterns of indirect branch via memory, similar to TARGET_X32. -mindirect-branch= and -mfunction-return= tests are updated with -mno-indirect-branch-register to avoid false test failures when -mindirect-branch-register is added to RUNTESTFLAGS for "make check". gcc/ Backport from mainline 2018-01-14 H.J. Lu * config/i386/constraints.md (Bs): Disallow memory operand for -mindirect-branch-register. (Bw): Likewise. * config/i386/predicates.md (indirect_branch_operand): Likewise. (GOT_memory_operand): Likewise. (call_insn_operand): Likewise. (sibcall_insn_operand): Likewise. (GOT32_symbol_operand): Likewise. * config/i386/i386.md (indirect_jump): Call convert_memory_address for -mindirect-branch-register. (tablejump): Likewise. (*sibcall_memory): Likewise. (*sibcall_value_memory): Likewise. Disallow peepholes of indirect call and jump via memory for -mindirect-branch-register. (*call_pop): Replace m with Bw. (*call_value_pop): Likewise. (*sibcall_pop_memory): Replace m with Bs. * config/i386/i386.opt (mindirect-branch-register): New option. * doc/invoke.texi: Document -mindirect-branch-register option. gcc/testsuite/ Backport from mainline 2018-01-14 H.J. Lu * gcc.target/i386/indirect-thunk-1.c (dg-options): Add -mno-indirect-branch-register. * gcc.target/i386/indirect-thunk-2.c: Likewise. * gcc.target/i386/indirect-thunk-3.c: Likewise. * gcc.target/i386/indirect-thunk-4.c: Likewise. * gcc.target/i386/indirect-thunk-5.c: Likewise. * gcc.target/i386/indirect-thunk-6.c: Likewise. * gcc.target/i386/indirect-thunk-7.c: Likewise. * gcc.target/i386/indirect-thunk-attr-1.c: Likewise. * gcc.target/i386/indirect-thunk-attr-2.c: Likewise. * gcc.target/i386/indirect-thunk-attr-3.c: Likewise. * gcc.target/i386/indirect-thunk-attr-4.c: Likewise. * gcc.target/i386/indirect-thunk-attr-5.c: Likewise. * gcc.target/i386/indirect-thunk-attr-6.c: Likewise. * gcc.target/i386/indirect-thunk-attr-7.c: Likewise. * gcc.target/i386/indirect-thunk-bnd-1.c: Likewise. * gcc.target/i386/indirect-thunk-bnd-2.c: Likewise. * gcc.target/i386/indirect-thunk-bnd-3.c: Likewise. * gcc.target/i386/indirect-thunk-bnd-4.c: Likewise. * gcc.target/i386/indirect-thunk-extern-1.c: Likewise. * gcc.target/i386/indirect-thunk-extern-2.c: Likewise. * gcc.target/i386/indirect-thunk-extern-3.c: Likewise. * gcc.target/i386/indirect-thunk-extern-4.c: Likewise. * gcc.target/i386/indirect-thunk-extern-5.c: Likewise. * gcc.target/i386/indirect-thunk-extern-6.c: Likewise. * gcc.target/i386/indirect-thunk-extern-7.c: Likewise. * gcc.target/i386/indirect-thunk-inline-1.c: Likewise. * gcc.target/i386/indirect-thunk-inline-2.c: Likewise. * gcc.target/i386/indirect-thunk-inline-3.c: Likewise. * gcc.target/i386/indirect-thunk-inline-4.c: Likewise. * gcc.target/i386/indirect-thunk-inline-5.c: Likewise. * gcc.target/i386/indirect-thunk-inline-6.c: Likewise. * gcc.target/i386/indirect-thunk-inline-7.c: Likewise. * gcc.target/i386/ret-thunk-10.c: Likewise. * gcc.target/i386/ret-thunk-11.c: Likewise. * gcc.target/i386/ret-thunk-12.c: Likewise. * gcc.target/i386/ret-thunk-13.c: Likewise. * gcc.target/i386/ret-thunk-14.c: Likewise. * gcc.target/i386/ret-thunk-15.c: Likewise. * gcc.target/i386/ret-thunk-9.c: Likewise. * gcc.target/i386/indirect-thunk-register-1.c: New test. * gcc.target/i386/indirect-thunk-register-2.c: Likewise. * gcc.target/i386/indirect-thunk-register-3.c: Likewise. i386: Rename to ix86_indirect_branch_register Rename the variable for -mindirect-branch-register to ix86_indirect_branch_register to match the command-line option name. Backport from mainline 2018-01-15 H.J. Lu * 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 * 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 * 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 * config/i386/predicates.md (indirect_branch_operand): Rewrite ix86_indirect_branch_register logic. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256735 138bc75d-0d04-0410-961f-82ee72b054a4 [Ubuntu note: Dropped indirect-thunk-5.c, indirect-thunk-6.c, indirect-thunk-bnd-3.c, indirect-thunk-bnd-4.c, indirect-thunk-extern-5.c, indirect-thunk-extern-6.c, indirect-thunk-inline-5.c, and indirect-thunk-inline-6.c tests due to gcc 5.4 and earlier not supporting the -fno-plt option. --sbeattie,] --- src/gcc/config/i386/constraints.md | 6 + src/gcc/config/i386/i386.md | 34 ++++++---- src/gcc/config/i386/i386.opt | 4 + src/gcc/config/i386/predicates.md | 9 +- src/gcc/doc/invoke.texi | 7 +- src/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c | 2 src/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c | 22 ++++++ src/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c | 20 +++++ src/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c | 19 +++++ src/gcc/testsuite/gcc.target/i386/ret-thunk-10.c | 2 src/gcc/testsuite/gcc.target/i386/ret-thunk-11.c | 2 src/gcc/testsuite/gcc.target/i386/ret-thunk-12.c | 2 src/gcc/testsuite/gcc.target/i386/ret-thunk-13.c | 2 src/gcc/testsuite/gcc.target/i386/ret-thunk-14.c | 2 src/gcc/testsuite/gcc.target/i386/ret-thunk-15.c | 2 src/gcc/testsuite/gcc.target/i386/ret-thunk-9.c | 2 39 files changed, 134 insertions(+), 49 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 Index: b/src/gcc/doc/invoke.texi =================================================================== --- a/src/gcc/doc/invoke.texi +++ b/src/gcc/doc/invoke.texi @@ -1091,7 +1091,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 --mindirect-branch=@var{choice} -mfunction-return=@var{choice}} +-mindirect-branch=@var{choice} -mfunction-return=@var{choice} @gol +-mindirect-branch-register} @emph{x86 Windows Options} @gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol @@ -24040,6 +24041,10 @@ object file. You can control this behav using the function attribute @code{function_return}. @xref{Function Attributes}. +@item -mindirect-branch-register +@opindex -mindirect-branch-register +Force indirect call and jump via register. + @end table @c man end