<div dir="ltr"><div>Also</div><div>meta/recipes-devtools/gcc/gcc-6.4/0048-ARM-PR-target-71056-Don-t-use-vectorized-builtins-wh.patch</div><div>added in this patch doesn&#39;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">&lt;<a href="mailto:martin.jansa@gmail.com" target="_blank">martin.jansa@gmail.com</a>&gt;</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">&lt;<a href="mailto:richard.purdie@linuxfoundation.org" target="_blank">richard.purdie@<wbr>linuxfoundation.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Juro Bystricky &lt;<a href="mailto:juro.bystricky@intel.com" target="_blank">juro.bystricky@intel.com</a>&gt;<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 &lt;<a href="mailto:juro.bystricky@intel.com" target="_blank">juro.bystricky@intel.com</a>&gt;<br>
Signed-off-by: Richard Purdie &lt;<a href="mailto:richard.purdie@linuxfoundation.org" target="_blank">richard.purdie@linuxfoundatio<wbr>n.org</a>&gt;<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 =&gt; gcc-6.4.inc}               |   26 +-<br>
 .../0001-gcc-4.3.1-ARCH_<wbr>FLAGS_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 =&gt; 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 =&gt; gcc-6.4}/<a href="http://0004-uclibc-locale.pa">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-<wbr>update.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 =&gt; 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-<wbr>hack.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">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-<wbr>list-too-long-error.patch |    0<br>
 .../{gcc-6.3 =&gt; gcc-6.4}/0023-Disable-sdt.patc<wbr>h    |    0<br>
 .../gcc/{gcc-6.3 =&gt; 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 =&gt; 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-<wbr>install-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-<wbr>commandline-for-musl-targe.<wbr>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-<wbr>support-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 =&gt; 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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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 =&gt; gcc-6.4.inc} (81%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; 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.<wbr>patch<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 =&gt; gcc-6.4}/0002-uclibc-conf.patc<wbr>h (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; 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-<wbr>avo.patch<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; gcc-6.4}/<a href="http://0004-uclibc-locale.pa">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 =&gt; 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 =&gt; 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 =&gt; 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 =&gt; 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-<wbr>with-.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 =&gt; gcc-6.4}/0009-c99-snprintf.pat<wbr>ch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; 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 =&gt; 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>-return-for-return-with-pop.<wbr>patch<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; 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 =&gt; gcc-6.4}/0013-64-bit-multilib-<wbr>hack.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; gcc-6.4}/0014-optional-libstdc<wbr>.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; gcc-6.4}/0015-gcc-disable-MASK<wbr>_RELAX_PIC_CALLS-bit.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; gcc-6.4}/0016-COLLECT_GCC_OPTI<wbr>ONS.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; 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 =&gt; gcc-6.4}/0018-fortran-cross-co<wbr>mpile-hack.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; gcc-6.4}/0019-cpp-honor-sysroo<wbr>t.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; gcc-6.4}/0020-MIPS64-Default-t<wbr>o-N64-ABI.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; 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 =&gt; gcc-6.4}/0022-gcc-Fix-argument<wbr>-list-too-long-error.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; gcc-6.4}/0023-Disable-sdt.patc<wbr>h (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; gcc-6.4}/0024-libtool.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; 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 =&gt; gcc-6.4}/0026-Use-the-multilib<wbr>-config-files-from-B-instead-<wbr>of-usin.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; 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 =&gt; gcc-6.4}/0028-export-CPP.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; 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 =&gt; 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 =&gt; 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 =&gt; 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 =&gt; gcc-6.4}/0033-Don-t-search-hos<wbr>t-directory-during-relink-if-<wbr>inst_pr.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; 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 =&gt; gcc-6.4}/0035-aarch64-Add-supp<wbr>ort-for-musl-ldso.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; gcc-6.4}/0036-libcc1-fix-libcc<wbr>1-s-install-path-and-rpath.<wbr>patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; gcc-6.4}/0037-handle-sysroot-s<wbr>upport-for-nativesdk-gcc.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; 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 =&gt; gcc-6.4}/0039-Fix-various-_FOR<wbr>_BUILD-and-related-variables.<wbr>patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; gcc-6.4}/0040-nios2-Define-MUS<wbr>L_DYNAMIC_LINKER.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; gcc-6.4}/0041-Add-ssp_nonshare<wbr>d-to-link-commandline-for-<wbr>musl-targe.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; gcc-6.4}/0042-gcc-libcpp-suppo<wbr>rt-ffile-prefix-map-old-new.<wbr>patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; 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 =&gt; 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 =&gt; 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 =&gt; 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 =&gt; gcc-6.4}/0047-libgcc_s-Use-ali<wbr>as-for-__cpu_indicator_init-<wbr>instead-.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; gcc-6.4}/0048-sync-gcc-stddef.<wbr>h-with-musl.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; gcc-6.4}/0054_all_nopie-all-fl<wbr>ags.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; gcc-6.4}/0055-unwind_h-glibc26<wbr>.patch (100%)<br>
 rename meta/recipes-devtools/gcc/{gcc<wbr>-6.3 =&gt; 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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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> =&gt; <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 = &quot;${TCLIBC}-initial&quot;<br>
 PREFERRED_PROVIDER_virtual/na<wbr>tivesdk-${SDK_PREFIX}libc-init<wbr>ial ?= &quot;nativesdk-glibc-initial&quot;<br>
 PREFERRED_PROVIDER_virtual/ge<wbr>ttext ??= &quot;gettext&quot;<br>
<br>
-GCCVERSION ?= &quot;6.3%&quot;<br>
+GCCVERSION ?= &quot;6.4%&quot;<br>
 SDKGCCVERSION ?= &quot;${GCCVERSION}&quot;<br>
 BINUVERSION ?= &quot;2.28%&quot;<br>
 GDBVERSION ?= &quot;7.12%&quot;<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 &lt;kyukhin@138bc75d-0d04-0410-96<wbr>1f-82ee72b054a4&gt;<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 &lt;<a href="mailto:joshua.g.lock@intel.com" target="_blank">joshua.g.lock@intel.com</a>&gt;<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, &quot;\1&quot;, 2) == 0<br>
--      || xloc.file == &#39;\0&#39; || xloc.file[0] == &#39;\xff&#39;<br>
-+      || xloc.file[0] == &#39;\0&#39; || xloc.file[0] == &#39;\xff&#39;<br>
-       || xloc.file[1] == &#39;\xff&#39;)<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 = &quot;6.3.0&quot;<br>
+PV = &quot;6.4.0&quot;<br>
<br>
 # BINV should be incremented to a revision after a minor gcc release<br>
<br>
-BINV = &quot;6.3.0&quot;<br>
+BINV = &quot;6.4.0&quot;<br>
<br>
-FILESEXTRAPATHS =. &quot;${FILE_DIRNAME}/gcc-6.3:${FIL<wbr>E_DIRNAME}/gcc-6.3/backport:&quot;<br>
+FILESEXTRAPATHS =. &quot;${FILE_DIRNAME}/gcc-6.4:${FIL<wbr>E_DIRNAME}/gcc-6.4/backport:&quot;<br>
<br>
 DEPENDS =+ &quot;mpfr gmp libmpc zlib&quot;<br>
 NATIVEDEPS = &quot;mpfr-native gmp-native libmpc-native zlib-native&quot;<br>
@@ -24,7 +24,7 @@ LIC_FILES_CHKSUM = &quot;\<br>
 &quot;<br>
<br>
<br>
-BASEURI ?= &quot;${GNU_MIRROR}/gcc/gcc-${PV}/g<wbr>cc-${PV}.tar.bz2&quot;<br>
+BASEURI ?= &quot;${GNU_MIRROR}/gcc/gcc-${PV}/g<wbr>cc-${PV}.tar.xz&quot;<br>
 #SRCREV = &quot;bd9a826d5448db11d29d2ec5884e7<wbr>e679066f140&quot;<br>
 #BASEURI ?= &quot;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>&quot;<br>
 #BASEURI ?= &quot;<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>&quot;<br>
@@ -85,10 +85,22 @@ SRC_URI = &quot;\<br>
 &quot;<br>
 BACKPORTS = &quot;\<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-<wbr>avoid-cop.patch \<br>
+           file://0003-i386-Use-const-re<wbr>ference-of-struct-ix86_frame-<wbr>to-avo.patch \<br>
+           file://0004-x86-Add-<wbr>mindirect-branch.patch \<br>
+           file://0005-x86-Add-<wbr>mfunction-return.patch \<br>
+           file://0006-x86-Add-<wbr>mindirect-branch-register.<wbr>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-<wbr>INVALID_REGNUM-as-invalid-<wbr>register-number.patch \<br>
+           file://0011-i386-Update-mfunc<wbr>tion-return-for-return-with-<wbr>pop.patch \<br>
+           file://0012-i386-Add-TARGET_I<wbr>NDIRECT_BRANCH_REGISTER.patch \<br>
 &quot;<br>
-SRC_URI[md5sum] = &quot;677a7623c7ef6ab99881bc4e048de<wbr>bb6&quot;<br>
-SRC_URI[sha256sum] = &quot;f06ae7f3f790fbf0f018f6d40e844<wbr>451e6bc3b7bc96e128e63b09825c1f<wbr>8b29f&quot;<br>
+<br>
+SRC_URI[md5sum] = &quot;11ba51a0cfb8471927f387c8895fe<wbr>232&quot;<br>
+SRC_URI[sha256sum] = &quot;850bf21eafdfe5cd5f6827148184c<wbr>08c4a0852a37ccf36ce69855334d2c<wbr>914d4&quot;<br>
<br>
 S = &quot;${TMPDIR}/work-shared/gcc-${P<wbr>V}-${PR}/gcc-${PV}&quot;<br>
 #S = &quot;${TMPDIR}/work-shared/gcc-${P<wbr>V}-${PR}/git&quot;<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.<wbr>patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0001-i386-Move-struct-ix<wbr>86_frame-to-machine_function.<wbr>patch<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.<wbr>patch<br>
