From 3eb693602be9a059bfa02fee66fb2d04894e58c1 Mon Sep 17 00:00:00 2001 From: Matteo Bernardini Date: Wed, 18 Jul 2018 17:28:12 +0200 Subject: 20180718.1 global branch merge. Happy 25th anniversary, Slackware! Signed-off-by: Matteo Bernardini --- development/ChezScheme/ChezScheme.SlackBuild | 1 + development/Coin/Coin.SlackBuild | 3 + development/Coin/memhandler-initialization.patch | 20 + development/FreeBASIC/FreeBASIC.SlackBuild | 7 +- development/MySQL-python/MySQL-python.SlackBuild | 2 +- development/SDL2_gfx/README | 3 - development/SDL2_gfx/SDL2_gfx.SlackBuild | 99 -- development/SDL2_gfx/SDL2_gfx.info | 10 - development/SDL2_gfx/slack-desc | 19 - development/acpica/acpica.SlackBuild | 4 +- development/acpica/acpica.info | 6 +- development/anjuta/anjuta.SlackBuild | 2 +- .../apache-log4cxx/apache-log4cxx.SlackBuild | 1 + .../apache-log4cxx/narrowing-fixes.patch.gz | Bin 0 -> 1631 bytes development/autogen/autogen.SlackBuild | 5 + development/autogen/guile-2.2.patch | 78 + development/avr-binutils/avr-binutils.SlackBuild | 2 +- development/avr-binutils/avr-binutils.info | 6 +- development/avr-gcc/Revert-eeb6872bf.patch | 82 + development/avr-gcc/avr-gcc.SlackBuild | 14 +- development/avr-gcc/avr-gcc.info | 6 +- development/docutils/README | 6 - development/docutils/docutils.SlackBuild | 71 - development/docutils/docutils.info | 10 - development/docutils/slack-desc | 19 - development/gcc5/README | 46 + development/gcc5/c89.sh | 11 + development/gcc5/c99.sh | 11 + development/gcc5/ecj.sh | 5 + .../1000-fastjar-0.97-segfault.patch | 29 + .../fastjar-patches/1001-fastjar-0.97-len1.patch | 16 + .../1002-fastjar-0.97-filename0.patch | 14 + .../1003-fastjar-CVE-2010-0831.patch | 102 ++ .../gcc5/fastjar-patches/1004-fastjar-man.patch | 27 + development/gcc5/gcc5.SlackBuild | 565 ++++++ development/gcc5/gcc5.info | 17 + development/gcc5/libgcj-5.pc | 10 + ...Move-struct-ix86_frame-to-machine_function.diff | 239 +++ ...eference-of-struct-ix86_frame-to-avoid-cop.diff | 72 + ...use-reference-of-struct-ix86_frame-to-avoi.diff | 59 + ...6-Don-t-use-reference-of-struct-ix86_frame.diff | 63 + .../patches/0005-x86-Add-mindirect-branch-doc.diff | 279 +++ .../patches/0005-x86-Add-mindirect-branch.diff | 1870 ++++++++++++++++++++ .../patches/0006-x86-Add-mfunction-return-doc.diff | 300 ++++ .../patches/0006-x86-Add-mfunction-return.diff | 1409 +++++++++++++++ ...0007-x86-Add-mindirect-branch-register-doc.diff | 231 +++ .../0007-x86-Add-mindirect-branch-register.diff | 812 +++++++++ ...08-x86-Add-V-register-operand-modifier-doc.diff | 65 + .../0008-x86-Add-V-register-operand-modifier.diff | 125 ++ ...ow-mindirect-branch-mfunction-return-with-.diff | 275 +++ ...mindirect-branch-mfunction-return-with-doc.diff | 102 ++ development/gcc5/patches/gcc-no_fixincludes.diff | 27 + development/gcc5/patches/gcc.66782.diff | 124 ++ development/gcc5/patches/gcc.69140.diff | 13 + development/gcc5/profile.d/gcc5.csh | 7 + development/gcc5/profile.d/gcc5.sh | 7 + development/gcc5/slack-desc.gcc5 | 19 + development/geany/geany.info | 2 +- development/gedit/gedit.SlackBuild | 1 + development/glade/glade.SlackBuild | 8 +- development/glade/glade.info | 6 +- development/gnats/gnats.SlackBuild | 2 +- development/gpsim/gpsim.SlackBuild | 2 +- development/gsoap/gsoap-libtool.patch | 73 +- development/gsoap/gsoap.SlackBuild | 4 +- development/gsoap/gsoap.info | 6 +- development/hte/hte.SlackBuild | 24 +- development/hte/hte.info | 6 +- development/hte/hteditor-2.1.0-gcc-7.patch | 32 + development/jdk/profile.d/jdk.csh | 1 - development/jdk/profile.d/jdk.sh | 1 - .../fix-scanner-config-for-flex-2.6.x.patch | 23 + development/latrace/latrace.SlackBuild | 3 + development/meson/README | 9 - development/meson/meson.SlackBuild | 92 - development/meson/meson.info | 10 - development/meson/slack-desc | 19 - development/mysql-pinba/mysql-pinba.SlackBuild | 2 +- .../mysql-workbench/mysql-workbench.SlackBuild | 5 + development/ninja/README | 4 - development/ninja/ninja.SlackBuild | 95 - development/ninja/ninja.info | 10 - development/ninja/slack-desc | 19 - development/odb/odb.SlackBuild | 3 + development/odb/odb_gcc6.patch | 355 ++++ development/opencl-headers/README | 3 - .../opencl-headers/opencl-headers.SlackBuild | 57 - development/opencl-headers/opencl-headers.info | 10 - development/opencl-headers/slack-desc | 19 - development/openocd/openocd.SlackBuild | 10 +- development/openocd/openocd.info | 6 +- development/perf/perf.SlackBuild | 2 +- development/perf/perf.info | 2 +- development/php-apcu/php-apcu.SlackBuild | 2 +- development/php-apcu/php-apcu.info | 6 +- development/poedit/poedit.SlackBuild | 6 +- development/poedit/poedit.info | 6 +- development/poedit/setvalue.diff | 11 - development/re2c/README | 6 - development/re2c/re2c.SlackBuild | 110 -- development/re2c/re2c.info | 10 - development/re2c/slack-desc | 19 - development/sbcl/glibc-2.26.patch | 13 + development/sbcl/sbcl.SlackBuild | 2 + development/srcML/srcML.info | 4 +- development/swfmill/swfmill.SlackBuild | 2 +- development/tora/README | 2 + development/tora/tora.SlackBuild | 14 +- development/tora/tora.info | 8 +- 109 files changed, 7708 insertions(+), 866 deletions(-) create mode 100644 development/Coin/memhandler-initialization.patch delete mode 100644 development/SDL2_gfx/README delete mode 100644 development/SDL2_gfx/SDL2_gfx.SlackBuild delete mode 100644 development/SDL2_gfx/SDL2_gfx.info delete mode 100644 development/SDL2_gfx/slack-desc create mode 100644 development/apache-log4cxx/narrowing-fixes.patch.gz create mode 100644 development/autogen/guile-2.2.patch create mode 100644 development/avr-gcc/Revert-eeb6872bf.patch delete mode 100644 development/docutils/README delete mode 100644 development/docutils/docutils.SlackBuild delete mode 100644 development/docutils/docutils.info delete mode 100644 development/docutils/slack-desc create mode 100644 development/gcc5/README create mode 100644 development/gcc5/c89.sh create mode 100644 development/gcc5/c99.sh create mode 100644 development/gcc5/ecj.sh create mode 100644 development/gcc5/fastjar-patches/1000-fastjar-0.97-segfault.patch create mode 100644 development/gcc5/fastjar-patches/1001-fastjar-0.97-len1.patch create mode 100644 development/gcc5/fastjar-patches/1002-fastjar-0.97-filename0.patch create mode 100644 development/gcc5/fastjar-patches/1003-fastjar-CVE-2010-0831.patch create mode 100644 development/gcc5/fastjar-patches/1004-fastjar-man.patch create mode 100644 development/gcc5/gcc5.SlackBuild create mode 100644 development/gcc5/gcc5.info create mode 100644 development/gcc5/libgcj-5.pc create mode 100644 development/gcc5/patches/0001-i386-Move-struct-ix86_frame-to-machine_function.diff create mode 100644 development/gcc5/patches/0002-i386-Use-reference-of-struct-ix86_frame-to-avoid-cop.diff create mode 100644 development/gcc5/patches/0003-i386-More-use-reference-of-struct-ix86_frame-to-avoi.diff create mode 100644 development/gcc5/patches/0004-i386-Don-t-use-reference-of-struct-ix86_frame.diff create mode 100644 development/gcc5/patches/0005-x86-Add-mindirect-branch-doc.diff create mode 100644 development/gcc5/patches/0005-x86-Add-mindirect-branch.diff create mode 100644 development/gcc5/patches/0006-x86-Add-mfunction-return-doc.diff create mode 100644 development/gcc5/patches/0006-x86-Add-mfunction-return.diff create mode 100644 development/gcc5/patches/0007-x86-Add-mindirect-branch-register-doc.diff create mode 100644 development/gcc5/patches/0007-x86-Add-mindirect-branch-register.diff create mode 100644 development/gcc5/patches/0008-x86-Add-V-register-operand-modifier-doc.diff create mode 100644 development/gcc5/patches/0008-x86-Add-V-register-operand-modifier.diff create mode 100644 development/gcc5/patches/0009-x86-Disallow-mindirect-branch-mfunction-return-with-.diff create mode 100644 development/gcc5/patches/0009-x86-Disallow-mindirect-branch-mfunction-return-with-doc.diff create mode 100644 development/gcc5/patches/gcc-no_fixincludes.diff create mode 100644 development/gcc5/patches/gcc.66782.diff create mode 100644 development/gcc5/patches/gcc.69140.diff create mode 100644 development/gcc5/profile.d/gcc5.csh create mode 100644 development/gcc5/profile.d/gcc5.sh create mode 100644 development/gcc5/slack-desc.gcc5 create mode 100644 development/hte/hteditor-2.1.0-gcc-7.patch create mode 100644 development/latrace/fix-scanner-config-for-flex-2.6.x.patch delete mode 100644 development/meson/README delete mode 100644 development/meson/meson.SlackBuild delete mode 100644 development/meson/meson.info delete mode 100644 development/meson/slack-desc delete mode 100644 development/ninja/README delete mode 100644 development/ninja/ninja.SlackBuild delete mode 100644 development/ninja/ninja.info delete mode 100644 development/ninja/slack-desc create mode 100644 development/odb/odb_gcc6.patch delete mode 100644 development/opencl-headers/README delete mode 100644 development/opencl-headers/opencl-headers.SlackBuild delete mode 100644 development/opencl-headers/opencl-headers.info delete mode 100644 development/opencl-headers/slack-desc delete mode 100644 development/poedit/setvalue.diff delete mode 100644 development/re2c/README delete mode 100644 development/re2c/re2c.SlackBuild delete mode 100644 development/re2c/re2c.info delete mode 100644 development/re2c/slack-desc create mode 100644 development/sbcl/glibc-2.26.patch (limited to 'development') diff --git a/development/ChezScheme/ChezScheme.SlackBuild b/development/ChezScheme/ChezScheme.SlackBuild index 63aafcd749..e1c6df8eb5 100644 --- a/development/ChezScheme/ChezScheme.SlackBuild +++ b/development/ChezScheme/ChezScheme.SlackBuild @@ -86,6 +86,7 @@ find -L . \ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; ./configure \ + CFLAGS="-Wno-error=implicit-fallthrough=" \ $WSIZE \ $THREADS \ --installprefix=/usr \ diff --git a/development/Coin/Coin.SlackBuild b/development/Coin/Coin.SlackBuild index 96953fa909..eb99408893 100644 --- a/development/Coin/Coin.SlackBuild +++ b/development/Coin/Coin.SlackBuild @@ -61,6 +61,9 @@ find -L . \ \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ -exec chmod 644 {} \; +# Thanks Fedora +patch -p1 < $CWD/memhandler-initialization.patch + # Thanks Debian patch -p1 < $CWD/coin-include_and_js.patch diff --git a/development/Coin/memhandler-initialization.patch b/development/Coin/memhandler-initialization.patch new file mode 100644 index 0000000000..4c346487ed --- /dev/null +++ b/development/Coin/memhandler-initialization.patch @@ -0,0 +1,20 @@ +--- Coin-3.1.3/src/misc/SbHash.h.init 2010-03-02 22:20:09.000000000 +0900 ++++ Coin-3.1.3/src/misc/SbHash.h 2016-04-22 16:52:39.888883757 +0900 +@@ -89,6 +89,8 @@ + cc_memalloc_deallocate(entry->memhandler, ptr); + } + SbHashEntry(const Key & key, const Type & obj) : key(key), obj(obj) {} ++ SbHashEntry(const Key & key, const Type & obj, cc_memalloc *memhandler) ++ : key(key), obj(obj), memhandler(memhandler) {} + + Key key; + Type obj; +@@ -218,7 +220,7 @@ + /* Key not already in the hash table; insert a new + * entry as the first element in the bucket + */ +- entry = new (this->memhandler) SbHashEntry(key, obj); ++ entry = new (this->memhandler) SbHashEntry(key, obj, this->memhandler); + entry->next = this->buckets[i]; + this->buckets[i] = entry; + diff --git a/development/FreeBASIC/FreeBASIC.SlackBuild b/development/FreeBASIC/FreeBASIC.SlackBuild index bba9d245a7..70775745d0 100644 --- a/development/FreeBASIC/FreeBASIC.SlackBuild +++ b/development/FreeBASIC/FreeBASIC.SlackBuild @@ -89,13 +89,10 @@ if [ "$ARCH" = "x86_64" ]; then $PKG/usr/lib/${PRGNAM,,} fi -# fix linking with libtinfo over libncurses +# fix linking libtinfo over the newer version - WARNING, UGLY SHIT! -ponce ln -sf \ - /usr/lib${LIBDIRSUFFIX}/libncurses.so.5 \ + /usr/lib${LIBDIRSUFFIX}/libtinfo.so.6 \ $PKG/usr/lib${LIBDIRSUFFIX}/libtinfo.so.5 -ln -sf \ - /usr/lib${LIBDIRSUFFIX}/libtinfo.so.5 \ - $PKG/usr/lib${LIBDIRSUFFIX}/libtinfo.so # gzip man page gzip -c doc/fbc.1 > $PKG/usr/man/man1/fbc.1.gz diff --git a/development/MySQL-python/MySQL-python.SlackBuild b/development/MySQL-python/MySQL-python.SlackBuild index c367b99dc9..cc212f17be 100644 --- a/development/MySQL-python/MySQL-python.SlackBuild +++ b/development/MySQL-python/MySQL-python.SlackBuild @@ -57,7 +57,7 @@ patch -p1 < $CWD/patches/no_distribute_download.patch # Include my_config.h first patch -p1 < $CWD/patches/MySQL-python-1.2.4-include-my_config-first.patch -python setup.py install --root=$PKG +CPPFLAGS="-I/usr/include/mysql/server" python setup.py install --root=$PKG find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true diff --git a/development/SDL2_gfx/README b/development/SDL2_gfx/README deleted file mode 100644 index 6be21f40d1..0000000000 --- a/development/SDL2_gfx/README +++ /dev/null @@ -1,3 +0,0 @@ -SDL graphics drawing primitives and other support functions -wrapped up in an addon library for the Simple Direct Media -(SDL) cross-platform API layer. diff --git a/development/SDL2_gfx/SDL2_gfx.SlackBuild b/development/SDL2_gfx/SDL2_gfx.SlackBuild deleted file mode 100644 index cdf7a8fb56..0000000000 --- a/development/SDL2_gfx/SDL2_gfx.SlackBuild +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/sh - -# Slackware build script for SDL2_gfx - -# Copyright 2014-2018 Dimitris Zlatanidis Orestiada, Greece -# All rights reserved. -# -# Redistribution and use of this script, with or without modification, is -# permitted provided that the following conditions are met: -# -# 1. Redistributions of this script must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -PRGNAM=SDL2_gfx -VERSION=${VERSION:-1.0.4} -BUILD=${BUILD:-1} -TAG=${TAG:-_SBo} - -if [ -z "$ARCH" ]; then - case "$( uname -m )" in - i?86) ARCH=i586 ;; - arm*) ARCH=arm ;; - *) ARCH=$( uname -m ) ;; - esac -fi - -CWD=$(pwd) -TMP=${TMP:-/tmp/SBo} -PKG=$TMP/package-$PRGNAM -OUTPUT=${OUTPUT:-/tmp} - -if [ "$ARCH" = "i586" ]; then - SLKCFLAGS="-O2 -march=i586 -mtune=i686" - LIBDIRSUFFIX="" -elif [ "$ARCH" = "i686" ]; then - SLKCFLAGS="-O2 -march=i686 -mtune=i686" - LIBDIRSUFFIX="" -elif [ "$ARCH" = "x86_64" ]; then - SLKCFLAGS="-O2 -fPIC" - LIBDIRSUFFIX="64" -else - SLKCFLAGS="-O2" - LIBDIRSUFFIX="" -fi - -set -e - -rm -rf $PKG -mkdir -p $TMP $PKG $OUTPUT -cd $TMP -rm -rf $PRGNAM-$VERSION -tar xvf $CWD/$PRGNAM-$VERSION.tar.gz -cd $PRGNAM-$VERSION -chown -R root:root . -find -L . \ - \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \ - -o -perm 511 \) -exec chmod 755 {} \; -o \ - \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ - -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; - -./autogen.sh -CFLAGS="$SLKCFLAGS" \ -CXXFLAGS="$SLKCFLAGS" \ -./configure \ - --prefix=/usr \ - --libdir=/usr/lib${LIBDIRSUFFIX} \ - --sysconfdir=/etc \ - --localstatedir=/var \ - --mandir=/usr/man \ - --docdir=/usr/doc/$PRGNAM-$VERSION \ - --disable-static \ - --build=$ARCH-slackware-linux - -make -make install DESTDIR=$PKG - -find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \ - | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true - -mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION -cp -a AUTHORS COPYING ChangeLog NEWS README $PKG/usr/doc/$PRGNAM-$VERSION -cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild - -mkdir -p $PKG/install -cat $CWD/slack-desc > $PKG/install/slack-desc - -cd $PKG -/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz} diff --git a/development/SDL2_gfx/SDL2_gfx.info b/development/SDL2_gfx/SDL2_gfx.info deleted file mode 100644 index 2f64868bd2..0000000000 --- a/development/SDL2_gfx/SDL2_gfx.info +++ /dev/null @@ -1,10 +0,0 @@ -PRGNAM="SDL2_gfx" -VERSION="1.0.4" -HOMEPAGE="http://www.ferzkopp.net/wordpress/2016/01/02/sdl_gfx-sdl2_gfx/" -DOWNLOAD="http://www.ferzkopp.net/Software/SDL2_gfx/SDL2_gfx-1.0.4.tar.gz" -MD5SUM="15f9866c6464ca298f28f62fe5b36d9f" -DOWNLOAD_x86_64="" -MD5SUM_x86_64="" -REQUIRES="SDL2" -MAINTAINER="Dimitris Zlatanidis" -EMAIL="d.zlatanidis@gmail.com" diff --git a/development/SDL2_gfx/slack-desc b/development/SDL2_gfx/slack-desc deleted file mode 100644 index 72864f2da7..0000000000 --- a/development/SDL2_gfx/slack-desc +++ /dev/null @@ -1,19 +0,0 @@ -# HOW TO EDIT THIS FILE: -# The "handy ruler" below makes it easier to edit a package description. -# Line up the first '|' above the ':' following the base package name, and -# the '|' on the right side marks the last column you can put a character in. -# You must make exactly 11 lines for the formatting to be correct. It's also -# customary to leave one space after the ':' except on otherwise blank lines. - - |-----handy-ruler------------------------------------------------------| -SDL2_gfx: SDL2_gfx (addon library for the SDL2) -SDL2_gfx: -SDL2_gfx: SDL graphics drawing primitives and other support functions -SDL2_gfx: wrapped up in an addon library for the Simple Direct Media (SDL) -SDL2_gfx: cross-platform API layer. -SDL2_gfx: -SDL2_gfx: Homepage: -SDL2_gfx: http://www.ferzkopp.net/wordpress/2016/01/02/sdl_gfx-sdl2_gfx/ -SDL2_gfx: -SDL2_gfx: -SDL2_gfx: diff --git a/development/acpica/acpica.SlackBuild b/development/acpica/acpica.SlackBuild index f3ffc6d06f..1d4f1db707 100644 --- a/development/acpica/acpica.SlackBuild +++ b/development/acpica/acpica.SlackBuild @@ -2,7 +2,7 @@ # Slackware build script for acpica -# Copyright 2008-2017 Heinz Wiesinger, Amsterdam, The Netherlands +# Copyright 2008-2018 Heinz Wiesinger, Amsterdam, The Netherlands # All rights reserved. # # Redistribution and use of this script, with or without modification, is @@ -23,7 +23,7 @@ # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PRGNAM=acpica -VERSION=${VERSION:-20170531} +VERSION=${VERSION:-20180105} BUILD=${BUILD:-1} TAG=${TAG:-_SBo} diff --git a/development/acpica/acpica.info b/development/acpica/acpica.info index dea5cd5d50..3ac0a61986 100644 --- a/development/acpica/acpica.info +++ b/development/acpica/acpica.info @@ -1,8 +1,8 @@ PRGNAM="acpica" -VERSION="20170531" +VERSION="20180105" HOMEPAGE="http://www.acpica.org" -DOWNLOAD="https://acpica.org/sites/acpica/files/acpica-unix2-20170531.tar.gz" -MD5SUM="46c4c93435ad1d8c4eb5bacde17503b8" +DOWNLOAD="https://acpica.org/sites/acpica/files/acpica-unix2-20180105.tar.gz" +MD5SUM="5aa086f71f4b5273c0932a1e04419a37" DOWNLOAD_x86_64="" MD5SUM_x86_64="" REQUIRES="" diff --git a/development/anjuta/anjuta.SlackBuild b/development/anjuta/anjuta.SlackBuild index c4f11f91b6..60ab56357a 100644 --- a/development/anjuta/anjuta.SlackBuild +++ b/development/anjuta/anjuta.SlackBuild @@ -69,7 +69,7 @@ find -L . \ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; -CFLAGS="$SLKCFLAGS" \ +CFLAGS="$SLKCFLAGS -Wno-error=format-nonliteral -Wno-error=format-y2k" \ CXXFLAGS="$SLKCFLAGS" \ ./configure \ --prefix=/usr \ diff --git a/development/apache-log4cxx/apache-log4cxx.SlackBuild b/development/apache-log4cxx/apache-log4cxx.SlackBuild index 8e1adafefb..a0971e9701 100644 --- a/development/apache-log4cxx/apache-log4cxx.SlackBuild +++ b/development/apache-log4cxx/apache-log4cxx.SlackBuild @@ -70,6 +70,7 @@ find -L . \ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; zcat $CWD/fixincludes.patch.gz | patch -p1 || exit +zcat $CWD/narrowing-fixes.patch.gz | patch -p1 || exit CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ diff --git a/development/apache-log4cxx/narrowing-fixes.patch.gz b/development/apache-log4cxx/narrowing-fixes.patch.gz new file mode 100644 index 0000000000..cd79cc6971 Binary files /dev/null and b/development/apache-log4cxx/narrowing-fixes.patch.gz differ diff --git a/development/autogen/autogen.SlackBuild b/development/autogen/autogen.SlackBuild index 1652367f03..5b8c367f22 100644 --- a/development/autogen/autogen.SlackBuild +++ b/development/autogen/autogen.SlackBuild @@ -70,6 +70,10 @@ find -L . \ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; +# Patched for guile 2.2.x +patch -p1 < $CWD/guile-2.2.patch + +autoreconf CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ ./configure \ @@ -81,6 +85,7 @@ CXXFLAGS="$SLKCFLAGS" \ --infodir=/usr/info \ --docdir=/usr/doc/$PRGNAM-$VERSION \ --enable-static=no \ + --disable-dependency-tracking \ --build=$ARCH-slackware-linux make diff --git a/development/autogen/guile-2.2.patch b/development/autogen/guile-2.2.patch new file mode 100644 index 0000000000..b3d50f4b79 --- /dev/null +++ b/development/autogen/guile-2.2.patch @@ -0,0 +1,78 @@ +diff --git a/agen5/guile-iface.h b/agen5/guile-iface.h +index 0aeabb0..6ce3520 100644 +--- a/agen5/guile-iface.h ++++ b/agen5/guile-iface.h +@@ -9,7 +9,7 @@ + # error AutoGen does not work with this version of Guile + choke me. + +-#elif GUILE_VERSION < 201000 ++#else + # define AG_SCM_IS_PROC(_p) scm_is_true( scm_procedure_p(_p)) + # define AG_SCM_LIST_P(_l) scm_is_true( scm_list_p(_l)) + # define AG_SCM_PAIR_P(_p) scm_is_true( scm_pair_p(_p)) +@@ -24,9 +24,6 @@ + # define AG_SCM_TO_ULONG(_v) ((unsigned long)scm_to_ulong(_v)) + # define AG_SCM_VEC_P(_v) scm_is_vector(_v) + +-#else +-# error unknown GUILE_VERSION +- choke me. + #endif + + #endif /* MUTATING_GUILE_IFACE_H_GUARD */ +diff --git a/configure b/configure +index befe20b..c4254eb 100755 +--- a/configure ++++ b/configure +@@ -14191,7 +14191,7 @@ $as_echo "no" >&6; } + PKG_CONFIG="" + fi + fi +- _guile_versions_to_search="2.0 1.8" ++ _guile_versions_to_search="2.2 2.0 1.8" + if test -n "$GUILE_EFFECTIVE_VERSION"; then + _guile_tmp="" + for v in $_guile_versions_to_search; do + +diff --git a/agen5/guile-iface.h b/agen5/guile-iface.h +index 0aeabb0..6ce3520 100644 +--- autogen-5.18.12/config/guile-orig.m4 2017-11-21 15:23:45.047606700 -0500 ++++ autogen-5.18.12/config/guile.m4 2017-11-21 15:24:20.414686700 -0500 +@@ -47,7 +47,7 @@ + # for an available version of Guile. + # + # By default, this macro will search for the latest stable version of +-# Guile (e.g. 2.0), falling back to the previous stable version ++# Guile (e.g. 2.2), falling back to the previous stable version + # (e.g. 1.8) if it is available. If no guile-@var{VERSION}.pc file is + # found, an error is signalled. The found version is stored in + # @var{GUILE_EFFECTIVE_VERSION}. +@@ -61,7 +61,7 @@ + # + AC_DEFUN([GUILE_PKG], + [PKG_PROG_PKG_CONFIG +- _guile_versions_to_search="m4_default([$1], [2.0 1.8])" ++ _guile_versions_to_search="m4_default([$1], [2.2 1.8])" + if test -n "$GUILE_EFFECTIVE_VERSION"; then + _guile_tmp="" + for v in $_guile_versions_to_search; do +@@ -184,7 +184,7 @@ + # If @code{guile} is not found, signal an error. + # + # By default, this macro will search for the latest stable version of +-# Guile (e.g. 2.0). x.y or x.y.z versions can be specified. If an older ++# Guile (e.g. 2.2). x.y or x.y.z versions can be specified. If an older + # version is found, the macro will signal an error. + # + # The effective version of the found @code{guile} is set to +@@ -201,7 +201,7 @@ + [AC_PATH_PROG(GUILE,guile) + _guile_required_version="m4_default([$1], [$GUILE_EFFECTIVE_VERSION])" + if test -z "$_guile_required_version"; then +- _guile_required_version=2.0 ++ _guile_required_version=2.2 + fi + if test "$GUILE" = "" ; then + AC_MSG_ERROR([guile required but not found]) + diff --git a/development/avr-binutils/avr-binutils.SlackBuild b/development/avr-binutils/avr-binutils.SlackBuild index 3b31a96b3f..8684c76c33 100644 --- a/development/avr-binutils/avr-binutils.SlackBuild +++ b/development/avr-binutils/avr-binutils.SlackBuild @@ -9,7 +9,7 @@ # This file is placed in the public domain. PRGNAM=avr-binutils -VERSION=${VERSION:-2.25} +VERSION=${VERSION:-2.29} BUILD=${BUILD:-1} TAG=${TAG:-_SBo} diff --git a/development/avr-binutils/avr-binutils.info b/development/avr-binutils/avr-binutils.info index 6b640d3296..370f240a4b 100644 --- a/development/avr-binutils/avr-binutils.info +++ b/development/avr-binutils/avr-binutils.info @@ -1,8 +1,8 @@ PRGNAM="avr-binutils" -VERSION="2.25" +VERSION="2.29" HOMEPAGE="http://www.gnu.org/software/binutils" -DOWNLOAD="http://ftp.gnu.org/gnu/binutils/binutils-2.25.tar.bz2" -MD5SUM="d9f3303f802a5b6b0bb73a335ab89d66" +DOWNLOAD="http://ftp.gnu.org/gnu/binutils/binutils-2.29.tar.bz2" +MD5SUM="23733a26c8276edbb1168c9bee60e40e" DOWNLOAD_x86_64="" MD5SUM_x86_64="" REQUIRES="" diff --git a/development/avr-gcc/Revert-eeb6872bf.patch b/development/avr-gcc/Revert-eeb6872bf.patch new file mode 100644 index 0000000000..1688c149a8 --- /dev/null +++ b/development/avr-gcc/Revert-eeb6872bf.patch @@ -0,0 +1,82 @@ +commit 43d83a70267a9e5c456d28de8e7348820446b712 +Author: BartÅ‚omiej Piotrowski +Date: Tue May 16 07:50:42 2017 +0200 + + Revert "Prevent LTO wrappers to process a recursive execution" + + This reverts commit eeb6872bfdfd1e71b27de6f62a5f5c08a2efb015. + +diff --git a/gcc/file-find.c b/gcc/file-find.c +index b072a4993d76..b5a1fe8494e8 100644 +--- a/gcc/file-find.c ++++ b/gcc/file-find.c +@@ -208,38 +208,3 @@ prefix_from_string (const char *p, struct path_prefix *pprefix) + } + free (nstore); + } +- +-void +-remove_prefix (const char *prefix, struct path_prefix *pprefix) +-{ +- struct prefix_list *remove, **prev, **remove_prev = NULL; +- int max_len = 0; +- +- if (pprefix->plist) +- { +- prev = &pprefix->plist; +- for (struct prefix_list *pl = pprefix->plist; pl->next; pl = pl->next) +- { +- if (strcmp (prefix, pl->prefix) == 0) +- { +- remove = pl; +- remove_prev = prev; +- continue; +- } +- +- int l = strlen (pl->prefix); +- if (l > max_len) +- max_len = l; +- +- prev = &pl; +- } +- +- if (remove_prev) +- { +- *remove_prev = remove->next; +- free (remove); +- } +- +- pprefix->max_len = max_len; +- } +-} +diff --git a/gcc/file-find.h b/gcc/file-find.h +index 8f49a3af273e..407feba26e74 100644 +--- a/gcc/file-find.h ++++ b/gcc/file-find.h +@@ -41,7 +41,6 @@ extern void find_file_set_debug (bool); + extern char *find_a_file (struct path_prefix *, const char *, int); + extern void add_prefix (struct path_prefix *, const char *); + extern void add_prefix_begin (struct path_prefix *, const char *); +-extern void remove_prefix (const char *prefix, struct path_prefix *); + extern void prefix_from_env (const char *, struct path_prefix *); + extern void prefix_from_string (const char *, struct path_prefix *); + +diff --git a/gcc/gcc-ar.c b/gcc/gcc-ar.c +index 78d2fc1ad306..d5d80e042e5a 100644 +--- a/gcc/gcc-ar.c ++++ b/gcc/gcc-ar.c +@@ -194,14 +194,6 @@ main (int ac, char **av) + #ifdef CROSS_DIRECTORY_STRUCTURE + real_exe_name = concat (target_machine, "-", PERSONALITY, NULL); + #endif +- /* Do not search original location in the same folder. */ +- char *exe_folder = lrealpath (av[0]); +- exe_folder[strlen (exe_folder) - strlen (lbasename (exe_folder))] = '\0'; +- char *location = concat (exe_folder, PERSONALITY, NULL); +- +- if (access (location, X_OK) == 0) +- remove_prefix (exe_folder, &path); +- + exe_name = find_a_file (&path, real_exe_name, X_OK); + if (!exe_name) + { diff --git a/development/avr-gcc/avr-gcc.SlackBuild b/development/avr-gcc/avr-gcc.SlackBuild index a91986fe8c..ab3f811380 100644 --- a/development/avr-gcc/avr-gcc.SlackBuild +++ b/development/avr-gcc/avr-gcc.SlackBuild @@ -8,7 +8,7 @@ # This file is placed in the public domain. PRGNAM=avr-gcc -VERSION=${VERSION:-4.9.2} +VERSION=${VERSION:-7.1.0} BUILD=${BUILD:-1} TAG=${TAG:-_SBo} @@ -45,9 +45,8 @@ rm -rf $PKG mkdir -p $TMP $PKG $OUTPUT cd $TMP rm -rf gcc-$VERSION avr-gcc-build-$VERSION -tar xvf $CWD/gcc-$VERSION.tar.bz2 || exit 1 -mkdir avr-gcc-build-$VERSION -cd avr-gcc-build-$VERSION || exit 1 +tar xvf $CWD/gcc-$VERSION.tar.bz2 +cd gcc-$VERSION chown -R root:root . find -L . \ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 -o -perm 511 \) \ @@ -55,6 +54,12 @@ find -L . \ \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ -exec chmod 644 {} \; +# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80717 +patch -p1 < $CWD/Revert-eeb6872bf.patch + +mkdir ../avr-gcc-build-$VERSION +cd ../avr-gcc-build-$VERSION + CFLAGS_FOR_BUILD="$SLKCFLAGS" \ CXXFLAGS_FOR_BUILD="$SLKCFLAGS" \ ../gcc-$VERSION/configure \ @@ -99,6 +104,7 @@ make install DESTDIR=$PKG || exit 1 # Remove useless stuff rm -rf $PKG/usr/lib${LIBDIRSUFFIX}/libiberty.a +rm -rf $PKG/usr/lib${LIBDIRSUFFIX}/libcc1.* rm -rf $PKG/usr/info rm -rf $PKG/usr/include rm -rf $PKG/usr/share diff --git a/development/avr-gcc/avr-gcc.info b/development/avr-gcc/avr-gcc.info index 6bd3a9b64d..4eda349091 100644 --- a/development/avr-gcc/avr-gcc.info +++ b/development/avr-gcc/avr-gcc.info @@ -1,8 +1,8 @@ PRGNAM="avr-gcc" -VERSION="4.9.2" +VERSION="7.1.0" HOMEPAGE="http://www.gnu.org/software/gcc/" -DOWNLOAD="ftp://ftp.gnu.org/pub/gnu/gcc/gcc-4.9.2/gcc-4.9.2.tar.bz2" -MD5SUM="4df8ee253b7f3863ad0b86359cd39c43" +DOWNLOAD="ftp://ftp.gnu.org/pub/gnu/gcc/gcc-7.1.0/gcc-7.1.0.tar.bz2" +MD5SUM="6bf56a2bca9dac9dbbf8e8d1036964a8" DOWNLOAD_x86_64="" MD5SUM_x86_64="" REQUIRES="avr-binutils" diff --git a/development/docutils/README b/development/docutils/README deleted file mode 100644 index 1160a389f0..0000000000 --- a/development/docutils/README +++ /dev/null @@ -1,6 +0,0 @@ -Docutils (Python Documentation Utilities) - -Docutils is a modular system for processing documentation into useful -formats, such as HTML, XML, and LaTeX. For input Docutils supports -reStructuredText, an easy-to-read, what-you-see-is-what-you-get plaintext -markup syntax. diff --git a/development/docutils/docutils.SlackBuild b/development/docutils/docutils.SlackBuild deleted file mode 100644 index ffbf286185..0000000000 --- a/development/docutils/docutils.SlackBuild +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/sh - -# Slackware build script for docutils - -# Copyright 2006-2018 Robby Workman Tuscaloosa, AL, USA -# All rights reserved. -# -# Redistribution and use of this script, with or without modification, is -# permitted provided that the following conditions are met: -# -# 1. Redistributions of this script must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -PRGNAM=docutils -VERSION=${VERSION:-0.14} -BUILD=${BUILD:-1} -TAG=${TAG:-_SBo} - -if [ -z "$ARCH" ]; then - case "$( uname -m )" in - i?86) ARCH=i586 ;; - arm*) ARCH=arm ;; - *) ARCH=$( uname -m ) ;; - esac -fi - -CWD=$(pwd) -TMP=${TMP:-/tmp/SBo} -PKG=$TMP/package-$PRGNAM -OUTPUT=${OUTPUT:-/tmp} - -set -e - -rm -rf $PKG -mkdir -p $TMP $PKG $OUTPUT -cd $TMP -rm -rf $PRGNAM-$VERSION -tar xvf $CWD/$PRGNAM-$VERSION.tar.gz -cd $PRGNAM-$VERSION -chown -R root:root . -find -L . \ - \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 -o -perm 511 \) \ - -exec chmod 755 {} \; -o \ - \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ - -exec chmod 644 {} \; - -python setup.py install --root=$PKG - -find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | \ - grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true - -mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION -cp -a *.txt PKG-INFO $PKG/usr/doc/$PRGNAM-$VERSION -cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild - -mkdir -p $PKG/install -cat $CWD/slack-desc > $PKG/install/slack-desc - -cd $PKG -/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz} diff --git a/development/docutils/docutils.info b/development/docutils/docutils.info deleted file mode 100644 index 04448db78e..0000000000 --- a/development/docutils/docutils.info +++ /dev/null @@ -1,10 +0,0 @@ -PRGNAM="docutils" -VERSION="0.14" -HOMEPAGE="http://docutils.sourceforge.net" -DOWNLOAD="http://downloads.sourceforge.net/docutils/docutils-0.14.tar.gz" -MD5SUM="c53768d63db3873b7d452833553469de" -DOWNLOAD_x86_64="" -MD5SUM_x86_64="" -REQUIRES="" -MAINTAINER="Robby Workman" -EMAIL="rworkman@slackbuilds.org" diff --git a/development/docutils/slack-desc b/development/docutils/slack-desc deleted file mode 100644 index 06dc8a4d0d..0000000000 --- a/development/docutils/slack-desc +++ /dev/null @@ -1,19 +0,0 @@ -# HOW TO EDIT THIS FILE: -# The "handy ruler" below makes it easier to edit a package description. -# Line up the first '|' above the ':' following the base package name, and -# the '|' on the right side marks the last column you can put a character in. -# You must make exactly 11 lines for the formatting to be correct. It's also -# customary to leave one space after the ':' except on otherwise blank lines. - - |-----handy-ruler------------------------------------------------------| -docutils: docutils (Python Document Utilities module) -docutils: -docutils: Docutils is an open-source text processing system for processing -docutils: plaintext documentation into useful formats, such as HTML or LaTeX. -docutils: It includes reStructuredText, the easy to read, easy to use, -docutils: what-you-see-is-what-you-get plaintext markup language. -docutils: -docutils: Homepage: http://docutils.sourceforge.net/ -docutils: -docutils: -docutils: diff --git a/development/gcc5/README b/development/gcc5/README new file mode 100644 index 0000000000..043d62efcf --- /dev/null +++ b/development/gcc5/README @@ -0,0 +1,46 @@ +This gcc5 package can be installed alongside Slackware's gcc-7 packages. +These version 7 compilers can sometimes be quite a bit more strict about +what they accept as valid code. As a consequence, you will regularly run +into compilation issues with software. Not just the software made with +the scripts on slackbuilds.org, but also some of the software in +the Slackware core distribution requires patches in order to get them +to compile. + +Still having the gcc version 5 compilers can sometimes be a lifesaver. +Particulars of the gcc5 package: +- The gcc5 binaries were given a suffix '-5' to make them stand apart + from Slackware's default compilers. +- The gcc5 package only contains the C, C++ and Java language compilers. +- One all-encompassing package is built by the SlackBuild script. +- Profile scripts are added to /etc/profile.d/. You can 'source' + the profile script to prefer the gcc-5 compilers over gcc-7. +- On 64bit Slackware, the gcc5.SlackBuild will detect an existing gcc + multilib compiler and will then build a multilib capable gcc5. + If you run pure 64bit Slackware, then a pure 64bit gcc5 package is built. + +How to use these gcc5 compilers instead of Slackware's default C and C++? +Simple: +In your console or terminal, you 'source' the provided profile script, +like this (a c-shell compatible script is available as well): + + source /etc/profile.d/gcc5.sh + +The command 'source' is equivalent to the dot command ' . '. +The profile script will (re-)define the common variables that are used +by make and other programs to determine which binary to run as the compiler: + +export CC=gcc-5 +export CPP=cpp-5 +export CXX=g++-5 +export AR=gcc-ar-5 +export NM=gcc-nm-5 +export RANLIB=gcc-ranlib-5 + +Nothing else needs to be done after sourcing the profile script. +All you do next is run your compile job as usual in that same console. +Your program will be compiled with the binaries provided by the gcc5 package. + +** WARNING: +** The temporary build location used by the script (defaulting here to /tmp/SBo) +** should *NOT* be a directory path a non-root user could create later... + diff --git a/development/gcc5/c89.sh b/development/gcc5/c89.sh new file mode 100644 index 0000000000..424b1e1669 --- /dev/null +++ b/development/gcc5/c89.sh @@ -0,0 +1,11 @@ +#!/bin/sh +fl="-std=c89" +CC=${CC:-"gcc"} +for opt; do + case "$opt" in + -ansi|-std=c89|-std=iso9899:1990) fl="";; + -std=*) echo "`basename $0` called with non ANSI/ISO C option $opt" >&2 + exit 1;; + esac +done +exec $CC $fl ${1+"$@"} diff --git a/development/gcc5/c99.sh b/development/gcc5/c99.sh new file mode 100644 index 0000000000..c33636937c --- /dev/null +++ b/development/gcc5/c99.sh @@ -0,0 +1,11 @@ +#!/bin/sh +fl="-std=c99" +CC=${CC:-"gcc"} +for opt; do + case "$opt" in + -std=c99|-std=iso9899:1999) fl="";; + -std=*) echo "`basename $0` called with non ISO C99 option $opt" >&2 + exit 1;; + esac +done +exec $CC $fl ${1+"$@"} diff --git a/development/gcc5/ecj.sh b/development/gcc5/ecj.sh new file mode 100644 index 0000000000..1d8b797931 --- /dev/null +++ b/development/gcc5/ecj.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +CLASSPATH=@JAVADIR@/ecj.jar${CLASSPATH:+:}$CLASSPATH \ + java org.eclipse.jdt.internal.compiler.batch.Main "$@" + diff --git a/development/gcc5/fastjar-patches/1000-fastjar-0.97-segfault.patch b/development/gcc5/fastjar-patches/1000-fastjar-0.97-segfault.patch new file mode 100644 index 0000000000..ab6262407a --- /dev/null +++ b/development/gcc5/fastjar-patches/1000-fastjar-0.97-segfault.patch @@ -0,0 +1,29 @@ +2009-01-14 Jakub Jelinek + + * jartool.c (make_manifest): Initialize current_time before + calling unix2dostime on it. + +--- fastjar-0.97/jartool.c.jj 2008-10-15 18:35:37.000000000 +0200 ++++ fastjar-0.97/jartool.c 2009-01-14 15:40:50.000000000 +0100 +@@ -820,6 +820,10 @@ int make_manifest(int jfd, const char *m + int mod_time; /* file modification time */ + struct zipentry *ze; + ++ current_time = time(NULL); ++ if(current_time == (time_t)-1) ++ exit_on_error("time"); ++ + mod_time = unix2dostime(¤t_time); + + /* If we are creating a new manifest, create a META-INF directory entry */ +@@ -828,10 +832,6 @@ int make_manifest(int jfd, const char *m + + memset((file_header + 12), '\0', 16); /*clear mod time, crc, size fields*/ + +- current_time = time(NULL); +- if(current_time == (time_t)-1) +- exit_on_error("time"); +- + PACK_UB2(file_header, LOC_EXTRA, 0); + PACK_UB2(file_header, LOC_COMP, 0); + PACK_UB2(file_header, LOC_FNLEN, nlen); diff --git a/development/gcc5/fastjar-patches/1001-fastjar-0.97-len1.patch b/development/gcc5/fastjar-patches/1001-fastjar-0.97-len1.patch new file mode 100644 index 0000000000..722351d334 --- /dev/null +++ b/development/gcc5/fastjar-patches/1001-fastjar-0.97-len1.patch @@ -0,0 +1,16 @@ +2009-12-21 Chris Ball + + * jartool.c (add_file_to_jar): Test write return value against -1 + instead of 1. + +--- fastjar-0.97/jartool.c.jj 2008-10-15 12:35:37.000000000 -0400 ++++ fastjar-0.97/jartool.c 2009-12-22 06:48:09.309530000 -0500 +@@ -1257,7 +1257,7 @@ int add_file_to_jar(int jfd, int ffd, co + exit_on_error("write"); + + /* write the file name to the zip file */ +- if (1 == write(jfd, fname, file_name_length)) ++ if (-1 == write(jfd, fname, file_name_length)) + exit_on_error("write"); + + if(verbose){ diff --git a/development/gcc5/fastjar-patches/1002-fastjar-0.97-filename0.patch b/development/gcc5/fastjar-patches/1002-fastjar-0.97-filename0.patch new file mode 100644 index 0000000000..34a02a74f3 --- /dev/null +++ b/development/gcc5/fastjar-patches/1002-fastjar-0.97-filename0.patch @@ -0,0 +1,14 @@ +2010-03-01 Richard Guenther + + * jartool.c (read_entries): Properly zero-terminate filename. + +--- fastjar-0.97/jartool.c 6 Sep 2009 22:16:00 -0000 1.59 ++++ fastjar-0.97/jartool.c 1 Mar 2010 15:38:43 -0000 1.60 +@@ -790,6 +790,7 @@ int read_entries (int fd) + progname, jarfile); + return 1; + } ++ ze->filename[len] = '\0'; + len = UNPACK_UB4(header, CEN_EFLEN); + len += UNPACK_UB4(header, CEN_COMLEN); + if (lseek (fd, len, SEEK_CUR) == -1) diff --git a/development/gcc5/fastjar-patches/1003-fastjar-CVE-2010-0831.patch b/development/gcc5/fastjar-patches/1003-fastjar-CVE-2010-0831.patch new file mode 100644 index 0000000000..2c6e23c76c --- /dev/null +++ b/development/gcc5/fastjar-patches/1003-fastjar-CVE-2010-0831.patch @@ -0,0 +1,102 @@ +2010-06-10 Jakub Jelinek + Dan Rosenberg + + * jartool.c (extract_jar): Fix up checks for traversal to parent + directories, disallow absolute paths, make the code slightly more + efficient. + +--- fastjar-0.97/jartool.c.jj 2009-09-07 00:10:47.000000000 +0200 ++++ fastjar-0.97/jartool.c 2010-06-08 20:00:29.000000000 +0200 +@@ -1730,7 +1730,17 @@ int extract_jar(int fd, const char **fil + struct stat sbuf; + int depth = 0; + +- tmp_buff = malloc(sizeof(char) * strlen((const char *)filename)); ++ if(*filename == '/'){ ++ fprintf(stderr, "Absolute path names are not allowed.\n"); ++ exit(EXIT_FAILURE); ++ } ++ ++ tmp_buff = malloc(strlen((const char *)filename)); ++ ++ if(tmp_buff == NULL) { ++ fprintf(stderr, "Out of memory.\n"); ++ exit(EXIT_FAILURE); ++ } + + for(;;){ + const ub1 *idx = (const unsigned char *)strchr((const char *)start, '/'); +@@ -1738,25 +1748,28 @@ int extract_jar(int fd, const char **fil + if(idx == NULL) + break; + else if(idx == start){ ++ tmp_buff[idx - filename] = '/'; + start++; + continue; + } +- start = idx + 1; + +- strncpy(tmp_buff, (const char *)filename, (idx - filename)); +- tmp_buff[(idx - filename)] = '\0'; ++ memcpy(tmp_buff + (start - filename), (const char *)start, (idx - start)); ++ tmp_buff[idx - filename] = '\0'; + + #ifdef DEBUG + printf("checking the existance of %s\n", tmp_buff); + #endif +- if(strcmp(tmp_buff, "..") == 0){ ++ if(idx - start == 2 && memcmp(start, "..", 2) == 0){ + --depth; + if (depth < 0){ + fprintf(stderr, "Traversal to parent directories during unpacking!\n"); + exit(EXIT_FAILURE); + } +- } else if (strcmp(tmp_buff, ".") != 0) ++ } else if (idx - start != 1 || *start != '.') + ++depth; ++ ++ start = idx + 1; ++ + if(stat(tmp_buff, &sbuf) < 0){ + if(errno != ENOENT) + exit_on_error("stat"); +@@ -1765,6 +1778,7 @@ int extract_jar(int fd, const char **fil + #ifdef DEBUG + printf("Directory exists\n"); + #endif ++ tmp_buff[idx - filename] = '/'; + continue; + }else { + fprintf(stderr, "Hmmm.. %s exists but isn't a directory!\n", +@@ -1781,10 +1795,11 @@ int extract_jar(int fd, const char **fil + if(verbose && handle) + printf("%10s: %s/\n", "created", tmp_buff); + ++ tmp_buff[idx - filename] = '/'; + } + + /* only a directory */ +- if(strlen((const char *)start) == 0) ++ if(*start == '\0') + dir = TRUE; + + #ifdef DEBUG +@@ -1792,7 +1807,7 @@ int extract_jar(int fd, const char **fil + #endif + + /* If the entry was just a directory, don't write to file, etc */ +- if(strlen((const char *)start) == 0) ++ if(*start == '\0') + f_fd = -1; + + free(tmp_buff); +@@ -1876,7 +1891,8 @@ int extract_jar(int fd, const char **fil + exit(EXIT_FAILURE); + } + +- close(f_fd); ++ if (f_fd != -1) ++ close(f_fd); + + if(verbose && dir == FALSE && handle) + printf("%10s: %s\n", diff --git a/development/gcc5/fastjar-patches/1004-fastjar-man.patch b/development/gcc5/fastjar-patches/1004-fastjar-man.patch new file mode 100644 index 0000000000..34bf704dbb --- /dev/null +++ b/development/gcc5/fastjar-patches/1004-fastjar-man.patch @@ -0,0 +1,27 @@ +2010-03-24 Jan Kratochvil + + * Makefile.am (POD2MAN): Provide --date from ChangeLog. + * Makefile.in: Regenerate. + +--- fastjar-0.97/Makefile.am.jj 2008-10-16 04:24:55.000000000 -0400 ++++ fastjar-0.97/Makefile.am 2010-06-21 09:29:41.021398000 -0400 +@@ -39,7 +39,7 @@ EXTRA_DIST = \ + texi2pod.pl + + TEXI2POD = perl $(srcdir)/texi2pod.pl +-POD2MAN = pod2man --center="GNU" --release=@VERSION@ ++POD2MAN = pod2man --center="GNU" --release=@VERSION@ --date=$(shell sed -n '1s/ .*//p' <$(srcdir)/ChangeLog) + + .pod.1: + -($(POD2MAN) --section=1 $< > $(@).T$$$$ && \ +--- fastjar-0.97/Makefile.in.jj 2008-10-16 04:15:16.000000000 -0400 ++++ fastjar-0.97/Makefile.in 2010-06-21 09:30:15.882810000 -0400 +@@ -515,7 +515,7 @@ EXTRA_DIST = \ + texi2pod.pl + + TEXI2POD = perl $(srcdir)/texi2pod.pl +-POD2MAN = pod2man --center="GNU" --release=@VERSION@ ++POD2MAN = pod2man --center="GNU" --release=@VERSION@ --date=$(shell sed -n '1s/ .*//p' <$(srcdir)/ChangeLog) + + #SPLINT_FLAGS=-I . -I $(srcdir)/lib -I $(srcdir) -DHAVE_CONFIG_H +posixlib +weak + SPLINT_FLAGS = -I . -I $(srcdir)/lib -I $(srcdir) -DHAVE_CONFIG_H -DPRIx32= -warnposix +weak diff --git a/development/gcc5/gcc5.SlackBuild b/development/gcc5/gcc5.SlackBuild new file mode 100644 index 0000000000..7054b3184f --- /dev/null +++ b/development/gcc5/gcc5.SlackBuild @@ -0,0 +1,565 @@ +#!/bin/sh +# GCC package build script (written by volkerdi@slackware.com) +# +# Copyright 2003, 2004 Slackware Linux, Inc., Concord, California, USA +# Copyright 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +# Modified 2011 by Eric Hameleers for OpenJDK. +# Modified 2017, 2018 by Eric Hameleers for gcc5. + +# Some notes, Fri May 16 12:31:32 PDT 2003: +# +# Why i486 and not i386? Because the shared C++ libraries in gcc-3.2.x will +# require 486 opcodes even when a 386 target is used (so we already weren't +# compatible with the i386 for Slackware 9.0, didn't notice, and nobody +# complained :-). gcc-3.3 fixes this issue and allows you to build a 386 +# compiler, but the fix is done in a way that produces binaries that are not +# compatible with gcc-3.2.x compiled binaries. To retain compatibility with +# Slackware 9.0, we'll have to use i486 (or better) as the compiler target +# for gcc-3.3. +# +# It's time to say goodbye to i386 support in Slackware. I've surveyed 386 +# usage online, and the most common thing I see people say when someone asks +# about running Linux on a 386 is to "run Slackware", but then they also +# usually go on to say "be sure to get an OLD version, like 4.0, before glibc, +# because it'll be more efficient." Now, if that's the general advice, then +# I see no reason to continue 386 support in the latest Slackware (and indeed +# it's no longer easily possible). + +# Some more notes, Mon Aug 3 19:49:51 UTC 2015: +# +# Changing to -march=i586 for 32-bit x86 as several things (Mesa being one of +# them) no longer work if constrained to -march=i486. We're not going to use +# -march=i686 since the only additional opcode is CMOV, which is actually less +# efficient on modern CPUs running in 32-bit mode than the alternate i586 +# instructions. No need to throw i586 CPUs under the bus (yet). + +PRGNAM=gcc5 +VERSION=${VERSION:-5.5.0} +MAJVER=$(echo ${VERSION} |cut -d. -f1) +BUILD=${BUILD:-1} +TAG=${TAG:-SBo} + +# Automatically determine the architecture we're building on: +if [ -z "$ARCH" ]; then + case "$(uname -m)" in + i?86) ARCH=i586 ;; + arm*) readelf /usr/bin/file -A | egrep -q "Tag_CPU.*[4,5]" && ARCH=arm || ARCH=armv7hl ;; + # Unless $ARCH is already set, use uname -m for all other archs: + *) ARCH=$(uname -m) ;; + esac + export ARCH +fi + +CWD=$(pwd) +TMP=${TMP:-/tmp/SBo} +PKG=$TMP/package-$PRGNAM +OUTPUT=${OUTPUT:-/tmp} + +if [ "$ARCH" = "i386" ]; then + SLKCFLAGS="-O2 -march=i386 -mcpu=i686" + SLKLDFLAGS="" + LIBDIRSUFFIX="" + LIB_ARCH=i386 +elif [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + SLKLDFLAGS="" + LIBDIRSUFFIX="" + LIB_ARCH=i386 +elif [ "$ARCH" = "i586" ]; then + SLKCFLAGS="-O2 -march=i586 -mtune=i686" + SLKLDFLAGS="" + LIBDIRSUFFIX="" + LIB_ARCH=i386 +elif [ "$ARCH" = "i686" ]; then + SLKCFLAGS="-O2 -march=i686" + SLKLDFLAGS="" + LIBDIRSUFFIX="" + LIB_ARCH=i386 +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + SLKLDFLAGS="" + LIBDIRSUFFIX="" + LIB_ARCH=s390 +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + SLKLDFLAGS="-L/usr/lib64" + LIBDIRSUFFIX="64" + LIB_ARCH=amd64 +elif [ "$ARCH" = "armv7hl" ]; then + SLKCFLAGS="-O3 -march=armv7-a -mfpu=vfpv3-d16" + SLKLDFLAGS="" + LIBDIRSUFFIX="" + LIB_ARCH=armv7hl +else + SLKCFLAGS="-O2" + SLKLDFLAGS="" + LIBDIRSUFFIX="" + LIB_ARCH=$ARCH +fi + +# What do we want to build +LANGS=${LANGS:-'c,c++,java'} + +echo "Building these compilers: $LANGS" + +case "$ARCH" in + arm*) TARGET=$ARCH-slackware-linux-gnueabi ;; + *) TARGET=$ARCH-slackware-linux ;; +esac + +if [ "$ARCH" = "x86_64" ]; then + if [ -f /usr/lib/libc.a ]; then + # If we find a 32bit C library on 64bit Slackware, assume multilib: + GCC_ARCHOPTS="--enable-multilib" + MULTILIB="YES" + else + GCC_ARCHOPTS="--disable-multilib" + MULTILIB="NO" + fi +else + GCC_ARCHOPTS="--with-arch=$ARCH" + MULTILIB="NO" +fi + +# Clear the build locations: +rm -fr $TMP/fastjar-* $TMP/gcc-$VERSION $TMP/gcc.build.lnx $TMP/gcc.build.log $TMP/package-$PRGNAM + +mkdir -p $PKG/usr/doc/gcc-$VERSION + +# Insert package description: +mkdir -p $PKG/install +if [ ${MULTILIB} = "YES" ]; then + SLDESC=" The compilers support multilib." +else + SLDESC="" +fi +cat $CWD/slack-desc.gcc5 | sed -e "s/@MULTILIB@/${SLDESC}/" \ + > $PKG/install/slack-desc + +# Unpack the gcc sources: +cd $TMP +tar xvf $CWD/gcc-$VERSION.tar.?z || exit 1 + +# Patches based inside the gcc directory go here: +#( cd gcc-$VERSION/gcc +# #cat $CWD/patches/gcc.66782.diff | patch -p0 --verbose || exit 1 +#) || exit 1 + +# Copy ecj.jar into the TLD of the source. Needed for java compiler. +# This can be retrieved from ftp://sourceware.org/pub/java +cp $CWD/ecj-4.9.jar gcc-$VERSION/ecj.jar + +# Use an antlr runtime to compile javadoc. +# The runtime can be obtained from: +#https://oss.sonatype.org/content/repositories/releases/org/antlr/antlr-runtime/ +ANTLJAR=$(echo $CWD/antlr-*.jar | tail -1) + +# install docs +( cd gcc-$VERSION + # Smite the fixincludes: + cat $CWD/patches/gcc-no_fixincludes.diff | patch -p1 --verbose --backup --suffix=.orig || exit 1 + + # Add retpoline support: + cat $CWD/patches/0001-i386-Move-struct-ix86_frame-to-machine_function.diff | patch -p2 --verbose || exit 1 + cat $CWD/patches/0002-i386-Use-reference-of-struct-ix86_frame-to-avoid-cop.diff | patch -p2 --verbose || exit 1 + cat $CWD/patches/0003-i386-More-use-reference-of-struct-ix86_frame-to-avoi.diff | patch -p2 --verbose || exit 1 + cat $CWD/patches/0004-i386-Don-t-use-reference-of-struct-ix86_frame.diff | patch -p2 --verbose || exit 1 + cat $CWD/patches/0005-x86-Add-mindirect-branch-doc.diff | patch -p2 --verbose || exit 1 + cat $CWD/patches/0005-x86-Add-mindirect-branch.diff | patch -p2 --verbose || exit 1 + cat $CWD/patches/0006-x86-Add-mfunction-return-doc.diff | patch -p2 --verbose || exit 1 + cat $CWD/patches/0006-x86-Add-mfunction-return.diff | patch -p2 --verbose || exit 1 + cat $CWD/patches/0007-x86-Add-mindirect-branch-register-doc.diff | patch -p2 --verbose || exit 1 + cat $CWD/patches/0007-x86-Add-mindirect-branch-register.diff | patch -p2 --verbose || exit 1 + cat $CWD/patches/0008-x86-Add-V-register-operand-modifier-doc.diff | patch -p2 --verbose || exit 1 + cat $CWD/patches/0008-x86-Add-V-register-operand-modifier.diff | patch -p2 --verbose || exit 1 + cat $CWD/patches/0009-x86-Disallow-mindirect-branch-mfunction-return-with-.diff | patch -p2 --verbose || exit 1 + cat $CWD/patches/0009-x86-Disallow-mindirect-branch-mfunction-return-with-doc.diff | patch -p2 --verbose || exit 1 + + # Fix perms/owners + chown -R root:root . + find . -perm 777 -exec chmod 755 {} \; + find . -perm 775 -exec chmod 755 {} \; + find . -perm 754 -exec chmod 755 {} \; + find . -perm 664 -exec chmod 644 {} \; + mkdir -p $PKG/usr/doc/gcc-$VERSION + cp -a \ + COPYING* ChangeLog* FAQ INSTALL \ + LAST_UPDATED MAINTAINERS NEWS \ + README* *.html \ + $PKG/usr/doc/gcc-$VERSION + + # We will keep part of these, but they are really big... + if [ -r ChangeLog ]; then + DOCSDIR=$(echo $PKG/usr/doc/gcc-$VERSION) + cat ChangeLog | head -n 1000 > $DOCSDIR/ChangeLog + touch -r ChangeLog $DOCSDIR/ChangeLog + fi + if [ -r NEWS ]; then + DOCSDIR=$(echo $PKG/usr/doc/gcc-$VERSION) + cat NEWS | head -n 1000 > $DOCSDIR/NEWS + touch -r NEWS $DOCSDIR/NEWS + fi + + mkdir -p $PKG/usr/doc/gcc-${VERSION}/gcc + ( cd gcc + cp -a \ + ABOUT* COPYING* DATESTAMP DEV-PHASE LANG* ONEWS README* SERVICE \ + $PKG/usr/doc/gcc-$VERSION/gcc + + mkdir -p $PKG/usr/doc/gcc-${VERSION}/gcc/java + ( cd java + cp -a \ + ChangeLog.tree-ssa \ + $PKG/usr/doc/gcc-${VERSION}/gcc/java + if [ -r ChangeLog ]; then + cat ChangeLog | head -n 1000 > $PKG/usr/doc/gcc-${VERSION}/gcc/java/ChangeLog + touch -r ChangeLog $PKG/usr/doc/gcc-${VERSION}/gcc/java/ChangeLog + fi + ) + + ) || exit 1 + + mkdir -p $PKG/usr/doc/gcc-${VERSION}/libffi + ( cd libffi + cp -a \ + ChangeLog.libgcj ChangeLog.v1 \ + LICENSE* README* \ + $PKG/usr/doc/gcc-${VERSION}/libffi + if [ -r ChangeLog ]; then + cat ChangeLog | head -n 1000 > $PKG/usr/doc/gcc-${VERSION}/libffi/ChangeLog + touch -r ChangeLog $PKG/usr/doc/gcc-${VERSION}/libffi/ChangeLog + fi + ) + + mkdir -p $PKG/usr/doc/gcc-${VERSION}/libjava + ( cd libjava + cp -a \ + COPYING* HACKING LIBGCJ_LICENSE \ + NEWS README* THANKS \ + $PKG/usr/doc/gcc-${VERSION}/libjava + if [ -r ChangeLog ]; then + cat ChangeLog | head -n 1000 > $PKG/usr/doc/gcc-${VERSION}/libjava/ChangeLog + touch -r ChangeLog $PKG/usr/doc/gcc-${VERSION}/libjava/ChangeLog + fi + ) + + if [ -d libmudflap ]; then + mkdir -p $PKG/usr/doc/gcc-${VERSION}/libmudflap + ( cd libmudflap + if [ -r ChangeLog ]; then + cat ChangeLog | head -n 1000 > $PKG/usr/doc/gcc-${VERSION}/libmudflap/ChangeLog + touch -r ChangeLog $PKG/usr/doc/gcc-${VERSION}/libmudflap/ChangeLog + fi + ) + fi + + mkdir -p $PKG/usr/doc/gcc-${VERSION}/libgomp + ( cd libgomp + if [ -r ChangeLog ]; then + cat ChangeLog | head -n 1000 > $PKG/usr/doc/gcc-${VERSION}/libgomp/ChangeLog + touch -r ChangeLog $PKG/usr/doc/gcc-${VERSION}/libgomp/ChangeLog + fi + ) + + mkdir -p $PKG/usr/doc/gcc-${VERSION}/libstdc++-v3 + ( cd libstdc++-v3 + cp -a \ + README* \ + doc/html/faq.html \ + $PKG/usr/doc/gcc-${VERSION}/libstdc++-v3 + if [ -r ChangeLog ]; then + cat ChangeLog | head -n 1000 > $PKG/usr/doc/gcc-${VERSION}/libstdc++-v3/ChangeLog + touch -r ChangeLog $PKG/usr/doc/gcc-${VERSION}/libstdc++-v3/ChangeLog + fi + ) +) + +# Add fastjar to the gcc5 package: +( cd $TMP + FASTJARVER=$(echo $CWD/fastjar-*.tar.?z* | rev | cut -f 3- -d . | cut -f 1 -d - | rev) + echo + echo "Building fastjar-$FASTJARVER first" + echo + rm -rf fastjar-$FASTJARVER + tar xvf $CWD/fastjar-$FASTJARVER.tar.?z* || exit 1 + cd fastjar-$FASTJARVER || exit 1 + chown -R root:root . + find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + for patch in $CWD/fastjar-patches/* ; do + cat $patch | patch -p1 --verbose || exit 1 + done + LDFLAGS="$SLKLDFLAGS" \ + CFLAGS="$SLKCFLAGS" \ + CXXFLAGS="$SLKCFLAGS" \ + ./configure \ + --prefix=/usr \ + --libdir=/usr/lib$LIBDIRSUFFIX \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --build=$TARGET + make || exit 1 + make install DESTDIR=$PKG || exit 1 + mkdir -p $PKG/usr/doc/fastjar-$FASTJARVER + cp -a \ + AUTHORS CHANGES COPYING* INSTALL NEWS README* TODO \ + $PKG/usr/doc/fastjar-$FASTJARVER + # If there's a ChangeLog, installing at least part of the recent history + # is useful, but don't let it get totally out of control: + if [ -r ChangeLog ]; then + DOCSDIR=$(echo $PKG/usr/doc/fastjar-$FASTJARVER) + cat ChangeLog | head -n 1000 > $DOCSDIR/ChangeLog + touch -r ChangeLog $DOCSDIR/ChangeLog + fi + find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \ + | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + # Compress and if needed symlink the man pages: + if [ -d $PKG/usr/man ]; then + ( cd $PKG/usr/man + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.? + ) + done + ) + fi + # Compress info files, if any: + if [ -d $PKG/usr/info ]; then + ( cd $PKG/usr/info + rm -f dir + gzip -9 * + ) + fi + echo +) || exit 1 + +# build gcc +( mkdir gcc.build.lnx; + cd gcc.build.lnx; + + # I think it's incorrect to include this option (as it'll end up set + # to i586 on x86 platforms), and we want to tune the binary structure + # for i686, as that's where almost all of the optimization speedups + # are to be found. + # Correct me if my take on this is wrong. + # --with-cpu=$ARCH + + # NOTE: For Slackware 15.0, look into removing --with-default-libstdcxx-abi=gcc4-compatible, + # which will then require rebuilding all C++ libraries. That is, if there's any benefit. + + LDFLAGS="$SLKLDFLAGS" \ + CFLAGS="$SLKCFLAGS" \ + CXXFLAGS="$SLKCFLAGS" \ + ../gcc-$VERSION/configure \ + --prefix=/usr \ + --libdir=/usr/lib$LIBDIRSUFFIX \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --enable-shared \ + --enable-bootstrap \ + --enable-languages=${LANGS} \ + --enable-threads=posix \ + --enable-checking=release \ + --enable-objc-gc \ + --with-system-zlib \ + --with-python-dir=/lib$LIBDIRSUFFIX/python2.7/site-packages \ + --enable-libstdcxx-dual-abi \ + --with-default-libstdcxx-abi=gcc4-compatible \ + --disable-libunwind-exceptions \ + --enable-__cxa_atexit \ + --enable-libssp \ + --enable-lto \ + --disable-install-libiberty \ + --with-gnu-ld \ + --verbose \ + --enable-java-home \ + --with-java-home=/usr/lib$LIBDIRSUFFIX/jvm/jre \ + --with-jvm-root-dir=/usr/lib$LIBDIRSUFFIX/jvm \ + --with-jvm-jar-dir=/usr/lib$LIBDIRSUFFIX/jvm/jvm-exports \ + --with-arch-directory=$LIB_ARCH \ + --with-antlr-jar=$ANTLJAR \ + --program-suffix=-${MAJVER} \ + --enable-version-specific-runtime-libs \ + $GCC_ARCHOPTS \ + --target=${TARGET} \ + --build=${TARGET} \ + --host=${TARGET} || exit 1 + #--enable-java-awt=gtk \ + #--disable-gtktest \ + + # Start the build: + + # Include all debugging info (for now): + make bootstrap + make info + make install DESTDIR=$PKG + +# KLUDGE ALERT +# These *gdb.py files are causing ldconfig to complain, so they are going +# to be REMOVED for now... at some point, they might be moved somewhere +# else, in which case things should Just Work(tm). Keep an eye on it. +rm -f $PKG/usr/lib*/*gdb.py + +# Be sure the "specs" file is installed. +if [ ! -r $PKG/usr/lib${LIBDIRSUFFIX}/gcc/${TARGET}/${VERSION}/specs ]; then + cat stage1-gcc/specs > $PKG/usr/lib${LIBDIRSUFFIX}/gcc/${TARGET}/${VERSION}/specs +fi + +if [ ${MULTILIB} = "NO" ]; then + # Make our 64bit gcc look for 32bit gcc binaries in ./32 subdirectory: + (only needed if gcc was compiled with disable-multilib) + if [ "$ARCH" = "x86_64" ]; then + sed -i 's#;.\(:../lib !m64 m32;\)$#;32\1#' \ + $PKG/usr/lib${LIBDIRSUFFIX}/gcc/${TARGET}/${VERSION}/specs + fi +fi + +make -i install-info DESTDIR=$PKG + +# Move potentially conflicting stuff to version specific subdirectory: +if [ -d $PKG/usr/lib${LIBDIRSUFFIX} ]; then + mv $PKG/usr/lib${LIBDIRSUFFIX}/lib* $PKG/usr/lib${LIBDIRSUFFIX}/gcc/${TARGET}/${VERSION}/ +fi +if [ -d $PKG/usr/lib${LIBDIRSUFFIX}/gcc/${TARGET}/lib${LIBDIRSUFFIX}/ ]; then + mv $PKG/usr/lib${LIBDIRSUFFIX}/gcc/${TARGET}/lib${LIBDIRSUFFIX}/lib* $PKG/usr/lib${LIBDIRSUFFIX}/gcc/${TARGET}/${VERSION}/ +fi +chmod 755 $PKG/usr/lib${LIBDIRSUFFIX}/gcc/${TARGET}/${VERSION}/libgcc_s.so.1 +if [ ${MULTILIB} = "YES" ]; then + if [ -d $PKG/usr/lib ]; then + mv $PKG/usr/lib/lib* $PKG/usr/lib/gcc/${TARGET}/${VERSION}/ + fi + if [ -d $PKG/usr/lib/gcc/${TARGET}/lib/ ]; then + mv $PKG/usr/lib/gcc/${TARGET}/lib/lib* $PKG/usr/lib/gcc/${TARGET}/${VERSION}/ + fi + chmod 755 $PKG/usr/lib/gcc/${TARGET}/${VERSION}/libgcc_s.so.1 +fi + +# The (huge) static GNU java libraries are not packaged. In nearly all +# cases one or more dependencies will not be available as static anyway. +rm -f $PKG/usr/lib${LIBDIRSUFFIX}/libgcj.a +rm -f $PKG/usr/lib${LIBDIRSUFFIX}/libgcj-tools.a +rm -f $PKG/usr/lib/libgcj.a +rm -f $PKG/usr/lib/libgcj-tools.a + +# Fix stuff up: +( cd $PKG/usr/info + rm dir + for eachinfo in *.info ; do + mv $eachinfo $(basename $eachinfo .info)-${MAJVER}.info + done + gzip -9 * +) + +( cd $PKG/usr/bin + ln -sf g++-${MAJVER} c++-${MAJVER} + ln -sf gcc-${MAJVER} cc-${MAJVER} + # Improved versions of the Slackware c?9 scripts, + # it is safe to overwrite the originals: + cat $CWD/c89.sh > c89 + cat $CWD/c99.sh > c99 + chmod 755 c89 c99 +) + +( cd $PKG/usr/man + rm -r man7 # Part of the system gcc package + gzip -9 */* + cd man1 + ln -sf g++-${MAJVER}.1.gz c++-${MAJVER}.1.gz + ln -sf gcc-${MAJVER}.1.gz cc-${MAJVER}.1.gz +) + +# keep a log +) 2>&1 | tee $TMP/gcc.build.log + +# Add profile scripts (non-executable by default) to make it easier +# to set the environment for compiling with gcc5: +mkdir -p $PKG/etc/profile.d +cat $CWD/profile.d/gcc5.sh > $PKG/etc/profile.d/gcc5.sh +cat $CWD/profile.d/gcc5.csh > $PKG/etc/profile.d/gcc5.csh +chmod 644 $PKG/etc/profile.d/* + +# The ecj wrapper script: +cat $CWD/ecj.sh | sed -e "s,@JAVADIR@,/usr/share/java," > $PKG/usr/bin/ecj +chmod 755 $PKG/usr/bin/ecj +# Some compatibility links. +for JAVAPROG in gcj gcjh gcj-dbtool gjar gjarsigner gjavah ; do + ln -s ${JAVAPROG}-${MAJVER} $PKG/usr/bin/${JAVAPROG} +done +( cd $PKG + for JAVALIB in usr/lib${LIBDIRSUFFIX}/gcc/${TARGET}/${VERSION}/libgcj* ; do + ln -s /${JAVALIB} $PKG/usr/lib${LIBDIRSUFFIX}/ + done +) +# And add the missing javac symlink: +ln -s ../../../bin/ecj $PKG/usr/lib$LIBDIRSUFFIX/jvm/bin/javac +# Don't package libffi stuff anymore. GCC will link the internal version +# statically, and we'll need a newer one elsewhere. +find . -name "ffi*.h" | xargs rm -f +find . -name "libffi*" | xargs rm -f +rm -f usr/man/man3/ffi* +rm -f usr/info/libffi* +# Install a proper pkgconfig file for libgcj: +rm $PKG/usr/lib${LIBDIRSUFFIX}/gcc/${TARGET}/${VERSION}/pkgconfig/libgcj*pc +rm $PKG/usr/lib${LIBDIRSUFFIX}/gcc/${TARGET}/${VERSION}/32/pkgconfig/libgcj*pc +mkdir -p $PKG/usr/lib${LIBDIRSUFFIX}/pkgconfig +cat $CWD/libgcj-5.pc \ + | sed -e "s,@LIBDIRSUFFIX@,${LIBDIRSUFFIX}," \ + | sed -e "s,@TARGET@,${TARGET}," \ + | sed -e "s,@VERSION@,${VERSION}," \ + > $PKG/usr/lib${LIBDIRSUFFIX}/pkgconfig/libgcj-5.pc + +# Filter all .la files (thanks much to Mark Post for the sed script): +( cd $PKG + for file in $(find . -type f -name "*.la") ; do + cat $file | sed -e 's%-L'${TMP}'[[:graph:]]* % %g' > $TMP/tmp-la-file + cat $TMP/tmp-la-file > $file + done + rm $TMP/tmp-la-file +) + +## Strip bloated binaries and libraries: +( cd $PKG + find . -name "lib*so*" -exec strip --strip-unneeded "{}" \; + find . -name "lib*a" -exec strip -g "{}" \; + strip --strip-unneeded usr/bin/* 2> /dev/null + find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null +) + +# Remove localizations overlapping with Slackware's gcc +rm -rf $PKG/usr/share/locale + +( cd $PKG + if [ ${MULTILIB} = "YES" ]; then + /sbin/makepkg -l y -c n $OUTPUT/${PRGNAM}-${VERSION}_multilib-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz} + else + /sbin/makepkg -l y -c n $OUTPUT/${PRGNAM}-${VERSION}-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz} + fi +) diff --git a/development/gcc5/gcc5.info b/development/gcc5/gcc5.info new file mode 100644 index 0000000000..cb7d761a98 --- /dev/null +++ b/development/gcc5/gcc5.info @@ -0,0 +1,17 @@ +PRGNAM="gcc5" +VERSION="5.5.0" +HOMEPAGE="https://gcc.gnu.org/" +DOWNLOAD="https://ftp.gnu.org/gnu/gcc/gcc-5.5.0/gcc-5.5.0.tar.xz \ + http://www.antlr3.org/download/antlr-runtime-3.4.jar \ + https://sourceware.org/pub/java/ecj-4.9.jar \ + https://download.savannah.gnu.org/releases/fastjar/fastjar-0.97.tar.gz" +MD5SUM="0f70424213b4a1113c04ba66ddda0c1f \ + 0e0318be407e51fdf7ba6777eabfdf73 \ + 7339f199ba11c941890031fd9981d7be \ + 2659f09c2e43ef8b7d4406321753f1b2" +DOWNLOAD_x86_64="" +MD5SUM_x86_64="" +REQUIRES="" +MAINTAINER="Eric Hameleers" +EMAIL="alien@slackware.com" + diff --git a/development/gcc5/libgcj-5.pc b/development/gcc5/libgcj-5.pc new file mode 100644 index 0000000000..e2eb293209 --- /dev/null +++ b/development/gcc5/libgcj-5.pc @@ -0,0 +1,10 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=/usr/lib@LIBDIRSUFFIX@/gcc/@TARGET@/@VERSION@ +includedir=$(libdir)/include/ + +Name: libgcj +Description: libgcj +Version: @VERSION@ +Libs: -L${libdir} -lgcj +Cflags: -I${includedir} diff --git a/development/gcc5/patches/0001-i386-Move-struct-ix86_frame-to-machine_function.diff b/development/gcc5/patches/0001-i386-Move-struct-ix86_frame-to-machine_function.diff new file mode 100644 index 0000000000..413d75697f --- /dev/null +++ b/development/gcc5/patches/0001-i386-Move-struct-ix86_frame-to-machine_function.diff @@ -0,0 +1,239 @@ +From 11a3b9034935080b9996caf07fca6353309006f1 Mon Sep 17 00:00:00 2001 +From: hjl +Date: Mon, 15 Jan 2018 11:27:24 +0000 +Subject: [PATCH 1/9] i386: Move struct ix86_frame to machine_function + +Make ix86_frame available to i386 code generation. This is needed to +backport the patch set of -mindirect-branch= to mitigate variant #2 of +the speculative execution vulnerabilities on x86 processors identified +by CVE-2017-5715, aka Spectre. + + Backport from mainline + * config/i386/i386.c (ix86_frame): Moved to ... + * config/i386/i386.h (ix86_frame): Here. + (machine_function): Add frame. + * config/i386/i386.c (ix86_compute_frame_layout): Repace the + frame argument with &cfun->machine->frame. + (ix86_can_use_return_insn_p): Don't pass &frame to + ix86_compute_frame_layout. Copy frame from cfun->machine->frame. + (ix86_can_eliminate): Likewise. + (ix86_expand_prologue): Likewise. + (ix86_expand_epilogue): Likewise. + (ix86_expand_split_stack_prologue): Likewise. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256691 138bc75d-0d04-0410-961f-82ee72b054a4 +--- + src/gcc/config/i386/i386.c | 68 ++++++++------------------------------------- + src/gcc/config/i386/i386.h | 53 ++++++++++++++++++++++++++++++++++- + 2 files changed, 65 insertions(+), 56 deletions(-) + +Index: b/src/gcc/config/i386/i386.c +=================================================================== +--- a/src/gcc/config/i386/i386.c ++++ b/src/gcc/config/i386/i386.c +@@ -2306,53 +2306,6 @@ struct GTY(()) stack_local_entry { + struct stack_local_entry *next; + }; + +-/* Structure describing stack frame layout. +- Stack grows downward: +- +- [arguments] +- <- ARG_POINTER +- saved pc +- +- saved static chain if ix86_static_chain_on_stack +- +- saved frame pointer if frame_pointer_needed +- <- HARD_FRAME_POINTER +- [saved regs] +- <- regs_save_offset +- [padding0] +- +- [saved SSE regs] +- <- sse_regs_save_offset +- [padding1] | +- | <- FRAME_POINTER +- [va_arg registers] | +- | +- [frame] | +- | +- [padding2] | = to_allocate +- <- STACK_POINTER +- */ +-struct ix86_frame +-{ +- int nsseregs; +- int nregs; +- int va_arg_size; +- int red_zone_size; +- int outgoing_arguments_size; +- +- /* The offsets relative to ARG_POINTER. */ +- HOST_WIDE_INT frame_pointer_offset; +- HOST_WIDE_INT hard_frame_pointer_offset; +- HOST_WIDE_INT stack_pointer_offset; +- HOST_WIDE_INT hfp_save_offset; +- HOST_WIDE_INT reg_save_offset; +- HOST_WIDE_INT sse_reg_save_offset; +- +- /* When save_regs_using_mov is set, emit prologue using +- move instead of push instructions. */ +- bool save_regs_using_mov; +-}; +- + /* Which cpu are we scheduling for. */ + enum attr_cpu ix86_schedule; + +@@ -2443,7 +2396,7 @@ static unsigned int ix86_function_arg_bo + const_tree); + static rtx ix86_static_chain (const_tree, bool); + static int ix86_function_regparm (const_tree, const_tree); +-static void ix86_compute_frame_layout (struct ix86_frame *); ++static void ix86_compute_frame_layout (void); + static bool ix86_expand_vector_init_one_nonzero (bool, machine_mode, + rtx, rtx, int); + static void ix86_add_new_builtins (HOST_WIDE_INT); +@@ -9664,7 +9617,8 @@ ix86_can_use_return_insn_p (void) + if (crtl->args.pops_args && crtl->args.size >= 32768) + return 0; + +- ix86_compute_frame_layout (&frame); ++ ix86_compute_frame_layout (); ++ frame = cfun->machine->frame; + return (frame.stack_pointer_offset == UNITS_PER_WORD + && (frame.nregs + frame.nsseregs) == 0); + } +@@ -10073,8 +10027,8 @@ ix86_can_eliminate (const int from, cons + HOST_WIDE_INT + ix86_initial_elimination_offset (int from, int to) + { +- struct ix86_frame frame; +- ix86_compute_frame_layout (&frame); ++ ix86_compute_frame_layout (); ++ struct ix86_frame frame = cfun->machine->frame; + + if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM) + return frame.hard_frame_pointer_offset; +@@ -10113,8 +10067,9 @@ ix86_builtin_setjmp_frame_value (void) + /* Fill structure ix86_frame about frame of currently computed function. */ + + static void +-ix86_compute_frame_layout (struct ix86_frame *frame) ++ix86_compute_frame_layout (void) + { ++ struct ix86_frame *frame = &cfun->machine->frame; + unsigned HOST_WIDE_INT stack_alignment_needed; + HOST_WIDE_INT offset; + unsigned HOST_WIDE_INT preferred_alignment; +@@ -11417,7 +11372,8 @@ ix86_expand_prologue (void) + m->fs.sp_offset = INCOMING_FRAME_SP_OFFSET; + m->fs.sp_valid = true; + +- ix86_compute_frame_layout (&frame); ++ ix86_compute_frame_layout (); ++ frame = m->frame; + + if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl)) + { +@@ -12083,7 +12039,8 @@ ix86_expand_epilogue (int style) + bool using_drap; + + ix86_finalize_stack_realign_flags (); +- ix86_compute_frame_layout (&frame); ++ ix86_compute_frame_layout (); ++ frame = m->frame; + + m->fs.sp_valid = (!frame_pointer_needed + || (crtl->sp_is_unchanging +@@ -12546,7 +12503,8 @@ ix86_expand_split_stack_prologue (void) + gcc_assert (flag_split_stack && reload_completed); + + ix86_finalize_stack_realign_flags (); +- ix86_compute_frame_layout (&frame); ++ ix86_compute_frame_layout (); ++ frame = cfun->machine->frame; + allocate = frame.stack_pointer_offset - INCOMING_FRAME_SP_OFFSET; + + /* This is the label we will branch to if we have enough stack +Index: b/src/gcc/config/i386/i386.h +=================================================================== +--- a/src/gcc/config/i386/i386.h ++++ b/src/gcc/config/i386/i386.h +@@ -2409,9 +2409,56 @@ enum avx_u128_state + + #define FASTCALL_PREFIX '@' + ++#ifndef USED_FOR_TARGET ++/* Structure describing stack frame layout. ++ Stack grows downward: ++ ++ [arguments] ++ <- ARG_POINTER ++ saved pc ++ ++ saved static chain if ix86_static_chain_on_stack ++ ++ saved frame pointer if frame_pointer_needed ++ <- HARD_FRAME_POINTER ++ [saved regs] ++ <- regs_save_offset ++ [padding0] ++ ++ [saved SSE regs] ++ <- sse_regs_save_offset ++ [padding1] | ++ | <- FRAME_POINTER ++ [va_arg registers] | ++ | ++ [frame] | ++ | ++ [padding2] | = to_allocate ++ <- STACK_POINTER ++ */ ++struct GTY(()) ix86_frame ++{ ++ int nsseregs; ++ int nregs; ++ int va_arg_size; ++ int red_zone_size; ++ int outgoing_arguments_size; ++ ++ /* The offsets relative to ARG_POINTER. */ ++ HOST_WIDE_INT frame_pointer_offset; ++ HOST_WIDE_INT hard_frame_pointer_offset; ++ HOST_WIDE_INT stack_pointer_offset; ++ HOST_WIDE_INT hfp_save_offset; ++ HOST_WIDE_INT reg_save_offset; ++ HOST_WIDE_INT sse_reg_save_offset; ++ ++ /* When save_regs_using_mov is set, emit prologue using ++ move instead of push instructions. */ ++ bool save_regs_using_mov; ++}; ++ + /* Machine specific frame tracking during prologue/epilogue generation. */ + +-#ifndef USED_FOR_TARGET + struct GTY(()) machine_frame_state + { + /* This pair tracks the currently active CFA as reg+offset. When reg +@@ -2457,6 +2504,9 @@ struct GTY(()) machine_function { + int varargs_fpr_size; + int optimize_mode_switching[MAX_386_ENTITIES]; + ++ /* Cached initial frame layout for the current function. */ ++ struct ix86_frame frame; ++ + /* Number of saved registers USE_FAST_PROLOGUE_EPILOGUE + has been computed for. */ + int use_fast_prologue_epilogue_nregs; +@@ -2524,6 +2574,7 @@ struct GTY(()) machine_function { + #define ix86_current_function_calls_tls_descriptor \ + (ix86_tls_descriptor_calls_expanded_in_cfun && df_regs_ever_live_p (SP_REG)) + #define ix86_static_chain_on_stack (cfun->machine->static_chain_on_stack) ++#define ix86_red_zone_size (cfun->machine->frame.red_zone_size) + + /* Control behavior of x86_file_start. */ + #define X86_FILE_START_VERSION_DIRECTIVE false diff --git a/development/gcc5/patches/0002-i386-Use-reference-of-struct-ix86_frame-to-avoid-cop.diff b/development/gcc5/patches/0002-i386-Use-reference-of-struct-ix86_frame-to-avoid-cop.diff new file mode 100644 index 0000000000..7b928df765 --- /dev/null +++ b/development/gcc5/patches/0002-i386-Use-reference-of-struct-ix86_frame-to-avoid-cop.diff @@ -0,0 +1,72 @@ +From 18202ba32cb8de22fc43a5839235a751d0f5c4d9 Mon Sep 17 00:00:00 2001 +From: hjl +Date: Mon, 15 Jan 2018 11:28:44 +0000 +Subject: [PATCH 2/9] i386: Use reference of struct ix86_frame to avoid copy + +When there is no need to make a copy of ix86_frame, we can use reference +of struct ix86_frame to avoid copy. + + Backport from mainline + * config/i386/i386.c (ix86_can_use_return_insn_p): Use reference + of struct ix86_frame. + (ix86_initial_elimination_offset): Likewise. + (ix86_expand_split_stack_prologue): Likewise. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256692 138bc75d-0d04-0410-961f-82ee72b054a4 +--- + gcc/config/i386/i386.c | 9 +++------ + gcc/testsuite/ChangeLog | 8 ++++++++ + 2 files changed, 11 insertions(+), 6 deletions(-) + +diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c +index 8133372..397ef7c 100644 +--- a/src/gcc/config/i386/i386.c ++++ b/src/gcc/config/i386/i386.c +@@ -11843,8 +11843,6 @@ symbolic_reference_mentioned_p (rtx op) + bool + ix86_can_use_return_insn_p (void) + { +- struct ix86_frame frame; +- + if (! reload_completed || frame_pointer_needed) + return 0; + +@@ -11857,7 +11855,7 @@ ix86_can_use_return_insn_p (void) + return 0; + + ix86_compute_frame_layout (); +- frame = cfun->machine->frame; ++ struct ix86_frame &frame = cfun->machine->frame; + return (frame.stack_pointer_offset == UNITS_PER_WORD + && (frame.nregs + frame.nsseregs) == 0); + } +@@ -12344,7 +12342,7 @@ HOST_WIDE_INT + ix86_initial_elimination_offset (int from, int to) + { + ix86_compute_frame_layout (); +- struct ix86_frame frame = cfun->machine->frame; ++ struct ix86_frame &frame = cfun->machine->frame; + + if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM) + return frame.hard_frame_pointer_offset; +@@ -14860,7 +14858,6 @@ static GTY(()) rtx split_stack_fn_large; + void + ix86_expand_split_stack_prologue (void) + { +- struct ix86_frame frame; + HOST_WIDE_INT allocate; + unsigned HOST_WIDE_INT args_size; + rtx_code_label *label; +@@ -14873,7 +14870,7 @@ ix86_expand_split_stack_prologue (void) + + ix86_finalize_stack_realign_flags (); + ix86_compute_frame_layout (); +- frame = cfun->machine->frame; ++ struct ix86_frame &frame = cfun->machine->frame; + allocate = frame.stack_pointer_offset - INCOMING_FRAME_SP_OFFSET; + + /* This is the label we will branch to if we have enough stack +-- +2.7.4 + diff --git a/development/gcc5/patches/0003-i386-More-use-reference-of-struct-ix86_frame-to-avoi.diff b/development/gcc5/patches/0003-i386-More-use-reference-of-struct-ix86_frame-to-avoi.diff new file mode 100644 index 0000000000..f6f30d1d22 --- /dev/null +++ b/development/gcc5/patches/0003-i386-More-use-reference-of-struct-ix86_frame-to-avoi.diff @@ -0,0 +1,59 @@ +From 839ca2d69157ef03c8df0ab912dacdb991738694 Mon Sep 17 00:00:00 2001 +From: hjl +Date: Mon, 15 Jan 2018 11:33:42 +0000 +Subject: [PATCH 3/9] i386: More use reference of struct ix86_frame to avoid copy + +When there is no need to make a copy of ix86_frame, we can use reference +of struct ix86_frame to avoid copy. + + Backport from mainline + * config/i386/i386.c (ix86_expand_prologue): Use reference of + struct ix86_frame. + (ix86_expand_epilogue): Likewise. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256695 138bc75d-0d04-0410-961f-82ee72b054a4 +--- + gcc/ChangeLog | 7 +++++++ + gcc/config/i386/i386.c | 6 ++---- + 2 files changed, 9 insertions(+), 4 deletions(-) + +diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c +index 397ef7c..986e6d7 100644 +--- a/src/gcc/config/i386/i386.c ++++ b/src/gcc/config/i386/i386.c +@@ -13667,7 +13667,6 @@ ix86_expand_prologue (void) + { + struct machine_function *m = cfun->machine; + rtx insn, t; +- struct ix86_frame frame; + HOST_WIDE_INT allocate; + bool int_registers_saved; + bool sse_registers_saved; +@@ -13691,7 +13690,7 @@ ix86_expand_prologue (void) + m->fs.sp_valid = true; + + ix86_compute_frame_layout (); +- frame = m->frame; ++ struct ix86_frame &frame = cfun->machine->frame; + + if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl)) + { +@@ -14354,13 +14353,12 @@ ix86_expand_epilogue (int style) + { + struct machine_function *m = cfun->machine; + struct machine_frame_state frame_state_save = m->fs; +- struct ix86_frame frame; + bool restore_regs_via_mov; + bool using_drap; + + ix86_finalize_stack_realign_flags (); + ix86_compute_frame_layout (); +- frame = m->frame; ++ struct ix86_frame &frame = cfun->machine->frame; + + m->fs.sp_valid = (!frame_pointer_needed + || (crtl->sp_is_unchanging +-- +2.7.4 + diff --git a/development/gcc5/patches/0004-i386-Don-t-use-reference-of-struct-ix86_frame.diff b/development/gcc5/patches/0004-i386-Don-t-use-reference-of-struct-ix86_frame.diff new file mode 100644 index 0000000000..7678444cd7 --- /dev/null +++ b/development/gcc5/patches/0004-i386-Don-t-use-reference-of-struct-ix86_frame.diff @@ -0,0 +1,63 @@ +From c25b81ba01fa9ac0c1baa3aabd64190c47928f03 Mon Sep 17 00:00:00 2001 +From: hjl +Date: Tue, 16 Jan 2018 12:49:29 +0000 +Subject: [PATCH 4/9] i386: Don't use reference of struct ix86_frame + +Use reference of struct ix86_frame in ix86_expand_prologue and +ix86_expand_epilogue caused: + +raised STORAGE_ERROR : stack overflow or erroneous memory access +make[5]: *** [/export/gnu/import/git/sources/gcc/gcc/ada/Make-generated.in:45: ada/sinfo.h] Error 1 + +on trunk when bootstrapping GCC with ada on x86-64. + + * config/i386/i386.c (ix86_expand_prologue): Don't use reference + of struct ix86_frame. + (ix86_expand_epilogue): Likewise. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256742 138bc75d-0d04-0410-961f-82ee72b054a4 +--- + gcc/ChangeLog | 10 ++++++++++ + gcc/config/i386/i386.c | 6 ++++-- + 2 files changed, 14 insertions(+), 2 deletions(-) + +diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c +index e758387..ba2abc5 100644 +--- a/src/gcc/config/i386/i386.c ++++ b/src/gcc/config/i386/i386.c +@@ -14061,6 +14061,7 @@ ix86_expand_prologue (void) + { + struct machine_function *m = cfun->machine; + rtx insn, t; ++ struct ix86_frame frame; + HOST_WIDE_INT allocate; + bool int_registers_saved; + bool sse_registers_saved; +@@ -14084,7 +14085,7 @@ ix86_expand_prologue (void) + m->fs.sp_valid = true; + + ix86_compute_frame_layout (); +- struct ix86_frame &frame = cfun->machine->frame; ++ frame = m->frame; + + if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl)) + { +@@ -14747,12 +14748,13 @@ ix86_expand_epilogue (int style) + { + struct machine_function *m = cfun->machine; + struct machine_frame_state frame_state_save = m->fs; ++ struct ix86_frame frame; + bool restore_regs_via_mov; + bool using_drap; + + ix86_finalize_stack_realign_flags (); + ix86_compute_frame_layout (); +- struct ix86_frame &frame = cfun->machine->frame; ++ frame = m->frame; + + m->fs.sp_valid = (!frame_pointer_needed + || (crtl->sp_is_unchanging +-- +2.7.4 + diff --git a/development/gcc5/patches/0005-x86-Add-mindirect-branch-doc.diff b/development/gcc5/patches/0005-x86-Add-mindirect-branch-doc.diff new file mode 100644 index 0000000000..bcaf572b1e --- /dev/null +++ b/development/gcc5/patches/0005-x86-Add-mindirect-branch-doc.diff @@ -0,0 +1,279 @@ +From c6b72be421ded17e0c156070ba6e90aa6c335ed6 Mon Sep 17 00:00:00 2001 +From: hjl +Date: Tue, 16 Jan 2018 10:59:42 +0000 +Subject: [PATCH 5/9] x86: Add -mindirect-branch= (documentation) + +Add -mindirect-branch= option to convert indirect call and jump to call +and return thunks. The default is 'keep', which keeps indirect call and +jump unmodified. 'thunk' converts indirect call and jump to call and +return thunk. 'thunk-inline' converts indirect call and jump to inlined +call and return thunk. 'thunk-extern' converts indirect call and jump to +external call and return thunk provided in a separate object file. You +can control this behavior for a specific function by using the function +attribute indirect_branch. + +2 kinds of thunks are geneated. Memory thunk where the function address +is at the top of the stack: + +__x86_indirect_thunk: + call L2 +L1: + pause + lfence + jmp L1 +L2: + lea 8(%rsp), %rsp|lea 4(%esp), %esp + ret + +Indirect jmp via memory, "jmp mem", is converted to + + push memory + jmp __x86_indirect_thunk + +Indirect call via memory, "call mem", is converted to + + jmp L2 +L1: + push [mem] + jmp __x86_indirect_thunk +L2: + call L1 + +Register thunk where the function address is in a register, reg: + +__x86_indirect_thunk_reg: + call L2 +L1: + pause + lfence + jmp L1 +L2: + movq %reg, (%rsp)|movl %reg, (%esp) + ret + +where reg is one of (r|e)ax, (r|e)dx, (r|e)cx, (r|e)bx, (r|e)si, (r|e)di, +(r|e)bp, r8, r9, r10, r11, r12, r13, r14 and r15. + +Indirect jmp via register, "jmp reg", is converted to + + jmp __x86_indirect_thunk_reg + +Indirect call via register, "call reg", is converted to + + call __x86_indirect_thunk_reg + +gcc/ + + Backport from mainline + * config/i386/i386-opts.h (indirect_branch): New. + * config/i386/i386-protos.h (ix86_output_indirect_jmp): Likewise. + * config/i386/i386.c (ix86_using_red_zone): Disallow red-zone + with local indirect jump when converting indirect call and jump. + (ix86_set_indirect_branch_type): New. + (ix86_set_current_function): Call ix86_set_indirect_branch_type. + (indirectlabelno): New. + (indirect_thunk_needed): Likewise. + (indirect_thunk_bnd_needed): Likewise. + (indirect_thunks_used): Likewise. + (indirect_thunks_bnd_used): Likewise. + (INDIRECT_LABEL): Likewise. + (indirect_thunk_name): Likewise. + (output_indirect_thunk): Likewise. + (output_indirect_thunk_function): Likewise. + (ix86_output_indirect_branch_via_reg): Likewise. + (ix86_output_indirect_branch_via_push): Likewise. + (ix86_output_indirect_branch): Likewise. + (ix86_output_indirect_jmp): Likewise. + (ix86_code_end): Call output_indirect_thunk_function if needed. + (ix86_output_call_insn): Call ix86_output_indirect_branch if + needed. + (ix86_handle_fndecl_attribute): Handle indirect_branch. + (ix86_attribute_table): Add indirect_branch. + * config/i386/i386.h (machine_function): Add indirect_branch_type + and has_local_indirect_jump. + * config/i386/i386.md (indirect_jump): Set has_local_indirect_jump + to true. + (tablejump): Likewise. + (*indirect_jump): Use ix86_output_indirect_jmp. + (*tablejump_1): Likewise. + (simple_return_indirect_internal): Likewise. + * config/i386/i386.opt (mindirect-branch=): New option. + (indirect_branch): New. + (keep): Likewise. + (thunk): Likewise. + (thunk-inline): Likewise. + (thunk-extern): Likewise. + * doc/extend.texi: Document indirect_branch function attribute. + * doc/invoke.texi: Document -mindirect-branch= option. + +gcc/testsuite/ + + Backport from mainline + * gcc.target/i386/indirect-thunk-1.c: New test. + * gcc.target/i386/indirect-thunk-2.c: Likewise. + * gcc.target/i386/indirect-thunk-3.c: Likewise. + * gcc.target/i386/indirect-thunk-4.c: Likewise. + * gcc.target/i386/indirect-thunk-5.c: Likewise. + * gcc.target/i386/indirect-thunk-6.c: Likewise. + * gcc.target/i386/indirect-thunk-7.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-1.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-2.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-3.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-4.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-5.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-6.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-7.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-8.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-1.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-2.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-3.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-4.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-1.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-2.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-3.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-4.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-5.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-6.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-7.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-1.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-2.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-3.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-4.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-5.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-6.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-7.c: Likewise. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256732 138bc75d-0d04-0410-961f-82ee72b054a4 + +[UBUNTU NOTES: Updated for gcc-5.4 to include defines for + FIRST_INT_REG, LAST_INT_REG, and LEGACY_INT_REGNO_P as defined in + https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=222269. + Dropped indirect-thunk-5.c, indirect-thunk-6.c, + indirect-thunk-bnd-3.c, indirect-thunk-bnd-4.c, + indirect-thunk-extern-5.c, indirect-thunk-extern-6.c, + indirect-thunk-inline-5.c, and indirect-thunk-inline-6.c tests due + to gcc 5.4 and earlier not supporting the -fno-plt option. + --sbeattie, tyhicks] +--- + src/gcc/config/i386/i386-opts.h | 13 + src/gcc/config/i386/i386-protos.h | 1 + src/gcc/config/i386/i386.c | 621 +++++++++++- + src/gcc/config/i386/i386.h | 12 + src/gcc/config/i386/i386.md | 26 + src/gcc/config/i386/i386.opt | 20 + src/gcc/doc/extend.texi | 10 + src/gcc/doc/invoke.texi | 14 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | 20 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | 20 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | 21 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | 21 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | 44 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c | 23 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c | 21 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c | 23 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c | 22 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c | 22 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c | 21 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c | 44 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c | 42 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c | 20 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c | 21 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c | 19 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c | 19 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c | 20 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c | 20 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c | 43 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c | 20 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c | 20 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c | 21 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c | 21 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c | 44 + 33 files changed, 1334 insertions(+), 15 deletions(-) + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-1.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-2.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-3.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-4.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-5.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-6.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-7.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c + +Index: b/src/gcc/doc/extend.texi +=================================================================== +--- a/src/gcc/doc/extend.texi ++++ b/src/gcc/doc/extend.texi +@@ -4119,6 +4119,16 @@ Specify which floating-point unit to use + @code{target("fpmath=sse,387")} option must be specified as + @code{target("fpmath=sse+387")} because the comma would separate + different options. ++ ++@item indirect_branch("@var{choice}") ++@cindex @code{indirect_branch} function attribute, x86 ++On x86 targets, the @code{indirect_branch} attribute causes the compiler ++to convert indirect call and jump with @var{choice}. @samp{keep} ++keeps indirect call and jump unmodified. @samp{thunk} converts indirect ++call and jump to call and return thunk. @samp{thunk-inline} converts ++indirect call and jump to inlined call and return thunk. ++@samp{thunk-extern} converts indirect call and jump to external call ++and return thunk provided in a separate object file. + @end table + + On the PowerPC, the following options are allowed: +Index: b/src/gcc/doc/invoke.texi +=================================================================== +--- a/src/gcc/doc/invoke.texi ++++ b/src/gcc/doc/invoke.texi +@@ -1090,7 +1090,8 @@ See RS/6000 and PowerPC Options. + -m32 -m64 -mx32 -m16 -mlarge-data-threshold=@var{num} @gol + -msse2avx -mfentry -mrecord-mcount -mnop-mcount -m8bit-idiv @gol + -mavx256-split-unaligned-load -mavx256-split-unaligned-store @gol +--malign-data=@var{type} -mstack-protector-guard=@var{guard}} ++-malign-data=@var{type} -mstack-protector-guard=@var{guard} @gol ++-mindirect-branch=@var{choice}} + + @emph{x86 Windows Options} + @gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol +@@ -24017,6 +24018,17 @@ The default value of this option is enab + of the option is @option{-fno-sync-libcalls}. This option is used in + the implementation of the @file{libatomic} runtime library. + ++@item -mindirect-branch=@var{choice} ++@opindex -mindirect-branch ++Convert indirect call and jump with @var{choice}. The default is ++@samp{keep}, which keeps indirect call and jump unmodified. ++@samp{thunk} converts indirect call and jump to call and return thunk. ++@samp{thunk-inline} converts indirect call and jump to inlined call ++and return thunk. @samp{thunk-extern} converts indirect call and jump ++to external call and return thunk provided in a separate object file. ++You can control this behavior for a specific function by using the ++function attribute @code{indirect_branch}. @xref{Function Attributes}. ++ + @end table + + @c man end diff --git a/development/gcc5/patches/0005-x86-Add-mindirect-branch.diff b/development/gcc5/patches/0005-x86-Add-mindirect-branch.diff new file mode 100644 index 0000000000..db9690ccc1 --- /dev/null +++ b/development/gcc5/patches/0005-x86-Add-mindirect-branch.diff @@ -0,0 +1,1870 @@ +From c6b72be421ded17e0c156070ba6e90aa6c335ed6 Mon Sep 17 00:00:00 2001 +From: hjl +Date: Tue, 16 Jan 2018 10:59:42 +0000 +Subject: [PATCH 5/9] x86: Add -mindirect-branch= + +Add -mindirect-branch= option to convert indirect call and jump to call +and return thunks. The default is 'keep', which keeps indirect call and +jump unmodified. 'thunk' converts indirect call and jump to call and +return thunk. 'thunk-inline' converts indirect call and jump to inlined +call and return thunk. 'thunk-extern' converts indirect call and jump to +external call and return thunk provided in a separate object file. You +can control this behavior for a specific function by using the function +attribute indirect_branch. + +2 kinds of thunks are geneated. Memory thunk where the function address +is at the top of the stack: + +__x86_indirect_thunk: + call L2 +L1: + pause + lfence + jmp L1 +L2: + lea 8(%rsp), %rsp|lea 4(%esp), %esp + ret + +Indirect jmp via memory, "jmp mem", is converted to + + push memory + jmp __x86_indirect_thunk + +Indirect call via memory, "call mem", is converted to + + jmp L2 +L1: + push [mem] + jmp __x86_indirect_thunk +L2: + call L1 + +Register thunk where the function address is in a register, reg: + +__x86_indirect_thunk_reg: + call L2 +L1: + pause + lfence + jmp L1 +L2: + movq %reg, (%rsp)|movl %reg, (%esp) + ret + +where reg is one of (r|e)ax, (r|e)dx, (r|e)cx, (r|e)bx, (r|e)si, (r|e)di, +(r|e)bp, r8, r9, r10, r11, r12, r13, r14 and r15. + +Indirect jmp via register, "jmp reg", is converted to + + jmp __x86_indirect_thunk_reg + +Indirect call via register, "call reg", is converted to + + call __x86_indirect_thunk_reg + +gcc/ + + Backport from mainline + * config/i386/i386-opts.h (indirect_branch): New. + * config/i386/i386-protos.h (ix86_output_indirect_jmp): Likewise. + * config/i386/i386.c (ix86_using_red_zone): Disallow red-zone + with local indirect jump when converting indirect call and jump. + (ix86_set_indirect_branch_type): New. + (ix86_set_current_function): Call ix86_set_indirect_branch_type. + (indirectlabelno): New. + (indirect_thunk_needed): Likewise. + (indirect_thunk_bnd_needed): Likewise. + (indirect_thunks_used): Likewise. + (indirect_thunks_bnd_used): Likewise. + (INDIRECT_LABEL): Likewise. + (indirect_thunk_name): Likewise. + (output_indirect_thunk): Likewise. + (output_indirect_thunk_function): Likewise. + (ix86_output_indirect_branch_via_reg): Likewise. + (ix86_output_indirect_branch_via_push): Likewise. + (ix86_output_indirect_branch): Likewise. + (ix86_output_indirect_jmp): Likewise. + (ix86_code_end): Call output_indirect_thunk_function if needed. + (ix86_output_call_insn): Call ix86_output_indirect_branch if + needed. + (ix86_handle_fndecl_attribute): Handle indirect_branch. + (ix86_attribute_table): Add indirect_branch. + * config/i386/i386.h (machine_function): Add indirect_branch_type + and has_local_indirect_jump. + * config/i386/i386.md (indirect_jump): Set has_local_indirect_jump + to true. + (tablejump): Likewise. + (*indirect_jump): Use ix86_output_indirect_jmp. + (*tablejump_1): Likewise. + (simple_return_indirect_internal): Likewise. + * config/i386/i386.opt (mindirect-branch=): New option. + (indirect_branch): New. + (keep): Likewise. + (thunk): Likewise. + (thunk-inline): Likewise. + (thunk-extern): Likewise. + * doc/extend.texi: Document indirect_branch function attribute. + * doc/invoke.texi: Document -mindirect-branch= option. + +gcc/testsuite/ + + Backport from mainline + * gcc.target/i386/indirect-thunk-1.c: New test. + * gcc.target/i386/indirect-thunk-2.c: Likewise. + * gcc.target/i386/indirect-thunk-3.c: Likewise. + * gcc.target/i386/indirect-thunk-4.c: Likewise. + * gcc.target/i386/indirect-thunk-5.c: Likewise. + * gcc.target/i386/indirect-thunk-6.c: Likewise. + * gcc.target/i386/indirect-thunk-7.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-1.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-2.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-3.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-4.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-5.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-6.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-7.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-8.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-1.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-2.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-3.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-4.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-1.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-2.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-3.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-4.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-5.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-6.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-7.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-1.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-2.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-3.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-4.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-5.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-6.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-7.c: Likewise. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256732 138bc75d-0d04-0410-961f-82ee72b054a4 + +[UBUNTU NOTES: Updated for gcc-5.4 to include defines for + FIRST_INT_REG, LAST_INT_REG, and LEGACY_INT_REGNO_P as defined in + https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=222269. + Dropped indirect-thunk-5.c, indirect-thunk-6.c, + indirect-thunk-bnd-3.c, indirect-thunk-bnd-4.c, + indirect-thunk-extern-5.c, indirect-thunk-extern-6.c, + indirect-thunk-inline-5.c, and indirect-thunk-inline-6.c tests due + to gcc 5.4 and earlier not supporting the -fno-plt option. + --sbeattie, tyhicks] +--- + src/gcc/config/i386/i386-opts.h | 13 + src/gcc/config/i386/i386-protos.h | 1 + src/gcc/config/i386/i386.c | 621 +++++++++++- + src/gcc/config/i386/i386.h | 12 + src/gcc/config/i386/i386.md | 26 + src/gcc/config/i386/i386.opt | 20 + src/gcc/doc/extend.texi | 10 + src/gcc/doc/invoke.texi | 14 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | 20 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | 20 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | 21 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | 21 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | 44 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c | 23 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c | 21 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c | 23 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c | 22 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c | 22 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c | 21 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c | 44 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c | 42 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c | 20 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c | 21 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c | 19 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c | 19 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c | 20 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c | 20 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c | 43 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c | 20 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c | 20 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c | 21 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c | 21 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c | 44 + 33 files changed, 1334 insertions(+), 15 deletions(-) + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-1.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-2.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-3.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-4.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-5.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-6.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-7.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c + +Index: b/src/gcc/config/i386/i386-opts.h +=================================================================== +--- a/src/gcc/config/i386/i386-opts.h ++++ b/src/gcc/config/i386/i386-opts.h +@@ -99,4 +99,17 @@ enum stack_protector_guard { + SSP_GLOBAL /* global canary */ + }; + ++/* This is used to mitigate variant #2 of the speculative execution ++ vulnerabilities on x86 processors identified by CVE-2017-5715, aka ++ Spectre. They convert indirect branches and function returns to ++ call and return thunks to avoid speculative execution via indirect ++ call, jmp and ret. */ ++enum indirect_branch { ++ indirect_branch_unset = 0, ++ indirect_branch_keep, ++ indirect_branch_thunk, ++ indirect_branch_thunk_inline, ++ indirect_branch_thunk_extern ++}; ++ + #endif +Index: b/src/gcc/config/i386/i386-protos.h +=================================================================== +--- a/src/gcc/config/i386/i386-protos.h ++++ b/src/gcc/config/i386/i386-protos.h +@@ -306,6 +306,7 @@ extern enum attr_cpu ix86_schedule; + #endif + + extern const char * ix86_output_call_insn (rtx_insn *insn, rtx call_op); ++extern const char * ix86_output_indirect_jmp (rtx call_op, bool ret_p); + + #ifdef RTX_CODE + /* Target data for multipass lookahead scheduling. +Index: b/src/gcc/config/i386/i386.c +=================================================================== +--- a/src/gcc/config/i386/i386.c ++++ b/src/gcc/config/i386/i386.c +@@ -2554,12 +2554,23 @@ make_pass_insert_vzeroupper (gcc::contex + return new pass_insert_vzeroupper (ctxt); + } + +-/* Return true if a red-zone is in use. */ ++/* Return true if a red-zone is in use. We can't use red-zone when ++ there are local indirect jumps, like "indirect_jump" or "tablejump", ++ which jumps to another place in the function, since "call" in the ++ indirect thunk pushes the return address onto stack, destroying ++ red-zone. ++ ++ TODO: If we can reserve the first 2 WORDs, for PUSH and, another ++ for CALL, in red-zone, we can allow local indirect jumps with ++ indirect thunk. */ + + static inline bool + ix86_using_red_zone (void) + { +- return TARGET_RED_ZONE && !TARGET_64BIT_MS_ABI; ++ return (TARGET_RED_ZONE ++ && !TARGET_64BIT_MS_ABI ++ && (!cfun->machine->has_local_indirect_jump ++ || cfun->machine->indirect_branch_type == indirect_branch_keep)); + } + + /* Return a string that documents the current -m options. The caller is +@@ -5126,6 +5137,37 @@ ix86_reset_previous_fndecl (void) + ix86_previous_fndecl = NULL_TREE; + } + ++/* Set the indirect_branch_type field from the function FNDECL. */ ++ ++static void ++ix86_set_indirect_branch_type (tree fndecl) ++{ ++ if (cfun->machine->indirect_branch_type == indirect_branch_unset) ++ { ++ tree attr = lookup_attribute ("indirect_branch", ++ DECL_ATTRIBUTES (fndecl)); ++ if (attr != NULL) ++ { ++ tree args = TREE_VALUE (attr); ++ if (args == NULL) ++ gcc_unreachable (); ++ tree cst = TREE_VALUE (args); ++ if (strcmp (TREE_STRING_POINTER (cst), "keep") == 0) ++ cfun->machine->indirect_branch_type = indirect_branch_keep; ++ else if (strcmp (TREE_STRING_POINTER (cst), "thunk") == 0) ++ cfun->machine->indirect_branch_type = indirect_branch_thunk; ++ else if (strcmp (TREE_STRING_POINTER (cst), "thunk-inline") == 0) ++ cfun->machine->indirect_branch_type = indirect_branch_thunk_inline; ++ else if (strcmp (TREE_STRING_POINTER (cst), "thunk-extern") == 0) ++ cfun->machine->indirect_branch_type = indirect_branch_thunk_extern; ++ else ++ gcc_unreachable (); ++ } ++ else ++ cfun->machine->indirect_branch_type = ix86_indirect_branch; ++ } ++} ++ + /* Establish appropriate back-end context for processing the function + FNDECL. The argument might be NULL to indicate processing at top + level, outside of any function scope. */ +@@ -5136,7 +5178,11 @@ ix86_set_current_function (tree fndecl) + several times in the course of compiling a function, and we don't want to + slow things down too much or call target_reinit when it isn't safe. */ + if (fndecl == ix86_previous_fndecl) +- return; ++ { ++ if (fndecl != NULL_TREE) ++ ix86_set_indirect_branch_type (fndecl); ++ return; ++ } + + tree old_tree; + if (ix86_previous_fndecl == NULL_TREE) +@@ -5153,6 +5199,8 @@ ix86_set_current_function (tree fndecl) + return; + } + ++ ix86_set_indirect_branch_type (fndecl); ++ + tree new_tree = DECL_FUNCTION_SPECIFIC_TARGET (fndecl); + if (new_tree == NULL_TREE) + new_tree = target_option_default_node; +@@ -9681,6 +9729,220 @@ ix86_setup_frame_addresses (void) + # endif + #endif + ++/* Label count for call and return thunks. It is used to make unique ++ labels in call and return thunks. */ ++static int indirectlabelno; ++ ++/* True if call and return thunk functions are needed. */ ++static bool indirect_thunk_needed = false; ++/* True if call and return thunk functions with the BND prefix are ++ needed. */ ++static bool indirect_thunk_bnd_needed = false; ++ ++/* Bit masks of integer registers, which contain branch target, used ++ by call and return thunks functions. */ ++static int indirect_thunks_used; ++/* Bit masks of integer registers, which contain branch target, used ++ by call and return thunks functions with the BND prefix. */ ++static int indirect_thunks_bnd_used; ++ ++#ifndef INDIRECT_LABEL ++# define INDIRECT_LABEL "LIND" ++#endif ++ ++/* Fills in the label name that should be used for the indirect thunk. */ ++ ++static void ++indirect_thunk_name (char name[32], int regno, bool need_bnd_p) ++{ ++ if (USE_HIDDEN_LINKONCE) ++ { ++ const char *bnd = need_bnd_p ? "_bnd" : ""; ++ if (regno >= 0) ++ { ++ const char *reg_prefix; ++ if (LEGACY_INT_REGNO_P (regno)) ++ reg_prefix = TARGET_64BIT ? "r" : "e"; ++ else ++ reg_prefix = ""; ++ sprintf (name, "__x86_indirect_thunk%s_%s%s", ++ bnd, reg_prefix, reg_names[regno]); ++ } ++ else ++ sprintf (name, "__x86_indirect_thunk%s", bnd); ++ } ++ else ++ { ++ if (regno >= 0) ++ { ++ if (need_bnd_p) ++ ASM_GENERATE_INTERNAL_LABEL (name, "LITBR", regno); ++ else ++ ASM_GENERATE_INTERNAL_LABEL (name, "LITR", regno); ++ } ++ else ++ { ++ if (need_bnd_p) ++ ASM_GENERATE_INTERNAL_LABEL (name, "LITB", 0); ++ else ++ ASM_GENERATE_INTERNAL_LABEL (name, "LIT", 0); ++ } ++ } ++} ++ ++/* Output a call and return thunk for indirect branch. If BND_P is ++ true, the BND prefix is needed. If REGNO != -1, the function ++ address is in REGNO and the call and return thunk looks like: ++ ++ call L2 ++ L1: ++ pause ++ jmp L1 ++ L2: ++ mov %REG, (%sp) ++ ret ++ ++ Otherwise, the function address is on the top of stack and the ++ call and return thunk looks like: ++ ++ call L2 ++ L1: ++ pause ++ jmp L1 ++ L2: ++ lea WORD_SIZE(%sp), %sp ++ ret ++ */ ++ ++static void ++output_indirect_thunk (bool need_bnd_p, int regno) ++{ ++ char indirectlabel1[32]; ++ char indirectlabel2[32]; ++ ++ ASM_GENERATE_INTERNAL_LABEL (indirectlabel1, INDIRECT_LABEL, ++ indirectlabelno++); ++ ASM_GENERATE_INTERNAL_LABEL (indirectlabel2, INDIRECT_LABEL, ++ indirectlabelno++); ++ ++ /* Call */ ++ if (need_bnd_p) ++ fputs ("\tbnd call\t", asm_out_file); ++ else ++ fputs ("\tcall\t", asm_out_file); ++ assemble_name_raw (asm_out_file, indirectlabel2); ++ fputc ('\n', asm_out_file); ++ ++ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel1); ++ ++ /* Pause + lfence. */ ++ fprintf (asm_out_file, "\tpause\n\tlfence\n"); ++ ++ /* Jump. */ ++ fputs ("\tjmp\t", asm_out_file); ++ assemble_name_raw (asm_out_file, indirectlabel1); ++ fputc ('\n', asm_out_file); ++ ++ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2); ++ ++ if (regno >= 0) ++ { ++ /* MOV. */ ++ rtx xops[2]; ++ xops[0] = gen_rtx_MEM (word_mode, stack_pointer_rtx); ++ xops[1] = gen_rtx_REG (word_mode, regno); ++ output_asm_insn ("mov\t{%1, %0|%0, %1}", xops); ++ } ++ else ++ { ++ /* LEA. */ ++ rtx xops[2]; ++ xops[0] = stack_pointer_rtx; ++ xops[1] = plus_constant (Pmode, stack_pointer_rtx, UNITS_PER_WORD); ++ output_asm_insn ("lea\t{%E1, %0|%0, %E1}", xops); ++ } ++ ++ if (need_bnd_p) ++ fputs ("\tbnd ret\n", asm_out_file); ++ else ++ fputs ("\tret\n", asm_out_file); ++} ++ ++/* Output a funtion with a call and return thunk for indirect branch. ++ If BND_P is true, the BND prefix is needed. If REGNO != -1, the ++ function address is in REGNO. Otherwise, the function address is ++ on the top of stack. */ ++ ++static void ++output_indirect_thunk_function (bool need_bnd_p, int regno) ++{ ++ char name[32]; ++ tree decl; ++ ++ /* Create __x86_indirect_thunk/__x86_indirect_thunk_bnd. */ ++ indirect_thunk_name (name, regno, need_bnd_p); ++ decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL, ++ get_identifier (name), ++ build_function_type_list (void_type_node, NULL_TREE)); ++ DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL, ++ NULL_TREE, void_type_node); ++ TREE_PUBLIC (decl) = 1; ++ TREE_STATIC (decl) = 1; ++ DECL_IGNORED_P (decl) = 1; ++ ++#if TARGET_MACHO ++ if (TARGET_MACHO) ++ { ++ switch_to_section (darwin_sections[picbase_thunk_section]); ++ fputs ("\t.weak_definition\t", asm_out_file); ++ assemble_name (asm_out_file, name); ++ fputs ("\n\t.private_extern\t", asm_out_file); ++ assemble_name (asm_out_file, name); ++ putc ('\n', asm_out_file); ++ ASM_OUTPUT_LABEL (asm_out_file, name); ++ DECL_WEAK (decl) = 1; ++ } ++ else ++#endif ++ if (USE_HIDDEN_LINKONCE) ++ { ++ cgraph_node::create (decl)->set_comdat_group (DECL_ASSEMBLER_NAME (decl)); ++ ++ targetm.asm_out.unique_section (decl, 0); ++ switch_to_section (get_named_section (decl, NULL, 0)); ++ ++ targetm.asm_out.globalize_label (asm_out_file, name); ++ fputs ("\t.hidden\t", asm_out_file); ++ assemble_name (asm_out_file, name); ++ putc ('\n', asm_out_file); ++ ASM_DECLARE_FUNCTION_NAME (asm_out_file, name, decl); ++ } ++ else ++ { ++ switch_to_section (text_section); ++ ASM_OUTPUT_LABEL (asm_out_file, name); ++ } ++ ++ DECL_INITIAL (decl) = make_node (BLOCK); ++ current_function_decl = decl; ++ allocate_struct_function (decl, false); ++ init_function_start (decl); ++ /* We're about to hide the function body from callees of final_* by ++ emitting it directly; tell them we're a thunk, if they care. */ ++ cfun->is_thunk = true; ++ first_function_block_is_cold = false; ++ /* Make sure unwind info is emitted for the thunk if needed. */ ++ final_start_function (emit_barrier (), asm_out_file, 1); ++ ++ output_indirect_thunk (need_bnd_p, regno); ++ ++ final_end_function (); ++ init_insn_lengths (); ++ free_after_compilation (cfun); ++ set_cfun (NULL); ++ current_function_decl = NULL; ++} ++ + static int pic_labels_used; + + /* Fills in the label name that should be used for a pc thunk for +@@ -9707,11 +9969,32 @@ ix86_code_end (void) + rtx xops[2]; + int regno; + ++ if (indirect_thunk_needed) ++ output_indirect_thunk_function (false, -1); ++ if (indirect_thunk_bnd_needed) ++ output_indirect_thunk_function (true, -1); ++ ++ for (regno = FIRST_REX_INT_REG; regno <= LAST_REX_INT_REG; regno++) ++ { ++ int i = regno - FIRST_REX_INT_REG + LAST_INT_REG + 1; ++ if ((indirect_thunks_used & (1 << i))) ++ output_indirect_thunk_function (false, regno); ++ ++ if ((indirect_thunks_bnd_used & (1 << i))) ++ output_indirect_thunk_function (true, regno); ++ } ++ + for (regno = AX_REG; regno <= SP_REG; regno++) + { + char name[32]; + tree decl; + ++ if ((indirect_thunks_used & (1 << regno))) ++ output_indirect_thunk_function (false, regno); ++ ++ if ((indirect_thunks_bnd_used & (1 << regno))) ++ output_indirect_thunk_function (true, regno); ++ + if (!(pic_labels_used & (1 << regno))) + continue; + +@@ -25805,12 +26088,292 @@ ix86_expand_call (rtx retval, rtx fnaddr + return call; + } + ++/* Output indirect branch via a call and return thunk. CALL_OP is a ++ register which contains the branch target. XASM is the assembly ++ template for CALL_OP. Branch is a tail call if SIBCALL_P is true. ++ A normal call is converted to: ++ ++ call __x86_indirect_thunk_reg ++ ++ and a tail call is converted to: ++ ++ jmp __x86_indirect_thunk_reg ++ */ ++ ++static void ++ix86_output_indirect_branch_via_reg (rtx call_op, bool sibcall_p) ++{ ++ char thunk_name_buf[32]; ++ char *thunk_name; ++ bool need_bnd_p = ix86_bnd_prefixed_insn_p (current_output_insn); ++ int regno = REGNO (call_op); ++ ++ if (cfun->machine->indirect_branch_type ++ != indirect_branch_thunk_inline) ++ { ++ if (cfun->machine->indirect_branch_type == indirect_branch_thunk) ++ { ++ int i = regno; ++ if (i >= FIRST_REX_INT_REG) ++ i -= (FIRST_REX_INT_REG - LAST_INT_REG - 1); ++ if (need_bnd_p) ++ indirect_thunks_bnd_used |= 1 << i; ++ else ++ indirect_thunks_used |= 1 << i; ++ } ++ indirect_thunk_name (thunk_name_buf, regno, need_bnd_p); ++ thunk_name = thunk_name_buf; ++ } ++ else ++ thunk_name = NULL; ++ ++ if (sibcall_p) ++ { ++ if (thunk_name != NULL) ++ { ++ if (need_bnd_p) ++ fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name); ++ else ++ fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name); ++ } ++ else ++ output_indirect_thunk (need_bnd_p, regno); ++ } ++ else ++ { ++ if (thunk_name != NULL) ++ { ++ if (need_bnd_p) ++ fprintf (asm_out_file, "\tbnd call\t%s\n", thunk_name); ++ else ++ fprintf (asm_out_file, "\tcall\t%s\n", thunk_name); ++ return; ++ } ++ ++ char indirectlabel1[32]; ++ char indirectlabel2[32]; ++ ++ ASM_GENERATE_INTERNAL_LABEL (indirectlabel1, ++ INDIRECT_LABEL, ++ indirectlabelno++); ++ ASM_GENERATE_INTERNAL_LABEL (indirectlabel2, ++ INDIRECT_LABEL, ++ indirectlabelno++); ++ ++ /* Jump. */ ++ if (need_bnd_p) ++ fputs ("\tbnd jmp\t", asm_out_file); ++ else ++ fputs ("\tjmp\t", asm_out_file); ++ assemble_name_raw (asm_out_file, indirectlabel2); ++ fputc ('\n', asm_out_file); ++ ++ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel1); ++ ++ if (thunk_name != NULL) ++ { ++ if (need_bnd_p) ++ fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name); ++ else ++ fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name); ++ } ++ else ++ output_indirect_thunk (need_bnd_p, regno); ++ ++ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2); ++ ++ /* Call. */ ++ if (need_bnd_p) ++ fputs ("\tbnd call\t", asm_out_file); ++ else ++ fputs ("\tcall\t", asm_out_file); ++ assemble_name_raw (asm_out_file, indirectlabel1); ++ fputc ('\n', asm_out_file); ++ } ++} ++ ++/* Output indirect branch via a call and return thunk. CALL_OP is ++ the branch target. XASM is the assembly template for CALL_OP. ++ Branch is a tail call if SIBCALL_P is true. A normal call is ++ converted to: ++ ++ jmp L2 ++ L1: ++ push CALL_OP ++ jmp __x86_indirect_thunk ++ L2: ++ call L1 ++ ++ and a tail call is converted to: ++ ++ push CALL_OP ++ jmp __x86_indirect_thunk ++ */ ++ ++static void ++ix86_output_indirect_branch_via_push (rtx call_op, const char *xasm, ++ bool sibcall_p) ++{ ++ char thunk_name_buf[32]; ++ char *thunk_name; ++ char push_buf[64]; ++ bool need_bnd_p = ix86_bnd_prefixed_insn_p (current_output_insn); ++ int regno = -1; ++ ++ if (cfun->machine->indirect_branch_type ++ != indirect_branch_thunk_inline) ++ { ++ if (cfun->machine->indirect_branch_type == indirect_branch_thunk) ++ { ++ if (need_bnd_p) ++ indirect_thunk_bnd_needed = true; ++ else ++ indirect_thunk_needed = true; ++ } ++ indirect_thunk_name (thunk_name_buf, regno, need_bnd_p); ++ thunk_name = thunk_name_buf; ++ } ++ else ++ thunk_name = NULL; ++ ++ snprintf (push_buf, sizeof (push_buf), "push{%c}\t%s", ++ TARGET_64BIT ? 'q' : 'l', xasm); ++ ++ if (sibcall_p) ++ { ++ output_asm_insn (push_buf, &call_op); ++ if (thunk_name != NULL) ++ { ++ if (need_bnd_p) ++ fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name); ++ else ++ fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name); ++ } ++ else ++ output_indirect_thunk (need_bnd_p, regno); ++ } ++ else ++ { ++ char indirectlabel1[32]; ++ char indirectlabel2[32]; ++ ++ ASM_GENERATE_INTERNAL_LABEL (indirectlabel1, ++ INDIRECT_LABEL, ++ indirectlabelno++); ++ ASM_GENERATE_INTERNAL_LABEL (indirectlabel2, ++ INDIRECT_LABEL, ++ indirectlabelno++); ++ ++ /* Jump. */ ++ if (need_bnd_p) ++ fputs ("\tbnd jmp\t", asm_out_file); ++ else ++ fputs ("\tjmp\t", asm_out_file); ++ assemble_name_raw (asm_out_file, indirectlabel2); ++ fputc ('\n', asm_out_file); ++ ++ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel1); ++ ++ /* An external function may be called via GOT, instead of PLT. */ ++ if (MEM_P (call_op)) ++ { ++ struct ix86_address parts; ++ rtx addr = XEXP (call_op, 0); ++ if (ix86_decompose_address (addr, &parts) ++ && parts.base == stack_pointer_rtx) ++ { ++ /* Since call will adjust stack by -UNITS_PER_WORD, ++ we must convert "disp(stack, index, scale)" to ++ "disp+UNITS_PER_WORD(stack, index, scale)". */ ++ if (parts.index) ++ { ++ addr = gen_rtx_MULT (Pmode, parts.index, ++ GEN_INT (parts.scale)); ++ addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx, ++ addr); ++ } ++ else ++ addr = stack_pointer_rtx; ++ ++ rtx disp; ++ if (parts.disp != NULL_RTX) ++ disp = plus_constant (Pmode, parts.disp, ++ UNITS_PER_WORD); ++ else ++ disp = GEN_INT (UNITS_PER_WORD); ++ ++ addr = gen_rtx_PLUS (Pmode, addr, disp); ++ call_op = gen_rtx_MEM (GET_MODE (call_op), addr); ++ } ++ } ++ ++ output_asm_insn (push_buf, &call_op); ++ ++ if (thunk_name != NULL) ++ { ++ if (need_bnd_p) ++ fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name); ++ else ++ fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name); ++ } ++ else ++ output_indirect_thunk (need_bnd_p, regno); ++ ++ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2); ++ ++ /* Call. */ ++ if (need_bnd_p) ++ fputs ("\tbnd call\t", asm_out_file); ++ else ++ fputs ("\tcall\t", asm_out_file); ++ assemble_name_raw (asm_out_file, indirectlabel1); ++ fputc ('\n', asm_out_file); ++ } ++} ++ ++/* Output indirect branch via a call and return thunk. CALL_OP is ++ the branch target. XASM is the assembly template for CALL_OP. ++ Branch is a tail call if SIBCALL_P is true. */ ++ ++static void ++ix86_output_indirect_branch (rtx call_op, const char *xasm, ++ bool sibcall_p) ++{ ++ if (REG_P (call_op)) ++ ix86_output_indirect_branch_via_reg (call_op, sibcall_p); ++ else ++ ix86_output_indirect_branch_via_push (call_op, xasm, sibcall_p); ++} ++/* Output indirect jump. CALL_OP is the jump target. Jump is a ++ function return if RET_P is true. */ ++ ++const char * ++ix86_output_indirect_jmp (rtx call_op, bool ret_p) ++{ ++ if (cfun->machine->indirect_branch_type != indirect_branch_keep) ++ { ++ /* We can't have red-zone if this isn't a function return since ++ "call" in the indirect thunk pushes the return address onto ++ stack, destroying red-zone. */ ++ if (!ret_p && ix86_red_zone_size != 0) ++ gcc_unreachable (); ++ ++ ix86_output_indirect_branch (call_op, "%0", true); ++ return ""; ++ } ++ else ++ return "%!jmp\t%A0"; ++} ++ + /* Output the assembly for a call instruction. */ + + const char * + ix86_output_call_insn (rtx_insn *insn, rtx call_op) + { + bool direct_p = constant_call_address_operand (call_op, VOIDmode); ++ bool output_indirect_p ++ = (!TARGET_SEH ++ && cfun->machine->indirect_branch_type != indirect_branch_keep); + bool seh_nop_p = false; + const char *xasm; + +@@ -25823,9 +26386,17 @@ ix86_output_call_insn (rtx_insn *insn, r + else if (TARGET_SEH) + xasm = "%!rex.W jmp %A0"; + else +- xasm = "%!jmp\t%A0"; ++ { ++ if (output_indirect_p) ++ xasm = "%0"; ++ else ++ xasm = "%!jmp\t%A0"; ++ } + +- output_asm_insn (xasm, &call_op); ++ if (output_indirect_p && !direct_p) ++ ix86_output_indirect_branch (call_op, xasm, true); ++ else ++ output_asm_insn (xasm, &call_op); + return ""; + } + +@@ -25862,9 +26433,17 @@ ix86_output_call_insn (rtx_insn *insn, r + if (direct_p) + xasm = "%!call\t%P0"; + else +- xasm = "%!call\t%A0"; ++ { ++ if (output_indirect_p) ++ xasm = "%0"; ++ else ++ xasm = "%!call\t%A0"; ++ } + +- output_asm_insn (xasm, &call_op); ++ if (output_indirect_p && !direct_p) ++ ix86_output_indirect_branch (call_op, xasm, false); ++ else ++ output_asm_insn (xasm, &call_op); + + if (seh_nop_p) + return "nop"; +@@ -43014,7 +43593,7 @@ ix86_handle_struct_attribute (tree *node + } + + static tree +-ix86_handle_fndecl_attribute (tree *node, tree name, tree, int, ++ix86_handle_fndecl_attribute (tree *node, tree name, tree args, int, + bool *no_add_attrs) + { + if (TREE_CODE (*node) != FUNCTION_DECL) +@@ -43023,6 +43602,29 @@ ix86_handle_fndecl_attribute (tree *node + name); + *no_add_attrs = true; + } ++ ++ if (is_attribute_p ("indirect_branch", name)) ++ { ++ tree cst = TREE_VALUE (args); ++ if (TREE_CODE (cst) != STRING_CST) ++ { ++ warning (OPT_Wattributes, ++ "%qE attribute requires a string constant argument", ++ name); ++ *no_add_attrs = true; ++ } ++ else if (strcmp (TREE_STRING_POINTER (cst), "keep") != 0 ++ && strcmp (TREE_STRING_POINTER (cst), "thunk") != 0 ++ && strcmp (TREE_STRING_POINTER (cst), "thunk-inline") != 0 ++ && strcmp (TREE_STRING_POINTER (cst), "thunk-extern") != 0) ++ { ++ warning (OPT_Wattributes, ++ "argument to %qE attribute is not " ++ "(keep|thunk|thunk-inline|thunk-extern)", name); ++ *no_add_attrs = true; ++ } ++ } ++ + return NULL_TREE; + } + +@@ -46915,6 +47517,9 @@ static const struct attribute_spec ix86_ + false }, + { "callee_pop_aggregate_return", 1, 1, false, true, true, + ix86_handle_callee_pop_aggregate_return, true }, ++ { "indirect_branch", 1, 1, true, false, false, ++ ix86_handle_fndecl_attribute, false }, ++ + /* End element. */ + { NULL, 0, 0, false, false, false, NULL, false } + }; +Index: b/src/gcc/config/i386/i386.h +=================================================================== +--- a/src/gcc/config/i386/i386.h ++++ b/src/gcc/config/i386/i386.h +@@ -1229,6 +1229,9 @@ extern const char *host_detect_local_cpu + /* Base register for access to local variables of the function. */ + #define FRAME_POINTER_REGNUM 20 + ++#define FIRST_INT_REG AX_REG ++#define LAST_INT_REG SP_REG ++ + /* First floating point reg */ + #define FIRST_FLOAT_REG 8 + +@@ -1465,6 +1468,8 @@ enum reg_class + registers. */ + #define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P hook_bool_mode_true + ++#define LEGACY_INT_REGNO_P(N) (IN_RANGE ((N), FIRST_INT_REG, LAST_INT_REG)) ++ + #define QI_REG_P(X) (REG_P (X) && QI_REGNO_P (REGNO (X))) + #define QI_REGNO_P(N) IN_RANGE ((N), AX_REG, BX_REG) + +@@ -2550,6 +2555,13 @@ struct GTY(()) machine_function { + /* If true, it is safe to not save/restore DRAP register. */ + BOOL_BITFIELD no_drap_save_restore : 1; + ++ /* How to generate indirec branch. */ ++ ENUM_BITFIELD(indirect_branch) indirect_branch_type : 3; ++ ++ /* If true, the current function has local indirect jumps, like ++ "indirect_jump" or "tablejump". */ ++ BOOL_BITFIELD has_local_indirect_jump : 1; ++ + /* During prologue/epilogue generation, the current frame state. + Otherwise, the frame state at the end of the prologue. */ + struct machine_frame_state fs; +Index: b/src/gcc/config/i386/i386.md +=================================================================== +--- a/src/gcc/config/i386/i386.md ++++ b/src/gcc/config/i386/i386.md +@@ -11556,13 +11556,18 @@ + { + if (TARGET_X32) + operands[0] = convert_memory_address (word_mode, operands[0]); ++ cfun->machine->has_local_indirect_jump = true; + }) + + (define_insn "*indirect_jump" + [(set (pc) (match_operand:W 0 "indirect_branch_operand" "rBw"))] + "" +- "%!jmp\t%A0" +- [(set_attr "type" "ibr") ++ "* return ix86_output_indirect_jmp (operands[0], false);" ++ [(set (attr "type") ++ (if_then_else (match_test "(cfun->machine->indirect_branch_type ++ != indirect_branch_keep)") ++ (const_string "multi") ++ (const_string "ibr"))) + (set_attr "length_immediate" "0")]) + + (define_expand "tablejump" +@@ -11604,14 +11609,19 @@ + + if (TARGET_X32) + operands[0] = convert_memory_address (word_mode, operands[0]); ++ cfun->machine->has_local_indirect_jump = true; + }) + + (define_insn "*tablejump_1" + [(set (pc) (match_operand:W 0 "indirect_branch_operand" "rBw")) + (use (label_ref (match_operand 1)))] + "" +- "%!jmp\t%A0" +- [(set_attr "type" "ibr") ++ "* return ix86_output_indirect_jmp (operands[0], false);" ++ [(set (attr "type") ++ (if_then_else (match_test "(cfun->machine->indirect_branch_type ++ != indirect_branch_keep)") ++ (const_string "multi") ++ (const_string "ibr"))) + (set_attr "length_immediate" "0")]) + + ;; Convert setcc + movzbl to xor + setcc if operands don't overlap. +@@ -12198,8 +12208,12 @@ + [(simple_return) + (use (match_operand:SI 0 "register_operand" "r"))] + "reload_completed" +- "%!jmp\t%A0" +- [(set_attr "type" "ibr") ++ "* return ix86_output_indirect_jmp (operands[0], true);" ++ [(set (attr "type") ++ (if_then_else (match_test "(cfun->machine->indirect_branch_type ++ != indirect_branch_keep)") ++ (const_string "multi") ++ (const_string "ibr"))) + (set_attr "length_immediate" "0")]) + + (define_insn "nop" +Index: b/src/gcc/config/i386/i386.opt +=================================================================== +--- a/src/gcc/config/i386/i386.opt ++++ b/src/gcc/config/i386/i386.opt +@@ -876,3 +876,23 @@ Enum(stack_protector_guard) String(tls) + + EnumValue + Enum(stack_protector_guard) String(global) Value(SSP_GLOBAL) ++ ++mindirect-branch= ++Target Report RejectNegative Joined Enum(indirect_branch) Var(ix86_indirect_branch) Init(indirect_branch_keep) ++Convert indirect call and jump to call and return thunks. ++ ++Enum ++Name(indirect_branch) Type(enum indirect_branch) ++Known indirect branch choices (for use with the -mindirect-branch= option): ++ ++EnumValue ++Enum(indirect_branch) String(keep) Value(indirect_branch_keep) ++ ++EnumValue ++Enum(indirect_branch) String(thunk) Value(indirect_branch_thunk) ++ ++EnumValue ++Enum(indirect_branch) String(thunk-inline) Value(indirect_branch_thunk_inline) ++ ++EnumValue ++Enum(indirect_branch) String(thunk-extern) Value(indirect_branch_thunk_extern) +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c +@@ -0,0 +1,20 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch; ++ ++void ++male_indirect_jump (long offset) ++{ ++ dispatch(offset); ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c +@@ -0,0 +1,20 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch[256]; ++ ++void ++male_indirect_jump (long offset) ++{ ++ dispatch[offset](offset); ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c +@@ -0,0 +1,21 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch; ++ ++int ++male_indirect_jump (long offset) ++{ ++ dispatch(offset); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c +@@ -0,0 +1,21 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch[256]; ++ ++int ++male_indirect_jump (long offset) ++{ ++ dispatch[offset](offset); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c +@@ -0,0 +1,44 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */ ++ ++void func0 (void); ++void func1 (void); ++void func2 (void); ++void func3 (void); ++void func4 (void); ++void func4 (void); ++void func5 (void); ++ ++void ++bar (int i) ++{ ++ switch (i) ++ { ++ default: ++ func0 (); ++ break; ++ case 1: ++ func1 (); ++ break; ++ case 2: ++ func2 (); ++ break; ++ case 3: ++ func3 (); ++ break; ++ case 4: ++ func4 (); ++ break; ++ case 5: ++ func5 (); ++ break; ++ } ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c +@@ -0,0 +1,23 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch; ++ ++extern void male_indirect_jump (long) ++ __attribute__ ((indirect_branch("thunk"))); ++ ++void ++male_indirect_jump (long offset) ++{ ++ dispatch(offset); ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c +@@ -0,0 +1,21 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch[256]; ++ ++__attribute__ ((indirect_branch("thunk"))) ++void ++male_indirect_jump (long offset) ++{ ++ dispatch[offset](offset); ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c +@@ -0,0 +1,23 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch; ++extern int male_indirect_jump (long) ++ __attribute__ ((indirect_branch("thunk-inline"))); ++ ++int ++male_indirect_jump (long offset) ++{ ++ dispatch(offset); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */ ++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ ++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c +@@ -0,0 +1,22 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch[256]; ++ ++__attribute__ ((indirect_branch("thunk-inline"))) ++int ++male_indirect_jump (long offset) ++{ ++ dispatch[offset](offset); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */ ++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ ++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c +@@ -0,0 +1,22 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch; ++extern int male_indirect_jump (long) ++ __attribute__ ((indirect_branch("thunk-extern"))); ++ ++int ++male_indirect_jump (long offset) ++{ ++ dispatch(offset); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ ++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c +@@ -0,0 +1,21 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch[256]; ++ ++__attribute__ ((indirect_branch("thunk-extern"))) ++int ++male_indirect_jump (long offset) ++{ ++ dispatch[offset](offset); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ ++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c +@@ -0,0 +1,44 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fno-pic" } */ ++ ++void func0 (void); ++void func1 (void); ++void func2 (void); ++void func3 (void); ++void func4 (void); ++void func4 (void); ++void func5 (void); ++ ++__attribute__ ((indirect_branch("thunk-extern"))) ++void ++bar (int i) ++{ ++ switch (i) ++ { ++ default: ++ func0 (); ++ break; ++ case 1: ++ func1 (); ++ break; ++ case 2: ++ func2 (); ++ break; ++ case 3: ++ func3 (); ++ break; ++ case 4: ++ func4 (); ++ break; ++ case 5: ++ func5 (); ++ break; ++ } ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */ ++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c +@@ -0,0 +1,42 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */ ++ ++void func0 (void); ++void func1 (void); ++void func2 (void); ++void func3 (void); ++void func4 (void); ++void func4 (void); ++void func5 (void); ++ ++__attribute__ ((indirect_branch("keep"))) ++void ++bar (int i) ++{ ++ switch (i) ++ { ++ default: ++ func0 (); ++ break; ++ case 1: ++ func1 (); ++ break; ++ case 2: ++ func2 (); ++ break; ++ case 3: ++ func3 (); ++ break; ++ case 4: ++ func4 (); ++ break; ++ case 5: ++ func5 (); ++ break; ++ } ++} ++ ++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */ ++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c +@@ -0,0 +1,20 @@ ++/* { dg-do compile { target { ! x32 } } } */ ++/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */ ++ ++void (*dispatch) (char *); ++char buf[10]; ++ ++void ++foo (void) ++{ ++ dispatch (buf); ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "pushq\[ \t\]%rax" { target x32 } } } */ ++/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "bnd call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "bnd ret" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c +@@ -0,0 +1,21 @@ ++/* { dg-do compile { target { ! x32 } } } */ ++/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */ ++ ++void (*dispatch) (char *); ++char buf[10]; ++ ++int ++foo (void) ++{ ++ dispatch (buf); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "pushq\[ \t\]%rax" { target x32 } } } */ ++/* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } */ ++/* { dg-final { scan-assembler "bnd jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "bnd call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "bnd ret" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c +@@ -0,0 +1,19 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch; ++ ++void ++male_indirect_jump (long offset) ++{ ++ dispatch(offset); ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ ++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c +@@ -0,0 +1,19 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch[256]; ++ ++void ++male_indirect_jump (long offset) ++{ ++ dispatch[offset](offset); ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ ++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c +@@ -0,0 +1,20 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch; ++ ++int ++male_indirect_jump (long offset) ++{ ++ dispatch(offset); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ ++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c +@@ -0,0 +1,20 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch[256]; ++ ++int ++male_indirect_jump (long offset) ++{ ++ dispatch[offset](offset); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ ++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c +@@ -0,0 +1,43 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */ ++ ++void func0 (void); ++void func1 (void); ++void func2 (void); ++void func3 (void); ++void func4 (void); ++void func4 (void); ++void func5 (void); ++ ++void ++bar (int i) ++{ ++ switch (i) ++ { ++ default: ++ func0 (); ++ break; ++ case 1: ++ func1 (); ++ break; ++ case 2: ++ func2 (); ++ break; ++ case 3: ++ func3 (); ++ break; ++ case 4: ++ func4 (); ++ break; ++ case 5: ++ func5 (); ++ break; ++ } ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ ++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c +@@ -0,0 +1,20 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch; ++ ++void ++male_indirect_jump (long offset) ++{ ++ dispatch(offset); ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ ++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c +@@ -0,0 +1,20 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch[256]; ++ ++void ++male_indirect_jump (long offset) ++{ ++ dispatch[offset](offset); ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ ++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c +@@ -0,0 +1,21 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch; ++ ++int ++male_indirect_jump (long offset) ++{ ++ dispatch(offset); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */ ++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */ ++/* { dg-final { scan-assembler-times {\tpause} 1 } } */ ++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */ ++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c +@@ -0,0 +1,21 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch[256]; ++ ++int ++male_indirect_jump (long offset) ++{ ++ dispatch[offset](offset); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */ ++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */ ++/* { dg-final { scan-assembler-times {\tpause} 1 } } */ ++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */ ++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c +@@ -0,0 +1,44 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */ ++ ++void func0 (void); ++void func1 (void); ++void func2 (void); ++void func3 (void); ++void func4 (void); ++void func4 (void); ++void func5 (void); ++ ++void ++bar (int i) ++{ ++ switch (i) ++ { ++ default: ++ func0 (); ++ break; ++ case 1: ++ func1 (); ++ break; ++ case 2: ++ func2 (); ++ break; ++ case 3: ++ func3 (); ++ break; ++ case 4: ++ func4 (); ++ break; ++ case 5: ++ func5 (); ++ break; ++ } ++} ++ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ ++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */ diff --git a/development/gcc5/patches/0006-x86-Add-mfunction-return-doc.diff b/development/gcc5/patches/0006-x86-Add-mfunction-return-doc.diff new file mode 100644 index 0000000000..b40d524892 --- /dev/null +++ b/development/gcc5/patches/0006-x86-Add-mfunction-return-doc.diff @@ -0,0 +1,300 @@ +From 357311dd400f7f72d2132f2f94161ece39bf08c6 Mon Sep 17 00:00:00 2001 +From: hjl +Date: Tue, 16 Jan 2018 11:10:44 +0000 +Subject: [PATCH 6/9] x86: Add -mfunction-return= + +Add -mfunction-return= option to convert function return to call and +return thunks. The default is 'keep', which keeps function return +unmodified. 'thunk' converts function return to call and return thunk. +'thunk-inline' converts function return to inlined call and return thunk. +'thunk-extern' converts function return to external call and return +thunk provided in a separate object file. You can control this behavior +for a specific function by using the function attribute function_return. + +Function return thunk is the same as memory thunk for -mindirect-branch= +where the return address is at the top of the stack: + +__x86_return_thunk: + call L2 +L1: + pause + lfence + jmp L1 +L2: + lea 8(%rsp), %rsp|lea 4(%esp), %esp + ret + +and function return becomes + + jmp __x86_return_thunk + +-mindirect-branch= tests are updated with -mfunction-return=keep to +avoid false test failures when -mfunction-return=thunk is added to +RUNTESTFLAGS for "make check". + +gcc/ + + Backport from mainline + 2018-01-14 H.J. Lu + + * config/i386/i386-protos.h (ix86_output_function_return): New. + * config/i386/i386.c (ix86_set_indirect_branch_type): Also + set function_return_type. + (indirect_thunk_name): Add ret_p to indicate thunk for function + return. + (output_indirect_thunk_function): Pass false to + indirect_thunk_name. + (ix86_output_indirect_branch_via_reg): Likewise. + (ix86_output_indirect_branch_via_push): Likewise. + (output_indirect_thunk_function): Create alias for function + return thunk if regno < 0. + (ix86_output_function_return): New function. + (ix86_handle_fndecl_attribute): Handle function_return. + (ix86_attribute_table): Add function_return. + * config/i386/i386.h (machine_function): Add + function_return_type. + * config/i386/i386.md (simple_return_internal): Use + ix86_output_function_return. + (simple_return_internal_long): Likewise. + * config/i386/i386.opt (mfunction-return=): New option. + (indirect_branch): Mention -mfunction-return=. + * doc/extend.texi: Document function_return function attribute. + * doc/invoke.texi: Document -mfunction-return= option. + +gcc/testsuite/ + + Backport from mainline + 2018-01-14 H.J. Lu + + * gcc.target/i386/indirect-thunk-1.c (dg-options): Add + -mfunction-return=keep. + * gcc.target/i386/indirect-thunk-2.c: Likewise. + * gcc.target/i386/indirect-thunk-3.c: Likewise. + * gcc.target/i386/indirect-thunk-4.c: Likewise. + * gcc.target/i386/indirect-thunk-5.c: Likewise. + * gcc.target/i386/indirect-thunk-6.c: Likewise. + * gcc.target/i386/indirect-thunk-7.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-1.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-2.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-3.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-4.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-5.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-6.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-7.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-8.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-1.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-2.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-3.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-4.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-1.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-2.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-3.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-4.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-5.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-6.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-7.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-1.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-2.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-3.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-4.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-5.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-6.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-7.c: Likewise. + * gcc.target/i386/ret-thunk-1.c: New test. + * gcc.target/i386/ret-thunk-10.c: Likewise. + * gcc.target/i386/ret-thunk-11.c: Likewise. + * gcc.target/i386/ret-thunk-12.c: Likewise. + * gcc.target/i386/ret-thunk-13.c: Likewise. + * gcc.target/i386/ret-thunk-14.c: Likewise. + * gcc.target/i386/ret-thunk-15.c: Likewise. + * gcc.target/i386/ret-thunk-16.c: Likewise. + * gcc.target/i386/ret-thunk-2.c: Likewise. + * gcc.target/i386/ret-thunk-3.c: Likewise. + * gcc.target/i386/ret-thunk-4.c: Likewise. + * gcc.target/i386/ret-thunk-5.c: Likewise. + * gcc.target/i386/ret-thunk-6.c: Likewise. + * gcc.target/i386/ret-thunk-7.c: Likewise. + * gcc.target/i386/ret-thunk-8.c: Likewise. + * gcc.target/i386/ret-thunk-9.c: Likewise. + +i386: Don't use ASM_OUTPUT_DEF for TARGET_MACHO + +ASM_OUTPUT_DEF isn't defined for TARGET_MACHO. Use ASM_OUTPUT_LABEL to +generate the __x86_return_thunk label, instead of the set directive. +Update testcase to remove the __x86_return_thunk label check. Since +-fno-pic is ignored on Darwin, update testcases to sscan or "push" +only on Linux. + +gcc/ + + Backport from mainline + 2018-01-15 H.J. Lu + + PR target/83839 + * config/i386/i386.c (output_indirect_thunk_function): Use + ASM_OUTPUT_LABEL, instead of ASM_OUTPUT_DEF, for TARGET_MACHO + for __x86.return_thunk. + +gcc/testsuite/ + + Backport from mainline + 2018-01-15 H.J. Lu + + PR target/83839 + * gcc.target/i386/indirect-thunk-1.c: Scan for "push" only on + Linux. + * gcc.target/i386/indirect-thunk-2.c: Likewise. + * gcc.target/i386/indirect-thunk-3.c: Likewise. + * gcc.target/i386/indirect-thunk-4.c: Likewise. + * gcc.target/i386/indirect-thunk-7.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-1.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-2.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-5.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-6.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-7.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-1.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-2.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-3.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-4.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-7.c: Likewise. + * gcc.target/i386/indirect-thunk-register-1.c: Likewise. + * gcc.target/i386/indirect-thunk-register-3.c: Likewise. + * gcc.target/i386/indirect-thunk-register-4.c: Likewise. + * gcc.target/i386/ret-thunk-10.c: Likewise. + * gcc.target/i386/ret-thunk-11.c: Likewise. + * gcc.target/i386/ret-thunk-12.c: Likewise. + * gcc.target/i386/ret-thunk-13.c: Likewise. + * gcc.target/i386/ret-thunk-14.c: Likewise. + * gcc.target/i386/ret-thunk-15.c: Likewise. + * gcc.target/i386/ret-thunk-9.c: Don't check the + __x86_return_thunk label. + Scan for "push" only for Linux. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256734 138bc75d-0d04-0410-961f-82ee72b054a4 + +[Ubuntu note: Dropped indirect-thunk-5.c, indirect-thunk-6.c, + indirect-thunk-bnd-3.c, indirect-thunk-bnd-4.c, + indirect-thunk-extern-5.c, indirect-thunk-extern-6.c, + indirect-thunk-inline-5.c, and indirect-thunk-inline-6.c tests due + to gcc 5.4 and earlier not supporting the -fno-plt option. + --sbeattie,] + +--- + src/gcc/config/i386/i386-protos.h | 1 + src/gcc/config/i386/i386.c | 152 +++++++++++- + src/gcc/config/i386/i386.h | 3 + src/gcc/config/i386/i386.md | 9 + src/gcc/config/i386/i386.opt | 6 + src/gcc/doc/extend.texi | 9 + src/gcc/doc/invoke.texi | 13 - + src/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c | 4 + src/gcc/testsuite/gcc.target/i386/ret-thunk-1.c | 13 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-10.c | 23 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-11.c | 23 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-12.c | 22 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-13.c | 22 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-14.c | 22 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-15.c | 22 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-16.c | 18 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-2.c | 13 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-3.c | 12 + src/gcc/testsuite/gcc.target/i386/ret-thunk-4.c | 12 + src/gcc/testsuite/gcc.target/i386/ret-thunk-5.c | 15 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-6.c | 14 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-7.c | 13 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-8.c | 14 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-9.c | 24 + + 48 files changed, 507 insertions(+), 66 deletions(-) + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-1.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-10.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-11.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-12.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-13.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-14.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-15.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-16.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-2.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-3.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-4.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-5.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-6.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-7.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-8.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-9.c + +Index: b/src/gcc/doc/extend.texi +=================================================================== +--- a/src/gcc/doc/extend.texi ++++ b/src/gcc/doc/extend.texi +@@ -4129,6 +4129,15 @@ call and jump to call and return thunk. + indirect call and jump to inlined call and return thunk. + @samp{thunk-extern} converts indirect call and jump to external call + and return thunk provided in a separate object file. ++ ++@item function_return("@var{choice}") ++@cindex @code{function_return} function attribute, x86 ++On x86 targets, the @code{function_return} attribute causes the compiler ++to convert function return with @var{choice}. @samp{keep} keeps function ++return unmodified. @samp{thunk} converts function return to call and ++return thunk. @samp{thunk-inline} converts function return to inlined ++call and return thunk. @samp{thunk-extern} converts function return to ++external call and return thunk provided in a separate object file. + @end table + + On the PowerPC, the following options are allowed: +Index: b/src/gcc/doc/invoke.texi +=================================================================== +--- a/src/gcc/doc/invoke.texi ++++ b/src/gcc/doc/invoke.texi +@@ -1091,7 +1091,7 @@ See RS/6000 and PowerPC Options. + -msse2avx -mfentry -mrecord-mcount -mnop-mcount -m8bit-idiv @gol + -mavx256-split-unaligned-load -mavx256-split-unaligned-store @gol + -malign-data=@var{type} -mstack-protector-guard=@var{guard} @gol +--mindirect-branch=@var{choice}} ++-mindirect-branch=@var{choice} -mfunction-return=@var{choice}} + + @emph{x86 Windows Options} + @gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol +@@ -24029,6 +24029,17 @@ to external call and return thunk provid + You can control this behavior for a specific function by using the + function attribute @code{indirect_branch}. @xref{Function Attributes}. + ++@item -mfunction-return=@var{choice} ++@opindex -mfunction-return ++Convert function return with @var{choice}. The default is @samp{keep}, ++which keeps function return unmodified. @samp{thunk} converts function ++return to call and return thunk. @samp{thunk-inline} converts function ++return to inlined call and return thunk. @samp{thunk-extern} converts ++function return to external call and return thunk provided in a separate ++object file. You can control this behavior for a specific function by ++using the function attribute @code{function_return}. ++@xref{Function Attributes}. ++ + @end table + + @c man end diff --git a/development/gcc5/patches/0006-x86-Add-mfunction-return.diff b/development/gcc5/patches/0006-x86-Add-mfunction-return.diff new file mode 100644 index 0000000000..1883cc6a51 --- /dev/null +++ b/development/gcc5/patches/0006-x86-Add-mfunction-return.diff @@ -0,0 +1,1409 @@ +From 357311dd400f7f72d2132f2f94161ece39bf08c6 Mon Sep 17 00:00:00 2001 +From: hjl +Date: Tue, 16 Jan 2018 11:10:44 +0000 +Subject: [PATCH 6/9] x86: Add -mfunction-return= + +Add -mfunction-return= option to convert function return to call and +return thunks. The default is 'keep', which keeps function return +unmodified. 'thunk' converts function return to call and return thunk. +'thunk-inline' converts function return to inlined call and return thunk. +'thunk-extern' converts function return to external call and return +thunk provided in a separate object file. You can control this behavior +for a specific function by using the function attribute function_return. + +Function return thunk is the same as memory thunk for -mindirect-branch= +where the return address is at the top of the stack: + +__x86_return_thunk: + call L2 +L1: + pause + lfence + jmp L1 +L2: + lea 8(%rsp), %rsp|lea 4(%esp), %esp + ret + +and function return becomes + + jmp __x86_return_thunk + +-mindirect-branch= tests are updated with -mfunction-return=keep to +avoid false test failures when -mfunction-return=thunk is added to +RUNTESTFLAGS for "make check". + +gcc/ + + Backport from mainline + 2018-01-14 H.J. Lu + + * config/i386/i386-protos.h (ix86_output_function_return): New. + * config/i386/i386.c (ix86_set_indirect_branch_type): Also + set function_return_type. + (indirect_thunk_name): Add ret_p to indicate thunk for function + return. + (output_indirect_thunk_function): Pass false to + indirect_thunk_name. + (ix86_output_indirect_branch_via_reg): Likewise. + (ix86_output_indirect_branch_via_push): Likewise. + (output_indirect_thunk_function): Create alias for function + return thunk if regno < 0. + (ix86_output_function_return): New function. + (ix86_handle_fndecl_attribute): Handle function_return. + (ix86_attribute_table): Add function_return. + * config/i386/i386.h (machine_function): Add + function_return_type. + * config/i386/i386.md (simple_return_internal): Use + ix86_output_function_return. + (simple_return_internal_long): Likewise. + * config/i386/i386.opt (mfunction-return=): New option. + (indirect_branch): Mention -mfunction-return=. + * doc/extend.texi: Document function_return function attribute. + * doc/invoke.texi: Document -mfunction-return= option. + +gcc/testsuite/ + + Backport from mainline + 2018-01-14 H.J. Lu + + * gcc.target/i386/indirect-thunk-1.c (dg-options): Add + -mfunction-return=keep. + * gcc.target/i386/indirect-thunk-2.c: Likewise. + * gcc.target/i386/indirect-thunk-3.c: Likewise. + * gcc.target/i386/indirect-thunk-4.c: Likewise. + * gcc.target/i386/indirect-thunk-5.c: Likewise. + * gcc.target/i386/indirect-thunk-6.c: Likewise. + * gcc.target/i386/indirect-thunk-7.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-1.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-2.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-3.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-4.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-5.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-6.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-7.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-8.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-1.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-2.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-3.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-4.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-1.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-2.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-3.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-4.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-5.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-6.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-7.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-1.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-2.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-3.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-4.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-5.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-6.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-7.c: Likewise. + * gcc.target/i386/ret-thunk-1.c: New test. + * gcc.target/i386/ret-thunk-10.c: Likewise. + * gcc.target/i386/ret-thunk-11.c: Likewise. + * gcc.target/i386/ret-thunk-12.c: Likewise. + * gcc.target/i386/ret-thunk-13.c: Likewise. + * gcc.target/i386/ret-thunk-14.c: Likewise. + * gcc.target/i386/ret-thunk-15.c: Likewise. + * gcc.target/i386/ret-thunk-16.c: Likewise. + * gcc.target/i386/ret-thunk-2.c: Likewise. + * gcc.target/i386/ret-thunk-3.c: Likewise. + * gcc.target/i386/ret-thunk-4.c: Likewise. + * gcc.target/i386/ret-thunk-5.c: Likewise. + * gcc.target/i386/ret-thunk-6.c: Likewise. + * gcc.target/i386/ret-thunk-7.c: Likewise. + * gcc.target/i386/ret-thunk-8.c: Likewise. + * gcc.target/i386/ret-thunk-9.c: Likewise. + +i386: Don't use ASM_OUTPUT_DEF for TARGET_MACHO + +ASM_OUTPUT_DEF isn't defined for TARGET_MACHO. Use ASM_OUTPUT_LABEL to +generate the __x86_return_thunk label, instead of the set directive. +Update testcase to remove the __x86_return_thunk label check. Since +-fno-pic is ignored on Darwin, update testcases to sscan or "push" +only on Linux. + +gcc/ + + Backport from mainline + 2018-01-15 H.J. Lu + + PR target/83839 + * config/i386/i386.c (output_indirect_thunk_function): Use + ASM_OUTPUT_LABEL, instead of ASM_OUTPUT_DEF, for TARGET_MACHO + for __x86.return_thunk. + +gcc/testsuite/ + + Backport from mainline + 2018-01-15 H.J. Lu + + PR target/83839 + * gcc.target/i386/indirect-thunk-1.c: Scan for "push" only on + Linux. + * gcc.target/i386/indirect-thunk-2.c: Likewise. + * gcc.target/i386/indirect-thunk-3.c: Likewise. + * gcc.target/i386/indirect-thunk-4.c: Likewise. + * gcc.target/i386/indirect-thunk-7.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-1.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-2.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-5.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-6.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-7.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-1.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-2.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-3.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-4.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-7.c: Likewise. + * gcc.target/i386/indirect-thunk-register-1.c: Likewise. + * gcc.target/i386/indirect-thunk-register-3.c: Likewise. + * gcc.target/i386/indirect-thunk-register-4.c: Likewise. + * gcc.target/i386/ret-thunk-10.c: Likewise. + * gcc.target/i386/ret-thunk-11.c: Likewise. + * gcc.target/i386/ret-thunk-12.c: Likewise. + * gcc.target/i386/ret-thunk-13.c: Likewise. + * gcc.target/i386/ret-thunk-14.c: Likewise. + * gcc.target/i386/ret-thunk-15.c: Likewise. + * gcc.target/i386/ret-thunk-9.c: Don't check the + __x86_return_thunk label. + Scan for "push" only for Linux. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256734 138bc75d-0d04-0410-961f-82ee72b054a4 + +[Ubuntu note: Dropped indirect-thunk-5.c, indirect-thunk-6.c, + indirect-thunk-bnd-3.c, indirect-thunk-bnd-4.c, + indirect-thunk-extern-5.c, indirect-thunk-extern-6.c, + indirect-thunk-inline-5.c, and indirect-thunk-inline-6.c tests due + to gcc 5.4 and earlier not supporting the -fno-plt option. + --sbeattie,] + +--- + src/gcc/config/i386/i386-protos.h | 1 + src/gcc/config/i386/i386.c | 152 +++++++++++- + src/gcc/config/i386/i386.h | 3 + src/gcc/config/i386/i386.md | 9 + src/gcc/config/i386/i386.opt | 6 + src/gcc/doc/extend.texi | 9 + src/gcc/doc/invoke.texi | 13 - + src/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c | 4 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c | 4 + src/gcc/testsuite/gcc.target/i386/ret-thunk-1.c | 13 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-10.c | 23 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-11.c | 23 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-12.c | 22 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-13.c | 22 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-14.c | 22 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-15.c | 22 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-16.c | 18 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-2.c | 13 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-3.c | 12 + src/gcc/testsuite/gcc.target/i386/ret-thunk-4.c | 12 + src/gcc/testsuite/gcc.target/i386/ret-thunk-5.c | 15 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-6.c | 14 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-7.c | 13 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-8.c | 14 + + src/gcc/testsuite/gcc.target/i386/ret-thunk-9.c | 24 + + 48 files changed, 507 insertions(+), 66 deletions(-) + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-1.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-10.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-11.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-12.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-13.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-14.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-15.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-16.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-2.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-3.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-4.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-5.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-6.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-7.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-8.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-9.c + +Index: b/src/gcc/config/i386/i386-protos.h +=================================================================== +--- a/src/gcc/config/i386/i386-protos.h ++++ b/src/gcc/config/i386/i386-protos.h +@@ -307,6 +307,7 @@ extern enum attr_cpu ix86_schedule; + + extern const char * ix86_output_call_insn (rtx_insn *insn, rtx call_op); + extern const char * ix86_output_indirect_jmp (rtx call_op, bool ret_p); ++extern const char * ix86_output_function_return (bool long_p); + + #ifdef RTX_CODE + /* Target data for multipass lookahead scheduling. +Index: b/src/gcc/config/i386/i386.c +=================================================================== +--- a/src/gcc/config/i386/i386.c ++++ b/src/gcc/config/i386/i386.c +@@ -5166,6 +5166,31 @@ ix86_set_indirect_branch_type (tree fnde + else + cfun->machine->indirect_branch_type = ix86_indirect_branch; + } ++ ++ if (cfun->machine->function_return_type == indirect_branch_unset) ++ { ++ tree attr = lookup_attribute ("function_return", ++ DECL_ATTRIBUTES (fndecl)); ++ if (attr != NULL) ++ { ++ tree args = TREE_VALUE (attr); ++ if (args == NULL) ++ gcc_unreachable (); ++ tree cst = TREE_VALUE (args); ++ if (strcmp (TREE_STRING_POINTER (cst), "keep") == 0) ++ cfun->machine->function_return_type = indirect_branch_keep; ++ else if (strcmp (TREE_STRING_POINTER (cst), "thunk") == 0) ++ cfun->machine->function_return_type = indirect_branch_thunk; ++ else if (strcmp (TREE_STRING_POINTER (cst), "thunk-inline") == 0) ++ cfun->machine->function_return_type = indirect_branch_thunk_inline; ++ else if (strcmp (TREE_STRING_POINTER (cst), "thunk-extern") == 0) ++ cfun->machine->function_return_type = indirect_branch_thunk_extern; ++ else ++ gcc_unreachable (); ++ } ++ else ++ cfun->machine->function_return_type = ix86_function_return; ++ } + } + + /* Establish appropriate back-end context for processing the function +@@ -9753,8 +9778,12 @@ static int indirect_thunks_bnd_used; + /* Fills in the label name that should be used for the indirect thunk. */ + + static void +-indirect_thunk_name (char name[32], int regno, bool need_bnd_p) ++indirect_thunk_name (char name[32], int regno, bool need_bnd_p, ++ bool ret_p) + { ++ if (regno >= 0 && ret_p) ++ gcc_unreachable (); ++ + if (USE_HIDDEN_LINKONCE) + { + const char *bnd = need_bnd_p ? "_bnd" : ""; +@@ -9769,7 +9798,10 @@ indirect_thunk_name (char name[32], int + bnd, reg_prefix, reg_names[regno]); + } + else +- sprintf (name, "__x86_indirect_thunk%s", bnd); ++ { ++ const char *ret = ret_p ? "return" : "indirect"; ++ sprintf (name, "__x86_%s_thunk%s", ret, bnd); ++ } + } + else + { +@@ -9782,10 +9814,20 @@ indirect_thunk_name (char name[32], int + } + else + { +- if (need_bnd_p) +- ASM_GENERATE_INTERNAL_LABEL (name, "LITB", 0); ++ if (ret_p) ++ { ++ if (need_bnd_p) ++ ASM_GENERATE_INTERNAL_LABEL (name, "LRTB", 0); ++ else ++ ASM_GENERATE_INTERNAL_LABEL (name, "LRT", 0); ++ } + else +- ASM_GENERATE_INTERNAL_LABEL (name, "LIT", 0); ++ { ++ if (need_bnd_p) ++ ASM_GENERATE_INTERNAL_LABEL (name, "LITB", 0); ++ else ++ ASM_GENERATE_INTERNAL_LABEL (name, "LIT", 0); ++ } + } + } + } +@@ -9880,7 +9922,7 @@ output_indirect_thunk_function (bool nee + tree decl; + + /* Create __x86_indirect_thunk/__x86_indirect_thunk_bnd. */ +- indirect_thunk_name (name, regno, need_bnd_p); ++ indirect_thunk_name (name, regno, need_bnd_p, false); + decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL, + get_identifier (name), + build_function_type_list (void_type_node, NULL_TREE)); +@@ -9923,6 +9965,36 @@ output_indirect_thunk_function (bool nee + ASM_OUTPUT_LABEL (asm_out_file, name); + } + ++ if (regno < 0) ++ { ++ /* Create alias for __x86.return_thunk/__x86.return_thunk_bnd. */ ++ char alias[32]; ++ ++ indirect_thunk_name (alias, regno, need_bnd_p, true); ++#if TARGET_MACHO ++ if (TARGET_MACHO) ++ { ++ fputs ("\t.weak_definition\t", asm_out_file); ++ assemble_name (asm_out_file, alias); ++ fputs ("\n\t.private_extern\t", asm_out_file); ++ assemble_name (asm_out_file, alias); ++ putc ('\n', asm_out_file); ++ ASM_OUTPUT_LABEL (asm_out_file, alias); ++ } ++#else ++ ASM_OUTPUT_DEF (asm_out_file, alias, name); ++ if (USE_HIDDEN_LINKONCE) ++ { ++ fputs ("\t.globl\t", asm_out_file); ++ assemble_name (asm_out_file, alias); ++ putc ('\n', asm_out_file); ++ fputs ("\t.hidden\t", asm_out_file); ++ assemble_name (asm_out_file, alias); ++ putc ('\n', asm_out_file); ++ } ++#endif ++ } ++ + DECL_INITIAL (decl) = make_node (BLOCK); + current_function_decl = decl; + allocate_struct_function (decl, false); +@@ -26121,7 +26193,7 @@ ix86_output_indirect_branch_via_reg (rtx + else + indirect_thunks_used |= 1 << i; + } +- indirect_thunk_name (thunk_name_buf, regno, need_bnd_p); ++ indirect_thunk_name (thunk_name_buf, regno, need_bnd_p, false); + thunk_name = thunk_name_buf; + } + else +@@ -26230,7 +26302,7 @@ ix86_output_indirect_branch_via_push (rt + else + indirect_thunk_needed = true; + } +- indirect_thunk_name (thunk_name_buf, regno, need_bnd_p); ++ indirect_thunk_name (thunk_name_buf, regno, need_bnd_p, false); + thunk_name = thunk_name_buf; + } + else +@@ -26365,6 +26437,46 @@ ix86_output_indirect_jmp (rtx call_op, b + return "%!jmp\t%A0"; + } + ++/* Output function return. CALL_OP is the jump target. Add a REP ++ prefix to RET if LONG_P is true and function return is kept. */ ++ ++const char * ++ix86_output_function_return (bool long_p) ++{ ++ if (cfun->machine->function_return_type != indirect_branch_keep) ++ { ++ char thunk_name[32]; ++ bool need_bnd_p = ix86_bnd_prefixed_insn_p (current_output_insn); ++ ++ if (cfun->machine->function_return_type ++ != indirect_branch_thunk_inline) ++ { ++ bool need_thunk = (cfun->machine->function_return_type ++ == indirect_branch_thunk); ++ indirect_thunk_name (thunk_name, -1, need_bnd_p, true); ++ if (need_bnd_p) ++ { ++ indirect_thunk_bnd_needed |= need_thunk; ++ fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name); ++ } ++ else ++ { ++ indirect_thunk_needed |= need_thunk; ++ fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name); ++ } ++ } ++ else ++ output_indirect_thunk (need_bnd_p, -1); ++ ++ return ""; ++ } ++ ++ if (!long_p || ix86_bnd_prefixed_insn_p (current_output_insn)) ++ return "%!ret"; ++ ++ return "rep%; ret"; ++} ++ + /* Output the assembly for a call instruction. */ + + const char * +@@ -43625,6 +43737,28 @@ ix86_handle_fndecl_attribute (tree *node + } + } + ++ if (is_attribute_p ("function_return", name)) ++ { ++ tree cst = TREE_VALUE (args); ++ if (TREE_CODE (cst) != STRING_CST) ++ { ++ warning (OPT_Wattributes, ++ "%qE attribute requires a string constant argument", ++ name); ++ *no_add_attrs = true; ++ } ++ else if (strcmp (TREE_STRING_POINTER (cst), "keep") != 0 ++ && strcmp (TREE_STRING_POINTER (cst), "thunk") != 0 ++ && strcmp (TREE_STRING_POINTER (cst), "thunk-inline") != 0 ++ && strcmp (TREE_STRING_POINTER (cst), "thunk-extern") != 0) ++ { ++ warning (OPT_Wattributes, ++ "argument to %qE attribute is not " ++ "(keep|thunk|thunk-inline|thunk-extern)", name); ++ *no_add_attrs = true; ++ } ++ } ++ + return NULL_TREE; + } + +@@ -47519,6 +47653,8 @@ static const struct attribute_spec ix86_ + ix86_handle_callee_pop_aggregate_return, true }, + { "indirect_branch", 1, 1, true, false, false, + ix86_handle_fndecl_attribute, false }, ++ { "function_return", 1, 1, true, false, false, ++ ix86_handle_fndecl_attribute, false }, + + /* End element. */ + { NULL, 0, 0, false, false, false, NULL, false } +Index: b/src/gcc/config/i386/i386.h +=================================================================== +--- a/src/gcc/config/i386/i386.h ++++ b/src/gcc/config/i386/i386.h +@@ -2562,6 +2562,9 @@ struct GTY(()) machine_function { + "indirect_jump" or "tablejump". */ + BOOL_BITFIELD has_local_indirect_jump : 1; + ++ /* How to generate function return. */ ++ ENUM_BITFIELD(indirect_branch) function_return_type : 3; ++ + /* During prologue/epilogue generation, the current frame state. + Otherwise, the frame state at the end of the prologue. */ + struct machine_frame_state fs; +Index: b/src/gcc/config/i386/i386.md +=================================================================== +--- a/src/gcc/config/i386/i386.md ++++ b/src/gcc/config/i386/i386.md +@@ -12169,7 +12169,7 @@ + (define_insn "simple_return_internal" + [(simple_return)] + "reload_completed" +- "%!ret" ++ "* return ix86_output_function_return (false);" + [(set_attr "length_nobnd" "1") + (set_attr "atom_unit" "jeu") + (set_attr "length_immediate" "0") +@@ -12182,12 +12182,7 @@ + [(simple_return) + (unspec [(const_int 0)] UNSPEC_REP)] + "reload_completed" +-{ +- if (ix86_bnd_prefixed_insn_p (insn)) +- return "%!ret"; +- +- return "rep%; ret"; +-} ++ "* return ix86_output_function_return (true);" + [(set_attr "length" "2") + (set_attr "atom_unit" "jeu") + (set_attr "length_immediate" "0") +Index: b/src/gcc/config/i386/i386.opt +=================================================================== +--- a/src/gcc/config/i386/i386.opt ++++ b/src/gcc/config/i386/i386.opt +@@ -881,9 +881,13 @@ mindirect-branch= + Target Report RejectNegative Joined Enum(indirect_branch) Var(ix86_indirect_branch) Init(indirect_branch_keep) + Convert indirect call and jump to call and return thunks. + ++mfunction-return= ++Target Report RejectNegative Joined Enum(indirect_branch) Var(ix86_function_return) Init(indirect_branch_keep) ++Convert function return to call and return thunk. ++ + Enum + Name(indirect_branch) Type(enum indirect_branch) +-Known indirect branch choices (for use with the -mindirect-branch= option): ++Known indirect branch choices (for use with the -mindirect-branch=/-mfunction-return= options): + + EnumValue + Enum(indirect_branch) String(keep) Value(indirect_branch_keep) +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -11,7 +11,7 @@ male_indirect_jump (long offset) + dispatch(offset); + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -11,7 +11,7 @@ male_indirect_jump (long offset) + dispatch[offset](offset); + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -12,7 +12,7 @@ male_indirect_jump (long offset) + return 0; + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ + /* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -12,7 +12,7 @@ male_indirect_jump (long offset) + return 0; + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ + /* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ + + void func0 (void); + void func1 (void); +@@ -35,7 +35,7 @@ bar (int i) + } + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -14,7 +14,7 @@ male_indirect_jump (long offset) + dispatch(offset); + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -12,7 +12,7 @@ male_indirect_jump (long offset) + dispatch[offset](offset); + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -14,7 +14,7 @@ male_indirect_jump (long offset) + return 0; + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */ + /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */ + /* { dg-final { scan-assembler {\tpause} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -13,7 +13,7 @@ male_indirect_jump (long offset) + return 0; + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */ + /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */ + /* { dg-final { scan-assembler {\tpause} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -14,7 +14,7 @@ male_indirect_jump (long offset) + return 0; + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */ + /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -13,7 +13,7 @@ male_indirect_jump (long offset) + return 0; + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */ + /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ + + void func0 (void); + void func1 (void); +@@ -36,7 +36,7 @@ bar (int i) + } + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" } } */ + /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-8.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mindirect-branch=thunk -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ + + void func0 (void); + void func1 (void); +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile { target { ! x32 } } } */ +-/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */ + + void (*dispatch) (char *); + char buf[10]; +@@ -10,7 +10,7 @@ foo (void) + dispatch (buf); + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "pushq\[ \t\]%rax" { target x32 } } } */ + /* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c +@@ -1,5 +1,5 @@ + /* { dg-do compile { target { ! x32 } } } */ +-/* { dg-options "-O2 -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */ + + void (*dispatch) (char *); + char buf[10]; +@@ -11,7 +11,7 @@ foo (void) + return 0; + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "pushq\[ \t\]%rax" { target x32 } } } */ + /* { dg-final { scan-assembler "bnd jmp\[ \t\]*__x86_indirect_thunk_bnd" } } */ + /* { dg-final { scan-assembler "bnd jmp\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -11,7 +11,7 @@ male_indirect_jump (long offset) + dispatch(offset); + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ + /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -11,7 +11,7 @@ male_indirect_jump (long offset) + dispatch[offset](offset); + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ + /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -12,7 +12,7 @@ male_indirect_jump (long offset) + return 0; + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ + /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */ + /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -12,7 +12,7 @@ male_indirect_jump (long offset) + return 0; + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ + /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */ + /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 1 { target { ! x32 } } } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mindirect-branch=thunk-extern -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ + + void func0 (void); + void func1 (void); +@@ -35,7 +35,7 @@ bar (int i) + } + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ + /* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -11,7 +11,7 @@ male_indirect_jump (long offset) + dispatch(offset); + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ + /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ + /* { dg-final { scan-assembler {\tpause} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -11,7 +11,7 @@ male_indirect_jump (long offset) + dispatch[offset](offset); + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ + /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ + /* { dg-final { scan-assembler {\tpause} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -12,7 +12,7 @@ male_indirect_jump (long offset) + return 0; + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */ + /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */ + /* { dg-final { scan-assembler-times {\tpause} 1 } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +@@ -12,7 +12,7 @@ male_indirect_jump (long offset) + return 0; + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?dispatch" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 2 } } */ + /* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 2 } } */ + /* { dg-final { scan-assembler-times {\tpause} 1 } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mindirect-branch=thunk-inline -fno-pic" } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ + + void func0 (void); + void func1 (void); +@@ -35,7 +35,7 @@ bar (int i) + } + } + +-/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*\.L\[0-9\]+\\(,%" { target { { ! x32 } && *-*-linux* } } } } */ + /* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */ + /* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ + /* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-1.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-1.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mfunction-return=thunk" } */ ++ ++void ++foo (void) ++{ ++} ++ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-10.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-10.c +@@ -0,0 +1,23 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic" } */ ++ ++extern void (*bar) (void); ++ ++int ++foo (void) ++{ ++ bar (); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */ ++/* { dg-final { scan-assembler-times {\tpause} 2 } } */ ++/* { dg-final { scan-assembler-times {\tlfence} 2 } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "__x86_indirect_thunk:" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target { x32 } } } } */ ++/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:" { target { x32 } } } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-11.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-11.c +@@ -0,0 +1,23 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mfunction-return=thunk-extern -mindirect-branch=thunk -fno-pic" } */ ++ ++extern void (*bar) (void); ++ ++int ++foo (void) ++{ ++ bar (); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */ ++/* { dg-final { scan-assembler-times {\tpause} 1 } } */ ++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "__x86_indirect_thunk:" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target { x32 } } } } */ ++/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:" { target { x32 } } } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-12.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-12.c +@@ -0,0 +1,22 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ ++ ++extern void (*bar) (void); ++ ++int ++foo (void) ++{ ++ bar (); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */ ++/* { dg-final { scan-assembler-times {\tpause} 1 } } */ ++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "__x86_indirect_thunk:" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target { x32 } } } } */ ++/* { dg-final { scan-assembler "__x86_indirect_thunk_(r|e)ax:" { target { x32 } } } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-13.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-13.c +@@ -0,0 +1,22 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ ++ ++extern void (*bar) (void); ++extern int foo (void) __attribute__ ((function_return("thunk"))); ++ ++int ++foo (void) ++{ ++ bar (); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */ ++/* { dg-final { scan-assembler-times {\tpause} 2 } } */ ++/* { dg-final { scan-assembler-times {\tlfence} 2 } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */ ++/* { dg-final { scan-assembler-times "jmp\[ \t\]*\.LIND" 3 } } */ ++/* { dg-final { scan-assembler-times "call\[ \t\]*\.LIND" 3 } } */ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_indirect_thunk" } } */ ++/* { dg-final { scan-assembler-not "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target { x32 } } } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-14.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-14.c +@@ -0,0 +1,22 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ ++ ++extern void (*bar) (void); ++ ++__attribute__ ((function_return("thunk-inline"))) ++int ++foo (void) ++{ ++ bar (); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler-times {\tpause} 1 } } */ ++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target { x32 } } } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-15.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-15.c +@@ -0,0 +1,22 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -fno-pic" } */ ++ ++extern void (*bar) (void); ++ ++__attribute__ ((function_return("thunk-extern"), indirect_branch("thunk"))) ++int ++foo (void) ++{ ++ bar (); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler-times {\tpause} 1 } } */ ++/* { dg-final { scan-assembler-times {\tlfence} 1 } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target x32 } } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-16.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-16.c +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mfunction-return=thunk-inline -mindirect-branch=thunk-extern -fno-pic" } */ ++ ++extern void (*bar) (void); ++ ++__attribute__ ((function_return("keep"), indirect_branch("keep"))) ++int ++foo (void) ++{ ++ bar (); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */ ++/* { dg-final { scan-assembler-not "__x86_return_thunk" } } */ ++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-2.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-2.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mfunction-return=thunk-inline" } */ ++ ++void ++foo (void) ++{ ++} ++ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-3.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-3.c +@@ -0,0 +1,12 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mfunction-return=thunk-extern" } */ ++ ++void ++foo (void) ++{ ++} ++ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */ ++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-4.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-4.c +@@ -0,0 +1,12 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mfunction-return=keep" } */ ++ ++void ++foo (void) ++{ ++} ++ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */ ++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-5.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-5.c +@@ -0,0 +1,15 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mfunction-return=keep" } */ ++ ++extern void foo (void) __attribute__ ((function_return("thunk"))); ++ ++void ++foo (void) ++{ ++} ++ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-6.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-6.c +@@ -0,0 +1,14 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mfunction-return=keep" } */ ++ ++__attribute__ ((function_return("thunk-inline"))) ++void ++foo (void) ++{ ++} ++ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler {\tlfence} } } */ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-7.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-7.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mfunction-return=keep" } */ ++ ++__attribute__ ((function_return("thunk-extern"))) ++void ++foo (void) ++{ ++} ++ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */ ++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-8.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-8.c +@@ -0,0 +1,14 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mfunction-return=thunk-inline" } */ ++ ++extern void foo (void) __attribute__ ((function_return("keep"))); ++ ++void ++foo (void) ++{ ++} ++ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk" } } */ ++/* { dg-final { scan-assembler-not {\t(lfence|pause)} } } */ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-9.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-9.c +@@ -0,0 +1,24 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mfunction-return=thunk -mindirect-branch=thunk -fno-pic" } */ ++ ++extern void (*bar) (void); ++ ++int ++foo (void) ++{ ++ bar (); ++ return 0; ++} ++ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk" } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "__x86_indirect_thunk:" } } */ ++/* { dg-final { scan-assembler-times {\tpause} 1 { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler-times {\tlfence} 1 { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler "push(?:l|q)\[ \t\]*_?bar" { target { { ! x32 } && *-*-linux* } } } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk" { target { ! x32 } } } } */ ++/* { dg-final { scan-assembler-times {\tpause} 2 { target { x32 } } } } */ ++/* { dg-final { scan-assembler-times {\tlfence} 2 { target { x32 } } } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_(r|e)ax" { target { x32 } } } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" { target x32 } } } */ diff --git a/development/gcc5/patches/0007-x86-Add-mindirect-branch-register-doc.diff b/development/gcc5/patches/0007-x86-Add-mindirect-branch-register-doc.diff new file mode 100644 index 0000000000..9780bfc918 --- /dev/null +++ b/development/gcc5/patches/0007-x86-Add-mindirect-branch-register-doc.diff @@ -0,0 +1,231 @@ +From 86118fbdbafe6af54b2da467e1073c49e1742116 Mon Sep 17 00:00:00 2001 +From: hjl +Date: Tue, 16 Jan 2018 11:17:49 +0000 +Subject: [PATCH 7/9] x86: Add -mindirect-branch-register (documentation) + +Add -mindirect-branch-register to force indirect branch via register. +This is implemented by disabling patterns of indirect branch via memory, +similar to TARGET_X32. + +-mindirect-branch= and -mfunction-return= tests are updated with +-mno-indirect-branch-register to avoid false test failures when +-mindirect-branch-register is added to RUNTESTFLAGS for "make check". + +gcc/ + + Backport from mainline + 2018-01-14 H.J. Lu + + * config/i386/constraints.md (Bs): Disallow memory operand for + -mindirect-branch-register. + (Bw): Likewise. + * config/i386/predicates.md (indirect_branch_operand): Likewise. + (GOT_memory_operand): Likewise. + (call_insn_operand): Likewise. + (sibcall_insn_operand): Likewise. + (GOT32_symbol_operand): Likewise. + * config/i386/i386.md (indirect_jump): Call convert_memory_address + for -mindirect-branch-register. + (tablejump): Likewise. + (*sibcall_memory): Likewise. + (*sibcall_value_memory): Likewise. + Disallow peepholes of indirect call and jump via memory for + -mindirect-branch-register. + (*call_pop): Replace m with Bw. + (*call_value_pop): Likewise. + (*sibcall_pop_memory): Replace m with Bs. + * config/i386/i386.opt (mindirect-branch-register): New option. + * doc/invoke.texi: Document -mindirect-branch-register option. + +gcc/testsuite/ + + Backport from mainline + 2018-01-14 H.J. Lu + + * gcc.target/i386/indirect-thunk-1.c (dg-options): Add + -mno-indirect-branch-register. + * gcc.target/i386/indirect-thunk-2.c: Likewise. + * gcc.target/i386/indirect-thunk-3.c: Likewise. + * gcc.target/i386/indirect-thunk-4.c: Likewise. + * gcc.target/i386/indirect-thunk-5.c: Likewise. + * gcc.target/i386/indirect-thunk-6.c: Likewise. + * gcc.target/i386/indirect-thunk-7.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-1.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-2.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-3.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-4.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-5.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-6.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-7.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-1.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-2.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-3.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-4.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-1.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-2.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-3.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-4.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-5.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-6.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-7.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-1.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-2.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-3.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-4.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-5.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-6.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-7.c: Likewise. + * gcc.target/i386/ret-thunk-10.c: Likewise. + * gcc.target/i386/ret-thunk-11.c: Likewise. + * gcc.target/i386/ret-thunk-12.c: Likewise. + * gcc.target/i386/ret-thunk-13.c: Likewise. + * gcc.target/i386/ret-thunk-14.c: Likewise. + * gcc.target/i386/ret-thunk-15.c: Likewise. + * gcc.target/i386/ret-thunk-9.c: Likewise. + * gcc.target/i386/indirect-thunk-register-1.c: New test. + * gcc.target/i386/indirect-thunk-register-2.c: Likewise. + * gcc.target/i386/indirect-thunk-register-3.c: Likewise. + +i386: Rename to ix86_indirect_branch_register + +Rename the variable for -mindirect-branch-register to +ix86_indirect_branch_register to match the command-line option name. + + Backport from mainline + 2018-01-15 H.J. Lu + + * config/i386/constraints.md (Bs): Replace + ix86_indirect_branch_thunk_register with + ix86_indirect_branch_register. + (Bw): Likewise. + * config/i386/i386.md (indirect_jump): Likewise. + (tablejump): Likewise. + (*sibcall_memory): Likewise. + (*sibcall_value_memory): Likewise. + Peepholes of indirect call and jump via memory: Likewise. + * config/i386/i386.opt: Likewise. + * config/i386/predicates.md (indirect_branch_operand): Likewise. + (GOT_memory_operand): Likewise. + (call_insn_operand): Likewise. + (sibcall_insn_operand): Likewise. + (GOT32_symbol_operand): Likewise. + +x86: Rewrite ix86_indirect_branch_register logic + +Rewrite ix86_indirect_branch_register logic with + +(and (not (match_test "ix86_indirect_branch_register")) + (original condition before r256662)) + + Backport from mainline + 2018-01-15 H.J. Lu + + * config/i386/predicates.md (constant_call_address_operand): + Rewrite ix86_indirect_branch_register logic. + (sibcall_insn_operand): Likewise. + +Don't check ix86_indirect_branch_register for GOT operand + +Since GOT_memory_operand and GOT32_symbol_operand are simple pattern +matches, don't check ix86_indirect_branch_register here. If needed, +-mindirect-branch= will convert indirect branch via GOT slot to a call +and return thunk. + + Backport from mainline + 2018-01-15 H.J. Lu + + * config/i386/constraints.md (Bs): Update + ix86_indirect_branch_register check. Don't check + ix86_indirect_branch_register with GOT_memory_operand. + (Bw): Likewise. + * config/i386/predicates.md (GOT_memory_operand): Don't check + ix86_indirect_branch_register here. + (GOT32_symbol_operand): Likewise. + +i386: Rewrite indirect_branch_operand logic + + Backport from mainline + 2018-01-15 H.J. Lu + + * config/i386/predicates.md (indirect_branch_operand): Rewrite + ix86_indirect_branch_register logic. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256735 138bc75d-0d04-0410-961f-82ee72b054a4 + +[Ubuntu note: Dropped indirect-thunk-5.c, indirect-thunk-6.c, + indirect-thunk-bnd-3.c, indirect-thunk-bnd-4.c, + indirect-thunk-extern-5.c, indirect-thunk-extern-6.c, + indirect-thunk-inline-5.c, and indirect-thunk-inline-6.c tests due + to gcc 5.4 and earlier not supporting the -fno-plt option. + --sbeattie,] +--- + src/gcc/config/i386/constraints.md | 6 + + src/gcc/config/i386/i386.md | 34 ++++++---- + src/gcc/config/i386/i386.opt | 4 + + src/gcc/config/i386/predicates.md | 9 +- + src/gcc/doc/invoke.texi | 7 +- + src/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c | 22 ++++++ + src/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c | 20 +++++ + src/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c | 19 +++++ + src/gcc/testsuite/gcc.target/i386/ret-thunk-10.c | 2 + src/gcc/testsuite/gcc.target/i386/ret-thunk-11.c | 2 + src/gcc/testsuite/gcc.target/i386/ret-thunk-12.c | 2 + src/gcc/testsuite/gcc.target/i386/ret-thunk-13.c | 2 + src/gcc/testsuite/gcc.target/i386/ret-thunk-14.c | 2 + src/gcc/testsuite/gcc.target/i386/ret-thunk-15.c | 2 + src/gcc/testsuite/gcc.target/i386/ret-thunk-9.c | 2 + 39 files changed, 134 insertions(+), 49 deletions(-) + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c + +Index: b/src/gcc/doc/invoke.texi +=================================================================== +--- a/src/gcc/doc/invoke.texi ++++ b/src/gcc/doc/invoke.texi +@@ -1091,7 +1091,8 @@ See RS/6000 and PowerPC Options. + -msse2avx -mfentry -mrecord-mcount -mnop-mcount -m8bit-idiv @gol + -mavx256-split-unaligned-load -mavx256-split-unaligned-store @gol + -malign-data=@var{type} -mstack-protector-guard=@var{guard} @gol +--mindirect-branch=@var{choice} -mfunction-return=@var{choice}} ++-mindirect-branch=@var{choice} -mfunction-return=@var{choice} @gol ++-mindirect-branch-register} + + @emph{x86 Windows Options} + @gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol +@@ -24040,6 +24041,10 @@ object file. You can control this behav + using the function attribute @code{function_return}. + @xref{Function Attributes}. + ++@item -mindirect-branch-register ++@opindex -mindirect-branch-register ++Force indirect call and jump via register. ++ + @end table + + @c man end diff --git a/development/gcc5/patches/0007-x86-Add-mindirect-branch-register.diff b/development/gcc5/patches/0007-x86-Add-mindirect-branch-register.diff new file mode 100644 index 0000000000..211368991f --- /dev/null +++ b/development/gcc5/patches/0007-x86-Add-mindirect-branch-register.diff @@ -0,0 +1,812 @@ +From 86118fbdbafe6af54b2da467e1073c49e1742116 Mon Sep 17 00:00:00 2001 +From: hjl +Date: Tue, 16 Jan 2018 11:17:49 +0000 +Subject: [PATCH 7/9] x86: Add -mindirect-branch-register + +Add -mindirect-branch-register to force indirect branch via register. +This is implemented by disabling patterns of indirect branch via memory, +similar to TARGET_X32. + +-mindirect-branch= and -mfunction-return= tests are updated with +-mno-indirect-branch-register to avoid false test failures when +-mindirect-branch-register is added to RUNTESTFLAGS for "make check". + +gcc/ + + Backport from mainline + 2018-01-14 H.J. Lu + + * config/i386/constraints.md (Bs): Disallow memory operand for + -mindirect-branch-register. + (Bw): Likewise. + * config/i386/predicates.md (indirect_branch_operand): Likewise. + (GOT_memory_operand): Likewise. + (call_insn_operand): Likewise. + (sibcall_insn_operand): Likewise. + (GOT32_symbol_operand): Likewise. + * config/i386/i386.md (indirect_jump): Call convert_memory_address + for -mindirect-branch-register. + (tablejump): Likewise. + (*sibcall_memory): Likewise. + (*sibcall_value_memory): Likewise. + Disallow peepholes of indirect call and jump via memory for + -mindirect-branch-register. + (*call_pop): Replace m with Bw. + (*call_value_pop): Likewise. + (*sibcall_pop_memory): Replace m with Bs. + * config/i386/i386.opt (mindirect-branch-register): New option. + * doc/invoke.texi: Document -mindirect-branch-register option. + +gcc/testsuite/ + + Backport from mainline + 2018-01-14 H.J. Lu + + * gcc.target/i386/indirect-thunk-1.c (dg-options): Add + -mno-indirect-branch-register. + * gcc.target/i386/indirect-thunk-2.c: Likewise. + * gcc.target/i386/indirect-thunk-3.c: Likewise. + * gcc.target/i386/indirect-thunk-4.c: Likewise. + * gcc.target/i386/indirect-thunk-5.c: Likewise. + * gcc.target/i386/indirect-thunk-6.c: Likewise. + * gcc.target/i386/indirect-thunk-7.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-1.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-2.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-3.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-4.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-5.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-6.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-7.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-1.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-2.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-3.c: Likewise. + * gcc.target/i386/indirect-thunk-bnd-4.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-1.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-2.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-3.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-4.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-5.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-6.c: Likewise. + * gcc.target/i386/indirect-thunk-extern-7.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-1.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-2.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-3.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-4.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-5.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-6.c: Likewise. + * gcc.target/i386/indirect-thunk-inline-7.c: Likewise. + * gcc.target/i386/ret-thunk-10.c: Likewise. + * gcc.target/i386/ret-thunk-11.c: Likewise. + * gcc.target/i386/ret-thunk-12.c: Likewise. + * gcc.target/i386/ret-thunk-13.c: Likewise. + * gcc.target/i386/ret-thunk-14.c: Likewise. + * gcc.target/i386/ret-thunk-15.c: Likewise. + * gcc.target/i386/ret-thunk-9.c: Likewise. + * gcc.target/i386/indirect-thunk-register-1.c: New test. + * gcc.target/i386/indirect-thunk-register-2.c: Likewise. + * gcc.target/i386/indirect-thunk-register-3.c: Likewise. + +i386: Rename to ix86_indirect_branch_register + +Rename the variable for -mindirect-branch-register to +ix86_indirect_branch_register to match the command-line option name. + + Backport from mainline + 2018-01-15 H.J. Lu + + * config/i386/constraints.md (Bs): Replace + ix86_indirect_branch_thunk_register with + ix86_indirect_branch_register. + (Bw): Likewise. + * config/i386/i386.md (indirect_jump): Likewise. + (tablejump): Likewise. + (*sibcall_memory): Likewise. + (*sibcall_value_memory): Likewise. + Peepholes of indirect call and jump via memory: Likewise. + * config/i386/i386.opt: Likewise. + * config/i386/predicates.md (indirect_branch_operand): Likewise. + (GOT_memory_operand): Likewise. + (call_insn_operand): Likewise. + (sibcall_insn_operand): Likewise. + (GOT32_symbol_operand): Likewise. + +x86: Rewrite ix86_indirect_branch_register logic + +Rewrite ix86_indirect_branch_register logic with + +(and (not (match_test "ix86_indirect_branch_register")) + (original condition before r256662)) + + Backport from mainline + 2018-01-15 H.J. Lu + + * config/i386/predicates.md (constant_call_address_operand): + Rewrite ix86_indirect_branch_register logic. + (sibcall_insn_operand): Likewise. + +Don't check ix86_indirect_branch_register for GOT operand + +Since GOT_memory_operand and GOT32_symbol_operand are simple pattern +matches, don't check ix86_indirect_branch_register here. If needed, +-mindirect-branch= will convert indirect branch via GOT slot to a call +and return thunk. + + Backport from mainline + 2018-01-15 H.J. Lu + + * config/i386/constraints.md (Bs): Update + ix86_indirect_branch_register check. Don't check + ix86_indirect_branch_register with GOT_memory_operand. + (Bw): Likewise. + * config/i386/predicates.md (GOT_memory_operand): Don't check + ix86_indirect_branch_register here. + (GOT32_symbol_operand): Likewise. + +i386: Rewrite indirect_branch_operand logic + + Backport from mainline + 2018-01-15 H.J. Lu + + * config/i386/predicates.md (indirect_branch_operand): Rewrite + ix86_indirect_branch_register logic. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256735 138bc75d-0d04-0410-961f-82ee72b054a4 + +[Ubuntu note: Dropped indirect-thunk-5.c, indirect-thunk-6.c, + indirect-thunk-bnd-3.c, indirect-thunk-bnd-4.c, + indirect-thunk-extern-5.c, indirect-thunk-extern-6.c, + indirect-thunk-inline-5.c, and indirect-thunk-inline-6.c tests due + to gcc 5.4 and earlier not supporting the -fno-plt option. + --sbeattie,] +--- + src/gcc/config/i386/constraints.md | 6 + + src/gcc/config/i386/i386.md | 34 ++++++---- + src/gcc/config/i386/i386.opt | 4 + + src/gcc/config/i386/predicates.md | 9 +- + src/gcc/doc/invoke.texi | 7 +- + src/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c | 2 + src/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c | 22 ++++++ + src/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c | 20 +++++ + src/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c | 19 +++++ + src/gcc/testsuite/gcc.target/i386/ret-thunk-10.c | 2 + src/gcc/testsuite/gcc.target/i386/ret-thunk-11.c | 2 + src/gcc/testsuite/gcc.target/i386/ret-thunk-12.c | 2 + src/gcc/testsuite/gcc.target/i386/ret-thunk-13.c | 2 + src/gcc/testsuite/gcc.target/i386/ret-thunk-14.c | 2 + src/gcc/testsuite/gcc.target/i386/ret-thunk-15.c | 2 + src/gcc/testsuite/gcc.target/i386/ret-thunk-9.c | 2 + 39 files changed, 134 insertions(+), 49 deletions(-) + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c + +Index: b/src/gcc/config/i386/constraints.md +=================================================================== +--- a/src/gcc/config/i386/constraints.md ++++ b/src/gcc/config/i386/constraints.md +@@ -157,12 +157,14 @@ + + (define_constraint "Bs" + "@internal Sibcall memory operand." +- (and (not (match_test "TARGET_X32")) ++ (and (not (match_test "ix86_indirect_branch_register")) ++ (not (match_test "TARGET_X32")) + (match_operand 0 "sibcall_memory_operand"))) + + (define_constraint "Bw" + "@internal Call memory operand." +- (and (not (match_test "TARGET_X32")) ++ (and (not (match_test "ix86_indirect_branch_register")) ++ (not (match_test "TARGET_X32")) + (match_operand 0 "memory_operand"))) + + (define_constraint "Bz" +Index: b/src/gcc/config/i386/i386.md +=================================================================== +--- a/src/gcc/config/i386/i386.md ++++ b/src/gcc/config/i386/i386.md +@@ -11554,7 +11554,7 @@ + [(set (pc) (match_operand 0 "indirect_branch_operand"))] + "" + { +- if (TARGET_X32) ++ if (TARGET_X32 || ix86_indirect_branch_register) + operands[0] = convert_memory_address (word_mode, operands[0]); + cfun->machine->has_local_indirect_jump = true; + }) +@@ -11607,7 +11607,7 @@ + OPTAB_DIRECT); + } + +- if (TARGET_X32) ++ if (TARGET_X32 || ix86_indirect_branch_register) + operands[0] = convert_memory_address (word_mode, operands[0]); + cfun->machine->has_local_indirect_jump = true; + }) +@@ -11764,7 +11764,7 @@ + [(call (mem:QI (match_operand:W 0 "memory_operand" "m")) + (match_operand 1)) + (unspec [(const_int 0)] UNSPEC_PEEPSIB)] +- "!TARGET_X32" ++ "!TARGET_X32 && !ix86_indirect_branch_register" + "* return ix86_output_call_insn (insn, operands[0]);" + [(set_attr "type" "call")]) + +@@ -11773,7 +11773,9 @@ + (match_operand:W 1 "memory_operand")) + (call (mem:QI (match_dup 0)) + (match_operand 3))] +- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (1)) ++ "!TARGET_X32 ++ && !ix86_indirect_branch_register ++ && SIBLING_CALL_P (peep2_next_insn (1)) + && peep2_reg_dead_p (2, operands[0])" + [(parallel [(call (mem:QI (match_dup 1)) + (match_dup 3)) +@@ -11785,7 +11787,9 @@ + (unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE) + (call (mem:QI (match_dup 0)) + (match_operand 3))] +- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (2)) ++ "!TARGET_X32 ++ && !ix86_indirect_branch_register ++ && SIBLING_CALL_P (peep2_next_insn (2)) + && peep2_reg_dead_p (3, operands[0])" + [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE) + (parallel [(call (mem:QI (match_dup 1)) +@@ -11806,7 +11810,7 @@ + }) + + (define_insn "*call_pop" +- [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lmBz")) ++ [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lBwBz")) + (match_operand 1)) + (set (reg:SI SP_REG) + (plus:SI (reg:SI SP_REG) +@@ -11826,7 +11830,7 @@ + [(set_attr "type" "call")]) + + (define_insn "*sibcall_pop_memory" +- [(call (mem:QI (match_operand:SI 0 "memory_operand" "m")) ++ [(call (mem:QI (match_operand:SI 0 "memory_operand" "Bs")) + (match_operand 1)) + (set (reg:SI SP_REG) + (plus:SI (reg:SI SP_REG) +@@ -11878,7 +11882,9 @@ + [(set (match_operand:W 0 "register_operand") + (match_operand:W 1 "memory_operand")) + (set (pc) (match_dup 0))] +- "!TARGET_X32 && peep2_reg_dead_p (2, operands[0])" ++ "!TARGET_X32 ++ && !ix86_indirect_branch_register ++ && peep2_reg_dead_p (2, operands[0])" + [(set (pc) (match_dup 1))]) + + ;; Call subroutine, returning value in operand 0 +@@ -11928,7 +11934,7 @@ + (call (mem:QI (match_operand:W 1 "memory_operand" "m")) + (match_operand 2))) + (unspec [(const_int 0)] UNSPEC_PEEPSIB)] +- "!TARGET_X32" ++ "!TARGET_X32 && !ix86_indirect_branch_register" + "* return ix86_output_call_insn (insn, operands[1]);" + [(set_attr "type" "callv")]) + +@@ -11938,7 +11944,9 @@ + (set (match_operand 2) + (call (mem:QI (match_dup 0)) + (match_operand 3)))] +- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (1)) ++ "!TARGET_X32 ++ && !ix86_indirect_branch_register ++ && SIBLING_CALL_P (peep2_next_insn (1)) + && peep2_reg_dead_p (2, operands[0])" + [(parallel [(set (match_dup 2) + (call (mem:QI (match_dup 1)) +@@ -11952,7 +11960,9 @@ + (set (match_operand 2) + (call (mem:QI (match_dup 0)) + (match_operand 3)))] +- "!TARGET_X32 && SIBLING_CALL_P (peep2_next_insn (2)) ++ "!TARGET_X32 ++ && !ix86_indirect_branch_register ++ && SIBLING_CALL_P (peep2_next_insn (2)) + && peep2_reg_dead_p (3, operands[0])" + [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE) + (parallel [(set (match_dup 2) +@@ -11976,7 +11986,7 @@ + + (define_insn "*call_value_pop" + [(set (match_operand 0) +- (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lmBz")) ++ (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lBwBz")) + (match_operand 2))) + (set (reg:SI SP_REG) + (plus:SI (reg:SI SP_REG) +Index: b/src/gcc/config/i386/i386.opt +=================================================================== +--- a/src/gcc/config/i386/i386.opt ++++ b/src/gcc/config/i386/i386.opt +@@ -900,3 +900,7 @@ Enum(indirect_branch) String(thunk-inlin + + EnumValue + Enum(indirect_branch) String(thunk-extern) Value(indirect_branch_thunk_extern) ++ ++mindirect-branch-register ++Target Report Var(ix86_indirect_branch_register) Init(0) ++Force indirect call and jump via register. +Index: b/src/gcc/config/i386/predicates.md +=================================================================== +--- a/src/gcc/config/i386/predicates.md ++++ b/src/gcc/config/i386/predicates.md +@@ -607,7 +607,8 @@ + ;; Test for a valid operand for indirect branch. + (define_predicate "indirect_branch_operand" + (ior (match_operand 0 "register_operand") +- (and (not (match_test "TARGET_X32")) ++ (and (not (match_test "ix86_indirect_branch_register")) ++ (not (match_test "TARGET_X32")) + (match_operand 0 "memory_operand")))) + + ;; Test for a valid operand for a call instruction. +@@ -616,7 +617,8 @@ + (ior (match_test "constant_call_address_operand + (op, mode == VOIDmode ? mode : Pmode)") + (match_operand 0 "call_register_no_elim_operand") +- (and (not (match_test "TARGET_X32")) ++ (and (not (match_test "ix86_indirect_branch_register")) ++ (not (match_test "TARGET_X32")) + (match_operand 0 "memory_operand")))) + + ;; Similarly, but for tail calls, in which we cannot allow memory references. +@@ -624,7 +626,8 @@ + (ior (match_test "constant_call_address_operand + (op, mode == VOIDmode ? mode : Pmode)") + (match_operand 0 "register_no_elim_operand") +- (and (not (match_test "TARGET_X32")) ++ (and (not (match_test "ix86_indirect_branch_register")) ++ (not (match_test "TARGET_X32")) + (match_operand 0 "sibcall_memory_operand")))) + + ;; Match exactly zero. +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ + + void func0 (void); + void func1 (void); +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fno-pic" } */ + + void func0 (void); + void func1 (void); +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile { target { ! x32 } } } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */ + + void (*dispatch) (char *); + char buf[10]; +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c +@@ -1,5 +1,5 @@ + /* { dg-do compile { target { ! x32 } } } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */ + + void (*dispatch) (char *); + char buf[10]; +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ + + void func0 (void); + void func1 (void); +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ + + typedef void (*dispatch_t)(long offset); + +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ + + void func0 (void); + void func1 (void); +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c +@@ -0,0 +1,22 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk -mindirect-branch-register -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch; ++ ++void ++male_indirect_jump (long offset) ++{ ++ dispatch(offset); ++} ++ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } */ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "mov\[ \t\](%eax|%rax), \\((%esp|%rsp)\\)" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */ ++/* { dg-final { scan-assembler-not "__x86_indirect_thunk\n" } } */ ++/* { dg-final { scan-assembler-not "__x86_indirect_thunk_bnd\n" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c +@@ -0,0 +1,20 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk-inline -mindirect-branch-register -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch; ++ ++void ++male_indirect_jump (long offset) ++{ ++ dispatch(offset); ++} ++ ++/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler "mov\[ \t\](%eax|%rax), \\((%esp|%rsp)\\)" } } */ ++/* { dg-final { scan-assembler {\tpause} } } */ ++/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */ ++/* { dg-final { scan-assembler-not "__x86_indirect_thunk" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c +=================================================================== +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c +@@ -0,0 +1,19 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=thunk-extern -mindirect-branch-register -fno-pic" } */ ++ ++typedef void (*dispatch_t)(long offset); ++ ++dispatch_t dispatch; ++ ++void ++male_indirect_jump (long offset) ++{ ++ dispatch(offset); ++} ++ ++/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_indirect_thunk_(r|e)ax" } } */ ++/* { dg-final { scan-assembler-not "push(?:l|q)\[ \t\]*_?dispatch" } } */ ++/* { dg-final { scan-assembler-not "pushq\[ \t\]%rax" } } */ ++/* { dg-final { scan-assembler-not {\t(pause|pause|nop)} } } */ ++/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */ ++/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */ +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-10.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/ret-thunk-10.c ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-10.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk-inline -mindirect-branch=thunk -fno-pic" } */ + + extern void (*bar) (void); + +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-11.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/ret-thunk-11.c ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-11.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=thunk-extern -mindirect-branch=thunk -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk-extern -mindirect-branch=thunk -fno-pic" } */ + + extern void (*bar) (void); + +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-12.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/ret-thunk-12.c ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-12.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fno-pic" } */ + + extern void (*bar) (void); + +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-13.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/ret-thunk-13.c ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-13.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-inline -fno-pic" } */ + + extern void (*bar) (void); + extern int foo (void) __attribute__ ((function_return("thunk"))); +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-14.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/ret-thunk-14.c ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-14.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk-extern -fno-pic" } */ + + extern void (*bar) (void); + +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-15.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/ret-thunk-15.c ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-15.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=keep -fno-pic" } */ + + extern void (*bar) (void); + +Index: b/src/gcc/testsuite/gcc.target/i386/ret-thunk-9.c +=================================================================== +--- a/src/gcc/testsuite/gcc.target/i386/ret-thunk-9.c ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-9.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mfunction-return=thunk -mindirect-branch=thunk -fno-pic" } */ ++/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=thunk -mindirect-branch=thunk -fno-pic" } */ + + extern void (*bar) (void); + diff --git a/development/gcc5/patches/0008-x86-Add-V-register-operand-modifier-doc.diff b/development/gcc5/patches/0008-x86-Add-V-register-operand-modifier-doc.diff new file mode 100644 index 0000000000..b3bd93a218 --- /dev/null +++ b/development/gcc5/patches/0008-x86-Add-V-register-operand-modifier-doc.diff @@ -0,0 +1,65 @@ +From 8a47615dd04a02fdae9691f5ad73fd5a5530c156 Mon Sep 17 00:00:00 2001 +From: hjl +Date: Tue, 16 Jan 2018 11:19:51 +0000 +Subject: [PATCH 8/9] x86: Add 'V' register operand modifier (documentation) + +Add 'V', a special modifier which prints the name of the full integer +register without '%'. For + +extern void (*func_p) (void); + +void +foo (void) +{ + asm ("call __x86_indirect_thunk_%V0" : : "a" (func_p)); +} + +it generates: + +foo: + movq func_p(%rip), %rax + call __x86_indirect_thunk_rax + ret + +gcc/ + + Backport from mainline + 2018-01-14 H.J. Lu + + * config/i386/i386.c (print_reg): Print the name of the full + integer register without '%'. + (ix86_print_operand): Handle 'V'. + * doc/extend.texi: Document 'V' modifier. + +gcc/testsuite/ + + Backport from mainline + 2018-01-14 H.J. Lu + + * gcc.target/i386/indirect-thunk-register-4.c: New test. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256736 138bc75d-0d04-0410-961f-82ee72b054a4 +--- + gcc/ChangeLog | 10 ++++++++++ + gcc/config/i386/i386.c | 13 ++++++++++++- + gcc/doc/extend.texi | 3 +++ + gcc/testsuite/ChangeLog | 7 +++++++ + gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c | 13 +++++++++++++ + 5 files changed, 45 insertions(+), 1 deletion(-) + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c + +diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi +index 46e0a36..9db9e0e 100644 +--- a/src/gcc/doc/extend.texi ++++ b/src/gcc/doc/extend.texi +@@ -8778,6 +8778,9 @@ The table below shows the list of supported modifiers and their effects. + @tab @code{2} + @end multitable + ++@code{V} is a special modifier which prints the name of the full integer ++register without @code{%}. ++ + @anchor{x86floatingpointasmoperands} + @subsubsection x86 Floating-Point @code{asm} Operands + diff --git a/development/gcc5/patches/0008-x86-Add-V-register-operand-modifier.diff b/development/gcc5/patches/0008-x86-Add-V-register-operand-modifier.diff new file mode 100644 index 0000000000..fb1ccd9883 --- /dev/null +++ b/development/gcc5/patches/0008-x86-Add-V-register-operand-modifier.diff @@ -0,0 +1,125 @@ +From 8a47615dd04a02fdae9691f5ad73fd5a5530c156 Mon Sep 17 00:00:00 2001 +From: hjl +Date: Tue, 16 Jan 2018 11:19:51 +0000 +Subject: [PATCH 8/9] x86: Add 'V' register operand modifier + +Add 'V', a special modifier which prints the name of the full integer +register without '%'. For + +extern void (*func_p) (void); + +void +foo (void) +{ + asm ("call __x86_indirect_thunk_%V0" : : "a" (func_p)); +} + +it generates: + +foo: + movq func_p(%rip), %rax + call __x86_indirect_thunk_rax + ret + +gcc/ + + Backport from mainline + 2018-01-14 H.J. Lu + + * config/i386/i386.c (print_reg): Print the name of the full + integer register without '%'. + (ix86_print_operand): Handle 'V'. + * doc/extend.texi: Document 'V' modifier. + +gcc/testsuite/ + + Backport from mainline + 2018-01-14 H.J. Lu + + * gcc.target/i386/indirect-thunk-register-4.c: New test. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256736 138bc75d-0d04-0410-961f-82ee72b054a4 +--- + gcc/ChangeLog | 10 ++++++++++ + gcc/config/i386/i386.c | 13 ++++++++++++- + gcc/doc/extend.texi | 3 +++ + gcc/testsuite/ChangeLog | 7 +++++++ + gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c | 13 +++++++++++++ + 5 files changed, 45 insertions(+), 1 deletion(-) + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c + +diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c +index 8fb8902..1bbdd0c 100644 +--- a/src/gcc/config/i386/i386.c ++++ b/src/gcc/config/i386/i386.c +@@ -17941,6 +17941,7 @@ put_condition_code (enum rtx_code code, machine_mode mode, bool reverse, + If CODE is 'h', pretend the reg is the 'high' byte register. + If CODE is 'y', print "st(0)" instead of "st", if the reg is stack op. + If CODE is 'd', duplicate the operand for AVX instruction. ++ If CODE is 'V', print naked full integer register name without %. + */ + + void +@@ -17951,7 +17952,7 @@ print_reg (rtx x, int code, FILE *file) + unsigned int regno; + bool duplicated = code == 'd' && TARGET_AVX; + +- if (ASSEMBLER_DIALECT == ASM_ATT) ++ if (ASSEMBLER_DIALECT == ASM_ATT && code != 'V') + putc ('%', file); + + if (x == pc_rtx) +@@ -17999,6 +18000,14 @@ print_reg (rtx x, int code, FILE *file) + else + code = GET_MODE_SIZE (GET_MODE (x)); + ++ if (code == 'V') ++ { ++ if (GENERAL_REGNO_P (regno)) ++ code = GET_MODE_SIZE (word_mode); ++ else ++ error ("'V' modifier on non-integer register"); ++ } ++ + /* Irritatingly, AMD extended registers use different naming convention + from the normal registers: "r%d[bwd]" */ + if (REX_INT_REGNO_P (regno)) +@@ -18118,6 +18127,7 @@ print_reg (rtx x, int code, FILE *file) + & -- print some in-use local-dynamic symbol name. + H -- print a memory address offset by 8; used for sse high-parts + Y -- print condition for XOP pcom* instruction. ++ V -- print naked full integer register name without %. + + -- print a branch hint as 'cs' or 'ds' prefix + ; -- print a semicolon (after prefixes due to bug in older gas). + ~ -- print "i" if TARGET_AVX2, "f" otherwise. +@@ -18342,6 +18352,7 @@ ix86_print_operand (FILE *file, rtx x, int code) + case 'X': + case 'P': + case 'p': ++ case 'V': + break; + + case 's': +diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c +new file mode 100644 +index 0000000..f0cd9b7 +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c +@@ -0,0 +1,13 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -mindirect-branch=keep -fno-pic" } */ ++ ++extern void (*func_p) (void); ++ ++void ++foo (void) ++{ ++ asm("call __x86_indirect_thunk_%V0" : : "a" (func_p)); ++} ++ ++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_eax" { target ia32 } } } */ ++/* { dg-final { scan-assembler "call\[ \t\]*__x86_indirect_thunk_rax" { target { ! ia32 } } } } */ +-- +2.7.4 + diff --git a/development/gcc5/patches/0009-x86-Disallow-mindirect-branch-mfunction-return-with-.diff b/development/gcc5/patches/0009-x86-Disallow-mindirect-branch-mfunction-return-with-.diff new file mode 100644 index 0000000000..fdaab625ab --- /dev/null +++ b/development/gcc5/patches/0009-x86-Disallow-mindirect-branch-mfunction-return-with-.diff @@ -0,0 +1,275 @@ +From 5d1c53c6fd593de2360c1a2ae44ebf5fa3c5263b Mon Sep 17 00:00:00 2001 +From: hjl +Date: Tue, 16 Jan 2018 11:22:01 +0000 +Subject: [PATCH 9/9] x86: Disallow -mindirect-branch=/-mfunction-return= with + -mcmodel=large + +Since the thunk function may not be reachable in large code model, +-mcmodel=large is incompatible with -mindirect-branch=thunk, +-mindirect-branch=thunk-extern, -mfunction-return=thunk and +-mfunction-return=thunk-extern. Issue an error when they are used with +-mcmodel=large. + +gcc/ + + Backport from mainline + 2018-01-14 H.J. Lu + + * config/i386/i386.c (ix86_set_indirect_branch_type): Disallow + -mcmodel=large with -mindirect-branch=thunk, + -mindirect-branch=thunk-extern, -mfunction-return=thunk and + -mfunction-return=thunk-extern. + * doc/invoke.texi: Document -mcmodel=large is incompatible with + -mindirect-branch=thunk, -mindirect-branch=thunk-extern, + -mfunction-return=thunk and -mfunction-return=thunk-extern. + +gcc/testsuite/ + + Backport from mainline + 2018-01-14 H.J. Lu + + * gcc.target/i386/indirect-thunk-10.c: New test. + * gcc.target/i386/indirect-thunk-8.c: Likewise. + * gcc.target/i386/indirect-thunk-9.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-10.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-11.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-9.c: Likewise. + * gcc.target/i386/ret-thunk-17.c: Likewise. + * gcc.target/i386/ret-thunk-18.c: Likewise. + * gcc.target/i386/ret-thunk-19.c: Likewise. + * gcc.target/i386/ret-thunk-20.c: Likewise. + * gcc.target/i386/ret-thunk-21.c: Likewise. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256737 138bc75d-0d04-0410-961f-82ee72b054a4 +--- + gcc/ChangeLog | 13 +++++++++++ + gcc/config/i386/i386.c | 26 ++++++++++++++++++++++ + gcc/doc/invoke.texi | 11 +++++++++ + gcc/testsuite/ChangeLog | 17 ++++++++++++++ + gcc/testsuite/gcc.target/i386/indirect-thunk-10.c | 7 ++++++ + gcc/testsuite/gcc.target/i386/indirect-thunk-8.c | 7 ++++++ + gcc/testsuite/gcc.target/i386/indirect-thunk-9.c | 7 ++++++ + .../gcc.target/i386/indirect-thunk-attr-10.c | 9 ++++++++ + .../gcc.target/i386/indirect-thunk-attr-11.c | 9 ++++++++ + .../gcc.target/i386/indirect-thunk-attr-9.c | 9 ++++++++ + gcc/testsuite/gcc.target/i386/ret-thunk-17.c | 7 ++++++ + gcc/testsuite/gcc.target/i386/ret-thunk-18.c | 8 +++++++ + gcc/testsuite/gcc.target/i386/ret-thunk-19.c | 8 +++++++ + gcc/testsuite/gcc.target/i386/ret-thunk-20.c | 9 ++++++++ + gcc/testsuite/gcc.target/i386/ret-thunk-21.c | 9 ++++++++ + 15 files changed, 156 insertions(+) + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-10.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-8.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-9.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-10.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-11.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-9.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-17.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-18.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-19.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-20.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-21.c + +diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c +index 1bbdd0c..e758387 100644 +--- a/src/gcc/config/i386/i386.c ++++ b/src/gcc/config/i386/i386.c +@@ -7187,6 +7187,19 @@ ix86_set_indirect_branch_type (tree fndecl) + } + else + cfun->machine->indirect_branch_type = ix86_indirect_branch; ++ ++ /* -mcmodel=large is not compatible with -mindirect-branch=thunk ++ nor -mindirect-branch=thunk-extern. */ ++ if ((ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC) ++ && ((cfun->machine->indirect_branch_type ++ == indirect_branch_thunk_extern) ++ || (cfun->machine->indirect_branch_type ++ == indirect_branch_thunk))) ++ error ("%<-mindirect-branch=%s%> and %<-mcmodel=large%> are not " ++ "compatible", ++ ((cfun->machine->indirect_branch_type ++ == indirect_branch_thunk_extern) ++ ? "thunk-extern" : "thunk")); + } + + if (cfun->machine->function_return_type == indirect_branch_unset) +@@ -7212,6 +7225,19 @@ ix86_set_indirect_branch_type (tree fndecl) + } + else + cfun->machine->function_return_type = ix86_function_return; ++ ++ /* -mcmodel=large is not compatible with -mfunction-return=thunk ++ nor -mfunction-return=thunk-extern. */ ++ if ((ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC) ++ && ((cfun->machine->function_return_type ++ == indirect_branch_thunk_extern) ++ || (cfun->machine->function_return_type ++ == indirect_branch_thunk))) ++ error ("%<-mfunction-return=%s%> and %<-mcmodel=large%> are not " ++ "compatible", ++ ((cfun->machine->function_return_type ++ == indirect_branch_thunk_extern) ++ ? "thunk-extern" : "thunk")); + } + } + +diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-10.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-10.c +new file mode 100644 +index 0000000..a0674bd +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-10.c +@@ -0,0 +1,7 @@ ++/* { dg-do compile { target { lp64 } } } */ ++/* { dg-options "-O2 -mindirect-branch=thunk-inline -mfunction-return=keep -mcmodel=large" } */ ++ ++void ++bar (void) ++{ ++} +diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-8.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-8.c +new file mode 100644 +index 0000000..7a80a89 +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-8.c +@@ -0,0 +1,7 @@ ++/* { dg-do compile { target { lp64 } } } */ ++/* { dg-options "-O2 -mindirect-branch=thunk -mfunction-return=keep -mcmodel=large" } */ ++ ++void ++bar (void) ++{ /* { dg-error "'-mindirect-branch=thunk' and '-mcmodel=large' are not compatible" } */ ++} +diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-9.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-9.c +new file mode 100644 +index 0000000..d4d45c5 +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-9.c +@@ -0,0 +1,7 @@ ++/* { dg-do compile { target { lp64 } } } */ ++/* { dg-options "-O2 -mindirect-branch=thunk-extern -mfunction-return=keep -mcmodel=large" } */ ++ ++void ++bar (void) ++{ /* { dg-error "'-mindirect-branch=thunk-extern' and '-mcmodel=large' are not compatible" } */ ++} +diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-10.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-10.c +new file mode 100644 +index 0000000..3a2aead +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-10.c +@@ -0,0 +1,9 @@ ++/* { dg-do compile { target { lp64 } } } */ ++/* { dg-options "-O2 -mindirect-branch=keep -mfunction-return=keep -mcmodel=large" } */ ++/* { dg-additional-options "-fPIC" { target fpic } } */ ++ ++__attribute__ ((indirect_branch("thunk-extern"))) ++void ++bar (void) ++{ /* { dg-error "'-mindirect-branch=thunk-extern' and '-mcmodel=large' are not compatible" } */ ++} +diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-11.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-11.c +new file mode 100644 +index 0000000..8e52f03 +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-11.c +@@ -0,0 +1,9 @@ ++/* { dg-do compile { target { lp64 } } } */ ++/* { dg-options "-O2 -mindirect-branch=keep -mfunction-return=keep -mcmodel=large" } */ ++/* { dg-additional-options "-fPIC" { target fpic } } */ ++ ++__attribute__ ((indirect_branch("thunk-inline"))) ++void ++bar (void) ++{ ++} +diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-9.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-9.c +new file mode 100644 +index 0000000..bdaa4f6 +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-9.c +@@ -0,0 +1,9 @@ ++/* { dg-do compile { target { lp64 } } } */ ++/* { dg-options "-O2 -mindirect-branch=keep -mfunction-return=keep -mcmodel=large" } */ ++/* { dg-additional-options "-fPIC" { target fpic } } */ ++ ++__attribute__ ((indirect_branch("thunk"))) ++void ++bar (void) ++{ /* { dg-error "'-mindirect-branch=thunk' and '-mcmodel=large' are not compatible" } */ ++} +diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-17.c b/gcc/testsuite/gcc.target/i386/ret-thunk-17.c +new file mode 100644 +index 0000000..0605e2c +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-17.c +@@ -0,0 +1,7 @@ ++/* { dg-do compile { target { lp64 } } } */ ++/* { dg-options "-O2 -mfunction-return=thunk -mindirect-branch=keep -mcmodel=large" } */ ++ ++void ++bar (void) ++{ /* { dg-error "'-mfunction-return=thunk' and '-mcmodel=large' are not compatible" } */ ++} +diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-18.c b/gcc/testsuite/gcc.target/i386/ret-thunk-18.c +new file mode 100644 +index 0000000..307019d +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-18.c +@@ -0,0 +1,8 @@ ++/* { dg-do compile { target { lp64 } } } */ ++/* { dg-options "-O2 -mfunction-return=thunk-extern -mindirect-branch=keep -mcmodel=large" } */ ++/* { dg-additional-options "-fPIC" { target fpic } } */ ++ ++void ++bar (void) ++{ /* { dg-error "'-mfunction-return=thunk-extern' and '-mcmodel=large' are not compatible" } */ ++} +diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-19.c b/gcc/testsuite/gcc.target/i386/ret-thunk-19.c +new file mode 100644 +index 0000000..772617f +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-19.c +@@ -0,0 +1,8 @@ ++/* { dg-do compile { target { lp64 } } } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -mcmodel=large" } */ ++ ++__attribute__ ((function_return("thunk"))) ++void ++bar (void) ++{ /* { dg-error "'-mfunction-return=thunk' and '-mcmodel=large' are not compatible" } */ ++} +diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-20.c b/gcc/testsuite/gcc.target/i386/ret-thunk-20.c +new file mode 100644 +index 0000000..1e9f9bd +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-20.c +@@ -0,0 +1,9 @@ ++/* { dg-do compile { target { lp64 } } } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -mcmodel=large" } */ ++/* { dg-additional-options "-fPIC" { target fpic } } */ ++ ++__attribute__ ((function_return("thunk-extern"))) ++void ++bar (void) ++{ /* { dg-error "'-mfunction-return=thunk-extern' and '-mcmodel=large' are not compatible" } */ ++} +diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-21.c b/gcc/testsuite/gcc.target/i386/ret-thunk-21.c +new file mode 100644 +index 0000000..eea07f7 +--- /dev/null ++++ b/src/gcc/testsuite/gcc.target/i386/ret-thunk-21.c +@@ -0,0 +1,9 @@ ++/* { dg-do compile { target { lp64 } } } */ ++/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=keep -mcmodel=large" } */ ++/* { dg-additional-options "-fPIC" { target fpic } } */ ++ ++__attribute__ ((function_return("thunk-inline"))) ++void ++bar (void) ++{ ++} +-- +2.7.4 + diff --git a/development/gcc5/patches/0009-x86-Disallow-mindirect-branch-mfunction-return-with-doc.diff b/development/gcc5/patches/0009-x86-Disallow-mindirect-branch-mfunction-return-with-doc.diff new file mode 100644 index 0000000000..c107900552 --- /dev/null +++ b/development/gcc5/patches/0009-x86-Disallow-mindirect-branch-mfunction-return-with-doc.diff @@ -0,0 +1,102 @@ +From 5d1c53c6fd593de2360c1a2ae44ebf5fa3c5263b Mon Sep 17 00:00:00 2001 +From: hjl +Date: Tue, 16 Jan 2018 11:22:01 +0000 +Subject: [PATCH 9/9] x86: Disallow -mindirect-branch=/-mfunction-return= with + -mcmodel=large + +Since the thunk function may not be reachable in large code model, +-mcmodel=large is incompatible with -mindirect-branch=thunk, +-mindirect-branch=thunk-extern, -mfunction-return=thunk and +-mfunction-return=thunk-extern. Issue an error when they are used with +-mcmodel=large. + +gcc/ + + Backport from mainline + 2018-01-14 H.J. Lu + + * config/i386/i386.c (ix86_set_indirect_branch_type): Disallow + -mcmodel=large with -mindirect-branch=thunk, + -mindirect-branch=thunk-extern, -mfunction-return=thunk and + -mfunction-return=thunk-extern. + * doc/invoke.texi: Document -mcmodel=large is incompatible with + -mindirect-branch=thunk, -mindirect-branch=thunk-extern, + -mfunction-return=thunk and -mfunction-return=thunk-extern. + +gcc/testsuite/ + + Backport from mainline + 2018-01-14 H.J. Lu + + * gcc.target/i386/indirect-thunk-10.c: New test. + * gcc.target/i386/indirect-thunk-8.c: Likewise. + * gcc.target/i386/indirect-thunk-9.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-10.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-11.c: Likewise. + * gcc.target/i386/indirect-thunk-attr-9.c: Likewise. + * gcc.target/i386/ret-thunk-17.c: Likewise. + * gcc.target/i386/ret-thunk-18.c: Likewise. + * gcc.target/i386/ret-thunk-19.c: Likewise. + * gcc.target/i386/ret-thunk-20.c: Likewise. + * gcc.target/i386/ret-thunk-21.c: Likewise. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@256737 138bc75d-0d04-0410-961f-82ee72b054a4 +--- + gcc/ChangeLog | 13 +++++++++++ + gcc/config/i386/i386.c | 26 ++++++++++++++++++++++ + gcc/doc/invoke.texi | 11 +++++++++ + gcc/testsuite/ChangeLog | 17 ++++++++++++++ + gcc/testsuite/gcc.target/i386/indirect-thunk-10.c | 7 ++++++ + gcc/testsuite/gcc.target/i386/indirect-thunk-8.c | 7 ++++++ + gcc/testsuite/gcc.target/i386/indirect-thunk-9.c | 7 ++++++ + .../gcc.target/i386/indirect-thunk-attr-10.c | 9 ++++++++ + .../gcc.target/i386/indirect-thunk-attr-11.c | 9 ++++++++ + .../gcc.target/i386/indirect-thunk-attr-9.c | 9 ++++++++ + gcc/testsuite/gcc.target/i386/ret-thunk-17.c | 7 ++++++ + gcc/testsuite/gcc.target/i386/ret-thunk-18.c | 8 +++++++ + gcc/testsuite/gcc.target/i386/ret-thunk-19.c | 8 +++++++ + gcc/testsuite/gcc.target/i386/ret-thunk-20.c | 9 ++++++++ + gcc/testsuite/gcc.target/i386/ret-thunk-21.c | 9 ++++++++ + 15 files changed, 156 insertions(+) + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-10.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-8.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-9.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-10.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-11.c + create mode 100644 gcc/testsuite/gcc.target/i386/indirect-thunk-attr-9.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-17.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-18.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-19.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-20.c + create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-21.c + +diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi +index 1e572b1..6f3c344 100644 +--- a/src/gcc/doc/invoke.texi ++++ b/src/gcc/doc/invoke.texi +@@ -25699,6 +25699,11 @@ to external call and return thunk provided in a separate object file. + You can control this behavior for a specific function by using the + function attribute @code{indirect_branch}. @xref{Function Attributes}. + ++Note that @option{-mcmodel=large} is incompatible with ++@option{-mindirect-branch=thunk} nor ++@option{-mindirect-branch=thunk-extern} since the thunk function may ++not be reachable in large code model. ++ + @item -mfunction-return=@var{choice} + @opindex -mfunction-return + Convert function return with @var{choice}. The default is @samp{keep}, +@@ -25710,6 +25715,12 @@ object file. You can control this behavior for a specific function by + using the function attribute @code{function_return}. + @xref{Function Attributes}. + ++Note that @option{-mcmodel=large} is incompatible with ++@option{-mfunction-return=thunk} nor ++@option{-mfunction-return=thunk-extern} since the thunk function may ++not be reachable in large code model. ++ ++ + @item -mindirect-branch-register + @opindex -mindirect-branch-register + Force indirect call and jump via register. diff --git a/development/gcc5/patches/gcc-no_fixincludes.diff b/development/gcc5/patches/gcc-no_fixincludes.diff new file mode 100644 index 0000000000..52b661613d --- /dev/null +++ b/development/gcc5/patches/gcc-no_fixincludes.diff @@ -0,0 +1,27 @@ +--- ./gcc/Makefile.in.orig 2010-04-02 02:49:06.000000000 -0500 ++++ ./gcc/Makefile.in 2010-08-01 16:55:30.088318841 -0500 +@@ -3864,9 +3864,9 @@ + chmod a+r $${fix_dir}/limits.h; \ + done + # Install the README +- rm -f include-fixed/README +- cp $(srcdir)/../fixincludes/README-fixinc include-fixed/README +- chmod a+r include-fixed/README ++# rm -f include-fixed/README ++# cp $(srcdir)/../fixincludes/README-fixinc include-fixed/README ++# chmod a+r include-fixed/README + $(STAMP) $@ + + .PHONY: install-gcc-tooldir +@@ -3947,10 +3947,7 @@ + (TARGET_MACHINE='$(target)'; srcdir=`cd $(srcdir); ${PWD_COMMAND}`; \ + SHELL='$(SHELL)'; MACRO_LIST=`${PWD_COMMAND}`/macro_list ; \ + gcc_dir=`${PWD_COMMAND}` ; \ +- export TARGET_MACHINE srcdir SHELL MACRO_LIST && \ +- cd $(build_objdir)/fixincludes && \ +- $(SHELL) ./fixinc.sh "$${gcc_dir}/$${fix_dir}" \ +- $(SYSTEM_HEADER_DIR) $(OTHER_FIXINCLUDES_DIRS) ); \ ++ export TARGET_MACHINE srcdir SHELL MACRO_LIST ); \ + rm -f $${fix_dir}/syslimits.h; \ + if [ -f $${fix_dir}/limits.h ]; then \ + mv $${fix_dir}/limits.h $${fix_dir}/syslimits.h; \ diff --git a/development/gcc5/patches/gcc.66782.diff b/development/gcc5/patches/gcc.66782.diff new file mode 100644 index 0000000000..0743f8853b --- /dev/null +++ b/development/gcc5/patches/gcc.66782.diff @@ -0,0 +1,124 @@ +Index: config/i386/i386.md +=================================================================== +--- config/i386/i386.md (revision 225539) ++++ config/i386/i386.md (working copy) +@@ -108,6 +108,7 @@ + UNSPEC_LD_MPIC ; load_macho_picbase + UNSPEC_TRUNC_NOOP + UNSPEC_DIV_ALREADY_SPLIT ++ UNSPEC_MS_TO_SYSV_CALL + UNSPEC_PAUSE + UNSPEC_LEA_ADDR + UNSPEC_XBEGIN_ABORT +@@ -11584,6 +11585,15 @@ + "* return ix86_output_call_insn (insn, operands[0]);" + [(set_attr "type" "call")]) + ++(define_insn "*call_rex64_ms_sysv" ++ [(match_parallel 2 "call_rex64_ms_sysv_operation" ++ [(call (mem:QI (match_operand:DI 0 "call_insn_operand" "rBwBz")) ++ (match_operand 1)) ++ (unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)])] ++ "TARGET_64BIT && !SIBLING_CALL_P (insn)" ++ "* return ix86_output_call_insn (insn, operands[0]);" ++ [(set_attr "type" "call")]) ++ + (define_insn "*sibcall" + [(call (mem:QI (match_operand:W 0 "sibcall_insn_operand" "UBsBz")) + (match_operand 1))] +@@ -11808,6 +11818,16 @@ + (match_dup 3))) + (unspec [(const_int 0)] UNSPEC_PEEPSIB)])]) + ++(define_insn "*call_value_rex64_ms_sysv" ++ [(match_parallel 3 "call_rex64_ms_sysv_operation" ++ [(set (match_operand 0) ++ (call (mem:QI (match_operand:DI 1 "call_insn_operand" "rBwBz")) ++ (match_operand 2))) ++ (unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)])] ++ "TARGET_64BIT && !SIBLING_CALL_P (insn)" ++ "* return ix86_output_call_insn (insn, operands[1]);" ++ [(set_attr "type" "callv")]) ++ + (define_expand "call_value_pop" + [(parallel [(set (match_operand 0) + (call (match_operand:QI 1) +Index: config/i386/predicates.md +=================================================================== +--- config/i386/predicates.md (revision 225533) ++++ config/i386/predicates.md (working copy) +@@ -616,6 +616,36 @@ + && XINT (XEXP (op, 0), 1) == UNSPEC_GOTPCREL); + }) + ++;; Return true if OP is a call from MS ABI to SYSV ABI function. ++(define_predicate "call_rex64_ms_sysv_operation" ++ (match_code "parallel") ++{ ++ unsigned creg_size = ARRAY_SIZE (x86_64_ms_sysv_extra_clobbered_registers); ++ unsigned i; ++ ++ if ((unsigned) XVECLEN (op, 0) != creg_size + 2) ++ return false; ++ ++ for (i = 0; i < creg_size; i++) ++ { ++ rtx elt = XVECEXP (op, 0, i+2); ++ enum machine_mode mode; ++ unsigned regno; ++ ++ if (GET_CODE (elt) != CLOBBER ++ || GET_CODE (SET_DEST (elt)) != REG) ++ return false; ++ ++ regno = x86_64_ms_sysv_extra_clobbered_registers[i]; ++ mode = SSE_REGNO_P (regno) ? TImode : DImode; ++ ++ if (GET_MODE (SET_DEST (elt)) != mode ++ || REGNO (SET_DEST (elt)) != regno) ++ return false; ++ } ++ return true; ++}) ++ + ;; Match exactly zero. + (define_predicate "const0_operand" + (match_code "const_int,const_wide_int,const_double,const_vector") +Index: config/i386/i386.c +=================================================================== +--- config/i386/i386.c (revision 225533) ++++ config/i386/i386.c (working copy) +@@ -25639,7 +25639,9 @@ + rtx callarg2, + rtx pop, bool sibcall) + { +- rtx vec[3]; ++ unsigned int const cregs_size ++ = ARRAY_SIZE (x86_64_ms_sysv_extra_clobbered_registers); ++ rtx vec[3 + cregs_size]; + rtx use = NULL, call; + unsigned int vec_len = 0; + +@@ -25742,16 +25744,18 @@ + if (TARGET_64BIT_MS_ABI + && (!callarg2 || INTVAL (callarg2) != -2)) + { +- int const cregs_size +- = ARRAY_SIZE (x86_64_ms_sysv_extra_clobbered_registers); +- int i; ++ unsigned i; + ++ vec[vec_len++] = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, const0_rtx), ++ UNSPEC_MS_TO_SYSV_CALL); ++ + for (i = 0; i < cregs_size; i++) + { + int regno = x86_64_ms_sysv_extra_clobbered_registers[i]; + machine_mode mode = SSE_REGNO_P (regno) ? TImode : DImode; + +- clobber_reg (&use, gen_rtx_REG (mode, regno)); ++ vec[vec_len++] ++ = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (mode, regno)); + } + } + diff --git a/development/gcc5/patches/gcc.69140.diff b/development/gcc5/patches/gcc.69140.diff new file mode 100644 index 0000000000..ace60ebdd0 --- /dev/null +++ b/development/gcc5/patches/gcc.69140.diff @@ -0,0 +1,13 @@ +--- ./gcc/config/i386/i386.c.orig 2015-11-18 09:45:26.000000000 -0600 ++++ ./gcc/config/i386/i386.c 2016-02-05 13:50:07.202981920 -0600 +@@ -9677,6 +9677,10 @@ + if (TARGET_64BIT_MS_ABI && get_frame_size () > SEH_MAX_FRAME_SIZE) + return true; + ++ /* SSE saves require frame-pointer when stack is misaligned. */ ++ if (TARGET_64BIT_MS_ABI && ix86_incoming_stack_boundary < 128) ++ return true; ++ + /* In ix86_option_override_internal, TARGET_OMIT_LEAF_FRAME_POINTER + turns off the frame pointer by default. Turn it back on now if + we've not got a leaf function. */ diff --git a/development/gcc5/profile.d/gcc5.csh b/development/gcc5/profile.d/gcc5.csh new file mode 100644 index 0000000000..25f9dc1342 --- /dev/null +++ b/development/gcc5/profile.d/gcc5.csh @@ -0,0 +1,7 @@ +setenv CC gcc-5 +setenv CPP cpp-5 +setenv CXX g++-5 +setenv AR gcc-ar-5 +setenv NM gcc-nm-5 +setenv RANLIB gcc-ranlib-5 + diff --git a/development/gcc5/profile.d/gcc5.sh b/development/gcc5/profile.d/gcc5.sh new file mode 100644 index 0000000000..7143b5d0e9 --- /dev/null +++ b/development/gcc5/profile.d/gcc5.sh @@ -0,0 +1,7 @@ +export CC=gcc-5 +export CPP=cpp-5 +export CXX=g++-5 +export AR=gcc-ar-5 +export NM=gcc-nm-5 +export RANLIB=gcc-ranlib-5 + diff --git a/development/gcc5/slack-desc.gcc5 b/development/gcc5/slack-desc.gcc5 new file mode 100644 index 0000000000..d9d965846b --- /dev/null +++ b/development/gcc5/slack-desc.gcc5 @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +gcc5: gcc5 (Co-installable GCC-5 package with C, C++ and Java support) +gcc5: +gcc5: GCC is the GNU Compiler Collection. +gcc5: +gcc5: This package contains those parts of the compiler collection needed to +gcc5: compile C and C++ code and programs written in the Java programming +gcc5: language.@MULTILIB@ +gcc5: +gcc5: This gcc5 package must be co-installed with Slackware's gcc7 compiler. +gcc5: +gcc5: diff --git a/development/geany/geany.info b/development/geany/geany.info index 14c4973e94..06860fdb80 100644 --- a/development/geany/geany.info +++ b/development/geany/geany.info @@ -5,6 +5,6 @@ DOWNLOAD="https://github.com/geany/geany/archive/1.31.0/geany-1.31.0.tar.gz" MD5SUM="3e87fb53d3f8f4143e02ff2fde6c0a81" DOWNLOAD_x86_64="" MD5SUM_x86_64="" -REQUIRES="" +REQUIRES="vte2" MAINTAINER="Ryan S. Northrup" EMAIL="northrup@yellowapple.us" diff --git a/development/gedit/gedit.SlackBuild b/development/gedit/gedit.SlackBuild index 9ed2ab95c6..264611aaa0 100644 --- a/development/gedit/gedit.SlackBuild +++ b/development/gedit/gedit.SlackBuild @@ -70,6 +70,7 @@ find -L . \ \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ -exec chmod 644 {} \; +export LDFLAGS="-lgmodule-2.0 -lICE" CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ ./configure \ diff --git a/development/glade/glade.SlackBuild b/development/glade/glade.SlackBuild index 1741b2a9cb..1dea1c25da 100644 --- a/development/glade/glade.SlackBuild +++ b/development/glade/glade.SlackBuild @@ -23,13 +23,13 @@ # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PRGNAM=glade -VERSION=${VERSION:-3.18.3} +VERSION=${VERSION:-3.20.1} BUILD=${BUILD:-1} TAG=${TAG:-_SBo} if [ -z "$ARCH" ]; then case "$( uname -m )" in - i?86) ARCH=i486 ;; + i?86) ARCH=i586 ;; arm*) ARCH=arm ;; *) ARCH=$( uname -m ) ;; esac @@ -41,8 +41,8 @@ TMP=${TMP:-/tmp/SBo} PKG=$TMP/package-$PRGNAM OUTPUT=${OUTPUT:-/tmp} -if [ "$ARCH" = "i486" ]; then - SLKCFLAGS="-O2 -march=i486 -mtune=i686" +if [ "$ARCH" = "i586" ]; then + SLKCFLAGS="-O2 -march=i586 -mtune=i686" LIBDIRSUFFIX="" elif [ "$ARCH" = "i686" ]; then SLKCFLAGS="-O2 -march=i686 -mtune=i686" diff --git a/development/glade/glade.info b/development/glade/glade.info index fff72106e7..306621d3ab 100644 --- a/development/glade/glade.info +++ b/development/glade/glade.info @@ -1,8 +1,8 @@ PRGNAM="glade" -VERSION="3.18.3" +VERSION="3.20.1" HOMEPAGE="https://glade.gnome.org" -DOWNLOAD="https://ftp.gnome.org/pub/GNOME/sources/glade/3.18/glade-3.18.3.tar.xz" -MD5SUM="6852d6286683728e0ea40ca9b5d2416f" +DOWNLOAD="https://ftp.gnome.org/pub/GNOME/sources/glade/3.20/glade-3.20.1.tar.xz" +MD5SUM="60f01ccc4e9a4e5de5a5402d10495dc4" DOWNLOAD_x86_64="" MD5SUM_x86_64="" REQUIRES="" diff --git a/development/gnats/gnats.SlackBuild b/development/gnats/gnats.SlackBuild index da9575aaa1..18ca2b30d7 100644 --- a/development/gnats/gnats.SlackBuild +++ b/development/gnats/gnats.SlackBuild @@ -69,7 +69,7 @@ find -L . \ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; -CFLAGS="$SLKCFLAGS" \ +CFLAGS="$SLKCFLAGS -Wno-error=pointer-compare -Wno-error=implicit-fallthrough=" \ CXXFLAGS="$SLKCFLAGS" \ ./configure \ --prefix=/usr \ diff --git a/development/gpsim/gpsim.SlackBuild b/development/gpsim/gpsim.SlackBuild index 787ddc0e29..25822ab265 100644 --- a/development/gpsim/gpsim.SlackBuild +++ b/development/gpsim/gpsim.SlackBuild @@ -70,7 +70,7 @@ find -L . \ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; CFLAGS="$SLKCFLAGS" \ -CXXFLAGS="$SLKCFLAGS" \ +CXXFLAGS="$SLKCFLAGS -fpermissive" \ ./configure \ --prefix=/usr \ --libdir=/usr/lib${LIBDIRSUFFIX} \ diff --git a/development/gsoap/gsoap-libtool.patch b/development/gsoap/gsoap-libtool.patch index 87a9fcefdf..d87defacb8 100644 --- a/development/gsoap/gsoap-libtool.patch +++ b/development/gsoap/gsoap-libtool.patch @@ -1,6 +1,6 @@ diff -ur gsoap-2.8.orig/configure.ac gsoap-2.8/configure.ac ---- gsoap-2.8.orig/configure.ac 2015-11-10 18:52:20.000000000 +0100 -+++ gsoap-2.8/configure.ac 2015-11-22 09:28:38.711054796 +0100 +--- gsoap-2.8.orig/configure.ac 2017-10-26 14:01:08.000000000 +0200 ++++ gsoap-2.8/configure.ac 2017-12-03 15:29:52.878661826 +0100 @@ -16,8 +16,7 @@ AM_PROG_LEX AC_PROG_YACC @@ -11,7 +11,7 @@ diff -ur gsoap-2.8.orig/configure.ac gsoap-2.8/configure.ac AC_PROG_LN_S AC_PROG_AWK AC_PROG_INSTALL -@@ -236,16 +235,16 @@ +@@ -259,15 +258,15 @@ WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} -lgnutls -lgcrypt -lgpg-error -lz" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lgnutls -lgcrypt -lgpg-error -lz" @@ -20,76 +20,75 @@ diff -ur gsoap-2.8.orig/configure.ac gsoap-2.8/configure.ac else AC_MSG_RESULT(no) WSDL2H_EXTRA_FLAGS="-DWITH_OPENSSL -DWITH_GZIP" - # an ugly hack to get httpda and smdevp plugins to conditionally # compile with wsdl2h when OPENSSL is available -- WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} ../plugin/httpda.c ../plugin/smdevp.c ../plugin/threads.c -lssl -lcrypto -lz" -+ WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} ../plugin/httpda.c ../plugin/smdevp.c ../plugin/threads.c -lcrypto" +- WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} -lssl -lcrypto -lz" ++ WSDL2H_EXTRA_LIBS="${WSDL2H_EXTRA_LIBS} -lcrypto" SAMPLE_INCLUDES= SAMPLE_SSL_LIBS="-lssl -lcrypto -lz" - WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a" + WSDL2H_SOAP_CPP_LIB="libgsoapssl++.la" fi - if test -n "$OPENSSL"; then - WSDL2H_EXTRA_FLAGS="-I${OPENSSL}/include ${WSDL2H_EXTRA_FLAGS}" -@@ -258,7 +257,7 @@ + if test -n "$ZLIB"; then + WSDL2H_EXTRA_FLAGS="-I${ZLIB}/include ${WSDL2H_EXTRA_FLAGS}" +@@ -286,7 +285,7 @@ WSDL2H_EXTRA_FLAGS= SAMPLE_SSL_LIBS= SAMPLE_INCLUDES= - WSDL2H_SOAP_CPP_LIB="libgsoap++.a" + WSDL2H_SOAP_CPP_LIB="libgsoap++.la" fi - AC_SUBST(WSDL2H_EXTRA_FLAGS) - AC_SUBST(WSDL2H_EXTRA_LIBS) + AM_CONDITIONAL(WITH_OPENSSL, test "x$with_openssl" = "xyes" -a "x$with_gnutls" != "xyes") + AC_SUBST(WITH_OPENSSL) diff -ur gsoap-2.8.orig/gsoap/Makefile.am gsoap-2.8/gsoap/Makefile.am ---- gsoap-2.8.orig/gsoap/Makefile.am 2015-11-10 18:52:22.000000000 +0100 -+++ gsoap-2.8/gsoap/Makefile.am 2015-11-22 09:24:43.198046409 +0100 +--- gsoap-2.8.orig/gsoap/Makefile.am 2017-10-26 14:01:08.000000000 +0200 ++++ gsoap-2.8/gsoap/Makefile.am 2017-12-03 15:34:29.556641119 +0100 @@ -34,20 +34,30 @@ dom_cpp.cpp: dom.cpp - $(LN_S) -f $(srcdir)/dom.cpp dom_cpp.cpp + $(LN_S) -f $(top_srcdir)/gsoap/dom.cpp dom_cpp.cpp -lib_LIBRARIES = libgsoap.a libgsoap++.a libgsoapck.a libgsoapck++.a libgsoapssl.a libgsoapssl++.a +lib_LTLIBRARIES = libgsoap.la libgsoap++.la libgsoapck.la libgsoapck++.la libgsoapssl.la libgsoapssl++.la -libgsoap_a_SOURCES = stdsoap2.c dom.c --libgsoap_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) +-libgsoap_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) -D$(platform) -libgsoap___a_SOURCES = stdsoap2_cpp.cpp dom_cpp.cpp --libgsoap___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) +-libgsoap___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) -D$(platform) -libgsoapck_a_SOURCES = stdsoap2_ck.c dom.c --libgsoapck_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) -DWITH_COOKIES +-libgsoapck_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) -D$(platform) -DWITH_COOKIES -libgsoapck___a_SOURCES = stdsoap2_ck_cpp.cpp dom_cpp.cpp --libgsoapck___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) -DWITH_COOKIES +-libgsoapck___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) -D$(platform) -DWITH_COOKIES -libgsoapssl_a_SOURCES = stdsoap2_ssl.c dom.c --libgsoapssl_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) $(WSDL2H_EXTRA_FLAGS) -DWITH_DOM -DWITH_COOKIES +-libgsoapssl_a_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) -D$(platform) $(WSDL2H_EXTRA_FLAGS) -DWITH_DOM -DWITH_COOKIES -libgsoapssl___a_SOURCES = stdsoap2_ssl_cpp.cpp dom_cpp.cpp --libgsoapssl___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) $(WSDL2H_EXTRA_FLAGS) -DWITH_DOM -DWITH_COOKIES +-libgsoapssl___a_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) -D$(platform) $(WSDL2H_EXTRA_FLAGS) -DWITH_DOM -DWITH_COOKIES +SOVERSION = 0 + +libgsoap_la_SOURCES = stdsoap2.c dom.c -+libgsoap_la_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) ++libgsoap_la_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) -D$(platform) +libgsoap_la_LDFLAGS = -version-info $(SOVERSION) +libgsoap___la_SOURCES = stdsoap2_cpp.cpp dom_cpp.cpp -+libgsoap___la_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) ++libgsoap___la_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) -D$(platform) +libgsoap___la_LDFLAGS = -version-info $(SOVERSION) +libgsoapck_la_SOURCES = stdsoap2_ck.c dom.c -+libgsoapck_la_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) -DWITH_COOKIES ++libgsoapck_la_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) -D$(platform) -DWITH_COOKIES +libgsoapck_la_LDFLAGS = -version-info $(SOVERSION) +libgsoapck___la_SOURCES = stdsoap2_ck_cpp.cpp dom_cpp.cpp -+libgsoapck___la_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) -DWITH_COOKIES ++libgsoapck___la_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) -D$(platform) -DWITH_COOKIES +libgsoapck___la_LDFLAGS = -version-info $(SOVERSION) +libgsoapssl_la_SOURCES = stdsoap2_ssl.c dom.c -+libgsoapssl_la_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) $(WSDL2H_EXTRA_FLAGS) -DWITH_DOM -DWITH_COOKIES ++libgsoapssl_la_CFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) -D$(platform) $(WSDL2H_EXTRA_FLAGS) -DWITH_DOM -DWITH_COOKIES +libgsoapssl_la_LDFLAGS = -version-info $(SOVERSION) +libgsoapssl_la_LIBADD = -lssl -lcrypto -lz +libgsoapssl___la_SOURCES = stdsoap2_ssl_cpp.cpp dom_cpp.cpp -+libgsoapssl___la_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_IPV6) -D$(platform) $(WSDL2H_EXTRA_FLAGS) -DWITH_DOM -DWITH_COOKIES ++libgsoapssl___la_CXXFLAGS = $(SOAPCPP2_DEBUG) $(SOAPCPP2_NONAMESPACES) $(SOAPCPP2_NO_C_LOCALE) $(SOAPCPP2_IPV6) -D$(platform) $(WSDL2H_EXTRA_FLAGS) -DWITH_DOM -DWITH_COOKIES +libgsoapssl___la_LDFLAGS = -version-info $(SOVERSION) +libgsoapssl___la_LIBADD = -lssl -lcrypto -lz - BUILT_SOURCES = stdsoap2_cpp.cpp dom_cpp.cpp $(lib_LIBRARIES) + BUILT_SOURCES = stdsoap2_cpp.cpp dom_cpp.cpp stdsoap2_ck.c stdsoap2_ck_cpp.cpp stdsoap2_ssl.c stdsoap2_ssl_cpp.cpp diff -ur gsoap-2.8.orig/gsoap/samples/Makefile.defines gsoap-2.8/gsoap/samples/Makefile.defines ---- gsoap-2.8.orig/gsoap/samples/Makefile.defines 2015-11-10 18:52:26.000000000 +0100 -+++ gsoap-2.8/gsoap/samples/Makefile.defines 2015-11-22 09:22:54.369042534 +0100 +--- gsoap-2.8.orig/gsoap/samples/Makefile.defines 2017-10-26 14:01:10.000000000 +0200 ++++ gsoap-2.8/gsoap/samples/Makefile.defines 2017-12-03 15:35:07.477638281 +0100 @@ -13,13 +13,13 @@ SOAP_C_CORE=soapC.c SOAP_C_CLIENT=soapClient.c $(SOAP_C_CORE) @@ -111,11 +110,11 @@ diff -ur gsoap-2.8.orig/gsoap/samples/Makefile.defines gsoap-2.8/gsoap/samples/M +SOAP_CPP_LIB_CK=$(top_builddir)/gsoap/libgsoapck++.la +SOAP_CPP_LIB_SSL=$(top_builddir)/gsoap/libgsoapssl++.la diff -ur gsoap-2.8.orig/gsoap/samples/autotest/Makefile.am gsoap-2.8/gsoap/samples/autotest/Makefile.am ---- gsoap-2.8.orig/gsoap/samples/autotest/Makefile.am 2015-11-10 18:52:26.000000000 +0100 -+++ gsoap-2.8/gsoap/samples/autotest/Makefile.am 2015-11-22 09:22:54.368042534 +0100 +--- gsoap-2.8.orig/gsoap/samples/autotest/Makefile.am 2017-10-26 14:01:10.000000000 +0200 ++++ gsoap-2.8/gsoap/samples/autotest/Makefile.am 2017-12-03 15:35:30.202636580 +0100 @@ -14,7 +14,7 @@ - WSDLINPUT=$(srcdir)/examples.wsdl - SOAPHEADER=$(srcdir)/examples.h + WSDLINPUT=$(top_srcdir)/gsoap/samples/autotest/examples.wsdl + SOAPHEADER=$(top_srcdir)/gsoap/samples/autotest/examples.h SOAP_CPP_SRC=soapC.cpp soapServer.cpp -SOAP_CPP_LIB=$(top_builddir)/gsoap/libgsoap++.a +SOAP_CPP_LIB=$(top_builddir)/gsoap/libgsoap++.la @@ -123,11 +122,11 @@ diff -ur gsoap-2.8.orig/gsoap/samples/autotest/Makefile.am gsoap-2.8/gsoap/sampl $(SOAP_CPP_SRC) : $(WSDLINPUT) $(WSDL) $(WSDL_FLAGS) $(WSDLINPUT) diff -ur gsoap-2.8.orig/gsoap/samples/databinding/Makefile.am gsoap-2.8/gsoap/samples/databinding/Makefile.am ---- gsoap-2.8.orig/gsoap/samples/databinding/Makefile.am 2015-11-10 18:52:26.000000000 +0100 -+++ gsoap-2.8/gsoap/samples/databinding/Makefile.am 2015-11-22 09:22:54.368042534 +0100 +--- gsoap-2.8.orig/gsoap/samples/databinding/Makefile.am 2017-10-26 14:01:10.000000000 +0200 ++++ gsoap-2.8/gsoap/samples/databinding/Makefile.am 2017-12-03 15:35:50.071635093 +0100 @@ -14,7 +14,7 @@ - WSDLINPUT=$(srcdir)/address.xsd - SOAPHEADER=$(srcdir)/address.h + WSDLINPUT=$(top_srcdir)/gsoap/samples/databinding/address.xsd + SOAPHEADER=$(top_srcdir)/gsoap/samples/databinding/address.h SOAP_CPP_SRC=addressC.cpp -SOAP_CPP_LIB=$(top_builddir)/gsoap/libgsoap++.a +SOAP_CPP_LIB=$(top_builddir)/gsoap/libgsoap++.la diff --git a/development/gsoap/gsoap.SlackBuild b/development/gsoap/gsoap.SlackBuild index a92cd16d6a..58e9a2532b 100644 --- a/development/gsoap/gsoap.SlackBuild +++ b/development/gsoap/gsoap.SlackBuild @@ -2,7 +2,7 @@ # Slackware build script for gsoap -# Copyright 2009-2017 Heinz Wiesinger, Amsterdam, The Netherlands +# Copyright 2009-2018 Heinz Wiesinger, Amsterdam, The Netherlands # All rights reserved. # # Redistribution and use of this script, with or without modification, is @@ -23,7 +23,7 @@ # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PRGNAM=gsoap -VERSION=${VERSION:-2.8.46} +VERSION=${VERSION:-2.8.59} BUILD=${BUILD:-1} TAG=${TAG:-_SBo} diff --git a/development/gsoap/gsoap.info b/development/gsoap/gsoap.info index 1f3e52d4cd..8e3c8ca5d4 100644 --- a/development/gsoap/gsoap.info +++ b/development/gsoap/gsoap.info @@ -1,8 +1,8 @@ PRGNAM="gsoap" -VERSION="2.8.46" +VERSION="2.8.59" HOMEPAGE="http://gsoap2.sourceforge.net/" -DOWNLOAD="http://ponce.cc/slackware/sources/repo/gsoap_2.8.46.zip" -MD5SUM="e7ff6c940730371dcb90079ca56a8551" +DOWNLOAD="http://downloads.sourceforge.net/gsoap2/gsoap_2.8.59.zip" +MD5SUM="af00304f7c9345ce83b32d45e7e601b1" DOWNLOAD_x86_64="" MD5SUM_x86_64="" REQUIRES="" diff --git a/development/hte/hte.SlackBuild b/development/hte/hte.SlackBuild index 97058415df..519c03db13 100644 --- a/development/hte/hte.SlackBuild +++ b/development/hte/hte.SlackBuild @@ -24,13 +24,13 @@ SRCNAM=ht PRGNAM=hte -VERSION=${VERSION:-2.0.18} +VERSION=${VERSION:-2.1.0} BUILD=${BUILD:-1} TAG=${TAG:-_SBo} if [ -z "$ARCH" ]; then case "$( uname -m )" in - i?86) ARCH=i486 ;; + i?86) ARCH=i586 ;; arm*) ARCH=arm ;; *) ARCH=$( uname -m ) ;; esac @@ -41,8 +41,8 @@ TMP=${TMP:-/tmp/SBo} PKG=$TMP/package-$PRGNAM OUTPUT=${OUTPUT:-/tmp} -if [ "$ARCH" = "i486" ]; then - SLKCFLAGS="-O2 -march=i486 -mtune=i686" +if [ "$ARCH" = "i586" ]; then + SLKCFLAGS="-O2 -march=i586 -mtune=i686" LIBDIRSUFFIX="" elif [ "$ARCH" = "i686" ]; then SLKCFLAGS="-O2 -march=i686 -mtune=i686" @@ -61,14 +61,20 @@ rm -rf $PKG mkdir -p $TMP $PKG $OUTPUT cd $TMP rm -rf $SRCNAM-$VERSION -tar xvf $CWD/$SRCNAM-$VERSION.tar.*z? +tar xvf $CWD/$SRCNAM-$VERSION.tar.?z* cd $SRCNAM-$VERSION chown -R root:root . find -L . \ - \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 -o -perm 511 \) \ - -exec chmod 755 {} \; -o \ - \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ - -exec chmod 644 {} \; + \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \ + -o -perm 511 \) -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ + -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; + +# Thanks gentoo! +patch -p1 < $CWD/hteditor-2.1.0-gcc-7.patch + +# Respect our CFLAGS +sed -i "s|-O3 -fomit-frame-pointer -Wall -fsigned-char|$SLKCFLAGS|" configure CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ diff --git a/development/hte/hte.info b/development/hte/hte.info index e12fb4f8eb..1a2a2cd461 100644 --- a/development/hte/hte.info +++ b/development/hte/hte.info @@ -1,8 +1,8 @@ PRGNAM="hte" -VERSION="2.0.18" +VERSION="2.1.0" HOMEPAGE="http://hte.sourceforge.net/" -DOWNLOAD="http://downloads.sourceforge.net/hte/ht-2.0.18.tar.bz2" -MD5SUM="9cd5c52bb3fbae5c631875cd0de3318c" +DOWNLOAD="https://downloads.sf.net/hte/ht-2.1.0.tar.bz2" +MD5SUM="09b2a4461d75e9cd03af1cd67fadc1ec" DOWNLOAD_x86_64="" MD5SUM_x86_64="" REQUIRES="" diff --git a/development/hte/hteditor-2.1.0-gcc-7.patch b/development/hte/hteditor-2.1.0-gcc-7.patch new file mode 100644 index 0000000000..ebcc3c0aa4 --- /dev/null +++ b/development/hte/hteditor-2.1.0-gcc-7.patch @@ -0,0 +1,32 @@ +https://bugs.gentoo.org/show_bug.cgi?id=620732 + +Fixes build failure on gcc-7: + + htapp.cc: In function 'uint isqr(uint)': + htapp.cc:3026:18: error: call of overloaded 'abs(uint)' is ambiguous + while (abs(a - b) > 1) { + ^ + +Picked upstream patch that fixes it: + +commit 3b62f2f7e49e024ec9d3c5ffc8ff9cd87a107af6 +Author: Sebastian Biallas +Date: Sun Nov 13 15:25:26 2016 +0100 + + use unsigned variables + +diff --git a/htapp.cc b/htapp.cc +index 53d8725..03236e2 100644 +--- a/htapp.cc ++++ b/htapp.cc +@@ -3021,8 +3021,8 @@ void do_modal_resize() + + static uint isqr(uint u) + { +- uint a = 2; +- uint b = u/a; ++ int a = 2; ++ int b = u/a; + while (abs(a - b) > 1) { + a = (a+b)/2; + b = u/a; diff --git a/development/jdk/profile.d/jdk.csh b/development/jdk/profile.d/jdk.csh index 3a1ec7be8b..24580311a3 100644 --- a/development/jdk/profile.d/jdk.csh +++ b/development/jdk/profile.d/jdk.csh @@ -1,4 +1,3 @@ #!/bin/csh setenv JAVA_HOME /usr/lib/java -setenv MANPATH ${MANPATH}:${JAVA_HOME}/man setenv PATH ${PATH}:${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin diff --git a/development/jdk/profile.d/jdk.sh b/development/jdk/profile.d/jdk.sh index ed0bc73d4d..66815e299f 100644 --- a/development/jdk/profile.d/jdk.sh +++ b/development/jdk/profile.d/jdk.sh @@ -1,4 +1,3 @@ #!/bin/sh export JAVA_HOME=/usr/lib/java -export MANPATH="${MANPATH}:${JAVA_HOME}/man" export PATH="${PATH}:${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin" diff --git a/development/latrace/fix-scanner-config-for-flex-2.6.x.patch b/development/latrace/fix-scanner-config-for-flex-2.6.x.patch new file mode 100644 index 0000000000..301f4c5a96 --- /dev/null +++ b/development/latrace/fix-scanner-config-for-flex-2.6.x.patch @@ -0,0 +1,23 @@ +--- src/config-flex.l.orig 2011-07-25 07:18:18.000000000 -0400 ++++ src/config-flex.l 2017-07-02 13:52:20.048382500 -0400 +@@ -106,19 +106,17 @@ OPTIONS { BEGIN(options); return OPTI + "\n" { NEW_LINE(); } + . { ; } + + %% + +-#ifndef yywrap +-int yywrap() ++int lt_config_wrap() + { + return 1; + /* XXX not to get the compiler 'not used' warning */ + yyunput(0, NULL); + input(); + } +-#endif + + void lt_config_error(const char *m) + { + printf("conf file [%s] line %d: %s\n", + lt_inc_stack(lt_config_sinc)->file, diff --git a/development/latrace/latrace.SlackBuild b/development/latrace/latrace.SlackBuild index 899601c4e5..bf2208d214 100644 --- a/development/latrace/latrace.SlackBuild +++ b/development/latrace/latrace.SlackBuild @@ -54,6 +54,9 @@ find -L . \ -type d -exec chmod 0755 {} \; -o \ -type f -exec chmod u+rw,go+r-w,a-s {} \; +# Thanks archlinux! +patch -p0 < $CWD/fix-scanner-config-for-flex-2.6.x.patch + autoconf CFLAGS="$SLKCFLAGS" \ diff --git a/development/meson/README b/development/meson/README deleted file mode 100644 index 6ead00c876..0000000000 --- a/development/meson/README +++ /dev/null @@ -1,9 +0,0 @@ -meson (The Meson Build System) - -Meson is an open source build system meant to be both extremely fast, -and, even more importantly, as user friendly as possible. - -The main design point of Meson is that every moment a developer spends -writing or debugging build definitions is a second wasted. So is every -second spent waiting for the build system to actually start compiling -code. diff --git a/development/meson/meson.SlackBuild b/development/meson/meson.SlackBuild deleted file mode 100644 index 0b23123cfe..0000000000 --- a/development/meson/meson.SlackBuild +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/sh - -# Slackware build script for meson - -# Copyright 2017 Jeremy Hansen -# All rights reserved. -# -# Redistribution and use of this script, with or without modification, is -# permitted provided that the following conditions are met: -# -# 1. Redistributions of this script must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -PRGNAM=meson -VERSION=${VERSION:-0.44.1} -BUILD=${BUILD:-1} -TAG=${TAG:-_SBo} - -if [ -z "$ARCH" ]; then - case "$( uname -m )" in - i?86) ARCH=i586 ;; - arm*) ARCH=arm ;; - *) ARCH=$( uname -m ) ;; - esac -fi - -CWD=$(pwd) -TMP=${TMP:-/tmp/SBo} -PKG=$TMP/package-$PRGNAM -OUTPUT=${OUTPUT:-/tmp} - -if [ "$ARCH" = "i586" ]; then - SLKCFLAGS="-O2 -march=i586 -mtune=i686" - LIBDIRSUFFIX="" -elif [ "$ARCH" = "i686" ]; then - SLKCFLAGS="-O2 -march=i686 -mtune=i686" - LIBDIRSUFFIX="" -elif [ "$ARCH" = "x86_64" ]; then - SLKCFLAGS="-O2 -fPIC" - LIBDIRSUFFIX="64" -else - SLKCFLAGS="-O2" - LIBDIRSUFFIX="" -fi - -set -e - -rm -rf $PKG -mkdir -p $TMP $PKG $OUTPUT -cd $TMP -rm -rf $PRGNAM-$VERSION -tar xvf $CWD/$PRGNAM-$VERSION.tar.gz -cd $PRGNAM-$VERSION -chown -R root:root . -find -L . \ - \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \ - -o -perm 511 \) -exec chmod 755 {} \; -o \ - \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ - -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; - -python3 setup.py install --root=$PKG - -find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \ - | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true - -mv $PKG/usr/share/man $PKG/usr/ -rmdir $PKG/usr/share/ -find $PKG/usr/man -type f -exec gzip -9 {} \; -for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done - -mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION -cp -a \ - COPYING README.md contributing.txt \ - $PKG/usr/doc/$PRGNAM-$VERSION -cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild - -mkdir -p $PKG/install -cat $CWD/slack-desc > $PKG/install/slack-desc - -cd $PKG -/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz} diff --git a/development/meson/meson.info b/development/meson/meson.info deleted file mode 100644 index 38ce7485f4..0000000000 --- a/development/meson/meson.info +++ /dev/null @@ -1,10 +0,0 @@ -PRGNAM="meson" -VERSION="0.44.1" -HOMEPAGE="http://mesonbuild.com" -DOWNLOAD="https://github.com/mesonbuild/meson/releases/download/0.44.1/meson-0.44.1.tar.gz" -MD5SUM="82b1198bf714b5a4da84bfe8376c79cc" -DOWNLOAD_x86_64="" -MD5SUM_x86_64="" -REQUIRES="python3 ninja" -MAINTAINER="Jeremy Hansen" -EMAIL="jebrhansen+SBo@gmail.com" diff --git a/development/meson/slack-desc b/development/meson/slack-desc deleted file mode 100644 index e3e1d45d83..0000000000 --- a/development/meson/slack-desc +++ /dev/null @@ -1,19 +0,0 @@ -# HOW TO EDIT THIS FILE: -# The "handy ruler" below makes it easier to edit a package description. -# Line up the first '|' above the ':' following the base package name, and -# the '|' on the right side marks the last column you can put a character in. -# You must make exactly 11 lines for the formatting to be correct. It's also -# customary to leave one space after the ':' except on otherwise blank lines. - - |-----handy-ruler------------------------------------------------------| -meson: meson (The Meson Build System) -meson: -meson: Meson is an open source build system meant to be both extremely fast, -meson: and, even more importantly, as user friendly as possible. -meson: -meson: The main design point of Meson is that every moment a developer spends -meson: writing or debugging build definitions is a second wasted. So is every -meson: second spent waiting for the build system to actually start compiling -meson: code. -meson: -meson: HOMEPAGE: http://mesonbuild.com diff --git a/development/mysql-pinba/mysql-pinba.SlackBuild b/development/mysql-pinba/mysql-pinba.SlackBuild index cdf19f5036..e6f3bf0ebd 100644 --- a/development/mysql-pinba/mysql-pinba.SlackBuild +++ b/development/mysql-pinba/mysql-pinba.SlackBuild @@ -95,7 +95,7 @@ sed -i "s|sql/structs.h|structs.h|" src/ha_pinba.cc sed -i "s|sql/handler.h|handler.h|" src/ha_pinba.cc CFLAGS="$SLKCFLAGS" \ -CXXFLAGS="$SLKCFLAGS" \ +CXXFLAGS="$SLKCFLAGS -fpermissive" \ LIBS="$malloc_lib" \ ./configure \ --prefix=/usr \ diff --git a/development/mysql-workbench/mysql-workbench.SlackBuild b/development/mysql-workbench/mysql-workbench.SlackBuild index b2344f4ef3..b0d607b78f 100644 --- a/development/mysql-workbench/mysql-workbench.SlackBuild +++ b/development/mysql-workbench/mysql-workbench.SlackBuild @@ -74,6 +74,11 @@ find -L . \ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; +# From Archlinux: GCC 7.x complains about an unsupported flag; it also +# introduced some new warnings, remove '-Werror' for the build to complete +sed -i 's|-Wno-deprecated-register||' ext/scintilla/gtk/CMakeLists.txt +sed -i '/^set/s|-Werror -Wall|-Wall|' CMakeLists.txt + # Patch from Ponce patch -p1 < $CWD/config_and_ifconfig_paths.patch diff --git a/development/ninja/README b/development/ninja/README deleted file mode 100644 index 4881393f6e..0000000000 --- a/development/ninja/README +++ /dev/null @@ -1,4 +0,0 @@ -Ninja is a small build system with a focus on speed. It differs from other -build systems in two major respects: it is designed to have its input files -generated by a higher-level build system, and it is designed to run builds as -fast as possible. diff --git a/development/ninja/ninja.SlackBuild b/development/ninja/ninja.SlackBuild deleted file mode 100644 index 2d6fceca27..0000000000 --- a/development/ninja/ninja.SlackBuild +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/sh - -# Slackware build script for ninja - -# Copyright 2015 Markus Rinne Finland -# All rights reserved. -# -# Redistribution and use of this script, with or without modification, is -# permitted provided that the following conditions are met: -# -# 1. Redistributions of this script must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -PRGNAM=ninja -VERSION=${VERSION:-1.8.2} -BUILD=${BUILD:-1} -TAG=${TAG:-_SBo} - -if [ -z "$ARCH" ]; then - case "$( uname -m )" in - i?86) ARCH=i586 ;; - arm*) ARCH=arm ;; - *) ARCH=$( uname -m ) ;; - esac -fi - -CWD=$(pwd) -TMP=${TMP:-/tmp/SBo} -PKG=$TMP/package-$PRGNAM -OUTPUT=${OUTPUT:-/tmp} - -if [ "$ARCH" = "i586" ]; then - SLKCFLAGS="-O2 -march=i586 -mtune=i686" - LIBDIRSUFFIX="" -elif [ "$ARCH" = "i686" ]; then - SLKCFLAGS="-O2 -march=i686 -mtune=i686" - LIBDIRSUFFIX="" -elif [ "$ARCH" = "x86_64" ]; then - SLKCFLAGS="-O2 -fPIC" - LIBDIRSUFFIX="64" -else - SLKCFLAGS="-O2" - LIBDIRSUFFIX="" -fi - -set -e - -rm -rf $PKG -mkdir -p $TMP $PKG $OUTPUT -cd $TMP -rm -rf $PRGNAM-$VERSION -tar xvf $CWD/$PRGNAM-$VERSION.tar.gz -cd $PRGNAM-$VERSION -chown -R root:root . -find -L . \ - \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \ - -o -perm 511 \) -exec chmod 755 {} \; -o \ - \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ - -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; - -CXXFLAGS="$SLKCFLAGS" \ -CFLAGS="$SLKCFLAGS" \ - python configure.py --bootstrap - -install -D -m0755 ninja $PKG/usr/bin/ninja -install -D -m0644 misc/bash-completion $PKG/usr/share/bash-completion/completions/ninja -install -D -m0644 misc/zsh-completion $PKG/usr/share/zsh/site-functions/_ninja -install -D -m0644 misc/ninja.vim $PKG/usr/share/vim/vimfiles/syntax/ninja.vim -install -D -m0644 misc/ninja-mode.el $PKG/usr/share/emacs/site-lisp/ninja-mode.el - -find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \ - | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true - -mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION -cp -a \ - COPYING* HACKING* README* RELEASING \ - $PKG/usr/doc/$PRGNAM-$VERSION -cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild - -mkdir -p $PKG/install -cat $CWD/slack-desc > $PKG/install/slack-desc - -cd $PKG -/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz} diff --git a/development/ninja/ninja.info b/development/ninja/ninja.info deleted file mode 100644 index e7be71e2b6..0000000000 --- a/development/ninja/ninja.info +++ /dev/null @@ -1,10 +0,0 @@ -PRGNAM="ninja" -VERSION="1.8.2" -HOMEPAGE="https://ninja-build.org/" -DOWNLOAD="https://github.com/ninja-build/ninja/archive/v1.8.2/ninja-1.8.2.tar.gz" -MD5SUM="5fdb04461cc7f5d02536b3bfc0300166" -DOWNLOAD_x86_64="" -MD5SUM_x86_64="" -REQUIRES="" -MAINTAINER="Markus Rinne" -EMAIL="markus.ka.rinne@gmail.com" diff --git a/development/ninja/slack-desc b/development/ninja/slack-desc deleted file mode 100644 index 35a65f0947..0000000000 --- a/development/ninja/slack-desc +++ /dev/null @@ -1,19 +0,0 @@ -# HOW TO EDIT THIS FILE: -# The "handy ruler" below makes it easier to edit a package description. -# Line up the first '|' above the ':' following the base package name, and -# the '|' on the right side marks the last column you can put a character in. -# You must make exactly 11 lines for the formatting to be correct. It's also -# customary to leave one space after the ':' except on otherwise blank lines. - - |-----handy-ruler------------------------------------------------------| -ninja: ninja (build system with a focus on speed) -ninja: -ninja: Ninja is a small build system with a focus on speed. It differs from -ninja: other build systems in two major respects: it is designed to have its -ninja: input files generated by a higher-level build system, and it is -ninja: designed to run builds as fast as possible. -ninja: -ninja: -ninja: -ninja: -ninja: diff --git a/development/odb/odb.SlackBuild b/development/odb/odb.SlackBuild index ae2edf5919..a51dea0e5e 100644 --- a/development/odb/odb.SlackBuild +++ b/development/odb/odb.SlackBuild @@ -69,6 +69,9 @@ find -L . \ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; +# Thanks archlinux! +patch -p1 < $CWD/odb_gcc6.patch + CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ ./configure \ diff --git a/development/odb/odb_gcc6.patch b/development/odb/odb_gcc6.patch new file mode 100644 index 0000000000..6f7c9005c4 --- /dev/null +++ b/development/odb/odb_gcc6.patch @@ -0,0 +1,355 @@ +From 511dcf67322ad87fb32f97d1cf7725c129e83898 Mon Sep 17 00:00:00 2001 +From: Boris Kolpackov +Date: Fri, 5 Feb 2016 16:01:42 +0200 +Subject: [PATCH] Initial work to make ODB compatible with GCC 6 + +--- + odb/cxx-lexer.cxx | 4 ++++ + odb/gcc-fwd.hxx | 23 ++++++++++++++++++++++- + odb/gcc.hxx | 10 ++++++++++ + odb/include.cxx | 31 +++++++++++++++++++++---------- + odb/parser.cxx | 8 ++++---- + odb/plugin.cxx | 29 +++++++++++++++++++++++++++-- + odb/semantics/elements.cxx | 4 ++-- + 7 files changed, 90 insertions(+), 19 deletions(-) + +diff --git a/odb/cxx-lexer.cxx b/odb/cxx-lexer.cxx +index 7029c7e..64df296 100644 +--- a/odb/cxx-lexer.cxx ++++ b/odb/cxx-lexer.cxx +@@ -135,8 +135,12 @@ cpp_error_callback ( + #if BUILDING_GCC_MAJOR > 4 || BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR > 5 + int /*reason*/, // Added in GCC 4.6.0. + #endif ++#if BUILDING_GCC_MAJOR <= 5 + location_t, + unsigned int, ++#else ++ rich_location*, ++#endif + char const* msg, + va_list *ap) + { +diff --git a/odb/gcc-fwd.hxx b/odb/gcc-fwd.hxx +index a120f05..618b106 100644 +--- a/odb/gcc-fwd.hxx ++++ b/odb/gcc-fwd.hxx +@@ -7,6 +7,24 @@ + + #include + ++#if BUILDING_GCC_MAJOR >= 6 ++ ++// If we include here, it pulls in all kinds of GCC trouble that ++// "poisons" standard C/C++ declarations; see safe-ctype.h. So instead we ++// are going to "exclude" safe-ctype.h. To compensate, however, we will ++// include it first thing in gcc.hxx. ++// ++# include ++# define SAFE_CTYPE_H ++# include ++# undef SAFE_CTYPE_H ++# include ++ ++typedef unsigned int source_location; // ++typedef source_location location_t; // ++ ++#else // GCC < 6 ++ + #if BUILDING_GCC_MAJOR > 4 || BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR > 8 + # include // CHAR_BIT + # include +@@ -33,6 +51,9 @@ extern "C" + + typedef unsigned int source_location; // + typedef source_location location_t; // +-} ++ ++} // extern "C" ++ ++#endif + + #endif // ODB_GCC_FWD_HXX +diff --git a/odb/gcc.hxx b/odb/gcc.hxx +index c953047..858d685 100644 +--- a/odb/gcc.hxx ++++ b/odb/gcc.hxx +@@ -7,6 +7,10 @@ + + #include + ++#if BUILDING_GCC_MAJOR >= 6 ++# include // See gcc-fwd.hxx. ++#endif ++ + // GCC header includes to get the plugin and parse tree declarations. + // The order is important and doesn't follow any kind of logic. + // +@@ -145,4 +149,10 @@ gcc_tree_code_name (gcc_tree_code_type tc) {return tree_code_name[tc];} + #define DECL_CHAIN(x) TREE_CHAIN(x) + #endif + ++// In GCC 6, ANON_AGGRNAME_P became anon_aggrname_p(). ++// ++#if BUILDING_GCC_MAJOR < 6 ++# define anon_aggrname_p(X) ANON_AGGRNAME_P(X) ++#endif ++ + #endif // ODB_GCC_HXX +diff --git a/odb/include.cxx b/odb/include.cxx +index 9c03f99..32d50a6 100644 +--- a/odb/include.cxx ++++ b/odb/include.cxx +@@ -30,9 +30,18 @@ namespace + path path_; + }; + ++#if BUILDING_GCC_MAJOR >= 6 ++ typedef line_map_ordinary line_map_type; ++#else ++ typedef line_map line_map_type; ++# ifndef linemap_check_ordinary ++# define linemap_check_ordinary(X) (X) ++# endif ++#endif ++ + struct includes + { +- typedef std::map map_type; ++ typedef std::map map_type; + bool trailing; // Included at the beginning or at the end of the main file. + map_type map; + }; +@@ -146,7 +155,9 @@ namespace + // + if (l > BUILTINS_LOCATION) + { +- line_map const* lm (linemap_lookup (line_table, l)); ++ line_map_type const* lm ( ++ linemap_check_ordinary ( ++ linemap_lookup (line_table, l))); + + if (lm != 0 && !MAIN_FILE_P (lm)) + { +@@ -539,20 +550,20 @@ namespace + // + #if BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR <= 6 + size_t used (line_table->used); +- line_map const* maps (line_table->maps); ++ line_map_type const* maps (line_table->maps); + #else + size_t used (line_table->info_ordinary.used); +- line_map const* maps (line_table->info_ordinary.maps); ++ line_map_type const* maps (line_table->info_ordinary.maps); + #endif + + for (size_t i (0); i < used; ++i) + { +- line_map const* m (maps + i); ++ line_map_type const* m (maps + i); + + if (MAIN_FILE_P (m) || m->reason != LC_ENTER) + continue; + +- line_map const* ifm (INCLUDED_FROM (line_table, m)); ++ line_map_type const* ifm (INCLUDED_FROM (line_table, m)); + + #if BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR <= 6 + path f (m->to_file); +@@ -582,7 +593,7 @@ namespace + for (includes::iterator j (i->second.begin ()); + j != i->second.end (); ++j) + { +- line_map const* lm (j->first); ++ line_map_type const* lm (j->first); + cerr << '\t' << lm->to_file << ":" << LAST_SOURCE_LINE (lm) << endl; + } + */ +@@ -591,13 +602,13 @@ namespace + // it is preferred over all others. Use the first one if there are + // several. + // +- line_map const* main_lm (0); ++ line_map_type const* main_lm (0); + include_directive* main_inc (0); + + for (includes::map_type::iterator j (i->second.map.begin ()); + j != i->second.map.end (); ++j) + { +- line_map const* lm (j->first); ++ line_map_type const* lm (j->first); + + if (MAIN_FILE_P (lm)) + { +@@ -638,7 +649,7 @@ namespace + for (includes::map_type::iterator j (i->second.map.begin ()); + j != i->second.map.end (); ++j) + { +- line_map const* lm (j->first); ++ line_map_type const* lm (j->first); + + #if BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR <= 6 + string f (lm->to_file); +diff --git a/odb/parser.cxx b/odb/parser.cxx +index 275da33..842611f 100644 +--- a/odb/parser.cxx ++++ b/odb/parser.cxx +@@ -1070,14 +1070,14 @@ emit_type_decl (tree decl) + // says that in typedef struct {} S; S becomes struct's + // name. + // +- if (ANON_AGGRNAME_P (decl_name)) ++ if (anon_aggrname_p (decl_name)) + { + tree d (TYPE_NAME (t)); + + if (d != NULL_TREE && + !DECL_ARTIFICIAL (d) && + DECL_NAME (d) != NULL_TREE && +- !ANON_AGGRNAME_P (DECL_NAME (d))) ++ !anon_aggrname_p (DECL_NAME (d))) + { + decl = d; + decl_name = DECL_NAME (decl); +@@ -1694,7 +1694,7 @@ create_type (tree t, + ts << "start anon/stub " << gcc_tree_code_name(tc) << " at " + << file << ":" << line << endl; + +- if (d == NULL_TREE || ANON_AGGRNAME_P (DECL_NAME (d))) ++ if (d == NULL_TREE || anon_aggrname_p (DECL_NAME (d))) + { + if (tc == RECORD_TYPE) + r = &emit_class (t, file, line, clmn); +@@ -1791,7 +1791,7 @@ create_type (tree t, + ts << "start anon/stub " << gcc_tree_code_name(tc) << " at " + << file << ":" << line << endl; + +- if (d == NULL_TREE || ANON_AGGRNAME_P (DECL_NAME (d))) ++ if (d == NULL_TREE || anon_aggrname_p (DECL_NAME (d))) + { + r = &emit_enum (t, access, file, line, clmn); + } +diff --git a/odb/plugin.cxx b/odb/plugin.cxx +index fbbfe46..bc98f3e 100644 +--- a/odb/plugin.cxx ++++ b/odb/plugin.cxx +@@ -45,14 +45,28 @@ path file_; // File being compiled. + paths inputs_; // List of input files in at-once mode or just file_. + + bool (*cpp_error_prev) ( +- cpp_reader*, int, int, location_t, unsigned int, const char*, va_list*); ++ cpp_reader*, ++ int, ++ int, ++#if BUILDING_GCC_MAJOR >= 6 ++ rich_location*, ++#else ++ location_t, ++ unsigned int, ++#endif ++ const char*, ++ va_list*); + + static bool + cpp_error_filter (cpp_reader* r, + int level, + int reason, ++#if BUILDING_GCC_MAJOR >= 6 ++ rich_location* l, ++#else + location_t l, + unsigned int column_override, ++#endif + const char* msg, + va_list* ap) + { +@@ -66,7 +80,18 @@ cpp_error_filter (cpp_reader* r, + if (strstr (msg, "#pragma once") != 0) + return true; + +- return cpp_error_prev (r, level, reason, l, column_override, msg, ap); ++ return cpp_error_prev ( ++ r, ++ level, ++ reason, ++#if BUILDING_GCC_MAJOR >= 6 ++ l, ++#else ++ l, ++ column_override, ++#endif ++ msg, ++ ap); + } + + // A prefix of the _cpp_file struct. This struct is not part of the +diff --git a/odb/semantics/elements.cxx b/odb/semantics/elements.cxx +index 43fb379..ae9e906 100644 +--- a/odb/semantics/elements.cxx ++++ b/odb/semantics/elements.cxx +@@ -76,7 +76,7 @@ namespace semantics + if (tree decl = TYPE_NAME (n)) + name = DECL_NAME (decl); + +- return name != 0 && ANON_AGGRNAME_P (name); ++ return name != 0 && anon_aggrname_p (name); + } + + return true; +@@ -125,7 +125,7 @@ namespace semantics + if (tree decl = TYPE_NAME (type)) + { + name = DECL_NAME (decl); +- if (name != 0 && ANON_AGGRNAME_P (name)) ++ if (name != 0 && anon_aggrname_p (name)) + return true; + + tree s (CP_DECL_CONTEXT (decl)); +-- +1.7.10.4 + +m 61d13eb53ade9f30a64892a901401bda5e42c335 Mon Sep 17 00:00:00 2001 +From: Boris Kolpackov +Date: Mon, 8 Feb 2016 18:39:21 +0200 +Subject: [PATCH] Make compilable with GCC 6 in C++14 mode + +--- + odb/gcc.hxx | 9 ++++++--- + odb/parser.cxx | 2 ++ + 2 files changed, 8 insertions(+), 3 deletions(-) + +diff --git a/odb/gcc.hxx b/odb/gcc.hxx +index 858d685..a22357d 100644 +--- a/odb/gcc.hxx ++++ b/odb/gcc.hxx +@@ -7,9 +7,12 @@ + + #include + +-#if BUILDING_GCC_MAJOR >= 6 +-# include // See gcc-fwd.hxx. +-#endif ++// Actually, let's keep it out. With it included we can compile in C++98 ++// but not in C++14 (GCC 6 default). ++// ++// #if BUILDING_GCC_MAJOR >= 6 ++// # include // See gcc-fwd.hxx. ++// #endif + + // GCC header includes to get the plugin and parse tree declarations. + // The order is important and doesn't follow any kind of logic. +diff --git a/odb/parser.cxx b/odb/parser.cxx +index 842611f..6dfff6f 100644 +--- a/odb/parser.cxx ++++ b/odb/parser.cxx +@@ -1857,6 +1857,8 @@ create_type (tree t, + // the array type. In other words, we view it as "constant array" + // rather than "array of constant elements". + // ++ using semantics::array; // vs std::array. ++ + tree bt (TREE_TYPE (t)); + tree bt_mv (TYPE_MAIN_VARIANT (bt)); + type& bt_node (emit_type (bt_mv, access::public_, file, line, clmn)); +-- +1.7.10.4 diff --git a/development/opencl-headers/README b/development/opencl-headers/README deleted file mode 100644 index 4e432b6b4d..0000000000 --- a/development/opencl-headers/README +++ /dev/null @@ -1,3 +0,0 @@ -opencl-headers (headers file for OpenCL) - -This is a repackaging of the header files from khronos.org. diff --git a/development/opencl-headers/opencl-headers.SlackBuild b/development/opencl-headers/opencl-headers.SlackBuild deleted file mode 100644 index 930d45982e..0000000000 --- a/development/opencl-headers/opencl-headers.SlackBuild +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/sh - -# Slackware build script for opencl-headers -# simply a repack of the original headers from khronos.org -# tarballed by me for easy maintenance. -# Copyright Matteo Bernardini , Pisa, Italy, 2012 -# All rights reserved. -# -# Redistribution and use of this script, with or without modification, is -# permitted provided that the following conditions are met: -# -# 1. Redistributions of this script must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -PRGNAM=opencl-headers -VERSION=${VERSION:-1.1} -BUILD=${BUILD:-1} -TAG=${TAG:-_SBo} - -ARCH=noarch - -CWD=$(pwd) -TMP=${TMP:-/tmp/SBo} -PKG=$TMP/package-$PRGNAM -OUTPUT=${OUTPUT:-/tmp} - -set -e - -rm -rf $PKG -mkdir -p $TMP $PKG/usr/include/CL $OUTPUT -tar xvf $CWD/$PRGNAM-$VERSION.tar.xz -C $PKG/usr/include/CL/ -chown -R root.root $PKG/usr/include/CL/* -find $PKG/usr/include/CL \ - \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 -o -perm 511 \) \ - -exec chmod 755 {} \; -o \ - \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ - -exec chmod 644 {} \; - -mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION -cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild - -mkdir -p $PKG/install -cat $CWD/slack-desc > $PKG/install/slack-desc - -cd $PKG -/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz} diff --git a/development/opencl-headers/opencl-headers.info b/development/opencl-headers/opencl-headers.info deleted file mode 100644 index 067b5f9261..0000000000 --- a/development/opencl-headers/opencl-headers.info +++ /dev/null @@ -1,10 +0,0 @@ -PRGNAM="opencl-headers" -VERSION="1.1" -HOMEPAGE="https://www.khronos.org/opencl/" -DOWNLOAD="http://ponce.cc/slackware/sources/repo/opencl-headers-1.1.tar.xz" -MD5SUM="3b9b4c49b3ddf37e275c5c22f94aa80a" -DOWNLOAD_x86_64="" -MD5SUM_x86_64="" -REQUIRES="" -MAINTAINER="Matteo Bernardini" -EMAIL="ponce@slackbuilds.org" diff --git a/development/opencl-headers/slack-desc b/development/opencl-headers/slack-desc deleted file mode 100644 index 456cf19c4f..0000000000 --- a/development/opencl-headers/slack-desc +++ /dev/null @@ -1,19 +0,0 @@ -# HOW TO EDIT THIS FILE: -# The "handy ruler" below makes it easier to edit a package description. -# Line up the first '|' above the ':' following the base package name, and -# the '|' on the right side marks the last column you can put a character in. -# You must make exactly 11 lines for the formatting to be correct. It's also -# customary to leave one space after the ':' except on otherwise blank lines. - - |-----handy-ruler------------------------------------------------------| -opencl-headers: opencl-headers (headers file for OpenCL) -opencl-headers: -opencl-headers: This is a repackaging of the header files from khronos.org. -opencl-headers: -opencl-headers: homepage: https://www.khronos.org/opencl/ -opencl-headers: -opencl-headers: -opencl-headers: -opencl-headers: -opencl-headers: -opencl-headers: diff --git a/development/openocd/openocd.SlackBuild b/development/openocd/openocd.SlackBuild index c75a62622a..e34954da41 100644 --- a/development/openocd/openocd.SlackBuild +++ b/development/openocd/openocd.SlackBuild @@ -5,13 +5,13 @@ # Written by thorsten johannvorderbrueggen PRGNAM=openocd -VERSION=${VERSION:-0.8.0} +VERSION=${VERSION:-0.10.0} BUILD=${BUILD:-1} TAG=${TAG:-_SBo} if [ -z "$ARCH" ]; then case "$( uname -m )" in - i?86) ARCH=i486 ;; + i?86) ARCH=i586 ;; arm*) ARCH=arm ;; *) ARCH=$( uname -m ) ;; esac @@ -22,8 +22,8 @@ TMP=${TMP:-/tmp/SBo} PKG=$TMP/package-$PRGNAM OUTPUT=${OUTPUT:-/tmp} -if [ "$ARCH" = "i486" ]; then - SLKCFLAGS="-O2 -march=i486 -mtune=i686" +if [ "$ARCH" = "i586" ]; then + SLKCFLAGS="-O2 -march=i586 -mtune=i686" LIBDIRSUFFIX="" elif [ "$ARCH" = "i686" ]; then SLKCFLAGS="-O2 -march=i686 -mtune=i686" @@ -51,7 +51,7 @@ find -L . \ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; -CFLAGS="$SLKCFLAGS" \ +CFLAGS="$SLKCFLAGS -Wno-error=implicit-fallthrough= -Wno-error=format-truncation= -Wno-error=format-overflow=" \ CXXFLAGS="$SLKCFLAGS" \ ./configure \ --prefix=/usr \ diff --git a/development/openocd/openocd.info b/development/openocd/openocd.info index 95d6cade91..a1d7add762 100644 --- a/development/openocd/openocd.info +++ b/development/openocd/openocd.info @@ -1,8 +1,8 @@ PRGNAM="openocd" -VERSION="0.8.0" +VERSION="0.10.0" HOMEPAGE="http://openocd.sourceforge.net/" -DOWNLOAD="http://sourceforge.net/projects/openocd/files/openocd/0.8.0/openocd-0.8.0.tar.gz" -MD5SUM="271086c0efe0c454db7ddb0f55ace218" +DOWNLOAD="http://downloads.sourceforge.net/openocd/openocd-0.10.0.tar.gz" +MD5SUM="8971d16aee5c2642b33ee55fc6c86239" DOWNLOAD_x86_64="" MD5SUM_x86_64="" REQUIRES="" diff --git a/development/perf/perf.SlackBuild b/development/perf/perf.SlackBuild index 91d225ad7a..2fdc9927ea 100644 --- a/development/perf/perf.SlackBuild +++ b/development/perf/perf.SlackBuild @@ -23,7 +23,7 @@ # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PRGNAM=perf -VERSION=${VERSION:-4.4.132} +VERSION=${VERSION:-4.14.44} BUILD=${BUILD:-1} TAG=${TAG:-_SBo} diff --git a/development/perf/perf.info b/development/perf/perf.info index f6ebf13185..28cc8bd32c 100644 --- a/development/perf/perf.info +++ b/development/perf/perf.info @@ -1,5 +1,5 @@ PRGNAM="perf" -VERSION="4.4.132" +VERSION="4.14.44" HOMEPAGE="https://perf.wiki.kernel.org/index.php/Main_Page" DOWNLOAD="http://www.pastemobile.org/static/perf.dummy" MD5SUM="9cba6c70fb57a22a155073d54748b614" diff --git a/development/php-apcu/php-apcu.SlackBuild b/development/php-apcu/php-apcu.SlackBuild index 62019f9258..1549356960 100644 --- a/development/php-apcu/php-apcu.SlackBuild +++ b/development/php-apcu/php-apcu.SlackBuild @@ -26,7 +26,7 @@ PRGNAM=php-apcu SRCNAM=apcu -VERSION=${VERSION:-4.0.11} +VERSION=${VERSION:-5.1.10} BUILD=${BUILD:-1} TAG=${TAG:-_SBo} diff --git a/development/php-apcu/php-apcu.info b/development/php-apcu/php-apcu.info index a2c510b6cc..167bd4faab 100644 --- a/development/php-apcu/php-apcu.info +++ b/development/php-apcu/php-apcu.info @@ -1,8 +1,8 @@ PRGNAM="php-apcu" -VERSION="4.0.11" +VERSION="5.1.10" HOMEPAGE="http://pecl.php.net/package/APCu/" -DOWNLOAD="https://pecl.php.net/get/apcu-4.0.11.tgz" -MD5SUM="13c0c0dd676e5a7905d54fa985d0ee62" +DOWNLOAD="https://pecl.php.net/get/apcu-5.1.10.tgz" +MD5SUM="a16259bb080b632d11d8ada09dd5ab56" DOWNLOAD_x86_64="" MD5SUM_x86_64="" REQUIRES="" diff --git a/development/poedit/poedit.SlackBuild b/development/poedit/poedit.SlackBuild index 2319aba3bb..36f2fae14e 100644 --- a/development/poedit/poedit.SlackBuild +++ b/development/poedit/poedit.SlackBuild @@ -24,7 +24,7 @@ # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PRGNAM=poedit -VERSION=${VERSION:-1.8.12} +VERSION=${VERSION:-2.0.6} BUILD=${BUILD:-1} TAG=${TAG:-_SBo} @@ -70,8 +70,6 @@ find -L . \ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; -patch --verbose -p1 < $CWD/setvalue.diff - CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ ./configure \ @@ -80,7 +78,7 @@ CXXFLAGS="$SLKCFLAGS" \ --mandir=/usr/man \ --build=$ARCH-slackware-linux \ -make +make CPPFLAGS+=' -DUCHAR_TYPE=uint16_t' make install-strip DESTDIR=$PKG find $PKG/usr/man -type f -exec gzip -9 {} \; diff --git a/development/poedit/poedit.info b/development/poedit/poedit.info index b8391a4535..58048d5895 100644 --- a/development/poedit/poedit.info +++ b/development/poedit/poedit.info @@ -1,8 +1,8 @@ PRGNAM="poedit" -VERSION="1.8.12" +VERSION="2.0.6" HOMEPAGE="https://www.poedit.net" -DOWNLOAD="https://github.com/vslavik/poedit/releases/download/v1.8.12-oss/poedit-1.8.12.tar.gz" -MD5SUM="7c16257fc8757fe658295b0e3a677670" +DOWNLOAD="https://github.com/vslavik/poedit/releases/download/v2.0.6-oss/poedit-2.0.6.tar.gz" +MD5SUM="1134fef2997884291083875506a922ed" DOWNLOAD_x86_64="" MD5SUM_x86_64="" REQUIRES="wxGTK3 LucenePlusPlus gtkspell3" diff --git a/development/poedit/setvalue.diff b/development/poedit/setvalue.diff deleted file mode 100644 index 1c66943cea..0000000000 --- a/development/poedit/setvalue.diff +++ /dev/null @@ -1,11 +0,0 @@ ---- a/src/fileviewer.cpp 2013-11-10 17:38:50.161359501 +0400 -+++ b/src/fileviewer.cpp 2013-11-10 17:37:59.958987117 +0400 -@@ -286,7 +286,7 @@ - linenum = 0; - - m_text->SetReadOnly(false); -- m_text->SetValue(data); -+ m_text->SetText(data); - m_text->SetReadOnly(true); - - m_text->MarkerDeleteAll(1); diff --git a/development/re2c/README b/development/re2c/README deleted file mode 100644 index 227f25951c..0000000000 --- a/development/re2c/README +++ /dev/null @@ -1,6 +0,0 @@ -re2c is a tool for writing very fast and very flexible scanners. Unlike -any other such tool, re2c focuses on generating high efficient code for -regular expression matching. As a result this allows a much broader -range of use than any traditional lexer offers. And last but not least -re2c generates warning free code that is equal to hand-written code in -terms of size, speed and quality. diff --git a/development/re2c/re2c.SlackBuild b/development/re2c/re2c.SlackBuild deleted file mode 100644 index 74c6bc6ada..0000000000 --- a/development/re2c/re2c.SlackBuild +++ /dev/null @@ -1,110 +0,0 @@ -#!/bin/sh - -# Slackware build script for re2c - -# Copyright 2008-2015 LukenShiro, Italy -# All rights reserved. -# -# Redistribution and use of this script, with or without modification, is -# permitted provided that the following conditions are met: -# -# 1. Redistributions of this script must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -PRGNAM=re2c -VERSION=${VERSION:-0.16} -BUILD=${BUILD:-1} -TAG=${TAG:-_SBo} - -if [ -z "$ARCH" ]; then - case "$( uname -m )" in - i?86) ARCH=i486 ;; - arm*) ARCH=arm ;; - *) ARCH=$( uname -m ) ;; - esac -fi - -CWD=$(pwd) -TMP=${TMP:-/tmp/SBo} -PKG=$TMP/package-$PRGNAM -OUTPUT=${OUTPUT:-/tmp} - -# .html file needs to be manually installed -DOCFILES="README CHANGELOG doc/loplas.ps" - -if [ "$ARCH" = "i486" ]; then - SLKCFLAGS="-O2 -march=i486 -mtune=i686" - LIBDIRSUFFIX="" -elif [ "$ARCH" = "i686" ]; then - SLKCFLAGS="-O2 -march=i686 -mtune=i686" - LIBDIRSUFFIX="" -elif [ "$ARCH" = "x86_64" ]; then - SLKCFLAGS="-O2 -fPIC" - LIBDIRSUFFIX="64" -else - SLKCFLAGS="-O2" - LIBDIRSUFFIX="" -fi - -set -e - -rm -rf $PKG -mkdir -p $TMP $PKG $OUTPUT -cd $TMP -rm -rf $PRGNAM-$VERSION -tar xvf $CWD/$PRGNAM-$VERSION.tar.gz -cd $PRGNAM-$VERSION -chown -R root:root . -find -L . \ - \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \ - -o -perm 511 \) -exec chmod 755 {} \; -o \ - \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ - -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; - -# --htmldir= is ignored -CFLAGS="$SLKCFLAGS" \ -CXXFLAGS="$SLKCFLAGS" \ -./configure \ - --prefix=/usr \ - --mandir=/usr/man \ - --libdir=/usr/lib${LIBDIRSUFFIX} \ - --docdir=/usr/doc/$PRGNAM-$VERSION - -make -# in order to regenerate scanner.cc file -rm -f scanner.cc - -make install-strip DESTDIR=$PKG - -# compress man pages -find $PKG/usr/man -type f -exec gzip -9 {} \; -for i in $( find . -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done - -# remove windows-only files -rm -rf lessons/001_upn_calculator/windows/ - -mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION -cp -a $DOCFILES $PKG/usr/doc/$PRGNAM-$VERSION - -# copy other doc files -mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION/examples -cp -R examples/* /$PKG/usr/doc/$PRGNAM-$VERSION/examples/ - -cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild - -mkdir -p $PKG/install -cat $CWD/slack-desc > $PKG/install/slack-desc - -cd $PKG -/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz} diff --git a/development/re2c/re2c.info b/development/re2c/re2c.info deleted file mode 100644 index 7a2cabcbfe..0000000000 --- a/development/re2c/re2c.info +++ /dev/null @@ -1,10 +0,0 @@ -PRGNAM="re2c" -VERSION="0.16" -HOMEPAGE="http://re2c.org/" -DOWNLOAD="https://github.com/skvadrik/re2c/releases/download/0.16/re2c-0.16.tar.gz" -MD5SUM="3bf508fabd52ed7334647d0ccb956e8d" -DOWNLOAD_x86_64="" -MD5SUM_x86_64="" -REQUIRES="" -MAINTAINER="LukenShiro" -EMAIL="lukenshiro@ngi.it" diff --git a/development/re2c/slack-desc b/development/re2c/slack-desc deleted file mode 100644 index 3c90f77767..0000000000 --- a/development/re2c/slack-desc +++ /dev/null @@ -1,19 +0,0 @@ -# HOW TO EDIT THIS FILE: -# The "handy ruler" below makes it easier to edit a package description. -# Line up the first '|' above the ':' following the base package name, and -# the '|' on the right side marks the last column you can put a character in. -# You must make exactly 11 lines for the formatting to be correct. It's also -# customary to leave one space after the ':' except on otherwise blank lines. - - |-----handy-ruler------------------------------------------------------| -re2c: re2c (regular expressions to C/C++ conversion tool) -re2c: -re2c: It is a tool for writing very fast and very flexible scanners. Unlike -re2c: any other such tool, re2c focuses on generating high efficient code -re2c: for regular expression matching. As a result this allows a much -re2c: broader range of use than any traditional lexer offers. And last but -re2c: not least re2c generates warning free code that is equal to -re2c: hand-written code in terms of size, speed and quality -re2c: -re2c: Homepage: http://re2c.org -re2c: diff --git a/development/sbcl/glibc-2.26.patch b/development/sbcl/glibc-2.26.patch new file mode 100644 index 0000000000..3df2b03958 --- /dev/null +++ b/development/sbcl/glibc-2.26.patch @@ -0,0 +1,13 @@ +--- a/src/runtime/x86-64-linux-os.h.ORIG 2017-08-31 11:40:51.000000000 +0200 ++++ b/src/runtime/x86-64-linux-os.h 2017-08-31 18:56:10.447100144 +0200 +@@ -1,7 +1,9 @@ + #ifndef _X86_64_LINUX_OS_H + #define _X86_64_LINUX_OS_H + +-typedef struct ucontext os_context_t; ++#include ++ ++typedef struct ucontext_t os_context_t; + typedef long os_context_register_t; + + static inline os_context_t *arch_os_get_context(void **void_context) diff --git a/development/sbcl/sbcl.SlackBuild b/development/sbcl/sbcl.SlackBuild index 1fb531937c..76117ed613 100644 --- a/development/sbcl/sbcl.SlackBuild +++ b/development/sbcl/sbcl.SlackBuild @@ -71,6 +71,8 @@ find -L . \ \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \; +patch -p1 < $CWD/glibc-2.26.patch + sh make.sh clisp --prefix=/usr --fancy make -C doc/manual info pdf diff --git a/development/srcML/srcML.info b/development/srcML/srcML.info index f40334db79..bb1d58b9a7 100644 --- a/development/srcML/srcML.info +++ b/development/srcML/srcML.info @@ -2,9 +2,9 @@ PRGNAM="srcML" VERSION="0.9.5" HOMEPAGE="https://www.srcml.org/" DOWNLOAD="http://131.123.42.38/lmcrs/beta/srcML-src.tar.gz \ - http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.bz2" + http://downloads.sourceforge.net/boost/boost_1_63_0.tar.bz2" MD5SUM="e5c4223f7556b57984b20d70606f50ab \ - 6aa9a5c6a4ca1016edd0ed1178e3cb87" + 1c837ecd990bb022d07e7aab32b09847" DOWNLOAD_x86_64="" MD5SUM_x86_64="" REQUIRES="antlr2" diff --git a/development/swfmill/swfmill.SlackBuild b/development/swfmill/swfmill.SlackBuild index 5881f08825..910f31fa33 100644 --- a/development/swfmill/swfmill.SlackBuild +++ b/development/swfmill/swfmill.SlackBuild @@ -54,7 +54,7 @@ find -L . \ export CFLAGS="" -export CXXFLAGS="$SLKCFLAGS" +export CXXFLAGS="$SLKCFLAGS -Wno-error=narrowing" ./configure \ --prefix=/usr \ --libdir=/usr/lib${LIBDIRSUFFIX} \ diff --git a/development/tora/README b/development/tora/README index e1c08a248a..b109aec98a 100644 --- a/development/tora/README +++ b/development/tora/README @@ -5,3 +5,5 @@ through Qt's ODBC support. For Oracle DBMS support, run the script like this, ORACLE_HOME=/path/to/oracle/home ./tora.Slackbuild + +postgresql is an autodetected dependency. diff --git a/development/tora/tora.SlackBuild b/development/tora/tora.SlackBuild index 9245687cbb..e0150dab62 100644 --- a/development/tora/tora.SlackBuild +++ b/development/tora/tora.SlackBuild @@ -23,7 +23,7 @@ # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PRGNAM=tora -VERSION=${VERSION:-2.1.3} +VERSION=${VERSION:-20170725_d9fddb8} BUILD=${BUILD:-1} TAG=${TAG:-_SBo} @@ -60,11 +60,8 @@ rm -rf $PKG mkdir -p $TMP $PKG $OUTPUT cd $TMP rm -rf $PRGNAM-$VERSION -tar xvf $CWD/$PRGNAM-$VERSION.tar.bz2 +tar xvf $CWD/$PRGNAM-$VERSION.tar.?z cd $PRGNAM-$VERSION - -patch -Np1 -i "${CWD}/include_unistd.patch" - chown -R root:root . find -L . \ \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \ @@ -79,12 +76,13 @@ cd build -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \ -DCMAKE_INSTALL_PREFIX=/usr \ -DLIB_SUFFIX=${LIBDIRSUFFIX} \ - -DWANT_INTERNAL_QSCINTILLA=0 \ + -DWANT_INTERNAL_QSCINTILLA=1 \ + -DWANT_INTERNAL_LOKI=1 \ -DCMAKE_BUILD_TYPE=Release .. make make install DESTDIR=$PKG - +cd .. find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \ | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true @@ -94,7 +92,7 @@ mkdir -p $PKG/usr/share/icons/hicolor/{32x32,16x16}/apps mkdir -p $PKG/usr/share/applications ( cd $TMP/$PRGNAM-$VERSION - cp -a AUTHORS BUGS ChangeLog COPYING* README* TODO NEWS $PKG/usr/doc/$PRGNAM-$VERSION + cp -a AUTHORS ChangeLog COPYING* README* TODO NEWS $PKG/usr/doc/$PRGNAM-$VERSION cp -a src/help/*.html $PKG/usr/doc/$PRGNAM-$VERSION/help cp -a src/help/images/*.png $PKG/usr/doc/$PRGNAM-$VERSION/help/images cp -a src/icons/tora.xpm $PKG/usr/share/icons/hicolor/32x32/apps diff --git a/development/tora/tora.info b/development/tora/tora.info index a03ef294b4..c90540fffe 100644 --- a/development/tora/tora.info +++ b/development/tora/tora.info @@ -1,10 +1,10 @@ PRGNAM="tora" -VERSION="2.1.3" +VERSION="3.2" HOMEPAGE="http://torasql.com" -DOWNLOAD="http://sourceforge.net/projects/tora/files/tora/2.1.3/tora-2.1.3.tar.bz2" -MD5SUM="b3a4b5c827c300e75eea53874634e8a2" +DOWNLOAD="http://ponce.cc/slackware/sources/repo/tora-20170725_d9fddb8.tar.xz" +MD5SUM="0ebe7f9420b719d3062cf6598c9b8fc6" DOWNLOAD_x86_64="" MD5SUM_x86_64="" -REQUIRES="" +REQUIRES="qt5" MAINTAINER="Giuseppe Di Terlizzi" EMAIL="giuseppe.diterlizzi@gmail.com" -- cgit v1.2.3