<div dir="ltr"><div>And the same with</div><div>meta/recipes-devtools/gcc/gcc-6.4/CVE-2016-4490.patch<br></div><div>which isn't included in SRC_URI since:</div><div><br></div><div>commit 41ce4b438795108025c79cd3eec067367d53623e</div><div>Author: Khem Raj <<a href="mailto:raj.khem@gmail.com">raj.khem@gmail.com</a>></div><div>Date: Tue Aug 16 11:50:35 2016 -0700</div><div><br></div><div> gcc: Upgrade to 6.2 RC1</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Mar 4, 2018 at 1:00 PM, Martin Jansa <span dir="ltr"><<a href="mailto:martin.jansa@gmail.com" target="_blank">martin.jansa@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Also</div><div>meta/recipes-devtools/gcc/gcc-<wbr>6.4/0048-ARM-PR-target-71056-<wbr>Don-t-use-vectorized-builtins-<wbr>wh.patch</div><div>added in this patch doesn't seem to be used anywhere.</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Mar 4, 2018 at 12:38 PM, Martin Jansa <span dir="ltr"><<a href="mailto:martin.jansa@gmail.com" target="_blank">martin.jansa@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Is this backport of </span><a href="https://patches.openembedded.org/patch/144961/" style="color:rgb(17,85,204);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255)" target="_blank">https://patches.openembedde<wbr>d.org/patch/144961/</a><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><span> </span>?</span><br><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br></span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:12.8px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">If yes, why does it have different author?</span></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Mar 4, 2018 at 12:23 PM, Richard Purdie <span dir="ltr"><<a href="mailto:richard.purdie@linuxfoundation.org" target="_blank">richard.purdie@linuxfoundatio<wbr>n.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Juro Bystricky <<a href="mailto:juro.bystricky@intel.com" target="_blank">juro.bystricky@intel.com</a>><br>
<br>
Changed BINV and PV to 6.4.0<br>
Modified BASEURI to load xz tarball instead of bz2<br>
<br>
Backported series of patches from <a href="https://github.com/hjl-tools/gcc.git" rel="noreferrer" target="_blank">https://github.com/hjl-tools/g<wbr>cc.git</a><br>
branch /hjl/indirect/gcc-6-branch/mas<wbr>ter which contains<br>
an IA patch series for security related issues<br>
<br>
ubsan-fix-check-empty-string.p<wbr>atch : removed, already applied<br>
CVE-2016-6131.patch: Modified ChangeLog hunk to apply<br>
<br>
Signed-off-by: Juro Bystricky <<a href="mailto:juro.bystricky@intel.com" target="_blank">juro.bystricky@intel.com</a>><br>
Signed-off-by: Richard Purdie <<a href="mailto:richard.purdie@linuxfoundation.org" target="_blank">richard.purdie@linuxfoundatio<wbr>n.org</a>><br>
---<br>
meta/conf/distro/include/tcmo<wbr>de-default.inc | 2 +-<br>
.../gcc/gcc-6.3/ubsan-fix-che<wbr>ck-empty-string.patch | 28 -<br>
.../gcc/{gcc-6.3.inc => gcc-6.4.inc} | 26 +-<br>
.../0001-gcc-4.3.1-ARCH_FLAGS<wbr>_FOR_TARGET.patch | 0<br>
...ove-struct-ix86_frame-to-m<wbr>achine_function.patch | 244 +++<br>
...ference-of-struct-ix86_fra<wbr>me-to-avoid-cop.patch | 71 +<br>
.../{gcc-6.3 => gcc-6.4}/0002-uclibc-conf.patc<wbr>h | 0<br>
.../0003-gcc-uclibc-locale-ct<wbr>ype_touplow_t.patch | 0<br>
...nst-reference-of-struct-ix<wbr>86_frame-to-avo.patch | 128 ++<br>
.../{gcc-6.3 => gcc-6.4}/<a href="http://0004-uclibc-locale.pa" target="_blank">0004-uclibc-locale.pa</a><wbr>tch | 0<br>
.../gcc-6.4/0004-x86-Add-mind<wbr>irect-branch.patch | 2151 ++++++++++++++++++++<br>
.../0005-uclibc-locale-no__x.<wbr>patch | 0<br>
.../gcc-6.4/0005-x86-Add-mfun<wbr>ction-return.patch | 1567 ++++++++++++++<br>
.../0006-uclibc-locale-wchar_<wbr>fix.patch | 0<br>
.../0006-x86-Add-mindirect-br<wbr>anch-register.patch | 943 +++++++++<br>
.../0007-uclibc-locale-update<wbr>.patch | 0<br>
.../0007-x86-Add-V-register-o<wbr>perand-modifier.patch | 136 ++<br>
.../0008-missing-execinfo_h.p<wbr>atch | 0<br>
...w-mindirect-branch-mfuncti<wbr>on-return-with-.patch | 301 +++<br>
...VALID_REGNUM-in-indirect-t<wbr>hunk-processing.patch | 123 ++<br>
.../{gcc-6.3 => gcc-6.4}/0009-c99-snprintf.pat<wbr>ch | 0<br>
.../0010-gcc-poison-system-di<wbr>rectories.patch | 0<br>
...INVALID_REGNUM-as-invalid-<wbr>register-number.patch | 43 +<br>
.../0011-gcc-poison-dir-exten<wbr>d.patch | 0<br>
...date-mfunction-return-for-<wbr>return-with-pop.patch | 450 ++++<br>
.../0012-gcc-4.3.3-SYSROOT_CF<wbr>LAGS_FOR_TARGET.patch | 0<br>
...-i386-Add-TARGET_INDIRECT_<wbr>BRANCH_REGISTER.patch | 1001 +++++++++<br>
.../0013-64-bit-multilib-hack<wbr>.patch | 0<br>
.../0014-optional-libstdc.pat<wbr>ch | 0<br>
...0015-gcc-disable-MASK_RELA<wbr>X_PIC_CALLS-bit.patch | 0<br>
.../0016-COLLECT_GCC_OPTIONS.<wbr>patch | 0<br>
...efaults.h-in-B-instead-of-<wbr>S-and-t-oe-in-B.patch | 0<br>
.../0018-fortran-cross-compil<wbr>e-hack.patch | 0<br>
.../<a href="http://0019-cpp-honor-sysroot.pa" target="_blank">0019-cpp-honor-sysroot.pa</a><wbr>tch | 0<br>
.../0020-MIPS64-Default-to-N6<wbr>4-ABI.patch | 0<br>
...C_DYNAMIC_LINKER-and-UCLIB<wbr>C_DYNAMIC_LINKE.patch | 0<br>
...0022-gcc-Fix-argument-list<wbr>-too-long-error.patch | 0<br>
.../{gcc-6.3 => gcc-6.4}/0023-Disable-sdt.patc<wbr>h | 0<br>
.../gcc/{gcc-6.3 => gcc-6.4}/0024-libtool.patch | 0<br>
...4-pass-fix-v4bx-to-linker-<wbr>to-support-EABI.patch | 0<br>
...tilib-config-files-from-B-<wbr>instead-of-usin.patch | 0<br>
...-libdir-from-.la-which-usu<wbr>ally-points-to-.patch | 0<br>
.../gcc/{gcc-6.3 => gcc-6.4}/0028-export-CPP.patch | 0<br>
...AltiVec-generation-on-powe<wbr>pc-linux-target.patch | 0<br>
...-MULTILIB_OSDIRNAMES-and-o<wbr>ther-multilib-o.patch | 0<br>
...Ensure-target-gcc-headers-<wbr>can-be-included.patch | 0<br>
...-t-build-with-disable-depe<wbr>ndency-tracking.patch | 0<br>
...h-host-directory-during-re<wbr>link-if-inst_pr.patch | 0<br>
...IBS_DIR-replacement-instea<wbr>d-of-hardcoding.patch | 0<br>
.../0035-aarch64-Add-support-<wbr>for-musl-ldso.patch | 0<br>
...ibcc1-fix-libcc1-s-install<wbr>-path-and-rpath.patch | 0<br>
...-handle-sysroot-support-fo<wbr>r-nativesdk-gcc.patch | 0<br>
...et-sysroot-gcc-version-spe<wbr>cific-dirs-with.patch | 0<br>
...-various-_FOR_BUILD-and-re<wbr>lated-variables.patch | 0<br>
.../0040-nios2-Define-MUSL_DY<wbr>NAMIC_LINKER.patch | 0<br>
...shared-to-link-commandline<wbr>-for-musl-targe.patch | 0<br>
...c-libcpp-support-ffile-pre<wbr>fix-map-old-new.patch | 0<br>
...ug-prefix-map-to-replace-f<wbr>file-prefix-map.patch | 0<br>
...-fdebug-prefix-map-support<wbr>-to-remap-sourc.patch | 0<br>
...45-libgcc-Add-knob-to-use-<wbr>ldbl-128-on-ppc.patch | 0<br>
...bgcc-using-LDFLAGS-not-jus<wbr>t-SHLIB_LDFLAGS.patch | 0<br>
...e-alias-for-__cpu_indicato<wbr>r_init-instead-.patch | 0<br>
.../0048-sync-gcc-stddef.h-wi<wbr>th-musl.patch | 0<br>
.../0054_all_nopie-all-flags.<wbr>patch | 0<br>
.../0055-unwind_h-glibc26.pat<wbr>ch | 0<br>
.../gcc/{gcc-6.3 => gcc-6.4}/CVE-2016-6131.patch | 36 +-<br>
...<a href="http://s-canadian_6.3.bb" rel="noreferrer" target="_blank">s-canadian_6.3.bb</a> => <a href="http://gcc-cross-canadian_6.4.bb" rel="noreferrer" target="_blank">gcc-cross-canadian_6.4.bb</a>} | 0<br>
...<a href="http://oss-initial_6.3.bb" rel="noreferrer" target="_blank">oss-initial_6.3.bb</a> => <a href="http://gcc-cross-initial_6.4.bb" rel="noreferrer" target="_blank">gcc-cross-initial_6.4.bb</a>} | 0<br>
.../gcc/{<a href="http://gcc-cross_6.3.bb" rel="noreferrer" target="_blank">gcc-cross_6.3.bb</a> => <a href="http://gcc-cross_6.4.bb" rel="noreferrer" target="_blank">gcc-cross_6.4.bb</a>} | 0<br>
...-<a href="http://initial_6.3.bb" rel="noreferrer" target="_blank">initial_6.3.bb</a> => <a href="http://gcc-crosssdk-initial_6.4.bb" rel="noreferrer" target="_blank">gcc-crosssdk-initial_6.4.bb</a>} | 0<br>
.../{<a href="http://gcc-crosssdk_6.3.bb" rel="noreferrer" target="_blank">gcc-crosssdk_6.3.bb</a> => <a href="http://gcc-crosssdk_6.4.bb" rel="noreferrer" target="_blank">gcc-crosssdk_6.4.bb</a>} | 0<br>
.../gcc/{<a href="http://gcc-runtime_6.3.bb" rel="noreferrer" target="_blank">gcc-runtime_6.3.bb</a> => <a href="http://gcc-runtime_6.4.bb" rel="noreferrer" target="_blank">gcc-runtime_6.4.bb</a>} | 0<br>
...<a href="http://gcc-sanitizers_6.3.bb" rel="noreferrer" target="_blank">gcc-sanitizers_6.3.bb</a> => <a href="http://gcc-sanitizers_6.4.bb" rel="noreferrer" target="_blank">gcc-sanitizers_6.4.bb</a>} | 0<br>
.../gcc/{<a href="http://gcc-source_6.3.bb" rel="noreferrer" target="_blank">gcc-source_6.3.bb</a> => <a href="http://gcc-source_6.4.bb" rel="noreferrer" target="_blank">gcc-source_6.4.bb</a>} | 0<br>
.../gcc/{<a href="http://gcc_6.3.bb" rel="noreferrer" target="_blank">gcc_6.3.bb</a> => <a href="http://gcc_6.4.bb" rel="noreferrer" target="_blank">gcc_6.4.bb</a>} | 0<br>
...<a href="http://libgcc-initial_6.3.bb" rel="noreferrer" target="_blank">libgcc-initial_6.3.bb</a> => <a href="http://libgcc-initial_6.4.bb" rel="noreferrer" target="_blank">libgcc-initial_6.4.bb</a>} | 0<br>
.../gcc/{<a href="http://libgcc_6.3.bb" rel="noreferrer" target="_blank">libgcc_6.3.bb</a> => <a href="http://libgcc_6.4.bb" rel="noreferrer" target="_blank">libgcc_6.4.bb</a>} | 0<br>
.../gcc/{<a href="http://libgfortran_6.3.bb" rel="noreferrer" target="_blank">libgfortran_6.3.bb</a> => <a href="http://libgfortran_6.4.bb" rel="noreferrer" target="_blank">libgfortran_6.4.bb</a>} | 0<br>
78 files changed, 7198 insertions(+), 52 deletions(-)<br>
delete mode 100644 meta/recipes-devtools/gcc/gcc-<wbr>6.3/ubsan-fix-check-empty-stri<wbr>ng.patch<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3.inc => gcc-6.4.inc} (81%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0001-gcc-4.3.1-ARCH_F<wbr>LAGS_FOR_TARGET.patch (100%)<br>
create mode 100644 meta/recipes-devtools/gcc/gcc-<wbr>6.4/0001-i386-Move-struct-ix86<wbr>_frame-to-machine_function.pat<wbr>ch<br>
create mode 100644 meta/recipes-devtools/gcc/gcc-<wbr>6.4/0002-i386-Use-reference-of<wbr>-struct-ix86_frame-to-avoid-co<wbr>p.patch<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0002-uclibc-conf.patc<wbr>h (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0003-gcc-uclibc-local<wbr>e-ctype_touplow_t.patch (100%)<br>
create mode 100644 meta/recipes-devtools/gcc/gcc-<wbr>6.4/0003-i386-Use-const-refere<wbr>nce-of-struct-ix86_frame-to-av<wbr>o.patch<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/<a href="http://0004-uclibc-locale.pa" target="_blank">0004-uclibc-locale.pa</a><wbr>tch (100%)<br>
create mode 100644 meta/recipes-devtools/gcc/gcc-<wbr>6.4/0004-x86-Add-mindirect-bra<wbr>nch.patch<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0005-uclibc-locale-no<wbr>__x.patch (100%)<br>
create mode 100644 meta/recipes-devtools/gcc/gcc-<wbr>6.4/0005-x86-Add-mfunction-ret<wbr>urn.patch<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0006-uclibc-locale-wc<wbr>har_fix.patch (100%)<br>
create mode 100644 meta/recipes-devtools/gcc/gcc-<wbr>6.4/0006-x86-Add-mindirect-bra<wbr>nch-register.patch<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0007-uclibc-locale-up<wbr>date.patch (100%)<br>
create mode 100644 meta/recipes-devtools/gcc/gcc-<wbr>6.4/0007-x86-Add-V-register-op<wbr>erand-modifier.patch<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0008-missing-execinfo<wbr>_h.patch (100%)<br>
create mode 100644 meta/recipes-devtools/gcc/gcc-<wbr>6.4/0008-x86-Disallow-mindirec<wbr>t-branch-mfunction-return-with<wbr>-.patch<br>
create mode 100644 meta/recipes-devtools/gcc/gcc-<wbr>6.4/0009-Use-INVALID_REGNUM-in<wbr>-indirect-thunk-processing.pat<wbr>ch<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0009-c99-snprintf.pat<wbr>ch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0010-gcc-poison-syste<wbr>m-directories.patch (100%)<br>
create mode 100644 meta/recipes-devtools/gcc/gcc-<wbr>6.4/0010-i386-Pass-INVALID_REG<wbr>NUM-as-invalid-register-number<wbr>.patch<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0011-gcc-poison-dir-e<wbr>xtend.patch (100%)<br>
create mode 100644 meta/recipes-devtools/gcc/gcc-<wbr>6.4/0011-i386-Update-mfunction<wbr>-<a href="http://return-for-return-with-pop.pa">return-for-return-with-pop.pa</a><wbr>tch<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0012-gcc-4.3.3-SYSROO<wbr>T_CFLAGS_FOR_TARGET.patch (100%)<br>
create mode 100644 meta/recipes-devtools/gcc/gcc-<wbr>6.4/0012-i386-Add-TARGET_INDIR<wbr>ECT_BRANCH_REGISTER.patch<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0013-64-bit-multilib-<wbr>hack.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0014-optional-libstdc<wbr>.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0015-gcc-disable-MASK<wbr>_RELAX_PIC_CALLS-bit.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0016-COLLECT_GCC_OPTI<wbr>ONS.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0017-Use-the-defaults<wbr>.h-in-B-instead-of-S-and-t-oe-<wbr>in-B.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0018-fortran-cross-co<wbr>mpile-hack.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0019-cpp-honor-sysroo<wbr>t.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0020-MIPS64-Default-t<wbr>o-N64-ABI.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0021-Define-GLIBC_DYN<wbr>AMIC_LINKER-and-UCLIBC_DYNAMIC<wbr>_LINKE.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0022-gcc-Fix-argument<wbr>-list-too-long-error.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0023-Disable-sdt.patc<wbr>h (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0024-libtool.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0025-gcc-armv4-pass-f<wbr>ix-v4bx-to-linker-to-support-E<wbr>ABI.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0026-Use-the-multilib<wbr>-config-files-from-B-instead-o<wbr>f-usin.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0027-Avoid-using-libd<wbr>ir-from-.la-which-usually-poin<wbr>ts-to-.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0028-export-CPP.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0029-Enable-SPE-AltiV<wbr>ec-generation-on-powepc-linux-<wbr>target.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0030-Disable-the-MULT<wbr>ILIB_OSDIRNAMES-and-other-mult<wbr>ilib-o.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0031-Ensure-target-gc<wbr>c-headers-can-be-included.patc<wbr>h (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0032-gcc-4.8-won-t-bu<wbr>ild-with-disable-dependency-tr<wbr>acking.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0033-Don-t-search-hos<wbr>t-directory-during-relink-if-i<wbr>nst_pr.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0034-Use-SYSTEMLIBS_D<wbr>IR-replacement-instead-of-hard<wbr>coding.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0035-aarch64-Add-supp<wbr>ort-for-musl-ldso.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0036-libcc1-fix-libcc<wbr>1-s-install-path-and-rpath.pat<wbr>ch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0037-handle-sysroot-s<wbr>upport-for-nativesdk-gcc.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0038-Search-target-sy<wbr>sroot-gcc-version-specific-dir<wbr>s-with.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0039-Fix-various-_FOR<wbr>_BUILD-and-related-variables.p<wbr>atch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0040-nios2-Define-MUS<wbr>L_DYNAMIC_LINKER.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0041-Add-ssp_nonshare<wbr>d-to-link-commandline-for-musl<wbr>-targe.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0042-gcc-libcpp-suppo<wbr><a href="http://rt-ffile-prefix-map-old-new.pa">rt-ffile-prefix-map-old-new.pa</a><wbr>tch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0043-Reuse-fdebug-pre<wbr>fix-map-to-replace-ffile-prefi<wbr>x-map.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0044-gcc-final.c-fdeb<wbr>ug-prefix-map-support-to-remap<wbr>-sourc.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0045-libgcc-Add-knob-<wbr>to-use-ldbl-128-on-ppc.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0046-Link-libgcc-usin<wbr>g-LDFLAGS-not-just-SHLIB_LDFLA<wbr>GS.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0047-libgcc_s-Use-ali<wbr>as-for-__cpu_indicator_init-in<wbr>stead-.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0048-sync-gcc-stddef.<wbr>h-with-musl.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0054_all_nopie-all-fl<wbr>ags.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/0055-unwind_h-glibc26<wbr>.patch (100%)<br>
rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 => gcc-6.4}/CVE-2016-6131.patch (89%)<br>
rename meta/recipes-devtools/gcc/{<a href="http://gcc-cross-canadian_6.3.bb" rel="noreferrer" target="_blank">gcc<wbr>-cross-canadian_6.3.bb</a> => <a href="http://gcc-cross-canadian_6.4.bb" rel="noreferrer" target="_blank">gcc-cross-canadian_6.4.bb</a>} (100%)<br>
rename meta/recipes-devtools/gcc/{<a href="http://gcc-cross-initial_6.3.bb" rel="noreferrer" target="_blank">gcc<wbr>-cross-initial_6.3.bb</a> => <a href="http://gcc-cross-initial_6.4.bb" rel="noreferrer" target="_blank">gcc-cross-initial_6.4.bb</a>} (100%)<br>
rename meta/recipes-devtools/gcc/{<a href="http://gcc-cross_6.3.bb" rel="noreferrer" target="_blank">gcc<wbr>-cross_6.3.bb</a> => <a href="http://gcc-cross_6.4.bb" rel="noreferrer" target="_blank">gcc-cross_6.4.bb</a>} (100%)<br>
rename meta/recipes-devtools/gcc/{<a href="http://gcc-crosssdk-initial_6.3.bb" rel="noreferrer" target="_blank">gcc<wbr>-crosssdk-initial_6.3.bb</a> => <a href="http://gcc-crosssdk-initial_6.4.bb" rel="noreferrer" target="_blank">gcc-crosssdk-initial_6.4.bb</a>} (100%)<br>
rename meta/recipes-devtools/gcc/{<a href="http://gcc-crosssdk_6.3.bb" rel="noreferrer" target="_blank">gcc<wbr>-crosssdk_6.3.bb</a> => <a href="http://gcc-crosssdk_6.4.bb" rel="noreferrer" target="_blank">gcc-crosssdk_6.4.bb</a>} (100%)<br>
rename meta/recipes-devtools/gcc/{<a href="http://gcc-runtime_6.3.bb" rel="noreferrer" target="_blank">gcc<wbr>-runtime_6.3.bb</a> => <a href="http://gcc-runtime_6.4.bb" rel="noreferrer" target="_blank">gcc-runtime_6.4.bb</a>} (100%)<br>
rename meta/recipes-devtools/gcc/{<a href="http://gcc-sanitizers_6.3.bb" rel="noreferrer" target="_blank">gcc<wbr>-sanitizers_6.3.bb</a> => <a href="http://gcc-sanitizers_6.4.bb" rel="noreferrer" target="_blank">gcc-sanitizers_6.4.bb</a>} (100%)<br>
rename meta/recipes-devtools/gcc/{<a href="http://gcc-source_6.3.bb" rel="noreferrer" target="_blank">gcc<wbr>-source_6.3.bb</a> => <a href="http://gcc-source_6.4.bb" rel="noreferrer" target="_blank">gcc-source_6.4.bb</a>} (100%)<br>
rename meta/recipes-devtools/gcc/{<a href="http://gcc_6.3.bb" rel="noreferrer" target="_blank">gcc<wbr>_6.3.bb</a> => <a href="http://gcc_6.4.bb" rel="noreferrer" target="_blank">gcc_6.4.bb</a>} (100%)<br>
rename meta/recipes-devtools/gcc/{<a href="http://libgcc-initial_6.3.bb" rel="noreferrer" target="_blank">lib<wbr>gcc-initial_6.3.bb</a> => <a href="http://libgcc-initial_6.4.bb" rel="noreferrer" target="_blank">libgcc-initial_6.4.bb</a>} (100%)<br>
rename meta/recipes-devtools/gcc/{<a href="http://libgcc_6.3.bb" rel="noreferrer" target="_blank">lib<wbr>gcc_6.3.bb</a> => <a href="http://libgcc_6.4.bb" rel="noreferrer" target="_blank">libgcc_6.4.bb</a>} (100%)<br>
rename meta/recipes-devtools/gcc/{<a href="http://libgfortran_6.3.bb" rel="noreferrer" target="_blank">lib<wbr>gfortran_6.3.bb</a> => <a href="http://libgfortran_6.4.bb" rel="noreferrer" target="_blank">libgfortran_6.4.bb</a>} (100%)<br>
<br>
diff --git a/meta/conf/distro/include/tcm<wbr>ode-default.inc b/meta/conf/distro/include/tcm<wbr>ode-default.inc<br>
index 3db16e8..69cb762 100644<br>
--- a/meta/conf/distro/include/tcm<wbr>ode-default.inc<br>
+++ b/meta/conf/distro/include/tcm<wbr>ode-default.inc<br>
@@ -22,7 +22,7 @@ PREFERRED_PROVIDER_virtual/${T<wbr>ARGET_PREFIX}libc-initial = "${TCLIBC}-initial"<br>
PREFERRED_PROVIDER_virtual/na<wbr>tivesdk-${SDK_PREFIX}libc-init<wbr>ial ?= "nativesdk-glibc-initial"<br>
PREFERRED_PROVIDER_virtual/ge<wbr>ttext ??= "gettext"<br>
<br>
-GCCVERSION ?= "6.3%"<br>
+GCCVERSION ?= "6.4%"<br>
SDKGCCVERSION ?= "${GCCVERSION}"<br>
BINUVERSION ?= "2.28%"<br>
GDBVERSION ?= "7.12%"<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/ubsan-fix-check-empty-st<wbr>ring.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.3/ubsan-fix-check-empty-st<wbr>ring.patch<br>
deleted file mode 100644<br>
index c012719..0000000<br>
--- a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/ubsan-fix-check-empty-st<wbr>ring.patch<br>
+++ /dev/null<br>
@@ -1,28 +0,0 @@<br>
-From 8db2cf6353c13f2a84cbe49b689654<wbr>897906c499 Mon Sep 17 00:00:00 2001<br>
-From: kyukhin <kyukhin@138bc75d-0d04-0410-96<wbr>1f-82ee72b054a4><br>
-Date: Sat, 3 Sep 2016 10:57:05 +0000<br>
-Subject: [PATCH] gcc/ * ubsan.c (ubsan_use_new_style_p): Fix check for empty<br>
- string.<br>
-<br>
-git-svn-id: svn+ssh://<a href="http://gcc.gnu.org/svn/gcc/trunk@239971" rel="noreferrer" target="_blank">gcc.gnu.org/svn/gcc/<wbr>trunk@239971</a> 138bc75d-0d04-0410-961f-82ee72<wbr>b054a4<br>
-<br>
-Upstream-Status: Backport<br>
-Signed-off-by: Joshua Lock <<a href="mailto:joshua.g.lock@intel.com" target="_blank">joshua.g.lock@intel.com</a>><br>
-<br>
----<br>
- gcc/ubsan.c | 2 +-<br>
- 2 files changed, 5 insertions(+), 1 deletion(-)<br>
-<br>
-Index: gcc-6.3.0/gcc/ubsan.c<br>
-=============================<wbr>==============================<wbr>========<br>
---- gcc-6.3.0.orig/gcc/ubsan.c<br>
-+++ gcc-6.3.0/gcc/ubsan.c<br>
-@@ -1471,7 +1471,7 @@ ubsan_use_new_style_p (location_t loc)<br>
-<br>
- expanded_location xloc = expand_location (loc);<br>
- if (xloc.file == NULL || strncmp (xloc.file, "\1", 2) == 0<br>
-- || xloc.file == '\0' || xloc.file[0] == '\xff'<br>
-+ || xloc.file[0] == '\0' || xloc.file[0] == '\xff'<br>
- || xloc.file[1] == '\xff')<br>
- return false;<br>
-<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3.inc b/meta/recipes-devtools/gcc/gc<wbr>c-6.4.inc<br>
similarity index 81%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3.inc<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4.inc<br>
index 5c81a33..3514587 100644<br>
--- a/meta/recipes-devtools/gcc/gc<wbr>c-6.3.inc<br>
+++ b/meta/recipes-devtools/gcc/gc<wbr>c-6.4.inc<br>
@@ -2,13 +2,13 @@ require gcc-common.inc<br>
<br>
# Third digit in PV should be incremented after a minor release<br>
<br>
-PV = "6.3.0"<br>
+PV = "6.4.0"<br>
<br>
# BINV should be incremented to a revision after a minor gcc release<br>
<br>
-BINV = "6.3.0"<br>
+BINV = "6.4.0"<br>
<br>
-FILESEXTRAPATHS =. "${FILE_DIRNAME}/gcc-6.3:${FIL<wbr>E_DIRNAME}/gcc-6.3/backport:"<br>
+FILESEXTRAPATHS =. "${FILE_DIRNAME}/gcc-6.4:${FIL<wbr>E_DIRNAME}/gcc-6.4/backport:"<br>
<br>
DEPENDS =+ "mpfr gmp libmpc zlib"<br>
NATIVEDEPS = "mpfr-native gmp-native libmpc-native zlib-native"<br>
@@ -24,7 +24,7 @@ LIC_FILES_CHKSUM = "\<br>
"<br>
<br>
<br>
-BASEURI ?= "${GNU_MIRROR}/gcc/gcc-${PV}/g<wbr>cc-${PV}.tar.bz2"<br>
+BASEURI ?= "${GNU_MIRROR}/gcc/gcc-${PV}/g<wbr>cc-${PV}.tar.xz"<br>
#SRCREV = "bd9a826d5448db11d29d2ec5884e7<wbr>e679066f140"<br>
#BASEURI ?= "git://<a href="http://github.com/gcc-mirror/gcc;branch=gcc-6-branch;protocol=git" rel="noreferrer" target="_blank">github.com/gcc-mirror/g<wbr>cc;branch=gcc-6-branch;protoco<wbr>l=git</a>"<br>
#BASEURI ?= "<a href="ftp://sourceware.org/pub/gcc/snapshots/6.2.0-RC-20160815/gcc-6.2.0-RC-20160815.tar.bz2" rel="noreferrer" target="_blank">ftp://sourceware.org/pub/gcc/<wbr>snapshots/6.2.0-RC-20160815/gc<wbr>c-6.2.0-RC-20160815.tar.bz2</a>"<br>
@@ -85,10 +85,22 @@ SRC_URI = "\<br>
"<br>
BACKPORTS = "\<br>
file://CVE-2016-6131.patch \<br>
- file://ubsan-fix-check-empty-<wbr>string.patch \<br>
+ file://0001-i386-Move-struct-<wbr>ix86_frame-to-machine_function<wbr>.patch \<br>
+ file://0002-i386-Use-referenc<wbr>e-of-struct-ix86_frame-to-avoi<wbr>d-cop.patch \<br>
+ file://0003-i386-Use-const-re<wbr>ference-of-struct-ix86_frame-t<wbr>o-avo.patch \<br>
+ file://0004-x86-Add-mindirect<wbr>-branch.patch \<br>
+ file://0005-x86-Add-mfunction<wbr>-return.patch \<br>
+ file://0006-x86-Add-mindirect<wbr>-branch-register.patch \<br>
+ file://0007-x86-Add-V-registe<wbr>r-operand-modifier.patch \<br>
+ file://0008-x86-Disallow-mind<wbr>irect-branch-mfunction-return-<wbr>with-.patch \<br>
+ file://0009-Use-INVALID_REGNU<wbr>M-in-indirect-thunk-processing<wbr>.patch \<br>
+ file://0010-i386-Pass-INVALID<wbr>_REGNUM-as-invalid-register-<wbr>number.patch \<br>
+ file://0011-i386-Update-mfunc<wbr>tion-return-for-return-with-po<wbr>p.patch \<br>
+ file://0012-i386-Add-TARGET_I<wbr>NDIRECT_BRANCH_REGISTER.patch \<br>
"<br>
-SRC_URI[md5sum] = "677a7623c7ef6ab99881bc4e048de<wbr>bb6"<br>
-SRC_URI[sha256sum] = "f06ae7f3f790fbf0f018f6d40e844<wbr>451e6bc3b7bc96e128e63b09825c1f<wbr>8b29f"<br>
+<br>
+SRC_URI[md5sum] = "11ba51a0cfb8471927f387c8895fe<wbr>232"<br>
+SRC_URI[sha256sum] = "850bf21eafdfe5cd5f6827148184c<wbr>08c4a0852a37ccf36ce69855334d2c<wbr>914d4"<br>
<br>
S = "${TMPDIR}/work-shared/gcc-${P<wbr>V}-${PR}/gcc-${PV}"<br>
#S = "${TMPDIR}/work-shared/gcc-${P<wbr>V}-${PR}/git"<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0001-gcc-4.3.1-ARCH_FLAG<wbr>S_FOR_TARGET.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0001-gcc-4.3.1-ARCH_FLAG<wbr>S_FOR_TARGET.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0001-gcc-4.3.1-ARCH_FLAGS_<wbr>FOR_TARGET.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0001-gcc-4.3.1-ARCH_FLAGS_<wbr>FOR_TARGET.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0001-i386-Move-struct-ix<wbr>86_frame-to-machine_function.p<wbr>atch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0001-i386-Move-struct-ix<wbr>86_frame-to-machine_function.p<wbr>atch<br>
new file mode 100644<br>
index 0000000..3c2a8db<br>
--- /dev/null<br>
+++ b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0001-i386-Move-struct-ix<wbr>86_frame-to-machine_function.p<wbr>atch<br>
@@ -0,0 +1,244 @@<br>
+From c2c7775c5587dc59b6756162d390d8<wbr>9d60971a16 Mon Sep 17 00:00:00 2001<br>
+From: hjl <hjl@138bc75d-0d04-0410-961f-8<wbr>2ee72b054a4><br>
+Date: Mon, 15 Jan 2018 11:27:24 +0000<br>
+Subject: [PATCH 01/12] i386: Move struct ix86_frame to machine_function<br>
+<br>
+Make ix86_frame available to i386 code generation. This is needed to<br>
+backport the patch set of -mindirect-branch= to mitigate variant #2 of<br>
+the speculative execution vulnerabilities on x86 processors identified<br>
+by CVE-2017-5715, aka Spectre.<br>
+<br>
+ Backport from mainline<br>
+ 2017-06-01 Bernd Edlinger <<a href="mailto:bernd.edlinger@hotmail.de" target="_blank">bernd.edlinger@hotmail.de</a>><br>
+<br>
+ * config/i386/i386.c (ix86_frame): Moved to ...<br>
+ * config/i386/i386.h (ix86_frame): Here.<br>
+ (machine_function): Add frame.<br>
+ * config/i386/i386.c (ix86_compute_frame_layout): Repace the<br>
+ frame argument with &cfun->machine->frame.<br>
+ (ix86_can_use_return_insn_p): Don't pass &frame to<br>
+ ix86_compute_frame_layout. Copy frame from cfun->machine->frame.<br>
+ (ix86_can_eliminate): Likewise.<br>
+ (ix86_expand_prologue): Likewise.<br>
+ (ix86_expand_epilogue): Likewise.<br>
+ (ix86_expand_split_stack_prol<wbr>ogue): Likewise.<br>
+<br>
+<br>
+Upstream-Status: Pending<br>
+---<br>
+ gcc/config/i386/i386.c | 68 ++++++++++--------------------<wbr>--------------------<br>
+ gcc/config/i386/i386.h | 53 ++++++++++++++++++++++++++++++<wbr>++++++++-<br>
+ 2 files changed, 65 insertions(+), 56 deletions(-)<br>
+<br>
+diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c<br>
+index 8b5faac..a1ff32b 100644<br>
+--- a/gcc/config/i386/i386.c<br>
++++ b/gcc/config/i386/i386.c<br>
+@@ -2434,53 +2434,6 @@ struct GTY(()) stack_local_entry {<br>
+ struct stack_local_entry *next;<br>
+ };<br>
+<br>
+-/* Structure describing stack frame layout.<br>
+- Stack grows downward:<br>
+-<br>
+- [arguments]<br>
+- <- ARG_POINTER<br>
+- saved pc<br>
+-<br>
+- saved static chain if ix86_static_chain_on_stack<br>
+-<br>
+- saved frame pointer if frame_pointer_needed<br>
+- <- HARD_FRAME_POINTER<br>
+- [saved regs]<br>
+- <- regs_save_offset<br>
+- [padding0]<br>
+-<br>
+- [saved SSE regs]<br>
+- <- sse_regs_save_offset<br>
+- [padding1] |<br>
+- | <- FRAME_POINTER<br>
+- [va_arg registers] |<br>
+- |<br>
+- [frame] |<br>
+- |<br>
+- [padding2] | = to_allocate<br>
+- <- STACK_POINTER<br>
+- */<br>
+-struct ix86_frame<br>
+-{<br>
+- int nsseregs;<br>
+- int nregs;<br>
+- int va_arg_size;<br>
+- int red_zone_size;<br>
+- int outgoing_arguments_size;<br>
+-<br>
+- /* The offsets relative to ARG_POINTER. */<br>
+- HOST_WIDE_INT frame_pointer_offset;<br>
+- HOST_WIDE_INT hard_frame_pointer_offset;<br>
+- HOST_WIDE_INT stack_pointer_offset;<br>
+- HOST_WIDE_INT hfp_save_offset;<br>
+- HOST_WIDE_INT reg_save_offset;<br>
+- HOST_WIDE_INT sse_reg_save_offset;<br>
+-<br>
+- /* When save_regs_using_mov is set, emit prologue using<br>
+- move instead of push instructions. */<br>
+- bool save_regs_using_mov;<br>
+-};<br>
+-<br>
+ /* Which cpu are we scheduling for. */<br>
+ enum attr_cpu ix86_schedule;<br>
+<br>
+@@ -2572,7 +2525,7 @@ static unsigned int ix86_function_arg_boundary (machine_mode,<br>
+ const_tree);<br>
+ static rtx ix86_static_chain (const_tree, bool);<br>
+ static int ix86_function_regparm (const_tree, const_tree);<br>
+-static void ix86_compute_frame_layout (struct ix86_frame *);<br>
++static void ix86_compute_frame_layout (void);<br>
+ static bool ix86_expand_vector_init_one_no<wbr>nzero (bool, machine_mode,<br>
+ rtx, rtx, int);<br>
+ static void ix86_add_new_builtins (HOST_WIDE_INT);<br>
+@@ -10944,7 +10897,8 @@ ix86_can_use_return_insn_p (void)<br>
+ if (crtl->args.pops_args && crtl->args.size >= 32768)<br>
+ return 0;<br>
+<br>
+- ix86_compute_frame_layout (&frame);<br>
++ ix86_compute_frame_layout ();<br>
++ frame = cfun->machine->frame;<br>
+ return (frame.stack_pointer_offset == UNITS_PER_WORD<br>
+ && (frame.nregs + frame.nsseregs) == 0);<br>
+ }<br>
+@@ -11355,8 +11309,8 @@ ix86_can_eliminate (const int from, const int to)<br>
+ HOST_WIDE_INT<br>
+ ix86_initial_elimination_offse<wbr>t (int from, int to)<br>
+ {<br>
+- struct ix86_frame frame;<br>
+- ix86_compute_frame_layout (&frame);<br>
++ ix86_compute_frame_layout ();<br>
++ struct ix86_frame frame = cfun->machine->frame;<br>
+<br>
+ if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)<br>
+ return frame.hard_frame_pointer_offse<wbr>t;<br>
+@@ -11395,8 +11349,9 @@ ix86_builtin_setjmp_frame_valu<wbr>e (void)<br>
+ /* Fill structure ix86_frame about frame of currently computed function. */<br>
+<br>
+ static void<br>
+-ix86_compute_frame_layout (struct ix86_frame *frame)<br>
++ix86_compute_frame_layout (void)<br>
+ {<br>
++ struct ix86_frame *frame = &cfun->machine->frame;<br>
+ unsigned HOST_WIDE_INT stack_alignment_needed;<br>
+ HOST_WIDE_INT offset;<br>
+ unsigned HOST_WIDE_INT preferred_alignment;<br>
+@@ -12702,7 +12657,8 @@ ix86_expand_prologue (void)<br>
+ m->fs.sp_offset = INCOMING_FRAME_SP_OFFSET;<br>
+ m->fs.sp_valid = true;<br>
+<br>
+- ix86_compute_frame_layout (&frame);<br>
++ ix86_compute_frame_layout ();<br>
++ frame = m->frame;<br>
+<br>
+ if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl))<br>
+ {<br>
+@@ -13379,7 +13335,8 @@ ix86_expand_epilogue (int style)<br>
+ bool using_drap;<br>
+<br>
+ ix86_finalize_stack_realign_f<wbr>lags ();<br>
+- ix86_compute_frame_layout (&frame);<br>
++ ix86_compute_frame_layout ();<br>
++ frame = m->frame;<br>
+<br>
+ m->fs.sp_valid = (!frame_pointer_needed<br>
+ || (crtl->sp_is_unchanging<br>
+@@ -13876,7 +13833,8 @@ ix86_expand_split_stack_prolog<wbr>ue (void)<br>
+ gcc_assert (flag_split_stack && reload_completed);<br>
+<br>
+ ix86_finalize_stack_realign_f<wbr>lags ();<br>
+- ix86_compute_frame_layout (&frame);<br>
++ ix86_compute_frame_layout ();<br>
++ frame = cfun->machine->frame;<br>
+ allocate = frame.stack_pointer_offset - INCOMING_FRAME_SP_OFFSET;<br>
+<br>
+ /* This is the label we will branch to if we have enough stack<br>
+diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h<br>
+index 8113f83..5414416 100644<br>
+--- a/gcc/config/i386/i386.h<br>
++++ b/gcc/config/i386/i386.h<br>
+@@ -2427,9 +2427,56 @@ enum avx_u128_state<br>
+<br>
+ #define FASTCALL_PREFIX '@'<br>
+<br>
++#ifndef USED_FOR_TARGET<br>
++/* Structure describing stack frame layout.<br>
++ Stack grows downward:<br>
++<br>
++ [arguments]<br>
++ <- ARG_POINTER<br>
++ saved pc<br>
++<br>
++ saved static chain if ix86_static_chain_on_stack<br>
++<br>
++ saved frame pointer if frame_pointer_needed<br>
++ <- HARD_FRAME_POINTER<br>
++ [saved regs]<br>
++ <- regs_save_offset<br>
++ [padding0]<br>
++<br>
++ [saved SSE regs]<br>
++ <- sse_regs_save_offset<br>
++ [padding1] |<br>
++ | <- FRAME_POINTER<br>
++ [va_arg registers] |<br>
++ |<br>
++ [frame] |<br>
++ |<br>
++ [padding2] | = to_allocate<br>
++ <- STACK_POINTER<br>
++ */<br>
++struct GTY(()) ix86_frame<br>
++{<br>
++ int nsseregs;<br>
++ int nregs;<br>
++ int va_arg_size;<br>
++ int red_zone_size;<br>
++ int outgoing_arguments_size;<br>
++<br>
++ /* The offsets relative to ARG_POINTER. */<br>
++ HOST_WIDE_INT frame_pointer_offset;<br>
++ HOST_WIDE_INT hard_frame_pointer_offset;<br>
++ HOST_WIDE_INT stack_pointer_offset;<br>
++ HOST_WIDE_INT hfp_save_offset;<br>
++ HOST_WIDE_INT reg_save_offset;<br>
++ HOST_WIDE_INT sse_reg_save_offset;<br>
++<br>
++ /* When save_regs_using_mov is set, emit prologue using<br>
++ move instead of push instructions. */<br>
++ bool save_regs_using_mov;<br>
++};<br>
++<br>
+ /* Machine specific frame tracking during prologue/epilogue generation. */<br>
+<br>
+-#ifndef USED_FOR_TARGET<br>
+ struct GTY(()) machine_frame_state<br>
+ {<br>
+ /* This pair tracks the currently active CFA as reg+offset. When reg<br>
+@@ -2475,6 +2522,9 @@ struct GTY(()) machine_function {<br>
+ int varargs_fpr_size;<br>
+ int optimize_mode_switching[MAX_38<wbr>6_ENTITIES];<br>
+<br>
++ /* Cached initial frame layout for the current function. */<br>
++ struct ix86_frame frame;<br>
++<br>
+ /* Number of saved registers USE_FAST_PROLOGUE_EPILOGUE<br>
+ has been computed for. */<br>
+ int use_fast_prologue_epilogue_nre<wbr>gs;<br>
+@@ -2554,6 +2604,7 @@ struct GTY(()) machine_function {<br>
+ #define ix86_current_function_calls_tl<wbr>s_descriptor \<br>
+ (ix86_tls_descriptor_calls_ex<wbr>panded_in_cfun && df_regs_ever_live_p (SP_REG))<br>
+ #define ix86_static_chain_on_stack (cfun->machine->static_chain_o<wbr>n_stack)<br>
++#define ix86_red_zone_size (cfun->machine->frame.red_zone<wbr>_size)<br>
+<br>
+ /* Control behavior of x86_file_start. */<br>
+ #define X86_FILE_START_VERSION_DIRECTI<wbr>VE false<br>
+--<br>
+2.7.4<br>
+<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0002-i386-Use-reference-<wbr>of-struct-ix86_frame-to-avoid-<wbr>cop.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0002-i386-Use-reference-<wbr>of-struct-ix86_frame-to-avoid-<wbr>cop.patch<br>
new file mode 100644<br>
index 0000000..156a0a3<br>
--- /dev/null<br>
+++ b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0002-i386-Use-reference-<wbr>of-struct-ix86_frame-to-avoid-<wbr>cop.patch<br>
@@ -0,0 +1,71 @@<br>
+From fe2b3be3f4b6ec6b3a6f89c26016a3<wbr>983b7cb351 Mon Sep 17 00:00:00 2001<br>
+From: hjl <hjl@138bc75d-0d04-0410-961f-8<wbr>2ee72b054a4><br>
+Date: Mon, 15 Jan 2018 11:28:44 +0000<br>
+Subject: [PATCH 02/12] i386: Use reference of struct ix86_frame to avoid copy<br>
+<br>
+When there is no need to make a copy of ix86_frame, we can use reference<br>
+of struct ix86_frame to avoid copy.<br>
+<br>
+ Backport from mainline<br>
+ 2017-11-06 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ * config/i386/i386.c (ix86_can_use_return_insn_p): Use reference<br>
+ of struct ix86_frame.<br>
+ (ix86_initial_elimination_off<wbr>set): Likewise.<br>
+ (ix86_expand_split_stack_prol<wbr>ogue): Likewise.<br>
+<br>
+Upstream-Status: Pending<br>
+---<br>
+ gcc/config/i386/i386.c | 8 +++-----<br>
+ 1 file changed, 3 insertions(+), 5 deletions(-)<br>
+<br>
+diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c<br>
+index a1ff32b..13ebf10 100644<br>
+--- a/gcc/config/i386/i386.c<br>
++++ b/gcc/config/i386/i386.c<br>
+@@ -10887,7 +10887,6 @@ symbolic_reference_mentioned_p (rtx op)<br>
+ bool<br>
+ ix86_can_use_return_insn_p (void)<br>
+ {<br>
+- struct ix86_frame frame;<br>
+<br>
+ if (! reload_completed || frame_pointer_needed)<br>
+ return 0;<br>
+@@ -10898,7 +10897,7 @@ ix86_can_use_return_insn_p (void)<br>
+ return 0;<br>
+<br>
+ ix86_compute_frame_layout ();<br>
+- frame = cfun->machine->frame;<br>
++ struct ix86_frame &frame = cfun->machine->frame;<br>
+ return (frame.stack_pointer_offset == UNITS_PER_WORD<br>
+ && (frame.nregs + frame.nsseregs) == 0);<br>
+ }<br>
+@@ -11310,7 +11309,7 @@ HOST_WIDE_INT<br>
+ ix86_initial_elimination_offse<wbr>t (int from, int to)<br>
+ {<br>
+ ix86_compute_frame_layout ();<br>
+- struct ix86_frame frame = cfun->machine->frame;<br>
++ struct ix86_frame &frame = cfun->machine->frame;<br>
+<br>
+ if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)<br>
+ return frame.hard_frame_pointer_offse<wbr>t;<br>
+@@ -13821,7 +13820,6 @@ static GTY(()) rtx split_stack_fn_large;<br>
+ void<br>
+ ix86_expand_split_stack_prolog<wbr>ue (void)<br>
+ {<br>
+- struct ix86_frame frame;<br>
+ HOST_WIDE_INT allocate;<br>
+ unsigned HOST_WIDE_INT args_size;<br>
+ rtx_code_label *label;<br>
+@@ -13834,7 +13832,7 @@ ix86_expand_split_stack_prolog<wbr>ue (void)<br>
+<br>
+ ix86_finalize_stack_realign_f<wbr>lags ();<br>
+ ix86_compute_frame_layout ();<br>
+- frame = cfun->machine->frame;<br>
++ struct ix86_frame &frame = cfun->machine->frame;<br>
+ allocate = frame.stack_pointer_offset - INCOMING_FRAME_SP_OFFSET;<br>
+<br>
+ /* This is the label we will branch to if we have enough stack<br>
+--<br>
+2.7.4<br>
+<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0002-uclibc-conf.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0002-uclibc-conf.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0002-uclibc-conf.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0002-uclibc-conf.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0003-gcc-uclibc-locale-c<wbr>type_touplow_t.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0003-gcc-uclibc-locale-c<wbr>type_touplow_t.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0003-gcc-uclibc-locale-cty<wbr>pe_touplow_t.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0003-gcc-uclibc-locale-cty<wbr>pe_touplow_t.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0003-i386-Use-const-refe<wbr>rence-of-struct-ix86_frame-to-<wbr>avo.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0003-i386-Use-const-refe<wbr>rence-of-struct-ix86_frame-to-<wbr>avo.patch<br>
new file mode 100644<br>
index 0000000..9cb0a41<br>
--- /dev/null<br>
+++ b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0003-i386-Use-const-refe<wbr>rence-of-struct-ix86_frame-to-<wbr>avo.patch<br>
@@ -0,0 +1,128 @@<br>
+From 82243732dc63e9b90396a5ae4ad99c<wbr>a36af81355 Mon Sep 17 00:00:00 2001<br>
+From: hjl <hjl@138bc75d-0d04-0410-961f-8<wbr>2ee72b054a4><br>
+Date: Sat, 27 Jan 2018 13:10:24 +0000<br>
+Subject: [PATCH 03/12] i386: Use const reference of struct ix86_frame to avoid<br>
+ copy<br>
+<br>
+We can use const reference of struct ix86_frame to avoid making a local<br>
+copy of ix86_frame. ix86_expand_epilogue makes a local copy of struct<br>
+ix86_frame and uses the reg_save_offset field as a local variable. This<br>
+patch uses a separate local variable for reg_save_offset.<br>
+<br>
+Tested on x86-64 with ada.<br>
+<br>
+ Backport from mainline<br>
+ PR target/83905<br>
+ * config/i386/i386.c (ix86_expand_prologue): Use cost reference<br>
+ of struct ix86_frame.<br>
+ (ix86_expand_epilogue): Likewise. Add a local variable for<br>
+ the reg_save_offset field in struct ix86_frame.<br>
+<br>
+git-svn-id: svn+ssh://<a href="http://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@257123" rel="noreferrer" target="_blank">gcc.gnu.org/svn/gcc/<wbr>branches/gcc-7-branch@257123</a> 138bc75d-0d04-0410-961f-82ee72<wbr>b054a4<br>
+<br>
+Upstream-Status: Pending<br>
+---<br>
+ gcc/config/i386/i386.c | 24 ++++++++++++------------<br>
+ 1 file changed, 12 insertions(+), 12 deletions(-)<br>
+<br>
+diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c<br>
+index 13ebf10..6c98f75 100644<br>
+--- a/gcc/config/i386/i386.c<br>
++++ b/gcc/config/i386/i386.c<br>
+@@ -12633,7 +12633,6 @@ ix86_expand_prologue (void)<br>
+ {<br>
+ struct machine_function *m = cfun->machine;<br>
+ rtx insn, t;<br>
+- struct ix86_frame frame;<br>
+ HOST_WIDE_INT allocate;<br>
+ bool int_registers_saved;<br>
+ bool sse_registers_saved;<br>
+@@ -12657,7 +12656,7 @@ ix86_expand_prologue (void)<br>
+ m->fs.sp_valid = true;<br>
+<br>
+ ix86_compute_frame_layout ();<br>
+- frame = m->frame;<br>
++ const struct ix86_frame &frame = cfun->machine->frame;<br>
+<br>
+ if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl))<br>
+ {<br>
+@@ -13329,13 +13328,12 @@ ix86_expand_epilogue (int style)<br>
+ {<br>
+ struct machine_function *m = cfun->machine;<br>
+ struct machine_frame_state frame_state_save = m->fs;<br>
+- struct ix86_frame frame;<br>
+ bool restore_regs_via_mov;<br>
+ bool using_drap;<br>
+<br>
+ ix86_finalize_stack_realign_f<wbr>lags ();<br>
+ ix86_compute_frame_layout ();<br>
+- frame = m->frame;<br>
++ const struct ix86_frame &frame = cfun->machine->frame;<br>
+<br>
+ m->fs.sp_valid = (!frame_pointer_needed<br>
+ || (crtl->sp_is_unchanging<br>
+@@ -13377,11 +13375,13 @@ ix86_expand_epilogue (int style)<br>
+ + UNITS_PER_WORD);<br>
+ }<br>
+<br>
++ HOST_WIDE_INT reg_save_offset = frame.reg_save_offset;<br>
++<br>
+ /* Special care must be taken for the normal return case of a function<br>
+ using eh_return: the eax and edx registers are marked as saved, but<br>
+ not restored along this path. Adjust the save location to match. */<br>
+ if (crtl->calls_eh_return && style != 2)<br>
+- frame.reg_save_offset -= 2 * UNITS_PER_WORD;<br>
++ reg_save_offset -= 2 * UNITS_PER_WORD;<br>
+<br>
+ /* EH_RETURN requires the use of moves to function properly. */<br>
+ if (crtl->calls_eh_return)<br>
+@@ -13397,11 +13397,11 @@ ix86_expand_epilogue (int style)<br>
+ else if (TARGET_EPILOGUE_USING_MOVE<br>
+ && cfun->machine->use_fast_prolog<wbr>ue_epilogue<br>
+ && (frame.nregs > 1<br>
+- || m->fs.sp_offset != frame.reg_save_offset))<br>
++ || m->fs.sp_offset != reg_save_offset))<br>
+ restore_regs_via_mov = true;<br>
+ else if (frame_pointer_needed<br>
+ && !frame.nregs<br>
+- && m->fs.sp_offset != frame.reg_save_offset)<br>
++ && m->fs.sp_offset != reg_save_offset)<br>
+ restore_regs_via_mov = true;<br>
+ else if (frame_pointer_needed<br>
+ && TARGET_USE_LEAVE<br>
+@@ -13439,7 +13439,7 @@ ix86_expand_epilogue (int style)<br>
+ rtx t;<br>
+<br>
+ if (frame.nregs)<br>
+- ix86_emit_restore_regs_using_m<wbr>ov (frame.reg_save_offset, style == 2);<br>
++ ix86_emit_restore_regs_using_m<wbr>ov (reg_save_offset, style == 2);<br>
+<br>
+ /* eh_return epilogues need %ecx added to the stack pointer. */<br>
+ if (style == 2)<br>
+@@ -13529,19 +13529,19 @@ ix86_expand_epilogue (int style)<br>
+ epilogues. */<br>
+ if (!m->fs.sp_valid<br>
+ || (TARGET_SEH<br>
+- && (m->fs.sp_offset - frame.reg_save_offset<br>
++ && (m->fs.sp_offset - reg_save_offset<br>
+ >= SEH_MAX_FRAME_SIZE)))<br>
+ {<br>
+ pro_epilogue_adjust_stack (stack_pointer_rtx, hard_frame_pointer_rtx,<br>
+ GEN_INT (m->fs.fp_offset<br>
+- - frame.reg_save_offset),<br>
++ - reg_save_offset),<br>
+ style, false);<br>
+ }<br>
+- else if (m->fs.sp_offset != frame.reg_save_offset)<br>
++ else if (m->fs.sp_offset != reg_save_offset)<br>
+ {<br>
+ pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,<br>
+ GEN_INT (m->fs.sp_offset<br>
+- - frame.reg_save_offset),<br>
++ - reg_save_offset),<br>
+ style,<br>
+ m->fs.cfa_reg == stack_pointer_rtx);<br>
+ }<br>
+--<br>
+2.7.4<br>
+<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0004-uclibc-locale.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0004-uclibc-locale.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0004-uclibc-locale.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0004-uclibc-locale.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0004-x86-Add-mindirect-b<wbr>ranch.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0004-x86-Add-mindirect-b<wbr>ranch.patch<br>
new file mode 100644<br>
index 0000000..9a9b4e9<br>
--- /dev/null<br>
+++ b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0004-x86-Add-mindirect-b<wbr>ranch.patch<br>
@@ -0,0 +1,2151 @@<br>
+From 6140c2c0bb2b61e69d0da84315e043<wbr>3ff3520aaa Mon Sep 17 00:00:00 2001<br>
+From: "H.J. Lu" <<a href="mailto:hjl.tools@gmail.com" target="_blank">hjl.tools@gmail.com</a>><br>
+Date: Sat, 6 Jan 2018 22:29:55 -0800<br>
+Subject: [PATCH 04/12] x86: Add -mindirect-branch=<br>
+<br>
+Add -mindirect-branch= option to convert indirect call and jump to call<br>
+and return thunks. The default is 'keep', which keeps indirect call and<br>
+jump unmodified. 'thunk' converts indirect call and jump to call and<br>
+return thunk. 'thunk-inline' converts indirect call and jump to inlined<br>
+call and return thunk. 'thunk-extern' converts indirect call and jump to<br>
+external call and return thunk provided in a separate object file. You<br>
+can control this behavior for a specific function by using the function<br>
+attribute indirect_branch.<br>
+<br>
+2 kinds of thunks are geneated. Memory thunk where the function address<br>
+is at the top of the stack:<br>
+<br>
+__x86_indirect_thunk:<br>
+ call L2<br>
+L1:<br>
+ pause<br>
+ lfence<br>
+ jmp L1<br>
+L2:<br>
+ lea 8(%rsp), %rsp|lea 4(%esp), %esp<br>
+ ret<br>
+<br>
+Indirect jmp via memory, "jmp mem", is converted to<br>
+<br>
+ push memory<br>
+ jmp __x86_indirect_thunk<br>
+<br>
+Indirect call via memory, "call mem", is converted to<br>
+<br>
+ jmp L2<br>
+L1:<br>
+ push [mem]<br>
+ jmp __x86_indirect_thunk<br>
+L2:<br>
+ call L1<br>
+<br>
+Register thunk where the function address is in a register, reg:<br>
+<br>
+__x86_indirect_thunk_reg:<br>
+ call L2<br>
+L1:<br>
+ pause<br>
+ lfence<br>
+ jmp L1<br>
+L2:<br>
+ movq %reg, (%rsp)|movl %reg, (%esp)<br>
+ ret<br>
+<br>
+where reg is one of (r|e)ax, (r|e)dx, (r|e)cx, (r|e)bx, (r|e)si, (r|e)di,<br>
+(r|e)bp, r8, r9, r10, r11, r12, r13, r14 and r15.<br>
+<br>
+Indirect jmp via register, "jmp reg", is converted to<br>
+<br>
+ jmp __x86_indirect_thunk_reg<br>
+<br>
+Indirect call via register, "call reg", is converted to<br>
+<br>
+ call __x86_indirect_thunk_reg<br>
+<br>
+gcc/<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-14 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ * config/i386/i386-opts.h (indirect_branch): New.<br>
+ * config/i386/i386-protos.h (ix86_output_indirect_jmp): Likewise.<br>
+ * config/i386/i386.c (ix86_using_red_zone): Disallow red-zone<br>
+ with local indirect jump when converting indirect call and jump.<br>
+ (ix86_set_indirect_branch_typ<wbr>e): New.<br>
+ (ix86_set_current_function): Call ix86_set_indirect_branch_type.<br>
+ (indirectlabelno): New.<br>
+ (indirect_thunk_needed): Likewise.<br>
+ (indirect_thunk_bnd_needed): Likewise.<br>
+ (indirect_thunks_used): Likewise.<br>
+ (indirect_thunks_bnd_used): Likewise.<br>
+ (INDIRECT_LABEL): Likewise.<br>
+ (indirect_thunk_name): Likewise.<br>
+ (output_indirect_thunk): Likewise.<br>
+ (output_indirect_thunk_functi<wbr>on): Likewise.<br>
+ (ix86_output_indirect_branch_<wbr>via_reg): Likewise.<br>
+ (ix86_output_indirect_branch_<wbr>via_push): Likewise.<br>
+ (ix86_output_indirect_branch)<wbr>: Likewise.<br>
+ (ix86_output_indirect_jmp): Likewise.<br>
+ (ix86_code_end): Call output_indirect_thunk_function if needed.<br>
+ (ix86_output_call_insn): Call ix86_output_indirect_branch if<br>
+ needed.<br>
+ (ix86_handle_fndecl_attribute<wbr>): Handle indirect_branch.<br>
+ (ix86_attribute_table): Add indirect_branch.<br>
+ * config/i386/i386.h (machine_function): Add indirect_branch_type<br>
+ and has_local_indirect_jump.<br>
+ * config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> (indirect_jump): Set has_local_indirect_jump<br>
+ to true.<br>
+ (tablejump): Likewise.<br>
+ (*indirect_jump): Use ix86_output_indirect_jmp.<br>
+ (*tablejump_1): Likewise.<br>
+ (simple_return_indirect_inter<wbr>nal): Likewise.<br>
+ * config/i386/i386.opt (mindirect-branch=): New option.<br>
+ (indirect_branch): New.<br>
+ (keep): Likewise.<br>
+ (thunk): Likewise.<br>
+ (thunk-inline): Likewise.<br>
+ (thunk-extern): Likewise.<br>
+ * doc/extend.texi: Document indirect_branch function attribute.<br>
+ * doc/invoke.texi: Document -mindirect-branch= option.<br>
+<br>
+gcc/testsuite/<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-14 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ * gcc.target/i386/indirect-thunk<wbr>-1.c: New test.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-7.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-7.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-8.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-bnd-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-bnd-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-bnd-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-bnd-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-7.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-7.c: Likewise.<br>
+<br>
+Upstream-Status: Pending<br>
+---<br>
+ gcc/config/i386/i386-opts.h | 13 +<br>
+ gcc/config/i386/i386-protos.h | 1 +<br>
+ gcc/config/i386/i386.c | 639 ++++++++++++++++++++-<br>
+ gcc/config/i386/i386.h | 7 +<br>
+ gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> | 26 +-<br>
+ gcc/config/i386/i386.opt | 20 +<br>
+ gcc/doc/extend.texi | 10 +<br>
+ gcc/doc/invoke.texi | 13 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-1.c | 20 +<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-2.c | 20 +<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-3.c | 21 +<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-4.c | 21 +<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-5.c | 17 +<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-6.c | 18 +<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-7.c | 44 ++<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-1.c | 23 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-2.c | 21 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-3.c | 23 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-4.c | 22 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-5.c | 22 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-6.c | 21 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-7.c | 44 ++<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-8.c | 42 ++<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-bnd-1.c | 20 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-bnd-2.c | 21 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-bnd-3.c | 19 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-bnd-4.c | 20 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-1.c | 19 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-2.c | 19 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-3.c | 20 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-4.c | 20 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-5.c | 16 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-6.c | 17 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-7.c | 43 ++<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-1.c | 20 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-2.c | 20 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-3.c | 21 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-4.c | 21 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-5.c | 17 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-6.c | 18 +<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-7.c | 44 ++<br>
+ 41 files changed, 1486 insertions(+), 17 deletions(-)<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-1.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-2.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-3.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-4.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-5.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-6.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-7.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-attr-1.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-attr-2.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-attr-3.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-attr-4.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-attr-5.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-attr-6.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-attr-7.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-attr-8.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-bnd-1.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-bnd-2.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-bnd-3.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-bnd-4.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-extern-1.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-extern-2.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-extern-3.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-extern-4.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-extern-5.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-extern-6.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-extern-7.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-inline-1.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-inline-2.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-inline-3.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-inline-4.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-inline-5.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-inline-6.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-inline-7.c<br>
+<br>
+diff --git a/gcc/config/i386/i386-opts.h b/gcc/config/i386/i386-opts.h<br>
+index b7f92e3..cc21152 100644<br>
+--- a/gcc/config/i386/i386-opts.h<br>
++++ b/gcc/config/i386/i386-opts.h<br>
+@@ -99,4 +99,17 @@ enum stack_protector_guard {<br>
+ SSP_GLOBAL /* global canary */<br>
+ };<br>
+<br>
++/* This is used to mitigate variant #2 of the speculative execution<br>
++ vulnerabilities on x86 processors identified by CVE-2017-5715, aka<br>
++ Spectre. They convert indirect branches and function returns to<br>
++ call and return thunks to avoid speculative execution via indirect<br>
++ call, jmp and ret. */<br>
++enum indirect_branch {<br>
++ indirect_branch_unset = 0,<br>
++ indirect_branch_keep,<br>
++ indirect_branch_thunk,<br>
++ indirect_branch_thunk_inline,<br>
++ indirect_branch_thunk_extern<br>
++};<br>
++<br>
+ #endif<br>
+diff --git a/gcc/config/i386/i386-protos.<wbr>h b/gcc/config/i386/i386-protos.<wbr>h<br>
+index ff47bc1..eca4cbf 100644<br>
+--- a/gcc/config/i386/i386-protos.<wbr>h<br>
++++ b/gcc/config/i386/i386-protos.<wbr>h<br>
+@@ -311,6 +311,7 @@ extern enum attr_cpu ix86_schedule;<br>
+ #endif<br>
+<br>
+ extern const char * ix86_output_call_insn (rtx_insn *insn, rtx call_op);<br>
++extern const char * ix86_output_indirect_jmp (rtx call_op, bool ret_p);<br>
+ extern bool ix86_operands_ok_for_move_mult<wbr>iple (rtx *operands, bool load,<br>
+ enum machine_mode mode);<br>
+<br>
+diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c<br>
+index 6c98f75..0b9fc4d 100644<br>
+--- a/gcc/config/i386/i386.c<br>
++++ b/gcc/config/i386/i386.c<br>
+@@ -3662,12 +3662,23 @@ make_pass_stv (gcc::context *ctxt)<br>
+ return new pass_stv (ctxt);<br>
+ }<br>
+<br>
+-/* Return true if a red-zone is in use. */<br>
++/* Return true if a red-zone is in use. We can't use red-zone when<br>
++ there are local indirect jumps, like "indirect_jump" or "tablejump",<br>
++ which jumps to another place in the function, since "call" in the<br>
++ indirect thunk pushes the return address onto stack, destroying<br>
++ red-zone.<br>
++<br>
++ TODO: If we can reserve the first 2 WORDs, for PUSH and, another<br>
++ for CALL, in red-zone, we can allow local indirect jumps with<br>
++ indirect thunk. */<br>
+<br>
+ bool<br>
+ ix86_using_red_zone (void)<br>
+ {<br>
+- return TARGET_RED_ZONE && !TARGET_64BIT_MS_ABI;<br>
++ return (TARGET_RED_ZONE<br>
++ && !TARGET_64BIT_MS_ABI<br>
++ && (!cfun->machine->has_local_ind<wbr>irect_jump<br>
++ || cfun->machine->indirect_branch<wbr>_type == indirect_branch_keep));<br>
+ }<br>
+<br>
+ /* Return a string that documents the current -m options. The caller is<br>
+@@ -6350,6 +6361,37 @@ ix86_reset_previous_fndecl (void)<br>
+ ix86_previous_fndecl = NULL_TREE;<br>
+ }<br>
+<br>
++/* Set the indirect_branch_type field from the function FNDECL. */<br>
++<br>
++static void<br>
++ix86_set_indirect_branch_typ<wbr>e (tree fndecl)<br>
++{<br>
++ if (cfun->machine->indirect_branc<wbr>h_type == indirect_branch_unset)<br>
++ {<br>
++ tree attr = lookup_attribute ("indirect_branch",<br>
++ DECL_ATTRIBUTES (fndecl));<br>
++ if (attr != NULL)<br>
++ {<br>
++ tree args = TREE_VALUE (attr);<br>
++ if (args == NULL)<br>
++ gcc_unreachable ();<br>
++ tree cst = TREE_VALUE (args);<br>
++ if (strcmp (TREE_STRING_POINTER (cst), "keep") == 0)<br>
++ cfun->machine->indirect_branch<wbr>_type = indirect_branch_keep;<br>
++ else if (strcmp (TREE_STRING_POINTER (cst), "thunk") == 0)<br>
++ cfun->machine->indirect_branch<wbr>_type = indirect_branch_thunk;<br>
++ else if (strcmp (TREE_STRING_POINTER (cst), "thunk-inline") == 0)<br>
++ cfun->machine->indirect_branch<wbr>_type = indirect_branch_thunk_inline;<br>
++ else if (strcmp (TREE_STRING_POINTER (cst), "thunk-extern") == 0)<br>
++ cfun->machine->indirect_branch<wbr>_type = indirect_branch_thunk_extern;<br>
++ else<br>
++ gcc_unreachable ();<br>
++ }<br>
++ else<br>
++ cfun->machine->indirect_branch<wbr>_type = ix86_indirect_branch;<br>
++ }<br>
++}<br>
++<br>
+ /* Establish appropriate back-end context for processing the function<br>
+ FNDECL. The argument might be NULL to indicate processing at top<br>
+ level, outside of any function scope. */<br>
+@@ -6360,7 +6402,13 @@ ix86_set_current_function (tree fndecl)<br>
+ several times in the course of compiling a function, and we don't want to<br>
+ slow things down too much or call target_reinit when it isn't safe. */<br>
+ if (fndecl == ix86_previous_fndecl)<br>
+- return;<br>
++ {<br>
++ /* There may be 2 function bodies for the same function FNDECL,<br>
++ one is extern inline and one isn't. */<br>
++ if (fndecl != NULL_TREE)<br>
++ ix86_set_indirect_branch_type (fndecl);<br>
++ return;<br>
++ }<br>
+<br>
+ tree old_tree;<br>
+ if (ix86_previous_fndecl == NULL_TREE)<br>
+@@ -6377,6 +6425,8 @@ ix86_set_current_function (tree fndecl)<br>
+ return;<br>
+ }<br>
+<br>
++ ix86_set_indirect_branch_type (fndecl);<br>
++<br>
+ tree new_tree = DECL_FUNCTION_SPECIFIC_TARGET (fndecl);<br>
+ if (new_tree == NULL_TREE)<br>
+ new_tree = target_option_default_node;<br>
+@@ -10962,6 +11012,220 @@ ix86_setup_frame_addresses (void)<br>
+ # endif<br>
+ #endif<br>
+<br>
++/* Label count for call and return thunks. It is used to make unique<br>
++ labels in call and return thunks. */<br>
++static int indirectlabelno;<br>
++<br>
++/* True if call and return thunk functions are needed. */<br>
++static bool indirect_thunk_needed = false;<br>
++/* True if call and return thunk functions with the BND prefix are<br>
++ needed. */<br>
++static bool indirect_thunk_bnd_needed = false;<br>
++<br>
++/* Bit masks of integer registers, which contain branch target, used<br>
++ by call and return thunks functions. */<br>
++static int indirect_thunks_used;<br>
++/* Bit masks of integer registers, which contain branch target, used<br>
++ by call and return thunks functions with the BND prefix. */<br>
++static int indirect_thunks_bnd_used;<br>
++<br>
++#ifndef INDIRECT_LABEL<br>
++# define INDIRECT_LABEL "LIND"<br>
++#endif<br>
++<br>
++/* Fills in the label name that should be used for the indirect thunk. */<br>
++<br>
++static void<br>
++indirect_thunk_name (char name[32], int regno, bool need_bnd_p)<br>
++{<br>
++ if (USE_HIDDEN_LINKONCE)<br>
++ {<br>
++ const char *bnd = need_bnd_p ? "_bnd" : "";<br>
++ if (regno >= 0)<br>
++ {<br>
++ const char *reg_prefix;<br>
++ if (LEGACY_INT_REGNO_P (regno))<br>
++ reg_prefix = TARGET_64BIT ? "r" : "e";<br>
++ else<br>
++ reg_prefix = "";<br>
++ sprintf (name, "__x86_indirect_thunk%s_%s%s",<br>
++ bnd, reg_prefix, reg_names[regno]);<br>
++ }<br>
++ else<br>
++ sprintf (name, "__x86_indirect_thunk%s", bnd);<br>
++ }<br>
++ else<br>
++ {<br>
++ if (regno >= 0)<br>
++ {<br>
++ if (need_bnd_p)<br>
++ ASM_GENERATE_INTERNAL_LABEL (name, "LITBR", regno);<br>
++ else<br>
++ ASM_GENERATE_INTERNAL_LABEL (name, "LITR", regno);<br>
++ }<br>
++ else<br>
++ {<br>
++ if (need_bnd_p)<br>
++ ASM_GENERATE_INTERNAL_LABEL (name, "LITB", 0);<br>
++ else<br>
++ ASM_GENERATE_INTERNAL_LABEL (name, "LIT", 0);<br>
++ }<br>
++ }<br>
++}<br>
++<br>
++/* Output a call and return thunk for indirect branch. If BND_P is<br>
++ true, the BND prefix is needed. If REGNO != -1, the function<br>
++ address is in REGNO and the call and return thunk looks like:<br>
++<br>
++ call L2<br>
++ L1:<br>
++ pause<br>
++ jmp L1<br>
++ L2:<br>
++ mov %REG, (%sp)<br>
++ ret<br>
++<br>
++ Otherwise, the function address is on the top of stack and the<br>
++ call and return thunk looks like:<br>
++<br>
++ call L2<br>
++ L1:<br>
++ pause<br>
++ jmp L1<br>
++ L2:<br>
++ lea WORD_SIZE(%sp), %sp<br>
++ ret<br>
++ */<br>
++<br>
++static void<br>
++output_indirect_thunk (bool need_bnd_p, int regno)<br>
++{<br>
++ char indirectlabel1[32];<br>
++ char indirectlabel2[32];<br>
++<br>
++ ASM_GENERATE_INTERNAL_LABEL (indirectlabel1, INDIRECT_LABEL,<br>
++ indirectlabelno++);<br>
++ ASM_GENERATE_INTERNAL_LABEL (indirectlabel2, INDIRECT_LABEL,<br>
++ indirectlabelno++);<br>
++<br>
++ /* Call */<br>
++ if (need_bnd_p)<br>
++ fputs ("\tbnd call\t", asm_out_file);<br>
++ else<br>
++ fputs ("\tcall\t", asm_out_file);<br>
++ assemble_name_raw (asm_out_file, indirectlabel2);<br>
++ fputc ('\n', asm_out_file);<br>
++<br>
++ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel1);<br>
++<br>
++ /* Pause + lfence. */<br>
++ fprintf (asm_out_file, "\tpause\n\tlfence\n");<br>
++<br>
++ /* Jump. */<br>
++ fputs ("\tjmp\t", asm_out_file);<br>
++ assemble_name_raw (asm_out_file, indirectlabel1);<br>
++ fputc ('\n', asm_out_file);<br>
++<br>
++ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2);<br>
++<br>
++ if (regno >= 0)<br>
++ {<br>
++ /* MOV. */<br>
++ rtx xops[2];<br>
++ xops[0] = gen_rtx_MEM (word_mode, stack_pointer_rtx);<br>
++ xops[1] = gen_rtx_REG (word_mode, regno);<br>
++ output_asm_insn ("mov\t{%1, %0|%0, %1}", xops);<br>
++ }<br>
++ else<br>
++ {<br>
++ /* LEA. */<br>
++ rtx xops[2];<br>
++ xops[0] = stack_pointer_rtx;<br>
++ xops[1] = plus_constant (Pmode, stack_pointer_rtx, UNITS_PER_WORD);<br>
++ output_asm_insn ("lea\t{%E1, %0|%0, %E1}", xops);<br>
++ }<br>
++<br>
++ if (need_bnd_p)<br>
++ fputs ("\tbnd ret\n", asm_out_file);<br>
++ else<br>
++ fputs ("\tret\n", asm_out_file);<br>
++}<br>
++<br>
++/* Output a funtion with a call and return thunk for indirect branch.<br>
++ If BND_P is true, the BND prefix is needed. If REGNO != -1, the<br>
++ function address is in REGNO. Otherwise, the function address is<br>
++ on the top of stack. */<br>
++<br>
++static void<br>
++output_indirect_thunk_functi<wbr>on (bool need_bnd_p, int regno)<br>
++{<br>
++ char name[32];<br>
++ tree decl;<br>
++<br>
++ /* Create __x86_indirect_thunk/__x86_ind<wbr>irect_thunk_bnd. */<br>
++ indirect_thunk_name (name, regno, need_bnd_p);<br>
++ decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,<br>
++ get_identifier (name),<br>
++ build_function_type_list (void_type_node, NULL_TREE));<br>
++ DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,<br>
++ NULL_TREE, void_type_node);<br>
++ TREE_PUBLIC (decl) = 1;<br>
++ TREE_STATIC (decl) = 1;<br>
++ DECL_IGNORED_P (decl) = 1;<br>
++<br>
++#if TARGET_MACHO<br>
++ if (TARGET_MACHO)<br>
++ {<br>
++ switch_to_section (darwin_sections[picbase_thunk<wbr>_section]);<br>
++ fputs ("\t.weak_definition\t", asm_out_file);<br>
++ assemble_name (asm_out_file, name);<br>
++ fputs ("\n\t.private_extern\t", asm_out_file);<br>
++ assemble_name (asm_out_file, name);<br>
++ putc ('\n', asm_out_file);<br>
++ ASM_OUTPUT_LABEL (asm_out_file, name);<br>
++ DECL_WEAK (decl) = 1;<br>
++ }<br>
++ else<br>
++#endif<br>
++ if (USE_HIDDEN_LINKONCE)<br>
++ {<br>
++ cgraph_node::create (decl)->set_comdat_group (DECL_ASSEMBLER_NAME (decl));<br>
++<br>
++ targetm.asm_out.unique_section (decl, 0);<br>
++ switch_to_section (get_named_section (decl, NULL, 0));<br>
++<br>
++ targetm.asm_out.globalize_labe<wbr>l (asm_out_file, name);<br>
++ fputs ("\t.hidden\t", asm_out_file);<br>
++ assemble_name (asm_out_file, name);<br>
++ putc ('\n', asm_out_file);<br>
++ ASM_DECLARE_FUNCTION_NAME (asm_out_file, name, decl);<br>
++ }<br>
++ else<br>
++ {<br>
++ switch_to_section (text_section);<br>
++ ASM_OUTPUT_LABEL (asm_out_file, name);<br>
++ }<br>
++<br>
++ DECL_INITIAL (decl) = make_node (BLOCK);<br>
++ current_function_decl = decl;<br>
++ allocate_struct_function (decl, false);<br>
++ init_function_start (decl);<br>
++ /* We're about to hide the function body from callees of final_* by<br>
++ emitting it directly; tell them we're a thunk, if they care. */<br>
++ cfun->is_thunk = true;<br>
++ first_function_block_is_cold = false;<br>
++ /* Make sure unwind info is emitted for the thunk if needed. */<br>
++ final_start_function (emit_barrier (), asm_out_file, 1);<br>
++<br>
++ output_indirect_thunk (need_bnd_p, regno);<br>
++<br>
++ final_end_function ();<br>
++ init_insn_lengths ();<br>
++ free_after_compilation (cfun);<br>
++ set_cfun (NULL);<br>
++ current_function_decl = NULL;<br>
++}<br>
++<br>
+ static int pic_labels_used;<br>
+<br>
+ /* Fills in the label name that should be used for a pc thunk for<br>
+@@ -10988,11 +11252,32 @@ ix86_code_end (void)<br>
+ rtx xops[2];<br>
+ int regno;<br>
+<br>
++ if (indirect_thunk_needed)<br>
++ output_indirect_thunk_function (false, -1);<br>
++ if (indirect_thunk_bnd_needed)<br>
++ output_indirect_thunk_function (true, -1);<br>
++<br>
++ for (regno = FIRST_REX_INT_REG; regno <= LAST_REX_INT_REG; regno++)<br>
++ {<br>
++ int i = regno - FIRST_REX_INT_REG + LAST_INT_REG + 1;<br>
++ if ((indirect_thunks_used & (1 << i)))<br>
++ output_indirect_thunk_function (false, regno);<br>
++<br>
++ if ((indirect_thunks_bnd_used & (1 << i)))<br>
++ output_indirect_thunk_function (true, regno);<br>
++ }<br>
++<br>
+ for (regno = AX_REG; regno <= SP_REG; regno++)<br>
+ {<br>
+ char name[32];<br>
+ tree decl;<br>
+<br>
++ if ((indirect_thunks_used & (1 << regno)))<br>
++ output_indirect_thunk_function (false, regno);<br>
++<br>
++ if ((indirect_thunks_bnd_used & (1 << regno)))<br>
++ output_indirect_thunk_function (true, regno);<br>
++<br>
+ if (!(pic_labels_used & (1 << regno)))<br>
+ continue;<br>
+<br>
+@@ -27369,12 +27654,292 @@ ix86_nopic_noplt_attribute_p (rtx call_op)<br>
+ return false;<br>
+ }<br>
+<br>
++/* Output indirect branch via a call and return thunk. CALL_OP is a<br>
++ register which contains the branch target. XASM is the assembly<br>
++ template for CALL_OP. Branch is a tail call if SIBCALL_P is true.<br>
++ A normal call is converted to:<br>
++<br>
++ call __x86_indirect_thunk_reg<br>
++<br>
++ and a tail call is converted to:<br>
++<br>
++ jmp __x86_indirect_thunk_reg<br>
++ */<br>
++<br>
++static void<br>
++ix86_output_indirect_branch_<wbr>via_reg (rtx call_op, bool sibcall_p)<br>
++{<br>
++ char thunk_name_buf[32];<br>
++ char *thunk_name;<br>
++ bool need_bnd_p = ix86_bnd_prefixed_insn_p (current_output_insn);<br>
++ int regno = REGNO (call_op);<br>
++<br>
++ if (cfun->machine->indirect_branc<wbr>h_type<br>
++ != indirect_branch_thunk_inline)<br>
++ {<br>
++ if (cfun->machine->indirect_branc<wbr>h_type == indirect_branch_thunk)<br>
++ {<br>
++ int i = regno;<br>
++ if (i >= FIRST_REX_INT_REG)<br>
++ i -= (FIRST_REX_INT_REG - LAST_INT_REG - 1);<br>
++ if (need_bnd_p)<br>
++ indirect_thunks_bnd_used |= 1 << i;<br>
++ else<br>
++ indirect_thunks_used |= 1 << i;<br>
++ }<br>
++ indirect_thunk_name (thunk_name_buf, regno, need_bnd_p);<br>
++ thunk_name = thunk_name_buf;<br>
++ }<br>
++ else<br>
++ thunk_name = NULL;<br>
++<br>
++ if (sibcall_p)<br>
++ {<br>
++ if (thunk_name != NULL)<br>
++ {<br>
++ if (need_bnd_p)<br>
++ fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name);<br>
++ else<br>
++ fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);<br>
++ }<br>
++ else<br>
++ output_indirect_thunk (need_bnd_p, regno);<br>
++ }<br>
++ else<br>
++ {<br>
++ if (thunk_name != NULL)<br>
++ {<br>
++ if (need_bnd_p)<br>
++ fprintf (asm_out_file, "\tbnd call\t%s\n", thunk_name);<br>
++ else<br>
++ fprintf (asm_out_file, "\tcall\t%s\n", thunk_name);<br>
++ return;<br>
++ }<br>
++<br>
++ char indirectlabel1[32];<br>
++ char indirectlabel2[32];<br>
++<br>
++ ASM_GENERATE_INTERNAL_LABEL (indirectlabel1,<br>
++ INDIRECT_LABEL,<br>
++ indirectlabelno++);<br>
++ ASM_GENERATE_INTERNAL_LABEL (indirectlabel2,<br>
++ INDIRECT_LABEL,<br>
++ indirectlabelno++);<br>
++<br>
++ /* Jump. */<br>
++ if (need_bnd_p)<br>
++ fputs ("\tbnd jmp\t", asm_out_file);<br>
++ else<br>
++ fputs ("\tjmp\t", asm_out_file);<br>
++ assemble_name_raw (asm_out_file, indirectlabel2);<br>
++ fputc ('\n', asm_out_file);<br>
++<br>
++ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel1);<br>
++<br>
++ if (thunk_name != NULL)<br>
++ {<br>
++ if (need_bnd_p)<br>
++ fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name);<br>
++ else<br>
++ fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);<br>
++ }<br>
++ else<br>
++ output_indirect_thunk (need_bnd_p, regno);<br>
++<br>
++ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2);<br>
++<br>
++ /* Call. */<br>
++ if (need_bnd_p)<br>
++ fputs ("\tbnd call\t", asm_out_file);<br>
++ else<br>
++ fputs ("\tcall\t", asm_out_file);<br>
++ assemble_name_raw (asm_out_file, indirectlabel1);<br>
++ fputc ('\n', asm_out_file);<br>
++ }<br>
++}<br>
++<br>
++/* Output indirect branch via a call and return thunk. CALL_OP is<br>
++ the branch target. XASM is the assembly template for CALL_OP.<br>
++ Branch is a tail call if SIBCALL_P is true. A normal call is<br>
++ converted to:<br>
++<br>
++ jmp L2<br>
++ L1:<br>
++ push CALL_OP<br>
++ jmp __x86_indirect_thunk<br>
++ L2:<br>
++ call L1<br>
++<br>
++ and a tail call is converted to:<br>
++<br>
++ push CALL_OP<br>
++ jmp __x86_indirect_thunk<br>
++ */<br>
++<br>
++static void<br>
++ix86_output_indirect_branch_<wbr>via_push (rtx call_op, const char *xasm,<br>
++ bool sibcall_p)<br>
++{<br>
++ char thunk_name_buf[32];<br>
++ char *thunk_name;<br>
++ char push_buf[64];<br>
++ bool need_bnd_p = ix86_bnd_prefixed_insn_p (current_output_insn);<br>
++ int regno = -1;<br>
++<br>
++ if (cfun->machine->indirect_branc<wbr>h_type<br>
++ != indirect_branch_thunk_inline)<br>
++ {<br>
++ if (cfun->machine->indirect_branc<wbr>h_type == indirect_branch_thunk)<br>
++ {<br>
++ if (need_bnd_p)<br>
++ indirect_thunk_bnd_needed = true;<br>
++ else<br>
++ indirect_thunk_needed = true;<br>
++ }<br>
++ indirect_thunk_name (thunk_name_buf, regno, need_bnd_p);<br>
++ thunk_name = thunk_name_buf;<br>
++ }<br>
++ else<br>
++ thunk_name = NULL;<br>
++<br>
++ snprintf (push_buf, sizeof (push_buf), "push{%c}\t%s",<br>
++ TARGET_64BIT ? 'q' : 'l', xasm);<br>
++<br>
++ if (sibcall_p)<br>
++ {<br>
++ output_asm_insn (push_buf, &call_op);<br>
++ if (thunk_name != NULL)<br>
++ {<br>
++ if (need_bnd_p)<br>
++ fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name);<br>
++ else<br>
++ fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);<br>
++ }<br>
++ else<br>
++ output_indirect_thunk (need_bnd_p, regno);<br>
++ }<br>
++ else<br>
++ {<br>
++ char indirectlabel1[32];<br>
++ char indirectlabel2[32];<br>
++<br>
++ ASM_GENERATE_INTERNAL_LABEL (indirectlabel1,<br>
++ INDIRECT_LABEL,<br>
++ indirectlabelno++);<br>
++ ASM_GENERATE_INTERNAL_LABEL (indirectlabel2,<br>
++ INDIRECT_LABEL,<br>
++ indirectlabelno++);<br>
++<br>
++ /* Jump. */<br>
++ if (need_bnd_p)<br>
++ fputs ("\tbnd jmp\t", asm_out_file);<br>
++ else<br>
++ fputs ("\tjmp\t", asm_out_file);<br>
++ assemble_name_raw (asm_out_file, indirectlabel2);<br>
++ fputc ('\n', asm_out_file);<br>
++<br>
++ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel1);<br>
++<br>
++ /* An external function may be called via GOT, instead of PLT. */<br>
++ if (MEM_P (call_op))<br>
++ {<br>
++ struct ix86_address parts;<br>
++ rtx addr = XEXP (call_op, 0);<br>
++ if (ix86_decompose_address (addr, &parts)<br>
++ && parts.base == stack_pointer_rtx)<br>
++ {<br>
++ /* Since call will adjust stack by -UNITS_PER_WORD,<br>
++ we must convert "disp(stack, index, scale)" to<br>
++ "disp+UNITS_PER_WORD(stack, index, scale)". */<br>
++ if (parts.index)<br>
++ {<br>
++ addr = gen_rtx_MULT (Pmode, parts.index,<br>
++ GEN_INT (parts.scale));<br>
++ addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx,<br>
++ addr);<br>
++ }<br>
++ else<br>
++ addr = stack_pointer_rtx;<br>
++<br>
++ rtx disp;<br>
++ if (parts.disp != NULL_RTX)<br>
++ disp = plus_constant (Pmode, parts.disp,<br>
++ UNITS_PER_WORD);<br>
++ else<br>
++ disp = GEN_INT (UNITS_PER_WORD);<br>
++<br>
++ addr = gen_rtx_PLUS (Pmode, addr, disp);<br>
++ call_op = gen_rtx_MEM (GET_MODE (call_op), addr);<br>
++ }<br>
++ }<br>
++<br>
++ output_asm_insn (push_buf, &call_op);<br>
++<br>
++ if (thunk_name != NULL)<br>
++ {<br>
++ if (need_bnd_p)<br>
++ fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name);<br>
++ else<br>
++ fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);<br>
++ }<br>
++ else<br>
++ output_indirect_thunk (need_bnd_p, regno);<br>
++<br>
++ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2);<br>
++<br>
++ /* Call. */<br>
++ if (need_bnd_p)<br>
++ fputs ("\tbnd call\t", asm_out_file);<br>
++ else<br>
++ fputs ("\tcall\t", asm_out_file);<br>
++ assemble_name_raw (asm_out_file, indirectlabel1);<br>
++ fputc ('\n', asm_out_file);<br>
++ }<br>
++}<br>
++<br>
++/* Output indirect branch via a call and return thunk. CALL_OP is<br>
++ the branch target. XASM is the assembly template for CALL_OP.<br>
++ Branch is a tail call if SIBCALL_P is true. */<br>
++<br>
++static void<br>
++ix86_output_indirect_branch (rtx call_op, const char *xasm,<br>
++ bool sibcall_p)<br>
++{<br>
++ if (REG_P (call_op))<br>
++ ix86_output_indirect_branch_vi<wbr>a_reg (call_op, sibcall_p);<br>
++ else<br>
++ ix86_output_indirect_branch_vi<wbr>a_push (call_op, xasm, sibcall_p);<br>
++}<br>
++/* Output indirect jump. CALL_OP is the jump target. Jump is a<br>
++ function return if RET_P is true. */<br>
++<br>
++const char *<br>
++ix86_output_indirect_jmp (rtx call_op, bool ret_p)<br>
++{<br>
++ if (cfun->machine->indirect_branc<wbr>h_type != indirect_branch_keep)<br>
++ {<br>
++ /* We can't have red-zone if this isn't a function return since<br>
++ "call" in the indirect thunk pushes the return address onto<br>
++ stack, destroying red-zone. */<br>
++ if (!ret_p && ix86_red_zone_size != 0)<br>
++ gcc_unreachable ();<br>
++<br>
++ ix86_output_indirect_branch (call_op, "%0", true);<br>
++ return "";<br>
++ }<br>
++ else<br>
++ return "%!jmp\t%A0";<br>
++}<br>
++<br>
+ /* Output the assembly for a call instruction. */<br>
+<br>
+ const char *<br>
+ ix86_output_call_insn (rtx_insn *insn, rtx call_op)<br>
+ {<br>
+ bool direct_p = constant_call_address_operand (call_op, VOIDmode);<br>
++ bool output_indirect_p<br>
++ = (!TARGET_SEH<br>
++ && cfun->machine->indirect_branch<wbr>_type != indirect_branch_keep);<br>
+ bool seh_nop_p = false;<br>
+ const char *xasm;<br>
+<br>
+@@ -27383,7 +27948,13 @@ ix86_output_call_insn (rtx_insn *insn, rtx call_op)<br>
+ if (direct_p)<br>
+ {<br>
+ if (ix86_nopic_noplt_attribute_p (call_op))<br>
+- xasm = "%!jmp\t{*%p0@GOTPCREL(%%rip)|<wbr>[QWORD PTR %p0@GOTPCREL[rip]]}";<br>
++ {<br>
++ direct_p = false;<br>
++ if (output_indirect_p)<br>
++ xasm = "{%p0@GOTPCREL(%%rip)|[QWORD PTR %p0@GOTPCREL[rip]]}";<br>
++ else<br>
++ xasm = "%!jmp\t{*%p0@GOTPCREL(%%rip)|<wbr>[QWORD PTR %p0@GOTPCREL[rip]]}";<br>
++ }<br>
+ else<br>
+ xasm = "%!jmp\t%P0";<br>
+ }<br>
+@@ -27392,9 +27963,17 @@ ix86_output_call_insn (rtx_insn *insn, rtx call_op)<br>
+ else if (TARGET_SEH)<br>
+ xasm = "%!rex.W jmp\t%A0";<br>
+ else<br>
+- xasm = "%!jmp\t%A0";<br>
++ {<br>
++ if (output_indirect_p)<br>
++ xasm = "%0";<br>
++ else<br>
++ xasm = "%!jmp\t%A0";<br>
++ }<br>
+<br>
+- output_asm_insn (xasm, &call_op);<br>
++ if (output_indirect_p && !direct_p)<br>
++ ix86_output_indirect_branch (call_op, xasm, true);<br>
++ else<br>
++ output_asm_insn (xasm, &call_op);<br>
+ return "";<br>
+ }<br>
+<br>
+@@ -27431,14 +28010,28 @@ ix86_output_call_insn (rtx_insn *insn, rtx call_op)<br>
+ if (direct_p)<br>
+ {<br>
+ if (ix86_nopic_noplt_attribute_p (call_op))<br>
+- xasm = "%!call\t{*%p0@GOTPCREL(%%rip)<wbr>|[QWORD PTR %p0@GOTPCREL[rip]]}";<br>
++ {<br>
++ direct_p = false;<br>
++ if (output_indirect_p)<br>
++ xasm = "{%p0@GOTPCREL(%%rip)|[QWORD PTR %p0@GOTPCREL[rip]]}";<br>
++ else<br>
++ xasm = "%!call\t{*%p0@GOTPCREL(%%rip)<wbr>|[QWORD PTR %p0@GOTPCREL[rip]]}";<br>
++ }<br>
+ else<br>
+ xasm = "%!call\t%P0";<br>
+ }<br>
+ else<br>
+- xasm = "%!call\t%A0";<br>
++ {<br>
++ if (output_indirect_p)<br>
++ xasm = "%0";<br>
++ else<br>
++ xasm = "%!call\t%A0";<br>
++ }<br>
+<br>
+- output_asm_insn (xasm, &call_op);<br>
++ if (output_indirect_p && !direct_p)<br>
++ ix86_output_indirect_branch (call_op, xasm, false);<br>
++ else<br>
++ output_asm_insn (xasm, &call_op);<br>
+<br>
+ if (seh_nop_p)<br>
+ return "nop";<br>
+@@ -44836,7 +45429,7 @@ ix86_handle_struct_attribute (tree *node, tree name, tree, int,<br>
+ }<br>
+<br>
+ static tree<br>
+-ix86_handle_fndecl_attribute (tree *node, tree name, tree, int,<br>
++ix86_handle_fndecl_attribute (tree *node, tree name, tree args, int,<br>
+ bool *no_add_attrs)<br>
+ {<br>
+ if (TREE_CODE (*node) != FUNCTION_DECL)<br>
+@@ -44845,6 +45438,29 @@ ix86_handle_fndecl_attribute (tree *node, tree name, tree, int,<br>
+ name);<br>
+ *no_add_attrs = true;<br>
+ }<br>
++<br>
++ if (is_attribute_p ("indirect_branch", name))<br>
++ {<br>
++ tree cst = TREE_VALUE (args);<br>
++ if (TREE_CODE (cst) != STRING_CST)<br>
++ {<br>
++ warning (OPT_Wattributes,<br>
++ "%qE attribute requires a string constant argument",<br>
++ name);<br>
++ *no_add_attrs = true;<br>
++ }<br>
++ else if (strcmp (TREE_STRING_POINTER (cst), "keep") != 0<br>
++ && strcmp (TREE_STRING_POINTER (cst), "thunk") != 0<br>
++ && strcmp (TREE_STRING_POINTER (cst), "thunk-inline") != 0<br>
++ && strcmp (TREE_STRING_POINTER (cst), "thunk-extern") != 0)<br>
++ {<br>
++ warning (OPT_Wattributes,<br>
++ "argument to %qE attribute is not "<br>
++ "(keep|thunk|thunk-inline|thu<wbr>nk-extern)", name);<br>
++ *no_add_attrs = true;<br>
++ }<br>
++ }<br>
++<br>
+ return NULL_TREE;<br>
+ }<br>
+<br>
+@@ -49072,6 +49688,9 @@ static const struct attribute_spec ix86_attribute_table[] =<br>
+ false },<br>
+ { "callee_pop_aggregate_return", 1, 1, false, true, true,<br>
+ ix86_handle_callee_pop_aggreg<wbr>ate_return, true },<br>
++ { "indirect_branch", 1, 1, true, false, false,<br>
++ ix86_handle_fndecl_attribute, false },<br>
++<br>
+ /* End element. */<br>
+ { NULL, 0, 0, false, false, false, NULL, false }<br>
+ };<br>
+diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h<br>
+index 5414416..9dccdb0 100644<br>
+--- a/gcc/config/i386/i386.h<br>
++++ b/gcc/config/i386/i386.h<br>
+@@ -2572,6 +2572,13 @@ struct GTY(()) machine_function {<br>
+ /* If true, it is safe to not save/restore DRAP register. */<br>
+ BOOL_BITFIELD no_drap_save_restore : 1;<br>
+<br>
++ /* How to generate indirec branch. */<br>
++ ENUM_BITFIELD(indirect_branch) indirect_branch_type : 3;<br>
++<br>
++ /* If true, the current function has local indirect jumps, like<br>
++ "indirect_jump" or "tablejump". */<br>
++ BOOL_BITFIELD has_local_indirect_jump : 1;<br>
++<br>
+ /* If true, there is register available for argument passing. This<br>
+ is used only in ix86_function_ok_for_sibcall by 32-bit to determine<br>
+ if there is scratch register available for indirect sibcall. In<br>
+diff --git a/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> b/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a><br>
+index d2bfe31..153e162 100644<br>
+--- a/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a><br>
++++ b/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a><br>
+@@ -11807,13 +11807,18 @@<br>
+ {<br>
+ if (TARGET_X32)<br>
+ operands[0] = convert_memory_address (word_mode, operands[0]);<br>
++ cfun->machine->has_local_indir<wbr>ect_jump = true;<br>
+ })<br>
+<br>
+ (define_insn "*indirect_jump"<br>
+ [(set (pc) (match_operand:W 0 "indirect_branch_operand" "rBw"))]<br>
+ ""<br>
+- "%!jmp\t%A0"<br>
+- [(set_attr "type" "ibr")<br>
++ "* return ix86_output_indirect_jmp (operands[0], false);"<br>
++ [(set (attr "type")<br>
++ (if_then_else (match_test "(cfun->machine->indirect_bran<wbr>ch_type<br>
++ != indirect_branch_keep)")<br>
++ (const_string "multi")<br>
++ (const_string "ibr")))<br>
+ (set_attr "length_immediate" "0")<br>
+ (set_attr "maybe_prefix_bnd" "1")])<br>
+<br>
+@@ -11856,14 +11861,19 @@<br>
+<br>
+ if (TARGET_X32)<br>
+ operands[0] = convert_memory_address (word_mode, operands[0]);<br>
++ cfun->machine->has_local_indir<wbr>ect_jump = true;<br>
+ })<br>
+<br>
+ (define_insn "*tablejump_1"<br>
+ [(set (pc) (match_operand:W 0 "indirect_branch_operand" "rBw"))<br>
+ (use (label_ref (match_operand 1)))]<br>
+ ""<br>
+- "%!jmp\t%A0"<br>
+- [(set_attr "type" "ibr")<br>
++ "* return ix86_output_indirect_jmp (operands[0], false);"<br>
++ [(set (attr "type")<br>
++ (if_then_else (match_test "(cfun->machine->indirect_bran<wbr>ch_type<br>
++ != indirect_branch_keep)")<br>
++ (const_string "multi")<br>
++ (const_string "ibr")))<br>
+ (set_attr "length_immediate" "0")<br>
+ (set_attr "maybe_prefix_bnd" "1")])<br>
+<br>
+@@ -12520,8 +12530,12 @@<br>
+ [(simple_return)<br>
+ (use (match_operand:SI 0 "register_operand" "r"))]<br>
+ "reload_completed"<br>
+- "%!jmp\t%A0"<br>
+- [(set_attr "type" "ibr")<br>
++ "* return ix86_output_indirect_jmp (operands[0], true);"<br>
++ [(set (attr "type")<br>
++ (if_then_else (match_test "(cfun->machine->indirect_bran<wbr>ch_type<br>
++ != indirect_branch_keep)")<br>
++ (const_string "multi")<br>
++ (const_string "ibr")))<br>
+ (set_attr "length_immediate" "0")<br>
+ (set_attr "maybe_prefix_bnd" "1")])<br>
+<br>
+diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt<br>
+index f304b62..5ffa334 100644<br>
+--- a/gcc/config/i386/i386.opt<br>
++++ b/gcc/config/i386/i386.opt<br>
+@@ -897,3 +897,23 @@ Enum(stack_protector_guard) String(global) Value(SSP_GLOBAL)<br>
+ mmitigate-rop<br>
+ Target Var(flag_mitigate_rop) Init(0)<br>
+ Attempt to avoid generating instruction sequences containing ret bytes.<br>
++<br>
++mindirect-branch=<br>
++Target Report RejectNegative Joined Enum(indirect_branch) Var(ix86_indirect_branch) Init(indirect_branch_keep)<br>
++Convert indirect call and jump to call and return thunks.<br>
++<br>
++Enum<br>
++Name(indirect_branch) Type(enum indirect_branch)<br>
++Known indirect branch choices (for use with the -mindirect-branch= option):<br>
++<br>
++EnumValue<br>
++Enum(indirect_branch) String(keep) Value(indirect_branch_keep)<br>
++<br>
++EnumValue<br>
++Enum(indirect_branch) String(thunk) Value(indirect_branch_thunk)<br>
++<br>
++EnumValue<br>
++Enum(indirect_branch) String(thunk-inline) Value(indirect_branch_thunk_in<wbr>line)<br>
++<br>
++EnumValue<br>
++Enum(indirect_branch) String(thunk-extern) Value(indirect_branch_thunk_ex<wbr>tern)<br>
+diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi<br>
+index 8cc4f7e..8668dae 100644<br>
+--- a/gcc/doc/extend.texi<br>
++++ b/gcc/doc/extend.texi<br>
+@@ -5419,6 +5419,16 @@ Specify which floating-point unit to use. You must specify the<br>
+ @code{target("fpmath=sse,387")<wbr>} option as<br>
+ @code{target("fpmath=sse+387")<wbr>} because the comma would separate<br>
+ different options.<br>
++<br>
++@item indirect_branch("@var{choice}"<wbr>)<br>
++@cindex @code{indirect_branch} function attribute, x86<br>
++On x86 targets, the @code{indirect_branch} attribute causes the compiler<br>
++to convert indirect call and jump with @var{choice}. @samp{keep}<br>
++keeps indirect call and jump unmodified. @samp{thunk} converts indirect<br>
++call and jump to call and return thunk. @samp{thunk-inline} converts<br>
++indirect call and jump to inlined call and return thunk.<br>
++@samp{thunk-extern} converts indirect call and jump to external call<br>
++and return thunk provided in a separate object file.<br>
+ @end table<br>
+<br>
+ On the x86, the inliner does not inline a<br>
+diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi<br>
+index b066f7b..ff9a194 100644<br>
+--- a/gcc/doc/invoke.texi<br>
++++ b/gcc/doc/invoke.texi<br>
+@@ -1169,7 +1169,7 @@ See RS/6000 and PowerPC Options.<br>
+ -msse2avx -mfentry -mrecord-mcount -mnop-mcount -m8bit-idiv @gol<br>
+ -mavx256-split-unaligned-load -mavx256-split-unaligned-store @gol<br>
+ -malign-data=@var{type} -mstack-protector-guard=@var{g<wbr>uard} @gol<br>
+--mmitigate-rop}<br>
++-mmitigate-rop -mindirect-branch=@var{choice}<wbr>}<br>
+<br>
+ @emph{x86 Windows Options}<br>
+ @gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol<br>
+@@ -24218,6 +24218,17 @@ opcodes, to mitigate against certain forms of attack. At the moment,<br>
+ this option is limited in what it can do and should not be relied<br>
+ on to provide serious protection.<br>
+<br>
++@item -mindirect-branch=@var{choice}<br>
++@opindex -mindirect-branch<br>
++Convert indirect call and jump with @var{choice}. The default is<br>
++@samp{keep}, which keeps indirect call and jump unmodified.<br>
++@samp{thunk} converts indirect call and jump to call and return thunk.<br>
++@samp{thunk-inline} converts indirect call and jump to inlined call<br>
++and return thunk. @samp{thunk-extern} converts indirect call and jump<br>
++to external call and return thunk provided in a separate object file.<br>
++You can control this behavior for a specific function by using the<br>
++function attribute @code{indirect_branch}. @xref{Function Attributes}.<br>
++<br>
+ @end table<br>
+<br>
+ These @samp{-m} switches are supported in addition to the above<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-1.c<br>
+new file mode 100644<br>
+index 0000000..d983e1c<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-1.c<br>
+@@ -0,0 +1,20 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch;<br>
++<br>
++void<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch(offset);<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-2.c<br>
+new file mode 100644<br>
+index 0000000..58f09b4<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-2.c<br>
+@@ -0,0 +1,20 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch[256];<br>
++<br>
++void<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch[offset](offset);<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-3.c<br>
+new file mode 100644<br>
+index 0000000..f20d35c<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-3.c<br>
+@@ -0,0 +1,21 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch;<br>
++<br>
++int<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch(offset);<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-4.c<br>
+new file mode 100644<br>
+index 0000000..0eff8fb<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-4.c<br>
+@@ -0,0 +1,21 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch[256];<br>
++<br>
++int<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch[offset](offset);<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-5.c<br>
+new file mode 100644<br>
+index 0000000..a25b20d<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-5.c<br>
+@@ -0,0 +1,17 @@<br>
++/* { dg-do compile { target *-*-linux* } } */<br>
++/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk" } */<br>
++<br>
++extern void bar (void);<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++ bar ();<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-6.c<br>
+new file mode 100644<br>
+index 0000000..cff114a<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-6.c<br>
+@@ -0,0 +1,18 @@<br>
++/* { dg-do compile { target *-*-linux* } } */<br>
++/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk" } */<br>
++<br>
++extern void bar (void);<br>
++<br>
++int<br>
++foo (void)<br>
++{<br>
++ bar ();<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */<br>
++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-7.c<br>
+new file mode 100644<br>
+index 0000000..afdb600<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-7.c<br>
+@@ -0,0 +1,44 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */<br>
++<br>
++void func0 (void);<br>
++void func1 (void);<br>
++void func2 (void);<br>
++void func3 (void);<br>
++void func4 (void);<br>
++void func4 (void);<br>
++void func5 (void);<br>
++<br>
++void<br>
++bar (int i)<br>
++{<br>
++ switch (i)<br>
++ {<br>
++ default:<br>
++ func0 ();<br>
++ break;<br>
++ case 1:<br>
++ func1 ();<br>
++ break;<br>
++ case 2:<br>
++ func2 ();<br>
++ break;<br>
++ case 3:<br>
++ func3 ();<br>
++ break;<br>
++ case 4:<br>
++ func4 ();<br>
++ break;<br>
++ case 5:<br>
++ func5 ();<br>
++ break;<br>
++ }<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-1.c<br>
+new file mode 100644<br>
+index 0000000..d64d978<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-1.c<br>
+@@ -0,0 +1,23 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch;<br>
++<br>
++extern void male_indirect_jump (long)<br>
++ __attribute__ ((indirect_branch("thunk")));<br>
++<br>
++void<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch(offset);<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-2.c<br>
+new file mode 100644<br>
+index 0000000..9306745<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-2.c<br>
+@@ -0,0 +1,21 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch[256];<br>
++<br>
++__attribute__ ((indirect_branch("thunk")))<br>
++void<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch[offset](offset);<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-3.c<br>
+new file mode 100644<br>
+index 0000000..97744d6<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-3.c<br>
+@@ -0,0 +1,23 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch;<br>
++extern int male_indirect_jump (long)<br>
++ __attribute__ ((indirect_branch("thunk-inlin<wbr>e")));<br>
++<br>
++int<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch(offset);<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */<br>
++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-4.c<br>
+new file mode 100644<br>
+index 0000000..bfce3ea<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-4.c<br>
+@@ -0,0 +1,22 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch[256];<br>
++<br>
++__attribute__ ((indirect_branch("thunk-inlin<wbr>e")))<br>
++int<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch[offset](offset);<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */<br>
++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-5.c<br>
+new file mode 100644<br>
+index 0000000..0833606<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-5.c<br>
+@@ -0,0 +1,22 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch;<br>
++extern int male_indirect_jump (long)<br>
++ __attribute__ ((indirect_branch("thunk-exter<wbr>n")));<br>
++<br>
++int<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch(offset);<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-6.c<br>
+new file mode 100644<br>
+index 0000000..2eba0fb<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-6.c<br>
+@@ -0,0 +1,21 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch[256];<br>
++<br>
++__attribute__ ((indirect_branch("thunk-exter<wbr>n")))<br>
++int<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch[offset](offset);<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-7.c<br>
+new file mode 100644<br>
+index 0000000..f58427e<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-7.c<br>
+@@ -0,0 +1,44 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -fno-pic" } */<br>
++<br>
++void func0 (void);<br>
++void func1 (void);<br>
++void func2 (void);<br>
++void func3 (void);<br>
++void func4 (void);<br>
++void func4 (void);<br>
++void func5 (void);<br>
++<br>
++__attribute__ ((indirect_branch("thunk-exter<wbr>n")))<br>
++void<br>
++bar (int i)<br>
++{<br>
++ switch (i)<br>
++ {<br>
++ default:<br>
++ func0 ();<br>
++ break;<br>
++ case 1:<br>
++ func1 ();<br>
++ break;<br>
++ case 2:<br>
++ func2 ();<br>
++ break;<br>
++ case 3:<br>
++ func3 ();<br>
++ break;<br>
++ case 4:<br>
++ func4 ();<br>
++ break;<br>
++ case 5:<br>
++ func5 ();<br>
++ break;<br>
++ }<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-8.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-8.c<br>
+new file mode 100644<br>
+index 0000000..564ed39<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-8.c<br>
+@@ -0,0 +1,42 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */<br>
++<br>
++void func0 (void);<br>
++void func1 (void);<br>
++void func2 (void);<br>
++void func3 (void);<br>
++void func4 (void);<br>
++void func4 (void);<br>
++void func5 (void);<br>
++<br>
++__attribute__ ((indirect_branch("keep")))<br>
++void<br>
++bar (int i)<br>
++{<br>
++ switch (i)<br>
++ {<br>
++ default:<br>
++ func0 ();<br>
++ break;<br>
++ case 1:<br>
++ func1 ();<br>
++ break;<br>
++ case 2:<br>
++ func2 ();<br>
++ break;<br>
++ case 3:<br>
++ func3 ();<br>
++ break;<br>
++ case 4:<br>
++ func4 ();<br>
++ break;<br>
++ case 5:<br>
++ func5 ();<br>
++ break;<br>
++ }<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-1.c<br>
+new file mode 100644<br>
+index 0000000..50fbee2<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-1.c<br>
+@@ -0,0 +1,20 @@<br>
++/* { dg-do compile { target { ! x32 } } } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */<br>
++<br>
++void (*dispatch) (char *);<br>
++char buf[10];<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++ dispatch (buf);<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "pushq\[ \t\]%rax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "bnd call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "bnd ret" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-2.c<br>
+new file mode 100644<br>
+index 0000000..2976e67<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-2.c<br>
+@@ -0,0 +1,21 @@<br>
++/* { dg-do compile { target { ! x32 } } } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */<br>
++<br>
++void (*dispatch) (char *);<br>
++char buf[10];<br>
++<br>
++int<br>
++foo (void)<br>
++{<br>
++ dispatch (buf);<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "pushq\[ \t\]%rax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } */<br>
++/* { dg-final { scan-assembler "bnd jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "bnd call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "bnd ret" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-3.c<br>
+new file mode 100644<br>
+index 0000000..da4bc98<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-3.c<br>
+@@ -0,0 +1,19 @@<br>
++/* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */<br>
++<br>
++void bar (char *);<br>
++char buf[10];<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++ bar (buf);<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */<br>
++/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "bnd call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "bnd ret" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-4.c<br>
+new file mode 100644<br>
+index 0000000..c64d12e<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-4.c<br>
+@@ -0,0 +1,20 @@<br>
++/* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */<br>
++<br>
++void bar (char *);<br>
++char buf[10];<br>
++<br>
++int<br>
++foo (void)<br>
++{<br>
++ bar (buf);<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */<br>
++/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler "bnd jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-times "bnd call\[ \t\]*\.LIND" 2 } } */<br>
++/* { dg-final { scan-assembler "bnd ret" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-1.c<br>
+new file mode 100644<br>
+index 0000000..49f27b4<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-1.c<br>
+@@ -0,0 +1,19 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch;<br>
++<br>
++void<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch(offset);<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-2.c<br>
+new file mode 100644<br>
+index 0000000..a1e3eb6<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-2.c<br>
+@@ -0,0 +1,19 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch[256];<br>
++<br>
++void<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch[offset](offset);<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-3.c<br>
+new file mode 100644<br>
+index 0000000..395634e<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-3.c<br>
+@@ -0,0 +1,20 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch;<br>
++<br>
++int<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch(offset);<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-4.c<br>
+new file mode 100644<br>
+index 0000000..fd3f633<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-4.c<br>
+@@ -0,0 +1,20 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch[256];<br>
++<br>
++int<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch[offset](offset);<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-5.c<br>
+new file mode 100644<br>
+index 0000000..ba2f92b<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-5.c<br>
+@@ -0,0 +1,16 @@<br>
++/* { dg-do compile { target *-*-linux* } } */<br>
++/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>" } */<br>
++<br>
++extern void bar (void);<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++ bar ();<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-6.c<br>
+new file mode 100644<br>
+index 0000000..0c5a2d4<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-6.c<br>
+@@ -0,0 +1,17 @@<br>
++/* { dg-do compile { target *-*-linux* } } */<br>
++/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>" } */<br>
++<br>
++extern void bar (void);<br>
++<br>
++int<br>
++foo (void)<br>
++{<br>
++ bar ();<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */<br>
++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 } } */<br>
++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-7.c<br>
+new file mode 100644<br>
+index 0000000..6652523<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-7.c<br>
+@@ -0,0 +1,43 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */<br>
++<br>
++void func0 (void);<br>
++void func1 (void);<br>
++void func2 (void);<br>
++void func3 (void);<br>
++void func4 (void);<br>
++void func4 (void);<br>
++void func5 (void);<br>
++<br>
++void<br>
++bar (int i)<br>
++{<br>
++ switch (i)<br>
++ {<br>
++ default:<br>
++ func0 ();<br>
++ break;<br>
++ case 1:<br>
++ func1 ();<br>
++ break;<br>
++ case 2:<br>
++ func2 ();<br>
++ break;<br>
++ case 3:<br>
++ func3 ();<br>
++ break;<br>
++ case 4:<br>
++ func4 ();<br>
++ break;<br>
++ case 5:<br>
++ func5 ();<br>
++ break;<br>
++ }<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-1.c<br>
+new file mode 100644<br>
+index 0000000..68c0ff7<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-1.c<br>
+@@ -0,0 +1,20 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch;<br>
++<br>
++void<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch(offset);<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-2.c<br>
+new file mode 100644<br>
+index 0000000..e2da1fc<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-2.c<br>
+@@ -0,0 +1,20 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch[256];<br>
++<br>
++void<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch[offset](offset);<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-3.c<br>
+new file mode 100644<br>
+index 0000000..244fec7<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-3.c<br>
+@@ -0,0 +1,21 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch;<br>
++<br>
++int<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch(offset);<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */<br>
++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-4.c<br>
+new file mode 100644<br>
+index 0000000..107ebe3<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-4.c<br>
+@@ -0,0 +1,21 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch[256];<br>
++<br>
++int<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch[offset](offset);<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */<br>
++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-5.c<br>
+new file mode 100644<br>
+index 0000000..17b04ef<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-5.c<br>
+@@ -0,0 +1,17 @@<br>
++/* { dg-do compile { target *-*-linux* } } */<br>
++/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>" } */<br>
++<br>
++extern void bar (void);<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++ bar ();<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-6.c<br>
+new file mode 100644<br>
+index 0000000..d9eb112<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-6.c<br>
+@@ -0,0 +1,18 @@<br>
++/* { dg-do compile { target *-*-linux* } } */<br>
++/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>" } */<br>
++<br>
++extern void bar (void);<br>
++<br>
++int<br>
++foo (void)<br>
++{<br>
++ bar ();<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */<br>
++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */<br>
++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-7.c<br>
+new file mode 100644<br>
+index 0000000..d02b1dc<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-7.c<br>
+@@ -0,0 +1,44 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */<br>
++<br>
++void func0 (void);<br>
++void func1 (void);<br>
++void func2 (void);<br>
++void func3 (void);<br>
++void func4 (void);<br>
++void func4 (void);<br>
++void func5 (void);<br>
++<br>
++void<br>
++bar (int i)<br>
++{<br>
++ switch (i)<br>
++ {<br>
++ default:<br>
++ func0 ();<br>
++ break;<br>
++ case 1:<br>
++ func1 ();<br>
++ break;<br>
++ case 2:<br>
++ func2 ();<br>
++ break;<br>
++ case 3:<br>
++ func3 ();<br>
++ break;<br>
++ case 4:<br>
++ func4 ();<br>
++ break;<br>
++ case 5:<br>
++ func5 ();<br>
++ break;<br>
++ }<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */<br>
+--<br>
+2.7.4<br>
+<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0005-uclibc-locale-no__x<wbr>.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0005-uclibc-locale-no__x<wbr>.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0005-uclibc-locale-no__x.p<wbr>atch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0005-uclibc-locale-no__x.p<wbr>atch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0005-x86-Add-mfunction-r<wbr>eturn.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0005-x86-Add-mfunction-r<wbr>eturn.patch<br>
new file mode 100644<br>
index 0000000..2529bf2<br>
--- /dev/null<br>
+++ b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0005-x86-Add-mfunction-r<wbr>eturn.patch<br>
@@ -0,0 +1,1567 @@<br>
+From e3270814b9e0caad63fbcdfd7ae9da<wbr>2d52c97497 Mon Sep 17 00:00:00 2001<br>
+From: "H.J. Lu" <<a href="mailto:hjl.tools@gmail.com" target="_blank">hjl.tools@gmail.com</a>><br>
+Date: Sat, 6 Jan 2018 22:29:56 -0800<br>
+Subject: [PATCH 05/12] x86: Add -mfunction-return=<br>
+<br>
+Add -mfunction-return= option to convert function return to call and<br>
+return thunks. The default is 'keep', which keeps function return<br>
+unmodified. 'thunk' converts function return to call and return thunk.<br>
+'thunk-inline' converts function return to inlined call and return thunk.<br>
+'thunk-extern' converts function return to external call and return<br>
+thunk provided in a separate object file. You can control this behavior<br>
+for a specific function by using the function attribute function_return.<br>
+<br>
+Function return thunk is the same as memory thunk for -mindirect-branch=<br>
+where the return address is at the top of the stack:<br>
+<br>
+__x86_return_thunk:<br>
+ call L2<br>
+L1:<br>
+ pause<br>
+ lfence<br>
+ jmp L1<br>
+L2:<br>
+ lea 8(%rsp), %rsp|lea 4(%esp), %esp<br>
+ ret<br>
+<br>
+and function return becomes<br>
+<br>
+ jmp __x86_return_thunk<br>
+<br>
+-mindirect-branch= tests are updated with -mfunction-return=keep to<br>
+avoid false test failures when -mfunction-return=thunk is added to<br>
+RUNTESTFLAGS for "make check".<br>
+<br>
+gcc/<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-14 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ * config/i386/i386-protos.h (ix86_output_function_return): New.<br>
+ * config/i386/i386.c (ix86_set_indirect_branch_type<wbr>): Also<br>
+ set function_return_type.<br>
+ (indirect_thunk_name): Add ret_p to indicate thunk for function<br>
+ return.<br>
+ (output_indirect_thunk_functi<wbr>on): Pass false to<br>
+ indirect_thunk_name.<br>
+ (ix86_output_indirect_branch_<wbr>via_reg): Likewise.<br>
+ (ix86_output_indirect_branch_<wbr>via_push): Likewise.<br>
+ (output_indirect_thunk_functi<wbr>on): Create alias for function<br>
+ return thunk if regno < 0.<br>
+ (ix86_output_function_return)<wbr>: New function.<br>
+ (ix86_handle_fndecl_attribute<wbr>): Handle function_return.<br>
+ (ix86_attribute_table): Add function_return.<br>
+ * config/i386/i386.h (machine_function): Add<br>
+ function_return_type.<br>
+ * config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> (simple_return_internal): Use<br>
+ ix86_output_function_return.<br>
+ (simple_return_internal_long)<wbr>: Likewise.<br>
+ * config/i386/i386.opt (mfunction-return=): New option.<br>
+ (indirect_branch): Mention -mfunction-return=.<br>
+ * doc/extend.texi: Document function_return function attribute.<br>
+ * doc/invoke.texi: Document -mfunction-return= option.<br>
+<br>
+gcc/testsuite/<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-14 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ * gcc.target/i386/indirect-thunk<wbr>-1.c (dg-options): Add<br>
+ -mfunction-return=keep.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-7.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-7.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-8.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-bnd-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-bnd-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-bnd-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-bnd-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-7.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-7.c: Likewise.<br>
+ * gcc.target/i386/ret-thunk-1.c: New test.<br>
+ * gcc.target/i386/ret-thunk-10.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-11.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-12.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-13.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-14.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-15.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-16.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-2.c: Likewise.<br>
+ * gcc.target/i386/ret-thunk-3.c: Likewise.<br>
+ * gcc.target/i386/ret-thunk-4.c: Likewise.<br>
+ * gcc.target/i386/ret-thunk-5.c: Likewise.<br>
+ * gcc.target/i386/ret-thunk-6.c: Likewise.<br>
+ * gcc.target/i386/ret-thunk-7.c: Likewise.<br>
+ * gcc.target/i386/ret-thunk-8.c: Likewise.<br>
+ * gcc.target/i386/ret-thunk-9.c: Likewise.<br>
+<br>
+i386: Don't use ASM_OUTPUT_DEF for TARGET_MACHO<br>
+<br>
+ASM_OUTPUT_DEF isn't defined for TARGET_MACHO. Use ASM_OUTPUT_LABEL to<br>
+generate the __x86_return_thunk label, instead of the set directive.<br>
+Update testcase to remove the __x86_return_thunk label check. Since<br>
+-fno-pic is ignored on Darwin, update testcases to sscan or "push"<br>
+only on Linux.<br>
+<br>
+gcc/<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-15 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ PR target/83839<br>
+ * config/i386/i386.c (output_indirect_thunk_functio<wbr>n): Use<br>
+ ASM_OUTPUT_LABEL, instead of ASM_OUTPUT_DEF, for TARGET_MACHO<br>
+ for __x86.return_thunk.<br>
+<br>
+gcc/testsuite/<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-15 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ PR target/83839<br>
+ * gcc.target/i386/indirect-thunk<wbr>-1.c: Scan for "push" only on<br>
+ Linux.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-7.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-7.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-7.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-register-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-register-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-register-4.c: Likewise.<br>
+ * gcc.target/i386/ret-thunk-10.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-11.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-12.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-13.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-14.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-15.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-9.c: Don't check the<br>
+ __x86_return_thunk label.<br>
+ Scan for "push" only for Linux.<br>
+<br>
+Upstream-Status: Pending<br>
+---<br>
+ gcc/config/i386/i386-protos.h | 1 +<br>
+ gcc/config/i386/i386.c | 152 +++++++++++++++++++--<br>
+ gcc/config/i386/i386.h | 3 +<br>
+ gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> | 9 +-<br>
+ gcc/config/i386/i386.opt | 6 +-<br>
+ gcc/doc/extend.texi | 9 ++<br>
+ gcc/doc/invoke.texi | 14 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-1.c | 4 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-2.c | 4 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-3.c | 4 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-4.c | 4 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-5.c | 2 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-6.c | 2 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-7.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-1.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-2.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-3.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-4.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-5.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-6.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-7.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-8.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-bnd-1.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-bnd-2.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-bnd-3.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-bnd-4.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-1.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-2.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-3.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-4.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-5.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-6.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-7.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-1.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-2.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-3.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-4.c | 4 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-5.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-6.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-7.c | 4 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-1.c | 13 ++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-10.c | 23 ++++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-11.c | 23 ++++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-12.c | 22 +++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-13.c | 22 +++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-14.c | 22 +++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-15.c | 22 +++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-16.c | 18 +++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-2.c | 13 ++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-3.c | 12 ++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-4.c | 12 ++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-5.c | 15 ++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-6.c | 14 ++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-7.c | 13 ++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-8.c | 14 ++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-9.c | 24 ++++<br>
+ 56 files changed, 516 insertions(+), 74 deletions(-)<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-1.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-10.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-11.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-12.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-13.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-14.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-15.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-16.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-2.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-3.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-4.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-5.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-6.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-7.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-8.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-9.c<br>
+<br>
+diff --git a/gcc/config/i386/i386-protos.<wbr>h b/gcc/config/i386/i386-protos.<wbr>h<br>
+index eca4cbf..620d70e 100644<br>
+--- a/gcc/config/i386/i386-protos.<wbr>h<br>
++++ b/gcc/config/i386/i386-protos.<wbr>h<br>
+@@ -312,6 +312,7 @@ extern enum attr_cpu ix86_schedule;<br>
+<br>
+ extern const char * ix86_output_call_insn (rtx_insn *insn, rtx call_op);<br>
+ extern const char * ix86_output_indirect_jmp (rtx call_op, bool ret_p);<br>
++extern const char * ix86_output_function_return (bool long_p);<br>
+ extern bool ix86_operands_ok_for_move_mult<wbr>iple (rtx *operands, bool load,<br>
+ enum machine_mode mode);<br>
+<br>
+diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c<br>
+index 0b9fc4d..34e26a3 100644<br>
+--- a/gcc/config/i386/i386.c<br>
++++ b/gcc/config/i386/i386.c<br>
+@@ -6390,6 +6390,31 @@ ix86_set_indirect_branch_type (tree fndecl)<br>
+ else<br>
+ cfun->machine->indirect_branc<wbr>h_type = ix86_indirect_branch;<br>
+ }<br>
++<br>
++ if (cfun->machine->function_retur<wbr>n_type == indirect_branch_unset)<br>
++ {<br>
++ tree attr = lookup_attribute ("function_return",<br>
++ DECL_ATTRIBUTES (fndecl));<br>
++ if (attr != NULL)<br>
++ {<br>
++ tree args = TREE_VALUE (attr);<br>
++ if (args == NULL)<br>
++ gcc_unreachable ();<br>
++ tree cst = TREE_VALUE (args);<br>
++ if (strcmp (TREE_STRING_POINTER (cst), "keep") == 0)<br>
++ cfun->machine->function_return<wbr>_type = indirect_branch_keep;<br>
++ else if (strcmp (TREE_STRING_POINTER (cst), "thunk") == 0)<br>
++ cfun->machine->function_return<wbr>_type = indirect_branch_thunk;<br>
++ else if (strcmp (TREE_STRING_POINTER (cst), "thunk-inline") == 0)<br>
++ cfun->machine->function_return<wbr>_type = indirect_branch_thunk_inline;<br>
++ else if (strcmp (TREE_STRING_POINTER (cst), "thunk-extern") == 0)<br>
++ cfun->machine->function_return<wbr>_type = indirect_branch_thunk_extern;<br>
++ else<br>
++ gcc_unreachable ();<br>
++ }<br>
++ else<br>
++ cfun->machine->function_return<wbr>_type = ix86_function_return;<br>
++ }<br>
+ }<br>
+<br>
+ /* Establish appropriate back-end context for processing the function<br>
+@@ -11036,8 +11061,12 @@ static int indirect_thunks_bnd_used;<br>
+ /* Fills in the label name that should be used for the indirect thunk. */<br>
+<br>
+ static void<br>
+-indirect_thunk_name (char name[32], int regno, bool need_bnd_p)<br>
++indirect_thunk_name (char name[32], int regno, bool need_bnd_p,<br>
++ bool ret_p)<br>
+ {<br>
++ if (regno >= 0 && ret_p)<br>
++ gcc_unreachable ();<br>
++<br>
+ if (USE_HIDDEN_LINKONCE)<br>
+ {<br>
+ const char *bnd = need_bnd_p ? "_bnd" : "";<br>
+@@ -11052,7 +11081,10 @@ indirect_thunk_name (char name[32], int regno, bool need_bnd_p)<br>
+ bnd, reg_prefix, reg_names[regno]);<br>
+ }<br>
+ else<br>
+- sprintf (name, "__x86_indirect_thunk%s", bnd);<br>
++ {<br>
++ const char *ret = ret_p ? "return" : "indirect";<br>
++ sprintf (name, "__x86_%s_thunk%s", ret, bnd);<br>
++ }<br>
+ }<br>
+ else<br>
+ {<br>
+@@ -11065,10 +11097,20 @@ indirect_thunk_name (char name[32], int regno, bool need_bnd_p)<br>
+ }<br>
+ else<br>
+ {<br>
+- if (need_bnd_p)<br>
+- ASM_GENERATE_INTERNAL_LABEL (name, "LITB", 0);<br>
++ if (ret_p)<br>
++ {<br>
++ if (need_bnd_p)<br>
++ ASM_GENERATE_INTERNAL_LABEL (name, "LRTB", 0);<br>
++ else<br>
++ ASM_GENERATE_INTERNAL_LABEL (name, "LRT", 0);<br>
++ }<br>
+ else<br>
+- ASM_GENERATE_INTERNAL_LABEL (name, "LIT", 0);<br>
++ {<br>
++ if (need_bnd_p)<br>
++ ASM_GENERATE_INTERNAL_LABEL (name, "LITB", 0);<br>
++ else<br>
++ ASM_GENERATE_INTERNAL_LABEL (name, "LIT", 0);<br>
++ }<br>
+ }<br>
+ }<br>
+ }<br>
+@@ -11163,7 +11205,7 @@ output_indirect_thunk_function (bool need_bnd_p, int regno)<br>
+ tree decl;<br>
+<br>
+ /* Create __x86_indirect_thunk/__x86_ind<wbr>irect_thunk_bnd. */<br>
+- indirect_thunk_name (name, regno, need_bnd_p);<br>
++ indirect_thunk_name (name, regno, need_bnd_p, false);<br>
+ decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,<br>
+ get_identifier (name),<br>
+ build_function_type_list (void_type_node, NULL_TREE));<br>
+@@ -11206,6 +11248,36 @@ output_indirect_thunk_function (bool need_bnd_p, int regno)<br>
+ ASM_OUTPUT_LABEL (asm_out_file, name);<br>
+ }<br>
+<br>
++ if (regno < 0)<br>
++ {<br>
++ /* Create alias for __x86.return_thunk/__x86.retur<wbr>n_thunk_bnd. */<br>
++ char alias[32];<br>
++<br>
++ indirect_thunk_name (alias, regno, need_bnd_p, true);<br>
++#if TARGET_MACHO<br>
++ if (TARGET_MACHO)<br>
++ {<br>
++ fputs ("\t.weak_definition\t", asm_out_file);<br>
++ assemble_name (asm_out_file, alias);<br>
++ fputs ("\n\t.private_extern\t", asm_out_file);<br>
++ assemble_name (asm_out_file, alias);<br>
++ putc ('\n', asm_out_file);<br>
++ ASM_OUTPUT_LABEL (asm_out_file, alias);<br>
++ }<br>
++#else<br>
++ ASM_OUTPUT_DEF (asm_out_file, alias, name);<br>
++ if (USE_HIDDEN_LINKONCE)<br>
++ {<br>
++ fputs ("\t.globl\t", asm_out_file);<br>
++ assemble_name (asm_out_file, alias);<br>
++ putc ('\n', asm_out_file);<br>
++ fputs ("\t.hidden\t", asm_out_file);<br>
++ assemble_name (asm_out_file, alias);<br>
++ putc ('\n', asm_out_file);<br>
++ }<br>
++#endif<br>
++ }<br>
++<br>
+ DECL_INITIAL (decl) = make_node (BLOCK);<br>
+ current_function_decl = decl;<br>
+ allocate_struct_function (decl, false);<br>
+@@ -27687,7 +27759,7 @@ ix86_output_indirect_branch_vi<wbr>a_reg (rtx call_op, bool sibcall_p)<br>
+ else<br>
+ indirect_thunks_used |= 1 << i;<br>
+ }<br>
+- indirect_thunk_name (thunk_name_buf, regno, need_bnd_p);<br>
++ indirect_thunk_name (thunk_name_buf, regno, need_bnd_p, false);<br>
+ thunk_name = thunk_name_buf;<br>
+ }<br>
+ else<br>
+@@ -27796,7 +27868,7 @@ ix86_output_indirect_branch_vi<wbr>a_push (rtx call_op, const char *xasm,<br>
+ else<br>
+ indirect_thunk_needed = true;<br>
+ }<br>
+- indirect_thunk_name (thunk_name_buf, regno, need_bnd_p);<br>
++ indirect_thunk_name (thunk_name_buf, regno, need_bnd_p, false);<br>
+ thunk_name = thunk_name_buf;<br>
+ }<br>
+ else<br>
+@@ -27931,6 +28003,46 @@ ix86_output_indirect_jmp (rtx call_op, bool ret_p)<br>
+ return "%!jmp\t%A0";<br>
+ }<br>
+<br>
++/* Output function return. CALL_OP is the jump target. Add a REP<br>
++ prefix to RET if LONG_P is true and function return is kept. */<br>
++<br>
++const char *<br>
++ix86_output_function_return (bool long_p)<br>
++{<br>
++ if (cfun->machine->function_retur<wbr>n_type != indirect_branch_keep)<br>
++ {<br>
++ char thunk_name[32];<br>
++ bool need_bnd_p = ix86_bnd_prefixed_insn_p (current_output_insn);<br>
++<br>
++ if (cfun->machine->function_retur<wbr>n_type<br>
++ != indirect_branch_thunk_inline)<br>
++ {<br>
++ bool need_thunk = (cfun->machine->function_retur<wbr>n_type<br>
++ == indirect_branch_thunk);<br>
++ indirect_thunk_name (thunk_name, -1, need_bnd_p, true);<br>
++ if (need_bnd_p)<br>
++ {<br>
++ indirect_thunk_bnd_needed |= need_thunk;<br>
++ fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name);<br>
++ }<br>
++ else<br>
++ {<br>
++ indirect_thunk_needed |= need_thunk;<br>
++ fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);<br>
++ }<br>
++ }<br>
++ else<br>
++ output_indirect_thunk (need_bnd_p, -1);<br>
++<br>
++ return "";<br>
++ }<br>
++<br>
++ if (!long_p || ix86_bnd_prefixed_insn_p (current_output_insn))<br>
++ return "%!ret";<br>
++<br>
++ return "rep%; ret";<br>
++}<br>
++<br>
+ /* Output the assembly for a call instruction. */<br>
+<br>
+ const char *<br>
+@@ -45461,6 +45573,28 @@ ix86_handle_fndecl_attribute (tree *node, tree name, tree args, int,<br>
+ }<br>
+ }<br>
+<br>
++ if (is_attribute_p ("function_return", name))<br>
++ {<br>
++ tree cst = TREE_VALUE (args);<br>
++ if (TREE_CODE (cst) != STRING_CST)<br>
++ {<br>
++ warning (OPT_Wattributes,<br>
++ "%qE attribute requires a string constant argument",<br>
++ name);<br>
++ *no_add_attrs = true;<br>
++ }<br>
++ else if (strcmp (TREE_STRING_POINTER (cst), "keep") != 0<br>
++ && strcmp (TREE_STRING_POINTER (cst), "thunk") != 0<br>
++ && strcmp (TREE_STRING_POINTER (cst), "thunk-inline") != 0<br>
++ && strcmp (TREE_STRING_POINTER (cst), "thunk-extern") != 0)<br>
++ {<br>
++ warning (OPT_Wattributes,<br>
++ "argument to %qE attribute is not "<br>
++ "(keep|thunk|thunk-inline|thu<wbr>nk-extern)", name);<br>
++ *no_add_attrs = true;<br>
++ }<br>
++ }<br>
++<br>
+ return NULL_TREE;<br>
+ }<br>
+<br>
+@@ -49690,6 +49824,8 @@ static const struct attribute_spec ix86_attribute_table[] =<br>
+ ix86_handle_callee_pop_aggreg<wbr>ate_return, true },<br>
+ { "indirect_branch", 1, 1, true, false, false,<br>
+ ix86_handle_fndecl_attribute, false },<br>
++ { "function_return", 1, 1, true, false, false,<br>
++ ix86_handle_fndecl_attribute, false },<br>
+<br>
+ /* End element. */<br>
+ { NULL, 0, 0, false, false, false, NULL, false }<br>
+diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h<br>
+index 9dccdb0..b34bc11 100644<br>
+--- a/gcc/config/i386/i386.h<br>
++++ b/gcc/config/i386/i386.h<br>
+@@ -2579,6 +2579,9 @@ struct GTY(()) machine_function {<br>
+ "indirect_jump" or "tablejump". */<br>
+ BOOL_BITFIELD has_local_indirect_jump : 1;<br>
+<br>
++ /* How to generate function return. */<br>
++ ENUM_BITFIELD(indirect_branch) function_return_type : 3;<br>
++<br>
+ /* If true, there is register available for argument passing. This<br>
+ is used only in ix86_function_ok_for_sibcall by 32-bit to determine<br>
+ if there is scratch register available for indirect sibcall. In<br>
+diff --git a/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> b/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a><br>
+index 153e162..2da671e 100644<br>
+--- a/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a><br>
++++ b/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a><br>
+@@ -12489,7 +12489,7 @@<br>
+ (define_insn "simple_return_internal"<br>
+ [(simple_return)]<br>
+ "reload_completed"<br>
+- "%!ret"<br>
++ "* return ix86_output_function_return (false);"<br>
+ [(set_attr "length" "1")<br>
+ (set_attr "atom_unit" "jeu")<br>
+ (set_attr "length_immediate" "0")<br>
+@@ -12503,12 +12503,7 @@<br>
+ [(simple_return)<br>
+ (unspec [(const_int 0)] UNSPEC_REP)]<br>
+ "reload_completed"<br>
+-{<br>
+- if (ix86_bnd_prefixed_insn_p (insn))<br>
+- return "%!ret";<br>
+-<br>
+- return "rep%; ret";<br>
+-}<br>
++ "* return ix86_output_function_return (true);"<br>
+ [(set_attr "length" "2")<br>
+ (set_attr "atom_unit" "jeu")<br>
+ (set_attr "length_immediate" "0")<br>
+diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt<br>
+index 5ffa334..ad5916f 100644<br>
+--- a/gcc/config/i386/i386.opt<br>
++++ b/gcc/config/i386/i386.opt<br>
+@@ -902,9 +902,13 @@ mindirect-branch=<br>
+ Target Report RejectNegative Joined Enum(indirect_branch) Var(ix86_indirect_branch) Init(indirect_branch_keep)<br>
+ Convert indirect call and jump to call and return thunks.<br>
+<br>
++mfunction-return=<br>
++Target Report RejectNegative Joined Enum(indirect_branch) Var(ix86_function_return) Init(indirect_branch_keep)<br>
++Convert function return to call and return thunk.<br>
++<br>
+ Enum<br>
+ Name(indirect_branch) Type(enum indirect_branch)<br>
+-Known indirect branch choices (for use with the -mindirect-branch= option):<br>
++Known indirect branch choices (for use with the -mindirect-branch=/-mfunction-<wbr>return= options):<br>
+<br>
+ EnumValue<br>
+ Enum(indirect_branch) String(keep) Value(indirect_branch_keep)<br>
+diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi<br>
+index 8668dae..2cb6bd1 100644<br>
+--- a/gcc/doc/extend.texi<br>
++++ b/gcc/doc/extend.texi<br>
+@@ -5429,6 +5429,15 @@ call and jump to call and return thunk. @samp{thunk-inline} converts<br>
+ indirect call and jump to inlined call and return thunk.<br>
+ @samp{thunk-extern} converts indirect call and jump to external call<br>
+ and return thunk provided in a separate object file.<br>
++<br>
++@item function_return("@var{choice}"<wbr>)<br>
++@cindex @code{function_return} function attribute, x86<br>
++On x86 targets, the @code{function_return} attribute causes the compiler<br>
++to convert function return with @var{choice}. @samp{keep} keeps function<br>
++return unmodified. @samp{thunk} converts function return to call and<br>
++return thunk. @samp{thunk-inline} converts function return to inlined<br>
++call and return thunk. @samp{thunk-extern} converts function return to<br>
++external call and return thunk provided in a separate object file.<br>
+ @end table<br>
+<br>
+ On the x86, the inliner does not inline a<br>
+diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi<br>
+index ff9a194..fa63dc5 100644<br>
+--- a/gcc/doc/invoke.texi<br>
++++ b/gcc/doc/invoke.texi<br>
+@@ -1169,7 +1169,8 @@ See RS/6000 and PowerPC Options.<br>
+ -msse2avx -mfentry -mrecord-mcount -mnop-mcount -m8bit-idiv @gol<br>
+ -mavx256-split-unaligned-load -mavx256-split-unaligned-store @gol<br>
+ -malign-data=@var{type} -mstack-protector-guard=@var{g<wbr>uard} @gol<br>
+--mmitigate-rop -mindirect-branch=@var{choice}<wbr>}<br>
++-mmitigate-rop -mindirect-branch=@var{choice} @gol<br>
++-mfunction-return=@var{choic<wbr>e}}<br>
+<br>
+ @emph{x86 Windows Options}<br>
+ @gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol<br>
+@@ -24229,6 +24230,17 @@ to external call and return thunk provided in a separate object file.<br>
+ You can control this behavior for a specific function by using the<br>
+ function attribute @code{indirect_branch}. @xref{Function Attributes}.<br>
+<br>
++@item -mfunction-return=@var{choice}<br>
++@opindex -mfunction-return<br>
++Convert function return with @var{choice}. The default is @samp{keep},<br>
++which keeps function return unmodified. @samp{thunk} converts function<br>
++return to call and return thunk. @samp{thunk-inline} converts function<br>
++return to inlined call and return thunk. @samp{thunk-extern} converts<br>
++function return to external call and return thunk provided in a separate<br>
++object file. You can control this behavior for a specific function by<br>
++using the function attribute @code{function_return}.<br>
++@xref{Function Attributes}.<br>
++<br>
+ @end table<br>
+<br>
+ These @samp{-m} switches are supported in addition to the above<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-1.c<br>
+index d983e1c..e365ef5 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-1.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-1.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -11,7 +11,7 @@ male_indirect_jump (long offset)<br>
+ dispatch(offset);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-2.c<br>
+index 58f09b4..05a51ad 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-2.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-2.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -11,7 +11,7 @@ male_indirect_jump (long offset)<br>
+ dispatch[offset](offset);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-3.c<br>
+index f20d35c..3c0d4c3 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-3.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-3.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -12,7 +12,7 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-4.c<br>
+index 0eff8fb..14d4ef6 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-4.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-4.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -12,7 +12,7 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-5.c<br>
+index a25b20d..b4836c3 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-5.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-5.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target *-*-linux* } } */<br>
+-/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */<br>
+<br>
+ extern void bar (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-6.c<br>
+index cff114a..1f06bd1 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-6.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-6.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target *-*-linux* } } */<br>
+-/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */<br>
+<br>
+ extern void bar (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-7.c<br>
+index afdb600..bc6b47a 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-7.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-7.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
+<br>
+ void func0 (void);<br>
+ void func1 (void);<br>
+@@ -35,7 +35,7 @@ bar (int i)<br>
+ }<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-1.c<br>
+index d64d978..2257be3 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-1.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-1.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -14,7 +14,7 @@ male_indirect_jump (long offset)<br>
+ dispatch(offset);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-2.c<br>
+index 9306745..e9cfdc5 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-2.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-2.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -12,7 +12,7 @@ male_indirect_jump (long offset)<br>
+ dispatch[offset](offset);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-3.c<br>
+index 97744d6..f938db0 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-3.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-3.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -14,7 +14,7 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-4.c<br>
+index bfce3ea..4e58599 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-4.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-4.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -13,7 +13,7 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-5.c<br>
+index 0833606..b8d5024 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-5.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-5.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -14,7 +14,7 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-6.c<br>
+index 2eba0fb..455adab 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-6.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-6.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -13,7 +13,7 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-7.c<br>
+index f58427e..4595b84 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-7.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-7.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */<br>
+<br>
+ void func0 (void);<br>
+ void func1 (void);<br>
+@@ -36,7 +36,7 @@ bar (int i)<br>
+ }<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-8.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-8.c<br>
+index 564ed39..d730d31 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-8.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-8.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
+<br>
+ void func0 (void);<br>
+ void func1 (void);<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-1.c<br>
+index 50fbee2..5e3e118 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-1.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-1.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target { ! x32 } } } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */<br>
+<br>
+ void (*dispatch) (char *);<br>
+ char buf[10];<br>
+@@ -10,7 +10,7 @@ foo (void)<br>
+ dispatch (buf);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "pushq\[ \t\]%rax" { target x32 } } } */<br>
+ /* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-2.c<br>
+index 2976e67..2801aa4 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-2.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-2.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target { ! x32 } } } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */<br>
+<br>
+ void (*dispatch) (char *);<br>
+ char buf[10];<br>
+@@ -11,7 +11,7 @@ foo (void)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "pushq\[ \t\]%rax" { target x32 } } } */<br>
+ /* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } */<br>
+ /* { dg-final { scan-assembler "bnd jmp\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-3.c<br>
+index da4bc98..70b4fb3 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-3.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-3.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */<br>
+<br>
+ void bar (char *);<br>
+ char buf[10];<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-4.c<br>
+index c64d12e..3baf03e 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-4.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-4.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */<br>
+<br>
+ void bar (char *);<br>
+ char buf[10];<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-1.c<br>
+index 49f27b4..edeb264 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-1.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-1.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -11,7 +11,7 @@ male_indirect_jump (long offset)<br>
+ dispatch(offset);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-2.c<br>
+index a1e3eb6..1d00413 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-2.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-2.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -11,7 +11,7 @@ male_indirect_jump (long offset)<br>
+ dispatch[offset](offset);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-3.c<br>
+index 395634e..06ebf1c 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-3.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-3.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -12,7 +12,7 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-4.c<br>
+index fd3f633..1c8f944 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-4.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-4.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -12,7 +12,7 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-5.c<br>
+index ba2f92b..21740ac 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-5.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-5.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target *-*-linux* } } */<br>
+-/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>" } */<br>
+<br>
+ extern void bar (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-6.c<br>
+index 0c5a2d4..a77c1f4 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-6.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-6.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target *-*-linux* } } */<br>
+-/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>" } */<br>
+<br>
+ extern void bar (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-7.c<br>
+index 6652523..86e9fd1 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-7.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-7.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
+<br>
+ void func0 (void);<br>
+ void func1 (void);<br>
+@@ -35,7 +35,7 @@ bar (int i)<br>
+ }<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-1.c<br>
+index 68c0ff7..3ecde87 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-1.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-1.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -11,7 +11,7 @@ male_indirect_jump (long offset)<br>
+ dispatch(offset);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-2.c<br>
+index e2da1fc..df32a19 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-2.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-2.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -11,7 +11,7 @@ male_indirect_jump (long offset)<br>
+ dispatch[offset](offset);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-3.c<br>
+index 244fec7..9540996 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-3.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-3.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -12,7 +12,7 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-4.c<br>
+index 107ebe3..f3db6e2 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-4.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-4.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+@@ -12,7 +12,7 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-5.c<br>
+index 17b04ef..0f687c3 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-5.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-5.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target *-*-linux* } } */<br>
+-/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>" } */<br>
+<br>
+ extern void bar (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-6.c<br>
+index d9eb112..b27c6fc 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-6.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-6.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target *-*-linux* } } */<br>
+-/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>" } */<br>
+<br>
+ extern void bar (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-7.c<br>
+index d02b1dc..764a375 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-7.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-7.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
+<br>
+ void func0 (void);<br>
+ void func1 (void);<br>
+@@ -35,7 +35,7 @@ bar (int i)<br>
+ }<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-1.c<br>
+new file mode 100644<br>
+index 0000000..7223f67<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-1.c<br>
+@@ -0,0 +1,13 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mfunction-return=thunk" } */<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-10.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-10.c<br>
+new file mode 100644<br>
+index 0000000..3a6727b<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-10.c<br>
+@@ -0,0 +1,23 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic" } */<br>
++<br>
++extern void (*bar) (void);<br>
++<br>
++int<br>
++foo (void)<br>
++{<br>
++ bar ();<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 2 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 2 } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "__x86_indirect_thunk:" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target { x32 } } } } */<br>
++/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:<wbr>" { target { x32 } } } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-11.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-11.c<br>
+new file mode 100644<br>
+index 0000000..b8f6818<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-11.c<br>
+@@ -0,0 +1,23 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mfunction-return=thunk-extern -mindirect-branch=thunk -fno-pic" } */<br>
++<br>
++extern void (*bar) (void);<br>
++<br>
++int<br>
++foo (void)<br>
++{<br>
++ bar ();<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "__x86_indirect_thunk:" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target { x32 } } } } */<br>
++/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:<wbr>" { target { x32 } } } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-12.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-12.c<br>
+new file mode 100644<br>
+index 0000000..01b0a02<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-12.c<br>
+@@ -0,0 +1,22 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
++<br>
++extern void (*bar) (void);<br>
++<br>
++int<br>
++foo (void)<br>
++{<br>
++ bar ();<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "__x86_indirect_thunk:" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target { x32 } } } } */<br>
++/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:<wbr>" { target { x32 } } } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-13.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-13.c<br>
+new file mode 100644<br>
+index 0000000..4b497b5<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-13.c<br>
+@@ -0,0 +1,22 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
++<br>
++extern void (*bar) (void);<br>
++extern int foo (void) __attribute__ ((function_return("thunk")));<br>
++<br>
++int<br>
++foo (void)<br>
++{<br>
++ bar ();<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 2 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 2 } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 3 } } */<br>
++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 3 } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target { x32 } } } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-14.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-14.c<br>
+new file mode 100644<br>
+index 0000000..4ae4c44<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-14.c<br>
+@@ -0,0 +1,22 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
++<br>
++extern void (*bar) (void);<br>
++<br>
++__attribute__ ((function_return("thunk-inlin<wbr>e")))<br>
++int<br>
++foo (void)<br>
++{<br>
++ bar ();<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target { x32 } } } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-15.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-15.c<br>
+new file mode 100644<br>
+index 0000000..5b5bc76<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-15.c<br>
+@@ -0,0 +1,22 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -fno-pic" } */<br>
++<br>
++extern void (*bar) (void);<br>
++<br>
++__attribute__ ((function_return("thunk-exter<wbr>n"), indirect_branch("thunk")))<br>
++int<br>
++foo (void)<br>
++{<br>
++ bar ();<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-16.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-16.c<br>
+new file mode 100644<br>
+index 0000000..a16cad1<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-16.c<br>
+@@ -0,0 +1,18 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mfunction-return=thunk-inline -mindirect-branch=thunk-extern -fno-pic" } */<br>
++<br>
++extern void (*bar) (void);<br>
++<br>
++__attribute__ ((function_return("keep"), indirect_branch("keep")))<br>
++int<br>
++foo (void)<br>
++{<br>
++ bar ();<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler-not "__x86_return_thunk" } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-2.c<br>
+new file mode 100644<br>
+index 0000000..c6659e3<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-2.c<br>
+@@ -0,0 +1,13 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mfunction-return=thunk-inline<wbr>" } */<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-3.c<br>
+new file mode 100644<br>
+index 0000000..0f7f388<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-3.c<br>
+@@ -0,0 +1,12 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mfunction-return=thunk-extern<wbr>" } */<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-4.c<br>
+new file mode 100644<br>
+index 0000000..9ae37e8<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-4.c<br>
+@@ -0,0 +1,12 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mfunction-return=keep" } */<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-5.c<br>
+new file mode 100644<br>
+index 0000000..4bd0d2a<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-5.c<br>
+@@ -0,0 +1,15 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mfunction-return=keep" } */<br>
++<br>
++extern void foo (void) __attribute__ ((function_return("thunk")));<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-6.c<br>
+new file mode 100644<br>
+index 0000000..053841f<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-6.c<br>
+@@ -0,0 +1,14 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mfunction-return=keep" } */<br>
++<br>
++__attribute__ ((function_return("thunk-inlin<wbr>e")))<br>
++void<br>
++foo (void)<br>
++{<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-7.c<br>
+new file mode 100644<br>
+index 0000000..262e678<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-7.c<br>
+@@ -0,0 +1,13 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mfunction-return=keep" } */<br>
++<br>
++__attribute__ ((function_return("thunk-exter<wbr>n")))<br>
++void<br>
++foo (void)<br>
++{<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-8.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-8.c<br>
+new file mode 100644<br>
+index 0000000..c1658e9<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-8.c<br>
+@@ -0,0 +1,14 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mfunction-return=thunk-inline<wbr>" } */<br>
++<br>
++extern void foo (void) __attribute__ ((function_return("keep")));<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-9.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-9.c<br>
+new file mode 100644<br>
+index 0000000..fa24a1f<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-9.c<br>
+@@ -0,0 +1,24 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mfunction-return=thunk -mindirect-branch=thunk -fno-pic" } */<br>
++<br>
++extern void (*bar) (void);<br>
++<br>
++int<br>
++foo (void)<br>
++{<br>
++ bar ();<br>
++ return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "__x86_indirect_thunk:" } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 2 { target { x32 } } } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 2 { target { x32 } } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target { x32 } } } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
+--<br>
+2.7.4<br>
+<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0006-uclibc-locale-wchar<wbr>_fix.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0006-uclibc-locale-wchar<wbr>_fix.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0006-uclibc-locale-wchar_f<wbr>ix.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0006-uclibc-locale-wchar_f<wbr>ix.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0006-x86-Add-mindirect-b<wbr>ranch-register.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0006-x86-Add-mindirect-b<wbr>ranch-register.patch<br>
new file mode 100644<br>
index 0000000..50921aa<br>
--- /dev/null<br>
+++ b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0006-x86-Add-mindirect-b<wbr>ranch-register.patch<br>
@@ -0,0 +1,943 @@<br>
+From 3f1c39fb543884d36e759a6dc196a8<wbr>e914eb4f73 Mon Sep 17 00:00:00 2001<br>
+From: "H.J. Lu" <<a href="mailto:hjl.tools@gmail.com" target="_blank">hjl.tools@gmail.com</a>><br>
+Date: Sat, 6 Jan 2018 22:29:56 -0800<br>
+Subject: [PATCH 06/12] x86: Add -mindirect-branch-register<br>
+<br>
+Add -mindirect-branch-register to force indirect branch via register.<br>
+This is implemented by disabling patterns of indirect branch via memory,<br>
+similar to TARGET_X32.<br>
+<br>
+-mindirect-branch= and -mfunction-return= tests are updated with<br>
+-mno-indirect-branch-register to avoid false test failures when<br>
+-mindirect-branch-register is added to RUNTESTFLAGS for "make check".<br>
+<br>
+gcc/<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-14 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ * config/i386/<a href="http://constraints.md" rel="noreferrer" target="_blank">constraints.md</a> (Bs): Disallow memory operand for<br>
+ -mindirect-branch-register.<br>
+ (Bw): Likewise.<br>
+ * config/i386/<a href="http://predicates.md" rel="noreferrer" target="_blank">predicates.md</a> (indirect_branch_operand): Likewise.<br>
+ (GOT_memory_operand): Likewise.<br>
+ (call_insn_operand): Likewise.<br>
+ (sibcall_insn_operand): Likewise.<br>
+ (GOT32_symbol_operand): Likewise.<br>
+ * config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> (indirect_jump): Call convert_memory_address<br>
+ for -mindirect-branch-register.<br>
+ (tablejump): Likewise.<br>
+ (*sibcall_memory): Likewise.<br>
+ (*sibcall_value_memory): Likewise.<br>
+ Disallow peepholes of indirect call and jump via memory for<br>
+ -mindirect-branch-register.<br>
+ (*call_pop): Replace m with Bw.<br>
+ (*call_value_pop): Likewise.<br>
+ (*sibcall_pop_memory): Replace m with Bs.<br>
+ * config/i386/i386.opt (mindirect-branch-register): New option.<br>
+ * doc/invoke.texi: Document -mindirect-branch-register option.<br>
+<br>
+gcc/testsuite/<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-14 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ * gcc.target/i386/indirect-thunk<wbr>-1.c (dg-options): Add<br>
+ -mno-indirect-branch-register<wbr>.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-7.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-7.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-bnd-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-bnd-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-bnd-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-bnd-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-7.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-7.c: Likewise.<br>
+ * gcc.target/i386/ret-thunk-10.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-11.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-12.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-13.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-14.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-15.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-9.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-register-1.c: New test.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-register-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-register-3.c: Likewise.<br>
+<br>
+i386: Rename to ix86_indirect_branch_register<br>
+<br>
+Rename the variable for -mindirect-branch-register to<br>
+ix86_indirect_branch_register to match the command-line option name.<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-15 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ * config/i386/<a href="http://constraints.md" rel="noreferrer" target="_blank">constraints.md</a> (Bs): Replace<br>
+ ix86_indirect_branch_thunk_re<wbr>gister with<br>
+ ix86_indirect_branch_register<wbr>.<br>
+ (Bw): Likewise.<br>
+ * config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> (indirect_jump): Likewise.<br>
+ (tablejump): Likewise.<br>
+ (*sibcall_memory): Likewise.<br>
+ (*sibcall_value_memory): Likewise.<br>
+ Peepholes of indirect call and jump via memory: Likewise.<br>
+ * config/i386/i386.opt: Likewise.<br>
+ * config/i386/<a href="http://predicates.md" rel="noreferrer" target="_blank">predicates.md</a> (indirect_branch_operand): Likewise.<br>
+ (GOT_memory_operand): Likewise.<br>
+ (call_insn_operand): Likewise.<br>
+ (sibcall_insn_operand): Likewise.<br>
+ (GOT32_symbol_operand): Likewise.<br>
+<br>
+x86: Rewrite ix86_indirect_branch_register logic<br>
+<br>
+Rewrite ix86_indirect_branch_register logic with<br>
+<br>
+(and (not (match_test "ix86_indirect_branch_register<wbr>"))<br>
+ (original condition before r256662))<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-15 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ * config/i386/<a href="http://predicates.md" rel="noreferrer" target="_blank">predicates.md</a> (constant_call_address_operand<wbr>):<br>
+ Rewrite ix86_indirect_branch_register logic.<br>
+ (sibcall_insn_operand): Likewise.<br>
+<br>
+Don't check ix86_indirect_branch_register for GOT operand<br>
+<br>
+Since GOT_memory_operand and GOT32_symbol_operand are simple pattern<br>
+matches, don't check ix86_indirect_branch_register here. If needed,<br>
+-mindirect-branch= will convert indirect branch via GOT slot to a call<br>
+and return thunk.<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-15 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ * config/i386/<a href="http://constraints.md" rel="noreferrer" target="_blank">constraints.md</a> (Bs): Update<br>
+ ix86_indirect_branch_register check. Don't check<br>
+ ix86_indirect_branch_register with GOT_memory_operand.<br>
+ (Bw): Likewise.<br>
+ * config/i386/<a href="http://predicates.md" rel="noreferrer" target="_blank">predicates.md</a> (GOT_memory_operand): Don't check<br>
+ ix86_indirect_branch_register here.<br>
+ (GOT32_symbol_operand): Likewise.<br>
+<br>
+i386: Rewrite indirect_branch_operand logic<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-15 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ * config/i386/<a href="http://predicates.md" rel="noreferrer" target="_blank">predicates.md</a> (indirect_branch_operand): Rewrite<br>
+ ix86_indirect_branch_register logic.<br>
+<br>
+Upstream-Status: Pending<br>
+---<br>
+ gcc/config/i386/<a href="http://constraints.md" rel="noreferrer" target="_blank">constraints.md</a><wbr> | 6 ++--<br>
+ gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> | 34 ++++++++++++++--------<br>
+ gcc/config/i386/i386.opt | 4 +++<br>
+ gcc/config/i386/<a href="http://predicates.md" rel="noreferrer" target="_blank">predicates.md</a> | 21 +++++++------<br>
+ gcc/doc/invoke.texi | 6 +++-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-1.c | 2 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-2.c | 2 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-3.c | 2 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-4.c | 2 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-5.c | 2 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-6.c | 2 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-7.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-1.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-2.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-3.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-4.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-5.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-6.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-7.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-bnd-1.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-bnd-2.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-bnd-3.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-bnd-4.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-1.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-2.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-3.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-4.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-5.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-6.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-7.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-1.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-2.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-3.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-4.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-5.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-6.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-7.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-register-1.c | 22 ++++++++++++++<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-register-2.c | 20 +++++++++++++<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-register-3.c | 19 ++++++++++++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-10.c | 2 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-11.c | 2 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-12.c | 2 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-13.c | 2 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-14.c | 2 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-15.c | 2 +-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-9.c | 2 +-<br>
+ 47 files changed, 147 insertions(+), 63 deletions(-)<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-register-1.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-register-2.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-register-3.c<br>
+<br>
+diff --git a/gcc/config/i386/<a href="http://constraints.md" rel="noreferrer" target="_blank">constraints.<wbr>md</a> b/gcc/config/i386/<a href="http://constraints.md" rel="noreferrer" target="_blank">constraints.<wbr>md</a><br>
+index 1a4c701..9204c8e 100644<br>
+--- a/gcc/config/i386/<a href="http://constraints.md" rel="noreferrer" target="_blank">constraints.<wbr>md</a><br>
++++ b/gcc/config/i386/<a href="http://constraints.md" rel="noreferrer" target="_blank">constraints.<wbr>md</a><br>
+@@ -172,14 +172,16 @@<br>
+<br>
+ (define_constraint "Bs"<br>
+ "@internal Sibcall memory operand."<br>
+- (ior (and (not (match_test "TARGET_X32"))<br>
++ (ior (and (not (match_test "ix86_indirect_branch_register<wbr>"))<br>
++ (not (match_test "TARGET_X32"))<br>
+ (match_operand 0 "sibcall_memory_operand"))<br>
+ (and (match_test "TARGET_X32 && Pmode == DImode")<br>
+ (match_operand 0 "GOT_memory_operand"))))<br>
+<br>
+ (define_constraint "Bw"<br>
+ "@internal Call memory operand."<br>
+- (ior (and (not (match_test "TARGET_X32"))<br>
++ (ior (and (not (match_test "ix86_indirect_branch_register<wbr>"))<br>
++ (not (match_test "TARGET_X32"))<br>
+ (match_operand 0 "memory_operand"))<br>
+ (and (match_test "TARGET_X32 && Pmode == DImode")<br>
+ (match_operand 0 "GOT_memory_operand"))))<br>
+diff --git a/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> b/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a><br>
+index 2da671e..05a88ff 100644<br>
+--- a/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a><br>
++++ b/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a><br>
+@@ -11805,7 +11805,7 @@<br>
+ [(set (pc) (match_operand 0 "indirect_branch_operand"))]<br>
+ ""<br>
+ {<br>
+- if (TARGET_X32)<br>
++ if (TARGET_X32 || ix86_indirect_branch_register)<br>
+ operands[0] = convert_memory_address (word_mode, operands[0]);<br>
+ cfun->machine->has_local_indi<wbr>rect_jump = true;<br>
+ })<br>
+@@ -11859,7 +11859,7 @@<br>
+ OPTAB_DIRECT);<br>
+ }<br>
+<br>
+- if (TARGET_X32)<br>
++ if (TARGET_X32 || ix86_indirect_branch_register)<br>
+ operands[0] = convert_memory_address (word_mode, operands[0]);<br>
+ cfun->machine->has_local_indi<wbr>rect_jump = true;<br>
+ })<br>
+@@ -12048,7 +12048,7 @@<br>
+ [(call (mem:QI (match_operand:W 0 "memory_operand" "m"))<br>
+ (match_operand 1))<br>
+ (unspec [(const_int 0)] UNSPEC_PEEPSIB)]<br>
+- "!TARGET_X32"<br>
++ "!TARGET_X32 && !ix86_indirect_branch_register<wbr>"<br>
+ "* return ix86_output_call_insn (insn, operands[0]);"<br>
+ [(set_attr "type" "call")])<br>
+<br>
+@@ -12057,7 +12057,9 @@<br>
+ (match_operand:W 1 "memory_operand"))<br>
+ (call (mem:QI (match_dup 0))<br>
+ (match_operand 3))]<br>
+- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (1))<br>
++ "!TARGET_X32<br>
++ && !ix86_indirect_branch_register<br>
++ && SIBLING_CALL_P (peep2_next_insn (1))<br>
+ && !reg_mentioned_p (operands[0],<br>
+ CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"<br>
+ [(parallel [(call (mem:QI (match_dup 1))<br>
+@@ -12070,7 +12072,9 @@<br>
+ (unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)<br>
+ (call (mem:QI (match_dup 0))<br>
+ (match_operand 3))]<br>
+- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (2))<br>
++ "!TARGET_X32<br>
++ && !ix86_indirect_branch_register<br>
++ && SIBLING_CALL_P (peep2_next_insn (2))<br>
+ && !reg_mentioned_p (operands[0],<br>
+ CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"<br>
+ [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)<br>
+@@ -12092,7 +12096,7 @@<br>
+ })<br>
+<br>
+ (define_insn "*call_pop"<br>
+- [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lmBz"))<br>
++ [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lBwBz"))<br>
+ (match_operand 1))<br>
+ (set (reg:SI SP_REG)<br>
+ (plus:SI (reg:SI SP_REG)<br>
+@@ -12112,7 +12116,7 @@<br>
+ [(set_attr "type" "call")])<br>
+<br>
+ (define_insn "*sibcall_pop_memory"<br>
+- [(call (mem:QI (match_operand:SI 0 "memory_operand" "m"))<br>
++ [(call (mem:QI (match_operand:SI 0 "memory_operand" "Bs"))<br>
+ (match_operand 1))<br>
+ (set (reg:SI SP_REG)<br>
+ (plus:SI (reg:SI SP_REG)<br>
+@@ -12166,7 +12170,9 @@<br>
+ [(set (match_operand:W 0 "register_operand")<br>
+ (match_operand:W 1 "memory_operand"))<br>
+ (set (pc) (match_dup 0))]<br>
+- "!TARGET_X32 && peep2_reg_dead_p (2, operands[0])"<br>
++ "!TARGET_X32<br>
++ && !ix86_indirect_branch_register<br>
++ && peep2_reg_dead_p (2, operands[0])"<br>
+ [(set (pc) (match_dup 1))])<br>
+<br>
+ ;; Call subroutine, returning value in operand 0<br>
+@@ -12244,7 +12250,7 @@<br>
+ (call (mem:QI (match_operand:W 1 "memory_operand" "m"))<br>
+ (match_operand 2)))<br>
+ (unspec [(const_int 0)] UNSPEC_PEEPSIB)]<br>
+- "!TARGET_X32"<br>
++ "!TARGET_X32 && !ix86_indirect_branch_register<wbr>"<br>
+ "* return ix86_output_call_insn (insn, operands[1]);"<br>
+ [(set_attr "type" "callv")])<br>
+<br>
+@@ -12254,7 +12260,9 @@<br>
+ (set (match_operand 2)<br>
+ (call (mem:QI (match_dup 0))<br>
+ (match_operand 3)))]<br>
+- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (1))<br>
++ "!TARGET_X32<br>
++ && !ix86_indirect_branch_register<br>
++ && SIBLING_CALL_P (peep2_next_insn (1))<br>
+ && !reg_mentioned_p (operands[0],<br>
+ CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"<br>
+ [(parallel [(set (match_dup 2)<br>
+@@ -12269,7 +12277,9 @@<br>
+ (set (match_operand 2)<br>
+ (call (mem:QI (match_dup 0))<br>
+ (match_operand 3)))]<br>
+- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (2))<br>
++ "!TARGET_X32<br>
++ && !ix86_indirect_branch_register<br>
++ && SIBLING_CALL_P (peep2_next_insn (2))<br>
+ && !reg_mentioned_p (operands[0],<br>
+ CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"<br>
+ [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)<br>
+@@ -12294,7 +12304,7 @@<br>
+<br>
+ (define_insn "*call_value_pop"<br>
+ [(set (match_operand 0)<br>
+- (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lmBz"))<br>
++ (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lBwBz"))<br>
+ (match_operand 2)))<br>
+ (set (reg:SI SP_REG)<br>
+ (plus:SI (reg:SI SP_REG)<br>
+diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt<br>
+index ad5916f..a97f84f 100644<br>
+--- a/gcc/config/i386/i386.opt<br>
++++ b/gcc/config/i386/i386.opt<br>
+@@ -921,3 +921,7 @@ Enum(indirect_branch) String(thunk-inline) Value(indirect_branch_thunk_in<wbr>line)<br>
+<br>
+ EnumValue<br>
+ Enum(indirect_branch) String(thunk-extern) Value(indirect_branch_thunk_ex<wbr>tern)<br>
++<br>
++mindirect-branch-register<br>
++Target Report Var(ix86_indirect_branch_regis<wbr>ter) Init(0)<br>
++Force indirect call and jump via register.<br>
+diff --git a/gcc/config/i386/<a href="http://predicates.md" rel="noreferrer" target="_blank">predicates.m<wbr>d</a> b/gcc/config/i386/<a href="http://predicates.md" rel="noreferrer" target="_blank">predicates.m<wbr>d</a><br>
+index 93dda7b..d1f0a7d 100644<br>
+--- a/gcc/config/i386/<a href="http://predicates.md" rel="noreferrer" target="_blank">predicates.m<wbr>d</a><br>
++++ b/gcc/config/i386/<a href="http://predicates.md" rel="noreferrer" target="_blank">predicates.m<wbr>d</a><br>
+@@ -593,7 +593,8 @@<br>
+ ;; Test for a valid operand for indirect branch.<br>
+ (define_predicate "indirect_branch_operand"<br>
+ (ior (match_operand 0 "register_operand")<br>
+- (and (not (match_test "TARGET_X32"))<br>
++ (and (not (match_test "ix86_indirect_branch_register<wbr>"))<br>
++ (not (match_test "TARGET_X32"))<br>
+ (match_operand 0 "memory_operand"))))<br>
+<br>
+ ;; Return true if OP is a memory operands that can be used in sibcalls.<br>
+@@ -636,20 +637,22 @@<br>
+ (ior (match_test "constant_call_address_operand<br>
+ (op, mode == VOIDmode ? mode : Pmode)")<br>
+ (match_operand 0 "call_register_no_elim_operand<wbr>")<br>
+- (ior (and (not (match_test "TARGET_X32"))<br>
+- (match_operand 0 "memory_operand"))<br>
+- (and (match_test "TARGET_X32 && Pmode == DImode")<br>
+- (match_operand 0 "GOT_memory_operand")))))<br>
++ (and (not (match_test "ix86_indirect_branch_register<wbr>"))<br>
++ (ior (and (not (match_test "TARGET_X32"))<br>
++ (match_operand 0 "memory_operand"))<br>
++ (and (match_test "TARGET_X32 && Pmode == DImode")<br>
++ (match_operand 0 "GOT_memory_operand"))))))<br>
+<br>
+ ;; Similarly, but for tail calls, in which we cannot allow memory references.<br>
+ (define_special_predicate "sibcall_insn_operand"<br>
+ (ior (match_test "constant_call_address_operand<br>
+ (op, mode == VOIDmode ? mode : Pmode)")<br>
+ (match_operand 0 "register_no_elim_operand")<br>
+- (ior (and (not (match_test "TARGET_X32"))<br>
+- (match_operand 0 "sibcall_memory_operand"))<br>
+- (and (match_test "TARGET_X32 && Pmode == DImode")<br>
+- (match_operand 0 "GOT_memory_operand")))))<br>
++ (and (not (match_test "ix86_indirect_branch_register<wbr>"))<br>
++ (ior (and (not (match_test "TARGET_X32"))<br>
++ (match_operand 0 "sibcall_memory_operand"))<br>
++ (and (match_test "TARGET_X32 && Pmode == DImode")<br>
++ (match_operand 0 "GOT_memory_operand"))))))<br>
+<br>
+ ;; Return true if OP is a 32-bit GOT symbol operand.<br>
+ (define_predicate "GOT32_symbol_operand"<br>
+diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi<br>
+index fa63dc5..ad9f295 100644<br>
+--- a/gcc/doc/invoke.texi<br>
++++ b/gcc/doc/invoke.texi<br>
+@@ -1170,7 +1170,7 @@ See RS/6000 and PowerPC Options.<br>
+ -mavx256-split-unaligned-load -mavx256-split-unaligned-store @gol<br>
+ -malign-data=@var{type} -mstack-protector-guard=@var{g<wbr>uard} @gol<br>
+ -mmitigate-rop -mindirect-branch=@var{choice} @gol<br>
+--mfunction-return=@var{choic<wbr>e}}<br>
++-mfunction-return=@var{choic<wbr>e} -mindirect-branch-register}<br>
+<br>
+ @emph{x86 Windows Options}<br>
+ @gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol<br>
+@@ -24241,6 +24241,10 @@ object file. You can control this behavior for a specific function by<br>
+ using the function attribute @code{function_return}.<br>
+ @xref{Function Attributes}.<br>
+<br>
++@item -mindirect-branch-register<br>
++@opindex -mindirect-branch-register<br>
++Force indirect call and jump via register.<br>
++<br>
+ @end table<br>
+<br>
+ These @samp{-m} switches are supported in addition to the above<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-1.c<br>
+index e365ef5..60d0988 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-1.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-1.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-2.c<br>
+index 05a51ad..aac7516 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-2.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-2.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-3.c<br>
+index 3c0d4c3..9e24a38 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-3.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-3.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-4.c<br>
+index 14d4ef6..127b5d9 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-4.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-4.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-5.c<br>
+index b4836c3..fcaa18d 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-5.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-5.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target *-*-linux* } } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */<br>
+<br>
+ extern void bar (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-6.c<br>
+index 1f06bd1..e464928 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-6.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-6.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target *-*-linux* } } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */<br>
+<br>
+ extern void bar (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-7.c<br>
+index bc6b47a..17c2d0f 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-7.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-7.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
+<br>
+ void func0 (void);<br>
+ void func1 (void);<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-1.c<br>
+index 2257be3..9194ccf 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-1.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-1.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-2.c<br>
+index e9cfdc5..e51f261 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-2.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-2.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-3.c<br>
+index f938db0..4aeec18 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-3.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-3.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-4.c<br>
+index 4e58599..ac0e599 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-4.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-4.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-5.c<br>
+index b8d5024..573cf1e 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-5.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-5.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-6.c<br>
+index 455adab..b2b37fc 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-6.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-6.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-7.c<br>
+index 4595b84..4a43e19 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-7.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-7.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */<br>
+<br>
+ void func0 (void);<br>
+ void func1 (void);<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-1.c<br>
+index 5e3e118..ac84ab6 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-1.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-1.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target { ! x32 } } } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */<br>
+<br>
+ void (*dispatch) (char *);<br>
+ char buf[10];<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-2.c<br>
+index 2801aa4..ce655e8 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-2.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-2.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target { ! x32 } } } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */<br>
+<br>
+ void (*dispatch) (char *);<br>
+ char buf[10];<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-3.c<br>
+index 70b4fb3..d34485a 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-3.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-3.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */<br>
+<br>
+ void bar (char *);<br>
+ char buf[10];<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-4.c<br>
+index 3baf03e..0e19830 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-4.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-4.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */<br>
+<br>
+ void bar (char *);<br>
+ char buf[10];<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-1.c<br>
+index edeb264..579441f 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-1.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-1.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-2.c<br>
+index 1d00413..c92e6f2 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-2.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-2.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-3.c<br>
+index 06ebf1c..d9964c2 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-3.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-3.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-4.c<br>
+index 1c8f944..d4dca4d 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-4.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-4.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-5.c<br>
+index 21740ac..5c07e02 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-5.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-5.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target *-*-linux* } } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>" } */<br>
+<br>
+ extern void bar (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-6.c<br>
+index a77c1f4..3eb4406 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-6.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-6.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target *-*-linux* } } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>" } */<br>
+<br>
+ extern void bar (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-7.c<br>
+index 86e9fd1..aece938 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-7.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-7.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
+<br>
+ void func0 (void);<br>
+ void func1 (void);<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-1.c<br>
+index 3ecde87..3aba5e8 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-1.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-1.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-2.c<br>
+index df32a19..0f0181d 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-2.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-2.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-3.c<br>
+index 9540996..2eef6f3 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-3.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-3.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-4.c<br>
+index f3db6e2..e825a10 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-4.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-4.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
+<br>
+ typedef void (*dispatch_t)(long offset);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-5.c<br>
+index 0f687c3..c6d77e1 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-5.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-5.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target *-*-linux* } } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>" } */<br>
+<br>
+ extern void bar (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-6.c<br>
+index b27c6fc..6454827 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-6.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-6.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile { target *-*-linux* } } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>" } */<br>
+<br>
+ extern void bar (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-7.c<br>
+index 764a375..c67066c 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-7.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-7.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
+<br>
+ void func0 (void);<br>
+ void func1 (void);<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-register-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-register-1.c<br>
+new file mode 100644<br>
+index 0000000..7d396a3<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-register-1.c<br>
+@@ -0,0 +1,22 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk -mindirect-branch-register -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch;<br>
++<br>
++void<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch(offset);<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "mov\[ \t\](%eax|%rax), \\((%esp|%rsp)\\)" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */<br>
++/* { dg-final { scan-assembler-not "__x86_indirect_thunk\n" } } */<br>
++/* { dg-final { scan-assembler-not "__x86_indirect_thunk_bnd\n" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-register-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-register-2.c<br>
+new file mode 100644<br>
+index 0000000..e7e616b<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-register-2.c<br>
+@@ -0,0 +1,20 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk-inline -mindirect-branch-register -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch;<br>
++<br>
++void<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch(offset);<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "mov\[ \t\](%eax|%rax), \\((%esp|%rsp)\\)" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */<br>
++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-register-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-register-3.c<br>
+new file mode 100644<br>
+index 0000000..5320e92<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-register-3.c<br>
+@@ -0,0 +1,19 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk-extern -mindirect-branch-register -fno-pic" } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch;<br>
++<br>
++void<br>
++male_indirect_jump (long offset)<br>
++{<br>
++ dispatch(offset);<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
++/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */<br>
++/* { dg-final { scan-assembler-not {\t(pause|pause|nop)} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-10.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-10.c<br>
+index 3a6727b..e6fea84 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-10.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-10.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic" } */<br>
+<br>
+ extern void (*bar) (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-11.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-11.c<br>
+index b8f6818..e239ec4 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-11.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-11.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=thunk-extern -mindirect-branch=thunk -fno-pic" } */<br>
++/* { 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" } */<br>
+<br>
+ extern void (*bar) (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-12.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-12.c<br>
+index 01b0a02..fa31813 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-12.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-12.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */<br>
++/* { 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" } */<br>
+<br>
+ extern void (*bar) (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-13.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-13.c<br>
+index 4b497b5..fd5b41f 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-13.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-13.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */<br>
+<br>
+ extern void (*bar) (void);<br>
+ extern int foo (void) __attribute__ ((function_return("thunk")));<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-14.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-14.c<br>
+index 4ae4c44..d606373 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-14.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-14.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */<br>
+<br>
+ extern void (*bar) (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-15.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-15.c<br>
+index 5b5bc76..75e45e2 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-15.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-15.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -fno-pic" } */<br>
++/* { 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" } */<br>
+<br>
+ extern void (*bar) (void);<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-9.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-9.c<br>
+index fa24a1f..d1db41c 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-9.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-9.c<br>
+@@ -1,5 +1,5 @@<br>
+ /* { dg-do compile } */<br>
+-/* { dg-options "-O2 -mfunction-return=thunk -mindirect-branch=thunk -fno-pic" } */<br>
++/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk -mindirect-branch=thunk -fno-pic" } */<br>
+<br>
+ extern void (*bar) (void);<br>
+<br>
+--<br>
+2.7.4<br>
+<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0007-uclibc-locale-updat<wbr>e.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0007-uclibc-locale-updat<wbr>e.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0007-uclibc-locale-update.<wbr>patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0007-uclibc-locale-update.<wbr>patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0007-x86-Add-V-register-<wbr>operand-modifier.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0007-x86-Add-V-register-<wbr>operand-modifier.patch<br>
new file mode 100644<br>
index 0000000..714b0e1<br>
--- /dev/null<br>
+++ b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0007-x86-Add-V-register-<wbr>operand-modifier.patch<br>
@@ -0,0 +1,136 @@<br>
+From 8f0efd692eb8db06d6c00b759c872b<wbr>d2170b7f7b Mon Sep 17 00:00:00 2001<br>
+From: "H.J. Lu" <<a href="mailto:hjl.tools@gmail.com" target="_blank">hjl.tools@gmail.com</a>><br>
+Date: Sat, 6 Jan 2018 22:29:56 -0800<br>
+Subject: [PATCH 07/12] x86: Add 'V' register operand modifier<br>
+<br>
+Add 'V', a special modifier which prints the name of the full integer<br>
+register without '%'. For<br>
+<br>
+extern void (*func_p) (void);<br>
+<br>
+void<br>
+foo (void)<br>
+{<br>
+ asm ("call __x86_indirect_thunk_%V0" : : "a" (func_p));<br>
+}<br>
+<br>
+it generates:<br>
+<br>
+foo:<br>
+ movq func_p(%rip), %rax<br>
+ call __x86_indirect_thunk_rax<br>
+ ret<br>
+<br>
+gcc/<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-14 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ * config/i386/i386.c (print_reg): Print the name of the full<br>
+ integer register without '%'.<br>
+ (ix86_print_operand): Handle 'V'.<br>
+ * doc/extend.texi: Document 'V' modifier.<br>
+<br>
+gcc/testsuite/<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-14 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ * gcc.target/i386/indirect-thunk<wbr>-register-4.c: New test.<br>
+<br>
+Upstream-Status: Pending<br>
+---<br>
+ gcc/config/i386/i386.c | 13 ++++++++++++-<br>
+ gcc/doc/extend.texi | 3 +++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-register-4.c | 13 +++++++++++++<br>
+ 3 files changed, 28 insertions(+), 1 deletion(-)<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-register-4.c<br>
+<br>
+diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c<br>
+index 34e26a3..eeca7e5 100644<br>
+--- a/gcc/config/i386/i386.c<br>
++++ b/gcc/config/i386/i386.c<br>
+@@ -16869,6 +16869,7 @@ put_condition_code (enum rtx_code code, machine_mode mode, bool reverse,<br>
+ If CODE is 'h', pretend the reg is the 'high' byte register.<br>
+ If CODE is 'y', print "st(0)" instead of "st", if the reg is stack op.<br>
+ If CODE is 'd', duplicate the operand for AVX instruction.<br>
++ If CODE is 'V', print naked full integer register name without %.<br>
+ */<br>
+<br>
+ void<br>
+@@ -16879,7 +16880,7 @@ print_reg (rtx x, int code, FILE *file)<br>
+ unsigned int regno;<br>
+ bool duplicated;<br>
+<br>
+- if (ASSEMBLER_DIALECT == ASM_ATT)<br>
++ if (ASSEMBLER_DIALECT == ASM_ATT && code != 'V')<br>
+ putc ('%', file);<br>
+<br>
+ if (x == pc_rtx)<br>
+@@ -16922,6 +16923,14 @@ print_reg (rtx x, int code, FILE *file)<br>
+ && regno != FPSR_REG<br>
+ && regno != FPCR_REG);<br>
+<br>
++ if (code == 'V')<br>
++ {<br>
++ if (GENERAL_REGNO_P (regno))<br>
++ msize = GET_MODE_SIZE (word_mode);<br>
++ else<br>
++ error ("'V' modifier on non-integer register");<br>
++ }<br>
++<br>
+ duplicated = code == 'd' && TARGET_AVX;<br>
+<br>
+ switch (msize)<br>
+@@ -17035,6 +17044,7 @@ print_reg (rtx x, int code, FILE *file)<br>
+ & -- print some in-use local-dynamic symbol name.<br>
+ H -- print a memory address offset by 8; used for sse high-parts<br>
+ Y -- print condition for XOP pcom* instruction.<br>
++ V -- print naked full integer register name without %.<br>
+ + -- print a branch hint as 'cs' or 'ds' prefix<br>
+ ; -- print a semicolon (after prefixes due to bug in older gas).<br>
+ ~ -- print "i" if TARGET_AVX2, "f" otherwise.<br>
+@@ -17259,6 +17269,7 @@ ix86_print_operand (FILE *file, rtx x, int code)<br>
+ case 'X':<br>
+ case 'P':<br>
+ case 'p':<br>
++ case 'V':<br>
+ break;<br>
+<br>
+ case 's':<br>
+diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi<br>
+index 2cb6bd1..76ba1d4 100644<br>
+--- a/gcc/doc/extend.texi<br>
++++ b/gcc/doc/extend.texi<br>
+@@ -8511,6 +8511,9 @@ The table below shows the list of supported modifiers and their effects.<br>
+ @tab @code{2}<br>
+ @end multitable<br>
+<br>
++@code{V} is a special modifier which prints the name of the full integer<br>
++register without @code{%}.<br>
++<br>
+ @anchor{x86floatingpointasmope<wbr>rands}<br>
+ @subsubsection x86 Floating-Point @code{asm} Operands<br>
+<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-register-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-register-4.c<br>
+new file mode 100644<br>
+index 0000000..f0cd9b7<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-register-4.c<br>
+@@ -0,0 +1,13 @@<br>
++/* { dg-do compile } */<br>
++/* { dg-options "-O2 -mindirect-branch=keep -fno-pic" } */<br>
++<br>
++extern void (*func_p) (void);<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++ asm("call __x86_indirect_thunk_%V0" : : "a" (func_p));<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_eax" { target ia32 } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_rax" { target { ! ia32 } } } } */<br>
+--<br>
+2.7.4<br>
+<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0008-missing-execinfo_h.<wbr>patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0008-missing-execinfo_h.<wbr>patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/<a href="http://0008-missing-execinfo_h.pa" target="_blank">0008-missing-execinfo_h.pa</a><wbr>tch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/<a href="http://0008-missing-execinfo_h.pa" target="_blank">0008-missing-execinfo_h.pa</a><wbr>tch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0008-x86-Disallow-mindir<wbr>ect-branch-mfunction-return-wi<wbr>th-.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0008-x86-Disallow-mindir<wbr>ect-branch-mfunction-return-wi<wbr>th-.patch<br>
new file mode 100644<br>
index 0000000..8b95ec7<br>
--- /dev/null<br>
+++ b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0008-x86-Disallow-mindir<wbr>ect-branch-mfunction-return-wi<wbr>th-.patch<br>
@@ -0,0 +1,301 @@<br>
+From 8e0d9bf93e2e2ec03c544572aef4b0<wbr>3a8e7090f3 Mon Sep 17 00:00:00 2001<br>
+From: "H.J. Lu" <<a href="mailto:hjl.tools@gmail.com" target="_blank">hjl.tools@gmail.com</a>><br>
+Date: Sat, 13 Jan 2018 18:01:54 -0800<br>
+Subject: [PATCH 08/12] x86: Disallow -mindirect-branch=/-mfunction-<wbr>return=<br>
+ with -mcmodel=large<br>
+<br>
+Since the thunk function may not be reachable in large code model,<br>
+-mcmodel=large is incompatible with -mindirect-branch=thunk,<br>
+-mindirect-branch=thunk-exter<wbr>n, -mfunction-return=thunk and<br>
+-mfunction-return=thunk-exter<wbr>n. Issue an error when they are used with<br>
+-mcmodel=large.<br>
+<br>
+gcc/<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-14 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ * config/i386/i386.c (ix86_set_indirect_branch_type<wbr>): Disallow<br>
+ -mcmodel=large with -mindirect-branch=thunk,<br>
+ -mindirect-branch=thunk-exter<wbr>n, -mfunction-return=thunk and<br>
+ -mfunction-return=thunk-exter<wbr>n.<br>
+ * doc/invoke.texi: Document -mcmodel=large is incompatible with<br>
+ -mindirect-branch=thunk, -mindirect-branch=thunk-extern<wbr>,<br>
+ -mfunction-return=thunk and -mfunction-return=thunk-extern<wbr>.<br>
+<br>
+gcc/testsuite/<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-14 H.J. Lu <<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>><br>
+<br>
+ * gcc.target/i386/indirect-thunk<wbr>-10.c: New test.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-8.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-9.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-10.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-11.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-9.c: Likewise.<br>
+ * gcc.target/i386/ret-thunk-17.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-18.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-19.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-20.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-21.c<wbr>: Likewise.<br>
+<br>
+Upstream-Status: Pending<br>
+---<br>
+ gcc/config/i386/i386.c | 26 ++++++++++++++++++++++<br>
+ gcc/doc/invoke.texi | 11 +++++++++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-10.c | 7 ++++++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-8.c | 7 ++++++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-9.c | 7 ++++++<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-10.c | 9 ++++++++<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-11.c | 9 ++++++++<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-9.c | 9 ++++++++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-17.c | 7 ++++++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-18.c | 8 +++++++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-19.c | 8 +++++++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-20.c | 9 ++++++++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-21.c | 9 ++++++++<br>
+ 13 files changed, 126 insertions(+)<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-10.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-8.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-9.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-attr-10.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-attr-11.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-attr-9.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-17.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-18.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-19.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-20.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-21.c<br>
+<br>
+diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c<br>
+index eeca7e5..9c038be 100644<br>
+--- a/gcc/config/i386/i386.c<br>
++++ b/gcc/config/i386/i386.c<br>
+@@ -6389,6 +6389,19 @@ ix86_set_indirect_branch_type (tree fndecl)<br>
+ }<br>
+ else<br>
+ cfun->machine->indirect_branc<wbr>h_type = ix86_indirect_branch;<br>
++<br>
++ /* -mcmodel=large is not compatible with -mindirect-branch=thunk<br>
++ nor -mindirect-branch=thunk-extern<wbr>. */<br>
++ if ((ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC)<br>
++ && ((cfun->machine->indirect_bran<wbr>ch_type<br>
++ == indirect_branch_thunk_extern)<br>
++ || (cfun->machine->indirect_branc<wbr>h_type<br>
++ == indirect_branch_thunk)))<br>
++ error ("%<-mindirect-branch=%s%> and %<-mcmodel=large%> are not "<br>
++ "compatible",<br>
++ ((cfun->machine->indirect_bra<wbr>nch_type<br>
++ == indirect_branch_thunk_extern)<br>
++ ? "thunk-extern" : "thunk"));<br>
+ }<br>
+<br>
+ if (cfun->machine->function_retur<wbr>n_type == indirect_branch_unset)<br>
+@@ -6414,6 +6427,19 @@ ix86_set_indirect_branch_type (tree fndecl)<br>
+ }<br>
+ else<br>
+ cfun->machine->function_retur<wbr>n_type = ix86_function_return;<br>
++<br>
++ /* -mcmodel=large is not compatible with -mfunction-return=thunk<br>
++ nor -mfunction-return=thunk-extern<wbr>. */<br>
++ if ((ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC)<br>
++ && ((cfun->machine->function_retu<wbr>rn_type<br>
++ == indirect_branch_thunk_extern)<br>
++ || (cfun->machine->function_retur<wbr>n_type<br>
++ == indirect_branch_thunk)))<br>
++ error ("%<-mfunction-return=%s%> and %<-mcmodel=large%> are not "<br>
++ "compatible",<br>
++ ((cfun->machine->function_ret<wbr>urn_type<br>
++ == indirect_branch_thunk_extern)<br>
++ ? "thunk-extern" : "thunk"));<br>
+ }<br>
+ }<br>
+<br>
+diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi<br>
+index ad9f295..48e827f 100644<br>
+--- a/gcc/doc/invoke.texi<br>
++++ b/gcc/doc/invoke.texi<br>
+@@ -24230,6 +24230,11 @@ to external call and return thunk provided in a separate object file.<br>
+ You can control this behavior for a specific function by using the<br>
+ function attribute @code{indirect_branch}. @xref{Function Attributes}.<br>
+<br>
++Note that @option{-mcmodel=large} is incompatible with<br>
++@option{-mindirect-branch=th<wbr>unk} nor<br>
++@option{-mindirect-branch=th<wbr>unk-extern} since the thunk function may<br>
++not be reachable in large code model.<br>
++<br>
+ @item -mfunction-return=@var{choice}<br>
+ @opindex -mfunction-return<br>
+ Convert function return with @var{choice}. The default is @samp{keep},<br>
+@@ -24241,6 +24246,12 @@ object file. You can control this behavior for a specific function by<br>
+ using the function attribute @code{function_return}.<br>
+ @xref{Function Attributes}.<br>
+<br>
++Note that @option{-mcmodel=large} is incompatible with<br>
++@option{-mfunction-return=th<wbr>unk} nor<br>
++@option{-mfunction-return=th<wbr>unk-extern} since the thunk function may<br>
++not be reachable in large code model.<br>
++<br>
++<br>
+ @item -mindirect-branch-register<br>
+ @opindex -mindirect-branch-register<br>
+ Force indirect call and jump via register.<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-10.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-10.c<br>
+new file mode 100644<br>
+index 0000000..a0674bd<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-10.c<br>
+@@ -0,0 +1,7 @@<br>
++/* { dg-do compile { target { lp64 } } } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk-inline -mfunction-return=keep -mcmodel=large" } */<br>
++<br>
++void<br>
++bar (void)<br>
++{<br>
++}<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-8.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-8.c<br>
+new file mode 100644<br>
+index 0000000..7a80a89<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-8.c<br>
+@@ -0,0 +1,7 @@<br>
++/* { dg-do compile { target { lp64 } } } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk -mfunction-return=keep -mcmodel=large" } */<br>
++<br>
++void<br>
++bar (void)<br>
++{ /* { dg-error "'-mindirect-branch=thunk' and '-mcmodel=large' are not compatible" } */<br>
++}<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-9.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-9.c<br>
+new file mode 100644<br>
+index 0000000..d4d45c5<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-9.c<br>
+@@ -0,0 +1,7 @@<br>
++/* { dg-do compile { target { lp64 } } } */<br>
++/* { dg-options "-O2 -mindirect-branch=thunk-extern -mfunction-return=keep -mcmodel=large" } */<br>
++<br>
++void<br>
++bar (void)<br>
++{ /* { dg-error "'-mindirect-branch=thunk-exte<wbr>rn' and '-mcmodel=large' are not compatible" } */<br>
++}<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-10.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-10.c<br>
+new file mode 100644<br>
+index 0000000..3a2aead<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-10.c<br>
+@@ -0,0 +1,9 @@<br>
++/* { dg-do compile { target { lp64 } } } */<br>
++/* { dg-options "-O2 -mindirect-branch=keep -mfunction-return=keep -mcmodel=large" } */<br>
++/* { dg-additional-options "-fPIC" { target fpic } } */<br>
++<br>
++__attribute__ ((indirect_branch("thunk-exter<wbr>n")))<br>
++void<br>
++bar (void)<br>
++{ /* { dg-error "'-mindirect-branch=thunk-exte<wbr>rn' and '-mcmodel=large' are not compatible" } */<br>
++}<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-11.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-11.c<br>
+new file mode 100644<br>
+index 0000000..8e52f03<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-11.c<br>
+@@ -0,0 +1,9 @@<br>
++/* { dg-do compile { target { lp64 } } } */<br>
++/* { dg-options "-O2 -mindirect-branch=keep -mfunction-return=keep -mcmodel=large" } */<br>
++/* { dg-additional-options "-fPIC" { target fpic } } */<br>
++<br>
++__attribute__ ((indirect_branch("thunk-inlin<wbr>e")))<br>
++void<br>
++bar (void)<br>
++{<br>
++}<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-9.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-9.c<br>
+new file mode 100644<br>
+index 0000000..bdaa4f6<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-9.c<br>
+@@ -0,0 +1,9 @@<br>
++/* { dg-do compile { target { lp64 } } } */<br>
++/* { dg-options "-O2 -mindirect-branch=keep -mfunction-return=keep -mcmodel=large" } */<br>
++/* { dg-additional-options "-fPIC" { target fpic } } */<br>
++<br>
++__attribute__ ((indirect_branch("thunk")))<br>
++void<br>
++bar (void)<br>
++{ /* { dg-error "'-mindirect-branch=thunk' and '-mcmodel=large' are not compatible" } */<br>
++}<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-17.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-17.c<br>
+new file mode 100644<br>
+index 0000000..0605e2c<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-17.c<br>
+@@ -0,0 +1,7 @@<br>
++/* { dg-do compile { target { lp64 } } } */<br>
++/* { dg-options "-O2 -mfunction-return=thunk -mindirect-branch=keep -mcmodel=large" } */<br>
++<br>
++void<br>
++bar (void)<br>
++{ /* { dg-error "'-mfunction-return=thunk' and '-mcmodel=large' are not compatible" } */<br>
++}<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-18.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-18.c<br>
+new file mode 100644<br>
+index 0000000..307019d<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-18.c<br>
+@@ -0,0 +1,8 @@<br>
++/* { dg-do compile { target { lp64 } } } */<br>
++/* { dg-options "-O2 -mfunction-return=thunk-extern -mindirect-branch=keep -mcmodel=large" } */<br>
++/* { dg-additional-options "-fPIC" { target fpic } } */<br>
++<br>
++void<br>
++bar (void)<br>
++{ /* { dg-error "'-mfunction-return=thunk-exte<wbr>rn' and '-mcmodel=large' are not compatible" } */<br>
++}<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-19.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-19.c<br>
+new file mode 100644<br>
+index 0000000..772617f<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-19.c<br>
+@@ -0,0 +1,8 @@<br>
++/* { dg-do compile { target { lp64 } } } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -mcmodel=large" } */<br>
++<br>
++__attribute__ ((function_return("thunk")))<br>
++void<br>
++bar (void)<br>
++{ /* { dg-error "'-mfunction-return=thunk' and '-mcmodel=large' are not compatible" } */<br>
++}<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-20.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-20.c<br>
+new file mode 100644<br>
+index 0000000..1e9f9bd<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-20.c<br>
+@@ -0,0 +1,9 @@<br>
++/* { dg-do compile { target { lp64 } } } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -mcmodel=large" } */<br>
++/* { dg-additional-options "-fPIC" { target fpic } } */<br>
++<br>
++__attribute__ ((function_return("thunk-exter<wbr>n")))<br>
++void<br>
++bar (void)<br>
++{ /* { dg-error "'-mfunction-return=thunk-exte<wbr>rn' and '-mcmodel=large' are not compatible" } */<br>
++}<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-21.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-21.c<br>
+new file mode 100644<br>
+index 0000000..eea07f7<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-21.c<br>
+@@ -0,0 +1,9 @@<br>
++/* { dg-do compile { target { lp64 } } } */<br>
++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -mcmodel=large" } */<br>
++/* { dg-additional-options "-fPIC" { target fpic } } */<br>
++<br>
++__attribute__ ((function_return("thunk-inlin<wbr>e")))<br>
++void<br>
++bar (void)<br>
++{<br>
++}<br>
+--<br>
+2.7.4<br>
+<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0009-Use-INVALID_REGNUM-<wbr>in-indirect-thunk-processing.p<wbr>atch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0009-Use-INVALID_REGNUM-<wbr>in-indirect-thunk-processing.p<wbr>atch<br>
new file mode 100644<br>
index 0000000..735bf0e<br>
--- /dev/null<br>
+++ b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0009-Use-INVALID_REGNUM-<wbr>in-indirect-thunk-processing.p<wbr>atch<br>
@@ -0,0 +1,123 @@<br>
+From 3eff2adada2b1667b0e76496fa559e<wbr>0c248ecd84 Mon Sep 17 00:00:00 2001<br>
+From: uros <uros@138bc75d-0d04-0410-961f-<wbr>82ee72b054a4><br>
+Date: Thu, 25 Jan 2018 19:39:01 +0000<br>
+Subject: [PATCH 09/12] Use INVALID_REGNUM in indirect thunk processing<br>
+<br>
+ Backport from mainline<br>
+ 2018-01-17 Uros Bizjak <<a href="mailto:ubizjak@gmail.com" target="_blank">ubizjak@gmail.com</a>><br>
+<br>
+ * config/i386/i386.c (indirect_thunk_name): Declare regno<br>
+ as unsigned int. Compare regno with INVALID_REGNUM.<br>
+ (output_indirect_thunk): Ditto.<br>
+ (output_indirect_thunk_functi<wbr>on): Ditto.<br>
+ (ix86_code_end): Declare regno as unsigned int. Use INVALID_REGNUM<br>
+ in the call to output_indirect_thunk_function<wbr>.<br>
+<br>
+git-svn-id: svn+ssh://<a href="http://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@257067" rel="noreferrer" target="_blank">gcc.gnu.org/svn/gcc/<wbr>branches/gcc-7-branch@257067</a> 138bc75d-0d04-0410-961f-82ee72<wbr>b054a4<br>
+<br>
+Upstream-Status: Pending<br>
+---<br>
+ gcc/config/i386/i386.c | 30 +++++++++++++++---------------<br>
+ 1 file changed, 15 insertions(+), 15 deletions(-)<br>
+<br>
+diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c<br>
+index 9c038be..4012657 100644<br>
+--- a/gcc/config/i386/i386.c<br>
++++ b/gcc/config/i386/i386.c<br>
+@@ -11087,16 +11087,16 @@ static int indirect_thunks_bnd_used;<br>
+ /* Fills in the label name that should be used for the indirect thunk. */<br>
+<br>
+ static void<br>
+-indirect_thunk_name (char name[32], int regno, bool need_bnd_p,<br>
+- bool ret_p)<br>
++indirect_thunk_name (char name[32], unsigned int regno,<br>
++ bool need_bnd_p, bool ret_p)<br>
+ {<br>
+- if (regno >= 0 && ret_p)<br>
++ if (regno != INVALID_REGNUM && ret_p)<br>
+ gcc_unreachable ();<br>
+<br>
+ if (USE_HIDDEN_LINKONCE)<br>
+ {<br>
+ const char *bnd = need_bnd_p ? "_bnd" : "";<br>
+- if (regno >= 0)<br>
++ if (regno != INVALID_REGNUM)<br>
+ {<br>
+ const char *reg_prefix;<br>
+ if (LEGACY_INT_REGNO_P (regno))<br>
+@@ -11114,7 +11114,7 @@ indirect_thunk_name (char name[32], int regno, bool need_bnd_p,<br>
+ }<br>
+ else<br>
+ {<br>
+- if (regno >= 0)<br>
++ if (regno != INVALID_REGNUM)<br>
+ {<br>
+ if (need_bnd_p)<br>
+ ASM_GENERATE_INTERNAL_LABEL (name, "LITBR", regno);<br>
+@@ -11166,7 +11166,7 @@ indirect_thunk_name (char name[32], int regno, bool need_bnd_p,<br>
+ */<br>
+<br>
+ static void<br>
+-output_indirect_thunk (bool need_bnd_p, int regno)<br>
++output_indirect_thunk (bool need_bnd_p, unsigned int regno)<br>
+ {<br>
+ char indirectlabel1[32];<br>
+ char indirectlabel2[32];<br>
+@@ -11196,7 +11196,7 @@ output_indirect_thunk (bool need_bnd_p, int regno)<br>
+<br>
+ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2);<br>
+<br>
+- if (regno >= 0)<br>
++ if (regno != INVALID_REGNUM)<br>
+ {<br>
+ /* MOV. */<br>
+ rtx xops[2];<br>
+@@ -11220,12 +11220,12 @@ output_indirect_thunk (bool need_bnd_p, int regno)<br>
+ }<br>
+<br>
+ /* Output a funtion with a call and return thunk for indirect branch.<br>
+- If BND_P is true, the BND prefix is needed. If REGNO != -1, the<br>
+- function address is in REGNO. Otherwise, the function address is<br>
++ If BND_P is true, the BND prefix is needed. If REGNO != INVALID_REGNUM,<br>
++ the function address is in REGNO. Otherwise, the function address is<br>
+ on the top of stack. */<br>
+<br>
+ static void<br>
+-output_indirect_thunk_functi<wbr>on (bool need_bnd_p, int regno)<br>
++output_indirect_thunk_functi<wbr>on (bool need_bnd_p, unsigned int regno)<br>
+ {<br>
+ char name[32];<br>
+ tree decl;<br>
+@@ -11274,7 +11274,7 @@ output_indirect_thunk_function (bool need_bnd_p, int regno)<br>
+ ASM_OUTPUT_LABEL (asm_out_file, name);<br>
+ }<br>
+<br>
+- if (regno < 0)<br>
++ if (regno == INVALID_REGNUM)<br>
+ {<br>
+ /* Create alias for __x86.return_thunk/__x86.retur<wbr>n_thunk_bnd. */<br>
+ char alias[32];<br>
+@@ -11348,16 +11348,16 @@ static void<br>
+ ix86_code_end (void)<br>
+ {<br>
+ rtx xops[2];<br>
+- int regno;<br>
++ unsigned int regno;<br>
+<br>
+ if (indirect_thunk_needed)<br>
+- output_indirect_thunk_function (false, -1);<br>
++ output_indirect_thunk_function (false, INVALID_REGNUM);<br>
+ if (indirect_thunk_bnd_needed)<br>
+- output_indirect_thunk_function (true, -1);<br>
++ output_indirect_thunk_function (true, INVALID_REGNUM);<br>
+<br>
+ for (regno = FIRST_REX_INT_REG; regno <= LAST_REX_INT_REG; regno++)<br>
+ {<br>
+- int i = regno - FIRST_REX_INT_REG + LAST_INT_REG + 1;<br>
++ unsigned int i = regno - FIRST_REX_INT_REG + LAST_INT_REG + 1;<br>
+ if ((indirect_thunks_used & (1 << i)))<br>
+ output_indirect_thunk_functio<wbr>n (false, regno);<br>
+<br>
+--<br>
+2.7.4<br>
+<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0009-c99-snprintf.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0009-c99-snprintf.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0009-c99-snprintf.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0009-c99-snprintf.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0010-gcc-poison-system-d<wbr>irectories.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0010-gcc-poison-system-d<wbr>irectories.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0010-gcc-poison-system-dir<wbr>ectories.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0010-gcc-poison-system-dir<wbr>ectories.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0010-i386-Pass-INVALID_R<wbr>EGNUM-as-invalid-register-numb<wbr>er.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0010-i386-Pass-INVALID_R<wbr>EGNUM-as-invalid-register-numb<wbr>er.patch<br>
new file mode 100644<br>
index 0000000..1833a14<br>
--- /dev/null<br>
+++ b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0010-i386-Pass-INVALID_R<wbr>EGNUM-as-invalid-register-numb<wbr>er.patch<br>
@@ -0,0 +1,43 @@<br>
+From c4300d9ad683e693c90d02d4f1b131<wbr>83bf2d4acc Mon Sep 17 00:00:00 2001<br>
+From: hjl <hjl@138bc75d-0d04-0410-961f-8<wbr>2ee72b054a4><br>
+Date: Fri, 2 Feb 2018 16:47:02 +0000<br>
+Subject: [PATCH 10/12] i386: Pass INVALID_REGNUM as invalid register number<br>
+<br>
+ Backport from mainline<br>
+ * config/i386/i386.c (ix86_output_function_return): Pass<br>
+ INVALID_REGNUM, instead of -1, as invalid register number to<br>
+ indirect_thunk_name and output_indirect_thunk.<br>
+<br>
+git-svn-id: svn+ssh://<a href="http://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@257341" rel="noreferrer" target="_blank">gcc.gnu.org/svn/gcc/<wbr>branches/gcc-7-branch@257341</a> 138bc75d-0d04-0410-961f-82ee72<wbr>b054a4<br>
+<br>
+Upstream-Status: Pending<br>
+---<br>
+ gcc/config/i386/i386.c | 5 +++--<br>
+ 1 file changed, 3 insertions(+), 2 deletions(-)<br>
+<br>
+diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c<br>
+index 4012657..66502ee 100644<br>
+--- a/gcc/config/i386/i386.c<br>
++++ b/gcc/config/i386/i386.c<br>
+@@ -28056,7 +28056,8 @@ ix86_output_function_return (bool long_p)<br>
+ {<br>
+ bool need_thunk = (cfun->machine->function_retur<wbr>n_type<br>
+ == indirect_branch_thunk);<br>
+- indirect_thunk_name (thunk_name, -1, need_bnd_p, true);<br>
++ indirect_thunk_name (thunk_name, INVALID_REGNUM, need_bnd_p,<br>
++ true);<br>
+ if (need_bnd_p)<br>
+ {<br>
+ indirect_thunk_bnd_needed |= need_thunk;<br>
+@@ -28069,7 +28070,7 @@ ix86_output_function_return (bool long_p)<br>
+ }<br>
+ }<br>
+ else<br>
+- output_indirect_thunk (need_bnd_p, -1);<br>
++ output_indirect_thunk (need_bnd_p, INVALID_REGNUM);<br>
+<br>
+ return "";<br>
+ }<br>
+--<br>
+2.7.4<br>
+<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0011-gcc-poison-dir-exte<wbr>nd.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0011-gcc-poison-dir-exte<wbr>nd.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0011-gcc-poison-dir-extend<wbr>.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0011-gcc-poison-dir-extend<wbr>.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0011-i386-Update-mfuncti<wbr>on-return-for-return-with-pop.<wbr>patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0011-i386-Update-mfuncti<wbr>on-return-for-return-with-pop.<wbr>patch<br>
new file mode 100644<br>
index 0000000..7dd325d<br>
--- /dev/null<br>
+++ b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0011-i386-Update-mfuncti<wbr>on-return-for-return-with-pop.<wbr>patch<br>
@@ -0,0 +1,450 @@<br>
+From b3a2269c7884378a9afd394ac7e669<wbr>aab0443b57 Mon Sep 17 00:00:00 2001<br>
+From: hjl <hjl@138bc75d-0d04-0410-961f-8<wbr>2ee72b054a4><br>
+Date: Mon, 26 Feb 2018 15:29:30 +0000<br>
+Subject: [PATCH 11/12] i386: Update -mfunction-return= for return with pop<br>
+<br>
+When -mfunction-return= is used, simple_return_pop_internal should pop<br>
+return address into ECX register, adjust stack by bytes to pop from stack<br>
+and jump to the return thunk via ECX register.<br>
+<br>
+Revision 257992 removed the bool argument from ix86_output_indirect_jmp.<br>
+Update comments to reflect it.<br>
+<br>
+Tested on i686 and x86-64.<br>
+<br>
+ Backport from mainline<br>
+ * config/i386/i386.c (ix86_output_indirect_jmp): Update comments.<br>
+<br>
+ PR target/84530<br>
+ * config/i386/i386-protos.h (ix86_output_indirect_jmp): Remove<br>
+ the bool argument.<br>
+ (ix86_output_indirect_functio<wbr>n_return): New prototype.<br>
+ (ix86_split_simple_return_pop<wbr>_internal): Likewise.<br>
+ * config/i386/i386.c (indirect_return_via_cx): New.<br>
+ (indirect_return_via_cx_bnd): Likewise.<br>
+ (indirect_thunk_name): Handle return va CX_REG.<br>
+ (output_indirect_thunk_functi<wbr>on): Create alias for<br>
+ __x86_return_thunk_[re]cx and __x86_return_thunk_[re]cx_bnd.<br>
+ (ix86_output_indirect_jmp): Remove the bool argument.<br>
+ (ix86_output_indirect_functio<wbr>n_return): New function.<br>
+ (ix86_split_simple_return_pop<wbr>_internal): Likewise.<br>
+ * config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> (*indirect_jump): Don't pass false<br>
+ to ix86_output_indirect_jmp.<br>
+ (*tablejump_1): Likewise.<br>
+ (simple_return_pop_internal): Change it to define_insn_and_split.<br>
+ Call ix86_split_simple_return_pop_i<wbr>nternal to split it for<br>
+ -mfunction-return=.<br>
+ (simple_return_indirect_inter<wbr>nal): Call<br>
+ ix86_output_indirect_function<wbr>_return instead of<br>
+ ix86_output_indirect_jmp.<br>
+<br>
+gcc/testsuite/<br>
+<br>
+ Backport from mainline<br>
+ PR target/84530<br>
+ * gcc.target/i386/ret-thunk-22.c<wbr>: New test.<br>
+ * gcc.target/i386/ret-thunk-23.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-24.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-25.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-26.c<wbr>: Likewise.<br>
+<br>
+Upstream-Status: Pending<br>
+---<br>
+ gcc/config/i386/i386-protos.h | 4 +-<br>
+ gcc/config/i386/i386.c | 127 +++++++++++++++++++++++----<br>
+ gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> | 11 ++-<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-22.c | 15 ++++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-23.c | 15 ++++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-24.c | 15 ++++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-25.c | 15 ++++<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-26.c | 40 +++++++++<br>
+ 8 files changed, 222 insertions(+), 20 deletions(-)<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-22.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-23.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-24.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-25.c<br>
+ create mode 100644 gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-26.c<br>
+<br>
+diff --git a/gcc/config/i386/i386-protos.<wbr>h b/gcc/config/i386/i386-protos.<wbr>h<br>
+index 620d70e..c7a0ccb5 100644<br>
+--- a/gcc/config/i386/i386-protos.<wbr>h<br>
++++ b/gcc/config/i386/i386-protos.<wbr>h<br>
+@@ -311,8 +311,10 @@ extern enum attr_cpu ix86_schedule;<br>
+ #endif<br>
+<br>
+ extern const char * ix86_output_call_insn (rtx_insn *insn, rtx call_op);<br>
+-extern const char * ix86_output_indirect_jmp (rtx call_op, bool ret_p);<br>
++extern const char * ix86_output_indirect_jmp (rtx call_op);<br>
+ extern const char * ix86_output_function_return (bool long_p);<br>
++extern const char * ix86_output_indirect_function_<wbr>return (rtx ret_op);<br>
++extern void ix86_split_simple_return_pop_i<wbr>nternal (rtx);<br>
+ extern bool ix86_operands_ok_for_move_mult<wbr>iple (rtx *operands, bool load,<br>
+ enum machine_mode mode);<br>
+<br>
+diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c<br>
+index 66502ee..21c3c18 100644<br>
+--- a/gcc/config/i386/i386.c<br>
++++ b/gcc/config/i386/i386.c<br>
+@@ -11080,6 +11080,12 @@ static int indirect_thunks_used;<br>
+ by call and return thunks functions with the BND prefix. */<br>
+ static int indirect_thunks_bnd_used;<br>
+<br>
++/* True if return thunk function via CX is needed. */<br>
++static bool indirect_return_via_cx;<br>
++/* True if return thunk function via CX with the BND prefix is<br>
++ needed. */<br>
++static bool indirect_return_via_cx_bnd;<br>
++<br>
+ #ifndef INDIRECT_LABEL<br>
+ # define INDIRECT_LABEL "LIND"<br>
+ #endif<br>
+@@ -11090,12 +11096,13 @@ static void<br>
+ indirect_thunk_name (char name[32], unsigned int regno,<br>
+ bool need_bnd_p, bool ret_p)<br>
+ {<br>
+- if (regno != INVALID_REGNUM && ret_p)<br>
++ if (regno != INVALID_REGNUM && regno != CX_REG && ret_p)<br>
+ gcc_unreachable ();<br>
+<br>
+ if (USE_HIDDEN_LINKONCE)<br>
+ {<br>
+ const char *bnd = need_bnd_p ? "_bnd" : "";<br>
++ const char *ret = ret_p ? "return" : "indirect";<br>
+ if (regno != INVALID_REGNUM)<br>
+ {<br>
+ const char *reg_prefix;<br>
+@@ -11103,14 +11110,11 @@ indirect_thunk_name (char name[32], unsigned int regno,<br>
+ reg_prefix = TARGET_64BIT ? "r" : "e";<br>
+ else<br>
+ reg_prefix = "";<br>
+- sprintf (name, "__x86_indirect_thunk%s_%s%s",<br>
+- bnd, reg_prefix, reg_names[regno]);<br>
++ sprintf (name, "__x86_%s_thunk%s_%s%s",<br>
++ ret, bnd, reg_prefix, reg_names[regno]);<br>
+ }<br>
+ else<br>
+- {<br>
+- const char *ret = ret_p ? "return" : "indirect";<br>
+- sprintf (name, "__x86_%s_thunk%s", ret, bnd);<br>
+- }<br>
++ sprintf (name, "__x86_%s_thunk%s", ret, bnd);<br>
+ }<br>
+ else<br>
+ {<br>
+@@ -11274,9 +11278,23 @@ output_indirect_thunk_function (bool need_bnd_p, unsigned int regno)<br>
+ ASM_OUTPUT_LABEL (asm_out_file, name);<br>
+ }<br>
+<br>
++ /* Create alias for __x86_return_thunk/__x86_retur<wbr>n_thunk_bnd or<br>
++ __x86_return_thunk_ecx/__x86_<wbr>return_thunk_ecx_bnd. */<br>
++ bool need_alias;<br>
+ if (regno == INVALID_REGNUM)<br>
++ need_alias = true;<br>
++ else if (regno == CX_REG)<br>
++ {<br>
++ if (need_bnd_p)<br>
++ need_alias = indirect_return_via_cx_bnd;<br>
++ else<br>
++ need_alias = indirect_return_via_cx;<br>
++ }<br>
++ else<br>
++ need_alias = false;<br>
++<br>
++ if (need_alias)<br>
+ {<br>
+- /* Create alias for __x86.return_thunk/__x86.retur<wbr>n_thunk_bnd. */<br>
+ char alias[32];<br>
+<br>
+ indirect_thunk_name (alias, regno, need_bnd_p, true);<br>
+@@ -28019,18 +28037,17 @@ ix86_output_indirect_branch (rtx call_op, const char *xasm,<br>
+ else<br>
+ ix86_output_indirect_branch_v<wbr>ia_push (call_op, xasm, sibcall_p);<br>
+ }<br>
+-/* Output indirect jump. CALL_OP is the jump target. Jump is a<br>
+- function return if RET_P is true. */<br>
++<br>
++/* Output indirect jump. CALL_OP is the jump target. */<br>
+<br>
+ const char *<br>
+-ix86_output_indirect_jmp (rtx call_op, bool ret_p)<br>
++ix86_output_indirect_jmp (rtx call_op)<br>
+ {<br>
+ if (cfun->machine->indirect_branc<wbr>h_type != indirect_branch_keep)<br>
+ {<br>
+- /* We can't have red-zone if this isn't a function return since<br>
+- "call" in the indirect thunk pushes the return address onto<br>
+- stack, destroying red-zone. */<br>
+- if (!ret_p && ix86_red_zone_size != 0)<br>
++ /* We can't have red-zone since "call" in the indirect thunk<br>
++ pushes the return address onto stack, destroying red-zone. */<br>
++ if (ix86_red_zone_size != 0)<br>
+ gcc_unreachable ();<br>
+<br>
+ ix86_output_indirect_branch (call_op, "%0", true);<br>
+@@ -28081,6 +28098,86 @@ ix86_output_function_return (bool long_p)<br>
+ return "rep%; ret";<br>
+ }<br>
+<br>
++/* Output indirect function return. RET_OP is the function return<br>
++ target. */<br>
++<br>
++const char *<br>
++ix86_output_indirect_functio<wbr>n_return (rtx ret_op)<br>
++{<br>
++ if (cfun->machine->function_retur<wbr>n_type != indirect_branch_keep)<br>
++ {<br>
++ char thunk_name[32];<br>
++ bool need_bnd_p = ix86_bnd_prefixed_insn_p (current_output_insn);<br>
++ unsigned int regno = REGNO (ret_op);<br>
++ gcc_assert (regno == CX_REG);<br>
++<br>
++ if (cfun->machine->function_retur<wbr>n_type<br>
++ != indirect_branch_thunk_inline)<br>
++ {<br>
++ bool need_thunk = (cfun->machine->function_retur<wbr>n_type<br>
++ == indirect_branch_thunk);<br>
++ indirect_thunk_name (thunk_name, regno, need_bnd_p, true);<br>
++ if (need_bnd_p)<br>
++ {<br>
++ if (need_thunk)<br>
++ {<br>
++ indirect_return_via_cx_bnd = true;<br>
++ indirect_thunks_bnd_used |= 1 << CX_REG;<br>
++ }<br>
++ fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name);<br>
++ }<br>
++ else<br>
++ {<br>
++ if (need_thunk)<br>
++ {<br>
++ indirect_return_via_cx = true;<br>
++ indirect_thunks_used |= 1 << CX_REG;<br>
++ }<br>
++ fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);<br>
++ }<br>
++ }<br>
++ else<br>
++ output_indirect_thunk (need_bnd_p, regno);<br>
++<br>
++ return "";<br>
++ }<br>
++ else<br>
++ return "%!jmp\t%A0";<br>
++}<br>
++<br>
++/* Split simple return with popping POPC bytes from stack to indirect<br>
++ branch with stack adjustment . */<br>
++<br>
++void<br>
++ix86_split_simple_return_pop<wbr>_internal (rtx popc)<br>
++{<br>
++ struct machine_function *m = cfun->machine;<br>
++ rtx ecx = gen_rtx_REG (SImode, CX_REG);<br>
++ rtx_insn *insn;<br>
++<br>
++ /* There is no "pascal" calling convention in any 64bit ABI. */<br>
++ gcc_assert (!TARGET_64BIT);<br>
++<br>
++ insn = emit_insn (gen_pop (ecx));<br>
++ m->fs.cfa_offset -= UNITS_PER_WORD;<br>
++ m->fs.sp_offset -= UNITS_PER_WORD;<br>
++<br>
++ rtx x = plus_constant (Pmode, stack_pointer_rtx, UNITS_PER_WORD);<br>
++ x = gen_rtx_SET (stack_pointer_rtx, x);<br>
++ add_reg_note (insn, REG_CFA_ADJUST_CFA, x);<br>
++ add_reg_note (insn, REG_CFA_REGISTER, gen_rtx_SET (ecx, pc_rtx));<br>
++ RTX_FRAME_RELATED_P (insn) = 1;<br>
++<br>
++ x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, popc);<br>
++ x = gen_rtx_SET (stack_pointer_rtx, x);<br>
++ insn = emit_insn (x);<br>
++ add_reg_note (insn, REG_CFA_ADJUST_CFA, x);<br>
++ RTX_FRAME_RELATED_P (insn) = 1;<br>
++<br>
++ /* Now return address is in ECX. */<br>
++ emit_jump_insn (gen_simple_return_indirect_in<wbr>ternal (ecx));<br>
++}<br>
++<br>
+ /* Output the assembly for a call instruction. */<br>
+<br>
+ const char *<br>
+diff --git a/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> b/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a><br>
+index 05a88ff..857466a 100644<br>
+--- a/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a><br>
++++ b/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a><br>
+@@ -11813,7 +11813,7 @@<br>
+ (define_insn "*indirect_jump"<br>
+ [(set (pc) (match_operand:W 0 "indirect_branch_operand" "rBw"))]<br>
+ ""<br>
+- "* return ix86_output_indirect_jmp (operands[0], false);"<br>
++ "* return ix86_output_indirect_jmp (operands[0]);"<br>
+ [(set (attr "type")<br>
+ (if_then_else (match_test "(cfun->machine->indirect_bran<wbr>ch_type<br>
+ != indirect_branch_keep)")<br>
+@@ -11868,7 +11868,7 @@<br>
+ [(set (pc) (match_operand:W 0 "indirect_branch_operand" "rBw"))<br>
+ (use (label_ref (match_operand 1)))]<br>
+ ""<br>
+- "* return ix86_output_indirect_jmp (operands[0], false);"<br>
++ "* return ix86_output_indirect_jmp (operands[0]);"<br>
+ [(set (attr "type")<br>
+ (if_then_else (match_test "(cfun->machine->indirect_bran<wbr>ch_type<br>
+ != indirect_branch_keep)")<br>
+@@ -12520,11 +12520,14 @@<br>
+ (set_attr "prefix_rep" "1")<br>
+ (set_attr "modrm" "0")])<br>
+<br>
+-(define_insn "simple_return_pop_internal"<br>
++(define_insn_and_split "simple_return_pop_internal"<br>
+ [(simple_return)<br>
+ (use (match_operand:SI 0 "const_int_operand"))]<br>
+ "reload_completed"<br>
+ "%!ret\t%0"<br>
++ "&& cfun->machine->function_return<wbr>_type != indirect_branch_keep"<br>
++ [(const_int 0)]<br>
++ "ix86_split_simple_return_pop_<wbr>internal (operands[0]); DONE;"<br>
+ [(set_attr "length" "3")<br>
+ (set_attr "atom_unit" "jeu")<br>
+ (set_attr "length_immediate" "2")<br>
+@@ -12535,7 +12538,7 @@<br>
+ [(simple_return)<br>
+ (use (match_operand:SI 0 "register_operand" "r"))]<br>
+ "reload_completed"<br>
+- "* return ix86_output_indirect_jmp (operands[0], true);"<br>
++ "* return ix86_output_indirect_function_<wbr>return (operands[0]);"<br>
+ [(set (attr "type")<br>
+ (if_then_else (match_test "(cfun->machine->indirect_bran<wbr>ch_type<br>
+ != indirect_branch_keep)")<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-22.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-22.c<br>
+new file mode 100644<br>
+index 0000000..89e086d<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-22.c<br>
+@@ -0,0 +1,15 @@<br>
++/* PR target/r84530 */<br>
++/* { dg-do compile { target ia32 } } */<br>
++/* { dg-options "-O2 -mfunction-return=thunk" } */<br>
++<br>
++struct s { _Complex unsigned short x; };<br>
++struct s gs = { 100 + 200i };<br>
++struct s __attribute__((noinline)) foo (void) { return gs; }<br>
++<br>
++/* { dg-final { scan-assembler-times "popl\[\\t \]*%ecx" 1 } } */<br>
++/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*4\\(%esp\\), %esp" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk_ecx" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-23.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-23.c<br>
+new file mode 100644<br>
+index 0000000..43f0cca<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-23.c<br>
+@@ -0,0 +1,15 @@<br>
++/* PR target/r84530 */<br>
++/* { dg-do compile { target ia32 } } */<br>
++/* { dg-options "-O2 -mfunction-return=thunk-extern<wbr>" } */<br>
++<br>
++struct s { _Complex unsigned short x; };<br>
++struct s gs = { 100 + 200i };<br>
++struct s __attribute__((noinline)) foo (void) { return gs; }<br>
++<br>
++/* { dg-final { scan-assembler-times "popl\[\\t \]*%ecx" 1 } } */<br>
++/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*4\\(%esp\\), %esp" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk_ecx" } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not {\tpause} } } */<br>
++/* { dg-final { scan-assembler-not {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-24.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-24.c<br>
+new file mode 100644<br>
+index 0000000..8729e35<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-24.c<br>
+@@ -0,0 +1,15 @@<br>
++/* PR target/r84530 */<br>
++/* { dg-do compile { target ia32 } } */<br>
++/* { dg-options "-O2 -mfunction-return=thunk-inline<wbr>" } */<br>
++<br>
++struct s { _Complex unsigned short x; };<br>
++struct s gs = { 100 + 200i };<br>
++struct s __attribute__((noinline)) foo (void) { return gs; }<br>
++<br>
++/* { dg-final { scan-assembler-times "popl\[\\t \]*%ecx" 1 } } */<br>
++/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*4\\(%esp\\), %esp" } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk_ecx" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-25.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-25.c<br>
+new file mode 100644<br>
+index 0000000..f73553c<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-25.c<br>
+@@ -0,0 +1,15 @@<br>
++/* PR target/r84530 */<br>
++/* { dg-do compile { target ia32 } } */<br>
++/* { dg-options "-O2 -mfunction-return=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */<br>
++<br>
++struct s { _Complex unsigned short x; };<br>
++struct s gs = { 100 + 200i };<br>
++struct s __attribute__((noinline)) foo (void) { return gs; }<br>
++<br>
++/* { dg-final { scan-assembler-times "popl\[\\t \]*%ecx" 1 } } */<br>
++/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*4\\(%esp\\), %esp" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk_bnd_ec<wbr>x" } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-26.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-26.c<br>
+new file mode 100644<br>
+index 0000000..9144e98<br>
+--- /dev/null<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-26.c<br>
+@@ -0,0 +1,40 @@<br>
++/* PR target/r84530 */<br>
++/* { dg-do run } */<br>
++/* { dg-options "-Os -mfunction-return=thunk" } */<br>
++<br>
++struct S { int i; };<br>
++__attribute__((const, noinline, noclone))<br>
++struct S foo (int x)<br>
++{<br>
++ struct S s;<br>
++ s.i = x;<br>
++ return s;<br>
++}<br>
++<br>
++int a[2048], b[2048], c[2048], d[2048];<br>
++struct S e[2048];<br>
++<br>
++__attribute__((noinline, noclone)) void<br>
++bar (void)<br>
++{<br>
++ int i;<br>
++ for (i = 0; i < 1024; i++)<br>
++ {<br>
++ e[i] = foo (i);<br>
++ a[i+2] = a[i] + a[i+1];<br>
++ b[10] = b[10] + i;<br>
++ c[i] = c[2047 - i];<br>
++ d[i] = d[i + 1];<br>
++ }<br>
++}<br>
++<br>
++int<br>
++main ()<br>
++{<br>
++ int i;<br>
++ bar ();<br>
++ for (i = 0; i < 1024; i++)<br>
++ if (e[i].i != i)<br>
++ __builtin_abort ();<br>
++ return 0;<br>
++}<br>
+--<br>
+2.7.4<br>
+<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0012-gcc-4.3.3-SYSROOT_C<wbr>FLAGS_FOR_TARGET.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0012-gcc-4.3.3-SYSROOT_C<wbr>FLAGS_FOR_TARGET.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0012-gcc-4.3.3-SYSROOT_CFL<wbr>AGS_FOR_TARGET.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0012-gcc-4.3.3-SYSROOT_CFL<wbr>AGS_FOR_TARGET.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0012-i386-Add-TARGET_IND<wbr>IRECT_BRANCH_REGISTER.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0012-i386-Add-TARGET_IND<wbr>IRECT_BRANCH_REGISTER.patch<br>
new file mode 100644<br>
index 0000000..f4b137c<br>
--- /dev/null<br>
+++ b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0012-i386-Add-TARGET_IND<wbr>IRECT_BRANCH_REGISTER.patch<br>
@@ -0,0 +1,1001 @@<br>
+From 7ba192d11a43d24ce427a3dfce0ad0<wbr>592bd52830 Mon Sep 17 00:00:00 2001<br>
+From: hjl <hjl@138bc75d-0d04-0410-961f-8<wbr>2ee72b054a4><br>
+Date: Mon, 26 Feb 2018 17:00:46 +0000<br>
+Subject: [PATCH 12/12] i386: Add TARGET_INDIRECT_BRANCH_REGISTE<wbr>R<br>
+<br>
+For<br>
+<br>
+---<br>
+struct C {<br>
+ virtual ~C();<br>
+ virtual void f();<br>
+};<br>
+<br>
+void<br>
+f (C *p)<br>
+{<br>
+ p->f();<br>
+ p->f();<br>
+}<br>
+---<br>
+<br>
+-mindirect-branch=thunk-exter<wbr>n -O2 on x86-64 GNU/Linux generates:<br>
+<br>
+_Z1fP1C:<br>
+.LFB0:<br>
+ .cfi_startproc<br>
+ pushq %rbx<br>
+ .cfi_def_cfa_offset 16<br>
+ .cfi_offset 3, -16<br>
+ movq (%rdi), %rax<br>
+ movq %rdi, %rbx<br>
+ jmp .LIND1<br>
+.LIND0:<br>
+ pushq 16(%rax)<br>
+ jmp __x86_indirect_thunk<br>
+.LIND1:<br>
+ call .LIND0<br>
+ movq (%rbx), %rax<br>
+ movq %rbx, %rdi<br>
+ popq %rbx<br>
+ .cfi_def_cfa_offset 8<br>
+ movq 16(%rax), %rax<br>
+ jmp __x86_indirect_thunk_rax<br>
+ .cfi_endproc<br>
+<br>
+x86-64 is supposed to have asynchronous unwind tables by default, but<br>
+there is nothing that reflects the change in the (relative) frame<br>
+address after .LIND0. That region really has to be moved outside of<br>
+the .cfi_startproc/.cfi_endproc bracket.<br>
+<br>
+This patch adds TARGET_INDIRECT_BRANCH_REGISTE<wbr>R to force indirect<br>
+branch via register whenever -mindirect-branch= is used. Now,<br>
+-mindirect-branch=thunk-exter<wbr>n -O2 on x86-64 GNU/Linux generates:<br>
+<br>
+_Z1fP1C:<br>
+.LFB0:<br>
+ .cfi_startproc<br>
+ pushq %rbx<br>
+ .cfi_def_cfa_offset 16<br>
+ .cfi_offset 3, -16<br>
+ movq (%rdi), %rax<br>
+ movq %rdi, %rbx<br>
+ movq 16(%rax), %rax<br>
+ call __x86_indirect_thunk_rax<br>
+ movq (%rbx), %rax<br>
+ movq %rbx, %rdi<br>
+ popq %rbx<br>
+ .cfi_def_cfa_offset 8<br>
+ movq 16(%rax), %rax<br>
+ jmp __x86_indirect_thunk_rax<br>
+ .cfi_endproc<br>
+<br>
+so that "-mindirect-branch=thunk-exter<wbr>n" is equivalent to<br>
+"-mindirect-branch=thunk-exte<wbr>rn -mindirect-branch-register", which is<br>
+used by Linux kernel.<br>
+<br>
+gcc/<br>
+<br>
+ Backport from mainline<br>
+ PR target/84039<br>
+ * config/i386/<a href="http://constraints.md" rel="noreferrer" target="_blank">constraints.md</a> (Bs): Replace<br>
+ ix86_indirect_branch_register with<br>
+ TARGET_INDIRECT_BRANCH_REGIST<wbr>ER.<br>
+ (Bw): Likewise.<br>
+ * config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> (indirect_jump): Likewise.<br>
+ (tablejump): Likewise.<br>
+ (*sibcall_memory): Likewise.<br>
+ (*sibcall_value_memory): Likewise.<br>
+ Peepholes of indirect call and jump via memory: Likewise.<br>
+ (*sibcall_GOT_32): Disallowed for TARGET_INDIRECT_BRANCH_REGISTE<wbr>R.<br>
+ (*sibcall_value_GOT_32): Likewise.<br>
+ * config/i386/<a href="http://predicates.md" rel="noreferrer" target="_blank">predicates.md</a> (indirect_branch_operand): Likewise.<br>
+ (GOT_memory_operand): Likewise.<br>
+ (call_insn_operand): Likewise.<br>
+ (sibcall_insn_operand): Likewise.<br>
+ (GOT32_symbol_operand): Likewise.<br>
+ * config/i386/i386.h (TARGET_INDIRECT_BRANCH_REGIST<wbr>ER): New.<br>
+<br>
+gcc/testsuite/<br>
+<br>
+ Backport from mainline<br>
+ PR target/84039<br>
+ * gcc.target/i386/indirect-thunk<wbr>-1.c: Updated.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-7.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-attr-7.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-bnd-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-bnd-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-bnd-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-bnd-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-extern-7.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-1.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-2.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-3.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-4.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-5.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-6.c: Likewise.<br>
+ * gcc.target/i386/indirect-thunk<wbr>-inline-7.c: Likewise.<br>
+ * gcc.target/i386/ret-thunk-9.c: Likewise.<br>
+ * gcc.target/i386/ret-thunk-10.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-11.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-12.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-13.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-14.c<wbr>: Likewise.<br>
+ * gcc.target/i386/ret-thunk-15.c<wbr>: Likewise.<br>
+<br>
+Upstream-Status: Pending<br>
+---<br>
+ gcc/config/i386/<a href="http://constraints.md" rel="noreferrer" target="_blank">constraints.md</a><wbr> | 4 ++--<br>
+ gcc/config/i386/i386.h | 5 ++++<br>
+ gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> | 28 +++++++++++++---------<br>
+ gcc/config/i386/<a href="http://predicates.md" rel="noreferrer" target="_blank">predicates.md</a> | 6 ++---<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-1.c | 5 ++--<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-2.c | 5 ++--<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-3.c | 5 ++--<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-4.c | 5 ++--<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-5.c | 6 +++--<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-6.c | 12 ++++++----<br>
+ gcc/testsuite/gcc.target/i386/<wbr>indirect-thunk-7.c | 5 ++--<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-1.c | 5 ++--<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-2.c | 5 ++--<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-3.c | 3 +--<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-4.c | 3 +--<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-5.c | 9 ++++---<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-6.c | 9 ++++---<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-attr-7.c | 5 ++--<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-bnd-1.c | 6 ++---<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-bnd-2.c | 6 ++---<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-bnd-3.c | 5 ++--<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-bnd-4.c | 7 +++---<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-1.c | 5 ++--<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-2.c | 5 ++--<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-3.c | 9 ++++---<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-4.c | 6 ++---<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-5.c | 6 +++--<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-6.c | 8 +++----<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-extern-7.c | 5 ++--<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-1.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-2.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-3.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-4.c | 2 +-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-5.c | 3 ++-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-6.c | 3 ++-<br>
+ .../gcc.target/i386/indirect-t<wbr>hunk-inline-7.c | 4 ++--<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-10.c | 9 +++----<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-11.c | 9 +++----<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-12.c | 8 +++----<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-13.c | 5 ++--<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-14.c | 7 +++---<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-15.c | 7 +++---<br>
+ gcc/testsuite/gcc.target/i386/<wbr>ret-thunk-9.c | 13 ++++------<br>
+ 43 files changed, 128 insertions(+), 141 deletions(-)<br>
+<br>
+diff --git a/gcc/config/i386/<a href="http://constraints.md" rel="noreferrer" target="_blank">constraints.<wbr>md</a> b/gcc/config/i386/<a href="http://constraints.md" rel="noreferrer" target="_blank">constraints.<wbr>md</a><br>
+index 9204c8e..ef684a9 100644<br>
+--- a/gcc/config/i386/<a href="http://constraints.md" rel="noreferrer" target="_blank">constraints.<wbr>md</a><br>
++++ b/gcc/config/i386/<a href="http://constraints.md" rel="noreferrer" target="_blank">constraints.<wbr>md</a><br>
+@@ -172,7 +172,7 @@<br>
+<br>
+ (define_constraint "Bs"<br>
+ "@internal Sibcall memory operand."<br>
+- (ior (and (not (match_test "ix86_indirect_branch_register<wbr>"))<br>
++ (ior (and (not (match_test "TARGET_INDIRECT_BRANCH_REGIST<wbr>ER"))<br>
+ (not (match_test "TARGET_X32"))<br>
+ (match_operand 0 "sibcall_memory_operand"))<br>
+ (and (match_test "TARGET_X32 && Pmode == DImode")<br>
+@@ -180,7 +180,7 @@<br>
+<br>
+ (define_constraint "Bw"<br>
+ "@internal Call memory operand."<br>
+- (ior (and (not (match_test "ix86_indirect_branch_register<wbr>"))<br>
++ (ior (and (not (match_test "TARGET_INDIRECT_BRANCH_REGIST<wbr>ER"))<br>
+ (not (match_test "TARGET_X32"))<br>
+ (match_operand 0 "memory_operand"))<br>
+ (and (match_test "TARGET_X32 && Pmode == DImode")<br>
+diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h<br>
+index b34bc11..1816d71 100644<br>
+--- a/gcc/config/i386/i386.h<br>
++++ b/gcc/config/i386/i386.h<br>
+@@ -2676,6 +2676,11 @@ extern void debug_dispatch_window (int);<br>
+ #define TARGET_RECIP_VEC_DIV ((recip_mask & RECIP_MASK_VEC_DIV) != 0)<br>
+ #define TARGET_RECIP_VEC_SQRT ((recip_mask & RECIP_MASK_VEC_SQRT) != 0)<br>
+<br>
++<br>
++#define TARGET_INDIRECT_BRANCH_REGISTE<wbr>R \<br>
++ (ix86_indirect_branch_register \<br>
++ || cfun->machine->indirect_branch<wbr>_type != indirect_branch_keep)<br>
++<br>
+ #define IX86_HLE_ACQUIRE (1 << 16)<br>
+ #define IX86_HLE_RELEASE (1 << 17)<br>
+<br>
+diff --git a/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> b/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a><br>
+index 857466a..6a6dc26 100644<br>
+--- a/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a><br>
++++ b/gcc/config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a><br>
+@@ -11805,7 +11805,7 @@<br>
+ [(set (pc) (match_operand 0 "indirect_branch_operand"))]<br>
+ ""<br>
+ {<br>
+- if (TARGET_X32 || ix86_indirect_branch_register)<br>
++ if (TARGET_X32 || TARGET_INDIRECT_BRANCH_REGISTE<wbr>R)<br>
+ operands[0] = convert_memory_address (word_mode, operands[0]);<br>
+ cfun->machine->has_local_indi<wbr>rect_jump = true;<br>
+ })<br>
+@@ -11859,7 +11859,7 @@<br>
+ OPTAB_DIRECT);<br>
+ }<br>
+<br>
+- if (TARGET_X32 || ix86_indirect_branch_register)<br>
++ if (TARGET_X32 || TARGET_INDIRECT_BRANCH_REGISTE<wbr>R)<br>
+ operands[0] = convert_memory_address (word_mode, operands[0]);<br>
+ cfun->machine->has_local_indi<wbr>rect_jump = true;<br>
+ })<br>
+@@ -12029,7 +12029,10 @@<br>
+ (match_operand:SI 0 "register_no_elim_operand" "U")<br>
+ (match_operand:SI 1 "GOT32_symbol_operand"))))<br>
+ (match_operand 2))]<br>
+- "!TARGET_MACHO && !TARGET_64BIT && SIBLING_CALL_P (insn)"<br>
++ "!TARGET_MACHO<br>
++ && !TARGET_64BIT<br>
++ && !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER<br>
++ && SIBLING_CALL_P (insn)"<br>
+ {<br>
+ rtx fnaddr = gen_rtx_PLUS (Pmode, operands[0], operands[1]);<br>
+ fnaddr = gen_const_mem (Pmode, fnaddr);<br>
+@@ -12048,7 +12051,7 @@<br>
+ [(call (mem:QI (match_operand:W 0 "memory_operand" "m"))<br>
+ (match_operand 1))<br>
+ (unspec [(const_int 0)] UNSPEC_PEEPSIB)]<br>
+- "!TARGET_X32 && !ix86_indirect_branch_register<wbr>"<br>
++ "!TARGET_X32 && !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER"<br>
+ "* return ix86_output_call_insn (insn, operands[0]);"<br>
+ [(set_attr "type" "call")])<br>
+<br>
+@@ -12058,7 +12061,7 @@<br>
+ (call (mem:QI (match_dup 0))<br>
+ (match_operand 3))]<br>
+ "!TARGET_X32<br>
+- && !ix86_indirect_branch_register<br>
++ && !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER<br>
+ && SIBLING_CALL_P (peep2_next_insn (1))<br>
+ && !reg_mentioned_p (operands[0],<br>
+ CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"<br>
+@@ -12073,7 +12076,7 @@<br>
+ (call (mem:QI (match_dup 0))<br>
+ (match_operand 3))]<br>
+ "!TARGET_X32<br>
+- && !ix86_indirect_branch_register<br>
++ && !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER<br>
+ && SIBLING_CALL_P (peep2_next_insn (2))<br>
+ && !reg_mentioned_p (operands[0],<br>
+ CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"<br>
+@@ -12171,7 +12174,7 @@<br>
+ (match_operand:W 1 "memory_operand"))<br>
+ (set (pc) (match_dup 0))]<br>
+ "!TARGET_X32<br>
+- && !ix86_indirect_branch_register<br>
++ && !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER<br>
+ && peep2_reg_dead_p (2, operands[0])"<br>
+ [(set (pc) (match_dup 1))])<br>
+<br>
+@@ -12229,7 +12232,10 @@<br>
+ (match_operand:SI 1 "register_no_elim_operand" "U")<br>
+ (match_operand:SI 2 "GOT32_symbol_operand"))))<br>
+ (match_operand 3)))]<br>
+- "!TARGET_MACHO && !TARGET_64BIT && SIBLING_CALL_P (insn)"<br>
++ "!TARGET_MACHO<br>
++ && !TARGET_64BIT<br>
++ && !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER<br>
++ && SIBLING_CALL_P (insn)"<br>
+ {<br>
+ rtx fnaddr = gen_rtx_PLUS (Pmode, operands[1], operands[2]);<br>
+ fnaddr = gen_const_mem (Pmode, fnaddr);<br>
+@@ -12250,7 +12256,7 @@<br>
+ (call (mem:QI (match_operand:W 1 "memory_operand" "m"))<br>
+ (match_operand 2)))<br>
+ (unspec [(const_int 0)] UNSPEC_PEEPSIB)]<br>
+- "!TARGET_X32 && !ix86_indirect_branch_register<wbr>"<br>
++ "!TARGET_X32 && !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER"<br>
+ "* return ix86_output_call_insn (insn, operands[1]);"<br>
+ [(set_attr "type" "callv")])<br>
+<br>
+@@ -12261,7 +12267,7 @@<br>
+ (call (mem:QI (match_dup 0))<br>
+ (match_operand 3)))]<br>
+ "!TARGET_X32<br>
+- && !ix86_indirect_branch_register<br>
++ && !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER<br>
+ && SIBLING_CALL_P (peep2_next_insn (1))<br>
+ && !reg_mentioned_p (operands[0],<br>
+ CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"<br>
+@@ -12278,7 +12284,7 @@<br>
+ (call (mem:QI (match_dup 0))<br>
+ (match_operand 3)))]<br>
+ "!TARGET_X32<br>
+- && !ix86_indirect_branch_register<br>
++ && !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER<br>
+ && SIBLING_CALL_P (peep2_next_insn (2))<br>
+ && !reg_mentioned_p (operands[0],<br>
+ CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"<br>
+diff --git a/gcc/config/i386/<a href="http://predicates.md" rel="noreferrer" target="_blank">predicates.m<wbr>d</a> b/gcc/config/i386/<a href="http://predicates.md" rel="noreferrer" target="_blank">predicates.m<wbr>d</a><br>
+index d1f0a7d..5f8a98f 100644<br>
+--- a/gcc/config/i386/<a href="http://predicates.md" rel="noreferrer" target="_blank">predicates.m<wbr>d</a><br>
++++ b/gcc/config/i386/<a href="http://predicates.md" rel="noreferrer" target="_blank">predicates.m<wbr>d</a><br>
+@@ -593,7 +593,7 @@<br>
+ ;; Test for a valid operand for indirect branch.<br>
+ (define_predicate "indirect_branch_operand"<br>
+ (ior (match_operand 0 "register_operand")<br>
+- (and (not (match_test "ix86_indirect_branch_register<wbr>"))<br>
++ (and (not (match_test "TARGET_INDIRECT_BRANCH_REGIST<wbr>ER"))<br>
+ (not (match_test "TARGET_X32"))<br>
+ (match_operand 0 "memory_operand"))))<br>
+<br>
+@@ -637,7 +637,7 @@<br>
+ (ior (match_test "constant_call_address_operand<br>
+ (op, mode == VOIDmode ? mode : Pmode)")<br>
+ (match_operand 0 "call_register_no_elim_operand<wbr>")<br>
+- (and (not (match_test "ix86_indirect_branch_register<wbr>"))<br>
++ (and (not (match_test "TARGET_INDIRECT_BRANCH_REGIST<wbr>ER"))<br>
+ (ior (and (not (match_test "TARGET_X32"))<br>
+ (match_operand 0 "memory_operand"))<br>
+ (and (match_test "TARGET_X32 && Pmode == DImode")<br>
+@@ -648,7 +648,7 @@<br>
+ (ior (match_test "constant_call_address_operand<br>
+ (op, mode == VOIDmode ? mode : Pmode)")<br>
+ (match_operand 0 "register_no_elim_operand")<br>
+- (and (not (match_test "ix86_indirect_branch_register<wbr>"))<br>
++ (and (not (match_test "TARGET_INDIRECT_BRANCH_REGIST<wbr>ER"))<br>
+ (ior (and (not (match_test "TARGET_X32"))<br>
+ (match_operand 0 "sibcall_memory_operand"))<br>
+ (and (match_test "TARGET_X32 && Pmode == DImode")<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-1.c<br>
+index 60d0988..6e94d2c 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-1.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-1.c<br>
+@@ -11,9 +11,8 @@ male_indirect_jump (long offset)<br>
+ dispatch(offset);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-2.c<br>
+index aac7516..3c46707 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-2.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-2.c<br>
+@@ -11,9 +11,8 @@ male_indirect_jump (long offset)<br>
+ dispatch[offset](offset);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-3.c<br>
+index 9e24a38..2c7fb52 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-3.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-3.c<br>
+@@ -12,9 +12,8 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-4.c<br>
+index 127b5d9..0d3f895 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-4.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-4.c<br>
+@@ -12,9 +12,8 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-5.c<br>
+index fcaa18d..fb26c00 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-5.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-5.c<br>
+@@ -9,8 +9,10 @@ foo (void)<br>
+ bar ();<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*bar@GOT" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-6.c<br>
+index e464928..aa03fbd 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-6.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-6.c<br>
+@@ -10,9 +10,13 @@ foo (void)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */<br>
+-/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */<br>
+-/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target x32 } } } */<br>
++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 { target x32 } } } */<br>
++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*bar@GOT" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+ /* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-7.c<br>
+index 17c2d0f..3c72036 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-7.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-7.c<br>
+@@ -35,9 +35,8 @@ bar (int i)<br>
+ }<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-1.c<br>
+index 9194ccf..7106407 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-1.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-1.c<br>
+@@ -14,9 +14,8 @@ male_indirect_jump (long offset)<br>
+ dispatch(offset);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-2.c<br>
+index e51f261..27c7e5b 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-2.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-2.c<br>
+@@ -12,9 +12,8 @@ male_indirect_jump (long offset)<br>
+ dispatch[offset](offset);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-3.c<br>
+index 4aeec18..89a2bac 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-3.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-3.c<br>
+@@ -14,10 +14,9 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
+ /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+ /* { dg-final { scan-assembler {\tlfence} } } */<br>
+ /* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */<br>
+-/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-4.c<br>
+index ac0e599..3eb83c3 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-4.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-4.c<br>
+@@ -13,10 +13,9 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
+ /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+ /* { dg-final { scan-assembler {\tlfence} } } */<br>
+ /* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */<br>
+-/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-5.c<br>
+index 573cf1e..0098dd1 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-5.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-5.c<br>
+@@ -14,9 +14,8 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-6.c<br>
+index b2b37fc..ece8de1 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-6.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-6.c<br>
+@@ -13,9 +13,8 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-7.c<br>
+index 4a43e19..d53fc88 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-7.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-attr-7.c<br>
+@@ -36,9 +36,8 @@ bar (int i)<br>
+ }<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+ /* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-1.c<br>
+index ac84ab6..73d16ba 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-1.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-1.c<br>
+@@ -10,9 +10,9 @@ foo (void)<br>
+ dispatch (buf);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "pushq\[ \t\]%rax" { target x32 } } } */<br>
+-/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd_<wbr>rax" { target lp64 } } } */<br>
++/* { dg-final { scan-assembler "bnd call\[ \t\]*__x86_indirect_thunk_bnd_<wbr>eax" { target ia32 } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "bnd call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "bnd ret" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-2.c<br>
+index ce655e8..856751a 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-2.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-2.c<br>
+@@ -11,10 +11,8 @@ foo (void)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "pushq\[ \t\]%rax" { target x32 } } } */<br>
+-/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } */<br>
+-/* { dg-final { scan-assembler "bnd jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "bnd call\[ \t\]*__x86_indirect_thunk_bnd_<wbr>(r|e)ax" } } */<br>
+ /* { dg-final { scan-assembler "bnd call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "bnd ret" } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-3.c<br>
+index d34485a..42312f6 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-3.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-3.c<br>
+@@ -10,8 +10,9 @@ foo (void)<br>
+ bar (buf);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */<br>
+-/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*bar@GOT" } } */<br>
++/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd_<wbr>rax" { target lp64 } } } */<br>
++/* { dg-final { scan-assembler "bnd call\[ \t\]*__x86_indirect_thunk_bnd_<wbr>eax" { target ia32 } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "bnd call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "bnd ret" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-4.c<br>
+index 0e19830..c8ca102 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-4.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-bnd-4.c<br>
+@@ -11,10 +11,9 @@ foo (void)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */<br>
+-/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk" } } */<br>
+-/* { dg-final { scan-assembler "bnd jmp\[ \t\]*\.LIND" } } */<br>
+-/* { dg-final { scan-assembler-times "bnd call\[ \t\]*\.LIND" 2 } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*bar@GOT" } } */<br>
++/* { dg-final { scan-assembler "bnd call\[ \t\]*__x86_indirect_thunk_bnd_<wbr>(r|e)ax" } } */<br>
++/* { dg-final { scan-assembler-times "bnd call\[ \t\]*\.LIND" 1 } } */<br>
+ /* { dg-final { scan-assembler "bnd ret" } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+ /* { dg-final { scan-assembler {\tlfence} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-1.c<br>
+index 579441f..c09dd0a 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-1.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-1.c<br>
+@@ -11,9 +11,8 @@ male_indirect_jump (long offset)<br>
+ dispatch(offset);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+ /* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-2.c<br>
+index c92e6f2..826425a 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-2.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-2.c<br>
+@@ -11,9 +11,8 @@ male_indirect_jump (long offset)<br>
+ dispatch[offset](offset);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+ /* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-3.c<br>
+index d9964c2..3856268 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-3.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-3.c<br>
+@@ -12,9 +12,8 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-4.c<br>
+index d4dca4d..1ae49b1 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-4.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-4.c<br>
+@@ -12,9 +12,7 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-5.c<br>
+index 5c07e02..5328239 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-5.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-5.c<br>
+@@ -9,8 +9,10 @@ foo (void)<br>
+ bar ();<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*bar@GOT" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+ /* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-6.c<br>
+index 3eb4406..8ae4348 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-6.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-6.c<br>
+@@ -10,8 +10,8 @@ foo (void)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */<br>
+-/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 } } */<br>
+-/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*bar@GOT" { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-7.c<br>
+index aece938..2b9a33e 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-7.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-extern-7.c<br>
+@@ -35,9 +35,8 @@ bar (int i)<br>
+ }<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+ /* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-1.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-1.c<br>
+index 3aba5e8..869d904 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-1.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-1.c<br>
+@@ -11,7 +11,7 @@ male_indirect_jump (long offset)<br>
+ dispatch(offset);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-2.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-2.c<br>
+index 0f0181d..c5c16ed 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-2.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-2.c<br>
+@@ -11,7 +11,7 @@ male_indirect_jump (long offset)<br>
+ dispatch[offset](offset);<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-3.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-3.c<br>
+index 2eef6f3..4a63ebe 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-3.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-3.c<br>
+@@ -12,7 +12,7 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
+ /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-4.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-4.c<br>
+index e825a10..a395ffc 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-4.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-4.c<br>
+@@ -12,7 +12,7 @@ male_indirect_jump (long offset)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?dispatch" { target *-*-linux* } } } */<br>
+ /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-5.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-5.c<br>
+index c6d77e1..21cbfd3 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-5.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-5.c<br>
+@@ -9,7 +9,8 @@ foo (void)<br>
+ bar ();<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*bar@GOT" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-6.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-6.c<br>
+index 6454827..d1300f1 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-6.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-6.c<br>
+@@ -10,7 +10,8 @@ foo (void)<br>
+ return 0;<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" } } */<br>
++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*bar@GOT" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*bar@GOT" { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */<br>
+ /* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-7.c b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-7.c<br>
+index c67066c..ea00924 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-7.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/indirect-thunk-inline-7.c<br>
+@@ -35,8 +35,8 @@ bar (int i)<br>
+ }<br>
+ }<br>
+<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%(r|e)ax" } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-10.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-10.c<br>
+index e6fea84..af9023a 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-10.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-10.c<br>
+@@ -15,9 +15,6 @@ foo (void)<br>
+ /* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */<br>
+ /* { dg-final { scan-assembler-times {\tpause} 2 } } */<br>
+ /* { dg-final { scan-assembler-times {\tlfence} 2 } } */<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "__x86_indirect_thunk:" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target { x32 } } } } */<br>
+-/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:<wbr>" { target { x32 } } } } */<br>
+-/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
++/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:<wbr>" } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-11.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-11.c<br>
+index e239ec4..ba467c5 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-11.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-11.c<br>
+@@ -15,9 +15,6 @@ foo (void)<br>
+ /* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "__x86_indirect_thunk:" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target { x32 } } } } */<br>
+-/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:<wbr>" { target { x32 } } } } */<br>
+-/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
++/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:<wbr>" } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-12.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-12.c<br>
+index fa31813..43e57ca 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-12.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-12.c<br>
+@@ -15,8 +15,6 @@ foo (void)<br>
+ /* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "__x86_indirect_thunk:" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target { x32 } } } } */<br>
+-/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:<wbr>" { target { x32 } } } } */<br>
+-/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
++/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:<wbr>" } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-13.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-13.c<br>
+index fd5b41f..55f156c 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-13.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-13.c<br>
+@@ -14,9 +14,8 @@ foo (void)<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */<br>
+ /* { dg-final { scan-assembler-times {\tpause} 2 } } */<br>
+ /* { dg-final { scan-assembler-times {\tlfence} 2 } } */<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 3 } } */<br>
+ /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 3 } } */<br>
+ /* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_indirect_thunk" } } */<br>
+-/* { dg-final { scan-assembler-not "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target { x32 } } } } */<br>
+-/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler-not "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-14.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-14.c<br>
+index d606373..1c79043 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-14.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-14.c<br>
+@@ -16,7 +16,6 @@ foo (void)<br>
+ /* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target { x32 } } } } */<br>
+-/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?bar" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-15.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-15.c<br>
+index 75e45e2..58aba31 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-15.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-15.c<br>
+@@ -16,7 +16,6 @@ foo (void)<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
+ /* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target x32 } } } */<br>
+-/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?bar" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */<br>
+diff --git a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-9.c b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-9.c<br>
+index d1db41c..d2df8b8 100644<br>
+--- a/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-9.c<br>
++++ b/gcc/testsuite/gcc.target/i38<wbr>6/ret-thunk-9.c<br>
+@@ -14,11 +14,8 @@ foo (void)<br>
+ /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */<br>
+ /* { dg-final { scan-assembler "__x86_indirect_thunk:" } } */<br>
+-/* { dg-final { scan-assembler-times {\tpause} 1 { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler-times {\tlfence} 1 { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler-times {\tpause} 2 { target { x32 } } } } */<br>
+-/* { dg-final { scan-assembler-times {\tlfence} 2 { target { x32 } } } } */<br>
+-/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" { target { x32 } } } } */<br>
+-/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */<br>
++/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?bar" { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 2 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 2 } } */<br>
++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax" } } */<br>
++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */<br>
+--<br>
+2.7.4<br>
+<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0013-64-bit-multilib-hac<wbr>k.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0013-64-bit-multilib-hac<wbr>k.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0013-64-bit-multilib-hack.<wbr>patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0013-64-bit-multilib-hack.<wbr>patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/<a href="http://0014-optional-libstdc.pa" target="_blank">0014-optional-libstdc.pa</a><wbr>tch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/<a href="http://0014-optional-libstdc.pa" target="_blank">0014-optional-libstdc.pa</a><wbr>tch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0014-optional-libstdc.patc<wbr>h<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0014-optional-libstdc.patc<wbr>h<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0015-gcc-disable-MASK_RE<wbr>LAX_PIC_CALLS-bit.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0015-gcc-disable-MASK_RE<wbr>LAX_PIC_CALLS-bit.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0015-gcc-disable-MASK_RELA<wbr>X_PIC_CALLS-bit.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0015-gcc-disable-MASK_RELA<wbr>X_PIC_CALLS-bit.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0016-COLLECT_GCC_OPTIONS<wbr>.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0016-COLLECT_GCC_OPTIONS<wbr>.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0016-COLLECT_GCC_OPTIONS.p<wbr>atch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0016-COLLECT_GCC_OPTIONS.p<wbr>atch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0017-Use-the-defaults.h-<wbr>in-B-instead-of-S-and-t-oe-in-<wbr>B.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0017-Use-the-defaults.h-<wbr>in-B-instead-of-S-and-t-oe-in-<wbr>B.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0017-Use-the-defaults.h-in<wbr>-B-instead-of-S-and-t-oe-in-B.<wbr>patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0017-Use-the-defaults.h-in<wbr>-B-instead-of-S-and-t-oe-in-B.<wbr>patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0018-fortran-cross-compi<wbr>le-hack.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0018-fortran-cross-compi<wbr>le-hack.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0018-fortran-cross-compile<wbr>-hack.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0018-fortran-cross-compile<wbr>-hack.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0019-cpp-honor-sysroot.p<wbr>atch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0019-cpp-honor-sysroot.p<wbr>atch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0019-cpp-honor-sysroot.pat<wbr>ch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0019-cpp-honor-sysroot.pat<wbr>ch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0020-MIPS64-Default-to-N<wbr>64-ABI.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0020-MIPS64-Default-to-N<wbr>64-ABI.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0020-MIPS64-Default-to-N64<wbr>-ABI.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0020-MIPS64-Default-to-N64<wbr>-ABI.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0021-Define-GLIBC_DYNAMI<wbr>C_LINKER-and-UCLIBC_DYNAMIC_LI<wbr>NKE.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0021-Define-GLIBC_DYNAMI<wbr>C_LINKER-and-UCLIBC_DYNAMIC_LI<wbr>NKE.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0021-Define-GLIBC_DYNAMIC_<wbr>LINKER-and-UCLIBC_DYNAMIC_LINK<wbr>E.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0021-Define-GLIBC_DYNAMIC_<wbr>LINKER-and-UCLIBC_DYNAMIC_LINK<wbr>E.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0022-gcc-Fix-argument-li<wbr>st-too-long-error.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0022-gcc-Fix-argument-li<wbr>st-too-long-error.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0022-gcc-Fix-argument-list<wbr>-too-long-error.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0022-gcc-Fix-argument-list<wbr>-too-long-error.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0023-Disable-sdt.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0023-Disable-sdt.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0023-Disable-sdt.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0023-Disable-sdt.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0024-libtool.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0024-libtool.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0024-libtool.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0024-libtool.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0025-gcc-armv4-pass-fix-<wbr>v4bx-to-linker-to-support-EABI<wbr>.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0025-gcc-armv4-pass-fix-<wbr>v4bx-to-linker-to-support-EABI<wbr>.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0025-gcc-armv4-pass-fix-v4<wbr>bx-to-linker-to-support-EABI.p<wbr>atch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0025-gcc-armv4-pass-fix-v4<wbr>bx-to-linker-to-support-EABI.p<wbr>atch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0026-Use-the-multilib-co<wbr>nfig-files-from-B-instead-of-u<wbr>sin.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0026-Use-the-multilib-co<wbr>nfig-files-from-B-instead-of-u<wbr>sin.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0026-Use-the-multilib-conf<wbr>ig-files-from-B-instead-of-usi<wbr>n.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0026-Use-the-multilib-conf<wbr>ig-files-from-B-instead-of-usi<wbr>n.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0027-Avoid-using-libdir-<wbr>from-.la-which-usually-points-<wbr>to-.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0027-Avoid-using-libdir-<wbr>from-.la-which-usually-points-<wbr>to-.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0027-Avoid-using-libdir-fr<wbr>om-.la-which-usually-points-to<wbr>-.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0027-Avoid-using-libdir-fr<wbr>om-.la-which-usually-points-to<wbr>-.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0028-export-CPP.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0028-export-CPP.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0028-export-CPP.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0028-export-CPP.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0029-Enable-SPE-AltiVec-<wbr>generation-on-powepc-linux-tar<wbr>get.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0029-Enable-SPE-AltiVec-<wbr>generation-on-powepc-linux-tar<wbr>get.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0029-Enable-SPE-AltiVec-ge<wbr>neration-on-powepc-linux-targe<wbr>t.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0029-Enable-SPE-AltiVec-ge<wbr>neration-on-powepc-linux-targe<wbr>t.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0030-Disable-the-MULTILI<wbr>B_OSDIRNAMES-and-other-multili<wbr>b-o.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0030-Disable-the-MULTILI<wbr>B_OSDIRNAMES-and-other-multili<wbr>b-o.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0030-Disable-the-MULTILIB_<wbr>OSDIRNAMES-and-other-multilib-<wbr>o.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0030-Disable-the-MULTILIB_<wbr>OSDIRNAMES-and-other-multilib-<wbr>o.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0031-Ensure-target-gcc-h<wbr>eaders-can-be-included.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0031-Ensure-target-gcc-h<wbr>eaders-can-be-included.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0031-Ensure-target-gcc-hea<wbr>ders-can-be-included.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0031-Ensure-target-gcc-hea<wbr>ders-can-be-included.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0032-gcc-4.8-won-t-build<wbr>-with-disable-dependency-track<wbr>ing.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0032-gcc-4.8-won-t-build<wbr>-with-disable-dependency-track<wbr>ing.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0032-gcc-4.8-won-t-build-w<wbr>ith-disable-dependency-trackin<wbr>g.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0032-gcc-4.8-won-t-build-w<wbr>ith-disable-dependency-trackin<wbr>g.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0033-Don-t-search-host-d<wbr>irectory-during-relink-if-inst<wbr>_pr.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0033-Don-t-search-host-d<wbr>irectory-during-relink-if-inst<wbr>_pr.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0033-Don-t-search-host-dir<wbr>ectory-during-relink-if-inst_p<wbr>r.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0033-Don-t-search-host-dir<wbr>ectory-during-relink-if-inst_p<wbr>r.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0034-Use-SYSTEMLIBS_DIR-<wbr>replacement-instead-of-hardcod<wbr>ing.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0034-Use-SYSTEMLIBS_DIR-<wbr>replacement-instead-of-hardcod<wbr>ing.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0034-Use-SYSTEMLIBS_DIR-re<wbr>placement-instead-of-hardcodin<wbr>g.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0034-Use-SYSTEMLIBS_DIR-re<wbr>placement-instead-of-hardcodin<wbr>g.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0035-aarch64-Add-support<wbr>-for-musl-ldso.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0035-aarch64-Add-support<wbr>-for-musl-ldso.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0035-aarch64-Add-support-f<wbr>or-musl-ldso.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0035-aarch64-Add-support-f<wbr>or-musl-ldso.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0036-libcc1-fix-libcc1-s<wbr>-install-path-and-rpath.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0036-libcc1-fix-libcc1-s<wbr>-install-path-and-rpath.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0036-libcc1-fix-libcc1-s-i<wbr>nstall-path-and-rpath.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0036-libcc1-fix-libcc1-s-i<wbr>nstall-path-and-rpath.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0037-handle-sysroot-supp<wbr>ort-for-nativesdk-gcc.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0037-handle-sysroot-supp<wbr>ort-for-nativesdk-gcc.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0037-handle-sysroot-suppor<wbr>t-for-nativesdk-gcc.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0037-handle-sysroot-suppor<wbr>t-for-nativesdk-gcc.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0038-Search-target-sysro<wbr>ot-gcc-version-specific-dirs-w<wbr>ith.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0038-Search-target-sysro<wbr>ot-gcc-version-specific-dirs-w<wbr>ith.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0038-Search-target-sysroot<wbr>-gcc-version-specific-dirs-wit<wbr>h.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0038-Search-target-sysroot<wbr>-gcc-version-specific-dirs-wit<wbr>h.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0039-Fix-various-_FOR_BU<wbr>ILD-and-related-variables.patc<wbr>h b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0039-Fix-various-_FOR_BU<wbr>ILD-and-related-variables.patc<wbr>h<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0039-Fix-various-_FOR_BUIL<wbr>D-and-related-variables.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0039-Fix-various-_FOR_BUIL<wbr>D-and-related-variables.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0040-nios2-Define-MUSL_D<wbr>YNAMIC_LINKER.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0040-nios2-Define-MUSL_D<wbr>YNAMIC_LINKER.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0040-nios2-Define-MUSL_DYN<wbr>AMIC_LINKER.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0040-nios2-Define-MUSL_DYN<wbr>AMIC_LINKER.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0041-Add-ssp_nonshared-t<wbr>o-link-commandline-for-musl-ta<wbr>rge.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0041-Add-ssp_nonshared-t<wbr>o-link-commandline-for-musl-ta<wbr>rge.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0041-Add-ssp_nonshared-to-<wbr>link-commandline-for-musl-targ<wbr>e.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0041-Add-ssp_nonshared-to-<wbr>link-commandline-for-musl-targ<wbr>e.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0042-gcc-libcpp-support-<wbr>ffile-prefix-map-old-new.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0042-gcc-libcpp-support-<wbr>ffile-prefix-map-old-new.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0042-gcc-libcpp-support-ff<wbr>ile-prefix-map-old-new.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0042-gcc-libcpp-support-ff<wbr>ile-prefix-map-old-new.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0043-Reuse-fdebug-prefix<wbr>-map-to-replace-ffile-prefix-m<wbr>ap.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0043-Reuse-fdebug-prefix<wbr>-map-to-replace-ffile-prefix-m<wbr>ap.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0043-Reuse-fdebug-prefix-m<wbr>ap-to-replace-ffile-prefix-map<wbr>.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0043-Reuse-fdebug-prefix-m<wbr>ap-to-replace-ffile-prefix-map<wbr>.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0044-gcc-final.c-fdebug-<wbr>prefix-map-support-to-remap-so<wbr>urc.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0044-gcc-final.c-fdebug-<wbr>prefix-map-support-to-remap-so<wbr>urc.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0044-gcc-final.c-fdebug-pr<wbr>efix-map-support-to-remap-sour<wbr>c.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0044-gcc-final.c-fdebug-pr<wbr>efix-map-support-to-remap-sour<wbr>c.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0045-libgcc-Add-knob-to-<wbr>use-ldbl-128-on-ppc.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0045-libgcc-Add-knob-to-<wbr>use-ldbl-128-on-ppc.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0045-libgcc-Add-knob-to-us<wbr>e-ldbl-128-on-ppc.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0045-libgcc-Add-knob-to-us<wbr>e-ldbl-128-on-ppc.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0046-Link-libgcc-using-L<wbr>DFLAGS-not-just-SHLIB_LDFLAGS.<wbr>patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0046-Link-libgcc-using-L<wbr>DFLAGS-not-just-SHLIB_LDFLAGS.<wbr>patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0046-Link-libgcc-using-LDF<wbr>LAGS-not-just-SHLIB_LDFLAGS.pa<wbr>tch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0046-Link-libgcc-using-LDF<wbr>LAGS-not-just-SHLIB_LDFLAGS.pa<wbr>tch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0047-libgcc_s-Use-alias-<wbr>for-__cpu_indicator_init-inste<wbr>ad-.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0047-libgcc_s-Use-alias-<wbr>for-__cpu_indicator_init-inste<wbr>ad-.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0047-libgcc_s-Use-alias-fo<wbr>r-__cpu_indicator_init-instead<wbr>-.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0047-libgcc_s-Use-alias-fo<wbr>r-__cpu_indicator_init-instead<wbr>-.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0048-sync-gcc-stddef.h-w<wbr>ith-musl.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0048-sync-gcc-stddef.h-w<wbr>ith-musl.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0048-sync-gcc-stddef.h-wit<wbr>h-musl.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0048-sync-gcc-stddef.h-wit<wbr>h-musl.patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0054_all_nopie-all-flags<wbr>.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0054_all_nopie-all-flags<wbr>.patch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0054_all_nopie-all-flags.p<wbr>atch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0054_all_nopie-all-flags.p<wbr>atch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/<a href="http://0055-unwind_h-glibc26.pa" target="_blank">0055-unwind_h-glibc26.pa</a><wbr>tch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/<a href="http://0055-unwind_h-glibc26.pa" target="_blank">0055-unwind_h-glibc26.pa</a><wbr>tch<br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/0055-unwind_h-glibc26.patc<wbr>h<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0055-unwind_h-glibc26.patc<wbr>h<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/CVE-2016-6131.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/CVE-2016-6131.patch<br>
similarity index 89%<br>
rename from meta/recipes-devtools/gcc/gcc-<wbr>6.3/CVE-2016-6131.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/CVE-2016-6131.patch<br>
index e873cc6..68d0dee 100644<br>
--- a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/CVE-2016-6131.patch<br>
+++ b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/CVE-2016-6131.patch<br>
@@ -41,27 +41,31 @@ diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog<br>
index 240138f..adf1d72 100644<br>
--- a/libiberty/ChangeLog<br>
+++ b/libiberty/ChangeLog<br>
-@@ -1,3 +1,20 @@<br>
+@@ -2,6 +2,23 @@<br>
+<br>
+ * GCC 6.4.0 released.<br>
+<br>
+2016-08-04 Marcel Böhme <<a href="mailto:boehme.marcel@gmail.com" target="_blank">boehme.marcel@gmail.com</a>><br>
+<br>
-+ PR c++/71696<br>
-+ * cplus-dem.c: Prevent infinite recursion when there is a cycle<br>
-+ in the referencing of remembered mangled types.<br>
-+ (work_stuff): New stack to keep track of the remembered mangled<br>
-+ types that are currently being processed.<br>
-+ (push_processed_type): New method to push currently processed<br>
-+ remembered type onto the stack.<br>
-+ (pop_processed_type): New method to pop currently processed<br>
-+ remembered type from the stack.<br>
-+ (work_stuff_copy_to_from): Copy values of new variables.<br>
-+ (delete_non_B_K_work_stuff): Free stack memory.<br>
-+ (demangle_args): Push/Pop currently processed remembered type.<br>
-+ (do_type): Do not demangle a cyclic reference and push/pop<br>
-+ referenced remembered type.<br>
++ PR c++/71696<br>
++ * cplus-dem.c: Prevent infinite recursion when there is a cycle<br>
++ in the referencing of remembered mangled types.<br>
++ (work_stuff): New stack to keep track of the remembered mangled<br>
++ types that are currently being processed.<br>
++ (push_processed_type): New method to push currently processed<br>
++ remembered type onto the stack.<br>
++ (pop_processed_type): New method to pop currently processed<br>
++ remembered type from the stack.<br>
++ (work_stuff_copy_to_from): Copy values of new variables.<br>
++ (delete_non_B_K_work_stuff): Free stack memory.<br>
++ (demangle_args): Push/Pop currently processed remembered type.<br>
++ (do_type): Do not demangle a cyclic reference and push/pop<br>
++ referenced remembered type.<br>
+<br>
2016-12-21 Release Manager<br>
<br>
- * GCC 6.3.0 released.<br>
+ * GCC 6.3.0 released.<br>
+<br>
diff --git a/libiberty/cplus-dem.c b/libiberty/cplus-dem.c<br>
index 7514e57..f21e630 100644<br>
--- a/libiberty/cplus-dem.c<br>
diff --git a/meta/recipes-devtools/gcc/<a href="http://gcc-cross-canadian_6.3.bb" rel="noreferrer" target="_blank">gc<wbr>c-cross-canadian_6.3.bb</a> b/meta/recipes-devtools/gcc/<a href="http://gcc-cross-canadian_6.4.bb" rel="noreferrer" target="_blank">gc<wbr>c-cross-canadian_6.4.bb</a><br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/<a href="http://gcc-cross-canadian_6.3.bb" rel="noreferrer" target="_blank">gcc-<wbr>cross-canadian_6.3.bb</a><br>
rename to meta/recipes-devtools/gcc/<a href="http://gcc-cross-canadian_6.4.bb" rel="noreferrer" target="_blank">gcc-<wbr>cross-canadian_6.4.bb</a><br>
diff --git a/meta/recipes-devtools/gcc/<a href="http://gcc-cross-initial_6.3.bb" rel="noreferrer" target="_blank">gc<wbr>c-cross-initial_6.3.bb</a> b/meta/recipes-devtools/gcc/<a href="http://gcc-cross-initial_6.4.bb" rel="noreferrer" target="_blank">gc<wbr>c-cross-initial_6.4.bb</a><br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/<a href="http://gcc-cross-initial_6.3.bb" rel="noreferrer" target="_blank">gcc-<wbr>cross-initial_6.3.bb</a><br>
rename to meta/recipes-devtools/gcc/<a href="http://gcc-cross-initial_6.4.bb" rel="noreferrer" target="_blank">gcc-<wbr>cross-initial_6.4.bb</a><br>
diff --git a/meta/recipes-devtools/gcc/<a href="http://gcc-cross_6.3.bb" rel="noreferrer" target="_blank">gc<wbr>c-cross_6.3.bb</a> b/meta/recipes-devtools/gcc/<a href="http://gcc-cross_6.4.bb" rel="noreferrer" target="_blank">gc<wbr>c-cross_6.4.bb</a><br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/<a href="http://gcc-cross_6.3.bb" rel="noreferrer" target="_blank">gcc-<wbr>cross_6.3.bb</a><br>
rename to meta/recipes-devtools/gcc/<a href="http://gcc-cross_6.4.bb" rel="noreferrer" target="_blank">gcc-<wbr>cross_6.4.bb</a><br>
diff --git a/meta/recipes-devtools/gcc/<a href="http://gcc-crosssdk-initial_6.3.bb" rel="noreferrer" target="_blank">gc<wbr>c-crosssdk-initial_6.3.bb</a> b/meta/recipes-devtools/gcc/<a href="http://gcc-crosssdk-initial_6.4.bb" rel="noreferrer" target="_blank">gc<wbr>c-crosssdk-initial_6.4.bb</a><br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/<a href="http://gcc-crosssdk-initial_6.3.bb" rel="noreferrer" target="_blank">gcc-<wbr>crosssdk-initial_6.3.bb</a><br>
rename to meta/recipes-devtools/gcc/<a href="http://gcc-crosssdk-initial_6.4.bb" rel="noreferrer" target="_blank">gcc-<wbr>crosssdk-initial_6.4.bb</a><br>
diff --git a/meta/recipes-devtools/gcc/<a href="http://gcc-crosssdk_6.3.bb" rel="noreferrer" target="_blank">gc<wbr>c-crosssdk_6.3.bb</a> b/meta/recipes-devtools/gcc/<a href="http://gcc-crosssdk_6.4.bb" rel="noreferrer" target="_blank">gc<wbr>c-crosssdk_6.4.bb</a><br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/<a href="http://gcc-crosssdk_6.3.bb" rel="noreferrer" target="_blank">gcc-<wbr>crosssdk_6.3.bb</a><br>
rename to meta/recipes-devtools/gcc/<a href="http://gcc-crosssdk_6.4.bb" rel="noreferrer" target="_blank">gcc-<wbr>crosssdk_6.4.bb</a><br>
diff --git a/meta/recipes-devtools/gcc/<a href="http://gcc-runtime_6.3.bb" rel="noreferrer" target="_blank">gc<wbr>c-runtime_6.3.bb</a> b/meta/recipes-devtools/gcc/<a href="http://gcc-runtime_6.4.bb" rel="noreferrer" target="_blank">gc<wbr>c-runtime_6.4.bb</a><br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/<a href="http://gcc-runtime_6.3.bb" rel="noreferrer" target="_blank">gcc-<wbr>runtime_6.3.bb</a><br>
rename to meta/recipes-devtools/gcc/<a href="http://gcc-runtime_6.4.bb" rel="noreferrer" target="_blank">gcc-<wbr>runtime_6.4.bb</a><br>
diff --git a/meta/recipes-devtools/gcc/<a href="http://gcc-sanitizers_6.3.bb" rel="noreferrer" target="_blank">gc<wbr>c-sanitizers_6.3.bb</a> b/meta/recipes-devtools/gcc/<a href="http://gcc-sanitizers_6.4.bb" rel="noreferrer" target="_blank">gc<wbr>c-sanitizers_6.4.bb</a><br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/<a href="http://gcc-sanitizers_6.3.bb" rel="noreferrer" target="_blank">gcc-<wbr>sanitizers_6.3.bb</a><br>
rename to meta/recipes-devtools/gcc/<a href="http://gcc-sanitizers_6.4.bb" rel="noreferrer" target="_blank">gcc-<wbr>sanitizers_6.4.bb</a><br>
diff --git a/meta/recipes-devtools/gcc/<a href="http://gcc-source_6.3.bb" rel="noreferrer" target="_blank">gc<wbr>c-source_6.3.bb</a> b/meta/recipes-devtools/gcc/<a href="http://gcc-source_6.4.bb" rel="noreferrer" target="_blank">gc<wbr>c-source_6.4.bb</a><br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/<a href="http://gcc-source_6.3.bb" rel="noreferrer" target="_blank">gcc-<wbr>source_6.3.bb</a><br>
rename to meta/recipes-devtools/gcc/<a href="http://gcc-source_6.4.bb" rel="noreferrer" target="_blank">gcc-<wbr>source_6.4.bb</a><br>
diff --git a/meta/recipes-devtools/gcc/<a href="http://gcc_6.3.bb" rel="noreferrer" target="_blank">gc<wbr>c_6.3.bb</a> b/meta/recipes-devtools/gcc/<a href="http://gcc_6.4.bb" rel="noreferrer" target="_blank">gc<wbr>c_6.4.bb</a><br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/<a href="http://gcc_6.3.bb" rel="noreferrer" target="_blank">gcc_<wbr>6.3.bb</a><br>
rename to meta/recipes-devtools/gcc/<a href="http://gcc_6.4.bb" rel="noreferrer" target="_blank">gcc_<wbr>6.4.bb</a><br>
diff --git a/meta/recipes-devtools/gcc/<a href="http://libgcc-initial_6.3.bb" rel="noreferrer" target="_blank">li<wbr>bgcc-initial_6.3.bb</a> b/meta/recipes-devtools/gcc/<a href="http://libgcc-initial_6.4.bb" rel="noreferrer" target="_blank">li<wbr>bgcc-initial_6.4.bb</a><br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/<a href="http://libgcc-initial_6.3.bb" rel="noreferrer" target="_blank">libg<wbr>cc-initial_6.3.bb</a><br>
rename to meta/recipes-devtools/gcc/<a href="http://libgcc-initial_6.4.bb" rel="noreferrer" target="_blank">libg<wbr>cc-initial_6.4.bb</a><br>
diff --git a/meta/recipes-devtools/gcc/<a href="http://libgcc_6.3.bb" rel="noreferrer" target="_blank">li<wbr>bgcc_6.3.bb</a> b/meta/recipes-devtools/gcc/<a href="http://libgcc_6.4.bb" rel="noreferrer" target="_blank">li<wbr>bgcc_6.4.bb</a><br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/<a href="http://libgcc_6.3.bb" rel="noreferrer" target="_blank">libg<wbr>cc_6.3.bb</a><br>
rename to meta/recipes-devtools/gcc/<a href="http://libgcc_6.4.bb" rel="noreferrer" target="_blank">libg<wbr>cc_6.4.bb</a><br>
diff --git a/meta/recipes-devtools/gcc/<a href="http://libgfortran_6.3.bb" rel="noreferrer" target="_blank">li<wbr>bgfortran_6.3.bb</a> b/meta/recipes-devtools/gcc/<a href="http://libgfortran_6.4.bb" rel="noreferrer" target="_blank">li<wbr>bgfortran_6.4.bb</a><br>
similarity index 100%<br>
rename from meta/recipes-devtools/gcc/<a href="http://libgfortran_6.3.bb" rel="noreferrer" target="_blank">libg<wbr>fortran_6.3.bb</a><br>
rename to meta/recipes-devtools/gcc/<a href="http://libgfortran_6.4.bb" rel="noreferrer" target="_blank">libg<wbr>fortran_6.4.bb</a><span class="HOEnZb"><font color="#888888"><span class="m_1921000856163412207HOEnZb"><font color="#888888"><br>
<span class="m_1921000856163412207m_508526145215732877HOEnZb"><font color="#888888">--<br>
2.7.4<br>
<br>
--<br>
______________________________<wbr>_________________<br>
Openembedded-core mailing list<br>
<a href="mailto:Openembedded-core@lists.openembedded.org" target="_blank">Openembedded-core@lists.openem<wbr>bedded.org</a><br>
<a href="http://lists.openembedded.org/mailman/listinfo/openembedded-core" rel="noreferrer" target="_blank">http://lists.openembedded.org/<wbr>mailman/listinfo/openembedded-<wbr>core</a><br>
</font></span></font></span></font></span></blockquote></div><span class="HOEnZb"><font color="#888888"><br></font></span></div>
</blockquote></div><br></div>
</blockquote></div><br></div>