Move aports into own repository (pmaports)
This commit is contained in:
parent
520f34a253
commit
3ce00de710
|
@ -1,3 +1,8 @@
|
||||||
|
# pmbootstrap will clone "pmaports" and (if pmbootstrap is not installed system
|
||||||
|
# wide) create a symlink in the aports folder
|
||||||
|
aports
|
||||||
|
|
||||||
|
# The rest below is more or less from a default Python .gitignore
|
||||||
.*.swp
|
.*.swp
|
||||||
|
|
||||||
# Failed patches
|
# Failed patches
|
||||||
|
|
|
@ -19,57 +19,11 @@ stages:
|
||||||
- checks
|
- checks
|
||||||
- tests
|
- tests
|
||||||
|
|
||||||
wiki-test:
|
|
||||||
stage: checks
|
|
||||||
script:
|
|
||||||
- "./test/check_devices_in_wiki.py --booting"
|
|
||||||
|
|
||||||
static-code-analysis:
|
static-code-analysis:
|
||||||
stage: checks
|
stage: checks
|
||||||
script:
|
script:
|
||||||
- "./test/static_code_analysis.sh"
|
- "./test/static_code_analysis.sh"
|
||||||
|
|
||||||
test-aports:
|
|
||||||
stage: tests
|
|
||||||
script:
|
|
||||||
# Note: This script uses CI_PROJECT_DIR
|
|
||||||
- su pmos -c "CI_PROJECT_DIR=$CI_PROJECT_DIR .gitlab/shared-runner_test-aports.sh"
|
|
||||||
after_script:
|
|
||||||
# Move logs so it can be saved as artifacts
|
|
||||||
- "[[ -f /home/pmos/.local/var/pmbootstrap/log.txt ]] && mv /home/pmos/.local/var/pmbootstrap/log.txt $CI_PROJECT_DIR/log.txt"
|
|
||||||
- "[[ -f /home/pmos/.local/var/pmbootstrap/log_testsuite.txt ]] && mv /home/pmos/.local/var/pmbootstrap/log_testsuite.txt $CI_PROJECT_DIR/log_testsuite.txt"
|
|
||||||
- "[[ -f /home/pmos/.config/pmbootstrap.cfg ]] && cp /home/pmos/.config/pmbootstrap.cfg $CI_PROJECT_DIR/pmbootstrap.cfg"
|
|
||||||
- "sudo dmesg > $CI_PROJECT_DIR/dmesg.txt"
|
|
||||||
artifacts:
|
|
||||||
when: always
|
|
||||||
paths:
|
|
||||||
- "log.txt"
|
|
||||||
- "log_testsuite.txt"
|
|
||||||
- "dmesg.txt"
|
|
||||||
- "pmbootstrap.cfg"
|
|
||||||
expire_in: 1 week
|
|
||||||
|
|
||||||
test-upstream-compat:
|
|
||||||
stage: tests
|
|
||||||
script:
|
|
||||||
# Note: This script uses CI_PROJECT_DIR
|
|
||||||
- su pmos -c "CI_PROJECT_DIR=$CI_PROJECT_DIR .gitlab/shared-runner_test-upstream-compat.sh"
|
|
||||||
after_script:
|
|
||||||
# Move logs so it can be saved as artifacts
|
|
||||||
- "[[ -f /home/pmos/.local/var/pmbootstrap/log.txt ]] && mv /home/pmos/.local/var/pmbootstrap/log.txt $CI_PROJECT_DIR/log.txt"
|
|
||||||
- "[[ -f /home/pmos/.local/var/pmbootstrap/log_testsuite.txt ]] && mv /home/pmos/.local/var/pmbootstrap/log_testsuite.txt $CI_PROJECT_DIR/log_testsuite.txt"
|
|
||||||
- "[[ -f /home/pmos/.config/pmbootstrap.cfg ]] && cp /home/pmos/.config/pmbootstrap.cfg $CI_PROJECT_DIR/pmbootstrap.cfg"
|
|
||||||
- "sudo dmesg > $CI_PROJECT_DIR/dmesg.txt"
|
|
||||||
artifacts:
|
|
||||||
when: always
|
|
||||||
paths:
|
|
||||||
- "log.txt"
|
|
||||||
- "log_testsuite.txt"
|
|
||||||
- "dmesg.txt"
|
|
||||||
- "pmbootstrap.cfg"
|
|
||||||
expire_in: 1 week
|
|
||||||
|
|
||||||
|
|
||||||
test-pmbootstrap:
|
test-pmbootstrap:
|
||||||
stage: tests
|
stage: tests
|
||||||
script:
|
script:
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# This script is meant to be executed by a non-root user, since pmbootstrap
|
|
||||||
# commands will fail otherwise. This is primarily used by the gitlab CI shared
|
|
||||||
# runners.
|
|
||||||
# This script also assumes, if run outside a gitlab CI runner, that cwd is
|
|
||||||
# the root of the pmbootstrap project. For gitlab CI runners, $CI_PROJECT_DIR
|
|
||||||
# is used.
|
|
||||||
# Author: Clayton Craft <clayton@craftyguy.net>
|
|
||||||
|
|
||||||
# Return failure on any failure of commands below
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Fail quickly if run as root, since other commands here will fail
|
|
||||||
[[ "$(id -u)" != "0" ]]
|
|
||||||
|
|
||||||
# These are specific to the gitlab CI
|
|
||||||
[[ $CI_PROJECT_DIR ]] && cd "$CI_PROJECT_DIR"
|
|
||||||
# shellcheck disable=SC1091
|
|
||||||
[[ -d venv ]] && source ./venv/bin/activate
|
|
||||||
|
|
||||||
# Init test (pipefail disabled so 'yes' doesn't fail test)
|
|
||||||
set +o pipefail
|
|
||||||
yes ''| ./pmbootstrap.py init
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
# kconfig_check
|
|
||||||
./pmbootstrap.py kconfig check
|
|
||||||
|
|
||||||
# test_aports
|
|
||||||
python -m pytest -vv -x --cov=pmb --tb=native ./test/test_aports.py
|
|
||||||
|
|
||||||
# test_aports_kde
|
|
||||||
python -m pytest -vv -x --cov=pmb --tb=native ./test/test_aports_kde.py
|
|
||||||
|
|
||||||
# check_checksums
|
|
||||||
./test/check_checksums.py --build
|
|
|
@ -1,37 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# This script is meant to be executed by a non-root user, since pmbootstrap
|
|
||||||
# commands will fail otherwise. This is primarily used by the gitlab CI shared
|
|
||||||
# runners.
|
|
||||||
# This script also assumes, if run outside a gitlab CI runner, that cwd is
|
|
||||||
# the root of the pmbootstrap project. For gitlab CI runners, $CI_PROJECT_DIR
|
|
||||||
# is used.
|
|
||||||
# Author: Clayton Craft <clayton@craftyguy.net>
|
|
||||||
|
|
||||||
# Return failure on any failure of commands below
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Fail quickly if run as root, since other commands here will fail
|
|
||||||
[[ "$(id -u)" != "0" ]]
|
|
||||||
|
|
||||||
# These are specific to the gitlab CI
|
|
||||||
[[ $CI_PROJECT_DIR ]] && cd "$CI_PROJECT_DIR"
|
|
||||||
# shellcheck disable=SC1091
|
|
||||||
[[ -d venv ]] && source ./venv/bin/activate
|
|
||||||
|
|
||||||
# These tests are meant to only run on the master branch
|
|
||||||
[[ $CI_COMMIT_REF_NAME != *"master"* ]] && echo "Not on master branch, so skipping tests here." && exit 0
|
|
||||||
|
|
||||||
# Init test (pipefail disabled so 'yes' doesn't fail test)
|
|
||||||
set +o pipefail
|
|
||||||
yes ''| ./pmbootstrap.py init
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
# test_aportgen
|
|
||||||
python -m pytest -vv -x --cov=pmb --tb=native ./test/test_aportgen.py
|
|
||||||
|
|
||||||
# test_soname_bump
|
|
||||||
python -m pytest -vv -x --cov=pmb --tb=native ./test/test_soname_bump.py
|
|
||||||
|
|
||||||
# test_upstream_compatibility
|
|
||||||
python -m pytest -vv -x --cov=pmb --tb=native ./test/test_upstream_compatibility.py
|
|
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
Sophisticated chroot/build/flash tool to develop and install [postmarketOS](https://postmarketos.org).
|
Sophisticated chroot/build/flash tool to develop and install [postmarketOS](https://postmarketos.org).
|
||||||
|
|
||||||
|
Package build scripts live in the [`pmaports`](https://gitlab.com/postmarketOS/pmaports) repository now.
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
* 2 GB of RAM recommended for compiling
|
* 2 GB of RAM recommended for compiling
|
||||||
* Linux distribution (`x86`, `x86_64`, or `aarch64`)
|
* Linux distribution (`x86`, `x86_64`, or `aarch64`)
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
# This package gets installed in the native and foreign arch chroots.
|
|
||||||
# It creates files like /usr/lib/arch-bin-masquerade/armhf/gcc, which
|
|
||||||
# point in the native chroot to the armhf-cross-compiler, and in the
|
|
||||||
# armhf chroot to /usr/bin/gcc. That way compilation works fine, even
|
|
||||||
# when distcc gets the absolute path to the compiler passed (ccache does
|
|
||||||
# that).
|
|
||||||
|
|
||||||
pkgname=arch-bin-masquerade
|
|
||||||
pkgver=1
|
|
||||||
pkgrel=0
|
|
||||||
pkgdesc="Wrappers for ccache + distcc (native and foreign chroots)"
|
|
||||||
url="https://postmarketOS.org"
|
|
||||||
arch="all"
|
|
||||||
license="MIT"
|
|
||||||
options="!check !tracedeps"
|
|
||||||
|
|
||||||
package() {
|
|
||||||
# Architectures and binaries
|
|
||||||
_archs="x86_64 armhf aarch64"
|
|
||||||
_bins="c++ cc cpp g++ gcc"
|
|
||||||
|
|
||||||
# Iterate over architectures
|
|
||||||
for _arch in $_archs; do
|
|
||||||
# Create the arch-specific bin folder
|
|
||||||
_hostspec="$(arch_to_hostspec $_arch)"
|
|
||||||
_bindir="$pkgdir/usr/lib/arch-bin-masquerade/$_arch"
|
|
||||||
mkdir -p "$_bindir"
|
|
||||||
cd "$_bindir"
|
|
||||||
|
|
||||||
# Iterate over binaries and create wrappers
|
|
||||||
for _bin in $_bins; do
|
|
||||||
{
|
|
||||||
echo "#!/bin/sh"
|
|
||||||
if [ "$_arch" == "$CARCH" ]; then
|
|
||||||
echo "exec /usr/bin/${_bin} \"\$@\""
|
|
||||||
else
|
|
||||||
echo "exec /usr/bin/${_hostspec}-${_bin} \"\$@\""
|
|
||||||
fi
|
|
||||||
} > "$_bin"
|
|
||||||
chmod +x "$_bin"
|
|
||||||
done
|
|
||||||
done
|
|
||||||
}
|
|
|
@ -1,65 +0,0 @@
|
||||||
# Automatically generated aport, do not edit!
|
|
||||||
# Generator: pmbootstrap aportgen binutils-aarch64
|
|
||||||
# Based on: main/binutils
|
|
||||||
|
|
||||||
|
|
||||||
pkgname="binutils-aarch64"
|
|
||||||
pkgver=2.31.1
|
|
||||||
pkgrel=0
|
|
||||||
pkgdesc="Tools necessary to build programs for aarch64 targets"
|
|
||||||
url="https://www.gnu.org/software/binutils/"
|
|
||||||
depends=""
|
|
||||||
makedepends_build=""
|
|
||||||
makedepends_host=""
|
|
||||||
makedepends="gettext libtool autoconf automake bison"
|
|
||||||
arch="armhf x86_64 x86"
|
|
||||||
license="GPL-2.0 GPL-3.0-or-later LGPL-2.0 BSD"
|
|
||||||
subpackages=""
|
|
||||||
source="http://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.bz2
|
|
||||||
binutils-ld-fix-static-linking.patch
|
|
||||||
gold-mips.patch
|
|
||||||
"
|
|
||||||
builddir="$srcdir/binutils-$pkgver"
|
|
||||||
|
|
||||||
if [ "$CHOST" != "$CTARGET" ]; then
|
|
||||||
pkgname="binutils-$CTARGET_ARCH"
|
|
||||||
subpackages=""
|
|
||||||
sonameprefix="binutils:"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# secfixes:
|
|
||||||
# 2.28-r1:
|
|
||||||
# - CVE-2017-7614
|
|
||||||
|
|
||||||
build() {
|
|
||||||
_target="$(arch_to_hostspec aarch64)"
|
|
||||||
cd "$builddir"
|
|
||||||
"$builddir"/configure \
|
|
||||||
--build="$CBUILD" \
|
|
||||||
--target=$_target \
|
|
||||||
--with-lib-path=/usr/lib \
|
|
||||||
--prefix=/usr \
|
|
||||||
--with-sysroot=/usr/$_target \
|
|
||||||
--enable-ld=default \
|
|
||||||
--enable-gold=yes \
|
|
||||||
--enable-plugins \
|
|
||||||
--enable-deterministic-archives \
|
|
||||||
--disable-multilib \
|
|
||||||
--disable-werror \
|
|
||||||
--disable-nls
|
|
||||||
make
|
|
||||||
}
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cd "$builddir"
|
|
||||||
make install DESTDIR="$pkgdir"
|
|
||||||
|
|
||||||
# remove man, info folders
|
|
||||||
rm -rf "$pkgdir"/usr/share
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sha512sums="b42954e6f49a0adcd2676bdd77dfb59bfc25cec8184b007521d1e2b1d5d0593b58639e3d9448d5a40fe024c3cea386a37743627d6bb16d502f52a4a32b9573bd binutils-2.31.1.tar.bz2
|
|
||||||
ecee33b0e435aa704af1c334e560f201638ff79e199aa11ed78a72f7c9b46f85fbb227af5748e735fd681d1965fcc42ac81b0c8824e540430ce0c706c81e8b49 binutils-ld-fix-static-linking.patch
|
|
||||||
f55cf2e0bf82f97583a1abe10710e4013ecf7d64f1da2ef8659a44a06d0dd8beaf58dab98a183488ea137f03e32d62efc878d95f018f836f8cec870bc448556f gold-mips.patch"
|
|
|
@ -1,46 +0,0 @@
|
||||||
This fixes static linking for our hardened toolchain
|
|
||||||
diff --git a/ld/scripttempl/elf.sc b/ld/scripttempl/elf.sc
|
|
||||||
index e8126cb..9532bfb 100644
|
|
||||||
--- a/ld/scripttempl/elf.sc
|
|
||||||
+++ b/ld/scripttempl/elf.sc
|
|
||||||
@@ -235,8 +235,8 @@ test "${LARGE_SECTIONS}" = "yes" && LARGE_SECTIONS="
|
|
||||||
if test "${ENABLE_INITFINI_ARRAY}" = "yes"; then
|
|
||||||
SORT_INIT_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))"
|
|
||||||
SORT_FINI_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))"
|
|
||||||
- CTORS_IN_INIT_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors"
|
|
||||||
- DTORS_IN_FINI_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors"
|
|
||||||
+ CTORS_IN_INIT_ARRAY="EXCLUDE_FILE (*crtbegin*.o *crtend*.o $OTHER_EXCLUDE_FILES) .ctors"
|
|
||||||
+ DTORS_IN_FINI_ARRAY="EXCLUDE_FILE (*crtbegin*.o *crtend*.o $OTHER_EXCLUDE_FILES) .dtors"
|
|
||||||
else
|
|
||||||
SORT_INIT_ARRAY="KEEP (*(SORT(.init_array.*)))"
|
|
||||||
SORT_FINI_ARRAY="KEEP (*(SORT(.fini_array.*)))"
|
|
||||||
@@ -270,15 +270,14 @@ CTOR=".ctors ${CONSTRUCTING-0} :
|
|
||||||
doesn't matter which directory crtbegin.o
|
|
||||||
is in. */
|
|
||||||
|
|
||||||
- KEEP (*crtbegin.o(.ctors))
|
|
||||||
- KEEP (*crtbegin?.o(.ctors))
|
|
||||||
+ KEEP (*crtbegin*.o(.ctors))
|
|
||||||
|
|
||||||
/* We don't want to include the .ctor section from
|
|
||||||
the crtend.o file until after the sorted ctors.
|
|
||||||
The .ctor section from the crtend file contains the
|
|
||||||
end of ctors marker and it must be last */
|
|
||||||
|
|
||||||
- KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors))
|
|
||||||
+ KEEP (*(EXCLUDE_FILE (*crtend*.o $OTHER_EXCLUDE_FILES) .ctors))
|
|
||||||
KEEP (*(SORT(.ctors.*)))
|
|
||||||
KEEP (*(.ctors))
|
|
||||||
${CONSTRUCTING+${CTOR_END}}
|
|
||||||
@@ -286,9 +285,8 @@ CTOR=".ctors ${CONSTRUCTING-0} :
|
|
||||||
DTOR=".dtors ${CONSTRUCTING-0} :
|
|
||||||
{
|
|
||||||
${CONSTRUCTING+${DTOR_START}}
|
|
||||||
- KEEP (*crtbegin.o(.dtors))
|
|
||||||
- KEEP (*crtbegin?.o(.dtors))
|
|
||||||
- KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors))
|
|
||||||
+ KEEP (*crtbegin*.o(.dtors))
|
|
||||||
+ KEEP (*(EXCLUDE_FILE (*crtend*.o $OTHER_EXCLUDE_FILES) .dtors))
|
|
||||||
KEEP (*(SORT(.dtors.*)))
|
|
||||||
KEEP (*(.dtors))
|
|
||||||
${CONSTRUCTING+${DTOR_END}}
|
|
|
@ -1,93 +0,0 @@
|
||||||
From d66deb71f1537e2e30dccdfda22eed5d46ec47eb Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alan Modra <amodra@gmail.com>
|
|
||||||
Date: Wed, 14 Mar 2018 22:09:33 +1030
|
|
||||||
Subject: [PATCH] PowerPC64 debian bug 886264, out-of-line save/restore
|
|
||||||
functions
|
|
||||||
|
|
||||||
This calculation in relocate_section
|
|
||||||
|
|
||||||
if (stub_entry->stub_type == ppc_stub_save_res)
|
|
||||||
relocation += (stub_sec->output_offset
|
|
||||||
+ stub_sec->output_section->vma
|
|
||||||
+ stub_sec->size - htab->sfpr->size
|
|
||||||
- htab->sfpr->output_offset
|
|
||||||
- htab->sfpr->output_section->vma);
|
|
||||||
|
|
||||||
to adjust from the original out-of-line save/restore function address
|
|
||||||
in sfpr to a copy at the end of stub_sec goes wrong when stub_sec is
|
|
||||||
padded, because the copy is no longer at the end of stub_sec. The
|
|
||||||
solution is to pad before copying sfpr, so the copy is always at the
|
|
||||||
end of stub_sec.
|
|
||||||
|
|
||||||
* elf64-ppc.c (sfpr_define): Adjust for stub_sec size having
|
|
||||||
sfpr size added before defining alias symbols.
|
|
||||||
(ppc64_elf_build_stubs): Add stub section padding before
|
|
||||||
copying sfpr contents and defining save/restore alias symbols.
|
|
||||||
|
|
||||||
(cherry picked from commit 7dda8d3cf3b089bb7e03c4cdbec827fc6a188c88)
|
|
||||||
---
|
|
||||||
bfd/ChangeLog | 9 +++++++++
|
|
||||||
bfd/elf64-ppc.c | 33 ++++++++++++++++++---------------
|
|
||||||
2 files changed, 27 insertions(+), 15 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
|
|
||||||
index 6fcdff0..039294f 100644
|
|
||||||
--- a/bfd/elf64-ppc.c
|
|
||||||
+++ b/bfd/elf64-ppc.c
|
|
||||||
@@ -6645,7 +6645,7 @@ sfpr_define (struct bfd_link_info *info,
|
|
||||||
{
|
|
||||||
s->root.type = bfd_link_hash_defined;
|
|
||||||
s->root.u.def.section = stub_sec;
|
|
||||||
- s->root.u.def.value = (stub_sec->size
|
|
||||||
+ s->root.u.def.value = (stub_sec->size - htab->sfpr->size
|
|
||||||
+ h->elf.root.u.def.value);
|
|
||||||
s->ref_regular = 1;
|
|
||||||
s->def_regular = 1;
|
|
||||||
@@ -13232,20 +13232,7 @@ ppc64_elf_build_stubs (struct bfd_link_info *info,
|
|
||||||
|
|
||||||
for (group = htab->group; group != NULL; group = group->next)
|
|
||||||
if (group->needs_save_res)
|
|
||||||
- {
|
|
||||||
- stub_sec = group->stub_sec;
|
|
||||||
- memcpy (stub_sec->contents + stub_sec->size, htab->sfpr->contents,
|
|
||||||
- htab->sfpr->size);
|
|
||||||
- if (htab->params->emit_stub_syms)
|
|
||||||
- {
|
|
||||||
- unsigned int i;
|
|
||||||
-
|
|
||||||
- for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
|
|
||||||
- if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
|
|
||||||
- return FALSE;
|
|
||||||
- }
|
|
||||||
- stub_sec->size += htab->sfpr->size;
|
|
||||||
- }
|
|
||||||
+ group->stub_sec->size += htab->sfpr->size;
|
|
||||||
|
|
||||||
if (htab->relbrlt != NULL)
|
|
||||||
htab->relbrlt->reloc_count = 0;
|
|
||||||
@@ -13259,6 +13246,22 @@ ppc64_elf_build_stubs (struct bfd_link_info *info,
|
|
||||||
}
|
|
||||||
|
|
||||||
for (group = htab->group; group != NULL; group = group->next)
|
|
||||||
+ if (group->needs_save_res)
|
|
||||||
+ {
|
|
||||||
+ stub_sec = group->stub_sec;
|
|
||||||
+ memcpy (stub_sec->contents + stub_sec->size - htab->sfpr->size,
|
|
||||||
+ htab->sfpr->contents, htab->sfpr->size);
|
|
||||||
+ if (htab->params->emit_stub_syms)
|
|
||||||
+ {
|
|
||||||
+ unsigned int i;
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
|
|
||||||
+ if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
|
|
||||||
+ return FALSE;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ for (group = htab->group; group != NULL; group = group->next)
|
|
||||||
if ((stub_sec = group->stub_sec) != NULL)
|
|
||||||
{
|
|
||||||
stub_sec_count += 1;
|
|
||||||
--
|
|
||||||
2.9.3
|
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
# DP: Fix gold on mips64 targets.
|
|
||||||
|
|
||||||
gold/
|
|
||||||
|
|
||||||
2016-08-09 Aurelien Jarno <aurelien@aurel32.net>
|
|
||||||
|
|
||||||
* configure.tgt: Add mips64el*-*-*|mips64le*-*-* and mips64*-*-*.
|
|
||||||
|
|
||||||
|
|
||||||
--- a/gold/configure.tgt
|
|
||||||
+++ b/gold/configure.tgt
|
|
||||||
@@ -153,6 +153,13 @@ aarch64*-*)
|
|
||||||
targ_big_endian=false
|
|
||||||
targ_extra_big_endian=true
|
|
||||||
;;
|
|
||||||
+mips*64*el*-*-*|mips*64*le*-*-*)
|
|
||||||
+ targ_obj=mips
|
|
||||||
+ targ_machine=EM_MIPS_RS3_LE
|
|
||||||
+ targ_size=64
|
|
||||||
+ targ_big_endian=false
|
|
||||||
+ targ_extra_big_endian=true
|
|
||||||
+ ;;
|
|
||||||
mips*el*-*-*|mips*le*-*-*)
|
|
||||||
targ_obj=mips
|
|
||||||
targ_machine=EM_MIPS_RS3_LE
|
|
||||||
@@ -160,6 +167,13 @@ mips*el*-*-*|mips*le*-*-*)
|
|
||||||
targ_big_endian=false
|
|
||||||
targ_extra_big_endian=true
|
|
||||||
;;
|
|
||||||
+mips*64*-*-*)
|
|
||||||
+ targ_obj=mips
|
|
||||||
+ targ_machine=EM_MIPS
|
|
||||||
+ targ_size=64
|
|
||||||
+ targ_big_endian=true
|
|
||||||
+ targ_extra_big_endian=false
|
|
||||||
+ ;;
|
|
||||||
mips*-*-*)
|
|
||||||
targ_obj=mips
|
|
||||||
targ_machine=EM_MIPS
|
|
|
@ -1,65 +0,0 @@
|
||||||
# Automatically generated aport, do not edit!
|
|
||||||
# Generator: pmbootstrap aportgen binutils-x86_64
|
|
||||||
# Based on: main/binutils
|
|
||||||
|
|
||||||
|
|
||||||
pkgname="binutils-x86_64"
|
|
||||||
pkgver=2.31.1
|
|
||||||
pkgrel=0
|
|
||||||
pkgdesc="Tools necessary to build programs for x86_64 targets"
|
|
||||||
url="https://www.gnu.org/software/binutils/"
|
|
||||||
depends=""
|
|
||||||
makedepends_build=""
|
|
||||||
makedepends_host=""
|
|
||||||
makedepends="gettext libtool autoconf automake bison"
|
|
||||||
arch="armhf aarch64 x86"
|
|
||||||
license="GPL-2.0 GPL-3.0-or-later LGPL-2.0 BSD"
|
|
||||||
subpackages=""
|
|
||||||
source="http://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.bz2
|
|
||||||
binutils-ld-fix-static-linking.patch
|
|
||||||
gold-mips.patch
|
|
||||||
"
|
|
||||||
builddir="$srcdir/binutils-$pkgver"
|
|
||||||
|
|
||||||
if [ "$CHOST" != "$CTARGET" ]; then
|
|
||||||
pkgname="binutils-$CTARGET_ARCH"
|
|
||||||
subpackages=""
|
|
||||||
sonameprefix="binutils:"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# secfixes:
|
|
||||||
# 2.28-r1:
|
|
||||||
# - CVE-2017-7614
|
|
||||||
|
|
||||||
build() {
|
|
||||||
_target="$(arch_to_hostspec x86_64)"
|
|
||||||
cd "$builddir"
|
|
||||||
"$builddir"/configure \
|
|
||||||
--build="$CBUILD" \
|
|
||||||
--target=$_target \
|
|
||||||
--with-lib-path=/usr/lib \
|
|
||||||
--prefix=/usr \
|
|
||||||
--with-sysroot=/usr/$_target \
|
|
||||||
--enable-ld=default \
|
|
||||||
--enable-gold=yes \
|
|
||||||
--enable-plugins \
|
|
||||||
--enable-deterministic-archives \
|
|
||||||
--disable-multilib \
|
|
||||||
--disable-werror \
|
|
||||||
--disable-nls
|
|
||||||
make
|
|
||||||
}
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cd "$builddir"
|
|
||||||
make install DESTDIR="$pkgdir"
|
|
||||||
|
|
||||||
# remove man, info folders
|
|
||||||
rm -rf "$pkgdir"/usr/share
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
sha512sums="b42954e6f49a0adcd2676bdd77dfb59bfc25cec8184b007521d1e2b1d5d0593b58639e3d9448d5a40fe024c3cea386a37743627d6bb16d502f52a4a32b9573bd binutils-2.31.1.tar.bz2
|
|
||||||
ecee33b0e435aa704af1c334e560f201638ff79e199aa11ed78a72f7c9b46f85fbb227af5748e735fd681d1965fcc42ac81b0c8824e540430ce0c706c81e8b49 binutils-ld-fix-static-linking.patch
|
|
||||||
f55cf2e0bf82f97583a1abe10710e4013ecf7d64f1da2ef8659a44a06d0dd8beaf58dab98a183488ea137f03e32d62efc878d95f018f836f8cec870bc448556f gold-mips.patch"
|
|
|
@ -1,46 +0,0 @@
|
||||||
This fixes static linking for our hardened toolchain
|
|
||||||
diff --git a/ld/scripttempl/elf.sc b/ld/scripttempl/elf.sc
|
|
||||||
index e8126cb..9532bfb 100644
|
|
||||||
--- a/ld/scripttempl/elf.sc
|
|
||||||
+++ b/ld/scripttempl/elf.sc
|
|
||||||
@@ -235,8 +235,8 @@ test "${LARGE_SECTIONS}" = "yes" && LARGE_SECTIONS="
|
|
||||||
if test "${ENABLE_INITFINI_ARRAY}" = "yes"; then
|
|
||||||
SORT_INIT_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))"
|
|
||||||
SORT_FINI_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))"
|
|
||||||
- CTORS_IN_INIT_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors"
|
|
||||||
- DTORS_IN_FINI_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors"
|
|
||||||
+ CTORS_IN_INIT_ARRAY="EXCLUDE_FILE (*crtbegin*.o *crtend*.o $OTHER_EXCLUDE_FILES) .ctors"
|
|
||||||
+ DTORS_IN_FINI_ARRAY="EXCLUDE_FILE (*crtbegin*.o *crtend*.o $OTHER_EXCLUDE_FILES) .dtors"
|
|
||||||
else
|
|
||||||
SORT_INIT_ARRAY="KEEP (*(SORT(.init_array.*)))"
|
|
||||||
SORT_FINI_ARRAY="KEEP (*(SORT(.fini_array.*)))"
|
|
||||||
@@ -270,15 +270,14 @@ CTOR=".ctors ${CONSTRUCTING-0} :
|
|
||||||
doesn't matter which directory crtbegin.o
|
|
||||||
is in. */
|
|
||||||
|
|
||||||
- KEEP (*crtbegin.o(.ctors))
|
|
||||||
- KEEP (*crtbegin?.o(.ctors))
|
|
||||||
+ KEEP (*crtbegin*.o(.ctors))
|
|
||||||
|
|
||||||
/* We don't want to include the .ctor section from
|
|
||||||
the crtend.o file until after the sorted ctors.
|
|
||||||
The .ctor section from the crtend file contains the
|
|
||||||
end of ctors marker and it must be last */
|
|
||||||
|
|
||||||
- KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors))
|
|
||||||
+ KEEP (*(EXCLUDE_FILE (*crtend*.o $OTHER_EXCLUDE_FILES) .ctors))
|
|
||||||
KEEP (*(SORT(.ctors.*)))
|
|
||||||
KEEP (*(.ctors))
|
|
||||||
${CONSTRUCTING+${CTOR_END}}
|
|
||||||
@@ -286,9 +285,8 @@ CTOR=".ctors ${CONSTRUCTING-0} :
|
|
||||||
DTOR=".dtors ${CONSTRUCTING-0} :
|
|
||||||
{
|
|
||||||
${CONSTRUCTING+${DTOR_START}}
|
|
||||||
- KEEP (*crtbegin.o(.dtors))
|
|
||||||
- KEEP (*crtbegin?.o(.dtors))
|
|
||||||
- KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors))
|
|
||||||
+ KEEP (*crtbegin*.o(.dtors))
|
|
||||||
+ KEEP (*(EXCLUDE_FILE (*crtend*.o $OTHER_EXCLUDE_FILES) .dtors))
|
|
||||||
KEEP (*(SORT(.dtors.*)))
|
|
||||||
KEEP (*(.dtors))
|
|
||||||
${CONSTRUCTING+${DTOR_END}}
|
|
|
@ -1,93 +0,0 @@
|
||||||
From d66deb71f1537e2e30dccdfda22eed5d46ec47eb Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alan Modra <amodra@gmail.com>
|
|
||||||
Date: Wed, 14 Mar 2018 22:09:33 +1030
|
|
||||||
Subject: [PATCH] PowerPC64 debian bug 886264, out-of-line save/restore
|
|
||||||
functions
|
|
||||||
|
|
||||||
This calculation in relocate_section
|
|
||||||
|
|
||||||
if (stub_entry->stub_type == ppc_stub_save_res)
|
|
||||||
relocation += (stub_sec->output_offset
|
|
||||||
+ stub_sec->output_section->vma
|
|
||||||
+ stub_sec->size - htab->sfpr->size
|
|
||||||
- htab->sfpr->output_offset
|
|
||||||
- htab->sfpr->output_section->vma);
|
|
||||||
|
|
||||||
to adjust from the original out-of-line save/restore function address
|
|
||||||
in sfpr to a copy at the end of stub_sec goes wrong when stub_sec is
|
|
||||||
padded, because the copy is no longer at the end of stub_sec. The
|
|
||||||
solution is to pad before copying sfpr, so the copy is always at the
|
|
||||||
end of stub_sec.
|
|
||||||
|
|
||||||
* elf64-ppc.c (sfpr_define): Adjust for stub_sec size having
|
|
||||||
sfpr size added before defining alias symbols.
|
|
||||||
(ppc64_elf_build_stubs): Add stub section padding before
|
|
||||||
copying sfpr contents and defining save/restore alias symbols.
|
|
||||||
|
|
||||||
(cherry picked from commit 7dda8d3cf3b089bb7e03c4cdbec827fc6a188c88)
|
|
||||||
---
|
|
||||||
bfd/ChangeLog | 9 +++++++++
|
|
||||||
bfd/elf64-ppc.c | 33 ++++++++++++++++++---------------
|
|
||||||
2 files changed, 27 insertions(+), 15 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
|
|
||||||
index 6fcdff0..039294f 100644
|
|
||||||
--- a/bfd/elf64-ppc.c
|
|
||||||
+++ b/bfd/elf64-ppc.c
|
|
||||||
@@ -6645,7 +6645,7 @@ sfpr_define (struct bfd_link_info *info,
|
|
||||||
{
|
|
||||||
s->root.type = bfd_link_hash_defined;
|
|
||||||
s->root.u.def.section = stub_sec;
|
|
||||||
- s->root.u.def.value = (stub_sec->size
|
|
||||||
+ s->root.u.def.value = (stub_sec->size - htab->sfpr->size
|
|
||||||
+ h->elf.root.u.def.value);
|
|
||||||
s->ref_regular = 1;
|
|
||||||
s->def_regular = 1;
|
|
||||||
@@ -13232,20 +13232,7 @@ ppc64_elf_build_stubs (struct bfd_link_info *info,
|
|
||||||
|
|
||||||
for (group = htab->group; group != NULL; group = group->next)
|
|
||||||
if (group->needs_save_res)
|
|
||||||
- {
|
|
||||||
- stub_sec = group->stub_sec;
|
|
||||||
- memcpy (stub_sec->contents + stub_sec->size, htab->sfpr->contents,
|
|
||||||
- htab->sfpr->size);
|
|
||||||
- if (htab->params->emit_stub_syms)
|
|
||||||
- {
|
|
||||||
- unsigned int i;
|
|
||||||
-
|
|
||||||
- for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
|
|
||||||
- if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
|
|
||||||
- return FALSE;
|
|
||||||
- }
|
|
||||||
- stub_sec->size += htab->sfpr->size;
|
|
||||||
- }
|
|
||||||
+ group->stub_sec->size += htab->sfpr->size;
|
|
||||||
|
|
||||||
if (htab->relbrlt != NULL)
|
|
||||||
htab->relbrlt->reloc_count = 0;
|
|
||||||
@@ -13259,6 +13246,22 @@ ppc64_elf_build_stubs (struct bfd_link_info *info,
|
|
||||||
}
|
|
||||||
|
|
||||||
for (group = htab->group; group != NULL; group = group->next)
|
|
||||||
+ if (group->needs_save_res)
|
|
||||||
+ {
|
|
||||||
+ stub_sec = group->stub_sec;
|
|
||||||
+ memcpy (stub_sec->contents + stub_sec->size - htab->sfpr->size,
|
|
||||||
+ htab->sfpr->contents, htab->sfpr->size);
|
|
||||||
+ if (htab->params->emit_stub_syms)
|
|
||||||
+ {
|
|
||||||
+ unsigned int i;
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
|
|
||||||
+ if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
|
|
||||||
+ return FALSE;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ for (group = htab->group; group != NULL; group = group->next)
|
|
||||||
if ((stub_sec = group->stub_sec) != NULL)
|
|
||||||
{
|
|
||||||
stub_sec_count += 1;
|
|
||||||
--
|
|
||||||
2.9.3
|
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
# DP: Fix gold on mips64 targets.
|
|
||||||
|
|
||||||
gold/
|
|
||||||
|
|
||||||
2016-08-09 Aurelien Jarno <aurelien@aurel32.net>
|
|
||||||
|
|
||||||
* configure.tgt: Add mips64el*-*-*|mips64le*-*-* and mips64*-*-*.
|
|
||||||
|
|
||||||
|
|
||||||
--- a/gold/configure.tgt
|
|
||||||
+++ b/gold/configure.tgt
|
|
||||||
@@ -153,6 +153,13 @@ aarch64*-*)
|
|
||||||
targ_big_endian=false
|
|
||||||
targ_extra_big_endian=true
|
|
||||||
;;
|
|
||||||
+mips*64*el*-*-*|mips*64*le*-*-*)
|
|
||||||
+ targ_obj=mips
|
|
||||||
+ targ_machine=EM_MIPS_RS3_LE
|
|
||||||
+ targ_size=64
|
|
||||||
+ targ_big_endian=false
|
|
||||||
+ targ_extra_big_endian=true
|
|
||||||
+ ;;
|
|
||||||
mips*el*-*-*|mips*le*-*-*)
|
|
||||||
targ_obj=mips
|
|
||||||
targ_machine=EM_MIPS_RS3_LE
|
|
||||||
@@ -160,6 +167,13 @@ mips*el*-*-*|mips*le*-*-*)
|
|
||||||
targ_big_endian=false
|
|
||||||
targ_extra_big_endian=true
|
|
||||||
;;
|
|
||||||
+mips*64*-*-*)
|
|
||||||
+ targ_obj=mips
|
|
||||||
+ targ_machine=EM_MIPS
|
|
||||||
+ targ_size=64
|
|
||||||
+ targ_big_endian=true
|
|
||||||
+ targ_extra_big_endian=false
|
|
||||||
+ ;;
|
|
||||||
mips*-*-*)
|
|
||||||
targ_obj=mips
|
|
||||||
targ_machine=EM_MIPS
|
|
|
@ -1,29 +0,0 @@
|
||||||
# Automatically generated aport, do not edit!
|
|
||||||
# Generator: pmbootstrap aportgen busybox-static-aarch64
|
|
||||||
|
|
||||||
pkgname=busybox-static-aarch64
|
|
||||||
pkgver=1.28.4
|
|
||||||
pkgrel=2
|
|
||||||
|
|
||||||
_arch="aarch64"
|
|
||||||
_mirror="http://dl-cdn.alpinelinux.org/alpine/"
|
|
||||||
|
|
||||||
url="http://busybox.net"
|
|
||||||
license="GPL2"
|
|
||||||
arch="all"
|
|
||||||
options="!check !strip"
|
|
||||||
pkgdesc="Statically linked Busybox for $_arch"
|
|
||||||
_target="$(arch_to_hostspec $_arch)"
|
|
||||||
|
|
||||||
source="
|
|
||||||
busybox-static-$pkgver-r$pkgrel-$_arch.apk::$_mirror/edge/main/$_arch/busybox-static-$pkgver-r$pkgrel.apk
|
|
||||||
"
|
|
||||||
|
|
||||||
package() {
|
|
||||||
mkdir -p "$pkgdir/usr/$_target"
|
|
||||||
cd "$pkgdir/usr/$_target"
|
|
||||||
tar -xf $srcdir/busybox-static-$pkgver-r$pkgrel-$_arch.apk
|
|
||||||
rm .PKGINFO .SIGN.*
|
|
||||||
}
|
|
||||||
|
|
||||||
sha512sums="363f13a3041a65ee96c984f75e46e3b0af985de3ca312b109ee2fbcfea957a69fe75655d3138ca922f8e196fa97c56c7c8a387440962150874a2cc619f07e8b6 busybox-static-1.28.4-r2-aarch64.apk"
|
|
|
@ -1,29 +0,0 @@
|
||||||
# Automatically generated aport, do not edit!
|
|
||||||
# Generator: pmbootstrap aportgen busybox-static-armhf
|
|
||||||
|
|
||||||
pkgname=busybox-static-armhf
|
|
||||||
pkgver=1.28.4
|
|
||||||
pkgrel=2
|
|
||||||
|
|
||||||
_arch="armhf"
|
|
||||||
_mirror="http://dl-cdn.alpinelinux.org/alpine/"
|
|
||||||
|
|
||||||
url="http://busybox.net"
|
|
||||||
license="GPL2"
|
|
||||||
arch="all"
|
|
||||||
options="!check !strip"
|
|
||||||
pkgdesc="Statically linked Busybox for $_arch"
|
|
||||||
_target="$(arch_to_hostspec $_arch)"
|
|
||||||
|
|
||||||
source="
|
|
||||||
busybox-static-$pkgver-r$pkgrel-$_arch.apk::$_mirror/edge/main/$_arch/busybox-static-$pkgver-r$pkgrel.apk
|
|
||||||
"
|
|
||||||
|
|
||||||
package() {
|
|
||||||
mkdir -p "$pkgdir/usr/$_target"
|
|
||||||
cd "$pkgdir/usr/$_target"
|
|
||||||
tar -xf $srcdir/busybox-static-$pkgver-r$pkgrel-$_arch.apk
|
|
||||||
rm .PKGINFO .SIGN.*
|
|
||||||
}
|
|
||||||
|
|
||||||
sha512sums="e10a339969fee47103d567d4a24237371a13a8519c40c550e64c3129018ff0fbd3bea785391c921087631bf0857e4a2ac46862fd699052f6a0752fb6e5771024 busybox-static-1.28.4-r2-armhf.apk"
|
|
|
@ -1,27 +0,0 @@
|
||||||
# This package gets installed in the native chroot only. When cross-
|
|
||||||
# compiling packages in the native chroot (e.g. kernel packages), the
|
|
||||||
# cross-compiler does not get called directly, but wrapped through
|
|
||||||
# ccache, which can then cache the results.
|
|
||||||
|
|
||||||
pkgname=ccache-cross-symlinks
|
|
||||||
pkgver=1
|
|
||||||
pkgrel=4
|
|
||||||
pkgdesc="Enable ccache for cross-compilers with symlinks"
|
|
||||||
url="https://ccache.samba.org/"
|
|
||||||
arch="noarch"
|
|
||||||
license="MIT"
|
|
||||||
depends="ccache"
|
|
||||||
options="!check"
|
|
||||||
|
|
||||||
package() {
|
|
||||||
local _archs="armhf aarch64"
|
|
||||||
local _bins="c++ cc cpp g++ gcc"
|
|
||||||
mkdir -p "$pkgdir/usr/lib/ccache/bin"
|
|
||||||
cd "$pkgdir/usr/lib/ccache/bin"
|
|
||||||
for _arch in $_archs; do
|
|
||||||
_hostspec="$(arch_to_hostspec $_arch)"
|
|
||||||
for _bin in $_bins; do
|
|
||||||
ln -v -s /usr/bin/ccache ${_hostspec}-${_bin}
|
|
||||||
done
|
|
||||||
done
|
|
||||||
}
|
|
|
@ -1,241 +0,0 @@
|
||||||
From b1d2df5090abc9202a7bf2d224ac90de22908d21 Mon Sep 17 00:00:00 2001
|
|
||||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
||||||
Date: Mon, 15 Jan 2018 11:27:24 +0000
|
|
||||||
Subject: [PATCH 01/13] 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
|
|
||||||
2017-06-01 Bernd Edlinger <bernd.edlinger@hotmail.de>
|
|
||||||
|
|
||||||
* 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.
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 68 ++++++++++----------------------------------------
|
|
||||||
gcc/config/i386/i386.h | 53 ++++++++++++++++++++++++++++++++++++++-
|
|
||||||
2 files changed, 65 insertions(+), 56 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
|
||||||
index 8b5faac5129..a1ff32b648b 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -2434,53 +2434,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;
|
|
||||||
|
|
||||||
@@ -2572,7 +2525,7 @@ static unsigned int ix86_function_arg_boundary (machine_mode,
|
|
||||||
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);
|
|
||||||
@@ -10944,7 +10897,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);
|
|
||||||
}
|
|
||||||
@@ -11355,8 +11309,8 @@ ix86_can_eliminate (const int from, const int to)
|
|
||||||
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;
|
|
||||||
@@ -11395,8 +11349,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;
|
|
||||||
@@ -12702,7 +12657,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))
|
|
||||||
{
|
|
||||||
@@ -13379,7 +13335,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
|
|
||||||
@@ -13876,7 +13833,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
|
|
||||||
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
|
|
||||||
index 8113f83c7fd..54144166172 100644
|
|
||||||
--- a/gcc/config/i386/i386.h
|
|
||||||
+++ b/gcc/config/i386/i386.h
|
|
||||||
@@ -2427,9 +2427,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
|
|
||||||
@@ -2475,6 +2522,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;
|
|
||||||
@@ -2554,6 +2604,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
|
|
||||||
--
|
|
||||||
2.16.3
|
|
||||||
|
|
|
@ -1,69 +0,0 @@
|
||||||
From b1fc91cda7c15264116f3dde6944ead149123653 Mon Sep 17 00:00:00 2001
|
|
||||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
||||||
Date: Mon, 15 Jan 2018 11:28:44 +0000
|
|
||||||
Subject: [PATCH 02/13] 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
|
|
||||||
2017-11-06 H.J. Lu <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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.
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 8 +++-----
|
|
||||||
1 file changed, 3 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
|
||||||
index a1ff32b648b..13ebf107e90 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -10887,7 +10887,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;
|
|
||||||
@@ -10898,7 +10897,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);
|
|
||||||
}
|
|
||||||
@@ -11310,7 +11309,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;
|
|
||||||
@@ -13821,7 +13820,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;
|
|
||||||
@@ -13834,7 +13832,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.16.3
|
|
||||||
|
|
|
@ -1,126 +0,0 @@
|
||||||
From 3e39c0a8053b3e960cf4c3aea3c814e7dc97cfd6 Mon Sep 17 00:00:00 2001
|
|
||||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
||||||
Date: Sat, 27 Jan 2018 13:10:24 +0000
|
|
||||||
Subject: [PATCH 03/13] i386: Use const reference of struct ix86_frame to avoid
|
|
||||||
copy
|
|
||||||
|
|
||||||
We can use const reference of struct ix86_frame to avoid making a local
|
|
||||||
copy of ix86_frame. ix86_expand_epilogue makes a local copy of struct
|
|
||||||
ix86_frame and uses the reg_save_offset field as a local variable. This
|
|
||||||
patch uses a separate local variable for reg_save_offset.
|
|
||||||
|
|
||||||
Tested on x86-64 with ada.
|
|
||||||
|
|
||||||
Backport from mainline
|
|
||||||
PR target/83905
|
|
||||||
* config/i386/i386.c (ix86_expand_prologue): Use cost reference
|
|
||||||
of struct ix86_frame.
|
|
||||||
(ix86_expand_epilogue): Likewise. Add a local variable for
|
|
||||||
the reg_save_offset field in struct ix86_frame.
|
|
||||||
|
|
||||||
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@257123 138bc75d-0d04-0410-961f-82ee72b054a4
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 24 ++++++++++++------------
|
|
||||||
1 file changed, 12 insertions(+), 12 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
|
||||||
index 13ebf107e90..6c98f7581e2 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -12633,7 +12633,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;
|
|
||||||
@@ -12657,7 +12656,7 @@ ix86_expand_prologue (void)
|
|
||||||
m->fs.sp_valid = true;
|
|
||||||
|
|
||||||
ix86_compute_frame_layout ();
|
|
||||||
- frame = m->frame;
|
|
||||||
+ const struct ix86_frame &frame = cfun->machine->frame;
|
|
||||||
|
|
||||||
if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl))
|
|
||||||
{
|
|
||||||
@@ -13329,13 +13328,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;
|
|
||||||
+ const struct ix86_frame &frame = cfun->machine->frame;
|
|
||||||
|
|
||||||
m->fs.sp_valid = (!frame_pointer_needed
|
|
||||||
|| (crtl->sp_is_unchanging
|
|
||||||
@@ -13377,11 +13375,13 @@ ix86_expand_epilogue (int style)
|
|
||||||
+ UNITS_PER_WORD);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ HOST_WIDE_INT reg_save_offset = frame.reg_save_offset;
|
|
||||||
+
|
|
||||||
/* Special care must be taken for the normal return case of a function
|
|
||||||
using eh_return: the eax and edx registers are marked as saved, but
|
|
||||||
not restored along this path. Adjust the save location to match. */
|
|
||||||
if (crtl->calls_eh_return && style != 2)
|
|
||||||
- frame.reg_save_offset -= 2 * UNITS_PER_WORD;
|
|
||||||
+ reg_save_offset -= 2 * UNITS_PER_WORD;
|
|
||||||
|
|
||||||
/* EH_RETURN requires the use of moves to function properly. */
|
|
||||||
if (crtl->calls_eh_return)
|
|
||||||
@@ -13397,11 +13397,11 @@ ix86_expand_epilogue (int style)
|
|
||||||
else if (TARGET_EPILOGUE_USING_MOVE
|
|
||||||
&& cfun->machine->use_fast_prologue_epilogue
|
|
||||||
&& (frame.nregs > 1
|
|
||||||
- || m->fs.sp_offset != frame.reg_save_offset))
|
|
||||||
+ || m->fs.sp_offset != reg_save_offset))
|
|
||||||
restore_regs_via_mov = true;
|
|
||||||
else if (frame_pointer_needed
|
|
||||||
&& !frame.nregs
|
|
||||||
- && m->fs.sp_offset != frame.reg_save_offset)
|
|
||||||
+ && m->fs.sp_offset != reg_save_offset)
|
|
||||||
restore_regs_via_mov = true;
|
|
||||||
else if (frame_pointer_needed
|
|
||||||
&& TARGET_USE_LEAVE
|
|
||||||
@@ -13439,7 +13439,7 @@ ix86_expand_epilogue (int style)
|
|
||||||
rtx t;
|
|
||||||
|
|
||||||
if (frame.nregs)
|
|
||||||
- ix86_emit_restore_regs_using_mov (frame.reg_save_offset, style == 2);
|
|
||||||
+ ix86_emit_restore_regs_using_mov (reg_save_offset, style == 2);
|
|
||||||
|
|
||||||
/* eh_return epilogues need %ecx added to the stack pointer. */
|
|
||||||
if (style == 2)
|
|
||||||
@@ -13529,19 +13529,19 @@ ix86_expand_epilogue (int style)
|
|
||||||
epilogues. */
|
|
||||||
if (!m->fs.sp_valid
|
|
||||||
|| (TARGET_SEH
|
|
||||||
- && (m->fs.sp_offset - frame.reg_save_offset
|
|
||||||
+ && (m->fs.sp_offset - reg_save_offset
|
|
||||||
>= SEH_MAX_FRAME_SIZE)))
|
|
||||||
{
|
|
||||||
pro_epilogue_adjust_stack (stack_pointer_rtx, hard_frame_pointer_rtx,
|
|
||||||
GEN_INT (m->fs.fp_offset
|
|
||||||
- - frame.reg_save_offset),
|
|
||||||
+ - reg_save_offset),
|
|
||||||
style, false);
|
|
||||||
}
|
|
||||||
- else if (m->fs.sp_offset != frame.reg_save_offset)
|
|
||||||
+ else if (m->fs.sp_offset != reg_save_offset)
|
|
||||||
{
|
|
||||||
pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
|
|
||||||
GEN_INT (m->fs.sp_offset
|
|
||||||
- - frame.reg_save_offset),
|
|
||||||
+ - reg_save_offset),
|
|
||||||
style,
|
|
||||||
m->fs.cfa_reg == stack_pointer_rtx);
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.16.3
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,941 +0,0 @@
|
||||||
From 61bb7f0e152ce5be700a44007d036ea0de4b254d Mon Sep 17 00:00:00 2001
|
|
||||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
|
||||||
Date: Sat, 6 Jan 2018 22:29:56 -0800
|
|
||||||
Subject: [PATCH 06/13] 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* config/i386/predicates.md (indirect_branch_operand): Rewrite
|
|
||||||
ix86_indirect_branch_register logic.
|
|
||||||
---
|
|
||||||
gcc/config/i386/constraints.md | 6 ++--
|
|
||||||
gcc/config/i386/i386.md | 34 ++++++++++++++--------
|
|
||||||
gcc/config/i386/i386.opt | 4 +++
|
|
||||||
gcc/config/i386/predicates.md | 21 +++++++------
|
|
||||||
gcc/doc/invoke.texi | 6 +++-
|
|
||||||
gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/indirect-thunk-5.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/indirect-thunk-6.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-attr-1.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-attr-2.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-attr-3.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-attr-4.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-attr-5.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-attr-6.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-attr-7.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-bnd-1.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-bnd-2.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-bnd-3.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-bnd-4.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-extern-1.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-extern-2.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-extern-3.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-extern-4.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-extern-5.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-extern-6.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-extern-7.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-inline-1.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-inline-2.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-inline-3.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-inline-4.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-inline-5.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-inline-6.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-inline-7.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-register-1.c | 22 ++++++++++++++
|
|
||||||
.../gcc.target/i386/indirect-thunk-register-2.c | 20 +++++++++++++
|
|
||||||
.../gcc.target/i386/indirect-thunk-register-3.c | 19 ++++++++++++
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-10.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-11.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-12.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-13.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-14.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-15.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-9.c | 2 +-
|
|
||||||
47 files changed, 147 insertions(+), 63 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
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/constraints.md b/gcc/config/i386/constraints.md
|
|
||||||
index 1a4c701ad13..9204c8e8487 100644
|
|
||||||
--- a/gcc/config/i386/constraints.md
|
|
||||||
+++ b/gcc/config/i386/constraints.md
|
|
||||||
@@ -172,14 +172,16 @@
|
|
||||||
|
|
||||||
(define_constraint "Bs"
|
|
||||||
"@internal Sibcall memory operand."
|
|
||||||
- (ior (and (not (match_test "TARGET_X32"))
|
|
||||||
+ (ior (and (not (match_test "ix86_indirect_branch_register"))
|
|
||||||
+ (not (match_test "TARGET_X32"))
|
|
||||||
(match_operand 0 "sibcall_memory_operand"))
|
|
||||||
(and (match_test "TARGET_X32 && Pmode == DImode")
|
|
||||||
(match_operand 0 "GOT_memory_operand"))))
|
|
||||||
|
|
||||||
(define_constraint "Bw"
|
|
||||||
"@internal Call memory operand."
|
|
||||||
- (ior (and (not (match_test "TARGET_X32"))
|
|
||||||
+ (ior (and (not (match_test "ix86_indirect_branch_register"))
|
|
||||||
+ (not (match_test "TARGET_X32"))
|
|
||||||
(match_operand 0 "memory_operand"))
|
|
||||||
(and (match_test "TARGET_X32 && Pmode == DImode")
|
|
||||||
(match_operand 0 "GOT_memory_operand"))))
|
|
||||||
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
|
|
||||||
index 2da671e9f2d..05a88fff356 100644
|
|
||||||
--- a/gcc/config/i386/i386.md
|
|
||||||
+++ b/gcc/config/i386/i386.md
|
|
||||||
@@ -11805,7 +11805,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;
|
|
||||||
})
|
|
||||||
@@ -11859,7 +11859,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;
|
|
||||||
})
|
|
||||||
@@ -12048,7 +12048,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")])
|
|
||||||
|
|
||||||
@@ -12057,7 +12057,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))
|
|
||||||
&& !reg_mentioned_p (operands[0],
|
|
||||||
CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"
|
|
||||||
[(parallel [(call (mem:QI (match_dup 1))
|
|
||||||
@@ -12070,7 +12072,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))
|
|
||||||
&& !reg_mentioned_p (operands[0],
|
|
||||||
CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"
|
|
||||||
[(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
|
|
||||||
@@ -12092,7 +12096,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)
|
|
||||||
@@ -12112,7 +12116,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)
|
|
||||||
@@ -12166,7 +12170,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
|
|
||||||
@@ -12244,7 +12250,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")])
|
|
||||||
|
|
||||||
@@ -12254,7 +12260,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))
|
|
||||||
&& !reg_mentioned_p (operands[0],
|
|
||||||
CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"
|
|
||||||
[(parallel [(set (match_dup 2)
|
|
||||||
@@ -12269,7 +12277,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))
|
|
||||||
&& !reg_mentioned_p (operands[0],
|
|
||||||
CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"
|
|
||||||
[(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
|
|
||||||
@@ -12294,7 +12304,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)
|
|
||||||
diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
|
|
||||||
index ad5916fb643..a97f84f68f2 100644
|
|
||||||
--- a/gcc/config/i386/i386.opt
|
|
||||||
+++ b/gcc/config/i386/i386.opt
|
|
||||||
@@ -921,3 +921,7 @@ Enum(indirect_branch) String(thunk-inline) Value(indirect_branch_thunk_inline)
|
|
||||||
|
|
||||||
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.
|
|
||||||
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
|
|
||||||
index 93dda7bb0e7..d1f0a7dbf61 100644
|
|
||||||
--- a/gcc/config/i386/predicates.md
|
|
||||||
+++ b/gcc/config/i386/predicates.md
|
|
||||||
@@ -593,7 +593,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"))))
|
|
||||||
|
|
||||||
;; Return true if OP is a memory operands that can be used in sibcalls.
|
|
||||||
@@ -636,20 +637,22 @@
|
|
||||||
(ior (match_test "constant_call_address_operand
|
|
||||||
(op, mode == VOIDmode ? mode : Pmode)")
|
|
||||||
(match_operand 0 "call_register_no_elim_operand")
|
|
||||||
- (ior (and (not (match_test "TARGET_X32"))
|
|
||||||
- (match_operand 0 "memory_operand"))
|
|
||||||
- (and (match_test "TARGET_X32 && Pmode == DImode")
|
|
||||||
- (match_operand 0 "GOT_memory_operand")))))
|
|
||||||
+ (and (not (match_test "ix86_indirect_branch_register"))
|
|
||||||
+ (ior (and (not (match_test "TARGET_X32"))
|
|
||||||
+ (match_operand 0 "memory_operand"))
|
|
||||||
+ (and (match_test "TARGET_X32 && Pmode == DImode")
|
|
||||||
+ (match_operand 0 "GOT_memory_operand"))))))
|
|
||||||
|
|
||||||
;; Similarly, but for tail calls, in which we cannot allow memory references.
|
|
||||||
(define_special_predicate "sibcall_insn_operand"
|
|
||||||
(ior (match_test "constant_call_address_operand
|
|
||||||
(op, mode == VOIDmode ? mode : Pmode)")
|
|
||||||
(match_operand 0 "register_no_elim_operand")
|
|
||||||
- (ior (and (not (match_test "TARGET_X32"))
|
|
||||||
- (match_operand 0 "sibcall_memory_operand"))
|
|
||||||
- (and (match_test "TARGET_X32 && Pmode == DImode")
|
|
||||||
- (match_operand 0 "GOT_memory_operand")))))
|
|
||||||
+ (and (not (match_test "ix86_indirect_branch_register"))
|
|
||||||
+ (ior (and (not (match_test "TARGET_X32"))
|
|
||||||
+ (match_operand 0 "sibcall_memory_operand"))
|
|
||||||
+ (and (match_test "TARGET_X32 && Pmode == DImode")
|
|
||||||
+ (match_operand 0 "GOT_memory_operand"))))))
|
|
||||||
|
|
||||||
;; Return true if OP is a 32-bit GOT symbol operand.
|
|
||||||
(define_predicate "GOT32_symbol_operand"
|
|
||||||
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
|
|
||||||
index 337a761015a..94374661f2d 100644
|
|
||||||
--- a/gcc/doc/invoke.texi
|
|
||||||
+++ b/gcc/doc/invoke.texi
|
|
||||||
@@ -1170,7 +1170,7 @@ See RS/6000 and PowerPC Options.
|
|
||||||
-mavx256-split-unaligned-load -mavx256-split-unaligned-store @gol
|
|
||||||
-malign-data=@var{type} -mstack-protector-guard=@var{guard} @gol
|
|
||||||
-mmitigate-rop -mindirect-branch=@var{choice} @gol
|
|
||||||
--mfunction-return=@var{choice}}
|
|
||||||
+-mfunction-return=@var{choice} -mindirect-branch-register}
|
|
||||||
|
|
||||||
@emph{x86 Windows Options}
|
|
||||||
@gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol
|
|
||||||
@@ -24253,6 +24253,10 @@ object file. You can control this behavior for a specific function by
|
|
||||||
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
|
|
||||||
|
|
||||||
These @samp{-m} switches are supported in addition to the above
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
|
|
||||||
index e365ef5698a..60d09881a99 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
|
|
||||||
index 05a51ad9157..aac75163794 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
|
|
||||||
index 3c0d4c39f0b..9e24a385387 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
|
|
||||||
index 14d4ef6dd98..127b5d94523 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
|
|
||||||
index b4836c38d6c..fcaa18d10b7 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* { dg-do compile { target *-*-linux* } } */
|
|
||||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
|
|
||||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
|
|
||||||
|
|
||||||
extern void bar (void);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
|
|
||||||
index 1f06bd1af74..e4649283d10 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* { dg-do compile { target *-*-linux* } } */
|
|
||||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
|
|
||||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
|
|
||||||
|
|
||||||
extern void bar (void);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
|
|
||||||
index bc6b47a636e..17c2d0faf88 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
|
|
||||||
+++ b/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);
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
|
|
||||||
index 2257be3affa..9194ccf3cbc 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
|
|
||||||
index e9cfdc5879e..e51f261a612 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
|
|
||||||
index f938db050f7..4aeec1833cd 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
|
|
||||||
index 4e58599692a..ac0e5999f63 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
|
|
||||||
index b8d50249d8b..573cf1ef09e 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
|
|
||||||
index 455adabfe0e..b2b37fc6e2e 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
|
|
||||||
index 4595b841ec0..4a43e199931 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
|
|
||||||
+++ b/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);
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
|
|
||||||
index 5e3e118e9bd..ac84ab623fa 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
|
|
||||||
+++ b/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];
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
|
|
||||||
index 2801aa4192e..ce655e8be1c 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
|
|
||||||
+++ b/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];
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
|
|
||||||
index 70b4fb36eea..d34485a0010 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */
|
|
||||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
|
|
||||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
|
|
||||||
|
|
||||||
void bar (char *);
|
|
||||||
char buf[10];
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
|
|
||||||
index 3baf03ee77c..0e19830de4d 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */
|
|
||||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
|
|
||||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
|
|
||||||
|
|
||||||
void bar (char *);
|
|
||||||
char buf[10];
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
|
|
||||||
index edeb264218c..579441f250e 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
|
|
||||||
index 1d00413a76a..c92e6f2b02d 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
|
|
||||||
index 06ebf1c9063..d9964c25bbd 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
|
|
||||||
index 1c8f9446636..d4dca4dc5fe 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
|
|
||||||
index 21740ac5b7f..5c07e02df6a 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* { dg-do compile { target *-*-linux* } } */
|
|
||||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
|
|
||||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
|
|
||||||
|
|
||||||
extern void bar (void);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
|
|
||||||
index a77c1f470b8..3eb440693a0 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* { dg-do compile { target *-*-linux* } } */
|
|
||||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
|
|
||||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
|
|
||||||
|
|
||||||
extern void bar (void);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
|
|
||||||
index 86e9fd1f1e4..aece9383697 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
|
|
||||||
+++ b/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);
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
|
|
||||||
index 3ecde878867..3aba5e8c81f 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
|
|
||||||
index df32a19a2b5..0f0181d6672 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
|
|
||||||
index 9540996de01..2eef6f35a75 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
|
|
||||||
index f3db6e2441f..e825a10f14c 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
|
|
||||||
index 0f687c3b027..c6d77e10352 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* { dg-do compile { target *-*-linux* } } */
|
|
||||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
|
|
||||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
|
|
||||||
|
|
||||||
extern void bar (void);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
|
|
||||||
index b27c6fc96a2..6454827b780 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* { dg-do compile { target *-*-linux* } } */
|
|
||||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
|
|
||||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
|
|
||||||
|
|
||||||
extern void bar (void);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
|
|
||||||
index 764a375fc37..c67066cf197 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
|
|
||||||
+++ b/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);
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..7d396a31953
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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" } } */
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..e7e616bb271
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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" } } */
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..5320e923be2
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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" } } */
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-10.c b/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
|
|
||||||
index 3a6727b5c54..e6fea84a4d9 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-11.c b/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
|
|
||||||
index b8f68188313..e239ec4542f 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-12.c b/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
|
|
||||||
index 01b0a02f80b..fa3181303c9 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-13.c b/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
|
|
||||||
index 4b497b5f8af..fd5b41fdd3f 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
|
|
||||||
+++ b/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")));
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-14.c b/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
|
|
||||||
index 4ae4c44a3fd..d606373ead1 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-15.c b/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
|
|
||||||
index 5b5bc765a7e..75e45e226b8 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
|
||||||
index fa24a1f7365..d1db41cc128 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
--
|
|
||||||
2.16.3
|
|
||||||
|
|
|
@ -1,134 +0,0 @@
|
||||||
From 92308185917678406afee3c165ea5e71b53b3cc1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
|
||||||
Date: Sat, 6 Jan 2018 22:29:56 -0800
|
|
||||||
Subject: [PATCH 07/13] 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* gcc.target/i386/indirect-thunk-register-4.c: New test.
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 13 ++++++++++++-
|
|
||||||
gcc/doc/extend.texi | 3 +++
|
|
||||||
gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c | 13 +++++++++++++
|
|
||||||
3 files changed, 28 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 34e26a3a3c7..eeca7e5e490 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -16869,6 +16869,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
|
|
||||||
@@ -16879,7 +16880,7 @@ print_reg (rtx x, int code, FILE *file)
|
|
||||||
unsigned int regno;
|
|
||||||
bool duplicated;
|
|
||||||
|
|
||||||
- if (ASSEMBLER_DIALECT == ASM_ATT)
|
|
||||||
+ if (ASSEMBLER_DIALECT == ASM_ATT && code != 'V')
|
|
||||||
putc ('%', file);
|
|
||||||
|
|
||||||
if (x == pc_rtx)
|
|
||||||
@@ -16922,6 +16923,14 @@ print_reg (rtx x, int code, FILE *file)
|
|
||||||
&& regno != FPSR_REG
|
|
||||||
&& regno != FPCR_REG);
|
|
||||||
|
|
||||||
+ if (code == 'V')
|
|
||||||
+ {
|
|
||||||
+ if (GENERAL_REGNO_P (regno))
|
|
||||||
+ msize = GET_MODE_SIZE (word_mode);
|
|
||||||
+ else
|
|
||||||
+ error ("'V' modifier on non-integer register");
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
duplicated = code == 'd' && TARGET_AVX;
|
|
||||||
|
|
||||||
switch (msize)
|
|
||||||
@@ -17035,6 +17044,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.
|
|
||||||
@@ -17259,6 +17269,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/doc/extend.texi b/gcc/doc/extend.texi
|
|
||||||
index 2cb6bd1ef3e..76ba1d4f913 100644
|
|
||||||
--- a/gcc/doc/extend.texi
|
|
||||||
+++ b/gcc/doc/extend.texi
|
|
||||||
@@ -8511,6 +8511,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/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 00000000000..f0cd9b75be8
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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.16.3
|
|
||||||
|
|
|
@ -1,299 +0,0 @@
|
||||||
From 087b12213a5b4b8654c70320c671bb05c1b1b012 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
|
||||||
Date: Sat, 13 Jan 2018 18:01:54 -0800
|
|
||||||
Subject: [PATCH 08/13] 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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.
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 26 ++++++++++++++++++++++
|
|
||||||
gcc/doc/invoke.texi | 11 +++++++++
|
|
||||||
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 ++++++++
|
|
||||||
13 files changed, 126 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 eeca7e5e490..9c038bee000 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -6389,6 +6389,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)
|
|
||||||
@@ -6414,6 +6427,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/doc/invoke.texi b/gcc/doc/invoke.texi
|
|
||||||
index 94374661f2d..1dee495c86b 100644
|
|
||||||
--- a/gcc/doc/invoke.texi
|
|
||||||
+++ b/gcc/doc/invoke.texi
|
|
||||||
@@ -24242,6 +24242,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},
|
|
||||||
@@ -24253,6 +24258,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/gcc/testsuite/gcc.target/i386/indirect-thunk-10.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-10.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..a0674bd2363
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..7a80a8986e8
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..d4d45c5114d
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..3a2aeaddbc5
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..8e52f032b6c
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..bdaa4f6911b
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..0605e2c6542
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..307019dc242
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..772617f4010
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..1e9f9bd5a66
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..eea07f7abe1
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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.16.3
|
|
||||||
|
|
|
@ -1,121 +0,0 @@
|
||||||
From 07857bd9fb9ccab67a932ad9df3e53f3f0c2c617 Mon Sep 17 00:00:00 2001
|
|
||||||
From: uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
||||||
Date: Thu, 25 Jan 2018 19:39:01 +0000
|
|
||||||
Subject: [PATCH 09/13] Use INVALID_REGNUM in indirect thunk processing
|
|
||||||
|
|
||||||
Backport from mainline
|
|
||||||
2018-01-17 Uros Bizjak <ubizjak@gmail.com>
|
|
||||||
|
|
||||||
* config/i386/i386.c (indirect_thunk_name): Declare regno
|
|
||||||
as unsigned int. Compare regno with INVALID_REGNUM.
|
|
||||||
(output_indirect_thunk): Ditto.
|
|
||||||
(output_indirect_thunk_function): Ditto.
|
|
||||||
(ix86_code_end): Declare regno as unsigned int. Use INVALID_REGNUM
|
|
||||||
in the call to output_indirect_thunk_function.
|
|
||||||
|
|
||||||
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@257067 138bc75d-0d04-0410-961f-82ee72b054a4
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 30 +++++++++++++++---------------
|
|
||||||
1 file changed, 15 insertions(+), 15 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
|
||||||
index 9c038bee000..40126579c22 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -11087,16 +11087,16 @@ 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,
|
|
||||||
- bool ret_p)
|
|
||||||
+indirect_thunk_name (char name[32], unsigned int regno,
|
|
||||||
+ bool need_bnd_p, bool ret_p)
|
|
||||||
{
|
|
||||||
- if (regno >= 0 && ret_p)
|
|
||||||
+ if (regno != INVALID_REGNUM && ret_p)
|
|
||||||
gcc_unreachable ();
|
|
||||||
|
|
||||||
if (USE_HIDDEN_LINKONCE)
|
|
||||||
{
|
|
||||||
const char *bnd = need_bnd_p ? "_bnd" : "";
|
|
||||||
- if (regno >= 0)
|
|
||||||
+ if (regno != INVALID_REGNUM)
|
|
||||||
{
|
|
||||||
const char *reg_prefix;
|
|
||||||
if (LEGACY_INT_REGNO_P (regno))
|
|
||||||
@@ -11114,7 +11114,7 @@ indirect_thunk_name (char name[32], int regno, bool need_bnd_p,
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
- if (regno >= 0)
|
|
||||||
+ if (regno != INVALID_REGNUM)
|
|
||||||
{
|
|
||||||
if (need_bnd_p)
|
|
||||||
ASM_GENERATE_INTERNAL_LABEL (name, "LITBR", regno);
|
|
||||||
@@ -11166,7 +11166,7 @@ indirect_thunk_name (char name[32], int regno, bool need_bnd_p,
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void
|
|
||||||
-output_indirect_thunk (bool need_bnd_p, int regno)
|
|
||||||
+output_indirect_thunk (bool need_bnd_p, unsigned int regno)
|
|
||||||
{
|
|
||||||
char indirectlabel1[32];
|
|
||||||
char indirectlabel2[32];
|
|
||||||
@@ -11196,7 +11196,7 @@ output_indirect_thunk (bool need_bnd_p, int regno)
|
|
||||||
|
|
||||||
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2);
|
|
||||||
|
|
||||||
- if (regno >= 0)
|
|
||||||
+ if (regno != INVALID_REGNUM)
|
|
||||||
{
|
|
||||||
/* MOV. */
|
|
||||||
rtx xops[2];
|
|
||||||
@@ -11220,12 +11220,12 @@ output_indirect_thunk (bool need_bnd_p, int regno)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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
|
|
||||||
+ If BND_P is true, the BND prefix is needed. If REGNO != INVALID_REGNUM,
|
|
||||||
+ 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)
|
|
||||||
+output_indirect_thunk_function (bool need_bnd_p, unsigned int regno)
|
|
||||||
{
|
|
||||||
char name[32];
|
|
||||||
tree decl;
|
|
||||||
@@ -11274,7 +11274,7 @@ output_indirect_thunk_function (bool need_bnd_p, int regno)
|
|
||||||
ASM_OUTPUT_LABEL (asm_out_file, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (regno < 0)
|
|
||||||
+ if (regno == INVALID_REGNUM)
|
|
||||||
{
|
|
||||||
/* Create alias for __x86.return_thunk/__x86.return_thunk_bnd. */
|
|
||||||
char alias[32];
|
|
||||||
@@ -11348,16 +11348,16 @@ static void
|
|
||||||
ix86_code_end (void)
|
|
||||||
{
|
|
||||||
rtx xops[2];
|
|
||||||
- int regno;
|
|
||||||
+ unsigned int regno;
|
|
||||||
|
|
||||||
if (indirect_thunk_needed)
|
|
||||||
- output_indirect_thunk_function (false, -1);
|
|
||||||
+ output_indirect_thunk_function (false, INVALID_REGNUM);
|
|
||||||
if (indirect_thunk_bnd_needed)
|
|
||||||
- output_indirect_thunk_function (true, -1);
|
|
||||||
+ output_indirect_thunk_function (true, INVALID_REGNUM);
|
|
||||||
|
|
||||||
for (regno = FIRST_REX_INT_REG; regno <= LAST_REX_INT_REG; regno++)
|
|
||||||
{
|
|
||||||
- int i = regno - FIRST_REX_INT_REG + LAST_INT_REG + 1;
|
|
||||||
+ unsigned int i = regno - FIRST_REX_INT_REG + LAST_INT_REG + 1;
|
|
||||||
if ((indirect_thunks_used & (1 << i)))
|
|
||||||
output_indirect_thunk_function (false, regno);
|
|
||||||
|
|
||||||
--
|
|
||||||
2.16.3
|
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
From 3815e98f0f46b6c4c41e6810bad987bd083691aa Mon Sep 17 00:00:00 2001
|
|
||||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
||||||
Date: Fri, 2 Feb 2018 16:47:02 +0000
|
|
||||||
Subject: [PATCH 10/13] i386: Pass INVALID_REGNUM as invalid register number
|
|
||||||
|
|
||||||
Backport from mainline
|
|
||||||
* config/i386/i386.c (ix86_output_function_return): Pass
|
|
||||||
INVALID_REGNUM, instead of -1, as invalid register number to
|
|
||||||
indirect_thunk_name and output_indirect_thunk.
|
|
||||||
|
|
||||||
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@257341 138bc75d-0d04-0410-961f-82ee72b054a4
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 5 +++--
|
|
||||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
|
||||||
index 40126579c22..66502ee6da6 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -28056,7 +28056,8 @@ ix86_output_function_return (bool long_p)
|
|
||||||
{
|
|
||||||
bool need_thunk = (cfun->machine->function_return_type
|
|
||||||
== indirect_branch_thunk);
|
|
||||||
- indirect_thunk_name (thunk_name, -1, need_bnd_p, true);
|
|
||||||
+ indirect_thunk_name (thunk_name, INVALID_REGNUM, need_bnd_p,
|
|
||||||
+ true);
|
|
||||||
if (need_bnd_p)
|
|
||||||
{
|
|
||||||
indirect_thunk_bnd_needed |= need_thunk;
|
|
||||||
@@ -28069,7 +28070,7 @@ ix86_output_function_return (bool long_p)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
- output_indirect_thunk (need_bnd_p, -1);
|
|
||||||
+ output_indirect_thunk (need_bnd_p, INVALID_REGNUM);
|
|
||||||
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.16.3
|
|
||||||
|
|
|
@ -1,456 +0,0 @@
|
||||||
From 771535dec733e4b85924f00a3a94c29683d614e5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
||||||
Date: Mon, 26 Feb 2018 15:29:30 +0000
|
|
||||||
Subject: [PATCH 11/13] i386: Update -mfunction-return= for return with pop
|
|
||||||
|
|
||||||
When -mfunction-return= is used, simple_return_pop_internal should pop
|
|
||||||
return address into ECX register, adjust stack by bytes to pop from stack
|
|
||||||
and jump to the return thunk via ECX register.
|
|
||||||
|
|
||||||
Revision 257992 removed the bool argument from ix86_output_indirect_jmp.
|
|
||||||
Update comments to reflect it.
|
|
||||||
|
|
||||||
Tested on i686 and x86-64.
|
|
||||||
|
|
||||||
gcc/
|
|
||||||
|
|
||||||
Backport from mainline
|
|
||||||
2018-02-26 H.J. Lu <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* config/i386/i386.c (ix86_output_indirect_jmp): Update comments.
|
|
||||||
|
|
||||||
2018-02-26 H.J. Lu <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
PR target/84530
|
|
||||||
* config/i386/i386-protos.h (ix86_output_indirect_jmp): Remove
|
|
||||||
the bool argument.
|
|
||||||
(ix86_output_indirect_function_return): New prototype.
|
|
||||||
(ix86_split_simple_return_pop_internal): Likewise.
|
|
||||||
* config/i386/i386.c (indirect_return_via_cx): New.
|
|
||||||
(indirect_return_via_cx_bnd): Likewise.
|
|
||||||
(indirect_thunk_name): Handle return va CX_REG.
|
|
||||||
(output_indirect_thunk_function): Create alias for
|
|
||||||
__x86_return_thunk_[re]cx and __x86_return_thunk_[re]cx_bnd.
|
|
||||||
(ix86_output_indirect_jmp): Remove the bool argument.
|
|
||||||
(ix86_output_indirect_function_return): New function.
|
|
||||||
(ix86_split_simple_return_pop_internal): Likewise.
|
|
||||||
* config/i386/i386.md (*indirect_jump): Don't pass false
|
|
||||||
to ix86_output_indirect_jmp.
|
|
||||||
(*tablejump_1): Likewise.
|
|
||||||
(simple_return_pop_internal): Change it to define_insn_and_split.
|
|
||||||
Call ix86_split_simple_return_pop_internal to split it for
|
|
||||||
-mfunction-return=.
|
|
||||||
(simple_return_indirect_internal): Call
|
|
||||||
ix86_output_indirect_function_return instead of
|
|
||||||
ix86_output_indirect_jmp.
|
|
||||||
|
|
||||||
gcc/testsuite/
|
|
||||||
|
|
||||||
Backport from mainline
|
|
||||||
2018-02-26 H.J. Lu <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
PR target/84530
|
|
||||||
* gcc.target/i386/ret-thunk-22.c: New test.
|
|
||||||
* gcc.target/i386/ret-thunk-23.c: Likewise.
|
|
||||||
* gcc.target/i386/ret-thunk-24.c: Likewise.
|
|
||||||
* gcc.target/i386/ret-thunk-25.c: Likewise.
|
|
||||||
* gcc.target/i386/ret-thunk-26.c: Likewise.
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386-protos.h | 4 +-
|
|
||||||
gcc/config/i386/i386.c | 127 +++++++++++++++++++++++----
|
|
||||||
gcc/config/i386/i386.md | 11 ++-
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-22.c | 15 ++++
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-23.c | 15 ++++
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-24.c | 15 ++++
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-25.c | 15 ++++
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-26.c | 40 +++++++++
|
|
||||||
8 files changed, 222 insertions(+), 20 deletions(-)
|
|
||||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-22.c
|
|
||||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-23.c
|
|
||||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-24.c
|
|
||||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-25.c
|
|
||||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-26.c
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
|
|
||||||
index 620d70ef9f6..c7a0ccb58d3 100644
|
|
||||||
--- a/gcc/config/i386/i386-protos.h
|
|
||||||
+++ b/gcc/config/i386/i386-protos.h
|
|
||||||
@@ -311,8 +311,10 @@ 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);
|
|
||||||
+extern const char * ix86_output_indirect_jmp (rtx call_op);
|
|
||||||
extern const char * ix86_output_function_return (bool long_p);
|
|
||||||
+extern const char * ix86_output_indirect_function_return (rtx ret_op);
|
|
||||||
+extern void ix86_split_simple_return_pop_internal (rtx);
|
|
||||||
extern bool ix86_operands_ok_for_move_multiple (rtx *operands, bool load,
|
|
||||||
enum machine_mode mode);
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
|
||||||
index 66502ee6da6..21c3c18bd3c 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -11080,6 +11080,12 @@ static int indirect_thunks_used;
|
|
||||||
by call and return thunks functions with the BND prefix. */
|
|
||||||
static int indirect_thunks_bnd_used;
|
|
||||||
|
|
||||||
+/* True if return thunk function via CX is needed. */
|
|
||||||
+static bool indirect_return_via_cx;
|
|
||||||
+/* True if return thunk function via CX with the BND prefix is
|
|
||||||
+ needed. */
|
|
||||||
+static bool indirect_return_via_cx_bnd;
|
|
||||||
+
|
|
||||||
#ifndef INDIRECT_LABEL
|
|
||||||
# define INDIRECT_LABEL "LIND"
|
|
||||||
#endif
|
|
||||||
@@ -11090,12 +11096,13 @@ static void
|
|
||||||
indirect_thunk_name (char name[32], unsigned int regno,
|
|
||||||
bool need_bnd_p, bool ret_p)
|
|
||||||
{
|
|
||||||
- if (regno != INVALID_REGNUM && ret_p)
|
|
||||||
+ if (regno != INVALID_REGNUM && regno != CX_REG && ret_p)
|
|
||||||
gcc_unreachable ();
|
|
||||||
|
|
||||||
if (USE_HIDDEN_LINKONCE)
|
|
||||||
{
|
|
||||||
const char *bnd = need_bnd_p ? "_bnd" : "";
|
|
||||||
+ const char *ret = ret_p ? "return" : "indirect";
|
|
||||||
if (regno != INVALID_REGNUM)
|
|
||||||
{
|
|
||||||
const char *reg_prefix;
|
|
||||||
@@ -11103,14 +11110,11 @@ indirect_thunk_name (char name[32], unsigned int regno,
|
|
||||||
reg_prefix = TARGET_64BIT ? "r" : "e";
|
|
||||||
else
|
|
||||||
reg_prefix = "";
|
|
||||||
- sprintf (name, "__x86_indirect_thunk%s_%s%s",
|
|
||||||
- bnd, reg_prefix, reg_names[regno]);
|
|
||||||
+ sprintf (name, "__x86_%s_thunk%s_%s%s",
|
|
||||||
+ ret, bnd, reg_prefix, reg_names[regno]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
- {
|
|
||||||
- const char *ret = ret_p ? "return" : "indirect";
|
|
||||||
- sprintf (name, "__x86_%s_thunk%s", ret, bnd);
|
|
||||||
- }
|
|
||||||
+ sprintf (name, "__x86_%s_thunk%s", ret, bnd);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
@@ -11274,9 +11278,23 @@ output_indirect_thunk_function (bool need_bnd_p, unsigned int regno)
|
|
||||||
ASM_OUTPUT_LABEL (asm_out_file, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /* Create alias for __x86_return_thunk/__x86_return_thunk_bnd or
|
|
||||||
+ __x86_return_thunk_ecx/__x86_return_thunk_ecx_bnd. */
|
|
||||||
+ bool need_alias;
|
|
||||||
if (regno == INVALID_REGNUM)
|
|
||||||
+ need_alias = true;
|
|
||||||
+ else if (regno == CX_REG)
|
|
||||||
+ {
|
|
||||||
+ if (need_bnd_p)
|
|
||||||
+ need_alias = indirect_return_via_cx_bnd;
|
|
||||||
+ else
|
|
||||||
+ need_alias = indirect_return_via_cx;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ need_alias = false;
|
|
||||||
+
|
|
||||||
+ if (need_alias)
|
|
||||||
{
|
|
||||||
- /* Create alias for __x86.return_thunk/__x86.return_thunk_bnd. */
|
|
||||||
char alias[32];
|
|
||||||
|
|
||||||
indirect_thunk_name (alias, regno, need_bnd_p, true);
|
|
||||||
@@ -28019,18 +28037,17 @@ ix86_output_indirect_branch (rtx call_op, const char *xasm,
|
|
||||||
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. */
|
|
||||||
+
|
|
||||||
+/* Output indirect jump. CALL_OP is the jump target. */
|
|
||||||
|
|
||||||
const char *
|
|
||||||
-ix86_output_indirect_jmp (rtx call_op, bool ret_p)
|
|
||||||
+ix86_output_indirect_jmp (rtx call_op)
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
+ /* We can't have red-zone since "call" in the indirect thunk
|
|
||||||
+ pushes the return address onto stack, destroying red-zone. */
|
|
||||||
+ if (ix86_red_zone_size != 0)
|
|
||||||
gcc_unreachable ();
|
|
||||||
|
|
||||||
ix86_output_indirect_branch (call_op, "%0", true);
|
|
||||||
@@ -28081,6 +28098,86 @@ ix86_output_function_return (bool long_p)
|
|
||||||
return "rep%; ret";
|
|
||||||
}
|
|
||||||
|
|
||||||
+/* Output indirect function return. RET_OP is the function return
|
|
||||||
+ target. */
|
|
||||||
+
|
|
||||||
+const char *
|
|
||||||
+ix86_output_indirect_function_return (rtx ret_op)
|
|
||||||
+{
|
|
||||||
+ 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);
|
|
||||||
+ unsigned int regno = REGNO (ret_op);
|
|
||||||
+ gcc_assert (regno == CX_REG);
|
|
||||||
+
|
|
||||||
+ 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, regno, need_bnd_p, true);
|
|
||||||
+ if (need_bnd_p)
|
|
||||||
+ {
|
|
||||||
+ if (need_thunk)
|
|
||||||
+ {
|
|
||||||
+ indirect_return_via_cx_bnd = true;
|
|
||||||
+ indirect_thunks_bnd_used |= 1 << CX_REG;
|
|
||||||
+ }
|
|
||||||
+ fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name);
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ if (need_thunk)
|
|
||||||
+ {
|
|
||||||
+ indirect_return_via_cx = true;
|
|
||||||
+ indirect_thunks_used |= 1 << CX_REG;
|
|
||||||
+ }
|
|
||||||
+ fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ output_indirect_thunk (need_bnd_p, regno);
|
|
||||||
+
|
|
||||||
+ return "";
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ return "%!jmp\t%A0";
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/* Split simple return with popping POPC bytes from stack to indirect
|
|
||||||
+ branch with stack adjustment . */
|
|
||||||
+
|
|
||||||
+void
|
|
||||||
+ix86_split_simple_return_pop_internal (rtx popc)
|
|
||||||
+{
|
|
||||||
+ struct machine_function *m = cfun->machine;
|
|
||||||
+ rtx ecx = gen_rtx_REG (SImode, CX_REG);
|
|
||||||
+ rtx_insn *insn;
|
|
||||||
+
|
|
||||||
+ /* There is no "pascal" calling convention in any 64bit ABI. */
|
|
||||||
+ gcc_assert (!TARGET_64BIT);
|
|
||||||
+
|
|
||||||
+ insn = emit_insn (gen_pop (ecx));
|
|
||||||
+ m->fs.cfa_offset -= UNITS_PER_WORD;
|
|
||||||
+ m->fs.sp_offset -= UNITS_PER_WORD;
|
|
||||||
+
|
|
||||||
+ rtx x = plus_constant (Pmode, stack_pointer_rtx, UNITS_PER_WORD);
|
|
||||||
+ x = gen_rtx_SET (stack_pointer_rtx, x);
|
|
||||||
+ add_reg_note (insn, REG_CFA_ADJUST_CFA, x);
|
|
||||||
+ add_reg_note (insn, REG_CFA_REGISTER, gen_rtx_SET (ecx, pc_rtx));
|
|
||||||
+ RTX_FRAME_RELATED_P (insn) = 1;
|
|
||||||
+
|
|
||||||
+ x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, popc);
|
|
||||||
+ x = gen_rtx_SET (stack_pointer_rtx, x);
|
|
||||||
+ insn = emit_insn (x);
|
|
||||||
+ add_reg_note (insn, REG_CFA_ADJUST_CFA, x);
|
|
||||||
+ RTX_FRAME_RELATED_P (insn) = 1;
|
|
||||||
+
|
|
||||||
+ /* Now return address is in ECX. */
|
|
||||||
+ emit_jump_insn (gen_simple_return_indirect_internal (ecx));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/* Output the assembly for a call instruction. */
|
|
||||||
|
|
||||||
const char *
|
|
||||||
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
|
|
||||||
index 05a88fff356..857466a6361 100644
|
|
||||||
--- a/gcc/config/i386/i386.md
|
|
||||||
+++ b/gcc/config/i386/i386.md
|
|
||||||
@@ -11813,7 +11813,7 @@
|
|
||||||
(define_insn "*indirect_jump"
|
|
||||||
[(set (pc) (match_operand:W 0 "indirect_branch_operand" "rBw"))]
|
|
||||||
""
|
|
||||||
- "* return ix86_output_indirect_jmp (operands[0], false);"
|
|
||||||
+ "* return ix86_output_indirect_jmp (operands[0]);"
|
|
||||||
[(set (attr "type")
|
|
||||||
(if_then_else (match_test "(cfun->machine->indirect_branch_type
|
|
||||||
!= indirect_branch_keep)")
|
|
||||||
@@ -11868,7 +11868,7 @@
|
|
||||||
[(set (pc) (match_operand:W 0 "indirect_branch_operand" "rBw"))
|
|
||||||
(use (label_ref (match_operand 1)))]
|
|
||||||
""
|
|
||||||
- "* return ix86_output_indirect_jmp (operands[0], false);"
|
|
||||||
+ "* return ix86_output_indirect_jmp (operands[0]);"
|
|
||||||
[(set (attr "type")
|
|
||||||
(if_then_else (match_test "(cfun->machine->indirect_branch_type
|
|
||||||
!= indirect_branch_keep)")
|
|
||||||
@@ -12520,11 +12520,14 @@
|
|
||||||
(set_attr "prefix_rep" "1")
|
|
||||||
(set_attr "modrm" "0")])
|
|
||||||
|
|
||||||
-(define_insn "simple_return_pop_internal"
|
|
||||||
+(define_insn_and_split "simple_return_pop_internal"
|
|
||||||
[(simple_return)
|
|
||||||
(use (match_operand:SI 0 "const_int_operand"))]
|
|
||||||
"reload_completed"
|
|
||||||
"%!ret\t%0"
|
|
||||||
+ "&& cfun->machine->function_return_type != indirect_branch_keep"
|
|
||||||
+ [(const_int 0)]
|
|
||||||
+ "ix86_split_simple_return_pop_internal (operands[0]); DONE;"
|
|
||||||
[(set_attr "length" "3")
|
|
||||||
(set_attr "atom_unit" "jeu")
|
|
||||||
(set_attr "length_immediate" "2")
|
|
||||||
@@ -12535,7 +12538,7 @@
|
|
||||||
[(simple_return)
|
|
||||||
(use (match_operand:SI 0 "register_operand" "r"))]
|
|
||||||
"reload_completed"
|
|
||||||
- "* return ix86_output_indirect_jmp (operands[0], true);"
|
|
||||||
+ "* return ix86_output_indirect_function_return (operands[0]);"
|
|
||||||
[(set (attr "type")
|
|
||||||
(if_then_else (match_test "(cfun->machine->indirect_branch_type
|
|
||||||
!= indirect_branch_keep)")
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-22.c b/gcc/testsuite/gcc.target/i386/ret-thunk-22.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..89e086de97b
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-22.c
|
|
||||||
@@ -0,0 +1,15 @@
|
|
||||||
+/* PR target/r84530 */
|
|
||||||
+/* { dg-do compile { target ia32 } } */
|
|
||||||
+/* { dg-options "-O2 -mfunction-return=thunk" } */
|
|
||||||
+
|
|
||||||
+struct s { _Complex unsigned short x; };
|
|
||||||
+struct s gs = { 100 + 200i };
|
|
||||||
+struct s __attribute__((noinline)) foo (void) { return gs; }
|
|
||||||
+
|
|
||||||
+/* { dg-final { scan-assembler-times "popl\[\\t \]*%ecx" 1 } } */
|
|
||||||
+/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*4\\(%esp\\), %esp" } } */
|
|
||||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk_ecx" } } */
|
|
||||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
|
|
||||||
+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
|
|
||||||
+/* { dg-final { scan-assembler {\tpause} } } */
|
|
||||||
+/* { dg-final { scan-assembler {\tlfence} } } */
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-23.c b/gcc/testsuite/gcc.target/i386/ret-thunk-23.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..43f0ccaa854
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-23.c
|
|
||||||
@@ -0,0 +1,15 @@
|
|
||||||
+/* PR target/r84530 */
|
|
||||||
+/* { dg-do compile { target ia32 } } */
|
|
||||||
+/* { dg-options "-O2 -mfunction-return=thunk-extern" } */
|
|
||||||
+
|
|
||||||
+struct s { _Complex unsigned short x; };
|
|
||||||
+struct s gs = { 100 + 200i };
|
|
||||||
+struct s __attribute__((noinline)) foo (void) { return gs; }
|
|
||||||
+
|
|
||||||
+/* { dg-final { scan-assembler-times "popl\[\\t \]*%ecx" 1 } } */
|
|
||||||
+/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*4\\(%esp\\), %esp" } } */
|
|
||||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk_ecx" } } */
|
|
||||||
+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
|
|
||||||
+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
|
|
||||||
+/* { dg-final { scan-assembler-not {\tpause} } } */
|
|
||||||
+/* { dg-final { scan-assembler-not {\tlfence} } } */
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-24.c b/gcc/testsuite/gcc.target/i386/ret-thunk-24.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..8729e35147e
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-24.c
|
|
||||||
@@ -0,0 +1,15 @@
|
|
||||||
+/* PR target/r84530 */
|
|
||||||
+/* { dg-do compile { target ia32 } } */
|
|
||||||
+/* { dg-options "-O2 -mfunction-return=thunk-inline" } */
|
|
||||||
+
|
|
||||||
+struct s { _Complex unsigned short x; };
|
|
||||||
+struct s gs = { 100 + 200i };
|
|
||||||
+struct s __attribute__((noinline)) foo (void) { return gs; }
|
|
||||||
+
|
|
||||||
+/* { dg-final { scan-assembler-times "popl\[\\t \]*%ecx" 1 } } */
|
|
||||||
+/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*4\\(%esp\\), %esp" } } */
|
|
||||||
+/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk_ecx" } } */
|
|
||||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
|
|
||||||
+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
|
|
||||||
+/* { dg-final { scan-assembler {\tpause} } } */
|
|
||||||
+/* { dg-final { scan-assembler {\tlfence} } } */
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-25.c b/gcc/testsuite/gcc.target/i386/ret-thunk-25.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..f73553c9a9f
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-25.c
|
|
||||||
@@ -0,0 +1,15 @@
|
|
||||||
+/* PR target/r84530 */
|
|
||||||
+/* { dg-do compile { target ia32 } } */
|
|
||||||
+/* { dg-options "-O2 -mfunction-return=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
|
|
||||||
+
|
|
||||||
+struct s { _Complex unsigned short x; };
|
|
||||||
+struct s gs = { 100 + 200i };
|
|
||||||
+struct s __attribute__((noinline)) foo (void) { return gs; }
|
|
||||||
+
|
|
||||||
+/* { dg-final { scan-assembler-times "popl\[\\t \]*%ecx" 1 } } */
|
|
||||||
+/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*4\\(%esp\\), %esp" } } */
|
|
||||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk_bnd_ecx" } } */
|
|
||||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
|
|
||||||
+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
|
|
||||||
+/* { dg-final { scan-assembler {\tpause} } } */
|
|
||||||
+/* { dg-final { scan-assembler {\tlfence} } } */
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-26.c b/gcc/testsuite/gcc.target/i386/ret-thunk-26.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..9144e988735
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-26.c
|
|
||||||
@@ -0,0 +1,40 @@
|
|
||||||
+/* PR target/r84530 */
|
|
||||||
+/* { dg-do run } */
|
|
||||||
+/* { dg-options "-Os -mfunction-return=thunk" } */
|
|
||||||
+
|
|
||||||
+struct S { int i; };
|
|
||||||
+__attribute__((const, noinline, noclone))
|
|
||||||
+struct S foo (int x)
|
|
||||||
+{
|
|
||||||
+ struct S s;
|
|
||||||
+ s.i = x;
|
|
||||||
+ return s;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int a[2048], b[2048], c[2048], d[2048];
|
|
||||||
+struct S e[2048];
|
|
||||||
+
|
|
||||||
+__attribute__((noinline, noclone)) void
|
|
||||||
+bar (void)
|
|
||||||
+{
|
|
||||||
+ int i;
|
|
||||||
+ for (i = 0; i < 1024; i++)
|
|
||||||
+ {
|
|
||||||
+ e[i] = foo (i);
|
|
||||||
+ a[i+2] = a[i] + a[i+1];
|
|
||||||
+ b[10] = b[10] + i;
|
|
||||||
+ c[i] = c[2047 - i];
|
|
||||||
+ d[i] = d[i + 1];
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int
|
|
||||||
+main ()
|
|
||||||
+{
|
|
||||||
+ int i;
|
|
||||||
+ bar ();
|
|
||||||
+ for (i = 0; i < 1024; i++)
|
|
||||||
+ if (e[i].i != i)
|
|
||||||
+ __builtin_abort ();
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
--
|
|
||||||
2.16.3
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,225 +0,0 @@
|
||||||
From e7fbaebc8ff650df76f43e92cb9ca59d5174ebe7 Mon Sep 17 00:00:00 2001
|
|
||||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
||||||
Date: Thu, 15 Mar 2018 17:54:40 +0000
|
|
||||||
Subject: [PATCH 13/13] i386: Don't generate alias for function return thunk
|
|
||||||
|
|
||||||
Function return thunks shouldn't be aliased to indirect branch thunks
|
|
||||||
since indirect branch thunks are placed in COMDAT section and a COMDAT
|
|
||||||
section with indirect branch may not have function return thunk. This
|
|
||||||
patch generates function return thunks directly.
|
|
||||||
|
|
||||||
gcc/
|
|
||||||
|
|
||||||
Backport from mainline
|
|
||||||
PR target/84574
|
|
||||||
* config/i386/i386.c (indirect_thunk_needed): Update comments.
|
|
||||||
(indirect_thunk_bnd_needed): Likewise.
|
|
||||||
(indirect_thunks_used): Likewise.
|
|
||||||
(indirect_thunks_bnd_used): Likewise.
|
|
||||||
(indirect_return_needed): New.
|
|
||||||
(indirect_return_bnd_needed): Likewise.
|
|
||||||
(output_indirect_thunk_function): Add a bool argument for
|
|
||||||
function return.
|
|
||||||
(output_indirect_thunk_function): Don't generate alias for
|
|
||||||
function return thunk.
|
|
||||||
(ix86_code_end): Call output_indirect_thunk_function to generate
|
|
||||||
function return thunks.
|
|
||||||
(ix86_output_function_return): Set indirect_return_bnd_needed
|
|
||||||
and indirect_return_needed instead of indirect_thunk_bnd_needed
|
|
||||||
and indirect_thunk_needed.
|
|
||||||
|
|
||||||
gcc/testsuite/
|
|
||||||
|
|
||||||
Backport from mainline
|
|
||||||
PR target/84574
|
|
||||||
* gcc.target/i386/ret-thunk-9.c: Expect __x86_return_thunk
|
|
||||||
label instead of __x86_indirect_thunk label.
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 92 ++++++++++-------------------
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-9.c | 2 +-
|
|
||||||
2 files changed, 33 insertions(+), 61 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
|
||||||
index 21c3c18bd3c..f4cd1c6f4e9 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -11067,19 +11067,23 @@ ix86_setup_frame_addresses (void)
|
|
||||||
labels in call and return thunks. */
|
|
||||||
static int indirectlabelno;
|
|
||||||
|
|
||||||
-/* True if call and return thunk functions are needed. */
|
|
||||||
+/* True if call thunk function is needed. */
|
|
||||||
static bool indirect_thunk_needed = false;
|
|
||||||
-/* True if call and return thunk functions with the BND prefix are
|
|
||||||
- needed. */
|
|
||||||
+/* True if call thunk function with the BND prefix is needed. */
|
|
||||||
static bool indirect_thunk_bnd_needed = false;
|
|
||||||
|
|
||||||
/* Bit masks of integer registers, which contain branch target, used
|
|
||||||
- by call and return thunks functions. */
|
|
||||||
+ by call thunk 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. */
|
|
||||||
+ by call thunk functions with the BND prefix. */
|
|
||||||
static int indirect_thunks_bnd_used;
|
|
||||||
|
|
||||||
+/* True if return thunk function is needed. */
|
|
||||||
+static bool indirect_return_needed = false;
|
|
||||||
+/* True if return thunk function with the BND prefix is needed. */
|
|
||||||
+static bool indirect_return_bnd_needed = false;
|
|
||||||
+
|
|
||||||
/* True if return thunk function via CX is needed. */
|
|
||||||
static bool indirect_return_via_cx;
|
|
||||||
/* True if return thunk function via CX with the BND prefix is
|
|
||||||
@@ -11226,16 +11230,18 @@ output_indirect_thunk (bool need_bnd_p, unsigned int regno)
|
|
||||||
/* Output a funtion with a call and return thunk for indirect branch.
|
|
||||||
If BND_P is true, the BND prefix is needed. If REGNO != INVALID_REGNUM,
|
|
||||||
the function address is in REGNO. Otherwise, the function address is
|
|
||||||
- on the top of stack. */
|
|
||||||
+ on the top of stack. Thunk is used for function return if RET_P is
|
|
||||||
+ true. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
-output_indirect_thunk_function (bool need_bnd_p, unsigned int regno)
|
|
||||||
+output_indirect_thunk_function (bool need_bnd_p, unsigned int regno,
|
|
||||||
+ bool ret_p)
|
|
||||||
{
|
|
||||||
char name[32];
|
|
||||||
tree decl;
|
|
||||||
|
|
||||||
/* Create __x86_indirect_thunk/__x86_indirect_thunk_bnd. */
|
|
||||||
- indirect_thunk_name (name, regno, need_bnd_p, false);
|
|
||||||
+ indirect_thunk_name (name, regno, need_bnd_p, ret_p);
|
|
||||||
decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
|
|
||||||
get_identifier (name),
|
|
||||||
build_function_type_list (void_type_node, NULL_TREE));
|
|
||||||
@@ -11278,50 +11284,6 @@ output_indirect_thunk_function (bool need_bnd_p, unsigned int regno)
|
|
||||||
ASM_OUTPUT_LABEL (asm_out_file, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
- /* Create alias for __x86_return_thunk/__x86_return_thunk_bnd or
|
|
||||||
- __x86_return_thunk_ecx/__x86_return_thunk_ecx_bnd. */
|
|
||||||
- bool need_alias;
|
|
||||||
- if (regno == INVALID_REGNUM)
|
|
||||||
- need_alias = true;
|
|
||||||
- else if (regno == CX_REG)
|
|
||||||
- {
|
|
||||||
- if (need_bnd_p)
|
|
||||||
- need_alias = indirect_return_via_cx_bnd;
|
|
||||||
- else
|
|
||||||
- need_alias = indirect_return_via_cx;
|
|
||||||
- }
|
|
||||||
- else
|
|
||||||
- need_alias = false;
|
|
||||||
-
|
|
||||||
- if (need_alias)
|
|
||||||
- {
|
|
||||||
- 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);
|
|
||||||
@@ -11368,19 +11330,29 @@ ix86_code_end (void)
|
|
||||||
rtx xops[2];
|
|
||||||
unsigned int regno;
|
|
||||||
|
|
||||||
+ if (indirect_return_needed)
|
|
||||||
+ output_indirect_thunk_function (false, INVALID_REGNUM, true);
|
|
||||||
+ if (indirect_return_bnd_needed)
|
|
||||||
+ output_indirect_thunk_function (true, INVALID_REGNUM, true);
|
|
||||||
+
|
|
||||||
+ if (indirect_return_via_cx)
|
|
||||||
+ output_indirect_thunk_function (false, CX_REG, true);
|
|
||||||
+ if (indirect_return_via_cx_bnd)
|
|
||||||
+ output_indirect_thunk_function (true, CX_REG, true);
|
|
||||||
+
|
|
||||||
if (indirect_thunk_needed)
|
|
||||||
- output_indirect_thunk_function (false, INVALID_REGNUM);
|
|
||||||
+ output_indirect_thunk_function (false, INVALID_REGNUM, false);
|
|
||||||
if (indirect_thunk_bnd_needed)
|
|
||||||
- output_indirect_thunk_function (true, INVALID_REGNUM);
|
|
||||||
+ output_indirect_thunk_function (true, INVALID_REGNUM, false);
|
|
||||||
|
|
||||||
for (regno = FIRST_REX_INT_REG; regno <= LAST_REX_INT_REG; regno++)
|
|
||||||
{
|
|
||||||
unsigned int i = regno - FIRST_REX_INT_REG + LAST_INT_REG + 1;
|
|
||||||
if ((indirect_thunks_used & (1 << i)))
|
|
||||||
- output_indirect_thunk_function (false, regno);
|
|
||||||
+ output_indirect_thunk_function (false, regno, false);
|
|
||||||
|
|
||||||
if ((indirect_thunks_bnd_used & (1 << i)))
|
|
||||||
- output_indirect_thunk_function (true, regno);
|
|
||||||
+ output_indirect_thunk_function (true, regno, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (regno = AX_REG; regno <= SP_REG; regno++)
|
|
||||||
@@ -11389,10 +11361,10 @@ ix86_code_end (void)
|
|
||||||
tree decl;
|
|
||||||
|
|
||||||
if ((indirect_thunks_used & (1 << regno)))
|
|
||||||
- output_indirect_thunk_function (false, regno);
|
|
||||||
+ output_indirect_thunk_function (false, regno, false);
|
|
||||||
|
|
||||||
if ((indirect_thunks_bnd_used & (1 << regno)))
|
|
||||||
- output_indirect_thunk_function (true, regno);
|
|
||||||
+ output_indirect_thunk_function (true, regno, false);
|
|
||||||
|
|
||||||
if (!(pic_labels_used & (1 << regno)))
|
|
||||||
continue;
|
|
||||||
@@ -28077,12 +28049,12 @@ ix86_output_function_return (bool long_p)
|
|
||||||
true);
|
|
||||||
if (need_bnd_p)
|
|
||||||
{
|
|
||||||
- indirect_thunk_bnd_needed |= need_thunk;
|
|
||||||
+ indirect_return_bnd_needed |= need_thunk;
|
|
||||||
fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
- indirect_thunk_needed |= need_thunk;
|
|
||||||
+ indirect_return_needed |= need_thunk;
|
|
||||||
fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
|
||||||
index d2df8b874e0..eee230ca2f6 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
|
||||||
@@ -13,7 +13,7 @@ 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 "__x86_indirect_thunk:" } } */
|
|
||||||
+/* { dg-final { scan-assembler "__x86_return_thunk:" } } */
|
|
||||||
/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?bar" { target *-*-linux* } } } */
|
|
||||||
/* { dg-final { scan-assembler-times {\tpause} 2 } } */
|
|
||||||
/* { dg-final { scan-assembler-times {\tlfence} 2 } } */
|
|
||||||
--
|
|
||||||
2.16.3
|
|
||||||
|
|
|
@ -1,215 +0,0 @@
|
||||||
# DP: Turn on -fstack-protector by default for C, C++, ObjC, ObjC++.
|
|
||||||
# DP: Build libgcc using -fno-stack-protector.
|
|
||||||
|
|
||||||
---
|
|
||||||
gcc/Makefile.in | 2 ++
|
|
||||||
gcc/cp/lang-specs.h | 6 +++---
|
|
||||||
gcc/doc/invoke.texi | 4 ++++
|
|
||||||
gcc/gcc.c | 18 ++++++++++++++----
|
|
||||||
gcc/objc/lang-specs.h | 10 +++++-----
|
|
||||||
gcc/objcp/lang-specs.h | 8 ++++----
|
|
||||||
6 files changed, 32 insertions(+), 16 deletions(-)
|
|
||||||
|
|
||||||
Index: b/gcc/gcc.c
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/gcc.c
|
|
||||||
+++ b/gcc/gcc.c
|
|
||||||
@@ -858,6 +858,14 @@ proper position among the other output f
|
|
||||||
#define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+#ifndef SSP_DEFAULT_SPEC
|
|
||||||
+#ifdef TARGET_LIBC_PROVIDES_SSP
|
|
||||||
+#define SSP_DEFAULT_SPEC "%{!fno-stack-protector:%{!fstack-protector-all:%{!ffreestanding:%{!nostdlib:%{!fstack-protector:-fstack-protector-strong}}}}}"
|
|
||||||
+#else
|
|
||||||
+#define SSP_DEFAULT_SPEC ""
|
|
||||||
+#endif
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
#ifndef LINK_SSP_SPEC
|
|
||||||
#ifdef TARGET_LIBC_PROVIDES_SSP
|
|
||||||
#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
|
|
||||||
@@ -1057,6 +1065,7 @@ static const char *cc1_spec = CC1_SPEC;
|
|
||||||
static const char *cc1plus_spec = CC1PLUS_SPEC;
|
|
||||||
static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
|
|
||||||
static const char *link_ssp_spec = LINK_SSP_SPEC;
|
|
||||||
+static const char *ssp_default_spec = SSP_DEFAULT_SPEC;
|
|
||||||
static const char *asm_spec = ASM_SPEC;
|
|
||||||
static const char *asm_final_spec = ASM_FINAL_SPEC;
|
|
||||||
static const char *link_spec = LINK_SPEC;
|
|
||||||
@@ -1112,7 +1121,7 @@ static const char *cpp_unique_options =
|
|
||||||
static const char *cpp_options =
|
|
||||||
"%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
|
|
||||||
%{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*}\
|
|
||||||
- %{undef} %{save-temps*:-fpch-preprocess}";
|
|
||||||
+ %{undef} %{save-temps*:-fpch-preprocess} %(ssp_default)";
|
|
||||||
|
|
||||||
/* This contains cpp options which are not passed when the preprocessor
|
|
||||||
output will be used by another program. */
|
|
||||||
@@ -1301,9 +1310,9 @@ static const struct compiler default_com
|
|
||||||
%{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
|
|
||||||
%(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
|
|
||||||
cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
|
|
||||||
- %(cc1_options)}\
|
|
||||||
+ %(cc1_options) %(ssp_default)}\
|
|
||||||
%{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
|
|
||||||
- cc1 %(cpp_unique_options) %(cc1_options)}}}\
|
|
||||||
+ cc1 %(cpp_unique_options) %(cc1_options) %(ssp_default)}}}\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
|
|
||||||
{"-",
|
|
||||||
"%{!E:%e-E or -x required when input is from standard input}\
|
|
||||||
@@ -1328,7 +1337,7 @@ static const struct compiler default_com
|
|
||||||
%W{o*:--output-pch=%*}}%V}}}}}}}", 0, 0, 0},
|
|
||||||
{".i", "@cpp-output", 0, 0, 0},
|
|
||||||
{"@cpp-output",
|
|
||||||
- "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
|
||||||
+ "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %(ssp_default) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
|
||||||
{".s", "@assembler", 0, 0, 0},
|
|
||||||
{"@assembler",
|
|
||||||
"%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
|
|
||||||
@@ -1560,6 +1569,7 @@ static struct spec_list static_specs[] =
|
|
||||||
INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
|
|
||||||
INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
|
|
||||||
INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
|
|
||||||
+ INIT_STATIC_SPEC ("ssp_default", &ssp_default_spec),
|
|
||||||
INIT_STATIC_SPEC ("endfile", &endfile_spec),
|
|
||||||
INIT_STATIC_SPEC ("link", &link_spec),
|
|
||||||
INIT_STATIC_SPEC ("lib", &lib_spec),
|
|
||||||
Index: b/gcc/cp/lang-specs.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/cp/lang-specs.h
|
|
||||||
+++ b/gcc/cp/lang-specs.h
|
|
||||||
@@ -46,7 +46,7 @@ along with GCC; see the file COPYING3.
|
|
||||||
%(cpp_options) %2 -o %{save-temps*:%b.ii} %{!save-temps*:%g.ii} \n}\
|
|
||||||
cc1plus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.ii} %{!save-temps*:%g.ii}}\
|
|
||||||
%{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
|
|
||||||
- %(cc1_options) %2\
|
|
||||||
+ %(cc1_options) %(ssp_default) %2\
|
|
||||||
%{!fsyntax-only:-o %g.s \
|
|
||||||
%{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
|
|
||||||
%W{o*:--output-pch=%*}}%V}}}}",
|
|
||||||
@@ -58,11 +58,11 @@ along with GCC; see the file COPYING3.
|
|
||||||
%(cpp_options) %2 -o %{save-temps*:%b.ii} %{!save-temps*:%g.ii} \n}\
|
|
||||||
cc1plus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.ii} %{!save-temps*:%g.ii}}\
|
|
||||||
%{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
|
|
||||||
- %(cc1_options) %2\
|
|
||||||
+ %(cc1_options) %(ssp_default) %2\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}",
|
|
||||||
CPLUSPLUS_CPP_SPEC, 0, 0},
|
|
||||||
{".ii", "@c++-cpp-output", 0, 0, 0},
|
|
||||||
{"@c++-cpp-output",
|
|
||||||
"%{!M:%{!MM:%{!E:\
|
|
||||||
- cc1plus -fpreprocessed %i %(cc1_options) %2\
|
|
||||||
+ cc1plus -fpreprocessed %i %(cc1_options) %(ssp_default) %2\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
|
||||||
Index: b/gcc/params.def
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/params.def
|
|
||||||
+++ b/gcc/params.def
|
|
||||||
@@ -673,7 +673,7 @@ DEFPARAM (PARAM_INTEGER_SHARE_LIMIT,
|
|
||||||
DEFPARAM (PARAM_SSP_BUFFER_SIZE,
|
|
||||||
"ssp-buffer-size",
|
|
||||||
"The lower bound for a buffer to be considered for stack smashing protection.",
|
|
||||||
- 8, 1, 0)
|
|
||||||
+ 4, 1, 0)
|
|
||||||
|
|
||||||
DEFPARAM (PARAM_MIN_SIZE_FOR_STACK_SHARING,
|
|
||||||
"min-size-for-stack-sharing",
|
|
||||||
Index: b/gcc/objc/lang-specs.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/objc/lang-specs.h
|
|
||||||
+++ b/gcc/objc/lang-specs.h
|
|
||||||
@@ -29,9 +29,9 @@ along with GCC; see the file COPYING3.
|
|
||||||
%{traditional|traditional-cpp:\
|
|
||||||
%eGNU Objective C no longer supports traditional compilation}\
|
|
||||||
%{save-temps*|no-integrated-cpp:cc1obj -E %(cpp_options) -o %{save-temps*:%b.mi} %{!save-temps*:%g.mi} \n\
|
|
||||||
- cc1obj -fpreprocessed %{save-temps*:%b.mi} %{!save-temps*:%g.mi} %(cc1_options) %{print-objc-runtime-info} %{gen-decls}}\
|
|
||||||
+ cc1obj -fpreprocessed %{save-temps*:%b.mi} %{!save-temps*:%g.mi} %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}}\
|
|
||||||
%{!save-temps*:%{!no-integrated-cpp:\
|
|
||||||
- cc1obj %(cpp_unique_options) %(cc1_options) %{print-objc-runtime-info} %{gen-decls}}}\
|
|
||||||
+ cc1obj %(cpp_unique_options) %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}}}\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
|
||||||
{"@objective-c-header",
|
|
||||||
"%{E|M|MM:cc1obj -E %{traditional|traditional-cpp:-traditional-cpp}\
|
|
||||||
@@ -40,18 +40,18 @@ along with GCC; see the file COPYING3.
|
|
||||||
%{traditional|traditional-cpp:\
|
|
||||||
%eGNU Objective C no longer supports traditional compilation}\
|
|
||||||
%{save-temps*|no-integrated-cpp:cc1obj -E %(cpp_options) -o %{save-temps*:%b.mi} %{!save-temps*:%g.mi} \n\
|
|
||||||
- cc1obj -fpreprocessed %b.mi %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
|
|
||||||
+ cc1obj -fpreprocessed %b.mi %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}\
|
|
||||||
-o %g.s %{!o*:--output-pch=%i.gch}\
|
|
||||||
%W{o*:--output-pch=%*}%V}\
|
|
||||||
%{!save-temps*:%{!no-integrated-cpp:\
|
|
||||||
- cc1obj %(cpp_unique_options) %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
|
|
||||||
+ cc1obj %(cpp_unique_options) %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}\
|
|
||||||
-o %g.s %{!o*:--output-pch=%i.gch}\
|
|
||||||
%W{o*:--output-pch=%*}%V}}}}}", 0, 0, 0},
|
|
||||||
{".mi", "@objective-c-cpp-output", 0, 0, 0},
|
|
||||||
{"@objective-c-cpp-output",
|
|
||||||
- "%{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
|
|
||||||
+ "%{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
|
||||||
{"@objc-cpp-output",
|
|
||||||
"%nobjc-cpp-output is deprecated; please use objective-c-cpp-output instead\n\
|
|
||||||
- %{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
|
|
||||||
+ %{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
|
||||||
Index: b/gcc/objcp/lang-specs.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/objcp/lang-specs.h
|
|
||||||
+++ b/gcc/objcp/lang-specs.h
|
|
||||||
@@ -36,7 +36,7 @@ along with GCC; see the file COPYING3.
|
|
||||||
%(cpp_options) %2 -o %{save-temps*:%b.mii} %{!save-temps*:%g.mii} \n}\
|
|
||||||
cc1objplus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.mii} %{!save-temps*:%g.mii}}\
|
|
||||||
%{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
|
|
||||||
- %(cc1_options) %2\
|
|
||||||
+ %(cc1_options) %(ssp_default) %2\
|
|
||||||
-o %g.s %{!o*:--output-pch=%i.gch} %W{o*:--output-pch=%*}%V}}}",
|
|
||||||
CPLUSPLUS_CPP_SPEC, 0, 0},
|
|
||||||
{"@objective-c++",
|
|
||||||
@@ -46,16 +46,16 @@ along with GCC; see the file COPYING3.
|
|
||||||
%(cpp_options) %2 -o %{save-temps*:%b.mii} %{!save-temps*:%g.mii} \n}\
|
|
||||||
cc1objplus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.mii} %{!save-temps*:%g.mii}}\
|
|
||||||
%{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
|
|
||||||
- %(cc1_options) %2\
|
|
||||||
+ %(cc1_options) %(ssp_default) %2\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}",
|
|
||||||
CPLUSPLUS_CPP_SPEC, 0, 0},
|
|
||||||
{".mii", "@objective-c++-cpp-output", 0, 0, 0},
|
|
||||||
{"@objective-c++-cpp-output",
|
|
||||||
"%{!M:%{!MM:%{!E:\
|
|
||||||
- cc1objplus -fpreprocessed %i %(cc1_options) %2\
|
|
||||||
+ cc1objplus -fpreprocessed %i %(cc1_options) %(ssp_default) %2\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
|
||||||
{"@objc++-cpp-output",
|
|
||||||
"%nobjc++-cpp-output is deprecated; please use objective-c++-cpp-output instead\n\
|
|
||||||
%{!M:%{!MM:%{!E:\
|
|
||||||
- cc1objplus -fpreprocessed %i %(cc1_options) %2\
|
|
||||||
+ cc1objplus -fpreprocessed %i %(cc1_options) %(ssp_default) %2\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
|
||||||
Index: b/gcc/doc/invoke.texi
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/doc/invoke.texi
|
|
||||||
+++ b/gcc/doc/invoke.texi
|
|
||||||
@@ -9247,6 +9247,9 @@
|
|
||||||
The minimum size of variables taking part in stack slot sharing when not
|
|
||||||
optimizing. The default value is 32.
|
|
||||||
|
|
||||||
+The Alpine Linux default is "4", to increase
|
|
||||||
+the number of functions protected by the stack protector.
|
|
||||||
+
|
|
||||||
@item max-jump-thread-duplication-stmts
|
|
||||||
Maximum number of statements allowed in a block that needs to be
|
|
||||||
duplicated when threading jumps.
|
|
||||||
@@ -10185,6 +10188,11 @@
|
|
||||||
Like @option{-fstack-protector} but includes additional functions to
|
|
||||||
be protected --- those that have local array definitions, or have
|
|
||||||
references to local frame addresses.
|
|
||||||
+
|
|
||||||
+NOTE: In Alpine Linux,
|
|
||||||
+@option{-fstack-protector-strong} is enabled by default for C,
|
|
||||||
+C++, ObjC, ObjC++, if none of @option{-fno-stack-protector},
|
|
||||||
+@option{-nostdlib}, nor @option{-ffreestanding} are found.
|
|
||||||
|
|
||||||
@item -fstack-protector-explicit
|
|
||||||
@opindex fstack-protector-explicit
|
|
|
@ -1,33 +0,0 @@
|
||||||
# Turn on -Wl,-z,relro,-z,now by default.
|
|
||||||
|
|
||||||
---
|
|
||||||
gcc/doc/invoke.texi | 3 +++
|
|
||||||
gcc/gcc.c | 1 +
|
|
||||||
2 files changed, 4 insertions(+), 0 deletions(-)
|
|
||||||
|
|
||||||
Index: b/gcc/doc/invoke.texi
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/doc/invoke.texi
|
|
||||||
+++ b/gcc/doc/invoke.texi
|
|
||||||
@@ -11424,6 +11424,9 @@ For example, @option{-Wl,-Map,output.map
|
|
||||||
linker. When using the GNU linker, you can also get the same effect with
|
|
||||||
@option{-Wl,-Map=output.map}.
|
|
||||||
|
|
||||||
+NOTE: In Alpine Linux, for LDFLAGS, the option
|
|
||||||
+@option{-Wl,-z,relro,now} is used. To disable, use @option{-Wl,-z,norelro}.
|
|
||||||
+
|
|
||||||
@item -u @var{symbol}
|
|
||||||
@opindex u
|
|
||||||
Pretend the symbol @var{symbol} is undefined, to force linking of
|
|
||||||
Index: b/gcc/gcc.c
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/gcc.c
|
|
||||||
+++ b/gcc/gcc.c
|
|
||||||
@@ -890,6 +890,7 @@ proper position among the other output f
|
|
||||||
"%{flto|flto=*:%<fcompare-debug*} \
|
|
||||||
%{flto} %{fno-lto} %{flto=*} %l " LINK_PIE_SPEC \
|
|
||||||
"%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
|
|
||||||
+ "-z relro -z now " \
|
|
||||||
"%X %{o*} %{e*} %{N} %{n} %{r}\
|
|
||||||
%{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}} " VTABLE_VERIFICATION_SPEC " \
|
|
||||||
%{static:} %{L*} %(mfwrap) %(link_libgcc) " SANITIZER_EARLY_SPEC " %o\
|
|
|
@ -1,40 +0,0 @@
|
||||||
# DP: Turn on -D_FORTIFY_SOURCE=2 by default for C, C++, ObjC, ObjC++,
|
|
||||||
# DP: if the optimization level is > 0
|
|
||||||
|
|
||||||
---
|
|
||||||
gcc/doc/invoke.texi | 6 ++++++
|
|
||||||
gcc/c-family/c-cppbuiltin.c | 3 +
|
|
||||||
2 files changed, 9 insertions(+), 0 deletions(-)
|
|
||||||
|
|
||||||
Index: b/gcc/doc/invoke.texi
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/doc/invoke.texi
|
|
||||||
+++ b/gcc/doc/invoke.texi
|
|
||||||
@@ -7840,6 +7840,12 @@ also turns on the following optimization
|
|
||||||
Please note the warning under @option{-fgcse} about
|
|
||||||
invoking @option{-O2} on programs that use computed gotos.
|
|
||||||
|
|
||||||
+NOTE: In Alpine Linux, @option{-D_FORTIFY_SOURCE=2} is
|
|
||||||
+set by default, and is activated when @option{-O} is set to 2 or higher.
|
|
||||||
+This enables additional compile-time and run-time checks for several libc
|
|
||||||
+functions. To disable, specify either @option{-U_FORTIFY_SOURCE} or
|
|
||||||
+@option{-D_FORTIFY_SOURCE=0}.
|
|
||||||
+
|
|
||||||
@item -O3
|
|
||||||
@opindex O3
|
|
||||||
Optimize yet more. @option{-O3} turns on all optimizations specified
|
|
||||||
Index: b/gcc/c-family/c-cppbuiltin.c
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/c-family/c-cppbuiltin.c
|
|
||||||
+++ b/gcc/c-family/c-cppbuiltin.c
|
|
||||||
@@ -1176,6 +1176,10 @@ c_cpp_builtins (cpp_reader *pfile)
|
|
||||||
builtin_define_with_value ("__REGISTER_PREFIX__", REGISTER_PREFIX, 0);
|
|
||||||
builtin_define_with_value ("__USER_LABEL_PREFIX__", user_label_prefix, 0);
|
|
||||||
|
|
||||||
+ /* Fortify Source enabled by default for optimization levels > 0 */
|
|
||||||
+ if (optimize)
|
|
||||||
+ builtin_define_with_int_value ("_FORTIFY_SOURCE", 2);
|
|
||||||
+
|
|
||||||
/* Misc. */
|
|
||||||
if (flag_gnu89_inline)
|
|
||||||
cpp_define (pfile, "__GNUC_GNU_INLINE__");
|
|
|
@ -1,241 +0,0 @@
|
||||||
# DP: On linux targets pass --as-needed by default to the linker, but always
|
|
||||||
# DP: link the sanitizer libraries with --no-as-needed.
|
|
||||||
|
|
||||||
--- a/gcc/gcc.c
|
|
||||||
+++ b/gcc/gcc.c
|
|
||||||
@@ -568,8 +568,11 @@ proper position among the other output f
|
|
||||||
#ifdef LIBTSAN_EARLY_SPEC
|
|
||||||
#define LIBTSAN_SPEC STATIC_LIBTSAN_LIBS
|
|
||||||
#elif defined(HAVE_LD_STATIC_DYNAMIC)
|
|
||||||
-#define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \
|
|
||||||
- "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
|
|
||||||
+#define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION "}" \
|
|
||||||
+ " %{!static-libtsan:%{!fuse-ld=gold:--push-state }--no-as-needed}" \
|
|
||||||
+ " -ltsan " \
|
|
||||||
+ " %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
|
|
||||||
+ " %{!static-libtsan:%{fuse-ld=gold:--as-needed;:--pop-state}}" \
|
|
||||||
STATIC_LIBTSAN_LIBS
|
|
||||||
#else
|
|
||||||
#define LIBTSAN_SPEC "-ltsan" STATIC_LIBTSAN_LIBS
|
|
||||||
--- a/gcc/config/gnu-user.h
|
|
||||||
+++ b/gcc/config/gnu-user.h
|
|
||||||
@@ -124,13 +124,13 @@
|
|
||||||
#define LIBASAN_EARLY_SPEC "%{!shared:libasan_preinit%O%s} " \
|
|
||||||
"%{static-libasan:%{!shared:" \
|
|
||||||
LD_STATIC_OPTION " --whole-archive -lasan --no-whole-archive " \
|
|
||||||
- LD_DYNAMIC_OPTION "}}%{!static-libasan:-lasan}"
|
|
||||||
+ LD_DYNAMIC_OPTION "}}%{!static-libasan:%{!fuse-ld=gold:--push-state} --no-as-needed -lasan %{fuse-ld=gold:--as-needed;:--pop-state}}"
|
|
||||||
#undef LIBTSAN_EARLY_SPEC
|
|
||||||
#define LIBTSAN_EARLY_SPEC "%{static-libtsan:%{!shared:" \
|
|
||||||
LD_STATIC_OPTION " --whole-archive -ltsan --no-whole-archive " \
|
|
||||||
- LD_DYNAMIC_OPTION "}}%{!static-libtsan:-ltsan}"
|
|
||||||
+ LD_DYNAMIC_OPTION "}}%{!static-libtsan:%{!fuse-ld=gold:--push-state} --no-as-needed -ltsan %{fuse-ld=gold:--as-needed;:--pop-state}}"
|
|
||||||
#undef LIBLSAN_EARLY_SPEC
|
|
||||||
#define LIBLSAN_EARLY_SPEC "%{static-liblsan:%{!shared:" \
|
|
||||||
LD_STATIC_OPTION " --whole-archive -llsan --no-whole-archive " \
|
|
||||||
- LD_DYNAMIC_OPTION "}}%{!static-liblsan:-llsan}"
|
|
||||||
+ LD_DYNAMIC_OPTION "}}%{!static-liblsan:%{!fuse-ld=gold:--push-state} --no-as-needed -llsan %{fuse-ld=gold:--as-needed;:--pop-state}}"
|
|
||||||
#endif
|
|
||||||
Index: b/gcc/config/aarch64/aarch64-linux.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/aarch64/aarch64-linux.h
|
|
||||||
+++ b/gcc/config/aarch64/aarch64-linux.h
|
|
||||||
@@ -36,5 +36,6 @@
|
|
||||||
|
|
||||||
#define LINUX_TARGET_LINK_SPEC "%{h*} \
|
|
||||||
+ --as-needed \
|
|
||||||
%{static:-Bstatic} \
|
|
||||||
%{shared:-shared} \
|
|
||||||
%{symbolic:-Bsymbolic} \
|
|
||||||
Index: b/gcc/config/ia64/linux.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/ia64/linux.h
|
|
||||||
+++ b/gcc/config/ia64/linux.h
|
|
||||||
@@ -58,7 +58,7 @@ do { \
|
|
||||||
#define GLIBC_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2"
|
|
||||||
|
|
||||||
#undef LINK_SPEC
|
|
||||||
-#define LINK_SPEC "\
|
|
||||||
+#define LINK_SPEC " --as-needed \
|
|
||||||
%{shared:-shared} \
|
|
||||||
%{!shared: \
|
|
||||||
%{!static: \
|
|
||||||
Index: b/gcc/config/sparc/linux.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/sparc/linux.h
|
|
||||||
+++ b/gcc/config/sparc/linux.h
|
|
||||||
@@ -86,7 +86,7 @@ extern const char *host_detect_local_cpu
|
|
||||||
#define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2"
|
|
||||||
|
|
||||||
#undef LINK_SPEC
|
|
||||||
-#define LINK_SPEC "-m elf32_sparc %{shared:-shared} \
|
|
||||||
+#define LINK_SPEC "-m elf32_sparc --as-needed %{shared:-shared} \
|
|
||||||
%{!mno-relax:%{!r:-relax}} \
|
|
||||||
%{!shared: \
|
|
||||||
%{!static: \
|
|
||||||
Index: b/gcc/config/s390/linux.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/s390/linux.h
|
|
||||||
+++ b/gcc/config/s390/linux.h
|
|
||||||
@@ -65,7 +65,7 @@ along with GCC; see the file COPYING3.
|
|
||||||
|
|
||||||
#undef LINK_SPEC
|
|
||||||
#define LINK_SPEC \
|
|
||||||
- "%{m31:-m elf_s390}%{m64:-m elf64_s390} \
|
|
||||||
+ "%{m31:-m elf_s390}%{m64:-m elf64_s390} --as-needed \
|
|
||||||
%{shared:-shared} \
|
|
||||||
%{!shared: \
|
|
||||||
%{static:-static} \
|
|
||||||
Index: b/gcc/config/rs6000/linux64.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/rs6000/linux64.h
|
|
||||||
+++ b/gcc/config/rs6000/linux64.h
|
|
||||||
@@ -466,12 +466,12 @@ extern int dot_symbols;
|
|
||||||
" -m elf64ppc")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-#define LINK_OS_LINUX_SPEC32 LINK_OS_LINUX_EMUL32 " %{!shared: %{!static: \
|
|
||||||
+#define LINK_OS_LINUX_SPEC32 LINK_OS_LINUX_EMUL32 " --as-needed %{!shared: %{!static: \
|
|
||||||
%{rdynamic:-export-dynamic} \
|
|
||||||
-dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "}} \
|
|
||||||
%(link_os_extra_spec32)"
|
|
||||||
|
|
||||||
-#define LINK_OS_LINUX_SPEC64 LINK_OS_LINUX_EMUL64 " %{!shared: %{!static: \
|
|
||||||
+#define LINK_OS_LINUX_SPEC64 LINK_OS_LINUX_EMUL64 " --as-needed %{!shared: %{!static: \
|
|
||||||
%{rdynamic:-export-dynamic} \
|
|
||||||
-dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "}} \
|
|
||||||
%(link_os_extra_spec64)"
|
|
||||||
Index: b/gcc/config/rs6000/sysv4.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/rs6000/sysv4.h
|
|
||||||
+++ b/gcc/config/rs6000/sysv4.h
|
|
||||||
@@ -784,7 +784,7 @@ ENDIAN_SELECT(" -mbig", " -mlittle", DEF
|
|
||||||
CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER, \
|
|
||||||
MUSL_DYNAMIC_LINKER)
|
|
||||||
|
|
||||||
-#define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \
|
|
||||||
+#define LINK_OS_LINUX_SPEC "-m elf32ppclinux --as-needed %{!shared: %{!static: \
|
|
||||||
%{rdynamic:-export-dynamic} \
|
|
||||||
-dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}"
|
|
||||||
|
|
||||||
Index: b/gcc/config/i386/gnu-user64.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/i386/gnu-user64.h
|
|
||||||
+++ b/gcc/config/i386/gnu-user64.h
|
|
||||||
@@ -57,5 +57,6 @@ see the files COPYING3 and COPYING.RUNTI
|
|
||||||
%{" SPEC_32 ":-m " GNU_USER_LINK_EMULATION32 "} \
|
|
||||||
%{" SPEC_X32 ":-m " GNU_USER_LINK_EMULATIONX32 "} \
|
|
||||||
+ --as-needed \
|
|
||||||
%{shared:-shared} \
|
|
||||||
%{!shared: \
|
|
||||||
%{!static: \
|
|
||||||
Index: b/gcc/config/i386/gnu-user.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/i386/gnu-user.h
|
|
||||||
+++ b/gcc/config/i386/gnu-user.h
|
|
||||||
@@ -74,7 +74,7 @@ along with GCC; see the file COPYING3.
|
|
||||||
{ "link_emulation", GNU_USER_LINK_EMULATION },\
|
|
||||||
{ "dynamic_linker", GNU_USER_DYNAMIC_LINKER }
|
|
||||||
|
|
||||||
-#define GNU_USER_TARGET_LINK_SPEC "-m %(link_emulation) %{shared:-shared} \
|
|
||||||
+#define GNU_USER_TARGET_LINK_SPEC "-m %(link_emulation) --as-needed %{shared:-shared} \
|
|
||||||
%{!shared: \
|
|
||||||
%{!static: \
|
|
||||||
%{rdynamic:-export-dynamic} \
|
|
||||||
Index: b/gcc/config/alpha/linux-elf.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/alpha/linux-elf.h
|
|
||||||
+++ b/gcc/config/alpha/linux-elf.h
|
|
||||||
@@ -37,7 +37,7 @@ along with GCC; see the file COPYING3.
|
|
||||||
|
|
||||||
#define ELF_DYNAMIC_LINKER GNU_USER_DYNAMIC_LINKER
|
|
||||||
|
|
||||||
-#define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax} \
|
|
||||||
+#define LINK_SPEC "-m elf64alpha --as-needed %{G*} %{relax:-relax} \
|
|
||||||
%{O*:-O3} %{!O*:-O1} \
|
|
||||||
%{shared:-shared} \
|
|
||||||
%{!shared: \
|
|
||||||
Index: b/gcc/config/arm/linux-elf.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/arm/linux-elf.h
|
|
||||||
+++ b/gcc/config/arm/linux-elf.h
|
|
||||||
@@ -73,5 +73,6 @@
|
|
||||||
%{!shared:-dynamic-linker " GNU_USER_DYNAMIC_LINKER "}} \
|
|
||||||
-X \
|
|
||||||
+ --as-needed \
|
|
||||||
%{mbig-endian:-EB} %{mlittle-endian:-EL}" \
|
|
||||||
SUBTARGET_EXTRA_LINK_SPEC
|
|
||||||
|
|
||||||
Index: b/gcc/config/mips/gnu-user.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/mips/gnu-user.h
|
|
||||||
+++ b/gcc/config/mips/gnu-user.h
|
|
||||||
@@ -55,6 +55,7 @@ along with GCC; see the file COPYING3.
|
|
||||||
#undef GNU_USER_TARGET_LINK_SPEC
|
|
||||||
#define GNU_USER_TARGET_LINK_SPEC "\
|
|
||||||
%{G*} %{EB} %{EL} %{mips*} %{shared} \
|
|
||||||
+ -as-needed \
|
|
||||||
%{!shared: \
|
|
||||||
%{!static: \
|
|
||||||
%{rdynamic:-export-dynamic} \
|
|
||||||
Index: b/libjava/Makefile.am
|
|
||||||
===================================================================
|
|
||||||
--- a/libjava/Makefile.am
|
|
||||||
+++ b/libjava/Makefile.am
|
|
||||||
@@ -627,14 +631,14 @@
|
|
||||||
rm .libs/libgcj_bc.so; \
|
|
||||||
mv .libs/libgcj_bc.so.1.0.0 .libs/libgcj_bc.so; \
|
|
||||||
$(libgcj_bc_dummy_LINK) -xc /dev/null -Wl,-soname,libgcj_bc.so.1 \
|
|
||||||
- -o .libs/libgcj_bc.so.1.0.0 -lgcj || exit; \
|
|
||||||
+ -o .libs/libgcj_bc.so.1.0.0 -Wl,--no-as-needed -lgcj || exit; \
|
|
||||||
rm .libs/libgcj_bc.so.1; \
|
|
||||||
$(LN_S) libgcj_bc.so.1.0.0 .libs/libgcj_bc.so.1
|
|
||||||
|
|
||||||
## This rule creates the libgcj_bc library that is actually installed.
|
|
||||||
install/libgcj_bc.la: $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_DEPENDENCIES) install/$(am__dirstamp)
|
|
||||||
$(libgcj_bc_la_LINK) $(am_libgcj_bc_la_rpath) $(libgcj_bc_la_LDFLAGS) \
|
|
||||||
- $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_LIBADD) $(LIBS)
|
|
||||||
+ $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_LIBADD) $(LIBS) -Wl,--no-as-needed -lgcj
|
|
||||||
|
|
||||||
## Note that property_files is defined in sources.am.
|
|
||||||
propertyo_files = $(patsubst classpath/resource/%,%,$(addsuffix .lo,$(property_files)))
|
|
||||||
@@ -762,7 +766,7 @@
|
|
||||||
rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \
|
|
||||||
mv $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \
|
|
||||||
$(libgcj_bc_dummy_LINK) -xc /dev/null -Wl,-soname,libgcj_bc.so.1 \
|
|
||||||
- -o $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 -lgcj || exit; \
|
|
||||||
+ -o $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 -Wl,--no-as-needed -lgcj || exit; \
|
|
||||||
rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1; \
|
|
||||||
$(LN_S) libgcj_bc.so.1.0.0 $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1; \
|
|
||||||
rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.la;
|
|
||||||
|
|
||||||
Index: b/libjava/Makefile.in
|
|
||||||
===================================================================
|
|
||||||
--- a/libjava/Makefile.in
|
|
||||||
+++ b/libjava/Makefile.in
|
|
||||||
@@ -10644,13 +10648,13 @@
|
|
||||||
rm .libs/libgcj_bc.so; \
|
|
||||||
mv .libs/libgcj_bc.so.1.0.0 .libs/libgcj_bc.so; \
|
|
||||||
$(libgcj_bc_dummy_LINK) -xc /dev/null -Wl,-soname,libgcj_bc.so.1 \
|
|
||||||
- -o .libs/libgcj_bc.so.1.0.0 -lgcj || exit; \
|
|
||||||
+ -o .libs/libgcj_bc.so.1.0.0 -Wl,--no-as-needed -lgcj || exit; \
|
|
||||||
rm .libs/libgcj_bc.so.1; \
|
|
||||||
$(LN_S) libgcj_bc.so.1.0.0 .libs/libgcj_bc.so.1
|
|
||||||
|
|
||||||
install/libgcj_bc.la: $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_DEPENDENCIES) install/$(am__dirstamp)
|
|
||||||
$(libgcj_bc_la_LINK) $(am_libgcj_bc_la_rpath) $(libgcj_bc_la_LDFLAGS) \
|
|
||||||
- $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_LIBADD) $(LIBS)
|
|
||||||
+ $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_LIBADD) $(LIBS) -Wl,--no-as-needed -lgcj
|
|
||||||
|
|
||||||
$(propertyo_files): %.lo: classpath/resource/%
|
|
||||||
$(mkinstalldirs) `dirname $@`; \
|
|
||||||
@@ -12494,7 +12498,7 @@
|
|
||||||
@USE_LIBGCJ_BC_TRUE@ rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \
|
|
||||||
@USE_LIBGCJ_BC_TRUE@ mv $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \
|
|
||||||
@USE_LIBGCJ_BC_TRUE@ $(libgcj_bc_dummy_LINK) -xc /dev/null -Wl,-soname,libgcj_bc.so.1 \
|
|
||||||
-@USE_LIBGCJ_BC_TRUE@ -o $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 -lgcj || exit; \
|
|
||||||
+@USE_LIBGCJ_BC_TRUE@ -o $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 -Wl,--no-as-needed -lgcj || exit; \
|
|
||||||
@USE_LIBGCJ_BC_TRUE@ rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1; \
|
|
||||||
@USE_LIBGCJ_BC_TRUE@ $(LN_S) libgcj_bc.so.1.0.0 $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1; \
|
|
||||||
@USE_LIBGCJ_BC_TRUE@ rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.la;
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
Enable -Wformat and -Wformat-security by default.
|
|
||||||
|
|
||||||
|
|
||||||
--- a/gcc/c-family/c.opt
|
|
||||||
+++ b/gcc/c-family/c.opt
|
|
||||||
@@ -412,7 +412,7 @@ C ObjC C++ ObjC++ Var(warn_format_nonliteral) Warning LangEnabledBy(C ObjC C++ O
|
|
||||||
Warn about format strings that are not literals
|
|
||||||
|
|
||||||
Wformat-security
|
|
||||||
-C ObjC C++ ObjC++ Var(warn_format_security) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=, warn_format >= 2, 0)
|
|
||||||
+C ObjC C++ ObjC++ Var(warn_format_security) Init(1) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=, warn_format >= 2, 0)
|
|
||||||
Warn about possible security problems with format functions
|
|
||||||
|
|
||||||
Wformat-y2k
|
|
||||||
@@ -424,7 +424,7 @@ C ObjC C++ ObjC++ Var(warn_format_zero_length) Warning LangEnabledBy(C ObjC C++
|
|
||||||
Warn about zero-length formats
|
|
||||||
|
|
||||||
Wformat=
|
|
||||||
-C ObjC C++ ObjC++ Joined RejectNegative UInteger Var(warn_format) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall, 1, 0)
|
|
||||||
+C ObjC C++ ObjC++ Joined RejectNegative UInteger Var(warn_format) Init(1) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall, 1, 0)
|
|
||||||
Warn about printf/scanf/strftime/strfmon format string anomalies
|
|
||||||
|
|
||||||
Wignored-qualifiers
|
|
||||||
--- a/gcc/doc/gcc.info
|
|
||||||
+++ b/gcc/doc/gcc.info
|
|
||||||
@@ -3451,6 +3451,8 @@ compiler warns that an unrecognized option is present.
|
|
||||||
'-Wno-format-contains-nul', '-Wno-format-extra-args', and
|
|
||||||
'-Wno-format-zero-length'. '-Wformat' is enabled by '-Wall'.
|
|
||||||
|
|
||||||
+ This option is enabled by default in Alpine Linux.
|
|
||||||
+
|
|
||||||
'-Wno-format-contains-nul'
|
|
||||||
If '-Wformat' is specified, do not warn about format strings
|
|
||||||
that contain NUL bytes.
|
|
||||||
@@ -3496,6 +3498,8 @@ compiler warns that an unrecognized option is present.
|
|
||||||
future warnings may be added to '-Wformat-security' that are
|
|
||||||
not included in '-Wformat-nonliteral'.)
|
|
||||||
|
|
||||||
+ This option is enabled by default in Alpine Linux.
|
|
||||||
+
|
|
||||||
'-Wformat-y2k'
|
|
||||||
If '-Wformat' is specified, also warn about 'strftime' formats
|
|
||||||
that may yield only a two-digit year.
|
|
|
@ -1,25 +0,0 @@
|
||||||
Enable -Wtrampolines by default.
|
|
||||||
|
|
||||||
|
|
||||||
--- a/gcc/common.opt
|
|
||||||
+++ b/gcc/common.opt
|
|
||||||
@@ -648,7 +648,7 @@ Common Var(warn_system_headers) Warning
|
|
||||||
Do not suppress warnings from system headers
|
|
||||||
|
|
||||||
Wtrampolines
|
|
||||||
-Common Var(warn_trampolines) Warning
|
|
||||||
+Common Var(warn_trampolines) Init(1) Warning
|
|
||||||
Warn whenever a trampoline is generated
|
|
||||||
|
|
||||||
Wtype-limits
|
|
||||||
--- a/gcc/doc/gcc.info
|
|
||||||
+++ b/gcc/doc/gcc.info
|
|
||||||
@@ -4021,6 +4021,8 @@ compiler warns that an unrecognized option is present.
|
|
||||||
and thus requires the stack to be made executable in order for the
|
|
||||||
program to work properly.
|
|
||||||
|
|
||||||
+ This warning is enabled by default in Gentoo.
|
|
||||||
+
|
|
||||||
'-Wfloat-equal'
|
|
||||||
Warn if floating-point values are used in equality comparisons.
|
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
Ensure that msgfmt doesn't encounter problems during gcc bootstrapping.
|
|
||||||
|
|
||||||
Solves error messages like the following:
|
|
||||||
|
|
||||||
msgfmt: /var/tmp/portage/sys-devel/gcc-4.1.2/work/build/./gcc/libgcc_s.so.1: version `GCC_4.2.0' not found (required by /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/libstdc++.so.6)
|
|
||||||
|
|
||||||
The libgcc_s.so used during build doesn't satisfy the needs of the
|
|
||||||
libstdc++.so that msgfmt is linked against. On the other hand, msgfmt
|
|
||||||
is used as a stand-alone application here, and what library it uses
|
|
||||||
behind the scenes is of no concern to the gcc build process.
|
|
||||||
Therefore, simply invoking it "as usual", i.e. without any special
|
|
||||||
library path, will make it work as expected here.
|
|
||||||
|
|
||||||
2011-09-19 Martin von Gagern
|
|
||||||
|
|
||||||
References:
|
|
||||||
https://bugs.gentoo.org/372377
|
|
||||||
https://bugs.gentoo.org/295480
|
|
||||||
|
|
||||||
--- gcc-4.1.2.orig/libstdc++-v3/po/Makefile.am
|
|
||||||
+++ gcc-4.1.2/libstdc++-v3/po/Makefile.am
|
|
||||||
@@ -39,6 +39,7 @@ MSGFMT = msgfmt
|
|
||||||
EXTRA_DIST = string_literals.cc POTFILES.in $(PACKAGE).pot $(LOCALE_IN)
|
|
||||||
|
|
||||||
.po.mo:
|
|
||||||
+ env --unset=LD_LIBRARY_PATH \
|
|
||||||
$(MSGFMT) -o $@ $<
|
|
||||||
|
|
||||||
all-local: all-local-$(USE_NLS)
|
|
||||||
--- gcc-4.1.2.orig/libstdc++-v3/po/Makefile.in
|
|
||||||
+++ gcc-4.1.2/libstdc++-v3/po/Makefile.in
|
|
||||||
@@ -419,6 +419,7 @@ uninstall-am: uninstall-info-am
|
|
||||||
|
|
||||||
|
|
||||||
.po.mo:
|
|
||||||
+ env --unset=LD_LIBRARY_PATH \
|
|
||||||
$(MSGFMT) -o $@ $<
|
|
||||||
|
|
||||||
all-local: all-local-$(USE_NLS)
|
|
|
@ -1,18 +0,0 @@
|
||||||
2008-07-25 Magnus Granberg <zorry@ume.nu>
|
|
||||||
|
|
||||||
* include/libiberty.h (asprintf): Don't declare if defined as a macro
|
|
||||||
|
|
||||||
--- a/include/libiberty.h
|
|
||||||
+++ b/include/libiberty.h
|
|
||||||
@@ -609,8 +609,11 @@ extern int pwait (int, int *, int);
|
|
||||||
/* Like sprintf but provides a pointer to malloc'd storage, which must
|
|
||||||
be freed by the caller. */
|
|
||||||
|
|
||||||
+/* asprintf may be declared as a macro by glibc with __USE_FORTIFY_LEVEL. */
|
|
||||||
+#ifndef asprintf
|
|
||||||
extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2;
|
|
||||||
#endif
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
#if !HAVE_DECL_VASPRINTF
|
|
||||||
/* Like vsprintf but provides a pointer to malloc'd storage, which
|
|
|
@ -1,10 +0,0 @@
|
||||||
--- a/libiberty/Makefile.in
|
|
||||||
+++ b/libiberty/Makefile.in
|
|
||||||
@@ -246,6 +246,7 @@ $(TARGETLIB): $(REQUIRED_OFILES) $(EXTRA_OFILES) $(LIBOBJS)
|
|
||||||
$(AR) $(AR_FLAGS) $(TARGETLIB) \
|
|
||||||
$(REQUIRED_OFILES) $(EXTRA_OFILES) $(LIBOBJS); \
|
|
||||||
$(RANLIB) $(TARGETLIB); \
|
|
||||||
+ cp $(TARGETLIB) ../ ; \
|
|
||||||
cd ..; \
|
|
||||||
else true; fi
|
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
https://bugs.gentoo.org/508852
|
|
||||||
https://gcc.gnu.org/PR61164
|
|
||||||
|
|
||||||
2014-04-27 Magnus Granberg <zorry@gentoo.org>
|
|
||||||
|
|
||||||
#508852
|
|
||||||
* libitm/configure.tgt: Disable FORTIFY
|
|
||||||
|
|
||||||
--- a/libitm/configure.tgt
|
|
||||||
+++ b/libitm/configure.tgt
|
|
||||||
@@ -43,6 +43,16 @@ if test "$gcc_cv_have_tls" = yes ; then
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
+# FIXME: error: inlining failed in call to always_inline
|
|
||||||
+# ‘int vfprintf(FILE*, const char*, __va_list_tag*)’
|
|
||||||
+# : function body can be overwritten at link time
|
|
||||||
+# Disable Fortify in libitm for now. #508852
|
|
||||||
+case "${target}" in
|
|
||||||
+ *-*-linux*)
|
|
||||||
+ XCFLAGS="${XCFLAGS} -U_FORTIFY_SOURCE"
|
|
||||||
+ ;;
|
|
||||||
+esac
|
|
||||||
+
|
|
||||||
# Map the target cpu to an ARCH sub-directory. At the same time,
|
|
||||||
# work out any special compilation flags as necessary.
|
|
||||||
case "${target_cpu}" in
|
|
|
@ -1,194 +0,0 @@
|
||||||
http://cgit.openembedded.org/openembedded-core/plain/meta/recipes-devtools/gcc/gcc-6.1/0010-gcc-poison-system-directories.patch
|
|
||||||
|
|
||||||
From d76250323dad69212c958e4857a98d99ab51a39e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Khem Raj <raj.khem@gmail.com>
|
|
||||||
Date: Fri, 29 Mar 2013 08:59:00 +0400
|
|
||||||
Subject: [PATCH 10/46] gcc: poison-system-directories
|
|
||||||
|
|
||||||
Signed-off-by: Khem Raj <raj.khem@gmail.com>
|
|
||||||
|
|
||||||
Upstream-Status: Inappropriate [distribution: codesourcery]
|
|
||||||
---
|
|
||||||
gcc/common.opt | 4 ++++
|
|
||||||
gcc/config.in | 6 ++++++
|
|
||||||
gcc/configure | 16 ++++++++++++++++
|
|
||||||
gcc/configure.ac | 10 ++++++++++
|
|
||||||
gcc/doc/invoke.texi | 9 +++++++++
|
|
||||||
gcc/gcc.c | 2 ++
|
|
||||||
gcc/incpath.c | 19 +++++++++++++++++++
|
|
||||||
7 files changed, 66 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/gcc/common.opt b/gcc/common.opt
|
|
||||||
index 67048db..733185c 100644
|
|
||||||
--- a/gcc/common.opt
|
|
||||||
+++ b/gcc/common.opt
|
|
||||||
@@ -659,6 +659,10 @@ Wreturn-local-addr
|
|
||||||
Common Var(warn_return_local_addr) Init(1) Warning
|
|
||||||
Warn about returning a pointer/reference to a local or temporary variable.
|
|
||||||
|
|
||||||
+Wpoison-system-directories
|
|
||||||
+Common Var(flag_poison_system_directories) Init(1) Warning
|
|
||||||
+Warn for -I and -L options using system directories if cross compiling
|
|
||||||
+
|
|
||||||
Wshadow
|
|
||||||
Common Var(warn_shadow) Warning
|
|
||||||
Warn when one local variable shadows another.
|
|
||||||
diff --git a/gcc/config.in b/gcc/config.in
|
|
||||||
index 115cb61..105b30f 100644
|
|
||||||
--- a/gcc/config.in
|
|
||||||
+++ b/gcc/config.in
|
|
||||||
@@ -187,6 +187,12 @@
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
+/* Define to warn for use of native system header directories */
|
|
||||||
+#ifndef USED_FOR_TARGET
|
|
||||||
+#undef ENABLE_POISON_SYSTEM_DIRECTORIES
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+
|
|
||||||
/* Define if you want all operations on RTL (the basic data structure of the
|
|
||||||
optimizer and back end) to be checked for dynamic type safety at runtime.
|
|
||||||
This is quite expensive. */
|
|
||||||
diff --git a/gcc/configure b/gcc/configure
|
|
||||||
index 1c6e340..8f83152 100755
|
|
||||||
--- a/gcc/configure
|
|
||||||
+++ b/gcc/configure
|
|
||||||
@@ -942,6 +942,7 @@ with_system_zlib
|
|
||||||
enable_maintainer_mode
|
|
||||||
enable_link_mutex
|
|
||||||
enable_version_specific_runtime_libs
|
|
||||||
+enable_poison_system_directories
|
|
||||||
enable_plugin
|
|
||||||
enable_host_shared
|
|
||||||
enable_libquadmath_support
|
|
||||||
@@ -1681,6 +1682,8 @@ Optional Features:
|
|
||||||
--enable-version-specific-runtime-libs
|
|
||||||
specify that runtime libraries should be installed
|
|
||||||
in a compiler-specific directory
|
|
||||||
+ --enable-poison-system-directories
|
|
||||||
+ warn for use of native system header directories
|
|
||||||
--enable-plugin enable plugin support
|
|
||||||
--enable-host-shared build host code as shared libraries
|
|
||||||
--disable-libquadmath-support
|
|
||||||
@@ -28908,6 +28911,19 @@ if test "${enable_version_specific_runtime_libs+set}" = set; then :
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
+# Check whether --enable-poison-system-directories was given.
|
|
||||||
+if test "${enable_poison_system_directories+set}" = set; then :
|
|
||||||
+ enableval=$enable_poison_system_directories;
|
|
||||||
+else
|
|
||||||
+ enable_poison_system_directories=no
|
|
||||||
+fi
|
|
||||||
+
|
|
||||||
+if test "x${enable_poison_system_directories}" = "xyes"; then
|
|
||||||
+
|
|
||||||
+$as_echo "#define ENABLE_POISON_SYSTEM_DIRECTORIES 1" >>confdefs.h
|
|
||||||
+
|
|
||||||
+fi
|
|
||||||
+
|
|
||||||
# Substitute configuration variables
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/gcc/configure.ac b/gcc/configure.ac
|
|
||||||
index 6c1dcd9..0fccaef 100644
|
|
||||||
--- a/gcc/configure.ac
|
|
||||||
+++ b/gcc/configure.ac
|
|
||||||
@@ -5861,6 +5861,16 @@ AC_ARG_ENABLE(version-specific-runtime-libs,
|
|
||||||
[specify that runtime libraries should be
|
|
||||||
installed in a compiler-specific directory])])
|
|
||||||
|
|
||||||
+AC_ARG_ENABLE([poison-system-directories],
|
|
||||||
+ AS_HELP_STRING([--enable-poison-system-directories],
|
|
||||||
+ [warn for use of native system header directories]),,
|
|
||||||
+ [enable_poison_system_directories=no])
|
|
||||||
+if test "x${enable_poison_system_directories}" = "xyes"; then
|
|
||||||
+ AC_DEFINE([ENABLE_POISON_SYSTEM_DIRECTORIES],
|
|
||||||
+ [1],
|
|
||||||
+ [Define to warn for use of native system header directories])
|
|
||||||
+fi
|
|
||||||
+
|
|
||||||
# Substitute configuration variables
|
|
||||||
AC_SUBST(subdirs)
|
|
||||||
AC_SUBST(srcdir)
|
|
||||||
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
|
|
||||||
index 821f8fd..8bb49e7 100644
|
|
||||||
--- a/gcc/doc/invoke.texi
|
|
||||||
+++ b/gcc/doc/invoke.texi
|
|
||||||
@@ -284,6 +284,7 @@ Objective-C and Objective-C++ Dialects}.
|
|
||||||
-Wparentheses -Wno-pedantic-ms-format @gol
|
|
||||||
-Wplacement-new -Wplacement-new=@var{n} @gol
|
|
||||||
-Wpointer-arith -Wno-pointer-to-int-cast @gol
|
|
||||||
+-Wno-poison-system-directories @gol
|
|
||||||
-Wno-pragmas -Wredundant-decls -Wno-return-local-addr @gol
|
|
||||||
-Wreturn-type -Wsequence-point -Wshadow -Wno-shadow-ivar @gol
|
|
||||||
-Wshift-overflow -Wshift-overflow=@var{n} @gol
|
|
||||||
@@ -4723,6 +4724,14 @@ made up of data only and thus requires no special treatment. But, for
|
|
||||||
most targets, it is made up of code and thus requires the stack to be
|
|
||||||
made executable in order for the program to work properly.
|
|
||||||
|
|
||||||
+@item -Wno-poison-system-directories
|
|
||||||
+@opindex Wno-poison-system-directories
|
|
||||||
+Do not warn for @option{-I} or @option{-L} options using system
|
|
||||||
+directories such as @file{/usr/include} when cross compiling. This
|
|
||||||
+option is intended for use in chroot environments when such
|
|
||||||
+directories contain the correct headers and libraries for the target
|
|
||||||
+system rather than the host.
|
|
||||||
+
|
|
||||||
@item -Wfloat-equal
|
|
||||||
@opindex Wfloat-equal
|
|
||||||
@opindex Wno-float-equal
|
|
||||||
diff --git a/gcc/gcc.c b/gcc/gcc.c
|
|
||||||
index 1af5920..4cfef7f 100644
|
|
||||||
--- a/gcc/gcc.c
|
|
||||||
+++ b/gcc/gcc.c
|
|
||||||
@@ -1017,6 +1017,8 @@ proper position among the other output files. */
|
|
||||||
"%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
|
|
||||||
"%X %{o*} %{e*} %{N} %{n} %{r}\
|
|
||||||
%{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}} \
|
|
||||||
+ %{Wno-poison-system-directories:--no-poison-system-directories} \
|
|
||||||
+ %{Werror=poison-system-directories:--error-poison-system-directories} \
|
|
||||||
%{static:} %{L*} %(mfwrap) %(link_libgcc) " \
|
|
||||||
VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o " CHKP_SPEC " \
|
|
||||||
%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
|
|
||||||
diff --git a/gcc/incpath.c b/gcc/incpath.c
|
|
||||||
index ea40f4a..856da41 100644
|
|
||||||
--- a/gcc/incpath.c
|
|
||||||
+++ b/gcc/incpath.c
|
|
||||||
@@ -26,6 +26,7 @@
|
|
||||||
#include "intl.h"
|
|
||||||
#include "incpath.h"
|
|
||||||
#include "cppdefault.h"
|
|
||||||
+#include "diagnostic-core.h"
|
|
||||||
|
|
||||||
/* Microsoft Windows does not natively support inodes.
|
|
||||||
VMS has non-numeric inodes. */
|
|
||||||
@@ -381,6 +382,24 @@ merge_include_chains (const char *sysroot, cpp_reader *pfile, int verbose)
|
|
||||||
}
|
|
||||||
fprintf (stderr, _("End of search list.\n"));
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+#ifdef ENABLE_POISON_SYSTEM_DIRECTORIES
|
|
||||||
+ if (flag_poison_system_directories)
|
|
||||||
+ {
|
|
||||||
+ struct cpp_dir *p;
|
|
||||||
+
|
|
||||||
+ for (p = heads[QUOTE]; p; p = p->next)
|
|
||||||
+ {
|
|
||||||
+ if ((!strncmp (p->name, "/usr/include", 12))
|
|
||||||
+ || (!strncmp (p->name, "/usr/local/include", 18))
|
|
||||||
+ || (!strncmp (p->name, "/usr/X11R6/include", 18)))
|
|
||||||
+ warning (OPT_Wpoison_system_directories,
|
|
||||||
+ "include location \"%s\" is unsafe for "
|
|
||||||
+ "cross-compilation",
|
|
||||||
+ p->name);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Use given -I paths for #include "..." but not #include <...>, and
|
|
||||||
--
|
|
||||||
2.8.2
|
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
libatomic build failure if configured with --disable-dependency-tracking
|
|
||||||
load_n.c:115:1: fatal error: opening dependency file .deps/load_1_.lo.Ppo: No such file or directory
|
|
||||||
|
|
||||||
https://bugs.gentoo.org/463463
|
|
||||||
http://gcc.gnu.org/PR55930
|
|
||||||
|
|
||||||
--- a/libatomic/Makefile.in
|
|
||||||
+++ b/libatomic/Makefile.in
|
|
||||||
@@ -298,7 +298,8 @@ PAT_N = $(word 2,$(PAT_SPLIT))
|
|
||||||
PAT_S = $(word 3,$(PAT_SPLIT))
|
|
||||||
IFUNC_DEF = -DIFUNC_ALT=$(PAT_S)
|
|
||||||
IFUNC_OPT = $(word $(PAT_S),$(IFUNC_OPTIONS))
|
|
||||||
-M_DEPS = -MT $@ -MD -MP -MF $(DEPDIR)/$(@F).Ppo
|
|
||||||
+@AMDEP_TRUE@M_DEPS = -MT $@ -MD -MP -MF $(DEPDIR)/$(@F).Ppo
|
|
||||||
+@AMDEP_FALSE@M_DEPS =
|
|
||||||
M_SIZE = -DN=$(PAT_N)
|
|
||||||
M_IFUNC = $(if $(PAT_S),$(IFUNC_DEF) $(IFUNC_OPT))
|
|
||||||
M_FILE = $(PAT_BASE)_n.c
|
|
|
@ -1,59 +0,0 @@
|
||||||
From 594e3c1ab576daddeb86015efc8b1677020b1878 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Szabolcs Nagy <nsz@port70.net>
|
|
||||||
Date: Sat, 24 Oct 2015 20:39:30 +0000
|
|
||||||
Subject: [PATCH 1/6] cilkrts
|
|
||||||
|
|
||||||
---
|
|
||||||
libcilkrts/runtime/os-unix.c | 22 +++++++---------------
|
|
||||||
1 file changed, 7 insertions(+), 15 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/libcilkrts/runtime/os-unix.c b/libcilkrts/runtime/os-unix.c
|
|
||||||
index cb582dd..e43d7d5 100644
|
|
||||||
--- a/libcilkrts/runtime/os-unix.c
|
|
||||||
+++ b/libcilkrts/runtime/os-unix.c
|
|
||||||
@@ -51,6 +51,7 @@
|
|
||||||
#if defined __linux__
|
|
||||||
# include <sys/sysinfo.h>
|
|
||||||
# include <sys/syscall.h>
|
|
||||||
+# include <sched.h>
|
|
||||||
#elif defined __APPLE__
|
|
||||||
# include <sys/sysctl.h>
|
|
||||||
// Uses sysconf(_SC_NPROCESSORS_ONLN) in verbose output
|
|
||||||
@@ -400,28 +401,19 @@ COMMON_SYSDEP void __cilkrts_sleep(void)
|
|
||||||
|
|
||||||
COMMON_SYSDEP void __cilkrts_yield(void)
|
|
||||||
{
|
|
||||||
-#if __APPLE__ || __FreeBSD__ || __VXWORKS__
|
|
||||||
- // On MacOS, call sched_yield to yield quantum. I'm not sure why we
|
|
||||||
- // don't do this on Linux also.
|
|
||||||
- sched_yield();
|
|
||||||
-#elif defined(__DragonFly__)
|
|
||||||
- // On DragonFly BSD, call sched_yield to yield quantum.
|
|
||||||
- sched_yield();
|
|
||||||
-#elif defined(__MIC__)
|
|
||||||
+#if defined(__MIC__)
|
|
||||||
// On MIC, pthread_yield() really trashes things. Arch's measurements
|
|
||||||
// showed that calling _mm_delay_32() (or doing nothing) was a better
|
|
||||||
// option. Delaying 1024 clock cycles is a reasonable compromise between
|
|
||||||
// giving up the processor and latency starting up when work becomes
|
|
||||||
// available
|
|
||||||
_mm_delay_32(1024);
|
|
||||||
-#elif defined(__ANDROID__) || (defined(__sun__) && defined(__svr4__))
|
|
||||||
- // On Android and Solaris, call sched_yield to yield quantum. I'm not
|
|
||||||
- // sure why we don't do this on Linux also.
|
|
||||||
- sched_yield();
|
|
||||||
-#else
|
|
||||||
- // On Linux, call pthread_yield (which in turn will call sched_yield)
|
|
||||||
- // to yield quantum.
|
|
||||||
+#elif defined(__sun__) && !defined(__svr4__)
|
|
||||||
+ // On old SunOS call pthread_yield to yield a quantum.
|
|
||||||
pthread_yield();
|
|
||||||
+#else
|
|
||||||
+ // On other platforms call sched_yield to yield a quantum.
|
|
||||||
+ sched_yield();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.8.1
|
|
||||||
|
|
|
@ -1,56 +0,0 @@
|
||||||
From 9e3eab51e518018d9d99b3123598b1e2322a6af3 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Szabolcs Nagy <nsz@port70.net>
|
|
||||||
Date: Sat, 24 Oct 2015 20:09:53 +0000
|
|
||||||
Subject: [PATCH 3/6] libgcc_s
|
|
||||||
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 4 ++--
|
|
||||||
libgcc/config/i386/cpuinfo.c | 6 +++---
|
|
||||||
libgcc/config/i386/t-linux | 2 +-
|
|
||||||
3 files changed, 6 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
|
||||||
index 3d044e8..82523e1 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -40269,10 +40269,10 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
|
|
||||||
{
|
|
||||||
case IX86_BUILTIN_CPU_INIT:
|
|
||||||
{
|
|
||||||
- /* Make it call __cpu_indicator_init in libgcc. */
|
|
||||||
+ /* Make it call __cpu_indicator_init_local in libgcc.a. */
|
|
||||||
tree call_expr, fndecl, type;
|
|
||||||
type = build_function_type_list (integer_type_node, NULL_TREE);
|
|
||||||
- fndecl = build_fn_decl ("__cpu_indicator_init", type);
|
|
||||||
+ fndecl = build_fn_decl ("__cpu_indicator_init_local", type);
|
|
||||||
call_expr = build_call_expr (fndecl, 0);
|
|
||||||
return expand_expr (call_expr, target, mode, EXPAND_NORMAL);
|
|
||||||
}
|
|
||||||
diff --git a/libgcc/config/i386/cpuinfo.c b/libgcc/config/i386/cpuinfo.c
|
|
||||||
index 8c2248d..6c82f15 100644
|
|
||||||
--- a/libgcc/config/i386/cpuinfo.c
|
|
||||||
+++ b/libgcc/config/i386/cpuinfo.c
|
|
||||||
@@ -485,7 +485,7 @@ __cpu_indicator_init (void)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-#if defined SHARED && defined USE_ELF_SYMVER
|
|
||||||
-__asm__ (".symver __cpu_indicator_init, __cpu_indicator_init@GCC_4.8.0");
|
|
||||||
-__asm__ (".symver __cpu_model, __cpu_model@GCC_4.8.0");
|
|
||||||
+#ifndef SHARED
|
|
||||||
+int __cpu_indicator_init_local (void)
|
|
||||||
+ __attribute__ ((weak, alias ("__cpu_indicator_init")));
|
|
||||||
#endif
|
|
||||||
diff --git a/libgcc/config/i386/t-linux b/libgcc/config/i386/t-linux
|
|
||||||
index 11bb46e..4f47f7b 100644
|
|
||||||
--- a/libgcc/config/i386/t-linux
|
|
||||||
+++ b/libgcc/config/i386/t-linux
|
|
||||||
@@ -3,4 +3,4 @@
|
|
||||||
# t-slibgcc-elf-ver and t-linux
|
|
||||||
SHLIB_MAPFILES = libgcc-std.ver $(srcdir)/config/i386/libgcc-glibc.ver
|
|
||||||
|
|
||||||
-HOST_LIBGCC2_CFLAGS += -mlong-double-80 -DUSE_ELF_SYMVER
|
|
||||||
+HOST_LIBGCC2_CFLAGS += -mlong-double-80
|
|
||||||
--
|
|
||||||
2.8.1
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
From edec78452d693fb524daa9a6efd45c850b27b25c Mon Sep 17 00:00:00 2001
|
|
||||||
From: Szabolcs Nagy <nsz@port70.net>
|
|
||||||
Date: Fri, 6 Nov 2015 23:59:20 +0000
|
|
||||||
Subject: [PATCH 4/6] linux_libc_has_function
|
|
||||||
|
|
||||||
---
|
|
||||||
gcc/config/linux.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/linux.c b/gcc/config/linux.c
|
|
||||||
index 250296b..16c3768 100644
|
|
||||||
--- a/gcc/config/linux.c
|
|
||||||
+++ b/gcc/config/linux.c
|
|
||||||
@@ -26,7 +26,7 @@ along with GCC; see the file COPYING3. If not see
|
|
||||||
bool
|
|
||||||
linux_libc_has_function (enum function_class fn_class)
|
|
||||||
{
|
|
||||||
- if (OPTION_GLIBC)
|
|
||||||
+ if (OPTION_GLIBC || OPTION_MUSL)
|
|
||||||
return true;
|
|
||||||
if (OPTION_BIONIC)
|
|
||||||
if (fn_class == function_c94
|
|
||||||
--
|
|
||||||
2.8.1
|
|
||||||
|
|
|
@ -1,75 +0,0 @@
|
||||||
From b6015aca9c9cc83739fd0ed637a835119b2c4e34 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Szabolcs Nagy <nsz@port70.net>
|
|
||||||
Date: Sat, 7 Nov 2015 02:08:05 +0000
|
|
||||||
Subject: [PATCH 5/6] nopie
|
|
||||||
|
|
||||||
---
|
|
||||||
gcc/configure | 27 +++++++++++++++++++++++++++
|
|
||||||
gcc/configure.ac | 13 +++++++++++++
|
|
||||||
2 files changed, 40 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/gcc/configure b/gcc/configure
|
|
||||||
index 1c6e340..7e8b5d6 100755
|
|
||||||
--- a/gcc/configure
|
|
||||||
+++ b/gcc/configure
|
|
||||||
@@ -29390,6 +29390,33 @@ fi
|
|
||||||
$as_echo "$gcc_cv_no_pie" >&6; }
|
|
||||||
if test "$gcc_cv_no_pie" = "yes"; then
|
|
||||||
NO_PIE_FLAG="-no-pie"
|
|
||||||
+else
|
|
||||||
+ # Check if -nopie works.
|
|
||||||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -nopie option" >&5
|
|
||||||
+$as_echo_n "checking for -nopie option... " >&6; }
|
|
||||||
+if test "${gcc_cv_nopie+set}" = set; then :
|
|
||||||
+ $as_echo_n "(cached) " >&6
|
|
||||||
+else
|
|
||||||
+ saved_LDFLAGS="$LDFLAGS"
|
|
||||||
+ LDFLAGS="$LDFLAGS -nopie"
|
|
||||||
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
||||||
+/* end confdefs.h. */
|
|
||||||
+int main(void) {return 0;}
|
|
||||||
+_ACEOF
|
|
||||||
+if ac_fn_cxx_try_link "$LINENO"; then :
|
|
||||||
+ gcc_cv_nopie=yes
|
|
||||||
+else
|
|
||||||
+ gcc_cv_nopie=no
|
|
||||||
+fi
|
|
||||||
+rm -f core conftest.err conftest.$ac_objext \
|
|
||||||
+ conftest$ac_exeext conftest.$ac_ext
|
|
||||||
+ LDFLAGS="$saved_LDFLAGS"
|
|
||||||
+fi
|
|
||||||
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_nopie" >&5
|
|
||||||
+$as_echo "$gcc_cv_nopie" >&6; }
|
|
||||||
+ if test "$gcc_cv_nopie" = "yes"; then
|
|
||||||
+ NO_PIE_FLAG="-nopie"
|
|
||||||
+ fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/gcc/configure.ac b/gcc/configure.ac
|
|
||||||
index 6c1dcd9..0ca7647 100644
|
|
||||||
--- a/gcc/configure.ac
|
|
||||||
+++ b/gcc/configure.ac
|
|
||||||
@@ -6098,6 +6098,19 @@ AC_CACHE_CHECK([for -no-pie option],
|
|
||||||
LDFLAGS="$saved_LDFLAGS"])
|
|
||||||
if test "$gcc_cv_no_pie" = "yes"; then
|
|
||||||
NO_PIE_FLAG="-no-pie"
|
|
||||||
+else
|
|
||||||
+ # Check if -nopie works.
|
|
||||||
+ AC_CACHE_CHECK([for -nopie option],
|
|
||||||
+ [gcc_cv_nopie],
|
|
||||||
+ [saved_LDFLAGS="$LDFLAGS"
|
|
||||||
+ LDFLAGS="$LDFLAGS -nopie"
|
|
||||||
+ AC_LINK_IFELSE([int main(void) {return 0;}],
|
|
||||||
+ [gcc_cv_nopie=yes],
|
|
||||||
+ [gcc_cv_nopie=no])
|
|
||||||
+ LDFLAGS="$saved_LDFLAGS"])
|
|
||||||
+ if test "$gcc_cv_nopie" = "yes"; then
|
|
||||||
+ NO_PIE_FLAG="-nopie"
|
|
||||||
+ fi
|
|
||||||
fi
|
|
||||||
AC_SUBST([NO_PIE_FLAG])
|
|
||||||
|
|
||||||
--
|
|
||||||
2.8.1
|
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
diff --git a/gcc/config/gnu-user.h b/gcc/config/gnu-user.h
|
|
||||||
index b0bf40a..d4b56fe 100644
|
|
||||||
--- a/gcc/config/gnu-user.h
|
|
||||||
+++ b/gcc/config/gnu-user.h
|
|
||||||
@@ -51,10 +51,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
||||||
#if defined HAVE_LD_PIE
|
|
||||||
#define GNU_USER_TARGET_STARTFILE_SPEC \
|
|
||||||
"%{!shared: %{pg|p|profile:gcrt1.o%s;: \
|
|
||||||
- %{" PIE_SPEC ":Scrt1.o%s} %{" NO_PIE_SPEC ":crt1.o%s}}} \
|
|
||||||
- crti.o%s %{static:crtbeginT.o%s;: %{shared:crtbeginS.o%s} \
|
|
||||||
+ %{" PIE_SPEC ":%{static:rcrt1.o%s;:Scrt1.o%s}} %{" NO_PIE_SPEC ":crt1.o%s}}} \
|
|
||||||
+ crti.o%s %{shared:crtbeginS.o%s;: \
|
|
||||||
%{" PIE_SPEC ":crtbeginS.o%s} \
|
|
||||||
- %{" NO_PIE_SPEC ":crtbegin.o%s}} \
|
|
||||||
+ %{" NO_PIE_SPEC ":%{static:crtbeginT.o%s;:crtbegin.o%s}}} \
|
|
||||||
%{fvtable-verify=none:%s; \
|
|
||||||
fvtable-verify=preinit:vtv_start_preinit.o%s; \
|
|
||||||
fvtable-verify=std:vtv_start.o%s} \
|
|
||||||
diff --git a/gcc/gcc.c b/gcc/gcc.c
|
|
||||||
index 0208d61..731564e 100644
|
|
||||||
--- a/gcc/gcc.c
|
|
||||||
+++ b/gcc/gcc.c
|
|
||||||
@@ -870,7 +870,7 @@ proper position among the other output files. */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef ENABLE_DEFAULT_PIE
|
|
||||||
-#define NO_PIE_SPEC "no-pie|static"
|
|
||||||
+#define NO_PIE_SPEC "no-pie"
|
|
||||||
#define PIE_SPEC NO_PIE_SPEC "|r|shared:;"
|
|
||||||
#define NO_FPIE1_SPEC "fno-pie"
|
|
||||||
#define FPIE1_SPEC NO_FPIE1_SPEC ":;"
|
|
||||||
@@ -916,7 +916,7 @@ proper position among the other output files. */
|
|
||||||
#ifndef LINK_PIE_SPEC
|
|
||||||
#ifdef HAVE_LD_PIE
|
|
||||||
#ifndef LD_PIE_SPEC
|
|
||||||
-#define LD_PIE_SPEC "-pie"
|
|
||||||
+#define LD_PIE_SPEC "-pie %{static:--no-dynamic-linker -Bsymbolic}"
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define LD_PIE_SPEC ""
|
|
|
@ -1,32 +0,0 @@
|
||||||
From be841c16dd544553c67faac79bd4cc3cd10a1dc0 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Tuan M. Hoang" <tmhoang@flatglobe.org>
|
|
||||||
Date: Mon, 21 Nov 2016 01:42:16 +0700
|
|
||||||
Subject: [PATCH] main/gcc: add musl s390x dynamic linker
|
|
||||||
|
|
||||||
---
|
|
||||||
gcc/config/s390/linux.h | 9 +++++++++
|
|
||||||
1 file changed, 9 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/s390/linux.h b/gcc/config/s390/linux.h
|
|
||||||
index 1e3ed35..a244214 100644
|
|
||||||
--- a/gcc/config/s390/linux.h
|
|
||||||
+++ b/gcc/config/s390/linux.h
|
|
||||||
@@ -63,6 +63,15 @@ along with GCC; see the file COPYING3. If not see
|
|
||||||
#define GLIBC_DYNAMIC_LINKER32 "/lib/ld.so.1"
|
|
||||||
#define GLIBC_DYNAMIC_LINKER64 "/lib/ld64.so.1"
|
|
||||||
|
|
||||||
+#undef MUSL_DYNAMIC_LINKER
|
|
||||||
+#define MUSL_DYNAMIC_LINKER "/lib/ld-musl-s390x.so.1"
|
|
||||||
+#undef MUSL_DYNAMIC_LINKER32
|
|
||||||
+#define MUSL_DYNAMIC_LINKER32 "/lib/ld-musl-s390x.so.1"
|
|
||||||
+#undef MUSL_DYNAMIC_LINKER64
|
|
||||||
+#define MUSL_DYNAMIC_LINKER64 "/lib/ld-musl-s390x.so.1"
|
|
||||||
+#undef MUSL_DYNAMIC_LINKERX32
|
|
||||||
+#define MUSL_DYNAMIC_LINKERX32 "/lib/ld-musl-s390x.so.1"
|
|
||||||
+
|
|
||||||
#undef LINK_SPEC
|
|
||||||
#define LINK_SPEC \
|
|
||||||
"%{m31:-m elf_s390}%{m64:-m elf64_s390} --as-needed \
|
|
||||||
--
|
|
||||||
2.10.2
|
|
||||||
|
|
|
@ -1,28 +0,0 @@
|
||||||
From 697a7ba791fce2ffab2ed723d909a89684019e3d Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Tuan M. Hoang" <tmhoang@flatglobe.org>
|
|
||||||
Date: Sun, 19 Feb 2017 17:03:33 +0000
|
|
||||||
Subject: [PATCH] main/gcc : when building gcc-java on s390x, libgcj.so
|
|
||||||
complains about undefined reference to __data_start. Using
|
|
||||||
SEARCH_FOR_DATA_START instead solved it. Credit to Andrew Haley at RedHat.
|
|
||||||
|
|
||||||
---
|
|
||||||
boehm-gc/include/private/gcconfig.h | 3 +--
|
|
||||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/boehm-gc/include/private/gcconfig.h b/boehm-gc/include/private/gcconfig.h
|
|
||||||
index 4ca6a80..a15fff6 100644
|
|
||||||
--- a/boehm-gc/include/private/gcconfig.h
|
|
||||||
+++ b/boehm-gc/include/private/gcconfig.h
|
|
||||||
@@ -1837,8 +1837,7 @@
|
|
||||||
# define OS_TYPE "LINUX"
|
|
||||||
# define LINUX_STACKBOTTOM
|
|
||||||
# define DYNAMIC_LOADING
|
|
||||||
- extern int __data_start[];
|
|
||||||
-# define DATASTART ((ptr_t)(__data_start))
|
|
||||||
+# define SEARCH_FOR_DATA_START
|
|
||||||
extern int _end[];
|
|
||||||
# define DATAEND (_end)
|
|
||||||
# define CACHE_LINE_SIZE 256
|
|
||||||
--
|
|
||||||
2.11.1
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
diff --git a/libffi/closures.c.orig b/libffi/closures.c
|
|
||||||
index 721ff00..22a699c 100644
|
|
||||||
--- a/libffi/src/closures.c.orig
|
|
||||||
+++ b/libffi/src/closures.c
|
|
||||||
@@ -34,7 +34,7 @@
|
|
||||||
#include <ffi_common.h>
|
|
||||||
|
|
||||||
#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE
|
|
||||||
-# if __gnu_linux__ && !defined(__ANDROID__)
|
|
||||||
+# if __linux__ && !defined(__ANDROID__)
|
|
||||||
/* This macro indicates it may be forbidden to map anonymous memory
|
|
||||||
with both write and execute permission. Code compiled when this
|
|
||||||
option is defined will attempt to map such pages once, but if it
|
|
|
@ -1,717 +0,0 @@
|
||||||
# Automatically generated aport, do not edit!
|
|
||||||
# Generator: pmbootstrap aportgen gcc-aarch64
|
|
||||||
# Based on: main/gcc
|
|
||||||
|
|
||||||
CTARGET_ARCH=aarch64
|
|
||||||
CTARGET="$(arch_to_hostspec ${CTARGET_ARCH})"
|
|
||||||
LANG_OBJC=false
|
|
||||||
LANG_JAVA=false
|
|
||||||
LANG_GO=false
|
|
||||||
LANG_FORTRAN=false
|
|
||||||
LANG_ADA=false
|
|
||||||
options="!strip !tracedeps"
|
|
||||||
|
|
||||||
# abuild doesn't try to tries to install "build-base-$CTARGET_ARCH"
|
|
||||||
# when this variable matches "no*"
|
|
||||||
BOOTSTRAP="nobuildbase"
|
|
||||||
|
|
||||||
# abuild will only cross compile when this variable is set, but it
|
|
||||||
# needs to find a valid package database in there for dependency
|
|
||||||
# resolving, so we set it to /.
|
|
||||||
CBUILDROOT="/"
|
|
||||||
|
|
||||||
_cross_configure="--disable-bootstrap --with-sysroot=/usr/$CTARGET"
|
|
||||||
|
|
||||||
pkgname="gcc-aarch64"
|
|
||||||
pkgver=6.4.0
|
|
||||||
[ "$BOOTSTRAP" = "nolibc" ] && pkgname="gcc-pass2"
|
|
||||||
[ "$CBUILD" != "$CHOST" ] && _cross="-$CARCH" || _cross=""
|
|
||||||
[ "$CHOST" != "$CTARGET" ] && _target="-$CTARGET_ARCH" || _target=""
|
|
||||||
|
|
||||||
pkgname="gcc-aarch64"
|
|
||||||
pkgrel=8
|
|
||||||
pkgdesc="Stage2 cross-compiler for aarch64"
|
|
||||||
url="http://gcc.gnu.org"
|
|
||||||
arch="armhf x86_64 x86"
|
|
||||||
license="GPL LGPL"
|
|
||||||
_gccrel=$pkgver-r$pkgrel
|
|
||||||
depends="isl binutils-aarch64"
|
|
||||||
makedepends_build="gcc g++ paxmark bison flex texinfo gawk zip gmp-dev mpfr-dev mpc1-dev zlib-dev"
|
|
||||||
makedepends_host="linux-headers gmp-dev mpfr-dev mpc1-dev isl-dev zlib-dev musl-dev-aarch64 binutils-aarch64"
|
|
||||||
subpackages="g++-aarch64:gpp"
|
|
||||||
[ "$CHOST" = "$CTARGET" ] && subpackages="gcc-doc$_target"
|
|
||||||
replaces="libstdc++ binutils"
|
|
||||||
|
|
||||||
: ${LANG_CXX:=true}
|
|
||||||
: ${LANG_OBJC:=true}
|
|
||||||
: ${LANG_JAVA:=true}
|
|
||||||
: ${LANG_GO:=true}
|
|
||||||
: ${LANG_FORTRAN:=true}
|
|
||||||
: ${LANG_ADA:=true}
|
|
||||||
|
|
||||||
LIBGOMP="false"
|
|
||||||
LIBGCC="false"
|
|
||||||
LIBATOMIC="false"
|
|
||||||
LIBITM="false"
|
|
||||||
|
|
||||||
if [ "$CHOST" != "$CTARGET" ]; then
|
|
||||||
if [ "$BOOTSTRAP" = nolibc ]; then
|
|
||||||
LANG_CXX=false
|
|
||||||
LANG_ADA=false
|
|
||||||
LIBGCC=false
|
|
||||||
_builddir="$srcdir/build-cross-pass2"
|
|
||||||
else
|
|
||||||
_builddir="$srcdir/build-cross-final"
|
|
||||||
fi
|
|
||||||
LANG_OBJC=false
|
|
||||||
LANG_JAVA=false
|
|
||||||
LANG_GO=false
|
|
||||||
LANG_FORTRAN=false
|
|
||||||
LIBGOMP=false
|
|
||||||
LIBATOMIC=false
|
|
||||||
LIBITM=false
|
|
||||||
|
|
||||||
# reset target flags (should be set in crosscreate abuild)
|
|
||||||
# fixup flags. seems gcc treats CPPFLAGS as global without
|
|
||||||
# _FOR_xxx variants. wrap it in CFLAGS and CXXFLAGS.
|
|
||||||
export CFLAGS="$CPPFLAGS $CFLAGS"
|
|
||||||
export CXXFLAGS="$CPPFLAGS $CXXFLAGS"
|
|
||||||
unset CPPFLAGS
|
|
||||||
export CFLAGS_FOR_TARGET=" "
|
|
||||||
export CXXFLAGS_FOR_TARGET=" "
|
|
||||||
export LDFLAGS_FOR_TARGET=" "
|
|
||||||
|
|
||||||
STRIP_FOR_TARGET="$CTARGET-strip"
|
|
||||||
elif [ "$CBUILD" != "$CHOST" ]; then
|
|
||||||
# fixup flags. seems gcc treats CPPFLAGS as global without
|
|
||||||
# _FOR_xxx variants. wrap it in CFLAGS and CXXFLAGS.
|
|
||||||
export CFLAGS="$CPPFLAGS $CFLAGS"
|
|
||||||
export CXXFLAGS="$CPPFLAGS $CXXFLAGS"
|
|
||||||
unset CPPFLAGS
|
|
||||||
|
|
||||||
# reset flags and cc for build
|
|
||||||
export CC_FOR_BUILD="gcc"
|
|
||||||
export CXX_FOR_BUILD="g++"
|
|
||||||
export CFLAGS_FOR_BUILD=" "
|
|
||||||
export CXXFLAGS_FOR_BUILD=" "
|
|
||||||
export LDFLAGS_FOR_BUILD=" "
|
|
||||||
export CFLAGS_FOR_TARGET=" "
|
|
||||||
export CXXFLAGS_FOR_TARGET=" "
|
|
||||||
export LDFLAGS_FOR_TARGET=" "
|
|
||||||
|
|
||||||
# Languages that do not need bootstrapping
|
|
||||||
LANG_OBJC=false
|
|
||||||
LANG_JAVA=false
|
|
||||||
LANG_GO=false
|
|
||||||
LANG_FORTRAN=false
|
|
||||||
|
|
||||||
STRIP_FOR_TARGET=${CROSS_COMPILE}strip
|
|
||||||
_builddir="$srcdir/build-cross-native"
|
|
||||||
else
|
|
||||||
STRIP_FOR_TARGET=${CROSS_COMPILE}strip
|
|
||||||
_builddir="$srcdir/build"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Go needs {set,make,swap}context, unimplemented in musl
|
|
||||||
[ "$CTARGET_LIBC" = musl ] && LANG_GO=false
|
|
||||||
|
|
||||||
# libitm has TEXTRELs in ARM build, so disable for now
|
|
||||||
case "$CTARGET_ARCH" in
|
|
||||||
arm*) LIBITM=false ;;
|
|
||||||
mips*) LIBITM=false ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Fortran uses libquadmath if toolchain has __float128
|
|
||||||
# currently on x86, x86_64 and ia64
|
|
||||||
LIBQUADMATH=$LANG_FORTRAN
|
|
||||||
case "$CTARGET_ARCH" in
|
|
||||||
x86 | x86_64) LIBQUADMATH=$LANG_FORTRAN ;;
|
|
||||||
*) LIBQUADMATH=false ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# libatomic is a dependency for openvswitch
|
|
||||||
$LIBATOMIC && subpackages="$subpackages libatomic::$CTARGET_ARCH"
|
|
||||||
$LIBGCC && subpackages="$subpackages libgcc::$CTARGET_ARCH"
|
|
||||||
$LIBQUADMATH && subpackages="$subpackages libquadmath::$CTARGET_ARCH"
|
|
||||||
if $LIBGOMP; then
|
|
||||||
depends="$depends libgomp=$_gccrel"
|
|
||||||
subpackages="$subpackages libgomp::$CTARGET_ARCH"
|
|
||||||
fi
|
|
||||||
|
|
||||||
_languages=c
|
|
||||||
if $LANG_CXX; then
|
|
||||||
_languages="$_languages,c++"
|
|
||||||
fi
|
|
||||||
if $LANG_OBJC; then
|
|
||||||
subpackages="$subpackages libobjc::$CTARGET_ARCH gcc-objc$_target:objc"
|
|
||||||
_languages="$_languages,objc"
|
|
||||||
fi
|
|
||||||
if $LANG_JAVA; then
|
|
||||||
subpackages="$subpackages libgcj::$CTARGET_ARCH gcc-java$_target:java"
|
|
||||||
_languages="$_languages,java"
|
|
||||||
fi
|
|
||||||
if $LANG_GO; then
|
|
||||||
subpackages="$subpackages libgo::$CTARGET_ARCH gcc-go$_target:go"
|
|
||||||
_languages="$_languages,go"
|
|
||||||
fi
|
|
||||||
if $LANG_FORTRAN; then
|
|
||||||
subpackages="$subpackages libgfortran::$CTARGET_ARCH gfortran$_target:gfortran"
|
|
||||||
_languages="$_languages,fortran"
|
|
||||||
fi
|
|
||||||
if $LANG_ADA; then
|
|
||||||
subpackages="$subpackages libgnat::$CTARGET_ARCH gcc-gnat$_target:gnat"
|
|
||||||
_languages="$_languages,ada"
|
|
||||||
makedepends_build="$makedepends_build gcc-gnat gcc-gnat$_cross"
|
|
||||||
fi
|
|
||||||
makedepends="$makedepends_build $makedepends_host"
|
|
||||||
|
|
||||||
source="http://gcc.gnu.org/pub/gcc/releases/gcc-${_pkgbase:-$pkgver}/gcc-${_pkgbase:-$pkgver}.tar.xz
|
|
||||||
http://sourceware.org/pub/java/ecj-4.9.jar
|
|
||||||
|
|
||||||
001_all_default-ssp-strong.patch
|
|
||||||
002_all_default-relro.patch
|
|
||||||
003_all_default-fortify-source.patch
|
|
||||||
005_all_default-as-needed.patch
|
|
||||||
011_all_default-warn-format-security.patch
|
|
||||||
012_all_default-warn-trampolines.patch
|
|
||||||
020_all_msgfmt-libstdc++-link.patch
|
|
||||||
050_all_libiberty-asprintf.patch
|
|
||||||
051_all_libiberty-pic.patch
|
|
||||||
053_all_libitm-no-fortify-source.patch
|
|
||||||
067_all_gcc-poison-system-directories.patch
|
|
||||||
090_all_pr55930-dependency-tracking.patch
|
|
||||||
|
|
||||||
201-cilkrts.patch
|
|
||||||
203-libgcc_s.patch
|
|
||||||
204-linux_libc_has_function.patch
|
|
||||||
205-nopie.patch
|
|
||||||
207-static-pie.patch
|
|
||||||
|
|
||||||
libgcc-always-build-gcceh.a.patch
|
|
||||||
gcc-4.9-musl-fortify.patch
|
|
||||||
gcc-6.1-musl-libssp.patch
|
|
||||||
boehm-gc-musl.patch
|
|
||||||
gcc-pure64.patch
|
|
||||||
fix-gcj-stdgnu14-link.patch
|
|
||||||
fix-gcj-musl.patch
|
|
||||||
fix-gcj-iconv-musl.patch
|
|
||||||
|
|
||||||
gcc-4.8-build-args.patch
|
|
||||||
fix-cxxflags-passing.patch
|
|
||||||
ada-fixes.patch
|
|
||||||
ada-shared.patch
|
|
||||||
ada-musl.patch
|
|
||||||
ada-aarch64-multiarch.patch
|
|
||||||
|
|
||||||
300-main-gcc-add-musl-s390x-dynamic-linker.patch
|
|
||||||
310-build-gcj-s390x.patch
|
|
||||||
320-libffi-gnulinux.patch
|
|
||||||
|
|
||||||
fix-rs6000-pie.patch
|
|
||||||
fix-linux-header-use-in-libgcc.patch
|
|
||||||
gcc-pure64-mips.patch
|
|
||||||
ada-mips64.patch
|
|
||||||
|
|
||||||
0001-i386-Move-struct-ix86_frame-to-machine_function.patch
|
|
||||||
0002-i386-Use-reference-of-struct-ix86_frame-to-avoid-cop.patch
|
|
||||||
0003-i386-Use-const-reference-of-struct-ix86_frame-to-avo.patch
|
|
||||||
0004-x86-Add-mindirect-branch.patch
|
|
||||||
0005-x86-Add-mfunction-return.patch
|
|
||||||
0006-x86-Add-mindirect-branch-register.patch
|
|
||||||
0007-x86-Add-V-register-operand-modifier.patch
|
|
||||||
0008-x86-Disallow-mindirect-branch-mfunction-return-with-.patch
|
|
||||||
0009-Use-INVALID_REGNUM-in-indirect-thunk-processing.patch
|
|
||||||
0010-i386-Pass-INVALID_REGNUM-as-invalid-register-number.patch
|
|
||||||
0011-i386-Update-mfunction-return-for-return-with-pop.patch
|
|
||||||
0012-i386-Add-TARGET_INDIRECT_BRANCH_REGISTER.patch
|
|
||||||
0013-i386-Don-t-generate-alias-for-function-return-thunk.patch
|
|
||||||
"
|
|
||||||
|
|
||||||
# we build out-of-tree
|
|
||||||
_gccdir="$srcdir"/gcc-${_pkgbase:-$pkgver}
|
|
||||||
_gcclibdir=/usr/lib/gcc/${CTARGET}/$pkgver
|
|
||||||
_gcclibexec=/usr/libexec/gcc/${CTARGET}/$pkgver
|
|
||||||
|
|
||||||
prepare() {
|
|
||||||
cd "$_gccdir"
|
|
||||||
|
|
||||||
_err=
|
|
||||||
for i in $source; do
|
|
||||||
case "$i" in
|
|
||||||
*.patch)
|
|
||||||
msg "Applying $i"
|
|
||||||
patch -p1 -F3 -i "$srcdir"/$i || _err="$_err $i"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ -n "$_err" ]; then
|
|
||||||
error "The following patches failed:"
|
|
||||||
for i in $_err; do
|
|
||||||
echo " $i"
|
|
||||||
done
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# see http://gcc.gnu.org/ml/java/2008-04/msg00027.html
|
|
||||||
mv "$srcdir"/ecj-*.jar ecj.jar
|
|
||||||
|
|
||||||
echo ${pkgver} > gcc/BASE-VER
|
|
||||||
}
|
|
||||||
|
|
||||||
build() {
|
|
||||||
local _arch_configure=
|
|
||||||
local _libc_configure=
|
|
||||||
local _bootstrap_configure=
|
|
||||||
local _symvers=
|
|
||||||
|
|
||||||
cd "$_gccdir"
|
|
||||||
|
|
||||||
case "$CTARGET" in
|
|
||||||
aarch64-*-*-*) _arch_configure="--with-arch=armv8-a --with-abi=lp64";;
|
|
||||||
armv5-*-*-*eabi) _arch_configure="--with-arch=armv5te --with-tune=arm926ej-s --with-float=soft --with-abi=aapcs-linux";;
|
|
||||||
armv6-*-*-*eabihf) _arch_configure="--with-arch=armv6zk --with-tune=arm1176jzf-s --with-fpu=vfp --with-float=hard --with-abi=aapcs-linux";;
|
|
||||||
armv7-*-*-*eabihf) _arch_configure="--with-arch=armv7-a --with-tune=generic-armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-abi=aapcs-linux --with-mode=thumb";;
|
|
||||||
mips-*-*-*) _arch_configure="--with-arch=mips32 --with-mips-plt --with-float=soft --with-abi=32";;
|
|
||||||
mips64-*-*-*) _arch_configure="--with-arch=mips3 --with-tune=mips64 --with-mips-plt --with-float=soft --with-abi=64";;
|
|
||||||
mips64el-*-*-*) _arch_configure="--with-arch=mips3 --with-tune=mips64 --with-mips-plt --with-float=soft --with-abi=64";;
|
|
||||||
mipsel-*-*-*) _arch_configure="--with-arch=mips32 --with-mips-plt --with-float=soft --with-abi=32";;
|
|
||||||
powerpc-*-*-*) _arch_configure="--enable-secureplt --enable-decimal-float=no";;
|
|
||||||
powerpc64*-*-*-*) _arch_configure="--with-abi=elfv2 --enable-secureplt --enable-decimal-float=no --enable-targets=powerpcle-linux";;
|
|
||||||
i486-*-*-*) _arch_configure="--with-arch=i486 --with-tune=generic --enable-cld";;
|
|
||||||
i586-*-*-*) _arch_configure="--with-arch=i586 --with-tune=generic --enable-cld";;
|
|
||||||
s390x-*-*-*) _arch_configure="--with-arch=z196 --with-tune=zEC12 --with-zarch --with-long-double-128 --enable-decimal-float";;
|
|
||||||
esac
|
|
||||||
|
|
||||||
case "$CTARGET_ARCH" in
|
|
||||||
mips*) _hash_style_configure="--with-linker-hash-style=sysv" ;;
|
|
||||||
*) _hash_style_configure="--with-linker-hash-style=gnu" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
case "$CTARGET_LIBC" in
|
|
||||||
musl)
|
|
||||||
# musl does not support mudflap, or libsanitizer
|
|
||||||
# libmpx uses secure_getenv and struct _libc_fpstate not present in musl
|
|
||||||
# alpine musl provides libssp_nonshared.a, so we don't need libssp either
|
|
||||||
_libc_configure="--disable-libssp --disable-libmpx --disable-libmudflap --disable-libsanitizer"
|
|
||||||
_symvers="--disable-symvers"
|
|
||||||
export libat_cv_have_ifunc=no
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
case "$BOOTSTRAP" in
|
|
||||||
nolibc) _bootstrap_configure="--with-newlib --disable-shared --enable-threads=no" ;;
|
|
||||||
*) _bootstrap_configure="--enable-shared --enable-threads --enable-tls" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
$LIBGOMP || _bootstrap_configure="$_bootstrap_configure --disable-libgomp"
|
|
||||||
$LIBATOMIC || _bootstrap_configure="$_bootstrap_configure --disable-libatomic"
|
|
||||||
$LIBITM || _bootstrap_configure="$_bootstrap_configure --disable-libitm"
|
|
||||||
$LIBQUADMATH || _arch_configure="$_arch_configure --disable-libquadmath"
|
|
||||||
|
|
||||||
msg "Building the following:"
|
|
||||||
echo ""
|
|
||||||
echo " CBUILD=$CBUILD"
|
|
||||||
echo " CHOST=$CHOST"
|
|
||||||
echo " CTARGET=$CTARGET"
|
|
||||||
echo " CTARGET_ARCH=$CTARGET_ARCH"
|
|
||||||
echo " CTARGET_LIBC=$CTARGET_LIBC"
|
|
||||||
echo " languages=$_languages"
|
|
||||||
echo " arch_configure=$_arch_configure"
|
|
||||||
echo " libc_configure=$_libc_configure"
|
|
||||||
echo " cross_configure=$_cross_configure"
|
|
||||||
echo " bootstrap_configure=$_bootstrap_configure"
|
|
||||||
echo " hash_style_configure=$_hash_style_configure"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
mkdir -p "$_builddir"
|
|
||||||
cd "$_builddir"
|
|
||||||
"$_gccdir"/configure --prefix=/usr \
|
|
||||||
--mandir=/usr/share/man \
|
|
||||||
--infodir=/usr/share/info \
|
|
||||||
--build=${CBUILD} \
|
|
||||||
--host=${CHOST} \
|
|
||||||
--target=${CTARGET} \
|
|
||||||
--with-pkgversion="Alpine ${pkgver}" \
|
|
||||||
--enable-checking=release \
|
|
||||||
--disable-fixed-point \
|
|
||||||
--disable-libstdcxx-pch \
|
|
||||||
--disable-multilib \
|
|
||||||
--disable-nls \
|
|
||||||
--disable-werror \
|
|
||||||
$_symvers \
|
|
||||||
--enable-__cxa_atexit \
|
|
||||||
--enable-default-pie \
|
|
||||||
--enable-cloog-backend \
|
|
||||||
--enable-languages=$_languages \
|
|
||||||
$_arch_configure \
|
|
||||||
$_libc_configure \
|
|
||||||
$_cross_configure \
|
|
||||||
$_bootstrap_configure \
|
|
||||||
--with-system-zlib \
|
|
||||||
$_hash_style_configure
|
|
||||||
make
|
|
||||||
}
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cd "$_builddir"
|
|
||||||
make -j1 DESTDIR="${pkgdir}" install
|
|
||||||
|
|
||||||
ln -s gcc "$pkgdir"/usr/bin/cc
|
|
||||||
|
|
||||||
# we dont support gcj -static
|
|
||||||
# and saving 35MB is not bad.
|
|
||||||
find "$pkgdir" -name libgcj.a -o -name libgtkpeer.a \
|
|
||||||
-o -name libgjsmalsa.a -o -name libgcj-tools.a \
|
|
||||||
-o -name libjvm.a -o -name libgij.a -o -name libgcj_bc.a \
|
|
||||||
-o -name libjavamath.a \
|
|
||||||
| xargs rm -f
|
|
||||||
|
|
||||||
# strip debug info from some static libs
|
|
||||||
${STRIP_FOR_TARGET} -g `find "$pkgdir" \( -name libgfortran.a -o -name libobjc.a -o -name libgomp.a \
|
|
||||||
-o -name libmudflap.a -o -name libmudflapth.a \
|
|
||||||
-o -name libgcc.a -o -name libgcov.a -o -name libquadmath.a \
|
|
||||||
-o -name libitm.a -o -name libgo.a -o -name libcaf\*.a \
|
|
||||||
-o -name libatomic.a -o -name libasan.a -o -name libtsan.a \) \
|
|
||||||
-a -type f`
|
|
||||||
|
|
||||||
if $LANG_JAVA; then
|
|
||||||
sed -i -e 's/lib: /&%{static:%eJava programs cannot be linked statically}/' \
|
|
||||||
"$pkgdir"/usr/lib/libgcj.spec
|
|
||||||
fi
|
|
||||||
|
|
||||||
if $LIBGOMP; then
|
|
||||||
mv "$pkgdir"/usr/lib/libgomp.spec "$pkgdir"/$_gcclibdir
|
|
||||||
fi
|
|
||||||
if $LIBITM; then
|
|
||||||
mv "$pkgdir"/usr/lib/libitm.spec "$pkgdir"/$_gcclibdir
|
|
||||||
fi
|
|
||||||
|
|
||||||
# remove ffi
|
|
||||||
rm -f "$pkgdir"/usr/lib/libffi* "$pkgdir"/usr/share/man/man3/ffi*
|
|
||||||
find "$pkgdir" -name 'ffi*.h' | xargs rm -f
|
|
||||||
|
|
||||||
local gdblib=${_target:+$CTARGET/}lib
|
|
||||||
for i in $(find "$pkgdir"/usr/$gdblib/ -type f -maxdepth 1 -name "*-gdb.py" ); do
|
|
||||||
mkdir -p "$pkgdir"/usr/share/gdb/python/auto-load/usr/$gdblib
|
|
||||||
mv "$i" "$pkgdir"/usr/share/gdb/python/auto-load/usr/$gdblib/
|
|
||||||
done
|
|
||||||
|
|
||||||
paxmark -pmrs "$pkgdir"/$_gcclibexec/cc1
|
|
||||||
|
|
||||||
# move ada runtime libs
|
|
||||||
if $LANG_ADA; then
|
|
||||||
for i in $(find "$pkgdir"/$_gcclibdir/adalib/ -type f -maxdepth 1 -name "libgna*.so"); do
|
|
||||||
mv "$i" "$pkgdir"/usr/lib/
|
|
||||||
ln -s ../../../../${i##*/} $i
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$CHOST" != "$CTARGET" ]; then
|
|
||||||
# cross-gcc: remove any files that would conflict with the
|
|
||||||
# native gcc package
|
|
||||||
rm -rf "$pkgdir"/usr/bin/cc "$pkgdir"/usr/include "$pkgdir"/usr/share
|
|
||||||
# libcc1 does not depend on target, don't ship it
|
|
||||||
rm -rf "$pkgdir"/usr/lib/libcc1.so*
|
|
||||||
|
|
||||||
# fixup gcc library symlinks to be linker scripts so
|
|
||||||
# linker finds the libs from relocated sysroot
|
|
||||||
for so in "$pkgdir"/usr/$CTARGET/lib/*.so; do
|
|
||||||
if [ -h "$so" ]; then
|
|
||||||
local _real=$(basename $(readlink "$so"))
|
|
||||||
rm -f "$so"
|
|
||||||
echo "GROUP ($_real)" > "$so"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
else
|
|
||||||
# add c89/c99 wrapper scripts
|
|
||||||
cat >"$pkgdir"/usr/bin/c89 <<'EOF'
|
|
||||||
#!/bin/sh
|
|
||||||
fl="-std=c89"
|
|
||||||
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 gcc $fl ${1+"$@"}
|
|
||||||
EOF
|
|
||||||
cat >"$pkgdir"/usr/bin/c99 <<'EOF'
|
|
||||||
#!/bin/sh
|
|
||||||
fl="-std=c99"
|
|
||||||
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 gcc $fl ${1+"$@"}
|
|
||||||
EOF
|
|
||||||
chmod 755 "$pkgdir"/usr/bin/c?9
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
libatomic() {
|
|
||||||
pkgdesc="GCC Atomic library"
|
|
||||||
depends=
|
|
||||||
replaces="gcc"
|
|
||||||
|
|
||||||
mkdir -p "$subpkgdir"/usr/lib
|
|
||||||
mv "$pkgdir"/usr/${_target:+$CTARGET/}lib/libatomic.so.* "$subpkgdir"/usr/lib/
|
|
||||||
}
|
|
||||||
|
|
||||||
libcxx() {
|
|
||||||
pkgdesc="GNU C++ standard runtime library"
|
|
||||||
depends=
|
|
||||||
|
|
||||||
mkdir -p "$subpkgdir"/usr/lib
|
|
||||||
mv "$pkgdir"/usr/${_target:+$CTARGET/}lib/libstdc++.so.* "$subpkgdir"/usr/lib/
|
|
||||||
}
|
|
||||||
|
|
||||||
gpp() {
|
|
||||||
pkgdesc="GNU C++ standard library and compiler"
|
|
||||||
depends="libstdc++=$_gccrel gcc=$_gccrel libc-dev"
|
|
||||||
mkdir -p "$subpkgdir/$_gcclibexec" \
|
|
||||||
"$subpkgdir"/usr/bin \
|
|
||||||
"$subpkgdir"/usr/${_target:+$CTARGET/}include \
|
|
||||||
"$subpkgdir"/usr/${_target:+$CTARGET/}lib \
|
|
||||||
|
|
||||||
mv "$pkgdir/$_gcclibexec/cc1plus" "$subpkgdir/$_gcclibexec/"
|
|
||||||
paxmark -pmrs "$subpkgdir/$_gcclibexec/cc1plus"
|
|
||||||
|
|
||||||
mv "$pkgdir"/usr/${_target:+$CTARGET/}lib/*++* "$subpkgdir"/usr/${_target:+$CTARGET/}lib/
|
|
||||||
mv "$pkgdir"/usr/${_target:+$CTARGET/}include/c++ "$subpkgdir"/usr/${_target:+$CTARGET/}include/
|
|
||||||
mv "$pkgdir"/usr/bin/*++ "$subpkgdir"/usr/bin/
|
|
||||||
}
|
|
||||||
|
|
||||||
libobjc() {
|
|
||||||
pkgdesc="GNU Objective-C runtime"
|
|
||||||
replaces="objc"
|
|
||||||
depends=
|
|
||||||
mkdir -p "$subpkgdir"/usr/lib
|
|
||||||
mv "$pkgdir"/usr/${_target:+$CTARGET/}lib/libobjc.so.* "$subpkgdir"/usr/lib/
|
|
||||||
}
|
|
||||||
|
|
||||||
objc() {
|
|
||||||
pkgdesc="GNU Objective-C"
|
|
||||||
replaces="gcc"
|
|
||||||
depends="libc-dev gcc=$_gccrel libobjc=$_gccrel"
|
|
||||||
|
|
||||||
mkdir -p "$subpkgdir"/$_gcclibdir/include \
|
|
||||||
"$subpkgdir"/usr/lib
|
|
||||||
mv "$pkgdir"/$_gcclibdir/include/objc "$subpkgdir"/$_gcclibdir/include/
|
|
||||||
mv "$pkgdir"/usr/lib/libobjc.so "$pkgdir"/usr/lib/libobjc.a \
|
|
||||||
"$subpkgdir"/usr/lib/
|
|
||||||
}
|
|
||||||
|
|
||||||
libgcc() {
|
|
||||||
pkgdesc="GNU C compiler runtime libraries"
|
|
||||||
depends=
|
|
||||||
|
|
||||||
mkdir -p "$subpkgdir"/usr/lib
|
|
||||||
mv "$pkgdir"/usr/${_target:+$CTARGET/}lib/libgcc_s.so.* "$subpkgdir"/usr/lib/
|
|
||||||
}
|
|
||||||
|
|
||||||
libgomp() {
|
|
||||||
pkgdesc="GCC shared-memory parallel programming API library"
|
|
||||||
depends=
|
|
||||||
replaces="gcc"
|
|
||||||
|
|
||||||
mkdir -p "$subpkgdir"/usr/lib
|
|
||||||
mv "$pkgdir"/usr/${_target:+$CTARGET/}lib/libgomp.so.* "$subpkgdir"/usr/lib/
|
|
||||||
}
|
|
||||||
|
|
||||||
java() {
|
|
||||||
pkgdesc="Java support for GCC"
|
|
||||||
depends="zlib-dev gcc=$_gccrel libgcj=$_gccrel"
|
|
||||||
|
|
||||||
paxmark -pm "$pkgdir"/$_gcclibexec/ecj1
|
|
||||||
mkdir -p "$subpkgdir"/usr/bin "$subpkgdir"/usr/lib "$subpkgdir"/$_gcclibdir/
|
|
||||||
cd "$pkgdir"/usr/bin
|
|
||||||
mv gcj gcj-dbtool gjavah gcjh jcf-dump "$subpkgdir"/usr/bin/
|
|
||||||
cd "$pkgdir"
|
|
||||||
for i in $(find usr/ -name ecj1 -o -name jc1 -o -name jvgenmain); do
|
|
||||||
mkdir -p "$subpkgdir"/${i%/*}
|
|
||||||
mv "$pkgdir"/$i "$subpkgdir"/$i
|
|
||||||
done
|
|
||||||
for i in "$pkgdir"/usr/lib/libgcj*.so; do
|
|
||||||
if [ -L "$i" ]; then
|
|
||||||
mv "$i" "$subpkgdir"/usr/lib/
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
mv "$pkgdir"/usr/lib/libgij.so "$subpkgdir"/usr/lib/
|
|
||||||
mv "$pkgdir"/usr/lib/libgcj.spec "$subpkgdir"/$_gcclibdir/
|
|
||||||
}
|
|
||||||
|
|
||||||
libgcj() {
|
|
||||||
pkgdesc="Java runtime library for gcc"
|
|
||||||
# libgcj_bc.so moved from gcc-java to libgcj
|
|
||||||
replaces="gcc-java"
|
|
||||||
depends=
|
|
||||||
|
|
||||||
mkdir -p "$subpkgdir"/usr/bin
|
|
||||||
cd "$pkgdir"/usr/bin
|
|
||||||
paxmark -pmse "$pkgdir"/usr/bin/gij
|
|
||||||
mv aot-compile gappletviewer gc-analyze gij gjar gjarsigner gkeytool\
|
|
||||||
gnative2ascii gorbd grmic grmid grmiregistry gserialver \
|
|
||||||
gtnameserv jv-convert rebuild-gcj-db \
|
|
||||||
"$subpkgdir"/usr/bin/
|
|
||||||
cd "$pkgdir"
|
|
||||||
for i in $(find usr/lib -name jc1 -o -name jvgenmain); do
|
|
||||||
mkdir -p "$subpkgdir"/${i%/*}
|
|
||||||
mv "$pkgdir"/$i "$subpkgdir"/$i
|
|
||||||
done
|
|
||||||
mkdir -p "$subpkgdir"/usr/lib
|
|
||||||
mv "$pkgdir"/usr/lib/gcj-* \
|
|
||||||
"$pkgdir"/usr/lib/libgcj_bc.so \
|
|
||||||
"$pkgdir"/usr/lib/libgcj*.so.* \
|
|
||||||
"$pkgdir"/usr/lib/libgij.so.* \
|
|
||||||
"$pkgdir"/usr/lib/logging.properties \
|
|
||||||
"$pkgdir"/usr/lib/security \
|
|
||||||
"$subpkgdir"/usr/lib/
|
|
||||||
|
|
||||||
mkdir -p "$subpkgdir"/usr/share/
|
|
||||||
mv "$pkgdir"/usr/share/java "$subpkgdir"/usr/share/
|
|
||||||
}
|
|
||||||
|
|
||||||
libgo() {
|
|
||||||
pkgdesc="Go runtime library for GCC"
|
|
||||||
depends=
|
|
||||||
|
|
||||||
mkdir -p "$subpkgdir"/usr/lib
|
|
||||||
mv "$pkgdir"/usr/lib/libgo.so.* "$subpkgdir"/usr/lib/
|
|
||||||
}
|
|
||||||
|
|
||||||
go() {
|
|
||||||
pkgdesc="Go support for GCC"
|
|
||||||
depends="gcc=$_gccrel libgo=$_gccrel"
|
|
||||||
|
|
||||||
mkdir -p "$subpkgdir"/$_gcclibexec \
|
|
||||||
"$subpkgdir"/usr/lib \
|
|
||||||
"$subpkgdir"/usr/bin
|
|
||||||
mv "$pkgdir"/usr/lib/go "$subpkgdir"/usr/lib/
|
|
||||||
mv "$pkgdir"/usr/bin/*gccgo "$subpkgdir"/usr/bin/
|
|
||||||
mv "$pkgdir"/$_gcclibexec/go1 "$subpkgdir"/$_gcclibexec/
|
|
||||||
mv "$pkgdir"/usr/lib/libgo.a \
|
|
||||||
"$pkgdir"/usr/lib/libgo.so \
|
|
||||||
"$pkgdir"/usr/lib/libgobegin.a \
|
|
||||||
"$subpkgdir"/usr/lib/
|
|
||||||
}
|
|
||||||
|
|
||||||
libgfortran() {
|
|
||||||
pkgdesc="Fortran runtime library for GCC"
|
|
||||||
depends=
|
|
||||||
|
|
||||||
mkdir -p "$subpkgdir"/usr/lib
|
|
||||||
mv "$pkgdir"/usr/lib/libgfortran.so.* "$subpkgdir"/usr/lib/
|
|
||||||
}
|
|
||||||
|
|
||||||
libquadmath() {
|
|
||||||
replaces="gcc"
|
|
||||||
pkgdesc="128-bit math library for GCC"
|
|
||||||
depends=
|
|
||||||
|
|
||||||
mkdir -p "$subpkgdir"/usr/lib
|
|
||||||
mv "$pkgdir"/usr/lib/libquadmath.so.* "$subpkgdir"/usr/lib/
|
|
||||||
}
|
|
||||||
|
|
||||||
gfortran() {
|
|
||||||
pkgdesc="GNU Fortran Compiler"
|
|
||||||
depends="gcc=$_gccrel libgfortran=$_gccrel"
|
|
||||||
$LIBQUADMATH && depends="$depends libquadmath=$_gccrel"
|
|
||||||
replaces="gcc"
|
|
||||||
|
|
||||||
mkdir -p "$subpkgdir"/$_gcclibexec \
|
|
||||||
"$subpkgdir"/$_gcclibdir \
|
|
||||||
"$subpkgdir"/usr/lib \
|
|
||||||
"$subpkgdir"/usr/bin
|
|
||||||
mv "$pkgdir"/usr/bin/*gfortran "$subpkgdir"/usr/bin/
|
|
||||||
mv "$pkgdir"/usr/lib/libgfortran.a \
|
|
||||||
"$pkgdir"/usr/lib/libgfortran.so \
|
|
||||||
"$subpkgdir"/usr/lib/
|
|
||||||
if $LIBQUADMATH; then
|
|
||||||
mv "$pkgdir"/usr/lib/libquadmath.a \
|
|
||||||
"$pkgdir"/usr/lib/libquadmath.so \
|
|
||||||
"$subpkgdir"/usr/lib/
|
|
||||||
fi
|
|
||||||
mv "$pkgdir"/$_gcclibexec/f951 "$subpkgdir"/$_gcclibexec
|
|
||||||
mv "$pkgdir"/usr/lib/libgfortran.spec "$subpkgdir"/$_gcclibdir
|
|
||||||
}
|
|
||||||
|
|
||||||
libgnat() {
|
|
||||||
pkgdesc="GNU Ada runtime shared libraries"
|
|
||||||
depends=
|
|
||||||
|
|
||||||
mkdir -p "$subpkgdir"/usr/lib
|
|
||||||
mv "$pkgdir"/usr/lib/libgna*.so "$subpkgdir"/usr/lib/
|
|
||||||
}
|
|
||||||
|
|
||||||
gnat() {
|
|
||||||
pkgdesc="Ada support for GCC"
|
|
||||||
depends="gcc=$_gccrel"
|
|
||||||
[ "$CHOST" = "$CTARGET" ] && depends="$depends libgnat=$_gccrel"
|
|
||||||
|
|
||||||
mkdir -p "$subpkgdir"/$_gcclibexec \
|
|
||||||
"$subpkgdir"/$_gcclibdir \
|
|
||||||
"$subpkgdir"/usr/bin
|
|
||||||
mv "$pkgdir"/$_gcclibexec/*gnat* "$subpkgdir"/$_gcclibexec/
|
|
||||||
mv "$pkgdir"/$_gcclibdir/*ada* "$subpkgdir"/$_gcclibdir/
|
|
||||||
mv "$pkgdir"/usr/bin/*gnat* "$subpkgdir"/usr/bin/
|
|
||||||
}
|
|
||||||
|
|
||||||
sha512sums="02c60e54527c7adf584798d5251f8a0b80c93d5deafce82501b2c28e6692e0bd783927bbfc4bc527a863c0cccc025150a34740a9e29badb02d4b48e56a8aba90 gcc-6.4.0.tar.xz
|
|
||||||
28f8c6fdbcb19e950b1d0bafb3bcc7a8cba87bc673aa6027cece116599cdee80f0cf5e95a1440544890239f5c754e8a93ab46d9daedd937faef445d7ea33b226 ecj-4.9.jar
|
|
||||||
a1335adc2fbee98e36c4437ff2587771b98ed4180726779020f65039498235626a411cdb0100dbd20cd19d12f0d94f9a21af179ff624676c28cead9d60598b5d 001_all_default-ssp-strong.patch
|
|
||||||
e36e95b81489163abd6fe9d58f7867bdca43e61143afacbfb17f4698c0b16ec5fd0061d8fab7b2ae615540bebd721c2e2227f80401b4e7fc253da9da62e6b513 002_all_default-relro.patch
|
|
||||||
f86466c62b8291fac46f9c250c7ad8fa5ab7b1cce2504442fd07ddc4543665b317ae28951f244e39aba29aeaf3fff252ec4f6a147aa16adb2b7aed747dd89188 003_all_default-fortify-source.patch
|
|
||||||
51282fea54c7e616367bbeb2479ba13fec6f24eb47bd04e2071907b3b36273b2ff24676f46ef8d22f241c8ab4857307861eee076eab66797c3a50a8ecaa1809a 005_all_default-as-needed.patch
|
|
||||||
3398386dd1e079d6545dd9799adc799c6b80e3984fac6899d0e1a7ee21b66d0c7e53cddf17a65d590c883db750f9f79aaedd857355a8b9f7fb9476c906237919 011_all_default-warn-format-security.patch
|
|
||||||
9adb0d2b9b67dd957df6c609b8714c7c078efb52cd88770905c37c67827be8fc83d1125037b9c29d77db21ce78756aa2bb0bacdb0b98d869ac126da76a298e21 012_all_default-warn-trampolines.patch
|
|
||||||
d35a3ac7e13a4446921a90e1ff3eec1079840c845f9d523c868e24ae21f94cf69ba041de5341ebef96432a6f57598e223381d4286e8fb8baaa25906707f29fbd 020_all_msgfmt-libstdc++-link.patch
|
|
||||||
840070a3c423e6206aaa6e63e1d9a0fcd6efd53626cd1240a193f0b60aa5d84216acc4a2a4fa8bce74549b07e6a316b01d638f20cea13dc62473491a302fb3d6 050_all_libiberty-asprintf.patch
|
|
||||||
0a0bc72b9366158f5d23fff1928e756fdd212433bac6ab1f00d632f241382820db8db5d475ddf11ea020eaf7e2e71b12fb9b1c3c870cf84adf6c2b16f15aabca 051_all_libiberty-pic.patch
|
|
||||||
e7a2eb1b1870e199d6fd753d065781575656fa12baa264f96c5d179689d88c31b8a3f92a5dae96088c05e96aa2bda138364ad7dbcc79e1819a102f192cbb7bab 053_all_libitm-no-fortify-source.patch
|
|
||||||
e87da18aa7ab92b02b06168658c63b42a6c73a08fad2a30f81ef6296100fdbe3c3a91548fd0cb24eaf591e862bb08e4b67249bc4b977b07da33523aee0c686bc 067_all_gcc-poison-system-directories.patch
|
|
||||||
4a328d1e1a56c20166307edcfa322068915784d9c08025b7f81cf69714da48fc266b6d34f77b9135c2f10da830d9df408276a1b78d1fd218637c2823506593c2 090_all_pr55930-dependency-tracking.patch
|
|
||||||
ef052d0c3c9642fcb5ed570069c5a49c8ef523c47ac8ce3f201a801766f72ae4ff7c3725a70ee66e52c0fb559621e35fe0cf5b88b901d71ceadd381f49653a08 201-cilkrts.patch
|
|
||||||
808e206f5e107084156fba333d4e091dcbd62f5d7756142bc292d4b0a52619f8c2aaca3617defc2f5b6552ba0439aebd33f4141329d88eab6ddf2dd637d92c08 203-libgcc_s.patch
|
|
||||||
fc0de05b36613b732a0222ea005c90653c6a40d6761b6894af2419272f4e74875f37e26af33a9b9940669ef89269c44c46d17ca5bcd54b5cd1176e5eaf2992c1 204-linux_libc_has_function.patch
|
|
||||||
98473bcaa77903a223ca9b0d2087c0921b287a2816d308cc32c8fe009e6cbf5dd1ae7fba27794ab8d9c09e117fe534413d91a464d1218474fc123ce0adfdc2c1 205-nopie.patch
|
|
||||||
3287d5b443bea8ec64132bcabe869c738ae98ea8f1a86df1c5d18c927f8816edbfcefeefc47792dbbb2bcacf50319af00e01b3735d34525913b64350770ad453 207-static-pie.patch
|
|
||||||
d08d7ead2de0429e5c9055d5b029ec2be9a8c821d22cecaf9b51f633652c493333f98963d9267fa2fa63850c50ae5eefd5f59e5910ec10d20044dac082182a8b libgcc-always-build-gcceh.a.patch
|
|
||||||
600fe5098dc54edaa9808fd5717af9dec058953f9ad37d49cfba1db4f7e9a7a8f02019342f75157fc575946fa693259422184de27b7ecc8386d9f3ecc0f7cc5d gcc-4.9-musl-fortify.patch
|
|
||||||
dbe0ee917fc7668571722364ab7c806731e3a31e8bfa30b4941b28b16b877d2a32b4a3897ef533399a28f82d43cac9b28e92de0493f0e779046db56584e07fa4 gcc-6.1-musl-libssp.patch
|
|
||||||
bda845a6aa1854d2c883910b115f79ccfa93dfc2b5eac69a3a236d83eb34cadc140731d616ffc24698c7abc8878dd15f231bcc5119f1860e575a120b311706c7 boehm-gc-musl.patch
|
|
||||||
fa62556719449caec6b2b434355bfbcaa5ae55ffe017b3e1f827f66a2aae21b79c571ee7a4ce723ea69169bc3a6447e73650991a200cc372adf2f102677518d7 gcc-pure64.patch
|
|
||||||
2253941f3d19b6d08801d3782f5f5ed56c3b73fbc9d3561a8f01c702963ac4fab91599c686076e7081eb6a80c37ccd33591ae978996d6eee1dc0ce0f1c50259a fix-gcj-stdgnu14-link.patch
|
|
||||||
f89ddeb21bc8f97e6a850a6b70b4501a8f3e49a4bc8cc82897488decda5d98ad01cb7f6c8b392d452e9579924a523bc75da6e0648c1c976d42e40af48b10343b fix-gcj-musl.patch
|
|
||||||
54d67cc008b735e47771314171930c5d8b8f5f5dc97fcf4214824c105c808f3e75d22d5a4fdf5068ed0457fa0d46c60cfb442e276259a4a5e9b8722a027d18e6 fix-gcj-iconv-musl.patch
|
|
||||||
abe9aaf9aa956058d0386a4396a511d176a46bb3906b90e952383646cdc158cbeb0a5dc616a1ccb1ca7d49fd0b5e351532aa15a3b13362abbf1ca4266f54a687 gcc-4.8-build-args.patch
|
|
||||||
35d6d59f0b7b968f282f56767c9e0823a7bdc5aa0d450aca50fbd802649a7ca608b47671244a3faa208a9b0d6832cabb5a22724157dc817b2c0ad63d09f93282 fix-cxxflags-passing.patch
|
|
||||||
9016b257abd8fa981de44a49512e35db814d1cbb47c1a87cd31c12d4ae20b13e9e149fe41691a7ec3c95bbcfde8a79194a8d2eaf547ceade3a246fad67c47dd8 ada-fixes.patch
|
|
||||||
3f5bc334d9f73d06f5f7c876738d02356acdd08958bea0e4d2095ebf15c2c2ec4e411abdae0297505ae9a1699ca01b17338e853184e84663203b192b0d35fc19 ada-shared.patch
|
|
||||||
631d4bdef6d8bde34df7978bb53ec28c3c909cf1f87139e5f148138d0f09adc58b41ecf0148bbf50fb4bc916c411e9bf8a2b6c046c75c0e77d754d8c35bcd4d7 ada-musl.patch
|
|
||||||
fa44c8158111627aa0e91c43e7cc3aa38642c2041c96532dd4f0932dae4d6f92ea2850b683abcf10e7e120299d42ea6b69adc00002a514c76be8e39e99fa052b ada-aarch64-multiarch.patch
|
|
||||||
4b4a0ff306a8ef34ff6e3284fbfca869012164a47ba7cb099085c1dd03e6ca0cdd462f82710e08c9a02895adc7484e4c5eef17b5aa264cf5d978fe8ad78eea93 300-main-gcc-add-musl-s390x-dynamic-linker.patch
|
|
||||||
385bc2fa50204f678964e5148c6170f572701dab920fbec8301f505bda34d182cde0adb7da042fee71719e12fb59f59181897f9b1bb4f4716ff59aad46ca1998 310-build-gcj-s390x.patch
|
|
||||||
f4ef08454e28c8732db69115e4998ec153399e8d229dd27f923dbdcf57b68128a65640d026cc7f45b58ba8764ab1eb575d4eb6d6dfc550a87a183f8b94e76181 320-libffi-gnulinux.patch
|
|
||||||
01c71cd5881fc07ea3b9b980697e89b3ca0fe98502958ceafc3fca18b2604c844e2f457feab711baf8e03f00a5383b0e38aac7eb954034e306f43d4a37f165ed fix-rs6000-pie.patch
|
|
||||||
34a818d5be67eb1f34e44a80b83c28a9b9c17d37fc9fac639f490d6bb5b53ebe3318140d09c236a17d7c98f5a7792ae3d6cefccda8067a5e942d6305b9d1f87c fix-linux-header-use-in-libgcc.patch
|
|
||||||
86be3338cc9c33089608bc4c5e3b7918c4e500a345c338f361b18c342119a6ed69af5495d72950de7106d760f003528b46ad14795e805f8a3331e206dcb234e3 gcc-pure64-mips.patch
|
|
||||||
508f3bca214d88531d739d761d07affc953689b1540905c73420b34c246e1e6b72588cf89f0e1462752633f8ddc88da8c0238be2a1b6e1c213829cecee7924cf ada-mips64.patch
|
|
||||||
7912964bf3a985e9f870250d6e068f715582a4fb04270849d697a50e6aad0cf50df3d483ff80a0eb777d9940fd85526dd8d0b85da9bc71a5f2fbc07616263866 0001-i386-Move-struct-ix86_frame-to-machine_function.patch
|
|
||||||
baa27a4b912d8e27cd65a556b09cf45289a0e00e86dae3925f2923d1f3752080e80d80e159c996ef4156c4df1dfc3069114810a846672170ef3ae461ae0ab7e1 0002-i386-Use-reference-of-struct-ix86_frame-to-avoid-cop.patch
|
|
||||||
6701d15000bdd7c4c98a8fece8c814f5e4e73603eecf84fe4dc5ac10f79b3074afba7c2cc9e51d08b2abade1c34cb0c944c08ead7a85db94e97158c752fd1aac 0003-i386-Use-const-reference-of-struct-ix86_frame-to-avo.patch
|
|
||||||
4e7e71ae57e232b29a6455ec977f60b47df1356eca0e85976ae2b4567c4c39541be9f10c30fe0085d69be5acdb61dff51d3e9d7af587c95d9cd2cb9ee307bd13 0004-x86-Add-mindirect-branch.patch
|
|
||||||
07f7fdbd9b4876f36ed7715a35a369dbaf1016f46c42a8935930cfcc9ea250de2dbe8113f077373ccce3c39cd728f957b6c4c7c6a7da299f160a4109f0bbe88d 0005-x86-Add-mfunction-return.patch
|
|
||||||
76ea947591e5241f8e6216ce337baaf1b5dfe3f02d8251f77a4acd70e2a5e7798e2867d70f452027f51a2e3baf1b5c94c3bffe9ef8e0a5ce24dc5d509adaf414 0006-x86-Add-mindirect-branch-register.patch
|
|
||||||
1c33c5cd34efb44d4fa0ace56e3d27ec802a66e03b08a29ab6122cbc70edbbe22313a34114437a41e09e0a6869af3cea3fb18f5bcb49db2f8e3f155026fe15f0 0007-x86-Add-V-register-operand-modifier.patch
|
|
||||||
5366e2cff0629304394bf35e9417c7faea6b6f3fc565d0410a17fdafcb2b30c9a218f8ca098274c09ca4c982ff5b178ad6df5bf464ec541aa086966915c7fe11 0008-x86-Disallow-mindirect-branch-mfunction-return-with-.patch
|
|
||||||
67c738b1f6afb09b6f0469c9cb282ab4d51fc8dd8e39df1cfdff8831788c1022081fccd446a482623f649898733aeaaa205cba0aa41162cdbdc74e57de9bb6eb 0009-Use-INVALID_REGNUM-in-indirect-thunk-processing.patch
|
|
||||||
b7b59f3203bf53168de2170b91738cd456f6ae205b3fe5bf8aacbaa8cc5624dd09c941ad8f1071d1ab8ab4fb5f69068a4bc792c0486fdec1ee2eb9c83688bb78 0010-i386-Pass-INVALID_REGNUM-as-invalid-register-number.patch
|
|
||||||
c53d4c5968865abb709ee8a9af9d57917d43ea3ba31ee8312f9e8f338e9b1b44babf5aa3414848da7267e5cf13a9261815eb9185dc153cbd41ee7ce5ea23d2d0 0011-i386-Update-mfunction-return-for-return-with-pop.patch
|
|
||||||
955080ba3e42cfe2f604e5dcef46aa6fca7c899c7808398947af655ff3b7954e30807ef85246986a5cc7db36dbc870db151e9fa8d8bc967b89ea56efdf64614c 0012-i386-Add-TARGET_INDIRECT_BRANCH_REGISTER.patch
|
|
||||||
3aae3a9cef8e8afe5a5433db8d9f410e1a2882481af01bb1d33232f987dbb74d7780c32be70b868bb391b3601b65ed3a16d777afea946f5eeaff72aa1e7fa3a9 0013-i386-Don-t-generate-alias-for-function-return-thunk.patch"
|
|
|
@ -1,16 +0,0 @@
|
||||||
--- gcc-6.4.0/gcc/ada/gcc-interface/Makefile.in.orig
|
|
||||||
+++ gcc-6.4.0/gcc/ada/gcc-interface/Makefile.in
|
|
||||||
@@ -2042,13 +2042,8 @@
|
|
||||||
system.ads<system-linux-x86_64.ads
|
|
||||||
## ^^ Note the above is a pretty-close placeholder.
|
|
||||||
|
|
||||||
- ifneq (,$(or $(filter aarch64-linux-gnu, $(shell $(GCC_FOR_TARGET) $(GNATLIBCFLAGS) -print-multiarch)), $(filter ../lib64, $(shell $(GCC_FOR_TARGET) $(GNATLIBCFLAGS) -print-multi-os-directory))))
|
|
||||||
LIBGNAT_TARGET_PAIRS = \
|
|
||||||
$(LIBGNAT_TARGET_PAIRS_COMMON) $(LIBGNAT_TARGET_PAIRS_64)
|
|
||||||
- else
|
|
||||||
- LIBGNAT_TARGET_PAIRS = \
|
|
||||||
- $(LIBGNAT_TARGET_PAIRS_COMMON) $(LIBGNAT_TARGET_PAIRS_32)
|
|
||||||
- endif
|
|
||||||
|
|
||||||
TOOLS_TARGET_PAIRS = \
|
|
||||||
mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
|
|
|
@ -1,35 +0,0 @@
|
||||||
--- gcc-6.1.0.orig/gcc/ada/cal.c
|
|
||||||
+++ gcc-6.1.0/gcc/ada/cal.c
|
|
||||||
@@ -49,6 +49,7 @@
|
|
||||||
#include <time.h>
|
|
||||||
#else
|
|
||||||
#include <sys/time.h>
|
|
||||||
+#include <time.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __MINGW32__
|
|
||||||
--- gcc-6.1.0.orig/gcc/ada/terminals.c
|
|
||||||
+++ gcc-6.1.0/gcc/ada/terminals.c
|
|
||||||
@@ -1068,13 +1068,6 @@
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
-/* On some system termio is either absent or including it will disable termios
|
|
||||||
- (HP-UX) */
|
|
||||||
-#if !defined (__hpux__) && !defined (BSD) && !defined (__APPLE__) \
|
|
||||||
- && !defined (__rtems__)
|
|
||||||
-# include <termio.h>
|
|
||||||
-#endif
|
|
||||||
-
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <termios.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
@@ -1169,7 +1162,7 @@
|
|
||||||
char *slave_name = NULL;
|
|
||||||
|
|
||||||
#ifdef USE_GETPT
|
|
||||||
- master_fd = getpt ();
|
|
||||||
+ master_fd = posix_openpt (O_RDWR);
|
|
||||||
#elif defined (USE_OPENPTY)
|
|
||||||
status = openpty (&master_fd, &slave_fd, NULL, NULL, NULL);
|
|
||||||
#elif defined (USE_CLONE_DEVICE)
|
|
|
@ -1,224 +0,0 @@
|
||||||
From 5bbd6ca3755e2a199de98d2b270d8a6f616aa6a6 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nils Andreas Svee <me@lochnair.net>
|
|
||||||
Date: Thu, 21 Dec 2017 16:46:12 +0100
|
|
||||||
Subject: [PATCH] ada-mips64
|
|
||||||
|
|
||||||
---
|
|
||||||
gcc/ada/gcc-interface/Makefile.in | 29 ++++++--
|
|
||||||
gcc/ada/system-linux-mips64.ads | 147 ++++++++++++++++++++++++++++++++++++++
|
|
||||||
2 files changed, 171 insertions(+), 5 deletions(-)
|
|
||||||
create mode 100644 gcc/ada/system-linux-mips64.ads
|
|
||||||
|
|
||||||
diff --git a/gcc/ada/gcc-interface/Makefile.in b/gcc/ada/gcc-interface/Makefile.in
|
|
||||||
index 598b262d9..1844a6962 100644
|
|
||||||
--- a/gcc/ada/gcc-interface/Makefile.in
|
|
||||||
+++ b/gcc/ada/gcc-interface/Makefile.in
|
|
||||||
@@ -1854,9 +1854,9 @@ ifeq ($(strip $(filter-out cygwin% mingw32% pe,$(target_os))),)
|
|
||||||
LIBRARY_VERSION := $(LIB_VERSION)
|
|
||||||
endif
|
|
||||||
|
|
||||||
-# Mips Linux
|
|
||||||
-ifeq ($(strip $(filter-out mips linux%,$(target_cpu) $(target_os))),)
|
|
||||||
- LIBGNAT_TARGET_PAIRS = \
|
|
||||||
+# Mips and Mips64 Linux
|
|
||||||
+ifeq ($(strip $(filter-out mips mips64 linux%,$(target_cpu) $(target_os))),)
|
|
||||||
+ LIBGNAT_TARGET_PAIRS_COMMON = \
|
|
||||||
a-intnam.ads<a-intnam-linux.ads \
|
|
||||||
s-inmaop.adb<s-inmaop-posix.adb \
|
|
||||||
s-intman.adb<s-intman-posix.adb \
|
|
||||||
@@ -1867,10 +1867,29 @@ ifeq ($(strip $(filter-out mips linux%,$(target_cpu) $(target_os))),)
|
|
||||||
s-taprop.adb<s-taprop-linux.adb \
|
|
||||||
s-tasinf.ads<s-tasinf-linux.ads \
|
|
||||||
s-tasinf.adb<s-tasinf-linux.adb \
|
|
||||||
- s-taspri.ads<s-taspri-posix.ads \
|
|
||||||
+ s-taspri.ads<s-taspri-posix-noaltstack.ads \
|
|
||||||
s-tpopsp.adb<s-tpopsp-posix-foreign.adb \
|
|
||||||
+ g-sercom.adb<g-sercom-linux.adb
|
|
||||||
+
|
|
||||||
+ LIBGNAT_TARGET_PAIRS_32 = \
|
|
||||||
system.ads<system-linux-mips.ads
|
|
||||||
|
|
||||||
+ LIBGNAT_TARGET_PAIRS_64 = \
|
|
||||||
+ system.ads<system-linux-mips64.ads
|
|
||||||
+
|
|
||||||
+ ifeq ($(strip $(filter-out mips64,$(target_cpu))),)
|
|
||||||
+ LIBGNAT_TARGET_PAIRS = \
|
|
||||||
+ $(LIBGNAT_TARGET_PAIRS_COMMON) $(LIBGNAT_TARGET_PAIRS_64)
|
|
||||||
+ else
|
|
||||||
+ LIBGNAT_TARGET_PAIRS = \
|
|
||||||
+ $(LIBGNAT_TARGET_PAIRS_COMMON) $(LIBGNAT_TARGET_PAIRS_32)
|
|
||||||
+ endif
|
|
||||||
+
|
|
||||||
+ TOOLS_TARGET_PAIRS = \
|
|
||||||
+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
|
|
||||||
+ indepsw.adb<indepsw-gnu.adb
|
|
||||||
+
|
|
||||||
+ EXTRA_GNATRTL_TASKING_OBJS=s-linux.o
|
|
||||||
EH_MECHANISM=-gcc
|
|
||||||
THREADSLIB = -lpthread
|
|
||||||
GNATLIB_SHARED = gnatlib-shared-dual
|
|
||||||
@@ -1901,7 +1920,7 @@ ifeq ($(strip $(filter-out mipsel mips64el linux%,$(target_cpu) $(target_os))),)
|
|
||||||
LIBGNAT_TARGET_PAIRS_64 = \
|
|
||||||
system.ads<system-linux-mips64el.ads
|
|
||||||
|
|
||||||
- ifneq (,$(or $(filter mips64el%, $(shell $(GCC_FOR_TARGET) $(GNATLIBCFLAGS) -print-multiarch)), $(filter ../lib64, $(shell $(GCC_FOR_TARGET) $(GNATLIBCFLAGS) -print-multi-os-directory))))
|
|
||||||
+ ifeq ($(strip $(filter-out mips64el,$(target_cpu))),)
|
|
||||||
LIBGNAT_TARGET_PAIRS = \
|
|
||||||
$(LIBGNAT_TARGET_PAIRS_COMMON) $(LIBGNAT_TARGET_PAIRS_64)
|
|
||||||
else
|
|
||||||
diff --git a/gcc/ada/system-linux-mips64.ads b/gcc/ada/system-linux-mips64.ads
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000..054379acd
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/gcc/ada/system-linux-mips64.ads
|
|
||||||
@@ -0,0 +1,147 @@
|
|
||||||
+------------------------------------------------------------------------------
|
|
||||||
+-- --
|
|
||||||
+-- GNAT RUN-TIME COMPONENTS --
|
|
||||||
+-- --
|
|
||||||
+-- S Y S T E M --
|
|
||||||
+-- --
|
|
||||||
+-- S p e c --
|
|
||||||
+-- (GNU-Linux/MIPS64 Version) --
|
|
||||||
+-- --
|
|
||||||
+-- Copyright (C) 1992-2016, Free Software Foundation, Inc. --
|
|
||||||
+-- --
|
|
||||||
+-- This specification is derived from the Ada Reference Manual for use with --
|
|
||||||
+-- GNAT. The copyright notice above, and the license provisions that follow --
|
|
||||||
+-- apply solely to the contents of the part following the private keyword. --
|
|
||||||
+-- --
|
|
||||||
+-- GNAT is free software; you can redistribute it and/or modify it under --
|
|
||||||
+-- terms of the GNU General Public License as published by the Free Soft- --
|
|
||||||
+-- ware Foundation; either version 3, or (at your option) any later ver- --
|
|
||||||
+-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
|
|
||||||
+-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
|
|
||||||
+-- or FITNESS FOR A PARTICULAR PURPOSE. --
|
|
||||||
+-- --
|
|
||||||
+-- As a special exception under Section 7 of GPL version 3, you are granted --
|
|
||||||
+-- additional permissions described in the GCC Runtime Library Exception, --
|
|
||||||
+-- version 3.1, as published by the Free Software Foundation. --
|
|
||||||
+-- --
|
|
||||||
+-- You should have received a copy of the GNU General Public License and --
|
|
||||||
+-- a copy of the GCC Runtime Library Exception along with this program; --
|
|
||||||
+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
|
|
||||||
+-- <http://www.gnu.org/licenses/>. --
|
|
||||||
+-- --
|
|
||||||
+-- GNAT was originally developed by the GNAT team at New York University. --
|
|
||||||
+-- Extensive contributions were provided by Ada Core Technologies Inc. --
|
|
||||||
+-- --
|
|
||||||
+------------------------------------------------------------------------------
|
|
||||||
+
|
|
||||||
+package System is
|
|
||||||
+ pragma Pure;
|
|
||||||
+ -- Note that we take advantage of the implementation permission to make
|
|
||||||
+ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada
|
|
||||||
+ -- 2005, this is Pure in any case (AI-362).
|
|
||||||
+
|
|
||||||
+ pragma No_Elaboration_Code_All;
|
|
||||||
+ -- Allow the use of that restriction in units that WITH this unit
|
|
||||||
+
|
|
||||||
+ type Name is (SYSTEM_NAME_GNAT);
|
|
||||||
+ System_Name : constant Name := SYSTEM_NAME_GNAT;
|
|
||||||
+
|
|
||||||
+ -- System-Dependent Named Numbers
|
|
||||||
+
|
|
||||||
+ Min_Int : constant := Long_Long_Integer'First;
|
|
||||||
+ Max_Int : constant := Long_Long_Integer'Last;
|
|
||||||
+
|
|
||||||
+ Max_Binary_Modulus : constant := 2 ** Long_Long_Integer'Size;
|
|
||||||
+ Max_Nonbinary_Modulus : constant := Integer'Last;
|
|
||||||
+
|
|
||||||
+ Max_Base_Digits : constant := Long_Long_Float'Digits;
|
|
||||||
+ Max_Digits : constant := Long_Long_Float'Digits;
|
|
||||||
+
|
|
||||||
+ Max_Mantissa : constant := 63;
|
|
||||||
+ Fine_Delta : constant := 2.0 ** (-Max_Mantissa);
|
|
||||||
+
|
|
||||||
+ Tick : constant := 0.000_001;
|
|
||||||
+
|
|
||||||
+ -- Storage-related Declarations
|
|
||||||
+
|
|
||||||
+ type Address is private;
|
|
||||||
+ pragma Preelaborable_Initialization (Address);
|
|
||||||
+ Null_Address : constant Address;
|
|
||||||
+
|
|
||||||
+ Storage_Unit : constant := 8;
|
|
||||||
+ Word_Size : constant := 64;
|
|
||||||
+ Memory_Size : constant := 2 ** 64;
|
|
||||||
+
|
|
||||||
+ -- Address comparison
|
|
||||||
+
|
|
||||||
+ function "<" (Left, Right : Address) return Boolean;
|
|
||||||
+ function "<=" (Left, Right : Address) return Boolean;
|
|
||||||
+ function ">" (Left, Right : Address) return Boolean;
|
|
||||||
+ function ">=" (Left, Right : Address) return Boolean;
|
|
||||||
+ function "=" (Left, Right : Address) return Boolean;
|
|
||||||
+
|
|
||||||
+ pragma Import (Intrinsic, "<");
|
|
||||||
+ pragma Import (Intrinsic, "<=");
|
|
||||||
+ pragma Import (Intrinsic, ">");
|
|
||||||
+ pragma Import (Intrinsic, ">=");
|
|
||||||
+ pragma Import (Intrinsic, "=");
|
|
||||||
+
|
|
||||||
+ -- Other System-Dependent Declarations
|
|
||||||
+
|
|
||||||
+ type Bit_Order is (High_Order_First, Low_Order_First);
|
|
||||||
+ Default_Bit_Order : constant Bit_Order := High_Order_First;
|
|
||||||
+ pragma Warnings (Off, Default_Bit_Order); -- kill constant condition warning
|
|
||||||
+
|
|
||||||
+ -- Priority-related Declarations (RM D.1)
|
|
||||||
+
|
|
||||||
+ Max_Priority : constant Positive := 30;
|
|
||||||
+ Max_Interrupt_Priority : constant Positive := 31;
|
|
||||||
+
|
|
||||||
+ subtype Any_Priority is Integer range 0 .. 31;
|
|
||||||
+ subtype Priority is Any_Priority range 0 .. 30;
|
|
||||||
+ subtype Interrupt_Priority is Any_Priority range 31 .. 31;
|
|
||||||
+
|
|
||||||
+ Default_Priority : constant Priority := 15;
|
|
||||||
+
|
|
||||||
+private
|
|
||||||
+
|
|
||||||
+ type Address is mod Memory_Size;
|
|
||||||
+ Null_Address : constant Address := 0;
|
|
||||||
+
|
|
||||||
+ --------------------------------------
|
|
||||||
+ -- System Implementation Parameters --
|
|
||||||
+ --------------------------------------
|
|
||||||
+
|
|
||||||
+ -- These parameters provide information about the target that is used
|
|
||||||
+ -- by the compiler. They are in the private part of System, where they
|
|
||||||
+ -- can be accessed using the special circuitry in the Targparm unit
|
|
||||||
+ -- whose source should be consulted for more detailed descriptions
|
|
||||||
+ -- of the individual switch values.
|
|
||||||
+
|
|
||||||
+ Backend_Divide_Checks : constant Boolean := False;
|
|
||||||
+ Backend_Overflow_Checks : constant Boolean := True;
|
|
||||||
+ Command_Line_Args : constant Boolean := True;
|
|
||||||
+ Configurable_Run_Time : constant Boolean := False;
|
|
||||||
+ Denorm : constant Boolean := True;
|
|
||||||
+ Duration_32_Bits : constant Boolean := False;
|
|
||||||
+ Exit_Status_Supported : constant Boolean := True;
|
|
||||||
+ Fractional_Fixed_Ops : constant Boolean := False;
|
|
||||||
+ Frontend_Layout : constant Boolean := False;
|
|
||||||
+ Machine_Overflows : constant Boolean := False;
|
|
||||||
+ Machine_Rounds : constant Boolean := True;
|
|
||||||
+ Preallocated_Stacks : constant Boolean := False;
|
|
||||||
+ Signed_Zeros : constant Boolean := True;
|
|
||||||
+ Stack_Check_Default : constant Boolean := False;
|
|
||||||
+ Stack_Check_Probes : constant Boolean := True;
|
|
||||||
+ Stack_Check_Limits : constant Boolean := False;
|
|
||||||
+ Support_Aggregates : constant Boolean := True;
|
|
||||||
+ Support_Composite_Assign : constant Boolean := True;
|
|
||||||
+ Support_Composite_Compare : constant Boolean := True;
|
|
||||||
+ Support_Long_Shifts : constant Boolean := True;
|
|
||||||
+ Always_Compatible_Rep : constant Boolean := False;
|
|
||||||
+ Suppress_Standard_Library : constant Boolean := False;
|
|
||||||
+ Use_Ada_Main_Program_Name : constant Boolean := False;
|
|
||||||
+ Frontend_Exceptions : constant Boolean := False;
|
|
||||||
+ ZCX_By_Default : constant Boolean := True;
|
|
||||||
+
|
|
||||||
+end System;
|
|
||||||
--
|
|
||||||
2.15.1
|
|
||||||
|
|
|
@ -1,137 +0,0 @@
|
||||||
diff -rup gcc-5.1.0/gcc.orig/ada/adaint.c gcc-5.1.0/gcc/ada/adaint.c
|
|
||||||
--- gcc-5.1.0/gcc.orig/ada/adaint.c 2015-02-20 11:48:57.000000000 +0000
|
|
||||||
+++ gcc-5.1.0/gcc/ada/adaint.c 2015-06-02 10:47:51.672767476 +0000
|
|
||||||
@@ -70,6 +70,11 @@
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/pstat.h>
|
|
||||||
#endif
|
|
||||||
+
|
|
||||||
+#if defined (linux)
|
|
||||||
+#define _GNU_SOURCE 1
|
|
||||||
+#include <sched.h>
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
#ifdef __PikeOS__
|
|
||||||
#define __BSD_VISIBLE 1
|
|
||||||
@@ -3057,8 +3062,6 @@ __gnat_lwp_self (void)
|
|
||||||
return (void *) syscall (__NR_gettid);
|
|
||||||
}
|
|
||||||
|
|
||||||
-#include <sched.h>
|
|
||||||
-
|
|
||||||
/* glibc versions earlier than 2.7 do not define the routines to handle
|
|
||||||
dynamically allocated CPU sets. For these targets, we use the static
|
|
||||||
versions. */
|
|
||||||
@@ -3067,7 +3070,7 @@ __gnat_lwp_self (void)
|
|
||||||
|
|
||||||
/* Dynamic cpu sets */
|
|
||||||
|
|
||||||
-cpu_set_t *
|
|
||||||
+void *
|
|
||||||
__gnat_cpu_alloc (size_t count)
|
|
||||||
{
|
|
||||||
return CPU_ALLOC (count);
|
|
||||||
@@ -3080,33 +3083,33 @@ __gnat_cpu_alloc_size (size_t count)
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
-__gnat_cpu_free (cpu_set_t *set)
|
|
||||||
+__gnat_cpu_free (void *set)
|
|
||||||
{
|
|
||||||
- CPU_FREE (set);
|
|
||||||
+ CPU_FREE ((cpu_set_t *) set);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
-__gnat_cpu_zero (size_t count, cpu_set_t *set)
|
|
||||||
+__gnat_cpu_zero (size_t count, void *set)
|
|
||||||
{
|
|
||||||
- CPU_ZERO_S (count, set);
|
|
||||||
+ CPU_ZERO_S (count, (cpu_set_t *) set);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
-__gnat_cpu_set (int cpu, size_t count, cpu_set_t *set)
|
|
||||||
+__gnat_cpu_set (int cpu, size_t count, void *set)
|
|
||||||
{
|
|
||||||
/* Ada handles CPU numbers starting from 1, while C identifies the first
|
|
||||||
CPU by a 0, so we need to adjust. */
|
|
||||||
- CPU_SET_S (cpu - 1, count, set);
|
|
||||||
+ CPU_SET_S (cpu - 1, count, (cpu_set_t *) set);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* !CPU_ALLOC */
|
|
||||||
|
|
||||||
/* Static cpu sets */
|
|
||||||
|
|
||||||
-cpu_set_t *
|
|
||||||
+void *
|
|
||||||
__gnat_cpu_alloc (size_t count ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
- return (cpu_set_t *) xmalloc (sizeof (cpu_set_t));
|
|
||||||
+ return xmalloc (sizeof (cpu_set_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t
|
|
||||||
@@ -3116,23 +3119,23 @@ __gnat_cpu_alloc_size (size_t count ATTR
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
-__gnat_cpu_free (cpu_set_t *set)
|
|
||||||
+__gnat_cpu_free (void *set)
|
|
||||||
{
|
|
||||||
free (set);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
-__gnat_cpu_zero (size_t count ATTRIBUTE_UNUSED, cpu_set_t *set)
|
|
||||||
+__gnat_cpu_zero (size_t count ATTRIBUTE_UNUSED, void *set)
|
|
||||||
{
|
|
||||||
- CPU_ZERO (set);
|
|
||||||
+ CPU_ZERO ((cpu_set_t *) set);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
-__gnat_cpu_set (int cpu, size_t count ATTRIBUTE_UNUSED, cpu_set_t *set)
|
|
||||||
+__gnat_cpu_set (int cpu, size_t count ATTRIBUTE_UNUSED, void *set)
|
|
||||||
{
|
|
||||||
/* Ada handles CPU numbers starting from 1, while C identifies the first
|
|
||||||
CPU by a 0, so we need to adjust. */
|
|
||||||
- CPU_SET (cpu - 1, set);
|
|
||||||
+ CPU_SET (cpu - 1, (cpu_set_t *) set);
|
|
||||||
}
|
|
||||||
#endif /* !CPU_ALLOC */
|
|
||||||
#endif /* linux */
|
|
||||||
diff -rup gcc-5.1.0/gcc.orig/ada/adaint.h gcc-5.1.0/gcc/ada/adaint.h
|
|
||||||
--- gcc-5.1.0/gcc.orig/ada/adaint.h 2015-01-27 17:20:27.000000000 +0000
|
|
||||||
+++ gcc-5.1.0/gcc/ada/adaint.h 2015-06-02 10:47:23.188910894 +0000
|
|
||||||
@@ -287,13 +287,11 @@ extern void *__gnat_lwp_self (voi
|
|
||||||
|
|
||||||
/* Routines for interface to required CPU set primitives */
|
|
||||||
|
|
||||||
-#include <sched.h>
|
|
||||||
-
|
|
||||||
-extern cpu_set_t *__gnat_cpu_alloc (size_t);
|
|
||||||
+extern void * __gnat_cpu_alloc (size_t);
|
|
||||||
extern size_t __gnat_cpu_alloc_size (size_t);
|
|
||||||
-extern void __gnat_cpu_free (cpu_set_t *);
|
|
||||||
-extern void __gnat_cpu_zero (size_t, cpu_set_t *);
|
|
||||||
-extern void __gnat_cpu_set (int, size_t, cpu_set_t *);
|
|
||||||
+extern void __gnat_cpu_free (void *);
|
|
||||||
+extern void __gnat_cpu_zero (size_t, void *);
|
|
||||||
+extern void __gnat_cpu_set (int, size_t, void *);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (_WIN32)
|
|
||||||
diff -rup gcc-5.1.0/gcc.orig/ada/gcc-interface/Makefile.in gcc-5.1.0/gcc/ada/gcc-interface/Makefile.in
|
|
||||||
--- gcc-5.1.0/gcc.orig/ada/gcc-interface/Makefile.in 2015-04-09 20:29:28.000000000 +0000
|
|
||||||
+++ gcc-5.1.0/gcc/ada/gcc-interface/Makefile.in 2015-06-02 10:47:23.188910894 +0000
|
|
||||||
@@ -1910,7 +1910,7 @@ ifeq ($(strip $(filter-out powerpc% linu
|
|
||||||
endif
|
|
||||||
|
|
||||||
# ARM linux, GNU eabi
|
|
||||||
-ifeq ($(strip $(filter-out arm% linux-gnueabi%,$(target_cpu) $(target_os))),)
|
|
||||||
+ifeq ($(strip $(filter-out arm% linux-gnueabi% linux-musleabi% linux-muslgnueabi%,$(target_cpu) $(target_os))),)
|
|
||||||
LIBGNAT_TARGET_PAIRS = \
|
|
||||||
a-intnam.ads<a-intnam-linux.ads \
|
|
||||||
s-inmaop.adb<s-inmaop-posix.adb \
|
|
|
@ -1,30 +0,0 @@
|
||||||
Index: b/gcc/ada/link.c
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/ada/link.c
|
|
||||||
+++ b/gcc/ada/link.c
|
|
||||||
@@ -105,9 +105,9 @@
|
|
||||||
|
|
||||||
#elif defined (__FreeBSD__)
|
|
||||||
const char *__gnat_object_file_option = "-Wl,@";
|
|
||||||
-const char *__gnat_run_path_option = "-Wl,-rpath,";
|
|
||||||
-char __gnat_shared_libgnat_default = STATIC;
|
|
||||||
-char __gnat_shared_libgcc_default = STATIC;
|
|
||||||
+const char *__gnat_run_path_option = "";
|
|
||||||
+char __gnat_shared_libgnat_default = SHARED;
|
|
||||||
+char __gnat_shared_libgcc_default = SHARED;
|
|
||||||
int __gnat_link_max = 8192;
|
|
||||||
unsigned char __gnat_objlist_file_supported = 1;
|
|
||||||
const char *__gnat_object_library_extension = ".a";
|
|
||||||
@@ -127,9 +127,9 @@
|
|
||||||
|
|
||||||
#elif defined (linux) || defined(__GLIBC__)
|
|
||||||
const char *__gnat_object_file_option = "-Wl,@";
|
|
||||||
-const char *__gnat_run_path_option = "-Wl,-rpath,";
|
|
||||||
-char __gnat_shared_libgnat_default = STATIC;
|
|
||||||
-char __gnat_shared_libgcc_default = STATIC;
|
|
||||||
+const char *__gnat_run_path_option = "";
|
|
||||||
+char __gnat_shared_libgnat_default = SHARED;
|
|
||||||
+char __gnat_shared_libgcc_default = SHARED;
|
|
||||||
int __gnat_link_max = 8192;
|
|
||||||
unsigned char __gnat_objlist_file_supported = 1;
|
|
||||||
const char *__gnat_object_library_extension = ".a";
|
|
|
@ -1,62 +0,0 @@
|
||||||
--- gcc-4.8.1/boehm-gc/os_dep.c.orig 2013-09-17 07:46:00.969884340 +0000
|
|
||||||
+++ gcc-4.8.1/boehm-gc/os_dep.c 2013-09-17 06:53:53.629884946 +0000
|
|
||||||
@@ -26,7 +26,7 @@
|
|
||||||
# define __KERNEL__
|
|
||||||
# include <asm/signal.h>
|
|
||||||
# undef __KERNEL__
|
|
||||||
-# else
|
|
||||||
+# elif defined(__GLIBC__)
|
|
||||||
/* Kernels prior to 2.1.1 defined struct sigcontext_struct instead of */
|
|
||||||
/* struct sigcontext. libc6 (glibc2) uses "struct sigcontext" in */
|
|
||||||
/* prototypes, so we have to include the top-level sigcontext.h to */
|
|
||||||
--- gcc-4.8.2/boehm-gc/dyn_load.c.orig 2014-02-17 14:13:09.519850231 +0200
|
|
||||||
+++ gcc-4.8.2/boehm-gc/dyn_load.c 2014-02-17 14:14:27.906093514 +0200
|
|
||||||
@@ -459,9 +459,7 @@
|
|
||||||
/* For glibc 2.2.4+. Unfortunately, it doesn't work for older */
|
|
||||||
/* versions. Thanks to Jakub Jelinek for most of the code. */
|
|
||||||
|
|
||||||
-# if (defined(LINUX) || defined (__GLIBC__)) /* Are others OK here, too? */ \
|
|
||||||
- && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) \
|
|
||||||
- || (__GLIBC__ == 2 && __GLIBC_MINOR__ == 2 && defined(DT_CONFIG)))
|
|
||||||
+# if (defined(LINUX) || defined (__GLIBC__))
|
|
||||||
|
|
||||||
/* We have the header files for a glibc that includes dl_iterate_phdr. */
|
|
||||||
/* It may still not be available in the library on the target system. */
|
|
||||||
--- gcc-4.8.2/boehm-gc/include/private/gcconfig.h.orig 2014-02-17 14:14:36.026049422 +0200
|
|
||||||
+++ gcc-4.8.2/boehm-gc/include/private/gcconfig.h 2014-02-17 14:17:11.345207887 +0200
|
|
||||||
@@ -684,7 +684,7 @@
|
|
||||||
# ifdef __ELF__
|
|
||||||
# define DYNAMIC_LOADING
|
|
||||||
# include <features.h>
|
|
||||||
-# if defined(__GLIBC__)&& __GLIBC__>=2
|
|
||||||
+# if 1
|
|
||||||
# define SEARCH_FOR_DATA_START
|
|
||||||
# else /* !GLIBC2 */
|
|
||||||
extern char **__environ;
|
|
||||||
@@ -1147,7 +1147,7 @@
|
|
||||||
# define DATASTART ((ptr_t)((((word) (_etext)) + 0xfff) & ~0xfff))
|
|
||||||
# endif
|
|
||||||
# include <features.h>
|
|
||||||
-# if defined(__GLIBC__) && __GLIBC__ >= 2
|
|
||||||
+# if 1
|
|
||||||
# define SEARCH_FOR_DATA_START
|
|
||||||
# else
|
|
||||||
extern char **__environ;
|
|
||||||
@@ -1367,7 +1367,7 @@
|
|
||||||
# define HBLKSIZE 4096
|
|
||||||
# endif
|
|
||||||
# define USE_GENERIC_PUSH_REGS
|
|
||||||
-# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 2 || __GLIBC__ > 2
|
|
||||||
+# if 1
|
|
||||||
# define LINUX_STACKBOTTOM
|
|
||||||
# else
|
|
||||||
# define STACKBOTTOM 0x80000000
|
|
||||||
@@ -1858,7 +1858,7 @@
|
|
||||||
# ifdef __ELF__
|
|
||||||
# define DYNAMIC_LOADING
|
|
||||||
# include <features.h>
|
|
||||||
-# if defined(__GLIBC__) && __GLIBC__ >= 2
|
|
||||||
+# if 1
|
|
||||||
# define SEARCH_FOR_DATA_START
|
|
||||||
# else
|
|
||||||
extern char **__environ;
|
|
|
@ -1,10 +0,0 @@
|
||||||
--- gcc-4.8.1/Makefile.in.orig
|
|
||||||
+++ gcc-4.8.1/Makefile.in
|
|
||||||
@@ -169,6 +169,7 @@
|
|
||||||
# built for the build system to override those in BASE_FLAGS_TO_PASSS.
|
|
||||||
EXTRA_BUILD_FLAGS = \
|
|
||||||
CFLAGS="$(CFLAGS_FOR_BUILD)" \
|
|
||||||
+ CXXFLAGS="$(CXXFLAGS_FOR_BUILD)" \
|
|
||||||
LDFLAGS="$(LDFLAGS_FOR_BUILD)"
|
|
||||||
|
|
||||||
# This is the list of directories to built for the host system.
|
|
|
@ -1,120 +0,0 @@
|
||||||
--- gcc-4.8.2/libjava/gnu/gcj/convert/natIconv.cc.orig 2014-02-18 18:46:14.897880526 +0200
|
|
||||||
+++ gcc-4.8.2/libjava/gnu/gcj/convert/natIconv.cc 2014-02-18 18:50:08.766613550 +0200
|
|
||||||
@@ -24,6 +24,13 @@
|
|
||||||
|
|
||||||
#ifdef HAVE_ICONV
|
|
||||||
#include <iconv.h>
|
|
||||||
+#include <endian.h>
|
|
||||||
+
|
|
||||||
+#if __BYTE_ORDER == __BIG_ENDIAN
|
|
||||||
+#define UCS2_CHARSET "UCS-2BE"
|
|
||||||
+#else
|
|
||||||
+#define UCS2_CHARSET "UCS-2LE"
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
static inline size_t
|
|
||||||
@@ -45,7 +52,7 @@
|
|
||||||
_Jv_GetStringUTFRegion (encoding, 0, encoding->length(), buffer);
|
|
||||||
buffer[len] = '\0';
|
|
||||||
|
|
||||||
- iconv_t h = iconv_open ("UCS-2", buffer);
|
|
||||||
+ iconv_t h = iconv_open (UCS2_CHARSET, buffer);
|
|
||||||
if (h == (iconv_t) -1)
|
|
||||||
throw new ::java::io::UnsupportedEncodingException (encoding);
|
|
||||||
|
|
||||||
@@ -99,18 +106,6 @@
|
|
||||||
throw new ::java::io::CharConversionException ();
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (iconv_byte_swap)
|
|
||||||
- {
|
|
||||||
- size_t max = (old_out - outavail) / sizeof (jchar);
|
|
||||||
- for (size_t i = 0; i < max; ++i)
|
|
||||||
- {
|
|
||||||
- // Byte swap.
|
|
||||||
- jchar c = (((out[outpos + i] & 0xff) << 8)
|
|
||||||
- | ((out[outpos + i] >> 8) & 0xff));
|
|
||||||
- outbuf[i] = c;
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
inpos += old_in - inavail;
|
|
||||||
return (old_out - outavail) / sizeof (jchar);
|
|
||||||
#else /* HAVE_ICONV */
|
|
||||||
@@ -145,7 +140,7 @@
|
|
||||||
_Jv_GetStringUTFRegion (encoding, 0, encoding->length(), buffer);
|
|
||||||
buffer[len] = '\0';
|
|
||||||
|
|
||||||
- iconv_t h = iconv_open (buffer, "UCS-2");
|
|
||||||
+ iconv_t h = iconv_open (buffer, UCS2_CHARSET);
|
|
||||||
if (h == (iconv_t) -1)
|
|
||||||
throw new ::java::io::UnsupportedEncodingException (encoding);
|
|
||||||
|
|
||||||
@@ -187,20 +182,6 @@
|
|
||||||
char *inbuf = (char *) &chars[inpos];
|
|
||||||
char *outbuf = (char *) &out[count];
|
|
||||||
|
|
||||||
- if (iconv_byte_swap)
|
|
||||||
- {
|
|
||||||
- // Ugly performance penalty -- don't use losing systems!
|
|
||||||
- temp_buffer = (jchar *) _Jv_Malloc (inlength * sizeof (jchar));
|
|
||||||
- for (int i = 0; i < inlength; ++i)
|
|
||||||
- {
|
|
||||||
- // Byte swap.
|
|
||||||
- jchar c = (((chars[inpos + i] & 0xff) << 8)
|
|
||||||
- | ((chars[inpos + i] >> 8) & 0xff));
|
|
||||||
- temp_buffer[i] = c;
|
|
||||||
- }
|
|
||||||
- inbuf = (char *) temp_buffer;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
size_t loop_old_in = old_in;
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
@@ -252,44 +233,7 @@
|
|
||||||
jboolean
|
|
||||||
gnu::gcj::convert::IOConverter::iconv_init (void)
|
|
||||||
{
|
|
||||||
- // Some versions of iconv() always return their UCS-2 results in
|
|
||||||
- // big-endian order, and they also require UCS-2 inputs to be in
|
|
||||||
- // big-endian order. For instance, glibc 2.1.3 does this. If the
|
|
||||||
- // UTF-8=>UCS-2 iconv converter has this feature, then we assume
|
|
||||||
- // that all UCS-2 converters do. (This might not be the best
|
|
||||||
- // heuristic, but is is all we've got.)
|
|
||||||
- jboolean result = false;
|
|
||||||
-#ifdef HAVE_ICONV
|
|
||||||
- iconv_t handle = iconv_open ("UCS-2", "UTF-8");
|
|
||||||
- if (handle != (iconv_t) -1)
|
|
||||||
- {
|
|
||||||
- jchar c;
|
|
||||||
- unsigned char in[4];
|
|
||||||
- char *inp, *outp;
|
|
||||||
- size_t inc, outc, r;
|
|
||||||
-
|
|
||||||
- // This is the UTF-8 encoding of \ufeff. At least Tru64 UNIX libiconv
|
|
||||||
- // needs the trailing NUL byte, otherwise iconv fails with EINVAL.
|
|
||||||
- in[0] = 0xef;
|
|
||||||
- in[1] = 0xbb;
|
|
||||||
- in[2] = 0xbf;
|
|
||||||
- in[3] = 0x00;
|
|
||||||
-
|
|
||||||
- inp = (char *) in;
|
|
||||||
- inc = 4;
|
|
||||||
- outp = (char *) &c;
|
|
||||||
- outc = 2;
|
|
||||||
-
|
|
||||||
- r = iconv_adapter (iconv, handle, &inp, &inc, &outp, &outc);
|
|
||||||
- // Conversion must be complete for us to use the result.
|
|
||||||
- if (r != (size_t) -1 && inc == 0 && outc == 0)
|
|
||||||
- result = (c != 0xfeff);
|
|
||||||
-
|
|
||||||
- // Release iconv handle.
|
|
||||||
- iconv_close (handle);
|
|
||||||
- }
|
|
||||||
-#endif /* HAVE_ICONV */
|
|
||||||
- return result;
|
|
||||||
+ return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
|
@ -1,49 +0,0 @@
|
||||||
--- gcc-4.8.2/libjava/gnu/classpath/natSystemProperties.cc.orig 2014-02-18 10:55:08.617678779 +0200
|
|
||||||
+++ gcc-4.8.2/libjava/gnu/classpath/natSystemProperties.cc 2014-02-18 10:56:31.927227453 +0200
|
|
||||||
@@ -289,7 +289,7 @@
|
|
||||||
// just default to `en_US'.
|
|
||||||
setlocale (LC_ALL, "");
|
|
||||||
char *locale = setlocale (LC_MESSAGES, "");
|
|
||||||
- if (locale && strlen (locale) >= 2)
|
|
||||||
+ if (locale && strlen (locale) >= 2 && (locale[2] == '\0' || locale[2] == '_'))
|
|
||||||
{
|
|
||||||
char buf[3];
|
|
||||||
buf[2] = '\0';
|
|
||||||
--- gcc-4.8.2/libjava/posix-threads.cc.orig 2014-02-18 13:22:01.789933726 +0200
|
|
||||||
+++ gcc-4.8.2/libjava/posix-threads.cc 2014-02-18 13:29:50.924058875 +0200
|
|
||||||
@@ -657,6 +657,7 @@
|
|
||||||
struct sched_param param;
|
|
||||||
pthread_attr_t attr;
|
|
||||||
struct starter *info;
|
|
||||||
+ size_t ss;
|
|
||||||
|
|
||||||
if (data->flags & FLAG_START)
|
|
||||||
return;
|
|
||||||
@@ -675,8 +676,25 @@
|
|
||||||
// Set stack size if -Xss option was given.
|
|
||||||
if (gcj::stack_size > 0)
|
|
||||||
{
|
|
||||||
- int e = pthread_attr_setstacksize (&attr, gcj::stack_size);
|
|
||||||
+ ss = gcj::stack_size;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ int e = pthread_attr_getstacksize (&attr, &ss);
|
|
||||||
+ if (e != 0)
|
|
||||||
+ JvFail (strerror (e));
|
|
||||||
+
|
|
||||||
+ // Request at least 1meg of stack
|
|
||||||
+ if (ss >= 1024 * 1024)
|
|
||||||
+ ss = 0;
|
|
||||||
+ else
|
|
||||||
+ ss = 1024 * 1024;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (ss)
|
|
||||||
+ {
|
|
||||||
+ int e = pthread_attr_setstacksize (&attr, ss);
|
|
||||||
if (e != 0)
|
|
||||||
JvFail (strerror (e));
|
|
||||||
}
|
|
||||||
|
|
||||||
info = (struct starter *) _Jv_AllocBytes (sizeof (struct starter));
|
|
|
@ -1,35 +0,0 @@
|
||||||
--- gcc-6.1.0/libjava/Makefile.am
|
|
||||||
+++ gcc-6.1.0/libjava/Makefile.am
|
|
||||||
@@ -488,10 +488,14 @@
|
|
||||||
nat_files = $(nat_source_files:.cc=.lo)
|
|
||||||
xlib_nat_files = $(xlib_nat_source_files:.cc=.lo)
|
|
||||||
|
|
||||||
+libgcj_la_CPPFLAGS = \
|
|
||||||
+ $(AM_CPPFLAGS) \
|
|
||||||
+ $(LIBSTDCXX_RAW_CXX_CXXFLAGS)
|
|
||||||
+
|
|
||||||
# Include THREADLIBS here to ensure that the correct version of
|
|
||||||
# certain linuxthread functions get linked:
|
|
||||||
## The mysterious backslash in the grep pattern is consumed by make.
|
|
||||||
-libgcj_la_LDFLAGS = -rpath $(toolexeclibdir) $(THREADLDFLAGS) $(extra_ldflags) $(THREADLIBS) \
|
|
||||||
+libgcj_la_LDFLAGS = $(LIBSTDCXX_RAW_CXX_LDFLAGS) -rpath $(toolexeclibdir) $(THREADLDFLAGS) $(extra_ldflags) $(THREADLIBS) \
|
|
||||||
$(LIBLTDL) $(SYS_ZLIBS) $(LIBJAVA_LDFLAGS_NOUNDEF) \
|
|
||||||
-version-info `grep -v '^\#' $(srcdir)/libtool-version` \
|
|
||||||
$(LIBGCJ_LD_SYMBOLIC_FUNCTIONS) $(LIBGCJ_LD_EXPORT_ALL)
|
|
||||||
--- gcc-6.1.0/libjava/Makefile.in
|
|
||||||
+++ gcc-6.1.0/libjava/Makefile.in
|
|
||||||
@@ -1103,9 +1103,13 @@
|
|
||||||
nat_files = $(nat_source_files:.cc=.lo)
|
|
||||||
xlib_nat_files = $(xlib_nat_source_files:.cc=.lo)
|
|
||||||
|
|
||||||
+libgcj_la_CPPFLAGS = \
|
|
||||||
+ $(AM_CPPFLAGS) \
|
|
||||||
+ $(LIBSTDCXX_RAW_CXX_CXXFLAGS)
|
|
||||||
+
|
|
||||||
# Include THREADLIBS here to ensure that the correct version of
|
|
||||||
# certain linuxthread functions get linked:
|
|
||||||
-libgcj_la_LDFLAGS = -rpath $(toolexeclibdir) $(THREADLDFLAGS) $(extra_ldflags) $(THREADLIBS) \
|
|
||||||
+libgcj_la_LDFLAGS = $(LIBSTDCXX_RAW_CXX_LDFLAGS) -rpath $(toolexeclibdir) $(THREADLDFLAGS) $(extra_ldflags) $(THREADLIBS) \
|
|
||||||
$(LIBLTDL) $(SYS_ZLIBS) $(LIBJAVA_LDFLAGS_NOUNDEF) \
|
|
||||||
-version-info `grep -v '^\#' $(srcdir)/libtool-version` \
|
|
||||||
$(LIBGCJ_LD_SYMBOLIC_FUNCTIONS) $(LIBGCJ_LD_EXPORT_ALL)
|
|
|
@ -1,44 +0,0 @@
|
||||||
From 9cd4503714c4e596818c4ea8e15905c249b7a319 Mon Sep 17 00:00:00 2001
|
|
||||||
From: nsz <nsz@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
||||||
Date: Thu, 25 Aug 2016 14:08:27 +0000
|
|
||||||
Subject: [PATCH] [mips] Fix linux header use in libgcc
|
|
||||||
|
|
||||||
libgcc/
|
|
||||||
* config/mips/linux-unwind.h: Use sys/syscall.h.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@239759 138bc75d-0d04-0410-961f-82ee72b054a4
|
|
||||||
---
|
|
||||||
libgcc/ChangeLog | 4 ++++
|
|
||||||
libgcc/config/mips/linux-unwind.h | 2 +-
|
|
||||||
2 files changed, 5 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
|
|
||||||
index b78c4b2..99bd2f1 100644
|
|
||||||
--- a/libgcc/ChangeLog
|
|
||||||
+++ b/libgcc/ChangeLog
|
|
||||||
@@ -1,3 +1,7 @@
|
|
||||||
+2016-08-25 Szabolcs Nagy <szabolcs.nagy@arm.com>
|
|
||||||
+
|
|
||||||
+ * config/mips/linux-unwind.h: Use sys/syscall.h.
|
|
||||||
+
|
|
||||||
2016-08-16 Joseph Myers <joseph@codesourcery.com>
|
|
||||||
|
|
||||||
PR libgcc/77265
|
|
||||||
diff --git a/libgcc/config/mips/linux-unwind.h b/libgcc/config/mips/linux-unwind.h
|
|
||||||
index bf12de5..4035c121 100644
|
|
||||||
--- a/libgcc/config/mips/linux-unwind.h
|
|
||||||
+++ b/libgcc/config/mips/linux-unwind.h
|
|
||||||
@@ -27,7 +27,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
||||||
state data appropriately. See unwind-dw2.c for the structs. */
|
|
||||||
|
|
||||||
#include <signal.h>
|
|
||||||
-#include <asm/unistd.h>
|
|
||||||
+#include <sys/syscall.h>
|
|
||||||
|
|
||||||
/* The third parameter to the signal handler points to something with
|
|
||||||
* this structure defined in asm/ucontext.h, but the name clashes with
|
|
||||||
--
|
|
||||||
2.9.3
|
|
||||||
|
|
|
@ -1,59 +0,0 @@
|
||||||
--- gcc-6.3.0.orig/gcc/config/rs6000/sysv4.h
|
|
||||||
+++ gcc-6.3.0/gcc/config/rs6000/sysv4.h
|
|
||||||
@@ -753,23 +753,42 @@
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_LD_PIE
|
|
||||||
-#define STARTFILE_LINUX_SPEC "\
|
|
||||||
-%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
|
|
||||||
-%{mnewlib:ecrti.o%s;:crti.o%s} \
|
|
||||||
-%{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s} \
|
|
||||||
-" CRTOFFLOADBEGIN
|
|
||||||
+#define STARTFILE_LINUX_SPEC \
|
|
||||||
+ "%{!shared: %{pg|p|profile:gcrt1.o%s;: \
|
|
||||||
+ %{" PIE_SPEC ":%{static:rcrt1.o%s;:Scrt1.o%s}} %{" NO_PIE_SPEC ":crt1.o%s}}} \
|
|
||||||
+ crti.o%s %{shared:crtbeginS.o%s;: \
|
|
||||||
+ %{" PIE_SPEC ":crtbeginS.o%s} \
|
|
||||||
+ %{" NO_PIE_SPEC ":%{static:crtbeginT.o%s;:crtbegin.o%s}}} \
|
|
||||||
+ %{fvtable-verify=none:%s; \
|
|
||||||
+ fvtable-verify=preinit:vtv_start_preinit.o%s; \
|
|
||||||
+ fvtable-verify=std:vtv_start.o%s} \
|
|
||||||
+ " CRTOFFLOADBEGIN
|
|
||||||
#else
|
|
||||||
-#define STARTFILE_LINUX_SPEC "\
|
|
||||||
-%{!shared: %{pg|p|profile:gcrt1.o%s;:crt1.o%s}} \
|
|
||||||
-%{mnewlib:ecrti.o%s;:crti.o%s} \
|
|
||||||
-%{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s} \
|
|
||||||
-" CRTOFFLOADBEGIN
|
|
||||||
+#define STARTFILE_LINUX_SPEC \
|
|
||||||
+ "%{!shared: %{pg|p|profile:gcrt1.o%s;:crt1.o%s}} \
|
|
||||||
+ crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s} \
|
|
||||||
+ %{fvtable-verify=none:%s; \
|
|
||||||
+ fvtable-verify=preinit:vtv_start_preinit.o%s; \
|
|
||||||
+ fvtable-verify=std:vtv_start.o%s} \
|
|
||||||
+ " CRTOFFLOADBEGIN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-#define ENDFILE_LINUX_SPEC "\
|
|
||||||
-%{shared|pie:crtendS.o%s;:crtend.o%s} \
|
|
||||||
-%{mnewlib:ecrtn.o%s;:crtn.o%s} \
|
|
||||||
-" CRTOFFLOADEND
|
|
||||||
+#ifdef HAVE_LD_PIE
|
|
||||||
+#define ENDFILE_LINUX_SPEC \
|
|
||||||
+ "%{fvtable-verify=none:%s; \
|
|
||||||
+ fvtable-verify=preinit:vtv_end_preinit.o%s; \
|
|
||||||
+ fvtable-verify=std:vtv_end.o%s} \
|
|
||||||
+ %{shared:crtendS.o%s;: %{" PIE_SPEC ":crtendS.o%s} \
|
|
||||||
+ %{" NO_PIE_SPEC ":crtend.o%s}} crtn.o%s \
|
|
||||||
+ " CRTOFFLOADEND
|
|
||||||
+#else
|
|
||||||
+#define ENDFILE_LINUX_SPEC \
|
|
||||||
+ "%{fvtable-verify=none:%s; \
|
|
||||||
+ fvtable-verify=preinit:vtv_end_preinit.o%s; \
|
|
||||||
+ fvtable-verify=std:vtv_end.o%s} \
|
|
||||||
+ %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s \
|
|
||||||
+ " CRTOFFLOADEND
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
#define LINK_START_LINUX_SPEC ""
|
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
When cross compiling a target gcc, target flags may be used on the host
|
|
||||||
|
|
||||||
Configure identifies a number of warning flags (WARN_CFLAGS and
|
|
||||||
WARN_CXXFLAGS) from the $CC value. The cross compiler may be different
|
|
||||||
from the host compiler and may not support the same set of flags. This
|
|
||||||
leads to problems such as:
|
|
||||||
|
|
||||||
cc1plus: error: unrecognized command line option "-Wno-narrowing"
|
|
||||||
cc1plus: error: unrecognized command line option "-Wno-overlength-strings"
|
|
||||||
|
|
||||||
Work around this problem by removing the warning flags from the
|
|
||||||
BUILD_CXXFLAGS value, in a way similar to the BUILD_CFLAGS.
|
|
||||||
|
|
||||||
Upstream-Status: Pending
|
|
||||||
|
|
||||||
Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
|
|
||||||
|
|
||||||
Index: gcc-4.8.0/gcc/configure
|
|
||||||
===================================================================
|
|
||||||
--- gcc-4.8.0.orig/gcc/configure
|
|
||||||
+++ gcc-4.8.0/gcc/configure
|
|
||||||
@@ -11720,6 +10581,7 @@ STMP_FIXINC=stmp-fixinc
|
|
||||||
if test x$build != x$host || test "x$coverage_flags" != x
|
|
||||||
then
|
|
||||||
BUILD_CFLAGS='$(INTERNAL_CFLAGS) $(T_CFLAGS) $(CFLAGS_FOR_BUILD)'
|
|
||||||
+ BUILD_CXXFLAGS='$(INTERNAL_CFLAGS) $(T_CFLAGS) $(CFLAGS_FOR_BUILD)'
|
|
||||||
BUILD_LDFLAGS='$(LDFLAGS_FOR_BUILD)'
|
|
||||||
fi
|
|
||||||
|
|
||||||
Index: gcc-4.8.0/gcc/configure.ac
|
|
||||||
===================================================================
|
|
||||||
--- gcc-4.8.0.orig/gcc/configure.ac
|
|
||||||
+++ gcc-4.8.0/gcc/configure.ac
|
|
||||||
@@ -1901,6 +1901,7 @@ STMP_FIXINC=stmp-fixinc AC_SUBST(STMP_F
|
|
||||||
if test x$build != x$host || test "x$coverage_flags" != x
|
|
||||||
then
|
|
||||||
BUILD_CFLAGS='$(INTERNAL_CFLAGS) $(T_CFLAGS) $(CFLAGS_FOR_BUILD)'
|
|
||||||
+ BUILD_CXXFLAGS='$(INTERNAL_CFLAGS) $(T_CFLAGS) $(CFLAGS_FOR_BUILD)'
|
|
||||||
BUILD_LDFLAGS='$(LDFLAGS_FOR_BUILD)'
|
|
||||||
fi
|
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
--- gcc-4.9.2/gcc/config/linux.h.orig 2015-03-09 13:27:13.289736710 +0000
|
|
||||||
+++ gcc-4.9.2/gcc/config/linux.h 2015-03-09 13:29:32.295625046 +0000
|
|
||||||
@@ -146,6 +146,8 @@
|
|
||||||
|
|
||||||
#ifdef NATIVE_SYSTEM_HEADER_DIR
|
|
||||||
#define INCLUDE_DEFAULTS_MUSL_NATIVE \
|
|
||||||
+ { NATIVE_SYSTEM_HEADER_DIR "/fortify", 0, 0, 0, 1, 2 }, \
|
|
||||||
+ { NATIVE_SYSTEM_HEADER_DIR "/fortify", 0, 0, 0, 1, 0 }, \
|
|
||||||
{ NATIVE_SYSTEM_HEADER_DIR, 0, 0, 0, 1, 2 }, \
|
|
||||||
{ NATIVE_SYSTEM_HEADER_DIR, 0, 0, 0, 1, 0 },
|
|
||||||
#else
|
|
|
@ -1,20 +0,0 @@
|
||||||
Author: Timo Teräs <timo.teras@iki.fi>
|
|
||||||
|
|
||||||
Alpine musl package provides libssp_nonshared.a. We link to it unconditionally,
|
|
||||||
as otherwise we get link failures if some objects are -fstack-protector built
|
|
||||||
and final link happens with -fno-stack-protector. This seems to be the common
|
|
||||||
case when bootstrapping gcc, the piepatches do not seem to fully fix the
|
|
||||||
crosstoolchain and bootstrap sequence wrt. stack-protector flag usage.
|
|
||||||
|
|
||||||
--- gcc-6.1.0/gcc/gcc.c.orig
|
|
||||||
+++ gcc-6.1.0/gcc/gcc.c
|
|
||||||
@@ -870,8 +870,7 @@
|
|
||||||
|
|
||||||
#ifndef LINK_SSP_SPEC
|
|
||||||
#ifdef TARGET_LIBC_PROVIDES_SSP
|
|
||||||
-#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
|
|
||||||
- "|fstack-protector-strong|fstack-protector-explicit:}"
|
|
||||||
+#define LINK_SSP_SPEC "-lssp_nonshared"
|
|
||||||
#else
|
|
||||||
#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
|
|
||||||
"|fstack-protector-strong|fstack-protector-explicit" \
|
|
|
@ -1,47 +0,0 @@
|
||||||
From b8c4e45d052adc247341066f748421743704b481 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nils Andreas Svee <me@lochnair.net>
|
|
||||||
Date: Thu, 21 Dec 2017 03:14:33 +0100
|
|
||||||
Subject: [PATCH] Pure 64-bit MIPS
|
|
||||||
|
|
||||||
---
|
|
||||||
gcc/config/mips/mips.h | 8 ++++----
|
|
||||||
gcc/config/mips/t-linux64 | 6 +++---
|
|
||||||
2 files changed, 7 insertions(+), 7 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
|
|
||||||
index 803ab98e7..afd74752f 100644
|
|
||||||
--- a/gcc/config/mips/mips.h
|
|
||||||
+++ b/gcc/config/mips/mips.h
|
|
||||||
@@ -3330,11 +3330,11 @@ struct GTY(()) machine_function {
|
|
||||||
/* If we are *not* using multilibs and the default ABI is not ABI_32 we
|
|
||||||
need to change these from /lib and /usr/lib. */
|
|
||||||
#if MIPS_ABI_DEFAULT == ABI_N32
|
|
||||||
-#define STANDARD_STARTFILE_PREFIX_1 "/lib32/"
|
|
||||||
-#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib32/"
|
|
||||||
+#define STANDARD_STARTFILE_PREFIX_1 "/lib/"
|
|
||||||
+#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
|
|
||||||
#elif MIPS_ABI_DEFAULT == ABI_64
|
|
||||||
-#define STANDARD_STARTFILE_PREFIX_1 "/lib64/"
|
|
||||||
-#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib64/"
|
|
||||||
+#define STANDARD_STARTFILE_PREFIX_1 "/lib/"
|
|
||||||
+#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Load store bonding is not supported by micromips and fix_24k. The
|
|
||||||
diff --git a/gcc/config/mips/t-linux64 b/gcc/config/mips/t-linux64
|
|
||||||
index 16c8adf85..bb46204db 100644
|
|
||||||
--- a/gcc/config/mips/t-linux64
|
|
||||||
+++ b/gcc/config/mips/t-linux64
|
|
||||||
@@ -21,6 +21,6 @@ MULTILIB_DIRNAMES = n32 32 64
|
|
||||||
MIPS_EL = $(if $(filter %el, $(firstword $(subst -, ,$(target)))),el)
|
|
||||||
MIPS_SOFT = $(if $(strip $(filter MASK_SOFT_FLOAT_ABI, $(target_cpu_default)) $(filter soft, $(with_float))),soft)
|
|
||||||
MULTILIB_OSDIRNAMES = \
|
|
||||||
- ../lib32$(call if_multiarch,:mips64$(MIPS_EL)-linux-gnuabin32$(MIPS_SOFT)) \
|
|
||||||
- ../lib$(call if_multiarch,:mips$(MIPS_EL)-linux-gnu$(MIPS_SOFT)) \
|
|
||||||
- ../lib64$(call if_multiarch,:mips64$(MIPS_EL)-linux-gnuabi64$(MIPS_SOFT))
|
|
||||||
+ ../lib \
|
|
||||||
+ ../lib32 \
|
|
||||||
+ ../lib
|
|
||||||
--
|
|
||||||
2.15.1
|
|
||||||
|
|
|
@ -1,89 +0,0 @@
|
||||||
--- ./gcc/config/i386/t-linux64.orig 2013-01-14 16:32:37.000000000 +0000
|
|
||||||
+++ ./gcc/config/i386/t-linux64 2013-04-22 06:12:32.984439677 +0000
|
|
||||||
@@ -34,6 +34,6 @@
|
|
||||||
comma=,
|
|
||||||
MULTILIB_OPTIONS = $(subst $(comma),/,$(TM_MULTILIB_CONFIG))
|
|
||||||
MULTILIB_DIRNAMES = $(patsubst m%, %, $(subst /, ,$(MULTILIB_OPTIONS)))
|
|
||||||
-MULTILIB_OSDIRNAMES = m64=../lib64$(call if_multiarch,:x86_64-linux-gnu)
|
|
||||||
-MULTILIB_OSDIRNAMES+= m32=$(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:i386-linux-gnu)
|
|
||||||
+MULTILIB_OSDIRNAMES = m64=../lib
|
|
||||||
+MULTILIB_OSDIRNAMES+= m32=../lib32
|
|
||||||
MULTILIB_OSDIRNAMES+= mx32=../libx32$(call if_multiarch,:x86_64-linux-gnux32)
|
|
||||||
--- ./gcc/config/aarch64/t-aarch64-linux.orig
|
|
||||||
+++ ./gcc/config/aarch64/t-aarch64-linux
|
|
||||||
@@ -22,7 +22,7 @@
|
|
||||||
LIB1ASMFUNCS = _aarch64_sync_cache_range
|
|
||||||
|
|
||||||
AARCH_BE = $(if $(findstring TARGET_BIG_ENDIAN_DEFAULT=1, $(tm_defines)),_be)
|
|
||||||
-MULTILIB_OSDIRNAMES = mabi.lp64=../lib64$(call if_multiarch,:aarch64$(AARCH_BE)-linux-gnu)
|
|
||||||
+MULTILIB_OSDIRNAMES = mabi.lp64=../lib
|
|
||||||
MULTIARCH_DIRNAME = $(call if_multiarch,aarch64$(AARCH_BE)-linux-gnu)
|
|
||||||
|
|
||||||
MULTILIB_OSDIRNAMES += mabi.ilp32=../libilp32
|
|
||||||
--- ./gcc/config/s390/t-linux64.orig
|
|
||||||
+++ ./gcc/config/s390/t-linux64
|
|
||||||
@@ -7,5 +7,5 @@
|
|
||||||
MULTILIB_OPTIONS = m64/m31
|
|
||||||
MULTILIB_DIRNAMES = 64 32
|
|
||||||
-MULTILIB_OSDIRNAMES = ../lib64$(call if_multiarch,:s390x-linux-gnu)
|
|
||||||
-MULTILIB_OSDIRNAMES += $(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:s390-linux-gnu)
|
|
||||||
+MULTILIB_OSDIRNAMES = m64=../lib
|
|
||||||
+MULTILIB_OSDIRNAMES+= m32=../lib32
|
|
||||||
|
|
||||||
--- ./gcc/config/rs6000/t-linux.orig
|
|
||||||
+++ ./gcc/config/rs6000/t-linux
|
|
||||||
@@ -2,7 +2,8 @@
|
|
||||||
# or soft-float.
|
|
||||||
ifeq (,$(filter $(with_cpu),$(SOFT_FLOAT_CPUS))$(findstring soft,$(with_float)))
|
|
||||||
ifneq (,$(findstring powerpc64,$(target)))
|
|
||||||
-MULTILIB_OSDIRNAMES := .=../lib64$(call if_multiarch,:powerpc64-linux-gnu)
|
|
||||||
+MULTILIB_OSDIRNAMES := m64=../lib
|
|
||||||
+MULTILIB_OSDIRNAMES += m32=../lib32
|
|
||||||
else
|
|
||||||
ifneq (,$(findstring spe,$(target)))
|
|
||||||
MULTIARCH_DIRNAME := powerpc-linux-gnuspe$(if $(findstring 8548,$(with_cpu)),,v1)
|
|
||||||
@@ -14,7 +15,8 @@
|
|
||||||
MULTIARCH_DIRNAME := $(subst -linux,le-linux,$(MULTIARCH_DIRNAME))
|
|
||||||
endif
|
|
||||||
ifneq (,$(findstring powerpc64le,$(target)))
|
|
||||||
-MULTILIB_OSDIRNAMES := $(subst -linux,le-linux,$(MULTILIB_OSDIRNAMES))
|
|
||||||
+MULTILIB_OSDIRNAMES := m64=../lib
|
|
||||||
+MULTILIB_OSDIRNAMES += m32=../lib32
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
--- ./gcc/config/rs6000/t-linux64.orig
|
|
||||||
+++ ./gcc/config/rs6000/t-linux64
|
|
||||||
@@ -28,8 +28,8 @@
|
|
||||||
MULTILIB_OPTIONS := m64/m32
|
|
||||||
MULTILIB_DIRNAMES := 64 32
|
|
||||||
MULTILIB_EXTRA_OPTS :=
|
|
||||||
-MULTILIB_OSDIRNAMES := m64=../lib64$(call if_multiarch,:powerpc64-linux-gnu)
|
|
||||||
-MULTILIB_OSDIRNAMES += m32=$(if $(wildcard $(shell echo $(SYSTEM_HEADER_DIR))/../../usr/lib32),../lib32,../lib)$(call if_multiarch,:powerpc-linux-gnu)
|
|
||||||
+MULTILIB_OSDIRNAMES := m64=../lib
|
|
||||||
+MULTILIB_OSDIRNAMES += m32=../lib32
|
|
||||||
|
|
||||||
rs6000-linux.o: $(srcdir)/config/rs6000/rs6000-linux.c
|
|
||||||
$(COMPILE) $<
|
|
||||||
--- ./gcc/config/rs6000/t-linux64bele.orig
|
|
||||||
+++ ./gcc/config/rs6000/t-linux64bele
|
|
||||||
@@ -2,6 +2,6 @@
|
|
||||||
|
|
||||||
MULTILIB_OPTIONS += mlittle
|
|
||||||
MULTILIB_DIRNAMES += le
|
|
||||||
-MULTILIB_OSDIRNAMES += $(subst =,.mlittle=,$(subst lible32,lib32le,$(subst lible64,lib64le,$(subst lib,lible,$(subst -linux,le-linux,$(MULTILIB_OSDIRNAMES))))))
|
|
||||||
-MULTILIB_OSDIRNAMES += $(subst $(if $(findstring 64,$(target)),m64,m32).,,$(filter $(if $(findstring 64,$(target)),m64,m32).mlittle%,$(MULTILIB_OSDIRNAMES)))
|
|
||||||
+MULTILIB_OSDIRNAMES = m64=../lib
|
|
||||||
+MULTILIB_OSDIRNAMES+= m32=../lib32
|
|
||||||
MULTILIB_MATCHES := ${MULTILIB_MATCHES_ENDIAN}
|
|
||||||
--- ./gcc/config/rs6000/t-linux64lebe.orig
|
|
||||||
+++ ./gcc/config/rs6000/t-linux64lebe
|
|
||||||
@@ -2,6 +2,6 @@
|
|
||||||
|
|
||||||
MULTILIB_OPTIONS += mbig
|
|
||||||
MULTILIB_DIRNAMES += be
|
|
||||||
-MULTILIB_OSDIRNAMES += $(subst =,.mbig=,$(subst libbe32,lib32be,$(subst libbe64,lib64be,$(subst lib,libbe,$(subst le-linux,-linux,$(MULTILIB_OSDIRNAMES))))))
|
|
||||||
-MULTILIB_OSDIRNAMES += $(subst $(if $(findstring 64,$(target)),m64,m32).,,$(filter $(if $(findstring 64,$(target)),m64,m32).mbig%,$(MULTILIB_OSDIRNAMES)))
|
|
||||||
+MULTILIB_OSDIRNAMES := m64=../lib
|
|
||||||
+MULTILIB_OSDIRNAMES += m32=../lib32
|
|
||||||
MULTILIB_MATCHES := ${MULTILIB_MATCHES_ENDIAN}
|
|
|
@ -1,39 +0,0 @@
|
||||||
Highly inspired by:
|
|
||||||
http://landley.net/hg/aboriginal/file/7e0747a665ab/sources/patches/gcc-core-libgcceh.patch
|
|
||||||
|
|
||||||
diff -durN gcc-4.6.0.orig/libgcc/Makefile.in gcc-4.6.0/libgcc/Makefile.in
|
|
||||||
--- gcc-4.6.0.orig/libgcc/Makefile.in 2011-01-26 05:19:58.000000000 +0100
|
|
||||||
+++ gcc-4.6.0/libgcc/Makefile.in 2011-09-12 18:17:12.743718974 +0200
|
|
||||||
@@ -772,8 +772,9 @@
|
|
||||||
libgcc_s$(SHLIB_EXT): libunwind$(SHLIB_EXT)
|
|
||||||
endif
|
|
||||||
|
|
||||||
+all: libgcc_eh.a
|
|
||||||
ifeq ($(enable_shared),yes)
|
|
||||||
-all: libgcc_eh.a libgcc_s$(SHLIB_EXT)
|
|
||||||
+all: libgcc_s$(SHLIB_EXT)
|
|
||||||
ifneq ($(LIBUNWIND),)
|
|
||||||
all: libunwind$(SHLIB_EXT)
|
|
||||||
endif
|
|
||||||
@@ -950,10 +951,6 @@
|
|
||||||
install-shared:
|
|
||||||
$(mkinstalldirs) $(DESTDIR)$(inst_libdir)
|
|
||||||
|
|
||||||
- $(INSTALL_DATA) libgcc_eh.a $(DESTDIR)$(inst_libdir)/
|
|
||||||
- chmod 644 $(DESTDIR)$(inst_libdir)/libgcc_eh.a
|
|
||||||
- $(RANLIB) $(DESTDIR)$(inst_libdir)/libgcc_eh.a
|
|
||||||
-
|
|
||||||
$(subst @multilib_dir@,$(MULTIDIR),$(subst \
|
|
||||||
@shlib_base_name@,libgcc_s,$(subst \
|
|
||||||
@shlib_slibdir_qual@,$(MULTIOSSUBDIR),$(SHLIB_INSTALL))))
|
|
||||||
@@ -968,6 +965,10 @@
|
|
||||||
chmod 644 $(DESTDIR)$(inst_libdir)/libgcov.a
|
|
||||||
$(RANLIB) $(DESTDIR)$(inst_libdir)/libgcov.a
|
|
||||||
|
|
||||||
+ $(INSTALL_DATA) libgcc_eh.a $(DESTDIR)$(inst_libdir)/
|
|
||||||
+ chmod 644 $(DESTDIR)$(inst_libdir)/libgcc_eh.a
|
|
||||||
+ $(RANLIB) $(DESTDIR)$(inst_libdir)/libgcc_eh.a
|
|
||||||
+
|
|
||||||
parts="$(INSTALL_PARTS)"; \
|
|
||||||
for file in $$parts; do \
|
|
||||||
rm -f $(DESTDIR)$(inst_libdir)/$$file; \
|
|
|
@ -1,241 +0,0 @@
|
||||||
From b1d2df5090abc9202a7bf2d224ac90de22908d21 Mon Sep 17 00:00:00 2001
|
|
||||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
||||||
Date: Mon, 15 Jan 2018 11:27:24 +0000
|
|
||||||
Subject: [PATCH 01/13] 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
|
|
||||||
2017-06-01 Bernd Edlinger <bernd.edlinger@hotmail.de>
|
|
||||||
|
|
||||||
* 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.
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 68 ++++++++++----------------------------------------
|
|
||||||
gcc/config/i386/i386.h | 53 ++++++++++++++++++++++++++++++++++++++-
|
|
||||||
2 files changed, 65 insertions(+), 56 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
|
||||||
index 8b5faac5129..a1ff32b648b 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -2434,53 +2434,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;
|
|
||||||
|
|
||||||
@@ -2572,7 +2525,7 @@ static unsigned int ix86_function_arg_boundary (machine_mode,
|
|
||||||
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);
|
|
||||||
@@ -10944,7 +10897,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);
|
|
||||||
}
|
|
||||||
@@ -11355,8 +11309,8 @@ ix86_can_eliminate (const int from, const int to)
|
|
||||||
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;
|
|
||||||
@@ -11395,8 +11349,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;
|
|
||||||
@@ -12702,7 +12657,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))
|
|
||||||
{
|
|
||||||
@@ -13379,7 +13335,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
|
|
||||||
@@ -13876,7 +13833,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
|
|
||||||
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
|
|
||||||
index 8113f83c7fd..54144166172 100644
|
|
||||||
--- a/gcc/config/i386/i386.h
|
|
||||||
+++ b/gcc/config/i386/i386.h
|
|
||||||
@@ -2427,9 +2427,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
|
|
||||||
@@ -2475,6 +2522,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;
|
|
||||||
@@ -2554,6 +2604,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
|
|
||||||
--
|
|
||||||
2.16.3
|
|
||||||
|
|
|
@ -1,69 +0,0 @@
|
||||||
From b1fc91cda7c15264116f3dde6944ead149123653 Mon Sep 17 00:00:00 2001
|
|
||||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
||||||
Date: Mon, 15 Jan 2018 11:28:44 +0000
|
|
||||||
Subject: [PATCH 02/13] 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
|
|
||||||
2017-11-06 H.J. Lu <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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.
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 8 +++-----
|
|
||||||
1 file changed, 3 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
|
||||||
index a1ff32b648b..13ebf107e90 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -10887,7 +10887,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;
|
|
||||||
@@ -10898,7 +10897,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);
|
|
||||||
}
|
|
||||||
@@ -11310,7 +11309,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;
|
|
||||||
@@ -13821,7 +13820,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;
|
|
||||||
@@ -13834,7 +13832,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.16.3
|
|
||||||
|
|
|
@ -1,126 +0,0 @@
|
||||||
From 3e39c0a8053b3e960cf4c3aea3c814e7dc97cfd6 Mon Sep 17 00:00:00 2001
|
|
||||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
||||||
Date: Sat, 27 Jan 2018 13:10:24 +0000
|
|
||||||
Subject: [PATCH 03/13] i386: Use const reference of struct ix86_frame to avoid
|
|
||||||
copy
|
|
||||||
|
|
||||||
We can use const reference of struct ix86_frame to avoid making a local
|
|
||||||
copy of ix86_frame. ix86_expand_epilogue makes a local copy of struct
|
|
||||||
ix86_frame and uses the reg_save_offset field as a local variable. This
|
|
||||||
patch uses a separate local variable for reg_save_offset.
|
|
||||||
|
|
||||||
Tested on x86-64 with ada.
|
|
||||||
|
|
||||||
Backport from mainline
|
|
||||||
PR target/83905
|
|
||||||
* config/i386/i386.c (ix86_expand_prologue): Use cost reference
|
|
||||||
of struct ix86_frame.
|
|
||||||
(ix86_expand_epilogue): Likewise. Add a local variable for
|
|
||||||
the reg_save_offset field in struct ix86_frame.
|
|
||||||
|
|
||||||
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@257123 138bc75d-0d04-0410-961f-82ee72b054a4
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 24 ++++++++++++------------
|
|
||||||
1 file changed, 12 insertions(+), 12 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
|
||||||
index 13ebf107e90..6c98f7581e2 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -12633,7 +12633,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;
|
|
||||||
@@ -12657,7 +12656,7 @@ ix86_expand_prologue (void)
|
|
||||||
m->fs.sp_valid = true;
|
|
||||||
|
|
||||||
ix86_compute_frame_layout ();
|
|
||||||
- frame = m->frame;
|
|
||||||
+ const struct ix86_frame &frame = cfun->machine->frame;
|
|
||||||
|
|
||||||
if (!TARGET_64BIT && ix86_function_ms_hook_prologue (current_function_decl))
|
|
||||||
{
|
|
||||||
@@ -13329,13 +13328,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;
|
|
||||||
+ const struct ix86_frame &frame = cfun->machine->frame;
|
|
||||||
|
|
||||||
m->fs.sp_valid = (!frame_pointer_needed
|
|
||||||
|| (crtl->sp_is_unchanging
|
|
||||||
@@ -13377,11 +13375,13 @@ ix86_expand_epilogue (int style)
|
|
||||||
+ UNITS_PER_WORD);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ HOST_WIDE_INT reg_save_offset = frame.reg_save_offset;
|
|
||||||
+
|
|
||||||
/* Special care must be taken for the normal return case of a function
|
|
||||||
using eh_return: the eax and edx registers are marked as saved, but
|
|
||||||
not restored along this path. Adjust the save location to match. */
|
|
||||||
if (crtl->calls_eh_return && style != 2)
|
|
||||||
- frame.reg_save_offset -= 2 * UNITS_PER_WORD;
|
|
||||||
+ reg_save_offset -= 2 * UNITS_PER_WORD;
|
|
||||||
|
|
||||||
/* EH_RETURN requires the use of moves to function properly. */
|
|
||||||
if (crtl->calls_eh_return)
|
|
||||||
@@ -13397,11 +13397,11 @@ ix86_expand_epilogue (int style)
|
|
||||||
else if (TARGET_EPILOGUE_USING_MOVE
|
|
||||||
&& cfun->machine->use_fast_prologue_epilogue
|
|
||||||
&& (frame.nregs > 1
|
|
||||||
- || m->fs.sp_offset != frame.reg_save_offset))
|
|
||||||
+ || m->fs.sp_offset != reg_save_offset))
|
|
||||||
restore_regs_via_mov = true;
|
|
||||||
else if (frame_pointer_needed
|
|
||||||
&& !frame.nregs
|
|
||||||
- && m->fs.sp_offset != frame.reg_save_offset)
|
|
||||||
+ && m->fs.sp_offset != reg_save_offset)
|
|
||||||
restore_regs_via_mov = true;
|
|
||||||
else if (frame_pointer_needed
|
|
||||||
&& TARGET_USE_LEAVE
|
|
||||||
@@ -13439,7 +13439,7 @@ ix86_expand_epilogue (int style)
|
|
||||||
rtx t;
|
|
||||||
|
|
||||||
if (frame.nregs)
|
|
||||||
- ix86_emit_restore_regs_using_mov (frame.reg_save_offset, style == 2);
|
|
||||||
+ ix86_emit_restore_regs_using_mov (reg_save_offset, style == 2);
|
|
||||||
|
|
||||||
/* eh_return epilogues need %ecx added to the stack pointer. */
|
|
||||||
if (style == 2)
|
|
||||||
@@ -13529,19 +13529,19 @@ ix86_expand_epilogue (int style)
|
|
||||||
epilogues. */
|
|
||||||
if (!m->fs.sp_valid
|
|
||||||
|| (TARGET_SEH
|
|
||||||
- && (m->fs.sp_offset - frame.reg_save_offset
|
|
||||||
+ && (m->fs.sp_offset - reg_save_offset
|
|
||||||
>= SEH_MAX_FRAME_SIZE)))
|
|
||||||
{
|
|
||||||
pro_epilogue_adjust_stack (stack_pointer_rtx, hard_frame_pointer_rtx,
|
|
||||||
GEN_INT (m->fs.fp_offset
|
|
||||||
- - frame.reg_save_offset),
|
|
||||||
+ - reg_save_offset),
|
|
||||||
style, false);
|
|
||||||
}
|
|
||||||
- else if (m->fs.sp_offset != frame.reg_save_offset)
|
|
||||||
+ else if (m->fs.sp_offset != reg_save_offset)
|
|
||||||
{
|
|
||||||
pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
|
|
||||||
GEN_INT (m->fs.sp_offset
|
|
||||||
- - frame.reg_save_offset),
|
|
||||||
+ - reg_save_offset),
|
|
||||||
style,
|
|
||||||
m->fs.cfa_reg == stack_pointer_rtx);
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.16.3
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,941 +0,0 @@
|
||||||
From 61bb7f0e152ce5be700a44007d036ea0de4b254d Mon Sep 17 00:00:00 2001
|
|
||||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
|
||||||
Date: Sat, 6 Jan 2018 22:29:56 -0800
|
|
||||||
Subject: [PATCH 06/13] 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* config/i386/predicates.md (indirect_branch_operand): Rewrite
|
|
||||||
ix86_indirect_branch_register logic.
|
|
||||||
---
|
|
||||||
gcc/config/i386/constraints.md | 6 ++--
|
|
||||||
gcc/config/i386/i386.md | 34 ++++++++++++++--------
|
|
||||||
gcc/config/i386/i386.opt | 4 +++
|
|
||||||
gcc/config/i386/predicates.md | 21 +++++++------
|
|
||||||
gcc/doc/invoke.texi | 6 +++-
|
|
||||||
gcc/testsuite/gcc.target/i386/indirect-thunk-1.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/indirect-thunk-2.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/indirect-thunk-3.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/indirect-thunk-4.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/indirect-thunk-5.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/indirect-thunk-6.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/indirect-thunk-7.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-attr-1.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-attr-2.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-attr-3.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-attr-4.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-attr-5.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-attr-6.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-attr-7.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-bnd-1.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-bnd-2.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-bnd-3.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-bnd-4.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-extern-1.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-extern-2.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-extern-3.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-extern-4.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-extern-5.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-extern-6.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-extern-7.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-inline-1.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-inline-2.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-inline-3.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-inline-4.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-inline-5.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-inline-6.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-inline-7.c | 2 +-
|
|
||||||
.../gcc.target/i386/indirect-thunk-register-1.c | 22 ++++++++++++++
|
|
||||||
.../gcc.target/i386/indirect-thunk-register-2.c | 20 +++++++++++++
|
|
||||||
.../gcc.target/i386/indirect-thunk-register-3.c | 19 ++++++++++++
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-10.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-11.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-12.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-13.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-14.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-15.c | 2 +-
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-9.c | 2 +-
|
|
||||||
47 files changed, 147 insertions(+), 63 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
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/constraints.md b/gcc/config/i386/constraints.md
|
|
||||||
index 1a4c701ad13..9204c8e8487 100644
|
|
||||||
--- a/gcc/config/i386/constraints.md
|
|
||||||
+++ b/gcc/config/i386/constraints.md
|
|
||||||
@@ -172,14 +172,16 @@
|
|
||||||
|
|
||||||
(define_constraint "Bs"
|
|
||||||
"@internal Sibcall memory operand."
|
|
||||||
- (ior (and (not (match_test "TARGET_X32"))
|
|
||||||
+ (ior (and (not (match_test "ix86_indirect_branch_register"))
|
|
||||||
+ (not (match_test "TARGET_X32"))
|
|
||||||
(match_operand 0 "sibcall_memory_operand"))
|
|
||||||
(and (match_test "TARGET_X32 && Pmode == DImode")
|
|
||||||
(match_operand 0 "GOT_memory_operand"))))
|
|
||||||
|
|
||||||
(define_constraint "Bw"
|
|
||||||
"@internal Call memory operand."
|
|
||||||
- (ior (and (not (match_test "TARGET_X32"))
|
|
||||||
+ (ior (and (not (match_test "ix86_indirect_branch_register"))
|
|
||||||
+ (not (match_test "TARGET_X32"))
|
|
||||||
(match_operand 0 "memory_operand"))
|
|
||||||
(and (match_test "TARGET_X32 && Pmode == DImode")
|
|
||||||
(match_operand 0 "GOT_memory_operand"))))
|
|
||||||
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
|
|
||||||
index 2da671e9f2d..05a88fff356 100644
|
|
||||||
--- a/gcc/config/i386/i386.md
|
|
||||||
+++ b/gcc/config/i386/i386.md
|
|
||||||
@@ -11805,7 +11805,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;
|
|
||||||
})
|
|
||||||
@@ -11859,7 +11859,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;
|
|
||||||
})
|
|
||||||
@@ -12048,7 +12048,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")])
|
|
||||||
|
|
||||||
@@ -12057,7 +12057,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))
|
|
||||||
&& !reg_mentioned_p (operands[0],
|
|
||||||
CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"
|
|
||||||
[(parallel [(call (mem:QI (match_dup 1))
|
|
||||||
@@ -12070,7 +12072,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))
|
|
||||||
&& !reg_mentioned_p (operands[0],
|
|
||||||
CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"
|
|
||||||
[(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
|
|
||||||
@@ -12092,7 +12096,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)
|
|
||||||
@@ -12112,7 +12116,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)
|
|
||||||
@@ -12166,7 +12170,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
|
|
||||||
@@ -12244,7 +12250,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")])
|
|
||||||
|
|
||||||
@@ -12254,7 +12260,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))
|
|
||||||
&& !reg_mentioned_p (operands[0],
|
|
||||||
CALL_INSN_FUNCTION_USAGE (peep2_next_insn (1)))"
|
|
||||||
[(parallel [(set (match_dup 2)
|
|
||||||
@@ -12269,7 +12277,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))
|
|
||||||
&& !reg_mentioned_p (operands[0],
|
|
||||||
CALL_INSN_FUNCTION_USAGE (peep2_next_insn (2)))"
|
|
||||||
[(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
|
|
||||||
@@ -12294,7 +12304,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)
|
|
||||||
diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
|
|
||||||
index ad5916fb643..a97f84f68f2 100644
|
|
||||||
--- a/gcc/config/i386/i386.opt
|
|
||||||
+++ b/gcc/config/i386/i386.opt
|
|
||||||
@@ -921,3 +921,7 @@ Enum(indirect_branch) String(thunk-inline) Value(indirect_branch_thunk_inline)
|
|
||||||
|
|
||||||
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.
|
|
||||||
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
|
|
||||||
index 93dda7bb0e7..d1f0a7dbf61 100644
|
|
||||||
--- a/gcc/config/i386/predicates.md
|
|
||||||
+++ b/gcc/config/i386/predicates.md
|
|
||||||
@@ -593,7 +593,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"))))
|
|
||||||
|
|
||||||
;; Return true if OP is a memory operands that can be used in sibcalls.
|
|
||||||
@@ -636,20 +637,22 @@
|
|
||||||
(ior (match_test "constant_call_address_operand
|
|
||||||
(op, mode == VOIDmode ? mode : Pmode)")
|
|
||||||
(match_operand 0 "call_register_no_elim_operand")
|
|
||||||
- (ior (and (not (match_test "TARGET_X32"))
|
|
||||||
- (match_operand 0 "memory_operand"))
|
|
||||||
- (and (match_test "TARGET_X32 && Pmode == DImode")
|
|
||||||
- (match_operand 0 "GOT_memory_operand")))))
|
|
||||||
+ (and (not (match_test "ix86_indirect_branch_register"))
|
|
||||||
+ (ior (and (not (match_test "TARGET_X32"))
|
|
||||||
+ (match_operand 0 "memory_operand"))
|
|
||||||
+ (and (match_test "TARGET_X32 && Pmode == DImode")
|
|
||||||
+ (match_operand 0 "GOT_memory_operand"))))))
|
|
||||||
|
|
||||||
;; Similarly, but for tail calls, in which we cannot allow memory references.
|
|
||||||
(define_special_predicate "sibcall_insn_operand"
|
|
||||||
(ior (match_test "constant_call_address_operand
|
|
||||||
(op, mode == VOIDmode ? mode : Pmode)")
|
|
||||||
(match_operand 0 "register_no_elim_operand")
|
|
||||||
- (ior (and (not (match_test "TARGET_X32"))
|
|
||||||
- (match_operand 0 "sibcall_memory_operand"))
|
|
||||||
- (and (match_test "TARGET_X32 && Pmode == DImode")
|
|
||||||
- (match_operand 0 "GOT_memory_operand")))))
|
|
||||||
+ (and (not (match_test "ix86_indirect_branch_register"))
|
|
||||||
+ (ior (and (not (match_test "TARGET_X32"))
|
|
||||||
+ (match_operand 0 "sibcall_memory_operand"))
|
|
||||||
+ (and (match_test "TARGET_X32 && Pmode == DImode")
|
|
||||||
+ (match_operand 0 "GOT_memory_operand"))))))
|
|
||||||
|
|
||||||
;; Return true if OP is a 32-bit GOT symbol operand.
|
|
||||||
(define_predicate "GOT32_symbol_operand"
|
|
||||||
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
|
|
||||||
index 337a761015a..94374661f2d 100644
|
|
||||||
--- a/gcc/doc/invoke.texi
|
|
||||||
+++ b/gcc/doc/invoke.texi
|
|
||||||
@@ -1170,7 +1170,7 @@ See RS/6000 and PowerPC Options.
|
|
||||||
-mavx256-split-unaligned-load -mavx256-split-unaligned-store @gol
|
|
||||||
-malign-data=@var{type} -mstack-protector-guard=@var{guard} @gol
|
|
||||||
-mmitigate-rop -mindirect-branch=@var{choice} @gol
|
|
||||||
--mfunction-return=@var{choice}}
|
|
||||||
+-mfunction-return=@var{choice} -mindirect-branch-register}
|
|
||||||
|
|
||||||
@emph{x86 Windows Options}
|
|
||||||
@gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol
|
|
||||||
@@ -24253,6 +24253,10 @@ object file. You can control this behavior for a specific function by
|
|
||||||
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
|
|
||||||
|
|
||||||
These @samp{-m} switches are supported in addition to the above
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
|
|
||||||
index e365ef5698a..60d09881a99 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-1.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
|
|
||||||
index 05a51ad9157..aac75163794 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-2.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
|
|
||||||
index 3c0d4c39f0b..9e24a385387 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-3.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
|
|
||||||
index 14d4ef6dd98..127b5d94523 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-4.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
|
|
||||||
index b4836c38d6c..fcaa18d10b7 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-5.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* { dg-do compile { target *-*-linux* } } */
|
|
||||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
|
|
||||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
|
|
||||||
|
|
||||||
extern void bar (void);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
|
|
||||||
index 1f06bd1af74..e4649283d10 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-6.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* { dg-do compile { target *-*-linux* } } */
|
|
||||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
|
|
||||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk" } */
|
|
||||||
|
|
||||||
extern void bar (void);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
|
|
||||||
index bc6b47a636e..17c2d0faf88 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-7.c
|
|
||||||
+++ b/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);
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
|
|
||||||
index 2257be3affa..9194ccf3cbc 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-1.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
|
|
||||||
index e9cfdc5879e..e51f261a612 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-2.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
|
|
||||||
index f938db050f7..4aeec1833cd 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-3.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
|
|
||||||
index 4e58599692a..ac0e5999f63 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-4.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
|
|
||||||
index b8d50249d8b..573cf1ef09e 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-5.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
|
|
||||||
index 455adabfe0e..b2b37fc6e2e 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-6.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
|
|
||||||
index 4595b841ec0..4a43e199931 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-attr-7.c
|
|
||||||
+++ b/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);
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
|
|
||||||
index 5e3e118e9bd..ac84ab623fa 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-1.c
|
|
||||||
+++ b/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];
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
|
|
||||||
index 2801aa4192e..ce655e8be1c 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-2.c
|
|
||||||
+++ b/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];
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
|
|
||||||
index 70b4fb36eea..d34485a0010 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-3.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */
|
|
||||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
|
|
||||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
|
|
||||||
|
|
||||||
void bar (char *);
|
|
||||||
char buf[10];
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
|
|
||||||
index 3baf03ee77c..0e19830de4d 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-bnd-4.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* { dg-do compile { target { *-*-linux* && { ! x32 } } } } */
|
|
||||||
-/* { dg-options "-O2 -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
|
|
||||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mno-indirect-branch-register -mfunction-return=keep -mindirect-branch=thunk -fcheck-pointer-bounds -mmpx -fpic -fno-plt" } */
|
|
||||||
|
|
||||||
void bar (char *);
|
|
||||||
char buf[10];
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
|
|
||||||
index edeb264218c..579441f250e 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-1.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
|
|
||||||
index 1d00413a76a..c92e6f2b02d 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-2.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
|
|
||||||
index 06ebf1c9063..d9964c25bbd 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-3.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
|
|
||||||
index 1c8f9446636..d4dca4dc5fe 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-4.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
|
|
||||||
index 21740ac5b7f..5c07e02df6a 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-5.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* { dg-do compile { target *-*-linux* } } */
|
|
||||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
|
|
||||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
|
|
||||||
|
|
||||||
extern void bar (void);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
|
|
||||||
index a77c1f470b8..3eb440693a0 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-6.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* { dg-do compile { target *-*-linux* } } */
|
|
||||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
|
|
||||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-extern" } */
|
|
||||||
|
|
||||||
extern void bar (void);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
|
|
||||||
index 86e9fd1f1e4..aece9383697 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-extern-7.c
|
|
||||||
+++ b/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);
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
|
|
||||||
index 3ecde878867..3aba5e8c81f 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-1.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
|
|
||||||
index df32a19a2b5..0f0181d6672 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-2.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
|
|
||||||
index 9540996de01..2eef6f35a75 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-3.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
|
|
||||||
index f3db6e2441f..e825a10f14c 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-4.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
|
|
||||||
index 0f687c3b027..c6d77e10352 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-5.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* { dg-do compile { target *-*-linux* } } */
|
|
||||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
|
|
||||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
|
|
||||||
|
|
||||||
extern void bar (void);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
|
|
||||||
index b27c6fc96a2..6454827b780 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-6.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* { dg-do compile { target *-*-linux* } } */
|
|
||||||
-/* { dg-options "-O2 -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
|
|
||||||
+/* { dg-options "-O2 -mno-indirect-branch-register -mfunction-return=keep -fpic -fno-plt -mindirect-branch=thunk-inline" } */
|
|
||||||
|
|
||||||
extern void bar (void);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
|
|
||||||
index 764a375fc37..c67066cf197 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/indirect-thunk-inline-7.c
|
|
||||||
+++ b/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);
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-1.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..7d396a31953
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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" } } */
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-2.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..e7e616bb271
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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" } } */
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-register-3.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..5320e923be2
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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" } } */
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-10.c b/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
|
|
||||||
index 3a6727b5c54..e6fea84a4d9 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-10.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-11.c b/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
|
|
||||||
index b8f68188313..e239ec4542f 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-11.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-12.c b/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
|
|
||||||
index 01b0a02f80b..fa3181303c9 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-12.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-13.c b/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
|
|
||||||
index 4b497b5f8af..fd5b41fdd3f 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-13.c
|
|
||||||
+++ b/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")));
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-14.c b/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
|
|
||||||
index 4ae4c44a3fd..d606373ead1 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-14.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-15.c b/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
|
|
||||||
index 5b5bc765a7e..75e45e226b8 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-15.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
|
||||||
index fa24a1f7365..d1db41cc128 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
|
||||||
+++ b/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);
|
|
||||||
|
|
||||||
--
|
|
||||||
2.16.3
|
|
||||||
|
|
|
@ -1,134 +0,0 @@
|
||||||
From 92308185917678406afee3c165ea5e71b53b3cc1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
|
||||||
Date: Sat, 6 Jan 2018 22:29:56 -0800
|
|
||||||
Subject: [PATCH 07/13] 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* gcc.target/i386/indirect-thunk-register-4.c: New test.
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 13 ++++++++++++-
|
|
||||||
gcc/doc/extend.texi | 3 +++
|
|
||||||
gcc/testsuite/gcc.target/i386/indirect-thunk-register-4.c | 13 +++++++++++++
|
|
||||||
3 files changed, 28 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 34e26a3a3c7..eeca7e5e490 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -16869,6 +16869,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
|
|
||||||
@@ -16879,7 +16880,7 @@ print_reg (rtx x, int code, FILE *file)
|
|
||||||
unsigned int regno;
|
|
||||||
bool duplicated;
|
|
||||||
|
|
||||||
- if (ASSEMBLER_DIALECT == ASM_ATT)
|
|
||||||
+ if (ASSEMBLER_DIALECT == ASM_ATT && code != 'V')
|
|
||||||
putc ('%', file);
|
|
||||||
|
|
||||||
if (x == pc_rtx)
|
|
||||||
@@ -16922,6 +16923,14 @@ print_reg (rtx x, int code, FILE *file)
|
|
||||||
&& regno != FPSR_REG
|
|
||||||
&& regno != FPCR_REG);
|
|
||||||
|
|
||||||
+ if (code == 'V')
|
|
||||||
+ {
|
|
||||||
+ if (GENERAL_REGNO_P (regno))
|
|
||||||
+ msize = GET_MODE_SIZE (word_mode);
|
|
||||||
+ else
|
|
||||||
+ error ("'V' modifier on non-integer register");
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
duplicated = code == 'd' && TARGET_AVX;
|
|
||||||
|
|
||||||
switch (msize)
|
|
||||||
@@ -17035,6 +17044,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.
|
|
||||||
@@ -17259,6 +17269,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/doc/extend.texi b/gcc/doc/extend.texi
|
|
||||||
index 2cb6bd1ef3e..76ba1d4f913 100644
|
|
||||||
--- a/gcc/doc/extend.texi
|
|
||||||
+++ b/gcc/doc/extend.texi
|
|
||||||
@@ -8511,6 +8511,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/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 00000000000..f0cd9b75be8
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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.16.3
|
|
||||||
|
|
|
@ -1,299 +0,0 @@
|
||||||
From 087b12213a5b4b8654c70320c671bb05c1b1b012 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
|
||||||
Date: Sat, 13 Jan 2018 18:01:54 -0800
|
|
||||||
Subject: [PATCH 08/13] 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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 <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* 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.
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 26 ++++++++++++++++++++++
|
|
||||||
gcc/doc/invoke.texi | 11 +++++++++
|
|
||||||
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 ++++++++
|
|
||||||
13 files changed, 126 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 eeca7e5e490..9c038bee000 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -6389,6 +6389,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)
|
|
||||||
@@ -6414,6 +6427,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/doc/invoke.texi b/gcc/doc/invoke.texi
|
|
||||||
index 94374661f2d..1dee495c86b 100644
|
|
||||||
--- a/gcc/doc/invoke.texi
|
|
||||||
+++ b/gcc/doc/invoke.texi
|
|
||||||
@@ -24242,6 +24242,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},
|
|
||||||
@@ -24253,6 +24258,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/gcc/testsuite/gcc.target/i386/indirect-thunk-10.c b/gcc/testsuite/gcc.target/i386/indirect-thunk-10.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..a0674bd2363
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..7a80a8986e8
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..d4d45c5114d
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..3a2aeaddbc5
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..8e52f032b6c
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..bdaa4f6911b
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..0605e2c6542
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..307019dc242
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..772617f4010
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..1e9f9bd5a66
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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 00000000000..eea07f7abe1
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/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.16.3
|
|
||||||
|
|
|
@ -1,121 +0,0 @@
|
||||||
From 07857bd9fb9ccab67a932ad9df3e53f3f0c2c617 Mon Sep 17 00:00:00 2001
|
|
||||||
From: uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
||||||
Date: Thu, 25 Jan 2018 19:39:01 +0000
|
|
||||||
Subject: [PATCH 09/13] Use INVALID_REGNUM in indirect thunk processing
|
|
||||||
|
|
||||||
Backport from mainline
|
|
||||||
2018-01-17 Uros Bizjak <ubizjak@gmail.com>
|
|
||||||
|
|
||||||
* config/i386/i386.c (indirect_thunk_name): Declare regno
|
|
||||||
as unsigned int. Compare regno with INVALID_REGNUM.
|
|
||||||
(output_indirect_thunk): Ditto.
|
|
||||||
(output_indirect_thunk_function): Ditto.
|
|
||||||
(ix86_code_end): Declare regno as unsigned int. Use INVALID_REGNUM
|
|
||||||
in the call to output_indirect_thunk_function.
|
|
||||||
|
|
||||||
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@257067 138bc75d-0d04-0410-961f-82ee72b054a4
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 30 +++++++++++++++---------------
|
|
||||||
1 file changed, 15 insertions(+), 15 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
|
||||||
index 9c038bee000..40126579c22 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -11087,16 +11087,16 @@ 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,
|
|
||||||
- bool ret_p)
|
|
||||||
+indirect_thunk_name (char name[32], unsigned int regno,
|
|
||||||
+ bool need_bnd_p, bool ret_p)
|
|
||||||
{
|
|
||||||
- if (regno >= 0 && ret_p)
|
|
||||||
+ if (regno != INVALID_REGNUM && ret_p)
|
|
||||||
gcc_unreachable ();
|
|
||||||
|
|
||||||
if (USE_HIDDEN_LINKONCE)
|
|
||||||
{
|
|
||||||
const char *bnd = need_bnd_p ? "_bnd" : "";
|
|
||||||
- if (regno >= 0)
|
|
||||||
+ if (regno != INVALID_REGNUM)
|
|
||||||
{
|
|
||||||
const char *reg_prefix;
|
|
||||||
if (LEGACY_INT_REGNO_P (regno))
|
|
||||||
@@ -11114,7 +11114,7 @@ indirect_thunk_name (char name[32], int regno, bool need_bnd_p,
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
- if (regno >= 0)
|
|
||||||
+ if (regno != INVALID_REGNUM)
|
|
||||||
{
|
|
||||||
if (need_bnd_p)
|
|
||||||
ASM_GENERATE_INTERNAL_LABEL (name, "LITBR", regno);
|
|
||||||
@@ -11166,7 +11166,7 @@ indirect_thunk_name (char name[32], int regno, bool need_bnd_p,
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void
|
|
||||||
-output_indirect_thunk (bool need_bnd_p, int regno)
|
|
||||||
+output_indirect_thunk (bool need_bnd_p, unsigned int regno)
|
|
||||||
{
|
|
||||||
char indirectlabel1[32];
|
|
||||||
char indirectlabel2[32];
|
|
||||||
@@ -11196,7 +11196,7 @@ output_indirect_thunk (bool need_bnd_p, int regno)
|
|
||||||
|
|
||||||
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2);
|
|
||||||
|
|
||||||
- if (regno >= 0)
|
|
||||||
+ if (regno != INVALID_REGNUM)
|
|
||||||
{
|
|
||||||
/* MOV. */
|
|
||||||
rtx xops[2];
|
|
||||||
@@ -11220,12 +11220,12 @@ output_indirect_thunk (bool need_bnd_p, int regno)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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
|
|
||||||
+ If BND_P is true, the BND prefix is needed. If REGNO != INVALID_REGNUM,
|
|
||||||
+ 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)
|
|
||||||
+output_indirect_thunk_function (bool need_bnd_p, unsigned int regno)
|
|
||||||
{
|
|
||||||
char name[32];
|
|
||||||
tree decl;
|
|
||||||
@@ -11274,7 +11274,7 @@ output_indirect_thunk_function (bool need_bnd_p, int regno)
|
|
||||||
ASM_OUTPUT_LABEL (asm_out_file, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (regno < 0)
|
|
||||||
+ if (regno == INVALID_REGNUM)
|
|
||||||
{
|
|
||||||
/* Create alias for __x86.return_thunk/__x86.return_thunk_bnd. */
|
|
||||||
char alias[32];
|
|
||||||
@@ -11348,16 +11348,16 @@ static void
|
|
||||||
ix86_code_end (void)
|
|
||||||
{
|
|
||||||
rtx xops[2];
|
|
||||||
- int regno;
|
|
||||||
+ unsigned int regno;
|
|
||||||
|
|
||||||
if (indirect_thunk_needed)
|
|
||||||
- output_indirect_thunk_function (false, -1);
|
|
||||||
+ output_indirect_thunk_function (false, INVALID_REGNUM);
|
|
||||||
if (indirect_thunk_bnd_needed)
|
|
||||||
- output_indirect_thunk_function (true, -1);
|
|
||||||
+ output_indirect_thunk_function (true, INVALID_REGNUM);
|
|
||||||
|
|
||||||
for (regno = FIRST_REX_INT_REG; regno <= LAST_REX_INT_REG; regno++)
|
|
||||||
{
|
|
||||||
- int i = regno - FIRST_REX_INT_REG + LAST_INT_REG + 1;
|
|
||||||
+ unsigned int i = regno - FIRST_REX_INT_REG + LAST_INT_REG + 1;
|
|
||||||
if ((indirect_thunks_used & (1 << i)))
|
|
||||||
output_indirect_thunk_function (false, regno);
|
|
||||||
|
|
||||||
--
|
|
||||||
2.16.3
|
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
From 3815e98f0f46b6c4c41e6810bad987bd083691aa Mon Sep 17 00:00:00 2001
|
|
||||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
||||||
Date: Fri, 2 Feb 2018 16:47:02 +0000
|
|
||||||
Subject: [PATCH 10/13] i386: Pass INVALID_REGNUM as invalid register number
|
|
||||||
|
|
||||||
Backport from mainline
|
|
||||||
* config/i386/i386.c (ix86_output_function_return): Pass
|
|
||||||
INVALID_REGNUM, instead of -1, as invalid register number to
|
|
||||||
indirect_thunk_name and output_indirect_thunk.
|
|
||||||
|
|
||||||
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@257341 138bc75d-0d04-0410-961f-82ee72b054a4
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 5 +++--
|
|
||||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
|
||||||
index 40126579c22..66502ee6da6 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -28056,7 +28056,8 @@ ix86_output_function_return (bool long_p)
|
|
||||||
{
|
|
||||||
bool need_thunk = (cfun->machine->function_return_type
|
|
||||||
== indirect_branch_thunk);
|
|
||||||
- indirect_thunk_name (thunk_name, -1, need_bnd_p, true);
|
|
||||||
+ indirect_thunk_name (thunk_name, INVALID_REGNUM, need_bnd_p,
|
|
||||||
+ true);
|
|
||||||
if (need_bnd_p)
|
|
||||||
{
|
|
||||||
indirect_thunk_bnd_needed |= need_thunk;
|
|
||||||
@@ -28069,7 +28070,7 @@ ix86_output_function_return (bool long_p)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
- output_indirect_thunk (need_bnd_p, -1);
|
|
||||||
+ output_indirect_thunk (need_bnd_p, INVALID_REGNUM);
|
|
||||||
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.16.3
|
|
||||||
|
|
|
@ -1,456 +0,0 @@
|
||||||
From 771535dec733e4b85924f00a3a94c29683d614e5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
||||||
Date: Mon, 26 Feb 2018 15:29:30 +0000
|
|
||||||
Subject: [PATCH 11/13] i386: Update -mfunction-return= for return with pop
|
|
||||||
|
|
||||||
When -mfunction-return= is used, simple_return_pop_internal should pop
|
|
||||||
return address into ECX register, adjust stack by bytes to pop from stack
|
|
||||||
and jump to the return thunk via ECX register.
|
|
||||||
|
|
||||||
Revision 257992 removed the bool argument from ix86_output_indirect_jmp.
|
|
||||||
Update comments to reflect it.
|
|
||||||
|
|
||||||
Tested on i686 and x86-64.
|
|
||||||
|
|
||||||
gcc/
|
|
||||||
|
|
||||||
Backport from mainline
|
|
||||||
2018-02-26 H.J. Lu <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
* config/i386/i386.c (ix86_output_indirect_jmp): Update comments.
|
|
||||||
|
|
||||||
2018-02-26 H.J. Lu <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
PR target/84530
|
|
||||||
* config/i386/i386-protos.h (ix86_output_indirect_jmp): Remove
|
|
||||||
the bool argument.
|
|
||||||
(ix86_output_indirect_function_return): New prototype.
|
|
||||||
(ix86_split_simple_return_pop_internal): Likewise.
|
|
||||||
* config/i386/i386.c (indirect_return_via_cx): New.
|
|
||||||
(indirect_return_via_cx_bnd): Likewise.
|
|
||||||
(indirect_thunk_name): Handle return va CX_REG.
|
|
||||||
(output_indirect_thunk_function): Create alias for
|
|
||||||
__x86_return_thunk_[re]cx and __x86_return_thunk_[re]cx_bnd.
|
|
||||||
(ix86_output_indirect_jmp): Remove the bool argument.
|
|
||||||
(ix86_output_indirect_function_return): New function.
|
|
||||||
(ix86_split_simple_return_pop_internal): Likewise.
|
|
||||||
* config/i386/i386.md (*indirect_jump): Don't pass false
|
|
||||||
to ix86_output_indirect_jmp.
|
|
||||||
(*tablejump_1): Likewise.
|
|
||||||
(simple_return_pop_internal): Change it to define_insn_and_split.
|
|
||||||
Call ix86_split_simple_return_pop_internal to split it for
|
|
||||||
-mfunction-return=.
|
|
||||||
(simple_return_indirect_internal): Call
|
|
||||||
ix86_output_indirect_function_return instead of
|
|
||||||
ix86_output_indirect_jmp.
|
|
||||||
|
|
||||||
gcc/testsuite/
|
|
||||||
|
|
||||||
Backport from mainline
|
|
||||||
2018-02-26 H.J. Lu <hongjiu.lu@intel.com>
|
|
||||||
|
|
||||||
PR target/84530
|
|
||||||
* gcc.target/i386/ret-thunk-22.c: New test.
|
|
||||||
* gcc.target/i386/ret-thunk-23.c: Likewise.
|
|
||||||
* gcc.target/i386/ret-thunk-24.c: Likewise.
|
|
||||||
* gcc.target/i386/ret-thunk-25.c: Likewise.
|
|
||||||
* gcc.target/i386/ret-thunk-26.c: Likewise.
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386-protos.h | 4 +-
|
|
||||||
gcc/config/i386/i386.c | 127 +++++++++++++++++++++++----
|
|
||||||
gcc/config/i386/i386.md | 11 ++-
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-22.c | 15 ++++
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-23.c | 15 ++++
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-24.c | 15 ++++
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-25.c | 15 ++++
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-26.c | 40 +++++++++
|
|
||||||
8 files changed, 222 insertions(+), 20 deletions(-)
|
|
||||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-22.c
|
|
||||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-23.c
|
|
||||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-24.c
|
|
||||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-25.c
|
|
||||||
create mode 100644 gcc/testsuite/gcc.target/i386/ret-thunk-26.c
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
|
|
||||||
index 620d70ef9f6..c7a0ccb58d3 100644
|
|
||||||
--- a/gcc/config/i386/i386-protos.h
|
|
||||||
+++ b/gcc/config/i386/i386-protos.h
|
|
||||||
@@ -311,8 +311,10 @@ 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);
|
|
||||||
+extern const char * ix86_output_indirect_jmp (rtx call_op);
|
|
||||||
extern const char * ix86_output_function_return (bool long_p);
|
|
||||||
+extern const char * ix86_output_indirect_function_return (rtx ret_op);
|
|
||||||
+extern void ix86_split_simple_return_pop_internal (rtx);
|
|
||||||
extern bool ix86_operands_ok_for_move_multiple (rtx *operands, bool load,
|
|
||||||
enum machine_mode mode);
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
|
||||||
index 66502ee6da6..21c3c18bd3c 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -11080,6 +11080,12 @@ static int indirect_thunks_used;
|
|
||||||
by call and return thunks functions with the BND prefix. */
|
|
||||||
static int indirect_thunks_bnd_used;
|
|
||||||
|
|
||||||
+/* True if return thunk function via CX is needed. */
|
|
||||||
+static bool indirect_return_via_cx;
|
|
||||||
+/* True if return thunk function via CX with the BND prefix is
|
|
||||||
+ needed. */
|
|
||||||
+static bool indirect_return_via_cx_bnd;
|
|
||||||
+
|
|
||||||
#ifndef INDIRECT_LABEL
|
|
||||||
# define INDIRECT_LABEL "LIND"
|
|
||||||
#endif
|
|
||||||
@@ -11090,12 +11096,13 @@ static void
|
|
||||||
indirect_thunk_name (char name[32], unsigned int regno,
|
|
||||||
bool need_bnd_p, bool ret_p)
|
|
||||||
{
|
|
||||||
- if (regno != INVALID_REGNUM && ret_p)
|
|
||||||
+ if (regno != INVALID_REGNUM && regno != CX_REG && ret_p)
|
|
||||||
gcc_unreachable ();
|
|
||||||
|
|
||||||
if (USE_HIDDEN_LINKONCE)
|
|
||||||
{
|
|
||||||
const char *bnd = need_bnd_p ? "_bnd" : "";
|
|
||||||
+ const char *ret = ret_p ? "return" : "indirect";
|
|
||||||
if (regno != INVALID_REGNUM)
|
|
||||||
{
|
|
||||||
const char *reg_prefix;
|
|
||||||
@@ -11103,14 +11110,11 @@ indirect_thunk_name (char name[32], unsigned int regno,
|
|
||||||
reg_prefix = TARGET_64BIT ? "r" : "e";
|
|
||||||
else
|
|
||||||
reg_prefix = "";
|
|
||||||
- sprintf (name, "__x86_indirect_thunk%s_%s%s",
|
|
||||||
- bnd, reg_prefix, reg_names[regno]);
|
|
||||||
+ sprintf (name, "__x86_%s_thunk%s_%s%s",
|
|
||||||
+ ret, bnd, reg_prefix, reg_names[regno]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
- {
|
|
||||||
- const char *ret = ret_p ? "return" : "indirect";
|
|
||||||
- sprintf (name, "__x86_%s_thunk%s", ret, bnd);
|
|
||||||
- }
|
|
||||||
+ sprintf (name, "__x86_%s_thunk%s", ret, bnd);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
@@ -11274,9 +11278,23 @@ output_indirect_thunk_function (bool need_bnd_p, unsigned int regno)
|
|
||||||
ASM_OUTPUT_LABEL (asm_out_file, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /* Create alias for __x86_return_thunk/__x86_return_thunk_bnd or
|
|
||||||
+ __x86_return_thunk_ecx/__x86_return_thunk_ecx_bnd. */
|
|
||||||
+ bool need_alias;
|
|
||||||
if (regno == INVALID_REGNUM)
|
|
||||||
+ need_alias = true;
|
|
||||||
+ else if (regno == CX_REG)
|
|
||||||
+ {
|
|
||||||
+ if (need_bnd_p)
|
|
||||||
+ need_alias = indirect_return_via_cx_bnd;
|
|
||||||
+ else
|
|
||||||
+ need_alias = indirect_return_via_cx;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ need_alias = false;
|
|
||||||
+
|
|
||||||
+ if (need_alias)
|
|
||||||
{
|
|
||||||
- /* Create alias for __x86.return_thunk/__x86.return_thunk_bnd. */
|
|
||||||
char alias[32];
|
|
||||||
|
|
||||||
indirect_thunk_name (alias, regno, need_bnd_p, true);
|
|
||||||
@@ -28019,18 +28037,17 @@ ix86_output_indirect_branch (rtx call_op, const char *xasm,
|
|
||||||
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. */
|
|
||||||
+
|
|
||||||
+/* Output indirect jump. CALL_OP is the jump target. */
|
|
||||||
|
|
||||||
const char *
|
|
||||||
-ix86_output_indirect_jmp (rtx call_op, bool ret_p)
|
|
||||||
+ix86_output_indirect_jmp (rtx call_op)
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
+ /* We can't have red-zone since "call" in the indirect thunk
|
|
||||||
+ pushes the return address onto stack, destroying red-zone. */
|
|
||||||
+ if (ix86_red_zone_size != 0)
|
|
||||||
gcc_unreachable ();
|
|
||||||
|
|
||||||
ix86_output_indirect_branch (call_op, "%0", true);
|
|
||||||
@@ -28081,6 +28098,86 @@ ix86_output_function_return (bool long_p)
|
|
||||||
return "rep%; ret";
|
|
||||||
}
|
|
||||||
|
|
||||||
+/* Output indirect function return. RET_OP is the function return
|
|
||||||
+ target. */
|
|
||||||
+
|
|
||||||
+const char *
|
|
||||||
+ix86_output_indirect_function_return (rtx ret_op)
|
|
||||||
+{
|
|
||||||
+ 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);
|
|
||||||
+ unsigned int regno = REGNO (ret_op);
|
|
||||||
+ gcc_assert (regno == CX_REG);
|
|
||||||
+
|
|
||||||
+ 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, regno, need_bnd_p, true);
|
|
||||||
+ if (need_bnd_p)
|
|
||||||
+ {
|
|
||||||
+ if (need_thunk)
|
|
||||||
+ {
|
|
||||||
+ indirect_return_via_cx_bnd = true;
|
|
||||||
+ indirect_thunks_bnd_used |= 1 << CX_REG;
|
|
||||||
+ }
|
|
||||||
+ fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name);
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ if (need_thunk)
|
|
||||||
+ {
|
|
||||||
+ indirect_return_via_cx = true;
|
|
||||||
+ indirect_thunks_used |= 1 << CX_REG;
|
|
||||||
+ }
|
|
||||||
+ fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ output_indirect_thunk (need_bnd_p, regno);
|
|
||||||
+
|
|
||||||
+ return "";
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ return "%!jmp\t%A0";
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/* Split simple return with popping POPC bytes from stack to indirect
|
|
||||||
+ branch with stack adjustment . */
|
|
||||||
+
|
|
||||||
+void
|
|
||||||
+ix86_split_simple_return_pop_internal (rtx popc)
|
|
||||||
+{
|
|
||||||
+ struct machine_function *m = cfun->machine;
|
|
||||||
+ rtx ecx = gen_rtx_REG (SImode, CX_REG);
|
|
||||||
+ rtx_insn *insn;
|
|
||||||
+
|
|
||||||
+ /* There is no "pascal" calling convention in any 64bit ABI. */
|
|
||||||
+ gcc_assert (!TARGET_64BIT);
|
|
||||||
+
|
|
||||||
+ insn = emit_insn (gen_pop (ecx));
|
|
||||||
+ m->fs.cfa_offset -= UNITS_PER_WORD;
|
|
||||||
+ m->fs.sp_offset -= UNITS_PER_WORD;
|
|
||||||
+
|
|
||||||
+ rtx x = plus_constant (Pmode, stack_pointer_rtx, UNITS_PER_WORD);
|
|
||||||
+ x = gen_rtx_SET (stack_pointer_rtx, x);
|
|
||||||
+ add_reg_note (insn, REG_CFA_ADJUST_CFA, x);
|
|
||||||
+ add_reg_note (insn, REG_CFA_REGISTER, gen_rtx_SET (ecx, pc_rtx));
|
|
||||||
+ RTX_FRAME_RELATED_P (insn) = 1;
|
|
||||||
+
|
|
||||||
+ x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, popc);
|
|
||||||
+ x = gen_rtx_SET (stack_pointer_rtx, x);
|
|
||||||
+ insn = emit_insn (x);
|
|
||||||
+ add_reg_note (insn, REG_CFA_ADJUST_CFA, x);
|
|
||||||
+ RTX_FRAME_RELATED_P (insn) = 1;
|
|
||||||
+
|
|
||||||
+ /* Now return address is in ECX. */
|
|
||||||
+ emit_jump_insn (gen_simple_return_indirect_internal (ecx));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/* Output the assembly for a call instruction. */
|
|
||||||
|
|
||||||
const char *
|
|
||||||
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
|
|
||||||
index 05a88fff356..857466a6361 100644
|
|
||||||
--- a/gcc/config/i386/i386.md
|
|
||||||
+++ b/gcc/config/i386/i386.md
|
|
||||||
@@ -11813,7 +11813,7 @@
|
|
||||||
(define_insn "*indirect_jump"
|
|
||||||
[(set (pc) (match_operand:W 0 "indirect_branch_operand" "rBw"))]
|
|
||||||
""
|
|
||||||
- "* return ix86_output_indirect_jmp (operands[0], false);"
|
|
||||||
+ "* return ix86_output_indirect_jmp (operands[0]);"
|
|
||||||
[(set (attr "type")
|
|
||||||
(if_then_else (match_test "(cfun->machine->indirect_branch_type
|
|
||||||
!= indirect_branch_keep)")
|
|
||||||
@@ -11868,7 +11868,7 @@
|
|
||||||
[(set (pc) (match_operand:W 0 "indirect_branch_operand" "rBw"))
|
|
||||||
(use (label_ref (match_operand 1)))]
|
|
||||||
""
|
|
||||||
- "* return ix86_output_indirect_jmp (operands[0], false);"
|
|
||||||
+ "* return ix86_output_indirect_jmp (operands[0]);"
|
|
||||||
[(set (attr "type")
|
|
||||||
(if_then_else (match_test "(cfun->machine->indirect_branch_type
|
|
||||||
!= indirect_branch_keep)")
|
|
||||||
@@ -12520,11 +12520,14 @@
|
|
||||||
(set_attr "prefix_rep" "1")
|
|
||||||
(set_attr "modrm" "0")])
|
|
||||||
|
|
||||||
-(define_insn "simple_return_pop_internal"
|
|
||||||
+(define_insn_and_split "simple_return_pop_internal"
|
|
||||||
[(simple_return)
|
|
||||||
(use (match_operand:SI 0 "const_int_operand"))]
|
|
||||||
"reload_completed"
|
|
||||||
"%!ret\t%0"
|
|
||||||
+ "&& cfun->machine->function_return_type != indirect_branch_keep"
|
|
||||||
+ [(const_int 0)]
|
|
||||||
+ "ix86_split_simple_return_pop_internal (operands[0]); DONE;"
|
|
||||||
[(set_attr "length" "3")
|
|
||||||
(set_attr "atom_unit" "jeu")
|
|
||||||
(set_attr "length_immediate" "2")
|
|
||||||
@@ -12535,7 +12538,7 @@
|
|
||||||
[(simple_return)
|
|
||||||
(use (match_operand:SI 0 "register_operand" "r"))]
|
|
||||||
"reload_completed"
|
|
||||||
- "* return ix86_output_indirect_jmp (operands[0], true);"
|
|
||||||
+ "* return ix86_output_indirect_function_return (operands[0]);"
|
|
||||||
[(set (attr "type")
|
|
||||||
(if_then_else (match_test "(cfun->machine->indirect_branch_type
|
|
||||||
!= indirect_branch_keep)")
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-22.c b/gcc/testsuite/gcc.target/i386/ret-thunk-22.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..89e086de97b
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-22.c
|
|
||||||
@@ -0,0 +1,15 @@
|
|
||||||
+/* PR target/r84530 */
|
|
||||||
+/* { dg-do compile { target ia32 } } */
|
|
||||||
+/* { dg-options "-O2 -mfunction-return=thunk" } */
|
|
||||||
+
|
|
||||||
+struct s { _Complex unsigned short x; };
|
|
||||||
+struct s gs = { 100 + 200i };
|
|
||||||
+struct s __attribute__((noinline)) foo (void) { return gs; }
|
|
||||||
+
|
|
||||||
+/* { dg-final { scan-assembler-times "popl\[\\t \]*%ecx" 1 } } */
|
|
||||||
+/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*4\\(%esp\\), %esp" } } */
|
|
||||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk_ecx" } } */
|
|
||||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
|
|
||||||
+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
|
|
||||||
+/* { dg-final { scan-assembler {\tpause} } } */
|
|
||||||
+/* { dg-final { scan-assembler {\tlfence} } } */
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-23.c b/gcc/testsuite/gcc.target/i386/ret-thunk-23.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..43f0ccaa854
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-23.c
|
|
||||||
@@ -0,0 +1,15 @@
|
|
||||||
+/* PR target/r84530 */
|
|
||||||
+/* { dg-do compile { target ia32 } } */
|
|
||||||
+/* { dg-options "-O2 -mfunction-return=thunk-extern" } */
|
|
||||||
+
|
|
||||||
+struct s { _Complex unsigned short x; };
|
|
||||||
+struct s gs = { 100 + 200i };
|
|
||||||
+struct s __attribute__((noinline)) foo (void) { return gs; }
|
|
||||||
+
|
|
||||||
+/* { dg-final { scan-assembler-times "popl\[\\t \]*%ecx" 1 } } */
|
|
||||||
+/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*4\\(%esp\\), %esp" } } */
|
|
||||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk_ecx" } } */
|
|
||||||
+/* { dg-final { scan-assembler-not "jmp\[ \t\]*\.LIND" } } */
|
|
||||||
+/* { dg-final { scan-assembler-not "call\[ \t\]*\.LIND" } } */
|
|
||||||
+/* { dg-final { scan-assembler-not {\tpause} } } */
|
|
||||||
+/* { dg-final { scan-assembler-not {\tlfence} } } */
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-24.c b/gcc/testsuite/gcc.target/i386/ret-thunk-24.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..8729e35147e
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-24.c
|
|
||||||
@@ -0,0 +1,15 @@
|
|
||||||
+/* PR target/r84530 */
|
|
||||||
+/* { dg-do compile { target ia32 } } */
|
|
||||||
+/* { dg-options "-O2 -mfunction-return=thunk-inline" } */
|
|
||||||
+
|
|
||||||
+struct s { _Complex unsigned short x; };
|
|
||||||
+struct s gs = { 100 + 200i };
|
|
||||||
+struct s __attribute__((noinline)) foo (void) { return gs; }
|
|
||||||
+
|
|
||||||
+/* { dg-final { scan-assembler-times "popl\[\\t \]*%ecx" 1 } } */
|
|
||||||
+/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*4\\(%esp\\), %esp" } } */
|
|
||||||
+/* { dg-final { scan-assembler-not "jmp\[ \t\]*__x86_return_thunk_ecx" } } */
|
|
||||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
|
|
||||||
+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
|
|
||||||
+/* { dg-final { scan-assembler {\tpause} } } */
|
|
||||||
+/* { dg-final { scan-assembler {\tlfence} } } */
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-25.c b/gcc/testsuite/gcc.target/i386/ret-thunk-25.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..f73553c9a9f
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-25.c
|
|
||||||
@@ -0,0 +1,15 @@
|
|
||||||
+/* PR target/r84530 */
|
|
||||||
+/* { dg-do compile { target ia32 } } */
|
|
||||||
+/* { dg-options "-O2 -mfunction-return=thunk -fcheck-pointer-bounds -mmpx -fno-pic" } */
|
|
||||||
+
|
|
||||||
+struct s { _Complex unsigned short x; };
|
|
||||||
+struct s gs = { 100 + 200i };
|
|
||||||
+struct s __attribute__((noinline)) foo (void) { return gs; }
|
|
||||||
+
|
|
||||||
+/* { dg-final { scan-assembler-times "popl\[\\t \]*%ecx" 1 } } */
|
|
||||||
+/* { dg-final { scan-assembler "lea\[l\]?\[\\t \]*4\\(%esp\\), %esp" } } */
|
|
||||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*__x86_return_thunk_bnd_ecx" } } */
|
|
||||||
+/* { dg-final { scan-assembler "jmp\[ \t\]*\.LIND" } } */
|
|
||||||
+/* { dg-final { scan-assembler "call\[ \t\]*\.LIND" } } */
|
|
||||||
+/* { dg-final { scan-assembler {\tpause} } } */
|
|
||||||
+/* { dg-final { scan-assembler {\tlfence} } } */
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-26.c b/gcc/testsuite/gcc.target/i386/ret-thunk-26.c
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000000..9144e988735
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-26.c
|
|
||||||
@@ -0,0 +1,40 @@
|
|
||||||
+/* PR target/r84530 */
|
|
||||||
+/* { dg-do run } */
|
|
||||||
+/* { dg-options "-Os -mfunction-return=thunk" } */
|
|
||||||
+
|
|
||||||
+struct S { int i; };
|
|
||||||
+__attribute__((const, noinline, noclone))
|
|
||||||
+struct S foo (int x)
|
|
||||||
+{
|
|
||||||
+ struct S s;
|
|
||||||
+ s.i = x;
|
|
||||||
+ return s;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int a[2048], b[2048], c[2048], d[2048];
|
|
||||||
+struct S e[2048];
|
|
||||||
+
|
|
||||||
+__attribute__((noinline, noclone)) void
|
|
||||||
+bar (void)
|
|
||||||
+{
|
|
||||||
+ int i;
|
|
||||||
+ for (i = 0; i < 1024; i++)
|
|
||||||
+ {
|
|
||||||
+ e[i] = foo (i);
|
|
||||||
+ a[i+2] = a[i] + a[i+1];
|
|
||||||
+ b[10] = b[10] + i;
|
|
||||||
+ c[i] = c[2047 - i];
|
|
||||||
+ d[i] = d[i + 1];
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int
|
|
||||||
+main ()
|
|
||||||
+{
|
|
||||||
+ int i;
|
|
||||||
+ bar ();
|
|
||||||
+ for (i = 0; i < 1024; i++)
|
|
||||||
+ if (e[i].i != i)
|
|
||||||
+ __builtin_abort ();
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
--
|
|
||||||
2.16.3
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,225 +0,0 @@
|
||||||
From e7fbaebc8ff650df76f43e92cb9ca59d5174ebe7 Mon Sep 17 00:00:00 2001
|
|
||||||
From: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
||||||
Date: Thu, 15 Mar 2018 17:54:40 +0000
|
|
||||||
Subject: [PATCH 13/13] i386: Don't generate alias for function return thunk
|
|
||||||
|
|
||||||
Function return thunks shouldn't be aliased to indirect branch thunks
|
|
||||||
since indirect branch thunks are placed in COMDAT section and a COMDAT
|
|
||||||
section with indirect branch may not have function return thunk. This
|
|
||||||
patch generates function return thunks directly.
|
|
||||||
|
|
||||||
gcc/
|
|
||||||
|
|
||||||
Backport from mainline
|
|
||||||
PR target/84574
|
|
||||||
* config/i386/i386.c (indirect_thunk_needed): Update comments.
|
|
||||||
(indirect_thunk_bnd_needed): Likewise.
|
|
||||||
(indirect_thunks_used): Likewise.
|
|
||||||
(indirect_thunks_bnd_used): Likewise.
|
|
||||||
(indirect_return_needed): New.
|
|
||||||
(indirect_return_bnd_needed): Likewise.
|
|
||||||
(output_indirect_thunk_function): Add a bool argument for
|
|
||||||
function return.
|
|
||||||
(output_indirect_thunk_function): Don't generate alias for
|
|
||||||
function return thunk.
|
|
||||||
(ix86_code_end): Call output_indirect_thunk_function to generate
|
|
||||||
function return thunks.
|
|
||||||
(ix86_output_function_return): Set indirect_return_bnd_needed
|
|
||||||
and indirect_return_needed instead of indirect_thunk_bnd_needed
|
|
||||||
and indirect_thunk_needed.
|
|
||||||
|
|
||||||
gcc/testsuite/
|
|
||||||
|
|
||||||
Backport from mainline
|
|
||||||
PR target/84574
|
|
||||||
* gcc.target/i386/ret-thunk-9.c: Expect __x86_return_thunk
|
|
||||||
label instead of __x86_indirect_thunk label.
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 92 ++++++++++-------------------
|
|
||||||
gcc/testsuite/gcc.target/i386/ret-thunk-9.c | 2 +-
|
|
||||||
2 files changed, 33 insertions(+), 61 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
|
||||||
index 21c3c18bd3c..f4cd1c6f4e9 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -11067,19 +11067,23 @@ ix86_setup_frame_addresses (void)
|
|
||||||
labels in call and return thunks. */
|
|
||||||
static int indirectlabelno;
|
|
||||||
|
|
||||||
-/* True if call and return thunk functions are needed. */
|
|
||||||
+/* True if call thunk function is needed. */
|
|
||||||
static bool indirect_thunk_needed = false;
|
|
||||||
-/* True if call and return thunk functions with the BND prefix are
|
|
||||||
- needed. */
|
|
||||||
+/* True if call thunk function with the BND prefix is needed. */
|
|
||||||
static bool indirect_thunk_bnd_needed = false;
|
|
||||||
|
|
||||||
/* Bit masks of integer registers, which contain branch target, used
|
|
||||||
- by call and return thunks functions. */
|
|
||||||
+ by call thunk 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. */
|
|
||||||
+ by call thunk functions with the BND prefix. */
|
|
||||||
static int indirect_thunks_bnd_used;
|
|
||||||
|
|
||||||
+/* True if return thunk function is needed. */
|
|
||||||
+static bool indirect_return_needed = false;
|
|
||||||
+/* True if return thunk function with the BND prefix is needed. */
|
|
||||||
+static bool indirect_return_bnd_needed = false;
|
|
||||||
+
|
|
||||||
/* True if return thunk function via CX is needed. */
|
|
||||||
static bool indirect_return_via_cx;
|
|
||||||
/* True if return thunk function via CX with the BND prefix is
|
|
||||||
@@ -11226,16 +11230,18 @@ output_indirect_thunk (bool need_bnd_p, unsigned int regno)
|
|
||||||
/* Output a funtion with a call and return thunk for indirect branch.
|
|
||||||
If BND_P is true, the BND prefix is needed. If REGNO != INVALID_REGNUM,
|
|
||||||
the function address is in REGNO. Otherwise, the function address is
|
|
||||||
- on the top of stack. */
|
|
||||||
+ on the top of stack. Thunk is used for function return if RET_P is
|
|
||||||
+ true. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
-output_indirect_thunk_function (bool need_bnd_p, unsigned int regno)
|
|
||||||
+output_indirect_thunk_function (bool need_bnd_p, unsigned int regno,
|
|
||||||
+ bool ret_p)
|
|
||||||
{
|
|
||||||
char name[32];
|
|
||||||
tree decl;
|
|
||||||
|
|
||||||
/* Create __x86_indirect_thunk/__x86_indirect_thunk_bnd. */
|
|
||||||
- indirect_thunk_name (name, regno, need_bnd_p, false);
|
|
||||||
+ indirect_thunk_name (name, regno, need_bnd_p, ret_p);
|
|
||||||
decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
|
|
||||||
get_identifier (name),
|
|
||||||
build_function_type_list (void_type_node, NULL_TREE));
|
|
||||||
@@ -11278,50 +11284,6 @@ output_indirect_thunk_function (bool need_bnd_p, unsigned int regno)
|
|
||||||
ASM_OUTPUT_LABEL (asm_out_file, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
- /* Create alias for __x86_return_thunk/__x86_return_thunk_bnd or
|
|
||||||
- __x86_return_thunk_ecx/__x86_return_thunk_ecx_bnd. */
|
|
||||||
- bool need_alias;
|
|
||||||
- if (regno == INVALID_REGNUM)
|
|
||||||
- need_alias = true;
|
|
||||||
- else if (regno == CX_REG)
|
|
||||||
- {
|
|
||||||
- if (need_bnd_p)
|
|
||||||
- need_alias = indirect_return_via_cx_bnd;
|
|
||||||
- else
|
|
||||||
- need_alias = indirect_return_via_cx;
|
|
||||||
- }
|
|
||||||
- else
|
|
||||||
- need_alias = false;
|
|
||||||
-
|
|
||||||
- if (need_alias)
|
|
||||||
- {
|
|
||||||
- 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);
|
|
||||||
@@ -11368,19 +11330,29 @@ ix86_code_end (void)
|
|
||||||
rtx xops[2];
|
|
||||||
unsigned int regno;
|
|
||||||
|
|
||||||
+ if (indirect_return_needed)
|
|
||||||
+ output_indirect_thunk_function (false, INVALID_REGNUM, true);
|
|
||||||
+ if (indirect_return_bnd_needed)
|
|
||||||
+ output_indirect_thunk_function (true, INVALID_REGNUM, true);
|
|
||||||
+
|
|
||||||
+ if (indirect_return_via_cx)
|
|
||||||
+ output_indirect_thunk_function (false, CX_REG, true);
|
|
||||||
+ if (indirect_return_via_cx_bnd)
|
|
||||||
+ output_indirect_thunk_function (true, CX_REG, true);
|
|
||||||
+
|
|
||||||
if (indirect_thunk_needed)
|
|
||||||
- output_indirect_thunk_function (false, INVALID_REGNUM);
|
|
||||||
+ output_indirect_thunk_function (false, INVALID_REGNUM, false);
|
|
||||||
if (indirect_thunk_bnd_needed)
|
|
||||||
- output_indirect_thunk_function (true, INVALID_REGNUM);
|
|
||||||
+ output_indirect_thunk_function (true, INVALID_REGNUM, false);
|
|
||||||
|
|
||||||
for (regno = FIRST_REX_INT_REG; regno <= LAST_REX_INT_REG; regno++)
|
|
||||||
{
|
|
||||||
unsigned int i = regno - FIRST_REX_INT_REG + LAST_INT_REG + 1;
|
|
||||||
if ((indirect_thunks_used & (1 << i)))
|
|
||||||
- output_indirect_thunk_function (false, regno);
|
|
||||||
+ output_indirect_thunk_function (false, regno, false);
|
|
||||||
|
|
||||||
if ((indirect_thunks_bnd_used & (1 << i)))
|
|
||||||
- output_indirect_thunk_function (true, regno);
|
|
||||||
+ output_indirect_thunk_function (true, regno, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (regno = AX_REG; regno <= SP_REG; regno++)
|
|
||||||
@@ -11389,10 +11361,10 @@ ix86_code_end (void)
|
|
||||||
tree decl;
|
|
||||||
|
|
||||||
if ((indirect_thunks_used & (1 << regno)))
|
|
||||||
- output_indirect_thunk_function (false, regno);
|
|
||||||
+ output_indirect_thunk_function (false, regno, false);
|
|
||||||
|
|
||||||
if ((indirect_thunks_bnd_used & (1 << regno)))
|
|
||||||
- output_indirect_thunk_function (true, regno);
|
|
||||||
+ output_indirect_thunk_function (true, regno, false);
|
|
||||||
|
|
||||||
if (!(pic_labels_used & (1 << regno)))
|
|
||||||
continue;
|
|
||||||
@@ -28077,12 +28049,12 @@ ix86_output_function_return (bool long_p)
|
|
||||||
true);
|
|
||||||
if (need_bnd_p)
|
|
||||||
{
|
|
||||||
- indirect_thunk_bnd_needed |= need_thunk;
|
|
||||||
+ indirect_return_bnd_needed |= need_thunk;
|
|
||||||
fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
- indirect_thunk_needed |= need_thunk;
|
|
||||||
+ indirect_return_needed |= need_thunk;
|
|
||||||
fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
diff --git a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
|
||||||
index d2df8b874e0..eee230ca2f6 100644
|
|
||||||
--- a/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
|
||||||
+++ b/gcc/testsuite/gcc.target/i386/ret-thunk-9.c
|
|
||||||
@@ -13,7 +13,7 @@ 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 "__x86_indirect_thunk:" } } */
|
|
||||||
+/* { dg-final { scan-assembler "__x86_return_thunk:" } } */
|
|
||||||
/* { dg-final { scan-assembler "mov(?:l|q)\[ \t\]*_?bar" { target *-*-linux* } } } */
|
|
||||||
/* { dg-final { scan-assembler-times {\tpause} 2 } } */
|
|
||||||
/* { dg-final { scan-assembler-times {\tlfence} 2 } } */
|
|
||||||
--
|
|
||||||
2.16.3
|
|
||||||
|
|
|
@ -1,215 +0,0 @@
|
||||||
# DP: Turn on -fstack-protector by default for C, C++, ObjC, ObjC++.
|
|
||||||
# DP: Build libgcc using -fno-stack-protector.
|
|
||||||
|
|
||||||
---
|
|
||||||
gcc/Makefile.in | 2 ++
|
|
||||||
gcc/cp/lang-specs.h | 6 +++---
|
|
||||||
gcc/doc/invoke.texi | 4 ++++
|
|
||||||
gcc/gcc.c | 18 ++++++++++++++----
|
|
||||||
gcc/objc/lang-specs.h | 10 +++++-----
|
|
||||||
gcc/objcp/lang-specs.h | 8 ++++----
|
|
||||||
6 files changed, 32 insertions(+), 16 deletions(-)
|
|
||||||
|
|
||||||
Index: b/gcc/gcc.c
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/gcc.c
|
|
||||||
+++ b/gcc/gcc.c
|
|
||||||
@@ -858,6 +858,14 @@ proper position among the other output f
|
|
||||||
#define LINK_GCC_C_SEQUENCE_SPEC "%G %L %G"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+#ifndef SSP_DEFAULT_SPEC
|
|
||||||
+#ifdef TARGET_LIBC_PROVIDES_SSP
|
|
||||||
+#define SSP_DEFAULT_SPEC "%{!fno-stack-protector:%{!fstack-protector-all:%{!ffreestanding:%{!nostdlib:%{!fstack-protector:-fstack-protector-strong}}}}}"
|
|
||||||
+#else
|
|
||||||
+#define SSP_DEFAULT_SPEC ""
|
|
||||||
+#endif
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
#ifndef LINK_SSP_SPEC
|
|
||||||
#ifdef TARGET_LIBC_PROVIDES_SSP
|
|
||||||
#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \
|
|
||||||
@@ -1057,6 +1065,7 @@ static const char *cc1_spec = CC1_SPEC;
|
|
||||||
static const char *cc1plus_spec = CC1PLUS_SPEC;
|
|
||||||
static const char *link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC;
|
|
||||||
static const char *link_ssp_spec = LINK_SSP_SPEC;
|
|
||||||
+static const char *ssp_default_spec = SSP_DEFAULT_SPEC;
|
|
||||||
static const char *asm_spec = ASM_SPEC;
|
|
||||||
static const char *asm_final_spec = ASM_FINAL_SPEC;
|
|
||||||
static const char *link_spec = LINK_SPEC;
|
|
||||||
@@ -1112,7 +1121,7 @@ static const char *cpp_unique_options =
|
|
||||||
static const char *cpp_options =
|
|
||||||
"%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
|
|
||||||
%{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*}\
|
|
||||||
- %{undef} %{save-temps*:-fpch-preprocess}";
|
|
||||||
+ %{undef} %{save-temps*:-fpch-preprocess} %(ssp_default)";
|
|
||||||
|
|
||||||
/* This contains cpp options which are not passed when the preprocessor
|
|
||||||
output will be used by another program. */
|
|
||||||
@@ -1301,9 +1310,9 @@ static const struct compiler default_com
|
|
||||||
%{save-temps*|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
|
|
||||||
%(cpp_options) -o %{save-temps*:%b.i} %{!save-temps*:%g.i} \n\
|
|
||||||
cc1 -fpreprocessed %{save-temps*:%b.i} %{!save-temps*:%g.i} \
|
|
||||||
- %(cc1_options)}\
|
|
||||||
+ %(cc1_options) %(ssp_default)}\
|
|
||||||
%{!save-temps*:%{!traditional-cpp:%{!no-integrated-cpp:\
|
|
||||||
- cc1 %(cpp_unique_options) %(cc1_options)}}}\
|
|
||||||
+ cc1 %(cpp_unique_options) %(cc1_options) %(ssp_default)}}}\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 1},
|
|
||||||
{"-",
|
|
||||||
"%{!E:%e-E or -x required when input is from standard input}\
|
|
||||||
@@ -1328,7 +1337,7 @@ static const struct compiler default_com
|
|
||||||
%W{o*:--output-pch=%*}}%V}}}}}}}", 0, 0, 0},
|
|
||||||
{".i", "@cpp-output", 0, 0, 0},
|
|
||||||
{"@cpp-output",
|
|
||||||
- "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
|
||||||
+ "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %(ssp_default) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
|
||||||
{".s", "@assembler", 0, 0, 0},
|
|
||||||
{"@assembler",
|
|
||||||
"%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},
|
|
||||||
@@ -1560,6 +1569,7 @@ static struct spec_list static_specs[] =
|
|
||||||
INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
|
|
||||||
INIT_STATIC_SPEC ("link_gcc_c_sequence", &link_gcc_c_sequence_spec),
|
|
||||||
INIT_STATIC_SPEC ("link_ssp", &link_ssp_spec),
|
|
||||||
+ INIT_STATIC_SPEC ("ssp_default", &ssp_default_spec),
|
|
||||||
INIT_STATIC_SPEC ("endfile", &endfile_spec),
|
|
||||||
INIT_STATIC_SPEC ("link", &link_spec),
|
|
||||||
INIT_STATIC_SPEC ("lib", &lib_spec),
|
|
||||||
Index: b/gcc/cp/lang-specs.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/cp/lang-specs.h
|
|
||||||
+++ b/gcc/cp/lang-specs.h
|
|
||||||
@@ -46,7 +46,7 @@ along with GCC; see the file COPYING3.
|
|
||||||
%(cpp_options) %2 -o %{save-temps*:%b.ii} %{!save-temps*:%g.ii} \n}\
|
|
||||||
cc1plus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.ii} %{!save-temps*:%g.ii}}\
|
|
||||||
%{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
|
|
||||||
- %(cc1_options) %2\
|
|
||||||
+ %(cc1_options) %(ssp_default) %2\
|
|
||||||
%{!fsyntax-only:-o %g.s \
|
|
||||||
%{!fdump-ada-spec*:%{!o*:--output-pch=%i.gch}\
|
|
||||||
%W{o*:--output-pch=%*}}%V}}}}",
|
|
||||||
@@ -58,11 +58,11 @@ along with GCC; see the file COPYING3.
|
|
||||||
%(cpp_options) %2 -o %{save-temps*:%b.ii} %{!save-temps*:%g.ii} \n}\
|
|
||||||
cc1plus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.ii} %{!save-temps*:%g.ii}}\
|
|
||||||
%{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
|
|
||||||
- %(cc1_options) %2\
|
|
||||||
+ %(cc1_options) %(ssp_default) %2\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}",
|
|
||||||
CPLUSPLUS_CPP_SPEC, 0, 0},
|
|
||||||
{".ii", "@c++-cpp-output", 0, 0, 0},
|
|
||||||
{"@c++-cpp-output",
|
|
||||||
"%{!M:%{!MM:%{!E:\
|
|
||||||
- cc1plus -fpreprocessed %i %(cc1_options) %2\
|
|
||||||
+ cc1plus -fpreprocessed %i %(cc1_options) %(ssp_default) %2\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
|
||||||
Index: b/gcc/params.def
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/params.def
|
|
||||||
+++ b/gcc/params.def
|
|
||||||
@@ -673,7 +673,7 @@ DEFPARAM (PARAM_INTEGER_SHARE_LIMIT,
|
|
||||||
DEFPARAM (PARAM_SSP_BUFFER_SIZE,
|
|
||||||
"ssp-buffer-size",
|
|
||||||
"The lower bound for a buffer to be considered for stack smashing protection.",
|
|
||||||
- 8, 1, 0)
|
|
||||||
+ 4, 1, 0)
|
|
||||||
|
|
||||||
DEFPARAM (PARAM_MIN_SIZE_FOR_STACK_SHARING,
|
|
||||||
"min-size-for-stack-sharing",
|
|
||||||
Index: b/gcc/objc/lang-specs.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/objc/lang-specs.h
|
|
||||||
+++ b/gcc/objc/lang-specs.h
|
|
||||||
@@ -29,9 +29,9 @@ along with GCC; see the file COPYING3.
|
|
||||||
%{traditional|traditional-cpp:\
|
|
||||||
%eGNU Objective C no longer supports traditional compilation}\
|
|
||||||
%{save-temps*|no-integrated-cpp:cc1obj -E %(cpp_options) -o %{save-temps*:%b.mi} %{!save-temps*:%g.mi} \n\
|
|
||||||
- cc1obj -fpreprocessed %{save-temps*:%b.mi} %{!save-temps*:%g.mi} %(cc1_options) %{print-objc-runtime-info} %{gen-decls}}\
|
|
||||||
+ cc1obj -fpreprocessed %{save-temps*:%b.mi} %{!save-temps*:%g.mi} %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}}\
|
|
||||||
%{!save-temps*:%{!no-integrated-cpp:\
|
|
||||||
- cc1obj %(cpp_unique_options) %(cc1_options) %{print-objc-runtime-info} %{gen-decls}}}\
|
|
||||||
+ cc1obj %(cpp_unique_options) %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}}}\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
|
||||||
{"@objective-c-header",
|
|
||||||
"%{E|M|MM:cc1obj -E %{traditional|traditional-cpp:-traditional-cpp}\
|
|
||||||
@@ -40,18 +40,18 @@ along with GCC; see the file COPYING3.
|
|
||||||
%{traditional|traditional-cpp:\
|
|
||||||
%eGNU Objective C no longer supports traditional compilation}\
|
|
||||||
%{save-temps*|no-integrated-cpp:cc1obj -E %(cpp_options) -o %{save-temps*:%b.mi} %{!save-temps*:%g.mi} \n\
|
|
||||||
- cc1obj -fpreprocessed %b.mi %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
|
|
||||||
+ cc1obj -fpreprocessed %b.mi %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}\
|
|
||||||
-o %g.s %{!o*:--output-pch=%i.gch}\
|
|
||||||
%W{o*:--output-pch=%*}%V}\
|
|
||||||
%{!save-temps*:%{!no-integrated-cpp:\
|
|
||||||
- cc1obj %(cpp_unique_options) %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
|
|
||||||
+ cc1obj %(cpp_unique_options) %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}\
|
|
||||||
-o %g.s %{!o*:--output-pch=%i.gch}\
|
|
||||||
%W{o*:--output-pch=%*}%V}}}}}", 0, 0, 0},
|
|
||||||
{".mi", "@objective-c-cpp-output", 0, 0, 0},
|
|
||||||
{"@objective-c-cpp-output",
|
|
||||||
- "%{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
|
|
||||||
+ "%{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
|
||||||
{"@objc-cpp-output",
|
|
||||||
"%nobjc-cpp-output is deprecated; please use objective-c-cpp-output instead\n\
|
|
||||||
- %{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
|
|
||||||
+ %{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %(ssp_default) %{print-objc-runtime-info} %{gen-decls}\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
|
||||||
Index: b/gcc/objcp/lang-specs.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/objcp/lang-specs.h
|
|
||||||
+++ b/gcc/objcp/lang-specs.h
|
|
||||||
@@ -36,7 +36,7 @@ along with GCC; see the file COPYING3.
|
|
||||||
%(cpp_options) %2 -o %{save-temps*:%b.mii} %{!save-temps*:%g.mii} \n}\
|
|
||||||
cc1objplus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.mii} %{!save-temps*:%g.mii}}\
|
|
||||||
%{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
|
|
||||||
- %(cc1_options) %2\
|
|
||||||
+ %(cc1_options) %(ssp_default) %2\
|
|
||||||
-o %g.s %{!o*:--output-pch=%i.gch} %W{o*:--output-pch=%*}%V}}}",
|
|
||||||
CPLUSPLUS_CPP_SPEC, 0, 0},
|
|
||||||
{"@objective-c++",
|
|
||||||
@@ -46,16 +46,16 @@ along with GCC; see the file COPYING3.
|
|
||||||
%(cpp_options) %2 -o %{save-temps*:%b.mii} %{!save-temps*:%g.mii} \n}\
|
|
||||||
cc1objplus %{save-temps*|no-integrated-cpp:-fpreprocessed %{save-temps*:%b.mii} %{!save-temps*:%g.mii}}\
|
|
||||||
%{!save-temps*:%{!no-integrated-cpp:%(cpp_unique_options)}}\
|
|
||||||
- %(cc1_options) %2\
|
|
||||||
+ %(cc1_options) %(ssp_default) %2\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}",
|
|
||||||
CPLUSPLUS_CPP_SPEC, 0, 0},
|
|
||||||
{".mii", "@objective-c++-cpp-output", 0, 0, 0},
|
|
||||||
{"@objective-c++-cpp-output",
|
|
||||||
"%{!M:%{!MM:%{!E:\
|
|
||||||
- cc1objplus -fpreprocessed %i %(cc1_options) %2\
|
|
||||||
+ cc1objplus -fpreprocessed %i %(cc1_options) %(ssp_default) %2\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
|
||||||
{"@objc++-cpp-output",
|
|
||||||
"%nobjc++-cpp-output is deprecated; please use objective-c++-cpp-output instead\n\
|
|
||||||
%{!M:%{!MM:%{!E:\
|
|
||||||
- cc1objplus -fpreprocessed %i %(cc1_options) %2\
|
|
||||||
+ cc1objplus -fpreprocessed %i %(cc1_options) %(ssp_default) %2\
|
|
||||||
%{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
|
|
||||||
Index: b/gcc/doc/invoke.texi
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/doc/invoke.texi
|
|
||||||
+++ b/gcc/doc/invoke.texi
|
|
||||||
@@ -9247,6 +9247,9 @@
|
|
||||||
The minimum size of variables taking part in stack slot sharing when not
|
|
||||||
optimizing. The default value is 32.
|
|
||||||
|
|
||||||
+The Alpine Linux default is "4", to increase
|
|
||||||
+the number of functions protected by the stack protector.
|
|
||||||
+
|
|
||||||
@item max-jump-thread-duplication-stmts
|
|
||||||
Maximum number of statements allowed in a block that needs to be
|
|
||||||
duplicated when threading jumps.
|
|
||||||
@@ -10185,6 +10188,11 @@
|
|
||||||
Like @option{-fstack-protector} but includes additional functions to
|
|
||||||
be protected --- those that have local array definitions, or have
|
|
||||||
references to local frame addresses.
|
|
||||||
+
|
|
||||||
+NOTE: In Alpine Linux,
|
|
||||||
+@option{-fstack-protector-strong} is enabled by default for C,
|
|
||||||
+C++, ObjC, ObjC++, if none of @option{-fno-stack-protector},
|
|
||||||
+@option{-nostdlib}, nor @option{-ffreestanding} are found.
|
|
||||||
|
|
||||||
@item -fstack-protector-explicit
|
|
||||||
@opindex fstack-protector-explicit
|
|
|
@ -1,33 +0,0 @@
|
||||||
# Turn on -Wl,-z,relro,-z,now by default.
|
|
||||||
|
|
||||||
---
|
|
||||||
gcc/doc/invoke.texi | 3 +++
|
|
||||||
gcc/gcc.c | 1 +
|
|
||||||
2 files changed, 4 insertions(+), 0 deletions(-)
|
|
||||||
|
|
||||||
Index: b/gcc/doc/invoke.texi
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/doc/invoke.texi
|
|
||||||
+++ b/gcc/doc/invoke.texi
|
|
||||||
@@ -11424,6 +11424,9 @@ For example, @option{-Wl,-Map,output.map
|
|
||||||
linker. When using the GNU linker, you can also get the same effect with
|
|
||||||
@option{-Wl,-Map=output.map}.
|
|
||||||
|
|
||||||
+NOTE: In Alpine Linux, for LDFLAGS, the option
|
|
||||||
+@option{-Wl,-z,relro,now} is used. To disable, use @option{-Wl,-z,norelro}.
|
|
||||||
+
|
|
||||||
@item -u @var{symbol}
|
|
||||||
@opindex u
|
|
||||||
Pretend the symbol @var{symbol} is undefined, to force linking of
|
|
||||||
Index: b/gcc/gcc.c
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/gcc.c
|
|
||||||
+++ b/gcc/gcc.c
|
|
||||||
@@ -890,6 +890,7 @@ proper position among the other output f
|
|
||||||
"%{flto|flto=*:%<fcompare-debug*} \
|
|
||||||
%{flto} %{fno-lto} %{flto=*} %l " LINK_PIE_SPEC \
|
|
||||||
"%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
|
|
||||||
+ "-z relro -z now " \
|
|
||||||
"%X %{o*} %{e*} %{N} %{n} %{r}\
|
|
||||||
%{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}} " VTABLE_VERIFICATION_SPEC " \
|
|
||||||
%{static:} %{L*} %(mfwrap) %(link_libgcc) " SANITIZER_EARLY_SPEC " %o\
|
|
|
@ -1,40 +0,0 @@
|
||||||
# DP: Turn on -D_FORTIFY_SOURCE=2 by default for C, C++, ObjC, ObjC++,
|
|
||||||
# DP: if the optimization level is > 0
|
|
||||||
|
|
||||||
---
|
|
||||||
gcc/doc/invoke.texi | 6 ++++++
|
|
||||||
gcc/c-family/c-cppbuiltin.c | 3 +
|
|
||||||
2 files changed, 9 insertions(+), 0 deletions(-)
|
|
||||||
|
|
||||||
Index: b/gcc/doc/invoke.texi
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/doc/invoke.texi
|
|
||||||
+++ b/gcc/doc/invoke.texi
|
|
||||||
@@ -7840,6 +7840,12 @@ also turns on the following optimization
|
|
||||||
Please note the warning under @option{-fgcse} about
|
|
||||||
invoking @option{-O2} on programs that use computed gotos.
|
|
||||||
|
|
||||||
+NOTE: In Alpine Linux, @option{-D_FORTIFY_SOURCE=2} is
|
|
||||||
+set by default, and is activated when @option{-O} is set to 2 or higher.
|
|
||||||
+This enables additional compile-time and run-time checks for several libc
|
|
||||||
+functions. To disable, specify either @option{-U_FORTIFY_SOURCE} or
|
|
||||||
+@option{-D_FORTIFY_SOURCE=0}.
|
|
||||||
+
|
|
||||||
@item -O3
|
|
||||||
@opindex O3
|
|
||||||
Optimize yet more. @option{-O3} turns on all optimizations specified
|
|
||||||
Index: b/gcc/c-family/c-cppbuiltin.c
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/c-family/c-cppbuiltin.c
|
|
||||||
+++ b/gcc/c-family/c-cppbuiltin.c
|
|
||||||
@@ -1176,6 +1176,10 @@ c_cpp_builtins (cpp_reader *pfile)
|
|
||||||
builtin_define_with_value ("__REGISTER_PREFIX__", REGISTER_PREFIX, 0);
|
|
||||||
builtin_define_with_value ("__USER_LABEL_PREFIX__", user_label_prefix, 0);
|
|
||||||
|
|
||||||
+ /* Fortify Source enabled by default for optimization levels > 0 */
|
|
||||||
+ if (optimize)
|
|
||||||
+ builtin_define_with_int_value ("_FORTIFY_SOURCE", 2);
|
|
||||||
+
|
|
||||||
/* Misc. */
|
|
||||||
if (flag_gnu89_inline)
|
|
||||||
cpp_define (pfile, "__GNUC_GNU_INLINE__");
|
|
|
@ -1,241 +0,0 @@
|
||||||
# DP: On linux targets pass --as-needed by default to the linker, but always
|
|
||||||
# DP: link the sanitizer libraries with --no-as-needed.
|
|
||||||
|
|
||||||
--- a/gcc/gcc.c
|
|
||||||
+++ b/gcc/gcc.c
|
|
||||||
@@ -568,8 +568,11 @@ proper position among the other output f
|
|
||||||
#ifdef LIBTSAN_EARLY_SPEC
|
|
||||||
#define LIBTSAN_SPEC STATIC_LIBTSAN_LIBS
|
|
||||||
#elif defined(HAVE_LD_STATIC_DYNAMIC)
|
|
||||||
-#define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION \
|
|
||||||
- "} -ltsan %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
|
|
||||||
+#define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION "}" \
|
|
||||||
+ " %{!static-libtsan:%{!fuse-ld=gold:--push-state }--no-as-needed}" \
|
|
||||||
+ " -ltsan " \
|
|
||||||
+ " %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
|
|
||||||
+ " %{!static-libtsan:%{fuse-ld=gold:--as-needed;:--pop-state}}" \
|
|
||||||
STATIC_LIBTSAN_LIBS
|
|
||||||
#else
|
|
||||||
#define LIBTSAN_SPEC "-ltsan" STATIC_LIBTSAN_LIBS
|
|
||||||
--- a/gcc/config/gnu-user.h
|
|
||||||
+++ b/gcc/config/gnu-user.h
|
|
||||||
@@ -124,13 +124,13 @@
|
|
||||||
#define LIBASAN_EARLY_SPEC "%{!shared:libasan_preinit%O%s} " \
|
|
||||||
"%{static-libasan:%{!shared:" \
|
|
||||||
LD_STATIC_OPTION " --whole-archive -lasan --no-whole-archive " \
|
|
||||||
- LD_DYNAMIC_OPTION "}}%{!static-libasan:-lasan}"
|
|
||||||
+ LD_DYNAMIC_OPTION "}}%{!static-libasan:%{!fuse-ld=gold:--push-state} --no-as-needed -lasan %{fuse-ld=gold:--as-needed;:--pop-state}}"
|
|
||||||
#undef LIBTSAN_EARLY_SPEC
|
|
||||||
#define LIBTSAN_EARLY_SPEC "%{static-libtsan:%{!shared:" \
|
|
||||||
LD_STATIC_OPTION " --whole-archive -ltsan --no-whole-archive " \
|
|
||||||
- LD_DYNAMIC_OPTION "}}%{!static-libtsan:-ltsan}"
|
|
||||||
+ LD_DYNAMIC_OPTION "}}%{!static-libtsan:%{!fuse-ld=gold:--push-state} --no-as-needed -ltsan %{fuse-ld=gold:--as-needed;:--pop-state}}"
|
|
||||||
#undef LIBLSAN_EARLY_SPEC
|
|
||||||
#define LIBLSAN_EARLY_SPEC "%{static-liblsan:%{!shared:" \
|
|
||||||
LD_STATIC_OPTION " --whole-archive -llsan --no-whole-archive " \
|
|
||||||
- LD_DYNAMIC_OPTION "}}%{!static-liblsan:-llsan}"
|
|
||||||
+ LD_DYNAMIC_OPTION "}}%{!static-liblsan:%{!fuse-ld=gold:--push-state} --no-as-needed -llsan %{fuse-ld=gold:--as-needed;:--pop-state}}"
|
|
||||||
#endif
|
|
||||||
Index: b/gcc/config/aarch64/aarch64-linux.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/aarch64/aarch64-linux.h
|
|
||||||
+++ b/gcc/config/aarch64/aarch64-linux.h
|
|
||||||
@@ -36,5 +36,6 @@
|
|
||||||
|
|
||||||
#define LINUX_TARGET_LINK_SPEC "%{h*} \
|
|
||||||
+ --as-needed \
|
|
||||||
%{static:-Bstatic} \
|
|
||||||
%{shared:-shared} \
|
|
||||||
%{symbolic:-Bsymbolic} \
|
|
||||||
Index: b/gcc/config/ia64/linux.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/ia64/linux.h
|
|
||||||
+++ b/gcc/config/ia64/linux.h
|
|
||||||
@@ -58,7 +58,7 @@ do { \
|
|
||||||
#define GLIBC_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2"
|
|
||||||
|
|
||||||
#undef LINK_SPEC
|
|
||||||
-#define LINK_SPEC "\
|
|
||||||
+#define LINK_SPEC " --as-needed \
|
|
||||||
%{shared:-shared} \
|
|
||||||
%{!shared: \
|
|
||||||
%{!static: \
|
|
||||||
Index: b/gcc/config/sparc/linux.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/sparc/linux.h
|
|
||||||
+++ b/gcc/config/sparc/linux.h
|
|
||||||
@@ -86,7 +86,7 @@ extern const char *host_detect_local_cpu
|
|
||||||
#define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2"
|
|
||||||
|
|
||||||
#undef LINK_SPEC
|
|
||||||
-#define LINK_SPEC "-m elf32_sparc %{shared:-shared} \
|
|
||||||
+#define LINK_SPEC "-m elf32_sparc --as-needed %{shared:-shared} \
|
|
||||||
%{!mno-relax:%{!r:-relax}} \
|
|
||||||
%{!shared: \
|
|
||||||
%{!static: \
|
|
||||||
Index: b/gcc/config/s390/linux.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/s390/linux.h
|
|
||||||
+++ b/gcc/config/s390/linux.h
|
|
||||||
@@ -65,7 +65,7 @@ along with GCC; see the file COPYING3.
|
|
||||||
|
|
||||||
#undef LINK_SPEC
|
|
||||||
#define LINK_SPEC \
|
|
||||||
- "%{m31:-m elf_s390}%{m64:-m elf64_s390} \
|
|
||||||
+ "%{m31:-m elf_s390}%{m64:-m elf64_s390} --as-needed \
|
|
||||||
%{shared:-shared} \
|
|
||||||
%{!shared: \
|
|
||||||
%{static:-static} \
|
|
||||||
Index: b/gcc/config/rs6000/linux64.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/rs6000/linux64.h
|
|
||||||
+++ b/gcc/config/rs6000/linux64.h
|
|
||||||
@@ -466,12 +466,12 @@ extern int dot_symbols;
|
|
||||||
" -m elf64ppc")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-#define LINK_OS_LINUX_SPEC32 LINK_OS_LINUX_EMUL32 " %{!shared: %{!static: \
|
|
||||||
+#define LINK_OS_LINUX_SPEC32 LINK_OS_LINUX_EMUL32 " --as-needed %{!shared: %{!static: \
|
|
||||||
%{rdynamic:-export-dynamic} \
|
|
||||||
-dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "}} \
|
|
||||||
%(link_os_extra_spec32)"
|
|
||||||
|
|
||||||
-#define LINK_OS_LINUX_SPEC64 LINK_OS_LINUX_EMUL64 " %{!shared: %{!static: \
|
|
||||||
+#define LINK_OS_LINUX_SPEC64 LINK_OS_LINUX_EMUL64 " --as-needed %{!shared: %{!static: \
|
|
||||||
%{rdynamic:-export-dynamic} \
|
|
||||||
-dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "}} \
|
|
||||||
%(link_os_extra_spec64)"
|
|
||||||
Index: b/gcc/config/rs6000/sysv4.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/rs6000/sysv4.h
|
|
||||||
+++ b/gcc/config/rs6000/sysv4.h
|
|
||||||
@@ -784,7 +784,7 @@ ENDIAN_SELECT(" -mbig", " -mlittle", DEF
|
|
||||||
CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER, \
|
|
||||||
MUSL_DYNAMIC_LINKER)
|
|
||||||
|
|
||||||
-#define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \
|
|
||||||
+#define LINK_OS_LINUX_SPEC "-m elf32ppclinux --as-needed %{!shared: %{!static: \
|
|
||||||
%{rdynamic:-export-dynamic} \
|
|
||||||
-dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}"
|
|
||||||
|
|
||||||
Index: b/gcc/config/i386/gnu-user64.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/i386/gnu-user64.h
|
|
||||||
+++ b/gcc/config/i386/gnu-user64.h
|
|
||||||
@@ -57,5 +57,6 @@ see the files COPYING3 and COPYING.RUNTI
|
|
||||||
%{" SPEC_32 ":-m " GNU_USER_LINK_EMULATION32 "} \
|
|
||||||
%{" SPEC_X32 ":-m " GNU_USER_LINK_EMULATIONX32 "} \
|
|
||||||
+ --as-needed \
|
|
||||||
%{shared:-shared} \
|
|
||||||
%{!shared: \
|
|
||||||
%{!static: \
|
|
||||||
Index: b/gcc/config/i386/gnu-user.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/i386/gnu-user.h
|
|
||||||
+++ b/gcc/config/i386/gnu-user.h
|
|
||||||
@@ -74,7 +74,7 @@ along with GCC; see the file COPYING3.
|
|
||||||
{ "link_emulation", GNU_USER_LINK_EMULATION },\
|
|
||||||
{ "dynamic_linker", GNU_USER_DYNAMIC_LINKER }
|
|
||||||
|
|
||||||
-#define GNU_USER_TARGET_LINK_SPEC "-m %(link_emulation) %{shared:-shared} \
|
|
||||||
+#define GNU_USER_TARGET_LINK_SPEC "-m %(link_emulation) --as-needed %{shared:-shared} \
|
|
||||||
%{!shared: \
|
|
||||||
%{!static: \
|
|
||||||
%{rdynamic:-export-dynamic} \
|
|
||||||
Index: b/gcc/config/alpha/linux-elf.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/alpha/linux-elf.h
|
|
||||||
+++ b/gcc/config/alpha/linux-elf.h
|
|
||||||
@@ -37,7 +37,7 @@ along with GCC; see the file COPYING3.
|
|
||||||
|
|
||||||
#define ELF_DYNAMIC_LINKER GNU_USER_DYNAMIC_LINKER
|
|
||||||
|
|
||||||
-#define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax} \
|
|
||||||
+#define LINK_SPEC "-m elf64alpha --as-needed %{G*} %{relax:-relax} \
|
|
||||||
%{O*:-O3} %{!O*:-O1} \
|
|
||||||
%{shared:-shared} \
|
|
||||||
%{!shared: \
|
|
||||||
Index: b/gcc/config/arm/linux-elf.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/arm/linux-elf.h
|
|
||||||
+++ b/gcc/config/arm/linux-elf.h
|
|
||||||
@@ -73,5 +73,6 @@
|
|
||||||
%{!shared:-dynamic-linker " GNU_USER_DYNAMIC_LINKER "}} \
|
|
||||||
-X \
|
|
||||||
+ --as-needed \
|
|
||||||
%{mbig-endian:-EB} %{mlittle-endian:-EL}" \
|
|
||||||
SUBTARGET_EXTRA_LINK_SPEC
|
|
||||||
|
|
||||||
Index: b/gcc/config/mips/gnu-user.h
|
|
||||||
===================================================================
|
|
||||||
--- a/gcc/config/mips/gnu-user.h
|
|
||||||
+++ b/gcc/config/mips/gnu-user.h
|
|
||||||
@@ -55,6 +55,7 @@ along with GCC; see the file COPYING3.
|
|
||||||
#undef GNU_USER_TARGET_LINK_SPEC
|
|
||||||
#define GNU_USER_TARGET_LINK_SPEC "\
|
|
||||||
%{G*} %{EB} %{EL} %{mips*} %{shared} \
|
|
||||||
+ -as-needed \
|
|
||||||
%{!shared: \
|
|
||||||
%{!static: \
|
|
||||||
%{rdynamic:-export-dynamic} \
|
|
||||||
Index: b/libjava/Makefile.am
|
|
||||||
===================================================================
|
|
||||||
--- a/libjava/Makefile.am
|
|
||||||
+++ b/libjava/Makefile.am
|
|
||||||
@@ -627,14 +631,14 @@
|
|
||||||
rm .libs/libgcj_bc.so; \
|
|
||||||
mv .libs/libgcj_bc.so.1.0.0 .libs/libgcj_bc.so; \
|
|
||||||
$(libgcj_bc_dummy_LINK) -xc /dev/null -Wl,-soname,libgcj_bc.so.1 \
|
|
||||||
- -o .libs/libgcj_bc.so.1.0.0 -lgcj || exit; \
|
|
||||||
+ -o .libs/libgcj_bc.so.1.0.0 -Wl,--no-as-needed -lgcj || exit; \
|
|
||||||
rm .libs/libgcj_bc.so.1; \
|
|
||||||
$(LN_S) libgcj_bc.so.1.0.0 .libs/libgcj_bc.so.1
|
|
||||||
|
|
||||||
## This rule creates the libgcj_bc library that is actually installed.
|
|
||||||
install/libgcj_bc.la: $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_DEPENDENCIES) install/$(am__dirstamp)
|
|
||||||
$(libgcj_bc_la_LINK) $(am_libgcj_bc_la_rpath) $(libgcj_bc_la_LDFLAGS) \
|
|
||||||
- $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_LIBADD) $(LIBS)
|
|
||||||
+ $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_LIBADD) $(LIBS) -Wl,--no-as-needed -lgcj
|
|
||||||
|
|
||||||
## Note that property_files is defined in sources.am.
|
|
||||||
propertyo_files = $(patsubst classpath/resource/%,%,$(addsuffix .lo,$(property_files)))
|
|
||||||
@@ -762,7 +766,7 @@
|
|
||||||
rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \
|
|
||||||
mv $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \
|
|
||||||
$(libgcj_bc_dummy_LINK) -xc /dev/null -Wl,-soname,libgcj_bc.so.1 \
|
|
||||||
- -o $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 -lgcj || exit; \
|
|
||||||
+ -o $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 -Wl,--no-as-needed -lgcj || exit; \
|
|
||||||
rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1; \
|
|
||||||
$(LN_S) libgcj_bc.so.1.0.0 $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1; \
|
|
||||||
rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.la;
|
|
||||||
|
|
||||||
Index: b/libjava/Makefile.in
|
|
||||||
===================================================================
|
|
||||||
--- a/libjava/Makefile.in
|
|
||||||
+++ b/libjava/Makefile.in
|
|
||||||
@@ -10644,13 +10648,13 @@
|
|
||||||
rm .libs/libgcj_bc.so; \
|
|
||||||
mv .libs/libgcj_bc.so.1.0.0 .libs/libgcj_bc.so; \
|
|
||||||
$(libgcj_bc_dummy_LINK) -xc /dev/null -Wl,-soname,libgcj_bc.so.1 \
|
|
||||||
- -o .libs/libgcj_bc.so.1.0.0 -lgcj || exit; \
|
|
||||||
+ -o .libs/libgcj_bc.so.1.0.0 -Wl,--no-as-needed -lgcj || exit; \
|
|
||||||
rm .libs/libgcj_bc.so.1; \
|
|
||||||
$(LN_S) libgcj_bc.so.1.0.0 .libs/libgcj_bc.so.1
|
|
||||||
|
|
||||||
install/libgcj_bc.la: $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_DEPENDENCIES) install/$(am__dirstamp)
|
|
||||||
$(libgcj_bc_la_LINK) $(am_libgcj_bc_la_rpath) $(libgcj_bc_la_LDFLAGS) \
|
|
||||||
- $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_LIBADD) $(LIBS)
|
|
||||||
+ $(libgcj_bc_la_OBJECTS) $(libgcj_bc_la_LIBADD) $(LIBS) -Wl,--no-as-needed -lgcj
|
|
||||||
|
|
||||||
$(propertyo_files): %.lo: classpath/resource/%
|
|
||||||
$(mkinstalldirs) `dirname $@`; \
|
|
||||||
@@ -12494,7 +12498,7 @@
|
|
||||||
@USE_LIBGCJ_BC_TRUE@ rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \
|
|
||||||
@USE_LIBGCJ_BC_TRUE@ mv $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so; \
|
|
||||||
@USE_LIBGCJ_BC_TRUE@ $(libgcj_bc_dummy_LINK) -xc /dev/null -Wl,-soname,libgcj_bc.so.1 \
|
|
||||||
-@USE_LIBGCJ_BC_TRUE@ -o $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 -lgcj || exit; \
|
|
||||||
+@USE_LIBGCJ_BC_TRUE@ -o $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1.0.0 -Wl,--no-as-needed -lgcj || exit; \
|
|
||||||
@USE_LIBGCJ_BC_TRUE@ rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1; \
|
|
||||||
@USE_LIBGCJ_BC_TRUE@ $(LN_S) libgcj_bc.so.1.0.0 $(DESTDIR)$(toolexeclibdir)/libgcj_bc.so.1; \
|
|
||||||
@USE_LIBGCJ_BC_TRUE@ rm $(DESTDIR)$(toolexeclibdir)/libgcj_bc.la;
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
Enable -Wformat and -Wformat-security by default.
|
|
||||||
|
|
||||||
|
|
||||||
--- a/gcc/c-family/c.opt
|
|
||||||
+++ b/gcc/c-family/c.opt
|
|
||||||
@@ -412,7 +412,7 @@ C ObjC C++ ObjC++ Var(warn_format_nonliteral) Warning LangEnabledBy(C ObjC C++ O
|
|
||||||
Warn about format strings that are not literals
|
|
||||||
|
|
||||||
Wformat-security
|
|
||||||
-C ObjC C++ ObjC++ Var(warn_format_security) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=, warn_format >= 2, 0)
|
|
||||||
+C ObjC C++ ObjC++ Var(warn_format_security) Init(1) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=, warn_format >= 2, 0)
|
|
||||||
Warn about possible security problems with format functions
|
|
||||||
|
|
||||||
Wformat-y2k
|
|
||||||
@@ -424,7 +424,7 @@ C ObjC C++ ObjC++ Var(warn_format_zero_length) Warning LangEnabledBy(C ObjC C++
|
|
||||||
Warn about zero-length formats
|
|
||||||
|
|
||||||
Wformat=
|
|
||||||
-C ObjC C++ ObjC++ Joined RejectNegative UInteger Var(warn_format) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall, 1, 0)
|
|
||||||
+C ObjC C++ ObjC++ Joined RejectNegative UInteger Var(warn_format) Init(1) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall, 1, 0)
|
|
||||||
Warn about printf/scanf/strftime/strfmon format string anomalies
|
|
||||||
|
|
||||||
Wignored-qualifiers
|
|
||||||
--- a/gcc/doc/gcc.info
|
|
||||||
+++ b/gcc/doc/gcc.info
|
|
||||||
@@ -3451,6 +3451,8 @@ compiler warns that an unrecognized option is present.
|
|
||||||
'-Wno-format-contains-nul', '-Wno-format-extra-args', and
|
|
||||||
'-Wno-format-zero-length'. '-Wformat' is enabled by '-Wall'.
|
|
||||||
|
|
||||||
+ This option is enabled by default in Alpine Linux.
|
|
||||||
+
|
|
||||||
'-Wno-format-contains-nul'
|
|
||||||
If '-Wformat' is specified, do not warn about format strings
|
|
||||||
that contain NUL bytes.
|
|
||||||
@@ -3496,6 +3498,8 @@ compiler warns that an unrecognized option is present.
|
|
||||||
future warnings may be added to '-Wformat-security' that are
|
|
||||||
not included in '-Wformat-nonliteral'.)
|
|
||||||
|
|
||||||
+ This option is enabled by default in Alpine Linux.
|
|
||||||
+
|
|
||||||
'-Wformat-y2k'
|
|
||||||
If '-Wformat' is specified, also warn about 'strftime' formats
|
|
||||||
that may yield only a two-digit year.
|
|
|
@ -1,25 +0,0 @@
|
||||||
Enable -Wtrampolines by default.
|
|
||||||
|
|
||||||
|
|
||||||
--- a/gcc/common.opt
|
|
||||||
+++ b/gcc/common.opt
|
|
||||||
@@ -648,7 +648,7 @@ Common Var(warn_system_headers) Warning
|
|
||||||
Do not suppress warnings from system headers
|
|
||||||
|
|
||||||
Wtrampolines
|
|
||||||
-Common Var(warn_trampolines) Warning
|
|
||||||
+Common Var(warn_trampolines) Init(1) Warning
|
|
||||||
Warn whenever a trampoline is generated
|
|
||||||
|
|
||||||
Wtype-limits
|
|
||||||
--- a/gcc/doc/gcc.info
|
|
||||||
+++ b/gcc/doc/gcc.info
|
|
||||||
@@ -4021,6 +4021,8 @@ compiler warns that an unrecognized option is present.
|
|
||||||
and thus requires the stack to be made executable in order for the
|
|
||||||
program to work properly.
|
|
||||||
|
|
||||||
+ This warning is enabled by default in Gentoo.
|
|
||||||
+
|
|
||||||
'-Wfloat-equal'
|
|
||||||
Warn if floating-point values are used in equality comparisons.
|
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
Ensure that msgfmt doesn't encounter problems during gcc bootstrapping.
|
|
||||||
|
|
||||||
Solves error messages like the following:
|
|
||||||
|
|
||||||
msgfmt: /var/tmp/portage/sys-devel/gcc-4.1.2/work/build/./gcc/libgcc_s.so.1: version `GCC_4.2.0' not found (required by /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/libstdc++.so.6)
|
|
||||||
|
|
||||||
The libgcc_s.so used during build doesn't satisfy the needs of the
|
|
||||||
libstdc++.so that msgfmt is linked against. On the other hand, msgfmt
|
|
||||||
is used as a stand-alone application here, and what library it uses
|
|
||||||
behind the scenes is of no concern to the gcc build process.
|
|
||||||
Therefore, simply invoking it "as usual", i.e. without any special
|
|
||||||
library path, will make it work as expected here.
|
|
||||||
|
|
||||||
2011-09-19 Martin von Gagern
|
|
||||||
|
|
||||||
References:
|
|
||||||
https://bugs.gentoo.org/372377
|
|
||||||
https://bugs.gentoo.org/295480
|
|
||||||
|
|
||||||
--- gcc-4.1.2.orig/libstdc++-v3/po/Makefile.am
|
|
||||||
+++ gcc-4.1.2/libstdc++-v3/po/Makefile.am
|
|
||||||
@@ -39,6 +39,7 @@ MSGFMT = msgfmt
|
|
||||||
EXTRA_DIST = string_literals.cc POTFILES.in $(PACKAGE).pot $(LOCALE_IN)
|
|
||||||
|
|
||||||
.po.mo:
|
|
||||||
+ env --unset=LD_LIBRARY_PATH \
|
|
||||||
$(MSGFMT) -o $@ $<
|
|
||||||
|
|
||||||
all-local: all-local-$(USE_NLS)
|
|
||||||
--- gcc-4.1.2.orig/libstdc++-v3/po/Makefile.in
|
|
||||||
+++ gcc-4.1.2/libstdc++-v3/po/Makefile.in
|
|
||||||
@@ -419,6 +419,7 @@ uninstall-am: uninstall-info-am
|
|
||||||
|
|
||||||
|
|
||||||
.po.mo:
|
|
||||||
+ env --unset=LD_LIBRARY_PATH \
|
|
||||||
$(MSGFMT) -o $@ $<
|
|
||||||
|
|
||||||
all-local: all-local-$(USE_NLS)
|
|
|
@ -1,18 +0,0 @@
|
||||||
2008-07-25 Magnus Granberg <zorry@ume.nu>
|
|
||||||
|
|
||||||
* include/libiberty.h (asprintf): Don't declare if defined as a macro
|
|
||||||
|
|
||||||
--- a/include/libiberty.h
|
|
||||||
+++ b/include/libiberty.h
|
|
||||||
@@ -609,8 +609,11 @@ extern int pwait (int, int *, int);
|
|
||||||
/* Like sprintf but provides a pointer to malloc'd storage, which must
|
|
||||||
be freed by the caller. */
|
|
||||||
|
|
||||||
+/* asprintf may be declared as a macro by glibc with __USE_FORTIFY_LEVEL. */
|
|
||||||
+#ifndef asprintf
|
|
||||||
extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2;
|
|
||||||
#endif
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
#if !HAVE_DECL_VASPRINTF
|
|
||||||
/* Like vsprintf but provides a pointer to malloc'd storage, which
|
|
|
@ -1,10 +0,0 @@
|
||||||
--- a/libiberty/Makefile.in
|
|
||||||
+++ b/libiberty/Makefile.in
|
|
||||||
@@ -246,6 +246,7 @@ $(TARGETLIB): $(REQUIRED_OFILES) $(EXTRA_OFILES) $(LIBOBJS)
|
|
||||||
$(AR) $(AR_FLAGS) $(TARGETLIB) \
|
|
||||||
$(REQUIRED_OFILES) $(EXTRA_OFILES) $(LIBOBJS); \
|
|
||||||
$(RANLIB) $(TARGETLIB); \
|
|
||||||
+ cp $(TARGETLIB) ../ ; \
|
|
||||||
cd ..; \
|
|
||||||
else true; fi
|
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
https://bugs.gentoo.org/508852
|
|
||||||
https://gcc.gnu.org/PR61164
|
|
||||||
|
|
||||||
2014-04-27 Magnus Granberg <zorry@gentoo.org>
|
|
||||||
|
|
||||||
#508852
|
|
||||||
* libitm/configure.tgt: Disable FORTIFY
|
|
||||||
|
|
||||||
--- a/libitm/configure.tgt
|
|
||||||
+++ b/libitm/configure.tgt
|
|
||||||
@@ -43,6 +43,16 @@ if test "$gcc_cv_have_tls" = yes ; then
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
+# FIXME: error: inlining failed in call to always_inline
|
|
||||||
+# ‘int vfprintf(FILE*, const char*, __va_list_tag*)’
|
|
||||||
+# : function body can be overwritten at link time
|
|
||||||
+# Disable Fortify in libitm for now. #508852
|
|
||||||
+case "${target}" in
|
|
||||||
+ *-*-linux*)
|
|
||||||
+ XCFLAGS="${XCFLAGS} -U_FORTIFY_SOURCE"
|
|
||||||
+ ;;
|
|
||||||
+esac
|
|
||||||
+
|
|
||||||
# Map the target cpu to an ARCH sub-directory. At the same time,
|
|
||||||
# work out any special compilation flags as necessary.
|
|
||||||
case "${target_cpu}" in
|
|
|
@ -1,194 +0,0 @@
|
||||||
http://cgit.openembedded.org/openembedded-core/plain/meta/recipes-devtools/gcc/gcc-6.1/0010-gcc-poison-system-directories.patch
|
|
||||||
|
|
||||||
From d76250323dad69212c958e4857a98d99ab51a39e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Khem Raj <raj.khem@gmail.com>
|
|
||||||
Date: Fri, 29 Mar 2013 08:59:00 +0400
|
|
||||||
Subject: [PATCH 10/46] gcc: poison-system-directories
|
|
||||||
|
|
||||||
Signed-off-by: Khem Raj <raj.khem@gmail.com>
|
|
||||||
|
|
||||||
Upstream-Status: Inappropriate [distribution: codesourcery]
|
|
||||||
---
|
|
||||||
gcc/common.opt | 4 ++++
|
|
||||||
gcc/config.in | 6 ++++++
|
|
||||||
gcc/configure | 16 ++++++++++++++++
|
|
||||||
gcc/configure.ac | 10 ++++++++++
|
|
||||||
gcc/doc/invoke.texi | 9 +++++++++
|
|
||||||
gcc/gcc.c | 2 ++
|
|
||||||
gcc/incpath.c | 19 +++++++++++++++++++
|
|
||||||
7 files changed, 66 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/gcc/common.opt b/gcc/common.opt
|
|
||||||
index 67048db..733185c 100644
|
|
||||||
--- a/gcc/common.opt
|
|
||||||
+++ b/gcc/common.opt
|
|
||||||
@@ -659,6 +659,10 @@ Wreturn-local-addr
|
|
||||||
Common Var(warn_return_local_addr) Init(1) Warning
|
|
||||||
Warn about returning a pointer/reference to a local or temporary variable.
|
|
||||||
|
|
||||||
+Wpoison-system-directories
|
|
||||||
+Common Var(flag_poison_system_directories) Init(1) Warning
|
|
||||||
+Warn for -I and -L options using system directories if cross compiling
|
|
||||||
+
|
|
||||||
Wshadow
|
|
||||||
Common Var(warn_shadow) Warning
|
|
||||||
Warn when one local variable shadows another.
|
|
||||||
diff --git a/gcc/config.in b/gcc/config.in
|
|
||||||
index 115cb61..105b30f 100644
|
|
||||||
--- a/gcc/config.in
|
|
||||||
+++ b/gcc/config.in
|
|
||||||
@@ -187,6 +187,12 @@
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
+/* Define to warn for use of native system header directories */
|
|
||||||
+#ifndef USED_FOR_TARGET
|
|
||||||
+#undef ENABLE_POISON_SYSTEM_DIRECTORIES
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+
|
|
||||||
/* Define if you want all operations on RTL (the basic data structure of the
|
|
||||||
optimizer and back end) to be checked for dynamic type safety at runtime.
|
|
||||||
This is quite expensive. */
|
|
||||||
diff --git a/gcc/configure b/gcc/configure
|
|
||||||
index 1c6e340..8f83152 100755
|
|
||||||
--- a/gcc/configure
|
|
||||||
+++ b/gcc/configure
|
|
||||||
@@ -942,6 +942,7 @@ with_system_zlib
|
|
||||||
enable_maintainer_mode
|
|
||||||
enable_link_mutex
|
|
||||||
enable_version_specific_runtime_libs
|
|
||||||
+enable_poison_system_directories
|
|
||||||
enable_plugin
|
|
||||||
enable_host_shared
|
|
||||||
enable_libquadmath_support
|
|
||||||
@@ -1681,6 +1682,8 @@ Optional Features:
|
|
||||||
--enable-version-specific-runtime-libs
|
|
||||||
specify that runtime libraries should be installed
|
|
||||||
in a compiler-specific directory
|
|
||||||
+ --enable-poison-system-directories
|
|
||||||
+ warn for use of native system header directories
|
|
||||||
--enable-plugin enable plugin support
|
|
||||||
--enable-host-shared build host code as shared libraries
|
|
||||||
--disable-libquadmath-support
|
|
||||||
@@ -28908,6 +28911,19 @@ if test "${enable_version_specific_runtime_libs+set}" = set; then :
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
+# Check whether --enable-poison-system-directories was given.
|
|
||||||
+if test "${enable_poison_system_directories+set}" = set; then :
|
|
||||||
+ enableval=$enable_poison_system_directories;
|
|
||||||
+else
|
|
||||||
+ enable_poison_system_directories=no
|
|
||||||
+fi
|
|
||||||
+
|
|
||||||
+if test "x${enable_poison_system_directories}" = "xyes"; then
|
|
||||||
+
|
|
||||||
+$as_echo "#define ENABLE_POISON_SYSTEM_DIRECTORIES 1" >>confdefs.h
|
|
||||||
+
|
|
||||||
+fi
|
|
||||||
+
|
|
||||||
# Substitute configuration variables
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/gcc/configure.ac b/gcc/configure.ac
|
|
||||||
index 6c1dcd9..0fccaef 100644
|
|
||||||
--- a/gcc/configure.ac
|
|
||||||
+++ b/gcc/configure.ac
|
|
||||||
@@ -5861,6 +5861,16 @@ AC_ARG_ENABLE(version-specific-runtime-libs,
|
|
||||||
[specify that runtime libraries should be
|
|
||||||
installed in a compiler-specific directory])])
|
|
||||||
|
|
||||||
+AC_ARG_ENABLE([poison-system-directories],
|
|
||||||
+ AS_HELP_STRING([--enable-poison-system-directories],
|
|
||||||
+ [warn for use of native system header directories]),,
|
|
||||||
+ [enable_poison_system_directories=no])
|
|
||||||
+if test "x${enable_poison_system_directories}" = "xyes"; then
|
|
||||||
+ AC_DEFINE([ENABLE_POISON_SYSTEM_DIRECTORIES],
|
|
||||||
+ [1],
|
|
||||||
+ [Define to warn for use of native system header directories])
|
|
||||||
+fi
|
|
||||||
+
|
|
||||||
# Substitute configuration variables
|
|
||||||
AC_SUBST(subdirs)
|
|
||||||
AC_SUBST(srcdir)
|
|
||||||
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
|
|
||||||
index 821f8fd..8bb49e7 100644
|
|
||||||
--- a/gcc/doc/invoke.texi
|
|
||||||
+++ b/gcc/doc/invoke.texi
|
|
||||||
@@ -284,6 +284,7 @@ Objective-C and Objective-C++ Dialects}.
|
|
||||||
-Wparentheses -Wno-pedantic-ms-format @gol
|
|
||||||
-Wplacement-new -Wplacement-new=@var{n} @gol
|
|
||||||
-Wpointer-arith -Wno-pointer-to-int-cast @gol
|
|
||||||
+-Wno-poison-system-directories @gol
|
|
||||||
-Wno-pragmas -Wredundant-decls -Wno-return-local-addr @gol
|
|
||||||
-Wreturn-type -Wsequence-point -Wshadow -Wno-shadow-ivar @gol
|
|
||||||
-Wshift-overflow -Wshift-overflow=@var{n} @gol
|
|
||||||
@@ -4723,6 +4724,14 @@ made up of data only and thus requires no special treatment. But, for
|
|
||||||
most targets, it is made up of code and thus requires the stack to be
|
|
||||||
made executable in order for the program to work properly.
|
|
||||||
|
|
||||||
+@item -Wno-poison-system-directories
|
|
||||||
+@opindex Wno-poison-system-directories
|
|
||||||
+Do not warn for @option{-I} or @option{-L} options using system
|
|
||||||
+directories such as @file{/usr/include} when cross compiling. This
|
|
||||||
+option is intended for use in chroot environments when such
|
|
||||||
+directories contain the correct headers and libraries for the target
|
|
||||||
+system rather than the host.
|
|
||||||
+
|
|
||||||
@item -Wfloat-equal
|
|
||||||
@opindex Wfloat-equal
|
|
||||||
@opindex Wno-float-equal
|
|
||||||
diff --git a/gcc/gcc.c b/gcc/gcc.c
|
|
||||||
index 1af5920..4cfef7f 100644
|
|
||||||
--- a/gcc/gcc.c
|
|
||||||
+++ b/gcc/gcc.c
|
|
||||||
@@ -1017,6 +1017,8 @@ proper position among the other output files. */
|
|
||||||
"%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
|
|
||||||
"%X %{o*} %{e*} %{N} %{n} %{r}\
|
|
||||||
%{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}} \
|
|
||||||
+ %{Wno-poison-system-directories:--no-poison-system-directories} \
|
|
||||||
+ %{Werror=poison-system-directories:--error-poison-system-directories} \
|
|
||||||
%{static:} %{L*} %(mfwrap) %(link_libgcc) " \
|
|
||||||
VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o " CHKP_SPEC " \
|
|
||||||
%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
|
|
||||||
diff --git a/gcc/incpath.c b/gcc/incpath.c
|
|
||||||
index ea40f4a..856da41 100644
|
|
||||||
--- a/gcc/incpath.c
|
|
||||||
+++ b/gcc/incpath.c
|
|
||||||
@@ -26,6 +26,7 @@
|
|
||||||
#include "intl.h"
|
|
||||||
#include "incpath.h"
|
|
||||||
#include "cppdefault.h"
|
|
||||||
+#include "diagnostic-core.h"
|
|
||||||
|
|
||||||
/* Microsoft Windows does not natively support inodes.
|
|
||||||
VMS has non-numeric inodes. */
|
|
||||||
@@ -381,6 +382,24 @@ merge_include_chains (const char *sysroot, cpp_reader *pfile, int verbose)
|
|
||||||
}
|
|
||||||
fprintf (stderr, _("End of search list.\n"));
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+#ifdef ENABLE_POISON_SYSTEM_DIRECTORIES
|
|
||||||
+ if (flag_poison_system_directories)
|
|
||||||
+ {
|
|
||||||
+ struct cpp_dir *p;
|
|
||||||
+
|
|
||||||
+ for (p = heads[QUOTE]; p; p = p->next)
|
|
||||||
+ {
|
|
||||||
+ if ((!strncmp (p->name, "/usr/include", 12))
|
|
||||||
+ || (!strncmp (p->name, "/usr/local/include", 18))
|
|
||||||
+ || (!strncmp (p->name, "/usr/X11R6/include", 18)))
|
|
||||||
+ warning (OPT_Wpoison_system_directories,
|
|
||||||
+ "include location \"%s\" is unsafe for "
|
|
||||||
+ "cross-compilation",
|
|
||||||
+ p->name);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Use given -I paths for #include "..." but not #include <...>, and
|
|
||||||
--
|
|
||||||
2.8.2
|
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
libatomic build failure if configured with --disable-dependency-tracking
|
|
||||||
load_n.c:115:1: fatal error: opening dependency file .deps/load_1_.lo.Ppo: No such file or directory
|
|
||||||
|
|
||||||
https://bugs.gentoo.org/463463
|
|
||||||
http://gcc.gnu.org/PR55930
|
|
||||||
|
|
||||||
--- a/libatomic/Makefile.in
|
|
||||||
+++ b/libatomic/Makefile.in
|
|
||||||
@@ -298,7 +298,8 @@ PAT_N = $(word 2,$(PAT_SPLIT))
|
|
||||||
PAT_S = $(word 3,$(PAT_SPLIT))
|
|
||||||
IFUNC_DEF = -DIFUNC_ALT=$(PAT_S)
|
|
||||||
IFUNC_OPT = $(word $(PAT_S),$(IFUNC_OPTIONS))
|
|
||||||
-M_DEPS = -MT $@ -MD -MP -MF $(DEPDIR)/$(@F).Ppo
|
|
||||||
+@AMDEP_TRUE@M_DEPS = -MT $@ -MD -MP -MF $(DEPDIR)/$(@F).Ppo
|
|
||||||
+@AMDEP_FALSE@M_DEPS =
|
|
||||||
M_SIZE = -DN=$(PAT_N)
|
|
||||||
M_IFUNC = $(if $(PAT_S),$(IFUNC_DEF) $(IFUNC_OPT))
|
|
||||||
M_FILE = $(PAT_BASE)_n.c
|
|
|
@ -1,59 +0,0 @@
|
||||||
From 594e3c1ab576daddeb86015efc8b1677020b1878 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Szabolcs Nagy <nsz@port70.net>
|
|
||||||
Date: Sat, 24 Oct 2015 20:39:30 +0000
|
|
||||||
Subject: [PATCH 1/6] cilkrts
|
|
||||||
|
|
||||||
---
|
|
||||||
libcilkrts/runtime/os-unix.c | 22 +++++++---------------
|
|
||||||
1 file changed, 7 insertions(+), 15 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/libcilkrts/runtime/os-unix.c b/libcilkrts/runtime/os-unix.c
|
|
||||||
index cb582dd..e43d7d5 100644
|
|
||||||
--- a/libcilkrts/runtime/os-unix.c
|
|
||||||
+++ b/libcilkrts/runtime/os-unix.c
|
|
||||||
@@ -51,6 +51,7 @@
|
|
||||||
#if defined __linux__
|
|
||||||
# include <sys/sysinfo.h>
|
|
||||||
# include <sys/syscall.h>
|
|
||||||
+# include <sched.h>
|
|
||||||
#elif defined __APPLE__
|
|
||||||
# include <sys/sysctl.h>
|
|
||||||
// Uses sysconf(_SC_NPROCESSORS_ONLN) in verbose output
|
|
||||||
@@ -400,28 +401,19 @@ COMMON_SYSDEP void __cilkrts_sleep(void)
|
|
||||||
|
|
||||||
COMMON_SYSDEP void __cilkrts_yield(void)
|
|
||||||
{
|
|
||||||
-#if __APPLE__ || __FreeBSD__ || __VXWORKS__
|
|
||||||
- // On MacOS, call sched_yield to yield quantum. I'm not sure why we
|
|
||||||
- // don't do this on Linux also.
|
|
||||||
- sched_yield();
|
|
||||||
-#elif defined(__DragonFly__)
|
|
||||||
- // On DragonFly BSD, call sched_yield to yield quantum.
|
|
||||||
- sched_yield();
|
|
||||||
-#elif defined(__MIC__)
|
|
||||||
+#if defined(__MIC__)
|
|
||||||
// On MIC, pthread_yield() really trashes things. Arch's measurements
|
|
||||||
// showed that calling _mm_delay_32() (or doing nothing) was a better
|
|
||||||
// option. Delaying 1024 clock cycles is a reasonable compromise between
|
|
||||||
// giving up the processor and latency starting up when work becomes
|
|
||||||
// available
|
|
||||||
_mm_delay_32(1024);
|
|
||||||
-#elif defined(__ANDROID__) || (defined(__sun__) && defined(__svr4__))
|
|
||||||
- // On Android and Solaris, call sched_yield to yield quantum. I'm not
|
|
||||||
- // sure why we don't do this on Linux also.
|
|
||||||
- sched_yield();
|
|
||||||
-#else
|
|
||||||
- // On Linux, call pthread_yield (which in turn will call sched_yield)
|
|
||||||
- // to yield quantum.
|
|
||||||
+#elif defined(__sun__) && !defined(__svr4__)
|
|
||||||
+ // On old SunOS call pthread_yield to yield a quantum.
|
|
||||||
pthread_yield();
|
|
||||||
+#else
|
|
||||||
+ // On other platforms call sched_yield to yield a quantum.
|
|
||||||
+ sched_yield();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.8.1
|
|
||||||
|
|
|
@ -1,56 +0,0 @@
|
||||||
From 9e3eab51e518018d9d99b3123598b1e2322a6af3 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Szabolcs Nagy <nsz@port70.net>
|
|
||||||
Date: Sat, 24 Oct 2015 20:09:53 +0000
|
|
||||||
Subject: [PATCH 3/6] libgcc_s
|
|
||||||
|
|
||||||
---
|
|
||||||
gcc/config/i386/i386.c | 4 ++--
|
|
||||||
libgcc/config/i386/cpuinfo.c | 6 +++---
|
|
||||||
libgcc/config/i386/t-linux | 2 +-
|
|
||||||
3 files changed, 6 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
|
|
||||||
index 3d044e8..82523e1 100644
|
|
||||||
--- a/gcc/config/i386/i386.c
|
|
||||||
+++ b/gcc/config/i386/i386.c
|
|
||||||
@@ -40269,10 +40269,10 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
|
|
||||||
{
|
|
||||||
case IX86_BUILTIN_CPU_INIT:
|
|
||||||
{
|
|
||||||
- /* Make it call __cpu_indicator_init in libgcc. */
|
|
||||||
+ /* Make it call __cpu_indicator_init_local in libgcc.a. */
|
|
||||||
tree call_expr, fndecl, type;
|
|
||||||
type = build_function_type_list (integer_type_node, NULL_TREE);
|
|
||||||
- fndecl = build_fn_decl ("__cpu_indicator_init", type);
|
|
||||||
+ fndecl = build_fn_decl ("__cpu_indicator_init_local", type);
|
|
||||||
call_expr = build_call_expr (fndecl, 0);
|
|
||||||
return expand_expr (call_expr, target, mode, EXPAND_NORMAL);
|
|
||||||
}
|
|
||||||
diff --git a/libgcc/config/i386/cpuinfo.c b/libgcc/config/i386/cpuinfo.c
|
|
||||||
index 8c2248d..6c82f15 100644
|
|
||||||
--- a/libgcc/config/i386/cpuinfo.c
|
|
||||||
+++ b/libgcc/config/i386/cpuinfo.c
|
|
||||||
@@ -485,7 +485,7 @@ __cpu_indicator_init (void)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-#if defined SHARED && defined USE_ELF_SYMVER
|
|
||||||
-__asm__ (".symver __cpu_indicator_init, __cpu_indicator_init@GCC_4.8.0");
|
|
||||||
-__asm__ (".symver __cpu_model, __cpu_model@GCC_4.8.0");
|
|
||||||
+#ifndef SHARED
|
|
||||||
+int __cpu_indicator_init_local (void)
|
|
||||||
+ __attribute__ ((weak, alias ("__cpu_indicator_init")));
|
|
||||||
#endif
|
|
||||||
diff --git a/libgcc/config/i386/t-linux b/libgcc/config/i386/t-linux
|
|
||||||
index 11bb46e..4f47f7b 100644
|
|
||||||
--- a/libgcc/config/i386/t-linux
|
|
||||||
+++ b/libgcc/config/i386/t-linux
|
|
||||||
@@ -3,4 +3,4 @@
|
|
||||||
# t-slibgcc-elf-ver and t-linux
|
|
||||||
SHLIB_MAPFILES = libgcc-std.ver $(srcdir)/config/i386/libgcc-glibc.ver
|
|
||||||
|
|
||||||
-HOST_LIBGCC2_CFLAGS += -mlong-double-80 -DUSE_ELF_SYMVER
|
|
||||||
+HOST_LIBGCC2_CFLAGS += -mlong-double-80
|
|
||||||
--
|
|
||||||
2.8.1
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
From edec78452d693fb524daa9a6efd45c850b27b25c Mon Sep 17 00:00:00 2001
|
|
||||||
From: Szabolcs Nagy <nsz@port70.net>
|
|
||||||
Date: Fri, 6 Nov 2015 23:59:20 +0000
|
|
||||||
Subject: [PATCH 4/6] linux_libc_has_function
|
|
||||||
|
|
||||||
---
|
|
||||||
gcc/config/linux.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/linux.c b/gcc/config/linux.c
|
|
||||||
index 250296b..16c3768 100644
|
|
||||||
--- a/gcc/config/linux.c
|
|
||||||
+++ b/gcc/config/linux.c
|
|
||||||
@@ -26,7 +26,7 @@ along with GCC; see the file COPYING3. If not see
|
|
||||||
bool
|
|
||||||
linux_libc_has_function (enum function_class fn_class)
|
|
||||||
{
|
|
||||||
- if (OPTION_GLIBC)
|
|
||||||
+ if (OPTION_GLIBC || OPTION_MUSL)
|
|
||||||
return true;
|
|
||||||
if (OPTION_BIONIC)
|
|
||||||
if (fn_class == function_c94
|
|
||||||
--
|
|
||||||
2.8.1
|
|
||||||
|
|
|
@ -1,75 +0,0 @@
|
||||||
From b6015aca9c9cc83739fd0ed637a835119b2c4e34 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Szabolcs Nagy <nsz@port70.net>
|
|
||||||
Date: Sat, 7 Nov 2015 02:08:05 +0000
|
|
||||||
Subject: [PATCH 5/6] nopie
|
|
||||||
|
|
||||||
---
|
|
||||||
gcc/configure | 27 +++++++++++++++++++++++++++
|
|
||||||
gcc/configure.ac | 13 +++++++++++++
|
|
||||||
2 files changed, 40 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/gcc/configure b/gcc/configure
|
|
||||||
index 1c6e340..7e8b5d6 100755
|
|
||||||
--- a/gcc/configure
|
|
||||||
+++ b/gcc/configure
|
|
||||||
@@ -29390,6 +29390,33 @@ fi
|
|
||||||
$as_echo "$gcc_cv_no_pie" >&6; }
|
|
||||||
if test "$gcc_cv_no_pie" = "yes"; then
|
|
||||||
NO_PIE_FLAG="-no-pie"
|
|
||||||
+else
|
|
||||||
+ # Check if -nopie works.
|
|
||||||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -nopie option" >&5
|
|
||||||
+$as_echo_n "checking for -nopie option... " >&6; }
|
|
||||||
+if test "${gcc_cv_nopie+set}" = set; then :
|
|
||||||
+ $as_echo_n "(cached) " >&6
|
|
||||||
+else
|
|
||||||
+ saved_LDFLAGS="$LDFLAGS"
|
|
||||||
+ LDFLAGS="$LDFLAGS -nopie"
|
|
||||||
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
||||||
+/* end confdefs.h. */
|
|
||||||
+int main(void) {return 0;}
|
|
||||||
+_ACEOF
|
|
||||||
+if ac_fn_cxx_try_link "$LINENO"; then :
|
|
||||||
+ gcc_cv_nopie=yes
|
|
||||||
+else
|
|
||||||
+ gcc_cv_nopie=no
|
|
||||||
+fi
|
|
||||||
+rm -f core conftest.err conftest.$ac_objext \
|
|
||||||
+ conftest$ac_exeext conftest.$ac_ext
|
|
||||||
+ LDFLAGS="$saved_LDFLAGS"
|
|
||||||
+fi
|
|
||||||
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_nopie" >&5
|
|
||||||
+$as_echo "$gcc_cv_nopie" >&6; }
|
|
||||||
+ if test "$gcc_cv_nopie" = "yes"; then
|
|
||||||
+ NO_PIE_FLAG="-nopie"
|
|
||||||
+ fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/gcc/configure.ac b/gcc/configure.ac
|
|
||||||
index 6c1dcd9..0ca7647 100644
|
|
||||||
--- a/gcc/configure.ac
|
|
||||||
+++ b/gcc/configure.ac
|
|
||||||
@@ -6098,6 +6098,19 @@ AC_CACHE_CHECK([for -no-pie option],
|
|
||||||
LDFLAGS="$saved_LDFLAGS"])
|
|
||||||
if test "$gcc_cv_no_pie" = "yes"; then
|
|
||||||
NO_PIE_FLAG="-no-pie"
|
|
||||||
+else
|
|
||||||
+ # Check if -nopie works.
|
|
||||||
+ AC_CACHE_CHECK([for -nopie option],
|
|
||||||
+ [gcc_cv_nopie],
|
|
||||||
+ [saved_LDFLAGS="$LDFLAGS"
|
|
||||||
+ LDFLAGS="$LDFLAGS -nopie"
|
|
||||||
+ AC_LINK_IFELSE([int main(void) {return 0;}],
|
|
||||||
+ [gcc_cv_nopie=yes],
|
|
||||||
+ [gcc_cv_nopie=no])
|
|
||||||
+ LDFLAGS="$saved_LDFLAGS"])
|
|
||||||
+ if test "$gcc_cv_nopie" = "yes"; then
|
|
||||||
+ NO_PIE_FLAG="-nopie"
|
|
||||||
+ fi
|
|
||||||
fi
|
|
||||||
AC_SUBST([NO_PIE_FLAG])
|
|
||||||
|
|
||||||
--
|
|
||||||
2.8.1
|
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
diff --git a/gcc/config/gnu-user.h b/gcc/config/gnu-user.h
|
|
||||||
index b0bf40a..d4b56fe 100644
|
|
||||||
--- a/gcc/config/gnu-user.h
|
|
||||||
+++ b/gcc/config/gnu-user.h
|
|
||||||
@@ -51,10 +51,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
||||||
#if defined HAVE_LD_PIE
|
|
||||||
#define GNU_USER_TARGET_STARTFILE_SPEC \
|
|
||||||
"%{!shared: %{pg|p|profile:gcrt1.o%s;: \
|
|
||||||
- %{" PIE_SPEC ":Scrt1.o%s} %{" NO_PIE_SPEC ":crt1.o%s}}} \
|
|
||||||
- crti.o%s %{static:crtbeginT.o%s;: %{shared:crtbeginS.o%s} \
|
|
||||||
+ %{" PIE_SPEC ":%{static:rcrt1.o%s;:Scrt1.o%s}} %{" NO_PIE_SPEC ":crt1.o%s}}} \
|
|
||||||
+ crti.o%s %{shared:crtbeginS.o%s;: \
|
|
||||||
%{" PIE_SPEC ":crtbeginS.o%s} \
|
|
||||||
- %{" NO_PIE_SPEC ":crtbegin.o%s}} \
|
|
||||||
+ %{" NO_PIE_SPEC ":%{static:crtbeginT.o%s;:crtbegin.o%s}}} \
|
|
||||||
%{fvtable-verify=none:%s; \
|
|
||||||
fvtable-verify=preinit:vtv_start_preinit.o%s; \
|
|
||||||
fvtable-verify=std:vtv_start.o%s} \
|
|
||||||
diff --git a/gcc/gcc.c b/gcc/gcc.c
|
|
||||||
index 0208d61..731564e 100644
|
|
||||||
--- a/gcc/gcc.c
|
|
||||||
+++ b/gcc/gcc.c
|
|
||||||
@@ -870,7 +870,7 @@ proper position among the other output files. */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef ENABLE_DEFAULT_PIE
|
|
||||||
-#define NO_PIE_SPEC "no-pie|static"
|
|
||||||
+#define NO_PIE_SPEC "no-pie"
|
|
||||||
#define PIE_SPEC NO_PIE_SPEC "|r|shared:;"
|
|
||||||
#define NO_FPIE1_SPEC "fno-pie"
|
|
||||||
#define FPIE1_SPEC NO_FPIE1_SPEC ":;"
|
|
||||||
@@ -916,7 +916,7 @@ proper position among the other output files. */
|
|
||||||
#ifndef LINK_PIE_SPEC
|
|
||||||
#ifdef HAVE_LD_PIE
|
|
||||||
#ifndef LD_PIE_SPEC
|
|
||||||
-#define LD_PIE_SPEC "-pie"
|
|
||||||
+#define LD_PIE_SPEC "-pie %{static:--no-dynamic-linker -Bsymbolic}"
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define LD_PIE_SPEC ""
|
|
|
@ -1,32 +0,0 @@
|
||||||
From be841c16dd544553c67faac79bd4cc3cd10a1dc0 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Tuan M. Hoang" <tmhoang@flatglobe.org>
|
|
||||||
Date: Mon, 21 Nov 2016 01:42:16 +0700
|
|
||||||
Subject: [PATCH] main/gcc: add musl s390x dynamic linker
|
|
||||||
|
|
||||||
---
|
|
||||||
gcc/config/s390/linux.h | 9 +++++++++
|
|
||||||
1 file changed, 9 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/gcc/config/s390/linux.h b/gcc/config/s390/linux.h
|
|
||||||
index 1e3ed35..a244214 100644
|
|
||||||
--- a/gcc/config/s390/linux.h
|
|
||||||
+++ b/gcc/config/s390/linux.h
|
|
||||||
@@ -63,6 +63,15 @@ along with GCC; see the file COPYING3. If not see
|
|
||||||
#define GLIBC_DYNAMIC_LINKER32 "/lib/ld.so.1"
|
|
||||||
#define GLIBC_DYNAMIC_LINKER64 "/lib/ld64.so.1"
|
|
||||||
|
|
||||||
+#undef MUSL_DYNAMIC_LINKER
|
|
||||||
+#define MUSL_DYNAMIC_LINKER "/lib/ld-musl-s390x.so.1"
|
|
||||||
+#undef MUSL_DYNAMIC_LINKER32
|
|
||||||
+#define MUSL_DYNAMIC_LINKER32 "/lib/ld-musl-s390x.so.1"
|
|
||||||
+#undef MUSL_DYNAMIC_LINKER64
|
|
||||||
+#define MUSL_DYNAMIC_LINKER64 "/lib/ld-musl-s390x.so.1"
|
|
||||||
+#undef MUSL_DYNAMIC_LINKERX32
|
|
||||||
+#define MUSL_DYNAMIC_LINKERX32 "/lib/ld-musl-s390x.so.1"
|
|
||||||
+
|
|
||||||
#undef LINK_SPEC
|
|
||||||
#define LINK_SPEC \
|
|
||||||
"%{m31:-m elf_s390}%{m64:-m elf64_s390} --as-needed \
|
|
||||||
--
|
|
||||||
2.10.2
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue