This set of patches for GCC 7, backported from trunk, mitigates variant #2 of the speculative execution vulnerabilities on x86 processors identified by CVE-2017-5715, aka Spectre. They convert indirect branches and function returns to call and return thunks to avoid speculative execution via indirect call, jmp and ret.
Testd on Linux/i686 and Linux/x86-64. Know issues: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83839 There are many test failures on Solaris due to lack of comdat support in Solaris linker. H.J. Lu (5): x86: Add -mindirect-branch= x86: Add -mfunction-return= x86: Add -mindirect-branch-register x86: Add 'V' register operand modifier x86: Disallow -mindirect-branch=/-mfunction-return= with -mcmodel=large gcc/config/i386/constraints.md | 6 +- gcc/config/i386/i386-opts.h | 13 + gcc/config/i386/i386-protos.h | 2 + gcc/config/i386/i386.c | 823 ++++++++++++++++++++- gcc/config/i386/i386.h | 10 + gcc/config/i386/i386.md | 69 +- gcc/config/i386/i386.opt | 28 + gcc/config/i386/predicates.md | 21 +- gcc/doc/extend.texi | 22 + gcc/doc/invoke.texi | 41 +- gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | 20 + gcc/testsuite/gcc.target/i386/indirect-thunk-10.c | 7 + gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | 20 + gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | 21 + gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | 21 + gcc/testsuite/gcc.target/i386/indirect-thunk-5.c | 17 + gcc/testsuite/gcc.target/i386/indirect-thunk-6.c | 18 + gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | 44 ++ 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-1.c | 23 + .../gcc.target/i386/indirect-thunk-attr-10.c | 9 + .../gcc.target/i386/indirect-thunk-attr-11.c | 9 + .../gcc.target/i386/indirect-thunk-attr-2.c | 21 + .../gcc.target/i386/indirect-thunk-attr-3.c | 23 + .../gcc.target/i386/indirect-thunk-attr-4.c | 22 + .../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 | 42 ++ .../gcc.target/i386/indirect-thunk-attr-9.c | 9 + .../gcc.target/i386/indirect-thunk-bnd-1.c | 20 + .../gcc.target/i386/indirect-thunk-bnd-2.c | 21 + .../gcc.target/i386/indirect-thunk-bnd-3.c | 19 + .../gcc.target/i386/indirect-thunk-bnd-4.c | 20 + .../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 | 20 + .../gcc.target/i386/indirect-thunk-inline-2.c | 20 + .../gcc.target/i386/indirect-thunk-inline-3.c | 21 + .../gcc.target/i386/indirect-thunk-inline-4.c | 21 + .../gcc.target/i386/indirect-thunk-inline-5.c | 17 + .../gcc.target/i386/indirect-thunk-inline-6.c | 18 + .../gcc.target/i386/indirect-thunk-inline-7.c | 44 ++ .../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.target/i386/indirect-thunk-register-4.c | 13 + gcc/testsuite/gcc.target/i386/ret-thunk-1.c | 13 + gcc/testsuite/gcc.target/i386/ret-thunk-10.c | 23 + gcc/testsuite/gcc.target/i386/ret-thunk-11.c | 23 + gcc/testsuite/gcc.target/i386/ret-thunk-12.c | 22 + gcc/testsuite/gcc.target/i386/ret-thunk-13.c | 22 + gcc/testsuite/gcc.target/i386/ret-thunk-14.c | 22 + gcc/testsuite/gcc.target/i386/ret-thunk-15.c | 22 + gcc/testsuite/gcc.target/i386/ret-thunk-16.c | 18 + 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-2.c | 13 + gcc/testsuite/gcc.target/i386/ret-thunk-20.c | 9 + gcc/testsuite/gcc.target/i386/ret-thunk-21.c | 9 + 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 | 15 + gcc/testsuite/gcc.target/i386/ret-thunk-6.c | 14 + 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 | 24 + 74 files changed, 2204 insertions(+), 50 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-1.c create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-10.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-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-1.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-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-attr-9.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 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 create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c 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-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-2.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 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 -- 2.14.3