@@ -0,0 +1,244 @@<br>
+From c2c7775c5587dc59b6756162d390d8<wbr>9d60971a16 Mon Sep 17 00:00:00 2001<br>
+From: hjl &lt;hjl@138bc75d-0d04-0410-961f-8<wbr>2ee72b054a4&gt;<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  &lt;<a href="mailto:bernd.edlinger@hotmail.de" target="_blank">bernd.edlinger@hotmail.de</a>&gt;<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 &amp;cfun-&gt;machine-&gt;frame.<br>
+       (ix86_can_use_return_insn_p): Don&#39;t pass &amp;frame to<br>
+       ix86_compute_frame_layout.  Copy frame from cfun-&gt;machine-&gt;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>
+-                                      &lt;- 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>
+-                                      &lt;- HARD_FRAME_POINTER<br>
+-   [saved regs]<br>
+-                                      &lt;- regs_save_offset<br>
+-   [padding0]<br>
+-<br>
+-   [saved SSE regs]<br>
+-                                      &lt;- sse_regs_save_offset<br>
+-   [padding1]          |<br>
+-                     |                &lt;- FRAME_POINTER<br>
+-   [va_arg registers]  |<br>
+-                     |<br>
+-   [frame]           |<br>
+-                     |<br>
+-   [padding2]        | = to_allocate<br>
+-                                      &lt;- 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-&gt;args.pops_args &amp;&amp; crtl-&gt;args.size &gt;= 32768)<br>
+     return 0;<br>
+<br>
+-  ix86_compute_frame_layout (&amp;frame);<br>
++  ix86_compute_frame_layout ();<br>
++  frame = cfun-&gt;machine-&gt;frame;<br>
+   return (frame.stack_pointer_offset == UNITS_PER_WORD<br>
+         &amp;&amp; (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 (&amp;frame);<br>
++  ix86_compute_frame_layout ();<br>
++  struct ix86_frame frame = cfun-&gt;machine-&gt;frame;<br>
+<br>
+   if (from == ARG_POINTER_REGNUM &amp;&amp; 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 = &amp;cfun-&gt;machine-&gt;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-&gt;fs.sp_offset = INCOMING_FRAME_SP_OFFSET;<br>
+   m-&gt;fs.sp_valid = true;<br>
+<br>
+-  ix86_compute_frame_layout (&amp;frame);<br>
++  ix86_compute_frame_layout ();<br>
++  frame = m-&gt;frame;<br>
+<br>
+   if (!TARGET_64BIT &amp;&amp; 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 (&amp;frame);<br>
++  ix86_compute_frame_layout ();<br>
++  frame = m-&gt;frame;<br>
+<br>
+   m-&gt;fs.sp_valid = (!frame_pointer_needed<br>
+                   || (crtl-&gt;sp_is_unchanging<br>
+@@ -13876,7 +13833,8 @@ ix86_expand_split_stack_prolog<wbr>ue (void)<br>
+   gcc_assert (flag_split_stack &amp;&amp; reload_completed);<br>
+<br>
+   ix86_finalize_stack_realign_f<wbr>lags ();<br>
+-  ix86_compute_frame_layout (&amp;frame);<br>
++  ix86_compute_frame_layout ();<br>
++  frame = cfun-&gt;machine-&gt;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 &#39;@&#39;<br>
+<br>
++#ifndef USED_FOR_TARGET<br>
++/* Structure describing stack frame layout.<br>
++   Stack grows downward:<br>
++<br>
++   [arguments]<br>
++                                      &lt;- 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>
++                                      &lt;- HARD_FRAME_POINTER<br>
++   [saved regs]<br>
++                                      &lt;- regs_save_offset<br>
++   [padding0]<br>
++<br>
++   [saved SSE regs]<br>
++                                      &lt;- sse_regs_save_offset<br>
++   [padding1]          |<br>
++                     |                &lt;- FRAME_POINTER<br>
++   [va_arg registers]  |<br>
++                     |<br>
++   [frame]           |<br>
++                     |<br>
++   [padding2]        | = to_allocate<br>
++                                      &lt;- 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 &amp;&amp; df_regs_ever_live_p (SP_REG))<br>
+ #define ix86_static_chain_on_stack (cfun-&gt;machine-&gt;static_chain_o<wbr>n_stack)<br>
++#define ix86_red_zone_size (cfun-&gt;machine-&gt;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 &lt;hjl@138bc75d-0d04-0410-961f-8<wbr>2ee72b054a4&gt;<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  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<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-&gt;machine-&gt;frame;<br>
++  struct ix86_frame &amp;frame = cfun-&gt;machine-&gt;frame;<br>
+   return (frame.stack_pointer_offset == UNITS_PER_WORD<br>
+         &amp;&amp; (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-&gt;machine-&gt;frame;<br>
++  struct ix86_frame &amp;frame = cfun-&gt;machine-&gt;frame;<br>
+<br>
+   if (from == ARG_POINTER_REGNUM &amp;&amp; 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-&gt;machine-&gt;frame;<br>
++  struct ix86_frame &amp;frame = cfun-&gt;machine-&gt;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-<wbr>ctype_touplow_t.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0003-gcc-uclibc-locale-<wbr>ctype_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 &lt;hjl@138bc75d-0d04-0410-961f-8<wbr>2ee72b054a4&gt;<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-&gt;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-&gt;fs.sp_valid = true;<br>
+<br>
+   ix86_compute_frame_layout ();<br>
+-  frame = m-&gt;frame;<br>
++  const struct ix86_frame &amp;frame = cfun-&gt;machine-&gt;frame;<br>
+<br>
+   if (!TARGET_64BIT &amp;&amp; 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-&gt;machine;<br>
+   struct machine_frame_state frame_state_save = m-&gt;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-&gt;frame;<br>
++  const struct ix86_frame &amp;frame = cfun-&gt;machine-&gt;frame;<br>
+<br>
+   m-&gt;fs.sp_valid = (!frame_pointer_needed<br>
+                   || (crtl-&gt;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-&gt;calls_eh_return &amp;&amp; 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-&gt;calls_eh_return)<br>
+@@ -13397,11 +13397,11 @@ ix86_expand_epilogue (int style)<br>
+   else if (TARGET_EPILOGUE_USING_MOVE<br>
+          &amp;&amp; cfun-&gt;machine-&gt;use_fast_prolog<wbr>ue_epilogue<br>
+          &amp;&amp; (frame.nregs &gt; 1<br>
+-             || m-&gt;fs.sp_offset != frame.reg_save_offset))<br>
++             || m-&gt;fs.sp_offset != reg_save_offset))<br>
+     restore_regs_via_mov = true;<br>
+   else if (frame_pointer_needed<br>
+          &amp;&amp; !frame.nregs<br>
+-         &amp;&amp; m-&gt;fs.sp_offset != frame.reg_save_offset)<br>
++         &amp;&amp; m-&gt;fs.sp_offset != reg_save_offset)<br>
+     restore_regs_via_mov = true;<br>
+   else if (frame_pointer_needed<br>
+          &amp;&amp; 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-&gt;fs.sp_valid<br>
+         || (TARGET_SEH<br>
+-            &amp;&amp; (m-&gt;fs.sp_offset - frame.reg_save_offset<br>
++            &amp;&amp; (m-&gt;fs.sp_offset - reg_save_offset<br>
+                 &gt;= SEH_MAX_FRAME_SIZE)))<br>
+       {<br>
+         pro_epilogue_adjust_stack (stack_pointer_rtx, hard_frame_pointer_rtx,<br>
+                                    GEN_INT (m-&gt;fs.fp_offset<br>
+-                                            - frame.reg_save_offset),<br>
++                                            - reg_save_offset),<br>
+                                    style, false);<br>
+       }<br>
+-      else if (m-&gt;fs.sp_offset != frame.reg_save_offset)<br>
++      else if (m-&gt;fs.sp_offset != reg_save_offset)<br>
+       {<br>
+         pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,<br>
+                                    GEN_INT (m-&gt;fs.sp_offset<br>
+-                                            - frame.reg_save_offset),<br>
++                                            - reg_save_offset),<br>
+                                    style,<br>
+                                    m-&gt;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-<wbr>branch.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0004-x86-Add-mindirect-<wbr>branch.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-<wbr>branch.patch<br>
@@ -0,0 +1,2151 @@<br>
+From 6140c2c0bb2b61e69d0da84315e043<wbr>3ff3520aaa Mon Sep 17 00:00:00 2001<br>
+From: &quot;H.J. Lu&quot; &lt;<a href="mailto:hjl.tools@gmail.com" target="_blank">hjl.tools@gmail.com</a>&gt;<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 &#39;keep&#39;, which keeps indirect call and<br>
+jump unmodified.  &#39;thunk&#39; converts indirect call and jump to call and<br>
+return thunk.  &#39;thunk-inline&#39; converts indirect call and jump to inlined<br>
+call and return thunk.  &#39;thunk-extern&#39; 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, &quot;jmp mem&quot;, is converted to<br>
+<br>
+       push memory<br>
+       jmp __x86_indirect_thunk<br>
+<br>
+Indirect call via memory, &quot;call mem&quot;, 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, &quot;jmp reg&quot;, is converted to<br>
+<br>
+       jmp __x86_indirect_thunk_reg<br>
+<br>
+Indirect call via register, &quot;call reg&quot;, 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  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<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_<wbr>attribute): 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  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<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&#39;t use red-zone when<br>
++   there are local indirect jumps, like &quot;indirect_jump&quot; or &quot;tablejump&quot;,<br>
++   which jumps to another place in the function, since &quot;call&quot; 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 &amp;&amp; !TARGET_64BIT_MS_ABI;<br>
++  return (TARGET_RED_ZONE<br>
++        &amp;&amp; !TARGET_64BIT_MS_ABI<br>
++        &amp;&amp; (!cfun-&gt;machine-&gt;has_local_ind<wbr>irect_jump<br>
++            || cfun-&gt;machine-&gt;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-&gt;machine-&gt;indirect_branc<wbr>h_type == indirect_branch_unset)<br>
++    {<br>
++      tree attr = lookup_attribute (&quot;indirect_branch&quot;,<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), &quot;keep&quot;) == 0)<br>
++          cfun-&gt;machine-&gt;indirect_branch<wbr>_type = indirect_branch_keep;<br>
++        else if (strcmp (TREE_STRING_POINTER (cst), &quot;thunk&quot;) == 0)<br>
++          cfun-&gt;machine-&gt;indirect_branch<wbr>_type = indirect_branch_thunk;<br>
++        else if (strcmp (TREE_STRING_POINTER (cst), &quot;thunk-inline&quot;) == 0)<br>
++          cfun-&gt;machine-&gt;indirect_branch<wbr>_type = indirect_branch_thunk_inline;<br>
++        else if (strcmp (TREE_STRING_POINTER (cst), &quot;thunk-extern&quot;) == 0)<br>
++          cfun-&gt;machine-&gt;indirect_branch<wbr>_type = indirect_branch_thunk_extern;<br>
++        else<br>
++          gcc_unreachable ();<br>
++      }<br>
++      else<br>
++      cfun-&gt;machine-&gt;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&#39;t want to<br>
+      slow things down too much or call target_reinit when it isn&#39;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&#39;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 &quot;LIND&quot;<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 ? &quot;_bnd&quot; : &quot;&quot;;<br>
++      if (regno &gt;= 0)<br>
++      {<br>
++        const char *reg_prefix;<br>
++        if (LEGACY_INT_REGNO_P (regno))<br>
++          reg_prefix = TARGET_64BIT ? &quot;r&quot; : &quot;e&quot;;<br>
++        else<br>
++          reg_prefix = &quot;&quot;;<br>
++        sprintf (name, &quot;__x86_indirect_thunk%s_%s%s&quot;,<br>
++                 bnd, reg_prefix, reg_names[regno]);<br>
++      }<br>
++      else<br>
++      sprintf (name, &quot;__x86_indirect_thunk%s&quot;, bnd);<br>
++    }<br>
++  else<br>
++    {<br>
++      if (regno &gt;= 0)<br>
++      {<br>
++        if (need_bnd_p)<br>
++          ASM_GENERATE_INTERNAL_LABEL (name, &quot;LITBR&quot;, regno);<br>
++        else<br>
++          ASM_GENERATE_INTERNAL_LABEL (name, &quot;LITR&quot;, regno);<br>
++      }<br>
++      else<br>
++      {<br>
++        if (need_bnd_p)<br>
++          ASM_GENERATE_INTERNAL_LABEL (name, &quot;LITB&quot;, 0);<br>
++        else<br>
++          ASM_GENERATE_INTERNAL_LABEL (name, &quot;LIT&quot;, 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 (&quot;\tbnd call\t&quot;, asm_out_file);<br>
++  else<br>
++    fputs (&quot;\tcall\t&quot;, asm_out_file);<br>
++  assemble_name_raw (asm_out_file, indirectlabel2);<br>
++  fputc (&#39;\n&#39;, asm_out_file);<br>
++<br>
++  ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel1);<br>
++<br>
++  /* Pause + lfence.  */<br>
++  fprintf (asm_out_file, &quot;\tpause\n\tlfence\n&quot;);<br>
++<br>
++  /* Jump.  */<br>
++  fputs (&quot;\tjmp\t&quot;, asm_out_file);<br>
++  assemble_name_raw (asm_out_file, indirectlabel1);<br>
++  fputc (&#39;\n&#39;, asm_out_file);<br>
++<br>
++  ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2);<br>
++<br>
++  if (regno &gt;= 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 (&quot;mov\t{%1, %0|%0, %1}&quot;, 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 (&quot;lea\t{%E1, %0|%0, %E1}&quot;, xops);<br>
++    }<br>
++<br>
++  if (need_bnd_p)<br>
++    fputs (&quot;\tbnd ret\n&quot;, asm_out_file);<br>
++  else<br>
++    fputs (&quot;\tret\n&quot;, 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 (&quot;\t.weak_definition\t&quot;, asm_out_file);<br>
++      assemble_name (asm_out_file, name);<br>
++      fputs (&quot;\n\t.private_extern\t&quot;, asm_out_file);<br>
++      assemble_name (asm_out_file, name);<br>
++      putc (&#39;\n&#39;, 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)-&gt;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 (&quot;\t.hidden\t&quot;, asm_out_file);<br>
++      assemble_name (asm_out_file, name);<br>
++      putc (&#39;\n&#39;, 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&#39;re about to hide the function body from callees of final_* by<br>
++     emitting it directly; tell them we&#39;re a thunk, if they care.  */<br>
++  cfun-&gt;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 &lt;= LAST_REX_INT_REG; regno++)<br>
++    {<br>
++      int i = regno - FIRST_REX_INT_REG + LAST_INT_REG + 1;<br>
++      if ((indirect_thunks_used &amp; (1 &lt;&lt; i)))<br>
++      output_indirect_thunk_function (false, regno);<br>
++<br>
++      if ((indirect_thunks_bnd_used &amp; (1 &lt;&lt; i)))<br>
++      output_indirect_thunk_function (true, regno);<br>
++    }<br>
++<br>
+   for (regno = AX_REG; regno &lt;= SP_REG; regno++)<br>
+     {<br>
+       char name[32];<br>
+       tree decl;<br>
+<br>
++      if ((indirect_thunks_used &amp; (1 &lt;&lt; regno)))<br>
++      output_indirect_thunk_function (false, regno);<br>
++<br>
++      if ((indirect_thunks_bnd_used &amp; (1 &lt;&lt; regno)))<br>
++      output_indirect_thunk_function (true, regno);<br>
++<br>
+       if (!(pic_labels_used &amp; (1 &lt;&lt; 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-&gt;machine-&gt;indirect_branc<wbr>h_type<br>
++      != indirect_branch_thunk_inline)<br>
++    {<br>
++      if (cfun-&gt;machine-&gt;indirect_branc<wbr>h_type == indirect_branch_thunk)<br>
++      {<br>
++        int i = regno;<br>
++        if (i &gt;= 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 &lt;&lt; i;<br>
++        else<br>
++          indirect_thunks_used |= 1 &lt;&lt; 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, &quot;\tbnd jmp\t%s\n&quot;, thunk_name);<br>
++        else<br>
++          fprintf (asm_out_file, &quot;\tjmp\t%s\n&quot;, 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, &quot;\tbnd call\t%s\n&quot;, thunk_name);<br>
++        else<br>
++          fprintf (asm_out_file, &quot;\tcall\t%s\n&quot;, 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 (&quot;\tbnd jmp\t&quot;, asm_out_file);<br>
++      else<br>
++      fputs (&quot;\tjmp\t&quot;, asm_out_file);<br>
++      assemble_name_raw (asm_out_file, indirectlabel2);<br>
++      fputc (&#39;\n&#39;, 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, &quot;\tbnd jmp\t%s\n&quot;, thunk_name);<br>
++        else<br>
++          fprintf (asm_out_file, &quot;\tjmp\t%s\n&quot;, 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 (&quot;\tbnd call\t&quot;, asm_out_file);<br>
++      else<br>
++      fputs (&quot;\tcall\t&quot;, asm_out_file);<br>
++      assemble_name_raw (asm_out_file, indirectlabel1);<br>
++      fputc (&#39;\n&#39;, 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-&gt;machine-&gt;indirect_branc<wbr>h_type<br>
++      != indirect_branch_thunk_inline)<br>
++    {<br>
++      if (cfun-&gt;machine-&gt;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), &quot;push{%c}\t%s&quot;,<br>
++          TARGET_64BIT ? &#39;q&#39; : &#39;l&#39;, xasm);<br>
++<br>
++  if (sibcall_p)<br>
++    {<br>
++      output_asm_insn (push_buf, &amp;call_op);<br>
++      if (thunk_name != NULL)<br>
++      {<br>
++        if (need_bnd_p)<br>
++          fprintf (asm_out_file, &quot;\tbnd jmp\t%s\n&quot;, thunk_name);<br>
++        else<br>
++          fprintf (asm_out_file, &quot;\tjmp\t%s\n&quot;, 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 (&quot;\tbnd jmp\t&quot;, asm_out_file);<br>
++      else<br>
++      fputs (&quot;\tjmp\t&quot;, asm_out_file);<br>
++      assemble_name_raw (asm_out_file, indirectlabel2);<br>
++      fputc (&#39;\n&#39;, 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, &amp;parts)<br>
++            &amp;&amp; parts.base == stack_pointer_rtx)<br>
++          {<br>
++            /* Since call will adjust stack by -UNITS_PER_WORD,<br>
++               we must convert &quot;disp(stack, index, scale)&quot; to<br>
++               &quot;disp+UNITS_PER_WORD(stack, index, scale)&quot;.  */<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, &amp;call_op);<br>
++<br>
++      if (thunk_name != NULL)<br>
++      {<br>
++        if (need_bnd_p)<br>
++          fprintf (asm_out_file, &quot;\tbnd jmp\t%s\n&quot;, thunk_name);<br>
++        else<br>
++          fprintf (asm_out_file, &quot;\tjmp\t%s\n&quot;, 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 (&quot;\tbnd call\t&quot;, asm_out_file);<br>
++      else<br>
++      fputs (&quot;\tcall\t&quot;, asm_out_file);<br>
++      assemble_name_raw (asm_out_file, indirectlabel1);<br>
++      fputc (&#39;\n&#39;, 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-&gt;machine-&gt;indirect_branc<wbr>h_type != indirect_branch_keep)<br>
++    {<br>
++      /* We can&#39;t have red-zone if this isn&#39;t a function return since<br>
++       &quot;call&quot; in the indirect thunk pushes the return address onto<br>
++       stack, destroying red-zone.  */<br>
++      if (!ret_p &amp;&amp; ix86_red_zone_size != 0)<br>
++      gcc_unreachable ();<br>
++<br>
++      ix86_output_indirect_branch (call_op, &quot;%0&quot;, true);<br>
++      return &quot;&quot;;<br>
++    }<br>
++  else<br>
++    return &quot;%!jmp\t%A0&quot;;<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>
++       &amp;&amp; cfun-&gt;machine-&gt;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 = &quot;%!jmp\t{*%p0@GOTPCREL(%%rip)|<wbr>[QWORD PTR %p0@GOTPCREL[rip]]}&quot;;<br>
++          {<br>
++            direct_p = false;<br>
++            if (output_indirect_p)<br>
++              xasm = &quot;{%p0@GOTPCREL(%%rip)|[QWORD PTR %p0@GOTPCREL[rip]]}&quot;;<br>
++            else<br>
++              xasm = &quot;%!jmp\t{*%p0@GOTPCREL(%%rip)|<wbr>[QWORD PTR %p0@GOTPCREL[rip]]}&quot;;<br>
++          }<br>
+         else<br>
+           xasm = &quot;%!jmp\t%P0&quot;;<br>
+       }<br>
+@@ -27392,9 +27963,17 @@ ix86_output_call_insn (rtx_insn *insn, rtx call_op)<br>
+       else if (TARGET_SEH)<br>
+       xasm = &quot;%!rex.W jmp\t%A0&quot;;<br>
+       else<br>
+-      xasm = &quot;%!jmp\t%A0&quot;;<br>
++      {<br>
++        if (output_indirect_p)<br>
++          xasm = &quot;%0&quot;;<br>
++        else<br>
++          xasm = &quot;%!jmp\t%A0&quot;;<br>
++      }<br>
+<br>
+-      output_asm_insn (xasm, &amp;call_op);<br>
++      if (output_indirect_p &amp;&amp; !direct_p)<br>
++      ix86_output_indirect_branch (call_op, xasm, true);<br>
++      else<br>
++      output_asm_insn (xasm, &amp;call_op);<br>
+       return &quot;&quot;;<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 = &quot;%!call\t{*%p0@GOTPCREL(%%rip)<wbr>|[QWORD PTR %p0@GOTPCREL[rip]]}&quot;;<br>
++      {<br>
++        direct_p = false;<br>
++        if (output_indirect_p)<br>
++          xasm = &quot;{%p0@GOTPCREL(%%rip)|[QWORD PTR %p0@GOTPCREL[rip]]}&quot;;<br>
++        else<br>
++          xasm = &quot;%!call\t{*%p0@GOTPCREL(%%rip)<wbr>|[QWORD PTR %p0@GOTPCREL[rip]]}&quot;;<br>
++      }<br>
+       else<br>
+       xasm = &quot;%!call\t%P0&quot;;<br>
+     }<br>
+   else<br>
+-    xasm = &quot;%!call\t%A0&quot;;<br>
++    {<br>
++      if (output_indirect_p)<br>
++      xasm = &quot;%0&quot;;<br>
++      else<br>
++      xasm = &quot;%!call\t%A0&quot;;<br>
++    }<br>
+<br>
+-  output_asm_insn (xasm, &amp;call_op);<br>
++  if (output_indirect_p &amp;&amp; !direct_p)<br>
++    ix86_output_indirect_branch (call_op, xasm, false);<br>
++  else<br>
++    output_asm_insn (xasm, &amp;call_op);<br>
+<br>
+   if (seh_nop_p)<br>
+     return &quot;nop&quot;;<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 (&quot;indirect_branch&quot;, name))<br>
++    {<br>
++      tree cst = TREE_VALUE (args);<br>
++      if (TREE_CODE (cst) != STRING_CST)<br>
++      {<br>
++        warning (OPT_Wattributes,<br>
++                 &quot;%qE attribute requires a string constant argument&quot;,<br>
++                 name);<br>
++        *no_add_attrs = true;<br>
++      }<br>
++      else if (strcmp (TREE_STRING_POINTER (cst), &quot;keep&quot;) != 0<br>
++             &amp;&amp; strcmp (TREE_STRING_POINTER (cst), &quot;thunk&quot;) != 0<br>
++             &amp;&amp; strcmp (TREE_STRING_POINTER (cst), &quot;thunk-inline&quot;) != 0<br>
++             &amp;&amp; strcmp (TREE_STRING_POINTER (cst), &quot;thunk-extern&quot;) != 0)<br>
++      {<br>
++        warning (OPT_Wattributes,<br>
++                 &quot;argument to %qE attribute is not &quot;<br>
++                 &quot;(keep|thunk|thunk-inline|thu<wbr>nk-extern)&quot;, 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>
+   { &quot;callee_pop_aggregate_return&quot;, 1, 1, false, true, true,<br>
+     ix86_handle_callee_pop_aggreg<wbr>ate_return, true },<br>
++  { &quot;indirect_branch&quot;, 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>
++     &quot;indirect_jump&quot; or &quot;tablejump&quot;.  */<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-&gt;machine-&gt;has_local_indir<wbr>ect_jump = true;<br>
+ })<br>
+<br>
+ (define_insn &quot;*indirect_jump&quot;<br>
+   [(set (pc) (match_operand:W 0 &quot;indirect_branch_operand&quot; &quot;rBw&quot;))]<br>
+   &quot;&quot;<br>
+-  &quot;%!jmp\t%A0&quot;<br>
+-  [(set_attr &quot;type&quot; &quot;ibr&quot;)<br>
++  &quot;* return ix86_output_indirect_jmp (operands[0], false);&quot;<br>
++  [(set (attr &quot;type&quot;)<br>
++     (if_then_else (match_test &quot;(cfun-&gt;machine-&gt;indirect_bran<wbr>ch_type<br>
++                               != indirect_branch_keep)&quot;)<br>
++      (const_string &quot;multi&quot;)<br>
++      (const_string &quot;ibr&quot;)))<br>
+    (set_attr &quot;length_immediate&quot; &quot;0&quot;)<br>
+    (set_attr &quot;maybe_prefix_bnd&quot; &quot;1&quot;)])<br>
+<br>
+@@ -11856,14 +11861,19 @@<br>
+<br>
+   if (TARGET_X32)<br>
+     operands[0] = convert_memory_address (word_mode, operands[0]);<br>
++  cfun-&gt;machine-&gt;has_local_indir<wbr>ect_jump = true;<br>
+ })<br>
+<br>
+ (define_insn &quot;*tablejump_1&quot;<br>
+   [(set (pc) (match_operand:W 0 &quot;indirect_branch_operand&quot; &quot;rBw&quot;))<br>
+    (use (label_ref (match_operand 1)))]<br>
+   &quot;&quot;<br>
+-  &quot;%!jmp\t%A0&quot;<br>
+-  [(set_attr &quot;type&quot; &quot;ibr&quot;)<br>
++  &quot;* return ix86_output_indirect_jmp (operands[0], false);&quot;<br>
++  [(set (attr &quot;type&quot;)<br>
++     (if_then_else (match_test &quot;(cfun-&gt;machine-&gt;indirect_bran<wbr>ch_type<br>
++                               != indirect_branch_keep)&quot;)<br>
++      (const_string &quot;multi&quot;)<br>
++      (const_string &quot;ibr&quot;)))<br>
+    (set_attr &quot;length_immediate&quot; &quot;0&quot;)<br>
+    (set_attr &quot;maybe_prefix_bnd&quot; &quot;1&quot;)])<br>
+<br>
+@@ -12520,8 +12530,12 @@<br>
+   [(simple_return)<br>
+    (use (match_operand:SI 0 &quot;register_operand&quot; &quot;r&quot;))]<br>
+   &quot;reload_completed&quot;<br>
+-  &quot;%!jmp\t%A0&quot;<br>
+-  [(set_attr &quot;type&quot; &quot;ibr&quot;)<br>
++  &quot;* return ix86_output_indirect_jmp (operands[0], true);&quot;<br>
++  [(set (attr &quot;type&quot;)<br>
++     (if_then_else (match_test &quot;(cfun-&gt;machine-&gt;indirect_bran<wbr>ch_type<br>
++                               != indirect_branch_keep)&quot;)<br>
++      (const_string &quot;multi&quot;)<br>
++      (const_string &quot;ibr&quot;)))<br>
+    (set_attr &quot;length_immediate&quot; &quot;0&quot;)<br>
+    (set_attr &quot;maybe_prefix_bnd&quot; &quot;1&quot;)])<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(&quot;fpmath=sse,387&quot;)<wbr>} option as<br>
+ @code{target(&quot;fpmath=sse+387&quot;)<wbr>} because the comma would separate<br>
+ different options.<br>
++<br>
++@item indirect_branch(&quot;@var{choice}&quot;<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 &quot;-O2 -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -fpic -fno-plt -mindirect-branch=thunk&quot; } */<br>
++<br>
++extern void bar (void);<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++  bar ();<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -fpic -fno-plt -mindirect-branch=thunk&quot; } */<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 &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 } } */<br>
++/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 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 &quot;-O2 -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -fno-pic&quot; } */<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(&quot;thunk&quot;)));<br>
++<br>
++void<br>
++male_indirect_jump (long offset)<br>
++{<br>
++  dispatch(offset);<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -fno-pic&quot; } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch[256];<br>
++<br>
++__attribute__ ((indirect_branch(&quot;thunk&quot;)))<br>
++void<br>
++male_indirect_jump (long offset)<br>
++{<br>
++  dispatch[offset](offset);<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -fno-pic&quot; } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch;<br>
++extern int male_indirect_jump (long)<br>
++  __attribute__ ((indirect_branch(&quot;thunk-inlin<wbr>e&quot;)));<br>
++<br>
++int<br>
++male_indirect_jump (long offset)<br>
++{<br>
++  dispatch(offset);<br>
++  return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 } } */<br>
++/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 2 } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
++/* { dg-final { scan-assembler-not &quot;__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { 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 &quot;-O2 -fno-pic&quot; } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch[256];<br>
++<br>
++__attribute__ ((indirect_branch(&quot;thunk-inlin<wbr>e&quot;)))<br>
++int<br>
++male_indirect_jump (long offset)<br>
++{<br>
++  dispatch[offset](offset);<br>
++  return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 } } */<br>
++/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 2 } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
++/* { dg-final { scan-assembler-not &quot;__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { 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 &quot;-O2 -fno-pic&quot; } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch;<br>
++extern int male_indirect_jump (long)<br>
++  __attribute__ ((indirect_branch(&quot;thunk-exter<wbr>n&quot;)));<br>
++<br>
++int<br>
++male_indirect_jump (long offset)<br>
++{<br>
++  dispatch(offset);<br>
++  return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { 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 &quot;-O2 -fno-pic&quot; } */<br>
++<br>
++typedef void (*dispatch_t)(long offset);<br>
++<br>
++dispatch_t dispatch[256];<br>
++<br>
++__attribute__ ((indirect_branch(&quot;thunk-exter<wbr>n&quot;)))<br>
++int<br>
++male_indirect_jump (long offset)<br>
++{<br>
++  dispatch[offset](offset);<br>
++  return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { 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 &quot;-O2 -fno-pic&quot; } */<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(&quot;thunk-exter<wbr>n&quot;)))<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 &quot;push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk -fno-pic&quot; } */<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(&quot;keep&quot;)))<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 &quot;__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;pushq\[ \t\]%rax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*__x86_indirect_thunk_bnd&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;bnd call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;bnd ret&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;pushq\[ \t\]%rax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*__x86_indirect_thunk_bnd&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;bnd call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;bnd ret&quot; } } */<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* &amp;&amp; { ! x32 } } } } */<br>
++/* { dg-options &quot;-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt&quot; } */<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 &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*__x86_indirect_thunk_bnd&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;bnd call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;bnd ret&quot; } } */<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* &amp;&amp; { ! x32 } } } } */<br>
++/* { dg-options &quot;-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt&quot; } */<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 &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-times &quot;bnd call\[ \t\]*\.LIND&quot; 2 } } */<br>
++/* { dg-final { scan-assembler &quot;bnd ret&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk-extern -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk-extern -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk-extern -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { 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 &quot;-O2 -mindirect-branch=thunk-extern -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { 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 &quot;-O2 -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>&quot; } */<br>
++<br>
++extern void bar (void);<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++  bar ();<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>&quot; } */<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 &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
++/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 1 } } */<br>
++/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 1 } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk-extern -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk-inline -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
++/* { dg-final { scan-assembler-not &quot;__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { 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 &quot;-O2 -mindirect-branch=thunk-inline -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
++/* { dg-final { scan-assembler-not &quot;__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { 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 &quot;-O2 -mindirect-branch=thunk-inline -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 } } */<br>
++/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 2 } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
++/* { dg-final { scan-assembler-not &quot;__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { 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 &quot;-O2 -mindirect-branch=thunk-inline -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 } } */<br>
++/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 2 } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
++/* { dg-final { scan-assembler-not &quot;__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { 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 &quot;-O2 -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>&quot; } */<br>
++<br>
++extern void bar (void);<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++  bar ();<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
++/* { dg-final { scan-assembler-not &quot;__x86_indirect_thunk&quot; } } */<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 &quot;-O2 -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>&quot; } */<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 &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
++/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 } } */<br>
++/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 2 } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
++/* { dg-final { scan-assembler-not &quot;__x86_indirect_thunk&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk-inline -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
++/* { dg-final { scan-assembler-not &quot;__x86_indirect_thunk&quot; } } */<br>
+--<br>
+2.7.4<br>
+<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0005-uclibc-locale-no__<wbr>x.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0005-uclibc-locale-no__<wbr>x.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-<wbr>return.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0005-x86-Add-mfunction-<wbr>return.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-<wbr>return.patch<br>
@@ -0,0 +1,1567 @@<br>
+From e3270814b9e0caad63fbcdfd7ae9da<wbr>2d52c97497 Mon Sep 17 00:00:00 2001<br>
+From: &quot;H.J. Lu&quot; &lt;<a href="mailto:hjl.tools@gmail.com" target="_blank">hjl.tools@gmail.com</a>&gt;<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 &#39;keep&#39;, which keeps function return<br>
+unmodified.  &#39;thunk&#39; converts function return to call and return thunk.<br>
+&#39;thunk-inline&#39; converts function return to inlined call and return thunk.<br>
+&#39;thunk-extern&#39; 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 &quot;make check&quot;.<br>
+<br>
+gcc/<br>
+<br>
+       Backport from mainline<br>
+       2018-01-14  H.J. Lu  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<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 &lt; 0.<br>
+       (ix86_output_function_return)<wbr>: New function.<br>
+       (ix86_handle_fndecl_<wbr>attribute): 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  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<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&#39;t use ASM_OUTPUT_DEF for TARGET_MACHO<br>
+<br>
+ASM_OUTPUT_DEF isn&#39;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 &quot;push&quot;<br>
+only on Linux.<br>
+<br>
+gcc/<br>
+<br>
+       Backport from mainline<br>
+       2018-01-15  H.J. Lu  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<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  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<br>
+<br>
+       PR target/83839<br>
+       * gcc.target/i386/indirect-thunk<wbr>-1.c: Scan for &quot;push&quot; 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&#39;t check the<br>
+       __x86_return_thunk label.<br>
+       Scan for &quot;push&quot; 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-&gt;machine-&gt;indirect_branc<wbr>h_type = ix86_indirect_branch;<br>
+     }<br>
++<br>
++  if (cfun-&gt;machine-&gt;function_retur<wbr>n_type == indirect_branch_unset)<br>
++    {<br>
++      tree attr = lookup_attribute (&quot;function_return&quot;,<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), &quot;keep&quot;) == 0)<br>
++          cfun-&gt;machine-&gt;function_return<wbr>_type = indirect_branch_keep;<br>
++        else if (strcmp (TREE_STRING_POINTER (cst), &quot;thunk&quot;) == 0)<br>
++          cfun-&gt;machine-&gt;function_return<wbr>_type = indirect_branch_thunk;<br>
++        else if (strcmp (TREE_STRING_POINTER (cst), &quot;thunk-inline&quot;) == 0)<br>
++          cfun-&gt;machine-&gt;function_return<wbr>_type = indirect_branch_thunk_inline;<br>
++        else if (strcmp (TREE_STRING_POINTER (cst), &quot;thunk-extern&quot;) == 0)<br>
++          cfun-&gt;machine-&gt;function_return<wbr>_type = indirect_branch_thunk_extern;<br>
++        else<br>
++          gcc_unreachable ();<br>
++      }<br>
++      else<br>
++      cfun-&gt;machine-&gt;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 &gt;= 0 &amp;&amp; ret_p)<br>
++    gcc_unreachable ();<br>
++<br>
+   if (USE_HIDDEN_LINKONCE)<br>
+     {<br>
+       const char *bnd = need_bnd_p ? &quot;_bnd&quot; : &quot;&quot;;<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, &quot;__x86_indirect_thunk%s&quot;, bnd);<br>
++      {<br>
++        const char *ret = ret_p ? &quot;return&quot; : &quot;indirect&quot;;<br>
++        sprintf (name, &quot;__x86_%s_thunk%s&quot;, 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, &quot;LITB&quot;, 0);<br>
++        if (ret_p)<br>
++          {<br>
++            if (need_bnd_p)<br>
++              ASM_GENERATE_INTERNAL_LABEL (name, &quot;LRTB&quot;, 0);<br>
++            else<br>
++              ASM_GENERATE_INTERNAL_LABEL (name, &quot;LRT&quot;, 0);<br>
++          }<br>
+         else<br>
+-          ASM_GENERATE_INTERNAL_LABEL (name, &quot;LIT&quot;, 0);<br>
++          {<br>
++            if (need_bnd_p)<br>
++              ASM_GENERATE_INTERNAL_LABEL (name, &quot;LITB&quot;, 0);<br>
++            else<br>
++              ASM_GENERATE_INTERNAL_LABEL (name, &quot;LIT&quot;, 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 &lt; 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 (&quot;\t.weak_definition\t&quot;, asm_out_file);<br>
++        assemble_name (asm_out_file, alias);<br>
++        fputs (&quot;\n\t.private_extern\t&quot;, asm_out_file);<br>
++        assemble_name (asm_out_file, alias);<br>
++        putc (&#39;\n&#39;, 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 (&quot;\t.globl\t&quot;, asm_out_file);<br>
++        assemble_name (asm_out_file, alias);<br>
++        putc (&#39;\n&#39;, asm_out_file);<br>
++        fputs (&quot;\t.hidden\t&quot;, asm_out_file);<br>
++        assemble_name (asm_out_file, alias);<br>
++        putc (&#39;\n&#39;, 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 &lt;&lt; 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 &quot;%!jmp\t%A0&quot;;<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-&gt;machine-&gt;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-&gt;machine-&gt;function_retur<wbr>n_type<br>
++        != indirect_branch_thunk_inline)<br>
++      {<br>
++        bool need_thunk = (cfun-&gt;machine-&gt;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, &quot;\tbnd jmp\t%s\n&quot;, thunk_name);<br>
++          }<br>
++        else<br>
++          {<br>
++            indirect_thunk_needed |= need_thunk;<br>
++            fprintf (asm_out_file, &quot;\tjmp\t%s\n&quot;, thunk_name);<br>
++          }<br>
++      }<br>
++      else<br>
++      output_indirect_thunk (need_bnd_p, -1);<br>
++<br>
++      return &quot;&quot;;<br>
++    }<br>
++<br>
++  if (!long_p || ix86_bnd_prefixed_insn_p (current_output_insn))<br>
++    return &quot;%!ret&quot;;<br>
++<br>
++  return &quot;rep%; ret&quot;;<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 (&quot;function_return&quot;, name))<br>
++    {<br>
++      tree cst = TREE_VALUE (args);<br>
++      if (TREE_CODE (cst) != STRING_CST)<br>
++      {<br>
++        warning (OPT_Wattributes,<br>
++                 &quot;%qE attribute requires a string constant argument&quot;,<br>
++                 name);<br>
++        *no_add_attrs = true;<br>
++      }<br>
++      else if (strcmp (TREE_STRING_POINTER (cst), &quot;keep&quot;) != 0<br>
++             &amp;&amp; strcmp (TREE_STRING_POINTER (cst), &quot;thunk&quot;) != 0<br>
++             &amp;&amp; strcmp (TREE_STRING_POINTER (cst), &quot;thunk-inline&quot;) != 0<br>
++             &amp;&amp; strcmp (TREE_STRING_POINTER (cst), &quot;thunk-extern&quot;) != 0)<br>
++      {<br>
++        warning (OPT_Wattributes,<br>
++                 &quot;argument to %qE attribute is not &quot;<br>
++                 &quot;(keep|thunk|thunk-inline|thu<wbr>nk-extern)&quot;, 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>
+   { &quot;indirect_branch&quot;, 1, 1, true, false, false,<br>
+     ix86_handle_fndecl_attribute, false },<br>
++  { &quot;function_return&quot;, 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>
+      &quot;indirect_jump&quot; or &quot;tablejump&quot;.  */<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 &quot;simple_return_internal&quot;<br>
+   [(simple_return)]<br>
+   &quot;reload_completed&quot;<br>
+-  &quot;%!ret&quot;<br>
++  &quot;* return ix86_output_function_return (false);&quot;<br>
+   [(set_attr &quot;length&quot; &quot;1&quot;)<br>
+    (set_attr &quot;atom_unit&quot; &quot;jeu&quot;)<br>
+    (set_attr &quot;length_immediate&quot; &quot;0&quot;)<br>
+@@ -12503,12 +12503,7 @@<br>
+   [(simple_return)<br>
+    (unspec [(const_int 0)] UNSPEC_REP)]<br>
+   &quot;reload_completed&quot;<br>
+-{<br>
+-  if (ix86_bnd_prefixed_insn_p (insn))<br>
+-    return &quot;%!ret&quot;;<br>
+-<br>
+-  return &quot;rep%; ret&quot;;<br>
+-}<br>
++  &quot;* return ix86_output_function_return (true);&quot;<br>
+   [(set_attr &quot;length&quot; &quot;2&quot;)<br>
+    (set_attr &quot;atom_unit&quot; &quot;jeu&quot;)<br>
+    (set_attr &quot;length_immediate&quot; &quot;0&quot;)<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(&quot;@var{choice}&quot;<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 &quot;-O2 -mindirect-branch=thunk -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -fpic -fno-plt -mindirect-branch=thunk&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk&quot; } */<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 &quot;-O2 -fpic -fno-plt -mindirect-branch=thunk&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk&quot; } */<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 &quot;-O2 -mindirect-branch=thunk -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 } } */<br>
+ /* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 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 &quot;-O2 -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 } } */<br>
+ /* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 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 &quot;-O2 -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { 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 &quot;-O2 -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { 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 &quot;-O2 -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;pushq\[ \t\]%rax&quot; { target x32 } } } */<br>
+ /* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*__x86_indirect_thunk_bnd&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;pushq\[ \t\]%rax&quot; { target x32 } } } */<br>
+ /* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*__x86_indirect_thunk_bnd&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*\.LIND&quot; } } */<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* &amp;&amp; { ! x32 } } } } */<br>
+-/* { dg-options &quot;-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt&quot; } */<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* &amp;&amp; { ! x32 } } } } */<br>
+-/* { dg-options &quot;-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt&quot; } */<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 &quot;-O2 -mindirect-branch=thunk-extern -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { 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 &quot;-O2 -mindirect-branch=thunk-extern -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { 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 &quot;-O2 -mindirect-branch=thunk-extern -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 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 &quot;-O2 -mindirect-branch=thunk-extern -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 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 &quot;-O2 -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>&quot; } */<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 &quot;-O2 -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>&quot; } */<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 &quot;-O2 -mindirect-branch=thunk-extern -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { 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 &quot;-O2 -mindirect-branch=thunk-inline -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk-inline -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk-inline -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 } } */<br>
+ /* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 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 &quot;-O2 -mindirect-branch=thunk-inline -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 } } */<br>
+ /* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 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 &quot;-O2 -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>&quot; } */<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 &quot;-O2 -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>&quot; } */<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 &quot;-O2 -mindirect-branch=thunk-inline -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<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 &quot;push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { target x32 } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mfunction-return=thunk&quot; } */<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 2 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 2 } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?bar&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } }  } } */<br>
++/* { dg-final { scan-assembler &quot;__x86_indirect_thunk:&quot; { target { ! x32 } }  } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target { x32 } }  } } */<br>
++/* { dg-final { scan-assembler &quot;__x86_indirect_thunk_(r|e)ax:<wbr>&quot; { target { x32 } }  } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { 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 &quot;-O2 -mfunction-return=thunk-extern -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?bar&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;__x86_indirect_thunk:&quot; { target { ! x32 } }  } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target { x32 } }  } } */<br>
++/* { dg-final { scan-assembler &quot;__x86_indirect_thunk_(r|e)ax:<wbr>&quot; { target { x32 } }  } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { 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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;__x86_indirect_thunk:&quot; { target { ! x32 } }  } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target { x32 } }  } } */<br>
++/* { dg-final { scan-assembler &quot;__x86_indirect_thunk_(r|e)ax:<wbr>&quot; { target { x32 } }  } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { 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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<br>
++<br>
++extern void (*bar) (void);<br>
++extern int foo (void) __attribute__ ((function_return(&quot;thunk&quot;)));<br>
++<br>
++int<br>
++foo (void)<br>
++{<br>
++  bar ();<br>
++  return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 2 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 2 } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?bar&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 3 } } */<br>
++/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 3 } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target { x32 } }  } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { 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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<br>
++<br>
++extern void (*bar) (void);<br>
++<br>
++__attribute__ ((function_return(&quot;thunk-inlin<wbr>e&quot;)))<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 &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?bar&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target { x32 } }  } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { 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 &quot;-O2 -mfunction-return=keep -mindirect-branch=keep -fno-pic&quot; } */<br>
++<br>
++extern void (*bar) (void);<br>
++<br>
++__attribute__ ((function_return(&quot;thunk-exter<wbr>n&quot;), indirect_branch(&quot;thunk&quot;)))<br>
++int<br>
++foo (void)<br>
++{<br>
++  bar ();<br>
++  return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?bar&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { 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 &quot;-O2 -mfunction-return=thunk-inline -mindirect-branch=thunk-extern -fno-pic&quot; } */<br>
++<br>
++extern void (*bar) (void);<br>
++<br>
++__attribute__ ((function_return(&quot;keep&quot;), indirect_branch(&quot;keep&quot;)))<br>
++int<br>
++foo (void)<br>
++{<br>
++  bar ();<br>
++  return 0;<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler-not &quot;__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;__x86_return_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mfunction-return=thunk-inline<wbr>&quot; } */<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<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 &quot;-O2 -mfunction-return=thunk-extern<wbr>&quot; } */<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mfunction-return=keep&quot; } */<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mfunction-return=keep&quot; } */<br>
++<br>
++extern void foo (void) __attribute__ ((function_return(&quot;thunk&quot;)));<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mfunction-return=keep&quot; } */<br>
++<br>
++__attribute__ ((function_return(&quot;thunk-inlin<wbr>e&quot;)))<br>
++void<br>
++foo (void)<br>
++{<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler {\tlfence} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<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 &quot;-O2 -mfunction-return=keep&quot; } */<br>
++<br>
++__attribute__ ((function_return(&quot;thunk-exter<wbr>n&quot;)))<br>
++void<br>
++foo (void)<br>
++{<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mfunction-return=thunk-inline<wbr>&quot; } */<br>
++<br>
++extern void foo (void) __attribute__ ((function_return(&quot;keep&quot;)));<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mfunction-return=thunk -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;__x86_indirect_thunk:&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?bar&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { 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 &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target { x32 } } } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { 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-<wbr>branch-register.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0006-x86-Add-mindirect-<wbr>branch-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-<wbr>branch-register.patch<br>
@@ -0,0 +1,943 @@<br>
+From 3f1c39fb543884d36e759a6dc196a8<wbr>e914eb4f73 Mon Sep 17 00:00:00 2001<br>
+From: &quot;H.J. Lu&quot; &lt;<a href="mailto:hjl.tools@gmail.com" target="_blank">hjl.tools@gmail.com</a>&gt;<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 &quot;make check&quot;.<br>
+<br>
+gcc/<br>
+<br>
+       Backport from mainline<br>
+       2018-01-14  H.J. Lu  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<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  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<br>
+<br>
+       * gcc.target/i386/indirect-thunk<wbr>-1.c (dg-options): Add<br>
+       -mno-indirect-branch-<wbr>register.<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  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<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_<wbr>register.<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 &quot;ix86_indirect_branch_register<wbr>&quot;))<br>
+     (original condition before r256662))<br>
+<br>
+       Backport from mainline<br>
+       2018-01-15  H.J. Lu  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<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&#39;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&#39;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  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<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&#39;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&#39;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  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<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 &quot;Bs&quot;<br>
+   &quot;@internal Sibcall memory operand.&quot;<br>
+-  (ior (and (not (match_test &quot;TARGET_X32&quot;))<br>
++  (ior (and (not (match_test &quot;ix86_indirect_branch_register<wbr>&quot;))<br>
++          (not (match_test &quot;TARGET_X32&quot;))<br>
+           (match_operand 0 &quot;sibcall_memory_operand&quot;))<br>
+        (and (match_test &quot;TARGET_X32 &amp;&amp; Pmode == DImode&quot;)<br>
+           (match_operand 0 &quot;GOT_memory_operand&quot;))))<br>
+<br>
+ (define_constraint &quot;Bw&quot;<br>
+   &quot;@internal Call memory operand.&quot;<br>
+-  (ior (and (not (match_test &quot;TARGET_X32&quot;))<br>
++  (ior (and (not (match_test &quot;ix86_indirect_branch_register<wbr>&quot;))<br>
++          (not (match_test &quot;TARGET_X32&quot;))<br>
+           (match_operand 0 &quot;memory_operand&quot;))<br>
+        (and (match_test &quot;TARGET_X32 &amp;&amp; Pmode == DImode&quot;)<br>
+           (match_operand 0 &quot;GOT_memory_operand&quot;))))<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 &quot;indirect_branch_operand&quot;))]<br>
+   &quot;&quot;<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-&gt;machine-&gt;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-&gt;machine-&gt;has_local_indi<wbr>rect_jump = true;<br>
+ })<br>
+@@ -12048,7 +12048,7 @@<br>
+   [(call (mem:QI (match_operand:W 0 &quot;memory_operand&quot; &quot;m&quot;))<br>
+        (match_operand 1))<br>
+    (unspec [(const_int 0)] UNSPEC_PEEPSIB)]<br>
+-  &quot;!TARGET_X32&quot;<br>
++  &quot;!TARGET_X32 &amp;&amp; !ix86_indirect_branch_register<wbr>&quot;<br>
+   &quot;* return ix86_output_call_insn (insn, operands[0]);&quot;<br>
+   [(set_attr &quot;type&quot; &quot;call&quot;)])<br>
+<br>
+@@ -12057,7 +12057,9 @@<br>
+       (match_operand:W 1 &quot;memory_operand&quot;))<br>
+    (call (mem:QI (match_dup 0))<br>
+        (match_operand 3))]<br>
+-  &quot;!TARGET_X32 &amp;&amp; SIBLING_CALL_P (peep2_next_insn (1))<br>
++  &quot;!TARGET_X32<br>
++   &amp;&amp; !ix86_indirect_branch_register<br>
++   &amp;&amp; SIBLING_CALL_P (peep2_next_insn (1))<br>
+    &amp;&amp; !reg_mentioned_p (operands[0],<br>
+                       CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))&quot;<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>
+-  &quot;!TARGET_X32 &amp;&amp; SIBLING_CALL_P (peep2_next_insn (2))<br>
++  &quot;!TARGET_X32<br>
++   &amp;&amp; !ix86_indirect_branch_register<br>
++   &amp;&amp; SIBLING_CALL_P (peep2_next_insn (2))<br>
+    &amp;&amp; !reg_mentioned_p (operands[0],<br>
+                       CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))&quot;<br>
+   [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)<br>
+@@ -12092,7 +12096,7 @@<br>
+ })<br>
+<br>
+ (define_insn &quot;*call_pop&quot;<br>
+-  [(call (mem:QI (match_operand:SI 0 &quot;call_insn_operand&quot; &quot;lmBz&quot;))<br>
++  [(call (mem:QI (match_operand:SI 0 &quot;call_insn_operand&quot; &quot;lBwBz&quot;))<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 &quot;type&quot; &quot;call&quot;)])<br>
+<br>
+ (define_insn &quot;*sibcall_pop_memory&quot;<br>
+-  [(call (mem:QI (match_operand:SI 0 &quot;memory_operand&quot; &quot;m&quot;))<br>
++  [(call (mem:QI (match_operand:SI 0 &quot;memory_operand&quot; &quot;Bs&quot;))<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 &quot;register_operand&quot;)<br>
+         (match_operand:W 1 &quot;memory_operand&quot;))<br>
+    (set (pc) (match_dup 0))]<br>
+-  &quot;!TARGET_X32 &amp;&amp; peep2_reg_dead_p (2, operands[0])&quot;<br>
++  &quot;!TARGET_X32<br>
++   &amp;&amp; !ix86_indirect_branch_register<br>
++   &amp;&amp; peep2_reg_dead_p (2, operands[0])&quot;<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 &quot;memory_operand&quot; &quot;m&quot;))<br>
+             (match_operand 2)))<br>
+    (unspec [(const_int 0)] UNSPEC_PEEPSIB)]<br>
+-  &quot;!TARGET_X32&quot;<br>
++  &quot;!TARGET_X32 &amp;&amp; !ix86_indirect_branch_register<wbr>&quot;<br>
+   &quot;* return ix86_output_call_insn (insn, operands[1]);&quot;<br>
+   [(set_attr &quot;type&quot; &quot;callv&quot;)])<br>
+<br>
+@@ -12254,7 +12260,9 @@<br>
+    (set (match_operand 2)<br>
+    (call (mem:QI (match_dup 0))<br>
+                (match_operand 3)))]<br>
+-  &quot;!TARGET_X32 &amp;&amp; SIBLING_CALL_P (peep2_next_insn (1))<br>
++  &quot;!TARGET_X32<br>
++   &amp;&amp; !ix86_indirect_branch_register<br>
++   &amp;&amp; SIBLING_CALL_P (peep2_next_insn (1))<br>
+    &amp;&amp; !reg_mentioned_p (operands[0],<br>
+                       CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))&quot;<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>
+-  &quot;!TARGET_X32 &amp;&amp; SIBLING_CALL_P (peep2_next_insn (2))<br>
++  &quot;!TARGET_X32<br>
++   &amp;&amp; !ix86_indirect_branch_register<br>
++   &amp;&amp; SIBLING_CALL_P (peep2_next_insn (2))<br>
+    &amp;&amp; !reg_mentioned_p (operands[0],<br>
+                       CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))&quot;<br>
+   [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)<br>
+@@ -12294,7 +12304,7 @@<br>
+<br>
+ (define_insn &quot;*call_value_pop&quot;<br>
+   [(set (match_operand 0)<br>
+-      (call (mem:QI (match_operand:SI 1 &quot;call_insn_operand&quot; &quot;lmBz&quot;))<br>
++      (call (mem:QI (match_operand:SI 1 &quot;call_insn_operand&quot; &quot;lBwBz&quot;))<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 &quot;indirect_branch_operand&quot;<br>
+   (ior (match_operand 0 &quot;register_operand&quot;)<br>
+-       (and (not (match_test &quot;TARGET_X32&quot;))<br>
++       (and (not (match_test &quot;ix86_indirect_branch_register<wbr>&quot;))<br>
++          (not (match_test &quot;TARGET_X32&quot;))<br>
+           (match_operand 0 &quot;memory_operand&quot;))))<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 &quot;constant_call_address_operand<br>
+                    (op, mode == VOIDmode ? mode : Pmode)&quot;)<br>
+        (match_operand 0 &quot;call_register_no_elim_operand<wbr>&quot;)<br>
+-       (ior (and (not (match_test &quot;TARGET_X32&quot;))<br>
+-               (match_operand 0 &quot;memory_operand&quot;))<br>
+-          (and (match_test &quot;TARGET_X32 &amp;&amp; Pmode == DImode&quot;)<br>
+-               (match_operand 0 &quot;GOT_memory_operand&quot;)))))<br>
++       (and (not (match_test &quot;ix86_indirect_branch_register<wbr>&quot;))<br>
++          (ior (and (not (match_test &quot;TARGET_X32&quot;))<br>
++                    (match_operand 0 &quot;memory_operand&quot;))<br>
++               (and (match_test &quot;TARGET_X32 &amp;&amp; Pmode == DImode&quot;)<br>
++                    (match_operand 0 &quot;GOT_memory_operand&quot;))))))<br>
+<br>
+ ;; Similarly, but for tail calls, in which we cannot allow memory references.<br>
+ (define_special_predicate &quot;sibcall_insn_operand&quot;<br>
+   (ior (match_test &quot;constant_call_address_operand<br>
+                    (op, mode == VOIDmode ? mode : Pmode)&quot;)<br>
+        (match_operand 0 &quot;register_no_elim_operand&quot;)<br>
+-       (ior (and (not (match_test &quot;TARGET_X32&quot;))<br>
+-               (match_operand 0 &quot;sibcall_memory_operand&quot;))<br>
+-          (and (match_test &quot;TARGET_X32 &amp;&amp; Pmode == DImode&quot;)<br>
+-               (match_operand 0 &quot;GOT_memory_operand&quot;)))))<br>
++       (and (not (match_test &quot;ix86_indirect_branch_register<wbr>&quot;))<br>
++          (ior (and (not (match_test &quot;TARGET_X32&quot;))<br>
++                    (match_operand 0 &quot;sibcall_memory_operand&quot;))<br>
++               (and (match_test &quot;TARGET_X32 &amp;&amp; Pmode == DImode&quot;)<br>
++                    (match_operand 0 &quot;GOT_memory_operand&quot;))))))<br>
+<br>
+ ;; Return true if OP is a 32-bit GOT symbol operand.<br>
+ (define_predicate &quot;GOT32_symbol_operand&quot;<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk&quot; } */<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 &quot;-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic&quot; } */<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* &amp;&amp; { ! x32 } } } } */<br>
+-/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt&quot; } */<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* &amp;&amp; { ! x32 } } } } */<br>
+-/* { dg-options &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>&quot; } */<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 &quot;-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern<wbr>&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>&quot; } */<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 &quot;-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline<wbr>&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<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 &quot;-O2 -mindirect-branch=thunk -mindirect-branch-register -fno-pic&quot; } */<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 &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;mov\[ \t\](%eax|%rax), \\((%esp|%rsp)\\)&quot; } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler-not &quot;push(?:l|q)\[ \t\]*_?dispatch&quot;  } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;__x86_indirect_thunk\n&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;__x86_indirect_thunk_bnd\n&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk-inline -mindirect-branch-register -fno-pic&quot; } */<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 &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;mov\[ \t\](%eax|%rax), \\((%esp|%rsp)\\)&quot; } } */<br>
++/* { dg-final { scan-assembler {\tpause} } } */<br>
++/* { dg-final { scan-assembler-not &quot;push(?:l|q)\[ \t\]*_?dispatch&quot;  } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;__x86_indirect_thunk&quot; } } */<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 &quot;-O2 -mindirect-branch=thunk-extern -mindirect-branch-register -fno-pic&quot; } */<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 &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;push(?:l|q)\[ \t\]*_?dispatch&quot;  } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; } } */<br>
++/* { dg-final { scan-assembler-not {\t(pause|pause|nop)} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=thunk-extern -mindirect-branch=thunk -fno-pic&quot; } */<br>
++/* { dg-options &quot;-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&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic&quot; } */<br>
++/* { dg-options &quot;-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&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic&quot; } */<br>
+<br>
+ extern void (*bar) (void);<br>
+ extern int foo (void) __attribute__ ((function_return(&quot;thunk&quot;)));<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=keep -fno-pic&quot; } */<br>
++/* { dg-options &quot;-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&quot; } */<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 &quot;-O2 -mfunction-return=thunk -mindirect-branch=thunk -fno-pic&quot; } */<br>
++/* { dg-options &quot;-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk -mindirect-branch=thunk -fno-pic&quot; } */<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: &quot;H.J. Lu&quot; &lt;<a href="mailto:hjl.tools@gmail.com" target="_blank">hjl.tools@gmail.com</a>&gt;<br>
+Date: Sat, 6 Jan 2018 22:29:56 -0800<br>
+Subject: [PATCH 07/12] x86: Add &#39;V&#39; register operand modifier<br>
+<br>
+Add &#39;V&#39;, a special modifier which prints the name of the full integer<br>
+register without &#39;%&#39;.  For<br>
+<br>
+extern void (*func_p) (void);<br>
+<br>
+void<br>
+foo (void)<br>
+{<br>
+  asm (&quot;call __x86_indirect_thunk_%V0&quot; : : &quot;a&quot; (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  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<br>
+<br>
+       * config/i386/i386.c (print_reg): Print the name of the full<br>
+       integer register without &#39;%&#39;.<br>
+       (ix86_print_operand): Handle &#39;V&#39;.<br>
+        * doc/extend.texi: Document &#39;V&#39; modifier.<br>
+<br>
+gcc/testsuite/<br>
+<br>
+       Backport from mainline<br>
+       2018-01-14  H.J. Lu  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<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 &#39;h&#39;, pretend the reg is the &#39;high&#39; byte register.<br>
+    If CODE is &#39;y&#39;, print &quot;st(0)&quot; instead of &quot;st&quot;, if the reg is stack op.<br>
+    If CODE is &#39;d&#39;, duplicate the operand for AVX instruction.<br>
++   If CODE is &#39;V&#39;, 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 &amp;&amp; code != &#39;V&#39;)<br>
+     putc (&#39;%&#39;, file);<br>
+<br>
+   if (x == pc_rtx)<br>
+@@ -16922,6 +16923,14 @@ print_reg (rtx x, int code, FILE *file)<br>
+             &amp;&amp; regno != FPSR_REG<br>
+             &amp;&amp; regno != FPCR_REG);<br>
+<br>
++  if (code == &#39;V&#39;)<br>
++    {<br>
++      if (GENERAL_REGNO_P (regno))<br>
++      msize = GET_MODE_SIZE (word_mode);<br>
++      else<br>
++      error (&quot;&#39;V&#39; modifier on non-integer register&quot;);<br>
++    }<br>
++<br>
+   duplicated = code == &#39;d&#39; &amp;&amp; TARGET_AVX;<br>
+<br>
+   switch (msize)<br>
+@@ -17035,6 +17044,7 @@ print_reg (rtx x, int code, FILE *file)<br>
+    &amp; -- 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 &#39;cs&#39; or &#39;ds&#39; prefix<br>
+    ; -- print a semicolon (after prefixes due to bug in older gas).<br>
+    ~ -- print &quot;i&quot; if TARGET_AVX2, &quot;f&quot; otherwise.<br>
+@@ -17259,6 +17269,7 @@ ix86_print_operand (FILE *file, rtx x, int code)<br>
+       case &#39;X&#39;:<br>
+       case &#39;P&#39;:<br>
+       case &#39;p&#39;:<br>
++      case &#39;V&#39;:<br>
+         break;<br>
+<br>
+       case &#39;s&#39;:<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 &quot;-O2 -mindirect-branch=keep -fno-pic&quot; } */<br>
++<br>
++extern void (*func_p) (void);<br>
++<br>
++void<br>
++foo (void)<br>
++{<br>
++  asm(&quot;call __x86_indirect_thunk_%V0&quot; : : &quot;a&quot; (func_p));<br>
++}<br>
++<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_eax&quot; { target ia32 } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_rax&quot; { 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">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">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-<wbr>with-.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0008-x86-Disallow-mindir<wbr>ect-branch-mfunction-return-<wbr>with-.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-<wbr>with-.patch<br>
@@ -0,0 +1,301 @@<br>
+From 8e0d9bf93e2e2ec03c544572aef4b0<wbr>3a8e7090f3 Mon Sep 17 00:00:00 2001<br>
+From: &quot;H.J. Lu&quot; &lt;<a href="mailto:hjl.tools@gmail.com" target="_blank">hjl.tools@gmail.com</a>&gt;<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  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<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  &lt;<a href="mailto:hongjiu.lu@intel.com" target="_blank">hongjiu.lu@intel.com</a>&gt;<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-&gt;machine-&gt;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>
++        &amp;&amp; ((cfun-&gt;machine-&gt;indirect_bran<wbr>ch_type<br>
++             == indirect_branch_thunk_extern)<br>
++            || (cfun-&gt;machine-&gt;indirect_branc<wbr>h_type<br>
++                == indirect_branch_thunk)))<br>
++      error (&quot;%&lt;-mindirect-branch=%s%&gt; and %&lt;-mcmodel=large%&gt; are not &quot;<br>
++             &quot;compatible&quot;,<br>
++             ((cfun-&gt;machine-&gt;indirect_bra<wbr>nch_type<br>
++               == indirect_branch_thunk_extern)<br>
++              ? &quot;thunk-extern&quot; : &quot;thunk&quot;));<br>
+     }<br>
+<br>
+   if (cfun-&gt;machine-&gt;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-&gt;machine-&gt;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>
++        &amp;&amp; ((cfun-&gt;machine-&gt;function_retu<wbr>rn_type<br>
++             == indirect_branch_thunk_extern)<br>
++            || (cfun-&gt;machine-&gt;function_retur<wbr>n_type<br>
++                == indirect_branch_thunk)))<br>
++      error (&quot;%&lt;-mfunction-return=%s%&gt; and %&lt;-mcmodel=large%&gt; are not &quot;<br>
++             &quot;compatible&quot;,<br>
++             ((cfun-&gt;machine-&gt;function_ret<wbr>urn_type<br>
++               == indirect_branch_thunk_extern)<br>
++              ? &quot;thunk-extern&quot; : &quot;thunk&quot;));<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 &quot;-O2 -mindirect-branch=thunk-inline -mfunction-return=keep -mcmodel=large&quot; } */<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 &quot;-O2 -mindirect-branch=thunk -mfunction-return=keep -mcmodel=large&quot; } */<br>
++<br>
++void<br>
++bar (void)<br>
++{ /* { dg-error &quot;&#39;-mindirect-branch=thunk&#39; and &#39;-mcmodel=large&#39; are not compatible&quot; } */<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 &quot;-O2 -mindirect-branch=thunk-extern -mfunction-return=keep -mcmodel=large&quot; } */<br>
++<br>
++void<br>
++bar (void)<br>
++{ /* { dg-error &quot;&#39;-mindirect-branch=thunk-exte<wbr>rn&#39; and &#39;-mcmodel=large&#39; are not compatible&quot; } */<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 &quot;-O2 -mindirect-branch=keep -mfunction-return=keep -mcmodel=large&quot; } */<br>
++/* { dg-additional-options &quot;-fPIC&quot; { target fpic } } */<br>
++<br>
++__attribute__ ((indirect_branch(&quot;thunk-exter<wbr>n&quot;)))<br>
++void<br>
++bar (void)<br>
++{ /* { dg-error &quot;&#39;-mindirect-branch=thunk-exte<wbr>rn&#39; and &#39;-mcmodel=large&#39; are not compatible&quot; } */<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 &quot;-O2 -mindirect-branch=keep -mfunction-return=keep -mcmodel=large&quot; } */<br>
++/* { dg-additional-options &quot;-fPIC&quot; { target fpic } } */<br>
++<br>
++__attribute__ ((indirect_branch(&quot;thunk-inlin<wbr>e&quot;)))<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 &quot;-O2 -mindirect-branch=keep -mfunction-return=keep -mcmodel=large&quot; } */<br>
++/* { dg-additional-options &quot;-fPIC&quot; { target fpic } } */<br>
++<br>
++__attribute__ ((indirect_branch(&quot;thunk&quot;)))<br>
++void<br>
++bar (void)<br>
++{ /* { dg-error &quot;&#39;-mindirect-branch=thunk&#39; and &#39;-mcmodel=large&#39; are not compatible&quot; } */<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 &quot;-O2 -mfunction-return=thunk -mindirect-branch=keep -mcmodel=large&quot; } */<br>
++<br>
++void<br>
++bar (void)<br>
++{ /* { dg-error &quot;&#39;-mfunction-return=thunk&#39; and &#39;-mcmodel=large&#39; are not compatible&quot; } */<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 &quot;-O2 -mfunction-return=thunk-extern -mindirect-branch=keep -mcmodel=large&quot; } */<br>
++/* { dg-additional-options &quot;-fPIC&quot; { target fpic } } */<br>
++<br>
++void<br>
++bar (void)<br>
++{ /* { dg-error &quot;&#39;-mfunction-return=thunk-exte<wbr>rn&#39; and &#39;-mcmodel=large&#39; are not compatible&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=keep -mcmodel=large&quot; } */<br>
++<br>
++__attribute__ ((function_return(&quot;thunk&quot;)))<br>
++void<br>
++bar (void)<br>
++{ /* { dg-error &quot;&#39;-mfunction-return=thunk&#39; and &#39;-mcmodel=large&#39; are not compatible&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=keep -mcmodel=large&quot; } */<br>
++/* { dg-additional-options &quot;-fPIC&quot; { target fpic } } */<br>
++<br>
++__attribute__ ((function_return(&quot;thunk-exter<wbr>n&quot;)))<br>
++void<br>
++bar (void)<br>
++{ /* { dg-error &quot;&#39;-mfunction-return=thunk-exte<wbr>rn&#39; and &#39;-mcmodel=large&#39; are not compatible&quot; } */<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 &quot;-O2 -mfunction-return=keep -mindirect-branch=keep -mcmodel=large&quot; } */<br>
++/* { dg-additional-options &quot;-fPIC&quot; { target fpic } } */<br>
++<br>
++__attribute__ ((function_return(&quot;thunk-inlin<wbr>e&quot;)))<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.<wbr>patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0009-Use-INVALID_REGNUM-<wbr>in-indirect-thunk-processing.<wbr>patch<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.<wbr>patch<br>
@@ -0,0 +1,123 @@<br>
+From 3eff2adada2b1667b0e76496fa559e<wbr>0c248ecd84 Mon Sep 17 00:00:00 2001<br>
+From: uros &lt;uros@138bc75d-0d04-0410-961f-<wbr>82ee72b054a4&gt;<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  &lt;<a href="mailto:ubizjak@gmail.com" target="_blank">ubizjak@gmail.com</a>&gt;<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 &gt;= 0 &amp;&amp; ret_p)<br>
++  if (regno != INVALID_REGNUM &amp;&amp; ret_p)<br>
+     gcc_unreachable ();<br>
+<br>
+   if (USE_HIDDEN_LINKONCE)<br>
+     {<br>
+       const char *bnd = need_bnd_p ? &quot;_bnd&quot; : &quot;&quot;;<br>
+-      if (regno &gt;= 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 &gt;= 0)<br>
++      if (regno != INVALID_REGNUM)<br>
+       {<br>
+         if (need_bnd_p)<br>
+           ASM_GENERATE_INTERNAL_LABEL (name, &quot;LITBR&quot;, 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 &gt;= 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 &lt; 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 &lt;= 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 &amp; (1 &lt;&lt; i)))<br>
+       output_indirect_thunk_<wbr>function (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-<wbr>directories.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0010-gcc-poison-system-<wbr>directories.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_<wbr>REGNUM-as-invalid-register-<wbr>number.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0010-i386-Pass-INVALID_<wbr>REGNUM-as-invalid-register-<wbr>number.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_<wbr>REGNUM-as-invalid-register-<wbr>number.patch<br>
@@ -0,0 +1,43 @@<br>
+From c4300d9ad683e693c90d02d4f1b131<wbr>83bf2d4acc Mon Sep 17 00:00:00 2001<br>
+From: hjl &lt;hjl@138bc75d-0d04-0410-961f-8<wbr>2ee72b054a4&gt;<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-&gt;machine-&gt;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 &quot;&quot;;<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 &lt;hjl@138bc75d-0d04-0410-961f-8<wbr>2ee72b054a4&gt;<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_<wbr>pop_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_<wbr>pop_internal): Likewise.<br>
+       * config/i386/<a href="http://i386.md" rel="noreferrer" target="_blank">i386.md</a> (*indirect_jump): Don&#39;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_<wbr>function_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 &quot;LIND&quot;<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 &amp;&amp; ret_p)<br>
++  if (regno != INVALID_REGNUM &amp;&amp; regno != CX_REG &amp;&amp; ret_p)<br>
+     gcc_unreachable ();<br>
+<br>
+   if (USE_HIDDEN_LINKONCE)<br>
+     {<br>
+       const char *bnd = need_bnd_p ? &quot;_bnd&quot; : &quot;&quot;;<br>
++      const char *ret = ret_p ? &quot;return&quot; : &quot;indirect&quot;;<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 ? &quot;r&quot; : &quot;e&quot;;<br>
+         else<br>
+           reg_prefix = &quot;&quot;;<br>
+-        sprintf (name, &quot;__x86_indirect_thunk%s_%s%s&quot;,<br>
+-                 bnd, reg_prefix, reg_names[regno]);<br>
++        sprintf (name, &quot;__x86_%s_thunk%s_%s%s&quot;,<br>
++                 ret, bnd, reg_prefix, reg_names[regno]);<br>
+       }<br>
+       else<br>
+-      {<br>
+-        const char *ret = ret_p ? &quot;return&quot; : &quot;indirect&quot;;<br>
+-        sprintf (name, &quot;__x86_%s_thunk%s&quot;, ret, bnd);<br>
+-      }<br>
++      sprintf (name, &quot;__x86_%s_thunk%s&quot;, 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-&gt;machine-&gt;indirect_branc<wbr>h_type != indirect_branch_keep)<br>
+     {<br>
+-      /* We can&#39;t have red-zone if this isn&#39;t a function return since<br>
+-       &quot;call&quot; in the indirect thunk pushes the return address onto<br>
+-       stack, destroying red-zone.  */<br>
+-      if (!ret_p &amp;&amp; ix86_red_zone_size != 0)<br>
++      /* We can&#39;t have red-zone since &quot;call&quot; 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, &quot;%0&quot;, true);<br>
+@@ -28081,6 +28098,86 @@ ix86_output_function_return (bool long_p)<br>
+   return &quot;rep%; ret&quot;;<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-&gt;machine-&gt;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-&gt;machine-&gt;function_retur<wbr>n_type<br>
++        != indirect_branch_thunk_inline)<br>
++      {<br>
++        bool need_thunk = (cfun-&gt;machine-&gt;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 &lt;&lt; CX_REG;<br>
++              }<br>
++            fprintf (asm_out_file, &quot;\tbnd jmp\t%s\n&quot;, thunk_name);<br>
++          }<br>
++        else<br>
++          {<br>
++            if (need_thunk)<br>
++              {<br>
++                indirect_return_via_cx = true;<br>
++                indirect_thunks_used |= 1 &lt;&lt; CX_REG;<br>
++              }<br>
++            fprintf (asm_out_file, &quot;\tjmp\t%s\n&quot;, thunk_name);<br>
++          }<br>
++      }<br>
++      else<br>
++      output_indirect_thunk (need_bnd_p, regno);<br>
++<br>
++      return &quot;&quot;;<br>
++    }<br>
++  else<br>
++    return &quot;%!jmp\t%A0&quot;;<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-&gt;machine;<br>
++  rtx ecx = gen_rtx_REG (SImode, CX_REG);<br>
++  rtx_insn *insn;<br>
++<br>
++  /* There is no &quot;pascal&quot; calling convention in any 64bit ABI.  */<br>
++  gcc_assert (!TARGET_64BIT);<br>
++<br>
++  insn = emit_insn (gen_pop (ecx));<br>
++  m-&gt;fs.cfa_offset -= UNITS_PER_WORD;<br>
++  m-&gt;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 &quot;*indirect_jump&quot;<br>
+   [(set (pc) (match_operand:W 0 &quot;indirect_branch_operand&quot; &quot;rBw&quot;))]<br>
+   &quot;&quot;<br>
+-  &quot;* return ix86_output_indirect_jmp (operands[0], false);&quot;<br>
++  &quot;* return ix86_output_indirect_jmp (operands[0]);&quot;<br>
+   [(set (attr &quot;type&quot;)<br>
+      (if_then_else (match_test &quot;(cfun-&gt;machine-&gt;indirect_bran<wbr>ch_type<br>
+                                != indirect_branch_keep)&quot;)<br>
+@@ -11868,7 +11868,7 @@<br>
+   [(set (pc) (match_operand:W 0 &quot;indirect_branch_operand&quot; &quot;rBw&quot;))<br>
+    (use (label_ref (match_operand 1)))]<br>
+   &quot;&quot;<br>
+-  &quot;* return ix86_output_indirect_jmp (operands[0], false);&quot;<br>
++  &quot;* return ix86_output_indirect_jmp (operands[0]);&quot;<br>
+   [(set (attr &quot;type&quot;)<br>
+      (if_then_else (match_test &quot;(cfun-&gt;machine-&gt;indirect_bran<wbr>ch_type<br>
+                                != indirect_branch_keep)&quot;)<br>
+@@ -12520,11 +12520,14 @@<br>
+    (set_attr &quot;prefix_rep&quot; &quot;1&quot;)<br>
+    (set_attr &quot;modrm&quot; &quot;0&quot;)])<br>
+<br>
+-(define_insn &quot;simple_return_pop_internal&quot;<br>
++(define_insn_and_split &quot;simple_return_pop_internal&quot;<br>
+   [(simple_return)<br>
+    (use (match_operand:SI 0 &quot;const_int_operand&quot;))]<br>
+   &quot;reload_completed&quot;<br>
+   &quot;%!ret\t%0&quot;<br>
++  &quot;&amp;&amp; cfun-&gt;machine-&gt;function_return<wbr>_type != indirect_branch_keep&quot;<br>
++  [(const_int 0)]<br>
++  &quot;ix86_split_simple_return_pop_<wbr>internal (operands[0]); DONE;&quot;<br>
+   [(set_attr &quot;length&quot; &quot;3&quot;)<br>
+    (set_attr &quot;atom_unit&quot; &quot;jeu&quot;)<br>
+    (set_attr &quot;length_immediate&quot; &quot;2&quot;)<br>
+@@ -12535,7 +12538,7 @@<br>
+   [(simple_return)<br>
+    (use (match_operand:SI 0 &quot;register_operand&quot; &quot;r&quot;))]<br>
+   &quot;reload_completed&quot;<br>
+-  &quot;* return ix86_output_indirect_jmp (operands[0], true);&quot;<br>
++  &quot;* return ix86_output_indirect_function_<wbr>return (operands[0]);&quot;<br>
+   [(set (attr &quot;type&quot;)<br>
+      (if_then_else (match_test &quot;(cfun-&gt;machine-&gt;indirect_bran<wbr>ch_type<br>
+                                != indirect_branch_keep)&quot;)<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 &quot;-O2 -mfunction-return=thunk&quot; } */<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 &quot;popl\[\\t \]*%ecx&quot; 1 } } */<br>
++/* { dg-final { scan-assembler &quot;lea\[l\]?\[\\t \]*4\\(%esp\\), %esp&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_return_thunk_ecx&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mfunction-return=thunk-extern<wbr>&quot; } */<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 &quot;popl\[\\t \]*%ecx&quot; 1 } } */<br>
++/* { dg-final { scan-assembler &quot;lea\[l\]?\[\\t \]*4\\(%esp\\), %esp&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_return_thunk_ecx&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mfunction-return=thunk-inline<wbr>&quot; } */<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 &quot;popl\[\\t \]*%ecx&quot; 1 } } */<br>
++/* { dg-final { scan-assembler &quot;lea\[l\]?\[\\t \]*4\\(%esp\\), %esp&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*__x86_return_thunk_ecx&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-O2 -mfunction-return=thunk -fcheck-pointer-bounds -mmpx -fno-pic&quot; } */<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 &quot;popl\[\\t \]*%ecx&quot; 1 } } */<br>
++/* { dg-final { scan-assembler &quot;lea\[l\]?\[\\t \]*4\\(%esp\\), %esp&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_return_thunk_bnd_ec<wbr>x&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;-Os -mfunction-return=thunk&quot; } */<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 &lt; 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 &lt; 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_<wbr>CFLAGS_FOR_TARGET.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0012-gcc-4.3.3-SYSROOT_<wbr>CFLAGS_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 &lt;hjl@138bc75d-0d04-0410-961f-8<wbr>2ee72b054a4&gt;<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-&gt;f();<br>
+  p-&gt;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 &quot;-mindirect-branch=thunk-exter<wbr>n&quot; is equivalent to<br>
+&quot;-mindirect-branch=thunk-exte<wbr>rn -mindirect-branch-register&quot;, 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 &quot;Bs&quot;<br>
+   &quot;@internal Sibcall memory operand.&quot;<br>
+-  (ior (and (not (match_test &quot;ix86_indirect_branch_register<wbr>&quot;))<br>
++  (ior (and (not (match_test &quot;TARGET_INDIRECT_BRANCH_REGIST<wbr>ER&quot;))<br>
+           (not (match_test &quot;TARGET_X32&quot;))<br>
+           (match_operand 0 &quot;sibcall_memory_operand&quot;))<br>
+        (and (match_test &quot;TARGET_X32 &amp;&amp; Pmode == DImode&quot;)<br>
+@@ -180,7 +180,7 @@<br>
+<br>
+ (define_constraint &quot;Bw&quot;<br>
+   &quot;@internal Call memory operand.&quot;<br>
+-  (ior (and (not (match_test &quot;ix86_indirect_branch_register<wbr>&quot;))<br>
++  (ior (and (not (match_test &quot;TARGET_INDIRECT_BRANCH_REGIST<wbr>ER&quot;))<br>
+           (not (match_test &quot;TARGET_X32&quot;))<br>
+           (match_operand 0 &quot;memory_operand&quot;))<br>
+        (and (match_test &quot;TARGET_X32 &amp;&amp; Pmode == DImode&quot;)<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 &amp; RECIP_MASK_VEC_DIV) != 0)<br>
+ #define TARGET_RECIP_VEC_SQRT ((recip_mask &amp; RECIP_MASK_VEC_SQRT) != 0)<br>
+<br>
++<br>
++#define TARGET_INDIRECT_BRANCH_REGISTE<wbr>R \<br>
++  (ix86_indirect_branch_register \<br>
++   || cfun-&gt;machine-&gt;indirect_branch<wbr>_type != indirect_branch_keep)<br>
++<br>
+ #define IX86_HLE_ACQUIRE (1 &lt;&lt; 16)<br>
+ #define IX86_HLE_RELEASE (1 &lt;&lt; 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 &quot;indirect_branch_operand&quot;))]<br>
+   &quot;&quot;<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-&gt;machine-&gt;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-&gt;machine-&gt;has_local_indi<wbr>rect_jump = true;<br>
+ })<br>
+@@ -12029,7 +12029,10 @@<br>
+                    (match_operand:SI 0 &quot;register_no_elim_operand&quot; &quot;U&quot;)<br>
+                    (match_operand:SI 1 &quot;GOT32_symbol_operand&quot;))))<br>
+        (match_operand 2))]<br>
+-  &quot;!TARGET_MACHO &amp;&amp; !TARGET_64BIT &amp;&amp; SIBLING_CALL_P (insn)&quot;<br>
++  &quot;!TARGET_MACHO<br>
++  &amp;&amp; !TARGET_64BIT<br>
++  &amp;&amp; !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER<br>
++  &amp;&amp; SIBLING_CALL_P (insn)&quot;<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 &quot;memory_operand&quot; &quot;m&quot;))<br>
+        (match_operand 1))<br>
+    (unspec [(const_int 0)] UNSPEC_PEEPSIB)]<br>
+-  &quot;!TARGET_X32 &amp;&amp; !ix86_indirect_branch_register<wbr>&quot;<br>
++  &quot;!TARGET_X32 &amp;&amp; !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER&quot;<br>
+   &quot;* return ix86_output_call_insn (insn, operands[0]);&quot;<br>
+   [(set_attr &quot;type&quot; &quot;call&quot;)])<br>
+<br>
+@@ -12058,7 +12061,7 @@<br>
+    (call (mem:QI (match_dup 0))<br>
+        (match_operand 3))]<br>
+   &quot;!TARGET_X32<br>
+-   &amp;&amp; !ix86_indirect_branch_register<br>
++   &amp;&amp; !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER<br>
+    &amp;&amp; SIBLING_CALL_P (peep2_next_insn (1))<br>
+    &amp;&amp; !reg_mentioned_p (operands[0],<br>
+                       CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))&quot;<br>
+@@ -12073,7 +12076,7 @@<br>
+    (call (mem:QI (match_dup 0))<br>
+        (match_operand 3))]<br>
+   &quot;!TARGET_X32<br>
+-   &amp;&amp; !ix86_indirect_branch_register<br>
++   &amp;&amp; !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER<br>
+    &amp;&amp; SIBLING_CALL_P (peep2_next_insn (2))<br>
+    &amp;&amp; !reg_mentioned_p (operands[0],<br>
+                       CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))&quot;<br>
+@@ -12171,7 +12174,7 @@<br>
+         (match_operand:W 1 &quot;memory_operand&quot;))<br>
+    (set (pc) (match_dup 0))]<br>
+   &quot;!TARGET_X32<br>
+-   &amp;&amp; !ix86_indirect_branch_register<br>
++   &amp;&amp; !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER<br>
+    &amp;&amp; peep2_reg_dead_p (2, operands[0])&quot;<br>
+   [(set (pc) (match_dup 1))])<br>
+<br>
+@@ -12229,7 +12232,10 @@<br>
+                         (match_operand:SI 1 &quot;register_no_elim_operand&quot; &quot;U&quot;)<br>
+                         (match_operand:SI 2 &quot;GOT32_symbol_operand&quot;))))<br>
+        (match_operand 3)))]<br>
+-  &quot;!TARGET_MACHO &amp;&amp; !TARGET_64BIT &amp;&amp; SIBLING_CALL_P (insn)&quot;<br>
++  &quot;!TARGET_MACHO<br>
++   &amp;&amp; !TARGET_64BIT<br>
++   &amp;&amp; !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER<br>
++   &amp;&amp; SIBLING_CALL_P (insn)&quot;<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 &quot;memory_operand&quot; &quot;m&quot;))<br>
+             (match_operand 2)))<br>
+    (unspec [(const_int 0)] UNSPEC_PEEPSIB)]<br>
+-  &quot;!TARGET_X32 &amp;&amp; !ix86_indirect_branch_register<wbr>&quot;<br>
++  &quot;!TARGET_X32 &amp;&amp; !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER&quot;<br>
+   &quot;* return ix86_output_call_insn (insn, operands[1]);&quot;<br>
+   [(set_attr &quot;type&quot; &quot;callv&quot;)])<br>
+<br>
+@@ -12261,7 +12267,7 @@<br>
+    (call (mem:QI (match_dup 0))<br>
+                (match_operand 3)))]<br>
+   &quot;!TARGET_X32<br>
+-   &amp;&amp; !ix86_indirect_branch_register<br>
++   &amp;&amp; !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER<br>
+    &amp;&amp; SIBLING_CALL_P (peep2_next_insn (1))<br>
+    &amp;&amp; !reg_mentioned_p (operands[0],<br>
+                       CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))&quot;<br>
+@@ -12278,7 +12284,7 @@<br>
+       (call (mem:QI (match_dup 0))<br>
+             (match_operand 3)))]<br>
+   &quot;!TARGET_X32<br>
+-   &amp;&amp; !ix86_indirect_branch_register<br>
++   &amp;&amp; !TARGET_INDIRECT_BRANCH_REGIST<wbr>ER<br>
+    &amp;&amp; SIBLING_CALL_P (peep2_next_insn (2))<br>
+    &amp;&amp; !reg_mentioned_p (operands[0],<br>
+                       CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))&quot;<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 &quot;indirect_branch_operand&quot;<br>
+   (ior (match_operand 0 &quot;register_operand&quot;)<br>
+-       (and (not (match_test &quot;ix86_indirect_branch_register<wbr>&quot;))<br>
++       (and (not (match_test &quot;TARGET_INDIRECT_BRANCH_REGIST<wbr>ER&quot;))<br>
+           (not (match_test &quot;TARGET_X32&quot;))<br>
+           (match_operand 0 &quot;memory_operand&quot;))))<br>
+<br>
+@@ -637,7 +637,7 @@<br>
+   (ior (match_test &quot;constant_call_address_operand<br>
+                    (op, mode == VOIDmode ? mode : Pmode)&quot;)<br>
+        (match_operand 0 &quot;call_register_no_elim_operand<wbr>&quot;)<br>
+-       (and (not (match_test &quot;ix86_indirect_branch_register<wbr>&quot;))<br>
++       (and (not (match_test &quot;TARGET_INDIRECT_BRANCH_REGIST<wbr>ER&quot;))<br>
+           (ior (and (not (match_test &quot;TARGET_X32&quot;))<br>
+                     (match_operand 0 &quot;memory_operand&quot;))<br>
+                (and (match_test &quot;TARGET_X32 &amp;&amp; Pmode == DImode&quot;)<br>
+@@ -648,7 +648,7 @@<br>
+   (ior (match_test &quot;constant_call_address_operand<br>
+                    (op, mode == VOIDmode ? mode : Pmode)&quot;)<br>
+        (match_operand 0 &quot;register_no_elim_operand&quot;)<br>
+-       (and (not (match_test &quot;ix86_indirect_branch_register<wbr>&quot;))<br>
++       (and (not (match_test &quot;TARGET_INDIRECT_BRANCH_REGIST<wbr>ER&quot;))<br>
+           (ior (and (not (match_test &quot;TARGET_X32&quot;))<br>
+                     (match_operand 0 &quot;sibcall_memory_operand&quot;))<br>
+                (and (match_test &quot;TARGET_X32 &amp;&amp; Pmode == DImode&quot;)<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*bar@GOT&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; } } */<br>
+-/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 } } */<br>
+-/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 2 } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 { target x32 } } } */<br>
++/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 2 { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*bar@GOT&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 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 &quot;push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 } } */<br>
+ /* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 2 } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+ /* { dg-final { scan-assembler {\tlfence} } } */<br>
+ /* { dg-final { scan-assembler-not &quot;__x86_indirect_thunk&quot; } } */<br>
+-/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { 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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 } } */<br>
+ /* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 2 } } */<br>
+ /* { dg-final { scan-assembler {\tpause} } } */<br>
+ /* { dg-final { scan-assembler {\tlfence} } } */<br>
+ /* { dg-final { scan-assembler-not &quot;__x86_indirect_thunk&quot; } } */<br>
+-/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { 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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+ /* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;pushq\[ \t\]%rax&quot; { target x32 } } } */<br>
+-/* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*__x86_indirect_thunk_bnd&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*__x86_indirect_thunk_bnd_<wbr>rax&quot; { target lp64 } } } */<br>
++/* { dg-final { scan-assembler &quot;bnd call\[ \t\]*__x86_indirect_thunk_bnd_<wbr>eax&quot; { target ia32 } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;bnd call\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;bnd ret&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;pushq\[ \t\]%rax&quot; { target x32 } } } */<br>
+-/* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*__x86_indirect_thunk_bnd&quot; } } */<br>
+-/* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;bnd call\[ \t\]*__x86_indirect_thunk_bnd_<wbr>(r|e)ax&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;bnd call\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;bnd ret&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
+-/* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*__x86_indirect_thunk_bnd&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*__x86_indirect_thunk_bnd_<wbr>rax&quot; { target lp64 } } } */<br>
++/* { dg-final { scan-assembler &quot;bnd call\[ \t\]*__x86_indirect_thunk_bnd_<wbr>eax&quot; { target ia32 } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;bnd call\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;bnd ret&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
+-/* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*__x86_indirect_thunk&quot; } } */<br>
+-/* { dg-final { scan-assembler &quot;bnd jmp\[ \t\]*\.LIND&quot; } } */<br>
+-/* { dg-final { scan-assembler-times &quot;bnd call\[ \t\]*\.LIND&quot; 2 } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;bnd call\[ \t\]*__x86_indirect_thunk_bnd_<wbr>(r|e)ax&quot; } } */<br>
++/* { dg-final { scan-assembler-times &quot;bnd call\[ \t\]*\.LIND&quot; 1 } } */<br>
+ /* { dg-final { scan-assembler &quot;bnd ret&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+ /* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+ /* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
++/* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 1 { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*bar@GOT&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+ /* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
+-/* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 1 } } */<br>
+-/* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 1 } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*bar@GOT&quot; { target { ! x32 } } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { 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 &quot;push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
+ /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */<br>
+ /* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler-not &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 } } */<br>
+ /* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 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 &quot;push(?:l|q)\[ \t\]*_?dispatch&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?dispatch&quot; { target *-*-linux* } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 } } */<br>
+ /* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 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 &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*bar@GOT&quot; { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*bar@GOT&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*bar@GOT&quot; { target { ! x32 } } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 2 } } */<br>
+ /* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 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 &quot;push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%(r|e)ax&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<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 &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<br>
+ /* { dg-final { scan-assembler-times {\tpause} 2 } } */<br>
+ /* { dg-final { scan-assembler-times {\tlfence} 2 } } */<br>
+-/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?bar&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } }  } } */<br>
+-/* { dg-final { scan-assembler &quot;__x86_indirect_thunk:&quot; { target { ! x32 } }  } } */<br>
+-/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target { x32 } }  } } */<br>
+-/* { dg-final { scan-assembler &quot;__x86_indirect_thunk_(r|e)ax:<wbr>&quot; { target { x32 } }  } } */<br>
+-/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;__x86_indirect_thunk_(r|e)ax:<wbr>&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; } } */<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 &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
+-/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?bar&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;__x86_indirect_thunk:&quot; { target { ! x32 } }  } } */<br>
+-/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target { x32 } }  } } */<br>
+-/* { dg-final { scan-assembler &quot;__x86_indirect_thunk_(r|e)ax:<wbr>&quot; { target { x32 } }  } } */<br>
+-/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;__x86_indirect_thunk_(r|e)ax:<wbr>&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; } } */<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 &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;__x86_indirect_thunk:&quot; { target { ! x32 } }  } } */<br>
+-/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target { x32 } }  } } */<br>
+-/* { dg-final { scan-assembler &quot;__x86_indirect_thunk_(r|e)ax:<wbr>&quot; { target { x32 } }  } } */<br>
+-/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
++/* { dg-final { scan-assembler &quot;__x86_indirect_thunk_(r|e)ax:<wbr>&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; } } */<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 &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<br>
+ /* { dg-final { scan-assembler-times {\tpause} 2 } } */<br>
+ /* { dg-final { scan-assembler-times {\tlfence} 2 } } */<br>
+-/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?bar&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+ /* { dg-final { scan-assembler-times &quot;jmp\[ \t\]*\.LIND&quot; 3 } } */<br>
+ /* { dg-final { scan-assembler-times &quot;call\[ \t\]*\.LIND&quot; 3 } } */<br>
+ /* { dg-final { scan-assembler-not &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; } } */<br>
+-/* { dg-final { scan-assembler-not &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target { x32 } }  } } */<br>
+-/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler-not &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; } } */<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 &quot;jmp\[ \t\]*__x86_return_thunk&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
+-/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?bar&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target { x32 } }  } } */<br>
+-/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?bar&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; } } */<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 &quot;call\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler-times {\tpause} 1 } } */<br>
+ /* { dg-final { scan-assembler-times {\tlfence} 1 } } */<br>
+-/* { dg-final { scan-assembler &quot;push(?:l|q)\[ \t\]*_?bar&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { target { ! x32 } } } } */<br>
+-/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target x32 } } } */<br>
+-/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?bar&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; } } */<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 &quot;jmp\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;call\[ \t\]*\.LIND&quot; } } */<br>
+ /* { dg-final { scan-assembler &quot;__x86_indirect_thunk:&quot; } } */<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 &quot;push(?:l|q)\[ \t\]*_?bar&quot; { target { { ! x32 } &amp;&amp; *-*-linux* } } } } */<br>
+-/* { dg-final { scan-assembler &quot;jmp\[ \t\]*__x86_indirect_thunk&quot; { 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 &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; { target { x32 } } } } */<br>
+-/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; { target x32 } } } */<br>
++/* { dg-final { scan-assembler &quot;mov(?:l|q)\[ \t\]*_?bar&quot; { target *-*-linux* } } } */<br>
++/* { dg-final { scan-assembler-times {\tpause} 2 } } */<br>
++/* { dg-final { scan-assembler-times {\tlfence} 2 } } */<br>
++/* { dg-final { scan-assembler &quot;call\[ \t\]*__x86_indirect_thunk_(r|e<wbr>)ax&quot; } } */<br>
++/* { dg-final { scan-assembler-not &quot;pushq\[ \t\]%rax&quot; } } */<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">0014-optional-libstdc.pa</a><wbr>tch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/<a href="http://0014-optional-libstdc.pa">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.<wbr>patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0019-cpp-honor-sysroot.<wbr>patch<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-<wbr>N64-ABI.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0020-MIPS64-Default-to-<wbr>N64-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_<wbr>LINKE.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0021-Define-GLIBC_DYNAMI<wbr>C_LINKER-and-UCLIBC_DYNAMIC_<wbr>LINKE.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.<wbr>patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0025-gcc-armv4-pass-fix-v4<wbr>bx-to-linker-to-support-EABI.<wbr>patch<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-<wbr>usin.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0026-Use-the-multilib-co<wbr>nfig-files-from-B-instead-of-<wbr>usin.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-<wbr>usin.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0026-Use-the-multilib-conf<wbr>ig-files-from-B-instead-of-<wbr>usin.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-<wbr>target.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0029-Enable-SPE-AltiVec-<wbr>generation-on-powepc-linux-<wbr>target.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-<wbr>headers-can-be-included.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0031-Ensure-target-gcc-<wbr>headers-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-<wbr>directory-during-relink-if-<wbr>inst_pr.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0033-Don-t-search-host-<wbr>directory-during-relink-if-<wbr>inst_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_<wbr>pr.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0033-Don-t-search-host-dir<wbr>ectory-during-relink-if-inst_<wbr>pr.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-<wbr>s-install-path-and-rpath.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0036-libcc1-fix-libcc1-<wbr>s-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-<wbr>with.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0038-Search-target-sysro<wbr>ot-gcc-version-specific-dirs-<wbr>with.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-<wbr>with.patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0038-Search-target-sysroot<wbr>-gcc-version-specific-dirs-<wbr>with.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_<wbr>DYNAMIC_LINKER.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0040-nios2-Define-MUSL_<wbr>DYNAMIC_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-<wbr>to-link-commandline-for-musl-<wbr>targe.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0041-Add-ssp_nonshared-<wbr>to-link-commandline-for-musl-<wbr>targe.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-<wbr>map.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0043-Reuse-fdebug-prefix<wbr>-map-to-replace-ffile-prefix-<wbr>map.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-<wbr>sourc.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0044-gcc-final.c-fdebug-<wbr>prefix-map-support-to-remap-<wbr>sourc.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-<wbr>LDFLAGS-not-just-SHLIB_LDFLAGS<wbr>.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0046-Link-libgcc-using-<wbr>LDFLAGS-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.<wbr>patch<br>
rename to meta/recipes-devtools/gcc/gcc-<wbr>6.4/0046-Link-libgcc-using-LDF<wbr>LAGS-not-just-SHLIB_LDFLAGS.<wbr>patch<br>
diff --git a/meta/recipes-devtools/gcc/gc<wbr>c-6.3/0047-libgcc_s-Use-alias-<wbr>for-__cpu_indicator_init-<wbr>instead-.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0047-libgcc_s-Use-alias-<wbr>for-__cpu_indicator_init-<wbr>instead-.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-<wbr>with-musl.patch b/meta/recipes-devtools/gcc/gc<wbr>c-6.4/0048-sync-gcc-stddef.h-<wbr>with-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">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">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  &lt;<a href="mailto:boehme.marcel@gmail.com" target="_blank">boehme.marcel@gmail.com</a>&gt;<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"><br>
<span class="m_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></blockquote></div><br></div>
</blockquote></div><br></div>