a92ffb3e94
The files arm-cores.def, arm-fpus.def and arm-arches.def are parsed and used in several places and the format is slightly awkward to maintain as they must be parsable in C and by certain scripts. Furthermore, changes to the content that affects every entry is particularly awkward for dealing with merges. This patch replaces all three files with a single file that specifies all the command-line related definitions in a new format that allows for better checking for consistency as well as (hopefully) easier to merge changes. The awk script used to parse it is relatively complicated, but should be pretty portable. It works by parsing in all the data and then operating one of a number of possible sub-commands to generate the desired output. The new method picked up one error. The CPU descriptions referred to an architecture ARMv5tej which was not supported by -march. This has been fixed by adding the relevant entry to the architecture list. gcc: * config.gcc: Use new awk script to check CPU, FPU and architecture parameters for --with-... options. * config/arm/parsecpu.awk: New file * config/arm/arm-cpus.in: New file. * config/arm/arm-opts.h: Include arm-cpu.h instead of processing .def files. * config/arm/arm.c: Include arm-cpu-data.h instead of processing .def files. * config/arm/t-arm: Update dependency rules. * common/config/arm/arm-common.c: Include arm-cpu-cdata.h instead of processing .def files. * config/arm/genopt.sh: Deleted. * config/arm/gentune.sh: Deleted. * config/arm/arm-cores.def: Deleted. * config/arm/arm-arches.def: Deleted. * config/arm/arm-fpus.def: Deleted. * config/arm/arm-tune.md: Regenerated. * config/arm/arm-tables.opt: Regenerated. * config/arm/arm-cpu.h: New generated file. * config/arm/arm-cpu-data.h: New generated file. * config/arm/arm-cpu-cdata.h: New generated file. Contrib: * gcc_update: Adjust touch list. From-SVN: r244316
420 lines
15 KiB
Bash
Executable File
420 lines
15 KiB
Bash
Executable File
#! /bin/sh
|
|
#
|
|
# Update a local Subversion, Git or Mercurial tree from the GCC
|
|
# repository, with an emphasis on treating generated files correctly, so
|
|
# that autoconf, gperf et al are not required for the ``end'' user.
|
|
#
|
|
# (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
|
|
# 2011 Free Software Foundation
|
|
# Originally by Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>, August 1998.
|
|
#
|
|
# This script is Free Software, and it can be copied, distributed and
|
|
# modified as defined in the GNU General Public License. A copy of
|
|
# its license can be downloaded from http://www.gnu.org/copyleft/gpl.html
|
|
#
|
|
#
|
|
# By default all command-line options are passed to `svn update` or `hg/git
|
|
# pull` in addition to $UPDATE_OPTIONS (defined below). If the first parameter
|
|
# reads --nostdflags, $UPDATE_OPTIONS as well as this parameter itself
|
|
# are omitted.
|
|
#
|
|
# If the first parameter reads --patch, the second parameter is considered
|
|
# a patch file.
|
|
#
|
|
# If the first parameter is --touch, no svn operation will be performed,
|
|
# only generated files that appear to be out of date in the local tree
|
|
# will be touched.
|
|
#
|
|
# If the first parameter is --list, a list of the generated files and
|
|
# their dependencies will be printed; --help prints this message.
|
|
#
|
|
# If the first parameter is --silent, this script prints nothing other
|
|
# than error messages; the second parameter is then interpreted as above.
|
|
#
|
|
# Examples:
|
|
#
|
|
# contrib/gcc_update -r 8712
|
|
# contrib/gcc_update --patch some-patch
|
|
# contrib/gcc_update --touch
|
|
# contrib/gcc_update --list
|
|
|
|
|
|
# Default options used when updating (none).
|
|
UPDATE_OPTIONS=""
|
|
|
|
# Set the locale to C to make this script work for users with foreign
|
|
# locale like e.g. French UTF-8.
|
|
LANG=C
|
|
LC_ALL=C
|
|
export LANG LC_ALL
|
|
|
|
######## Anything below shouldn't be changed by regular users.
|
|
|
|
# Arrange for the value of $0 to be available for functions
|
|
self=$0
|
|
|
|
# This function prints its arguments to standard output unless
|
|
# "silent" is set.
|
|
unset silent
|
|
chat () {
|
|
if [ -z "$silent" ]; then
|
|
echo "$@"
|
|
fi
|
|
}
|
|
|
|
# This function prints a list of all generated files, along with their
|
|
# dependencies. Note that only one target is supported per line: the
|
|
# colon is stripped from the output.
|
|
files_and_dependencies () {
|
|
sed -e 's/ *#.*//' -e '/^$/d' -e 's/://' <<\EOF
|
|
# fixincludes
|
|
fixincludes/configure: fixincludes/configure.ac fixincludes/aclocal.m4
|
|
fixincludes/config.h.in: fixincludes/configure.ac fixincludes/aclocal.m4
|
|
# intl library
|
|
intl/plural.c: intl/plural.y
|
|
intl/configure: intl/configure.ac intl/aclocal.m4
|
|
intl/config.h.in: intl/configure.ac intl/aclocal.m4
|
|
# Now, proceed to gcc automatically generated files
|
|
gcc/configure: gcc/configure.ac
|
|
gcc/cstamp-h.in: gcc/configure.ac
|
|
gcc/config.in: gcc/cstamp-h.in
|
|
gcc/fixinc/fixincl.x: gcc/fixinc/fixincl.tpl gcc/fixinc/inclhack.def
|
|
gcc/config/aarch64/aarch64-tune.md: gcc/config/aarch64/aarch64-cores.def gcc/config/aarch64/gentune.sh
|
|
gcc/config/arm/arm-tune.md: gcc/config/arm/arm-cpus.in gcc/config/arm/parsecpu.awk
|
|
gcc/config/arm/arm-tables.opt: gcc/config/arm/arm-cpus.in gcc/config/arm/parsecpu.awk
|
|
gcc/config/arm/arm-cpu.h: gcc/config/arm/arm-cpus.in gcc/config/arm/parsecpu.awk
|
|
gcc/config/arm/arm-cpu-data.h: gcc/config/arm/arm-cpus.in gcc/config/arm/parsecpu.awk
|
|
gcc/config/arm/arm-cpu-cdata.h: gcc/config/arm/arm-cpus.in gcc/config/arm/parsecpu.awk
|
|
gcc/config/avr/avr-tables.opt: gcc/config/avr/avr-mcus.def gcc/config/avr/genopt.sh
|
|
gcc/config/avr/t-multilib: gcc/config/avr/avr-mcus.def gcc/config/avr/genmultilib.awk
|
|
gcc/config/c6x/c6x-tables.opt: gcc/config/c6x/c6x-isas.def gcc/config/c6x/genopt.sh
|
|
gcc/config/c6x/c6x-sched.md: gcc/config/c6x/c6x-sched.md.in gcc/config/c6x/gensched.sh
|
|
gcc/config/c6x/c6x-mult.md: gcc/config/c6x/c6x-mult.md.in gcc/config/c6x/genmult.sh
|
|
gcc/config/m68k/m68k-tables.opt: gcc/config/m68k/m68k-devices.def gcc/config/m68k/m68k-isas.def gcc/config/m68k/m68k-microarchs.def gcc/config/m68k/genopt.sh
|
|
gcc/config/mips/mips-tables.opt: gcc/config/mips/mips-cpus.def gcc/config/mips/genopt.sh
|
|
gcc/config/rs6000/rs6000-tables.opt: gcc/config/rs6000/rs6000-cpus.def gcc/config/rs6000/genopt.sh
|
|
gcc/config/tilegx/mul-tables.c: gcc/config/tilepro/gen-mul-tables.cc
|
|
gcc/config/tilepro/mul-tables.c: gcc/config/tilepro/gen-mul-tables.cc
|
|
# And then, language-specific files
|
|
gcc/cp/cfns.h: gcc/cp/cfns.gperf
|
|
gcc/java/keyword.h: gcc/java/keyword.gperf
|
|
# testsuite
|
|
# Without this, _Pragma3.c can have a false negative.
|
|
gcc/testsuite/gcc.dg/cpp/_Pragma3.c: gcc/testsuite/gcc.dg/cpp/mi1c.h
|
|
# Similarly, without this, you will see:
|
|
# direct2s.c:35: warning: current file is older than direct2.c
|
|
gcc/testsuite/gcc.dg/cpp/direct2s.c: gcc/testsuite/gcc.dg/cpp/direct2.c
|
|
# lto-plugin
|
|
lto-plugin/configure: lto-plugin/configure.ac lto-plugin/aclocal.m4
|
|
lto-plugin/Makefile.in: lto-plugin/Makefile.am lto-plugin/aclocal.m4
|
|
# And libraries, at last
|
|
libbanshee/configure: libbanshee/configure.ac
|
|
libmudflap/configure: libmudflap/configure.ac
|
|
libobjc/configure: libobjc/configure.ac
|
|
zlib/aclocal.m4: zlib/configure.ac zlib/acinclude.m4
|
|
zlib/Makefile.in: zlib/Makefile.am zlib/configure.ac zlib/aclocal.m4
|
|
zlib/configure: zlib/configure.ac zlib/aclocal.m4
|
|
fastjar/aclocal.m4: fastjar/configure.ac
|
|
fastjar/Makefile.in: fastjar/Makefile.am fastjar/configure.ac fastjar/aclocal.m4
|
|
fastjar/configure: fastjar/configure.ac fastjar/aclocal.m4
|
|
boehm-gc/aclocal.m4: boehm-gc/configure.ac
|
|
boehm-gc/Makefile.in: boehm-gc/Makefile.am boehm-gc/configure.ac boehm-gc/aclocal.m4
|
|
boehm-gc/configure: boehm-gc/configure.ac boehm-gc/aclocal.m4
|
|
libada/configure: libada/configure.ac
|
|
libffi/aclocal.m4: libffi/configure.ac libffi/acinclude.m4
|
|
libffi/Makefile.in: libffi/Makefile.am libffi/configure.ac libffi/aclocal.m4
|
|
libffi/configure: libffi/configure.ac libffi/aclocal.m4
|
|
libffi/fficonfig.h.in: libffi/configure.ac libffi/aclocal.m4
|
|
libgfortran/aclocal.m4: libgfortran/configure.ac libgfortran/acinclude.m4
|
|
libgfortran/Makefile.in: libgfortran/Makefile.am libgfortran/configure.ac libgfortran/aclocal.m4
|
|
libquadmath/configure: libquadmath/configure.ac libquadmath/aclocal.m4
|
|
libquadmath/aclocal.m4: libquadmath/configure.ac libquadmath/acinclude.m4
|
|
libquadmath/Makefile.in: libquadmath/Makefile.am libquadmath/configure.ac libgfortran/aclocal.m4
|
|
libgfortran/configure: libgfortran/configure.ac libgfortran/aclocal.m4
|
|
libjava/aclocal.m4: libjava/configure.ac
|
|
libjava/Makefile.in: libjava/Makefile.am libjava/configure.ac libjava/aclocal.m4
|
|
libjava/configure: libjava/configure.ac libjava/aclocal.m4
|
|
libjava/libltdl/aclocal.m4: libjava/libltdl/configure.ac libjava/libltdl/acinclude.m4
|
|
libjava/libltdl/Makefile.in: libjava/libltdl/Makefile.am libjava/libltdl/configure.ac libjava/libltdl/aclocal.m4
|
|
libjava/libltdl/configure: libjava/libltdl/configure.ac libjava/libltdl/aclocal.m4
|
|
libjava/libltdl/config-h.in: libjava/libltdl/configure.ac libjava/libltdl/aclocal.m4
|
|
libcpp/aclocal.m4: libcpp/configure.ac
|
|
libcpp/Makefile.in: libcpp/configure.ac libcpp/aclocal.m4
|
|
libcpp/configure: libcpp/configure.ac libcpp/aclocal.m4
|
|
libgomp/aclocal.m4: libgomp/configure.ac libgomp/acinclude.m4
|
|
libgomp/Makefile.am: libgomp/plugin/Makefrag.am
|
|
libgomp/Makefile.in: libgomp/Makefile.am libgomp/aclocal.m4
|
|
libgomp/testsuite/Makefile.in: libgomp/testsuite/Makefile.am libgomp/aclocal.m4
|
|
libgomp/configure.ac: libgomp/plugin/configfrag.ac
|
|
libgomp/configure: libgomp/configure.ac libgomp/aclocal.m4
|
|
libgomp/config.h.in: libgomp/configure.ac libgomp/aclocal.m4
|
|
libitm/aclocal.m4: libitm/configure.ac libitm/acinclude.m4
|
|
libitm/Makefile.in: libitm/Makefile.am libitm/aclocal.m4
|
|
libitm/testsuite/Makefile.in: libitm/testsuite/Makefile.am libitm/aclocal.m4
|
|
libitm/configure: libitm/configure.ac libitm/aclocal.m4
|
|
libitm/config.h.in: libitm/configure.ac libitm/aclocal.m4
|
|
libatomic/aclocal.m4: libatomic/configure.ac libatomic/acinclude.m4
|
|
libatomic/Makefile.in: libatomic/Makefile.am libatomic/aclocal.m4
|
|
libatomic/testsuite/Makefile.in: libatomic/testsuite/Makefile.am libatomic/aclocal.m4
|
|
libatomic/configure: libatomic/configure.ac libatomic/aclocal.m4
|
|
libatomic/auto-config.h.in: libatomic/configure.ac libatomic/aclocal.m4
|
|
libsanitizer/aclocal.m4: libsanitizer/configure.ac libsanitizer/acinclude.m4
|
|
libsanitizer/Makefile.in: libsanitizer/Makefile.am libsanitizer/aclocal.m4
|
|
libsanitizer/configure: libsanitizer/configure.ac libsanitizer/aclocal.m4
|
|
libsanitizer/asan/Makefile.in: libsanitizer/asan/Makefile.am libsanitizer/aclocal.m4
|
|
libsanitizer/interception/Makefile.in: libsanitizer/interception/Makefile.am libsanitizer/aclocal.m4
|
|
libsanitizer/sanitizer_common/Makefile.in: libsanitizer/sanitizer_common/Makefile.am libsanitizer/aclocal.m4
|
|
libvtv/aclocal.m4: libvtv/configure.ac libvtv/acinclude.m4
|
|
libvtv/Makefile.in: libvtv/Makefile.am libvtv/aclocal.m4
|
|
libvtv/configure: libvtv/configure.ac libvtv/aclocal.m4
|
|
libcilkrts/aclocal.m4: libcilkrts/configure.ac
|
|
libcilkrts/Makefile.in: libcilkrts/Makefile.am
|
|
libcilkrts/configure: libcilkrts/configure.ac
|
|
liboffloadmic/aclocal.m4: liboffloadmic/configure.ac
|
|
liboffloadmic/Makefile.in: liboffloadmic/Makefile.am
|
|
liboffloadmic/configure: liboffloadmic/configure.ac
|
|
liboffloadmic/plugin/aclocal.m4: liboffloadmic/plugin/configure.ac
|
|
liboffloadmic/plugin/Makefile.in: liboffloadmic/plugin/Makefile.am
|
|
liboffloadmic/plugin/configure: liboffloadmic/plugin/configure.ac
|
|
# Top level
|
|
Makefile.in: Makefile.tpl Makefile.def
|
|
configure: configure.ac config/acx.m4
|
|
EOF
|
|
}
|
|
|
|
|
|
# This function touches generated files such that the ``end'' user does
|
|
# not have to rebuild them.
|
|
touch_files () {
|
|
rm -f Makefile.$$
|
|
echo 'all: \' > Makefile.$$
|
|
files_and_dependencies | sed 's, .*, \\,' >> Makefile.$$
|
|
echo '; @true' >> Makefile.$$
|
|
files_and_dependencies | sed 's, ,: ,' >> Makefile.$$
|
|
files_and_dependencies | sed 's, .*, \\,' >> Makefile.$$
|
|
echo ':' >> Makefile.$$
|
|
echo ' @for f in $? $@; do test -f $$f || exit 0; done; \' >> Makefile.$$
|
|
echo ' echo Touching $@...; \' >> Makefile.$$
|
|
chat ' echo Touching $@... 1>&2; \' >> Makefile.$$
|
|
echo ' touch $@' >> Makefile.$$
|
|
files_and_dependencies | sed 's,[^ ]* ,,;s,$, :,' >> Makefile.$$
|
|
|
|
# We would have to explicitly shut off the "Entering... Leaving..."
|
|
# messages through "--no-print-directory" to handle the case when
|
|
# we were called from a recursive invocation (i.e. "$(MAKE)" in a
|
|
# Makefile, not just make). Passing only "-s" doesn't help then,
|
|
# because make has helpfully added "-w" to MAKEFLAGS automatically.
|
|
# Unfortunately we do not require GNU make other than for building
|
|
# and testing, so let's just grep known text explicitly echoed by
|
|
# the rule.
|
|
while ${MAKE-make} -s -f Makefile.$$ all | grep Touching > /dev/null; do
|
|
sleep 1
|
|
done 2>&1
|
|
rm -f Makefile.$$
|
|
}
|
|
|
|
|
|
# Whenever we update the tree or install a patch, we may be modifying
|
|
# this script. By re-execing it, we ensure that the appropriate
|
|
# dependencies and rules will be used.
|
|
touch_files_reexec () {
|
|
chat "Adjusting file timestamps"
|
|
exec ${CONFIG_SHELL-/bin/sh} $self ${silent+"--silent"} --touch
|
|
}
|
|
|
|
# This functions applies a patch to an existing tree.
|
|
apply_patch () {
|
|
if [ -f "$1" ]; then
|
|
echo "Applying patch file $1"
|
|
case $1 in
|
|
*gz)
|
|
gzip -d -c "$1" | patch -p1 ;;
|
|
*bz2)
|
|
bzip2 -d -c "$1" | patch -p1 ;;
|
|
*)
|
|
patch -p1 < "$1";;
|
|
esac
|
|
fi
|
|
touch_files_reexec
|
|
}
|
|
|
|
# Check whether this indeed looks like a local tree.
|
|
if [ ! -f gcc/version.c ]; then
|
|
echo "This does not seem to be a GCC tree!"
|
|
exit
|
|
fi
|
|
|
|
case "$1" in
|
|
--silent)
|
|
silent=t
|
|
shift
|
|
;;
|
|
esac
|
|
|
|
case "$1" in
|
|
# First of all, check whether we are going to process a patch.
|
|
--patch)
|
|
if test "$#" != 2; then
|
|
echo "$1" expects only one argument >&2
|
|
exit 1
|
|
fi
|
|
apply_patch "${2}"
|
|
exit $?
|
|
;;
|
|
|
|
--touch)
|
|
if test "$#" != 1; then
|
|
echo "$1" does not expect any argument >&2
|
|
exit 1
|
|
fi
|
|
touch_files
|
|
exit $?
|
|
;;
|
|
|
|
--list)
|
|
if test "$#" != 1; then
|
|
echo "$1" does not expect any argument >&2
|
|
exit 1
|
|
fi
|
|
files_and_dependencies | sed 's/ /: /'
|
|
exit $?
|
|
;;
|
|
|
|
--help)
|
|
sed -e '1,2d' -e '/^UPDATE_OPTIONS=/{i\
|
|
\
|
|
|
|
p
|
|
}' \
|
|
-e '/^$/,$d' -e 's/#//' -e 's/^ //' < $0
|
|
exit $?
|
|
;;
|
|
|
|
esac
|
|
|
|
# Check for known version control systems.
|
|
if [ -d .git ]; then
|
|
GCC_GIT=${GCC_GIT-${GIT-git}}
|
|
vcs_type="git"
|
|
elif [ -d .hg ]; then
|
|
GCC_HG=${GCC_HG-${HG-hg}}
|
|
vcs_type="hg"
|
|
elif [ -d .svn ]; then
|
|
GCC_SVN=${GCC_SVN-${SVN-svn}}
|
|
vcs_type="svn"
|
|
else
|
|
echo "This does not seem to be a GCC GIT/HG/SVN tree!"
|
|
exit
|
|
fi
|
|
|
|
# Check command-line options
|
|
if [ x"${1}"x = x"--nostdflags"x ]; then
|
|
shift
|
|
else
|
|
set -- $UPDATE_OPTIONS ${1+"$@"}
|
|
fi
|
|
|
|
case $vcs_type in
|
|
git)
|
|
chat "Updating GIT tree"
|
|
|
|
$GCC_GIT diff --quiet --exit-code HEAD
|
|
if [ $? -ne 0 ]; then
|
|
echo "Attempting to update a dirty git tree!" >&2
|
|
echo "Commit or stash your changes first and retry." >&2
|
|
exit 1
|
|
fi
|
|
|
|
$GCC_GIT pull ${silent+-q} --rebase ${1+"$@"}
|
|
if [ $? -ne 0 ]; then
|
|
(touch_files_reexec)
|
|
echo "git pull of full tree failed." >&2
|
|
exit 1
|
|
fi
|
|
|
|
revision=`$GCC_GIT log -n1 --pretty=%p:%t:%H`
|
|
branch=`$GCC_GIT name-rev --name-only HEAD || :`
|
|
;;
|
|
|
|
hg)
|
|
chat "Updating HG tree"
|
|
|
|
# Add -q so untracked files aren't listed.
|
|
if [ `$GCC_HG status -q | wc -l` -gt 0 ]; then
|
|
echo "Attempting to update a dirty hg tree!" >&2
|
|
echo "Commit or revert your changes first and retry." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Check for mq extension. mq patches must be popped so tip has
|
|
# been converted from the SVN tree.
|
|
if [ -d .hg/patches ] && [ `$GCC_HG qapplied | wc -l` -gt 0 ]; then
|
|
# FIXME: Perhaps pop queue instead? We could do that since we
|
|
# know the tree is clean.
|
|
echo "Attempting to update hg tree with mq patches applied!" >&2
|
|
echo "Pop your patches first and retry." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Update tree, but make sure to only pull the default branch.
|
|
# Otherwise all branches in the upstream repo are added, even if
|
|
# only a single one has been cloned.
|
|
$GCC_HG pull ${silent+-q} -r`$GCC_HG branch` ${1+"$@"}
|
|
if [ $? -ne 0 ]; then
|
|
(touch_files_reexec)
|
|
echo "hg pull of full tree failed." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Update tree. Needs to be done separately from pull so
|
|
# gcc_update -rREV works.
|
|
$GCC_HG update ${silent+-q} ${1+"$@"}
|
|
if [ $? -ne 0 ]; then
|
|
(touch_files_reexec)
|
|
echo "hg update of full tree failed." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Extract SVN revision corresponding to parents, as stored by
|
|
# hg convert. Before hg 1.4.3, there's no template keyword
|
|
# corresponding to the extra: tag, so need to use hg log --debug
|
|
# to extract the info.
|
|
parents=`$GCC_HG parents --template '{rev}'`
|
|
convert_revision=`$GCC_HG log --debug -r$parents | \
|
|
sed -ne "/^extra:.*convert_revision=svn:/ {
|
|
s%^[^/]*/%%
|
|
p
|
|
}"`
|
|
revision=`echo $convert_revision | sed -e 's/.*@//'`
|
|
branch=`echo $convert_revision | sed -e 's%branches/%%' -e 's/@.*//'`
|
|
;;
|
|
|
|
svn)
|
|
chat "Updating SVN tree"
|
|
|
|
$GCC_SVN ${silent+-q} --non-interactive update ${1+"$@"}
|
|
if [ $? -ne 0 ]; then
|
|
(touch_files_reexec)
|
|
echo "SVN update of full tree failed." >&2
|
|
exit 1
|
|
fi
|
|
|
|
revision=`$GCC_SVN info | awk '/Revision:/ { print $2 }'`
|
|
branch=`$GCC_SVN info | sed -ne "/^URL:/ {
|
|
s,.*/trunk,trunk,
|
|
s,.*/branches/,,
|
|
s,.*/tags/,,
|
|
p
|
|
}"`
|
|
;;
|
|
esac
|
|
|
|
rm -f LAST_UPDATED gcc/REVISION
|
|
{
|
|
date
|
|
echo "`TZ=UTC date` (revision $revision)"
|
|
} > LAST_UPDATED
|
|
echo "[$branch revision $revision]" > gcc/REVISION
|
|
|
|
touch_files_reexec
|