On 01/07/2018 03:59 PM, H.J. Lu wrote: > 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/ > > * 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/ > > * 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/indirect-thunk-loop-1.c: Likewise. > * gcc.target/i386/indirect-thunk-loop-2.c: Likewise. > * gcc.target/i386/indirect-thunk-loop-3.c: Likewise. > * gcc.target/i386/indirect-thunk-loop-4.c: Likewise. > * gcc.target/i386/indirect-thunk-loop-5.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. No comments from me on this. Uros has final call.
jeff