gcc/contrib/gcc_update
Richard Earnshaw a92ffb3e94 [arm] Replace command-line option .def files with single definition file
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
2017-01-11 14:39:00 +00:00

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