mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-26 21:06:57 +08:00
Merge tree-ssa-20020619-branch into mainline.
From-SVN: r81764
This commit is contained in:
parent
ac1a20aec5
commit
6de9cd9a88
25
ChangeLog
25
ChangeLog
@ -1,3 +1,28 @@
|
||||
2004-05-13 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
Merge from tree-ssa-20020619-branch.
|
||||
|
||||
* Makefile.def: Add libbanshee, libmudflap and libgfortran.
|
||||
* Makefile.tpl (BUILD_CONFIGDIRS): Add libbanshee.
|
||||
(HOST_GMPLIBS): Define.
|
||||
(HOST_GMPINC): Define.
|
||||
(TARGET_LIB_PATH): Add libmudflap.
|
||||
(GFORTRAN_FOR_TARGET): Define.
|
||||
(configure-build*): Export GFORTRAN.
|
||||
(configure-gcc): Export GMPLIBS and GMPINC.
|
||||
(all-gcc): Add maybe-all-libbanshee.
|
||||
(configure-target-libgfortran): Define.
|
||||
* Makefile.in: Regenerate.
|
||||
* configure.in (host_libs): Add libbanshee.
|
||||
(target_libraries): Add target-libmudflap and target-libgfortran.
|
||||
Add --with-libbanshee.
|
||||
Handle --disable-libmudflap.
|
||||
(*-*-freebsd*): Use with_gmp.
|
||||
Add $(libgcj) to noconfigdirs.
|
||||
* configure: Regenerate.
|
||||
* depcomp: New file.
|
||||
* MAINTAINERS: Add tree-ssa maintainers.
|
||||
|
||||
2004-05-04 Vladimir Makarov <vmakarov@redhat.com>
|
||||
|
||||
* MAINTAINERS (Various Maintainers): Add myself.
|
||||
|
110
ChangeLog.tree-ssa
Normal file
110
ChangeLog.tree-ssa
Normal file
@ -0,0 +1,110 @@
|
||||
2004-05-03 Andrew Pinski <pinskia@physics.uc.edu>
|
||||
|
||||
* configure.in (GMP checking): s/save_CFLAGS/saved_CFLAGS.
|
||||
* configure: Regenerate.
|
||||
|
||||
2004-04-22 Loren J. Rittle <ljrittle@acm.org>
|
||||
|
||||
* configure.in (*-*-freebsd*): Use with_gmp to "Avoid crusty gmp.h."
|
||||
* configure: Rebuilt (with autoconf version 2.13).
|
||||
|
||||
2004-04-17 Paul Brook <paul@codesourcery.com>
|
||||
|
||||
* Makefile.tmp (EXTRA_HOST_FLAGS): Remove GMPLIBS and GMPINC.
|
||||
(configure-gcc): Set GMPLIBS and GMPINC.
|
||||
* Makefile.in: Regenerate.
|
||||
|
||||
2004-04-14 Paul Brook <paul@codesourcery.com>
|
||||
|
||||
* Makefile.tmp (HOST_GMPLIBS, HOST_GMPINC): New variables.
|
||||
(EXTRA_HOST_FLAGS): Pass them.
|
||||
* configure.in: Add check for GMP. Disable languages if not found.
|
||||
* Makefile.in, configure: Regenrate.
|
||||
|
||||
2004-03-29 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* configure.in: Set with_libbansshee to yes by default.
|
||||
* configure: Regenerate.
|
||||
|
||||
2004-03-28 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* configure.in: Fix handling of --without-libbanshee.
|
||||
* configure: Regenerate.
|
||||
|
||||
2004-03-26 Nathanael Nerode <neroden@gcc.gnu.org>
|
||||
|
||||
* configure.in: Add support for --without-libbanshee.
|
||||
* configure: Regenerated.
|
||||
|
||||
2004-02-17 Brian Booth <bbooth@redhat.com>
|
||||
|
||||
* MAINTAINERS.tree-ssa: Add self to write after approval.
|
||||
|
||||
2004-02-13 Loren J. Rittle <ljrittle@acm.org>
|
||||
|
||||
* configure.in (*-*-freebsd*): Avoid crusty gmp.h.
|
||||
(alpha*-*-*freebsd*, i[[3456789]]86-*-*freebsd*): Merge into above.
|
||||
* configure: Rebuilt (with autoconf version 2.13).
|
||||
|
||||
2003-10-22 Frank Ch. Eigler <fche@redhat.com>
|
||||
|
||||
* configure.in: Add support for "--disable-libmudflap" option.
|
||||
* configure: Regenerated.
|
||||
|
||||
2003-09-22 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* MAINTAINERS.tree-ssa: Add Andrew MacLeod as global maintainer for
|
||||
the branch.
|
||||
|
||||
2003-08-23 Paul Brook <paul@nowt.org>
|
||||
|
||||
* Makefile.in: Regenerate.
|
||||
|
||||
2003-07-26 Paul Brook <paul@nowt.org>
|
||||
|
||||
* Makefile.def: Add libgfortran and GFORTRAN_FOR_TARGET.
|
||||
* Makefile.tmp: Ditto.
|
||||
* configure.in: Ditto.
|
||||
* depcomp: New file.
|
||||
* maintainer-scripts/gcc_release: Add gcc-fortran.
|
||||
* maintainer-scripts/snapshot-README: Ditto.
|
||||
* maintainer-scripts/snapshot-index.html: Ditto.
|
||||
* libgfortran: New target library.
|
||||
|
||||
2003-06-05 Frank Ch. Eigler <fche@redhat.com>
|
||||
|
||||
* Makefile.in: Regenerated to activate libmudflap builds.
|
||||
|
||||
2003-04-25 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* MAINTAINERS.tree-ssa: New file.
|
||||
|
||||
2003-01-29 Daniel Berlin <dberlin@dberlin.org>
|
||||
|
||||
* configure.in: Use ac_configure_args for libbanshee option
|
||||
* configure: regen.
|
||||
|
||||
2002-11-27 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* Makefile.tpl (all-gcc, all-bootstrap): Add dependency on
|
||||
all-libbanshee.
|
||||
* Makefile.in: Regenerate.
|
||||
|
||||
2002-11-25 Daniel Berlin <dberlin@dberlin.org>
|
||||
|
||||
* Makefile.def: Diego already did the libmudflap moving in a merge,
|
||||
so remove the extra i added.
|
||||
* Makefile.in: Regenerate.
|
||||
|
||||
2002-11-24 Daniel Berlin <dberlin@dberlin.org>
|
||||
|
||||
* configure.in: Add libbanshee related stuff.
|
||||
* Makefile.in: Regenerate from Makefile.def.
|
||||
* Makefile.def: Move libmudflap stuff to here, where it belongs.
|
||||
Add libbanshee stuff.
|
||||
* Makefile.tpl: Add libbanshee stuff.
|
||||
|
||||
2002-08-12 Frank Ch. Eigler <fche@redhat.com>
|
||||
|
||||
* Makefile.in (target-libmudflap): Add libmudflap-related targets.
|
||||
* configure.in (target_libs): Ditto.
|
@ -170,6 +170,11 @@ gcov Nathan Sidwell nathan@codesourcery.com
|
||||
option handling Neil Booth neil@daikokuya.co.uk
|
||||
libffi testsuite Andreas Tobler andreast@gcc.gnu.org
|
||||
middle-end Roger Sayle roger@eyesopen.com
|
||||
tree-ssa Diego Novillo dnovillo@redhat.com
|
||||
tree-ssa Andrew MacLeod amacleod@redhat.com
|
||||
PRE, points-to Daniel Berlin dberlin@dberlin.org
|
||||
mudflap Frank Ch. Eigler fche@redhat.com
|
||||
tree browser/unparser Sebastian Pop s.pop@laposte.net
|
||||
|
||||
Note individuals who maintain parts of the compiler need approval to check
|
||||
in changes outside of the parts of the compiler they maintain.
|
||||
|
@ -25,6 +25,7 @@ AutoGen definitions Makefile.tpl;
|
||||
// that recursive target in its Makefile.
|
||||
|
||||
build_modules= { module= libiberty; };
|
||||
build_modules= { module= libbanshee; };
|
||||
|
||||
host_modules= { module= ash; };
|
||||
host_modules= { module= autoconf; };
|
||||
@ -59,6 +60,7 @@ host_modules= { module= tcl;
|
||||
host_modules= { module= itcl; };
|
||||
host_modules= { module= ld; bootstrap=true; };
|
||||
host_modules= { module= libgui; };
|
||||
host_modules= { module= libbanshee; bootstrap=true; no_install=true; };
|
||||
host_modules= { module= libiberty; bootstrap=true; };
|
||||
host_modules= { module= libtool; };
|
||||
host_modules= { module= m4; };
|
||||
@ -97,8 +99,10 @@ host_modules= { module= libtermcap; no_check=true;
|
||||
host_modules= { module= utils; no_check=true; };
|
||||
|
||||
target_modules = { module= libstdc++-v3; raw_cxx=true; };
|
||||
target_modules = { module= libmudflap; };
|
||||
target_modules = { module= newlib; };
|
||||
target_modules = { module= libf2c; };
|
||||
target_modules = { module= libgfortran; };
|
||||
target_modules = { module= libobjc; };
|
||||
target_modules = { module= libtermcap; no_check=true; stage=true;
|
||||
missing=mostlyclean;
|
||||
@ -202,6 +206,7 @@ flags_to_pass = { flag= CXX_FOR_TARGET ; };
|
||||
flags_to_pass = { flag= CXXFLAGS_FOR_TARGET ; };
|
||||
flags_to_pass = { flag= DLLTOOL_FOR_TARGET ; };
|
||||
flags_to_pass = { flag= GCJ_FOR_TARGET ; };
|
||||
flags_to_pass = { flag= GFORTRAN_FOR_TARGET ; };
|
||||
flags_to_pass = { flag= LD_FOR_TARGET ; };
|
||||
flags_to_pass = { flag= LIBCFLAGS_FOR_TARGET ; };
|
||||
flags_to_pass = { flag= LIBCXXFLAGS_FOR_TARGET ; };
|
||||
|
967
Makefile.in
967
Makefile.in
File diff suppressed because it is too large
Load Diff
18
Makefile.tpl
18
Makefile.tpl
@ -105,7 +105,7 @@ REALLY_SET_LIB_PATH = \
|
||||
$(RPATH_ENVVAR)=`echo "$(HOST_LIB_PATH):$(TARGET_LIB_PATH):$$$(RPATH_ENVVAR)" | sed 's,::*,:,g;s,^:*,,;s,:*$$,,'`; export $(RPATH_ENVVAR);
|
||||
|
||||
# This is the list of directories to be built for the build system.
|
||||
BUILD_CONFIGDIRS = libiberty
|
||||
BUILD_CONFIGDIRS = libiberty libbanshee
|
||||
# Build programs are put under this directory.
|
||||
BUILD_SUBDIR = @build_subdir@
|
||||
# This is set by the configure script to the arguments to use when configuring
|
||||
@ -127,6 +127,10 @@ TARGET_SUBDIR = @target_subdir@
|
||||
# directories built for the target.
|
||||
TARGET_CONFIGARGS = @target_configargs@
|
||||
|
||||
# Where to find GMP
|
||||
HOST_GMPLIBS = @gmplibs@
|
||||
HOST_GMPINC = @gmpinc@
|
||||
|
||||
# ----------------------------------------------
|
||||
# Programs producing files for the BUILD machine
|
||||
# ----------------------------------------------
|
||||
@ -244,7 +248,7 @@ PICFLAG =
|
||||
|
||||
# This is the list of directories that may be needed in RPATH_ENVVAR
|
||||
# so that prorgams built for the target machine work.
|
||||
TARGET_LIB_PATH = $$r/$(TARGET_SUBDIR)/libstdc++-v3/src/.libs:
|
||||
TARGET_LIB_PATH = $$r/$(TARGET_SUBDIR)/libstdc++-v3/src/.libs:$$r/$(TARGET_SUBDIR)/libmudflap/.libs
|
||||
|
||||
FLAGS_FOR_TARGET = @FLAGS_FOR_TARGET@
|
||||
|
||||
@ -311,6 +315,7 @@ USUAL_DLLTOOL_FOR_TARGET = ` \
|
||||
fi`
|
||||
|
||||
GCJ_FOR_TARGET = @GCJ_FOR_TARGET@
|
||||
GFORTRAN_FOR_TARGET = @GFORTRAN_FOR_TARGET@
|
||||
|
||||
LD_FOR_TARGET=@LD_FOR_TARGET@
|
||||
CONFIGURED_LD_FOR_TARGET=@CONFIGURED_LD_FOR_TARGET@
|
||||
@ -705,6 +710,7 @@ configure-build-[+module+]:
|
||||
CXX="$(CXX_FOR_BUILD)"; export CXX; \
|
||||
CXXFLAGS="$(CXXFLAGS_FOR_BUILD)"; export CXXFLAGS; \
|
||||
GCJ="$(GCJ_FOR_BUILD)"; export GCJ; \
|
||||
GFORTRAN="$(GFORTRAN_FOR_BUILD)"; export GFORTRAN; \
|
||||
DLLTOOL="$(DLLTOOL_FOR_BUILD)"; export DLLTOOL; \
|
||||
LD="$(LD_FOR_BUILD)"; export LD; \
|
||||
LDFLAGS="$(LDFLAGS_FOR_BUILD)"; export LDFLAGS; \
|
||||
@ -921,6 +927,7 @@ ELSE normal_cxx +]
|
||||
ENDIF raw_cxx +]
|
||||
CXXFLAGS="$(CXXFLAGS_FOR_TARGET)"; export CXXFLAGS; \
|
||||
GCJ="$(GCJ_FOR_TARGET)"; export GCJ; \
|
||||
GFORTRAN="$(GFORTRAN_FOR_TARGET)"; export GFORTRAN; \
|
||||
DLLTOOL="$(DLLTOOL_FOR_TARGET)"; export DLLTOOL; \
|
||||
LD="$(LD_FOR_TARGET)"; export LD; \
|
||||
LDFLAGS="$(LDFLAGS_FOR_TARGET)"; export LDFLAGS; \
|
||||
@ -1083,6 +1090,8 @@ configure-gcc:
|
||||
WINDRES="$(WINDRES)"; export WINDRES; \
|
||||
OBJCOPY="$(OBJCOPY)"; export OBJCOPY; \
|
||||
OBJDUMP="$(OBJDUMP)"; export OBJDUMP; \
|
||||
GMPLIBS="$(HOST_GMPLIBS)"; export GMPLIBS; \
|
||||
GMPINC="$(HOST_GMPINC)"; export GMPINC; \
|
||||
echo Configuring in gcc; \
|
||||
cd gcc || exit 1; \
|
||||
case $(srcdir) in \
|
||||
@ -1600,10 +1609,10 @@ new-restage3: all-stage2-gcc
|
||||
# GCC needs to identify certain tools.
|
||||
# GCC also needs the information exported by the intl configure script.
|
||||
configure-gcc: maybe-configure-intl maybe-configure-binutils maybe-configure-gas maybe-configure-ld maybe-configure-bison maybe-configure-flex
|
||||
all-gcc: maybe-all-libiberty maybe-all-intl maybe-all-bison maybe-all-byacc maybe-all-binutils maybe-all-gas maybe-all-ld maybe-all-zlib
|
||||
all-gcc: maybe-all-libiberty maybe-all-intl maybe-all-bison maybe-all-byacc maybe-all-binutils maybe-all-gas maybe-all-ld maybe-all-zlib maybe-all-libbanshee
|
||||
# This is a slightly kludgy method of getting dependencies on
|
||||
# all-build-libiberty correct; it would be better to build it every time.
|
||||
all-gcc: maybe-all-build-libiberty
|
||||
all-gcc: maybe-all-build-libiberty maybe-all-libbanshee
|
||||
all-bootstrap: [+ FOR host_modules +][+ IF bootstrap +]maybe-all-[+module+] [+ ENDIF bootstrap +][+ ENDFOR host_modules +]
|
||||
|
||||
# Host modules specific to gdb.
|
||||
@ -1679,6 +1688,7 @@ all-target-fastjar: maybe-all-target-zlib maybe-all-target-libiberty
|
||||
configure-target-libada: $(ALL_GCC_C)
|
||||
configure-target-libf2c: $(ALL_GCC_C)
|
||||
all-target-libf2c: maybe-all-target-libiberty
|
||||
configure-target-libgfortran: $(ALL_GCC_C)
|
||||
configure-target-libffi: $(ALL_GCC_C)
|
||||
configure-target-libjava: $(ALL_GCC_C) maybe-configure-target-zlib maybe-configure-target-boehm-gc maybe-configure-target-qthreads maybe-configure-target-libffi
|
||||
all-target-libjava: maybe-all-fastjar maybe-all-target-zlib maybe-all-target-boehm-gc maybe-all-target-qthreads maybe-all-target-libffi
|
||||
|
334
configure
vendored
334
configure
vendored
@ -11,8 +11,14 @@
|
||||
ac_help=
|
||||
ac_default_prefix=/usr/local
|
||||
# Any additions from configure.in:
|
||||
ac_help="$ac_help
|
||||
--without-libbanshee Don't build with libbanshee"
|
||||
ac_help="$ac_help
|
||||
--enable-libada Builds libada directory"
|
||||
ac_help="$ac_help
|
||||
--with-gmp-dir=PATH Specify source directory for GMP library"
|
||||
ac_help="$ac_help
|
||||
--with-gmp=PATH Specify directory for installed GMP library"
|
||||
ac_help="$ac_help
|
||||
--enable-serial-[{host,target,build}-]configure
|
||||
Force sequential configuration of
|
||||
@ -581,7 +587,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
|
||||
fi
|
||||
|
||||
echo $ac_n "checking host system type""... $ac_c" 1>&6
|
||||
echo "configure:585: checking host system type" >&5
|
||||
echo "configure:591: checking host system type" >&5
|
||||
|
||||
host_alias=$host
|
||||
case "$host_alias" in
|
||||
@ -602,7 +608,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
|
||||
echo "$ac_t""$host" 1>&6
|
||||
|
||||
echo $ac_n "checking target system type""... $ac_c" 1>&6
|
||||
echo "configure:606: checking target system type" >&5
|
||||
echo "configure:612: checking target system type" >&5
|
||||
|
||||
target_alias=$target
|
||||
case "$target_alias" in
|
||||
@ -620,7 +626,7 @@ target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
|
||||
echo "$ac_t""$target" 1>&6
|
||||
|
||||
echo $ac_n "checking build system type""... $ac_c" 1>&6
|
||||
echo "configure:624: checking build system type" >&5
|
||||
echo "configure:630: checking build system type" >&5
|
||||
|
||||
build_alias=$build
|
||||
case "$build_alias" in
|
||||
@ -675,7 +681,7 @@ test "$program_transform_name" = "" && program_transform_name="s,x,x,"
|
||||
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
|
||||
# ./install, which can be erroneously created by make from ./install.sh.
|
||||
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
|
||||
echo "configure:679: checking for a BSD compatible install" >&5
|
||||
echo "configure:685: checking for a BSD compatible install" >&5
|
||||
if test -z "$INSTALL"; then
|
||||
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
@ -880,7 +886,7 @@ fi
|
||||
|
||||
# these libraries are used by various programs built for the host environment
|
||||
#
|
||||
host_libs="intl mmalloc libiberty opcodes bfd readline tcl tk itcl tix libgui zlib"
|
||||
host_libs="intl mmalloc libiberty opcodes bfd readline tcl tk itcl tix libgui zlib libbanshee"
|
||||
|
||||
# these tools are built for the host environment
|
||||
# Note, the powerpc-eabi build depends on sim occurring before gdb in order to
|
||||
@ -903,7 +909,9 @@ target_libraries="target-libiberty \
|
||||
target-libgloss \
|
||||
target-newlib \
|
||||
target-libstdc++-v3 \
|
||||
target-libmudflap \
|
||||
target-libf2c \
|
||||
target-libgfortran \
|
||||
${libgcj} \
|
||||
target-libobjc \
|
||||
target-libada"
|
||||
@ -1082,6 +1090,22 @@ case "${host}" in
|
||||
;;
|
||||
esac
|
||||
|
||||
# Check whether --with-libbanshee or --without-libbanshee was given.
|
||||
if test "${with_libbanshee+set}" = set; then
|
||||
withval="$with_libbanshee"
|
||||
:
|
||||
fi
|
||||
|
||||
case ${with_libbanshee} in
|
||||
no)
|
||||
noconfigdirs="$noconfigdirs libbanshee" ;;
|
||||
yes|"")
|
||||
with_libbanshee=yes
|
||||
;;
|
||||
*)
|
||||
{ echo "configure: error: --with-libbanshee can only be empty, "yes" or "no" (empty defaults to "yes"." 1>&2; exit 1; }
|
||||
esac
|
||||
|
||||
# Check whether --enable-libada or --disable-libada was given.
|
||||
if test "${enable_libada+set}" = set; then
|
||||
enableval="$enable_libada"
|
||||
@ -1110,6 +1134,18 @@ no)
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
# Allow --disable-libmudflap to exclude target-libmudflap
|
||||
case $enable_libmudflap in
|
||||
yes | "")
|
||||
# By default it's enabled
|
||||
;;
|
||||
no)
|
||||
noconfigdirs="$noconfigdirs target-libmudflap"
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
case "${target}" in
|
||||
*-*-chorusos)
|
||||
noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
|
||||
@ -1125,6 +1161,22 @@ case "${target}" in
|
||||
*-*-freebsd[12] | *-*-freebsd[12].* | *-*-freebsd*aout*)
|
||||
noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
|
||||
;;
|
||||
*-*-freebsd* | *-*-kfreebsd*-gnu)
|
||||
noconfigdirs="$noconfigdirs target-newlib target-libgloss"
|
||||
if test "x$with_gmp" = x && test "x$with_gmp_dir" = x \
|
||||
&& test -f /usr/local/include/gmp.h; then
|
||||
with_gmp=/usr/local
|
||||
fi
|
||||
|
||||
# Skip some stuff that's unsupported on some FreeBSD configurations.
|
||||
case "${target}" in
|
||||
i*86-*-*) ;;
|
||||
alpha*-*-*) ;;
|
||||
*)
|
||||
noconfigdirs="$noconfigdirs ${libgcj}"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*-*-kaos*)
|
||||
# Remove unsupported stuff on all kaOS configurations.
|
||||
skipdirs="target-libiberty ${libgcj} target-libstdc++-v3 target-libf2c target-librx"
|
||||
@ -1176,9 +1228,6 @@ case "${target}" in
|
||||
# newlib is not 64 bit ready
|
||||
noconfigdirs="$noconfigdirs target-newlib target-libgloss"
|
||||
;;
|
||||
alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu)
|
||||
noconfigdirs="$noconfigdirs target-newlib target-libgloss"
|
||||
;;
|
||||
alpha*-*-*)
|
||||
# newlib is not 64 bit ready
|
||||
noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
|
||||
@ -1297,9 +1346,6 @@ case "${target}" in
|
||||
i[3456789]86-*-coff | i[3456789]86-*-elf)
|
||||
noconfigdirs="$noconfigdirs ${libgcj}"
|
||||
;;
|
||||
i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu)
|
||||
noconfigdirs="$noconfigdirs target-newlib target-libgloss"
|
||||
;;
|
||||
i[3456789]86-*-linux*)
|
||||
# The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's
|
||||
# not build java stuff by default.
|
||||
@ -1855,7 +1901,7 @@ fi
|
||||
# Extract the first word of "gcc", so it can be a program name with args.
|
||||
set dummy gcc; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:1859: checking for $ac_word" >&5
|
||||
echo "configure:1905: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1885,7 +1931,7 @@ if test -z "$CC"; then
|
||||
# Extract the first word of "cc", so it can be a program name with args.
|
||||
set dummy cc; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:1889: checking for $ac_word" >&5
|
||||
echo "configure:1935: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1936,7 +1982,7 @@ fi
|
||||
# Extract the first word of "cl", so it can be a program name with args.
|
||||
set dummy cl; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:1940: checking for $ac_word" >&5
|
||||
echo "configure:1986: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1968,7 +2014,7 @@ fi
|
||||
fi
|
||||
|
||||
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
|
||||
echo "configure:1972: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
|
||||
echo "configure:2018: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
|
||||
|
||||
ac_ext=c
|
||||
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
|
||||
@ -1979,12 +2025,12 @@ cross_compiling=$ac_cv_prog_cc_cross
|
||||
|
||||
cat > conftest.$ac_ext << EOF
|
||||
|
||||
#line 1983 "configure"
|
||||
#line 2029 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
main(){return(0);}
|
||||
EOF
|
||||
if { (eval echo configure:1988: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
if { (eval echo configure:2034: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
ac_cv_prog_cc_works=yes
|
||||
# If we can't run a trivial program, we are probably using a cross compiler.
|
||||
if (./conftest; exit) 2>/dev/null; then
|
||||
@ -2010,12 +2056,12 @@ if test $ac_cv_prog_cc_works = no; then
|
||||
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
|
||||
fi
|
||||
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
|
||||
echo "configure:2014: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
|
||||
echo "configure:2060: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
|
||||
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
|
||||
cross_compiling=$ac_cv_prog_cc_cross
|
||||
|
||||
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
|
||||
echo "configure:2019: checking whether we are using GNU C" >&5
|
||||
echo "configure:2065: checking whether we are using GNU C" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2024,7 +2070,7 @@ else
|
||||
yes;
|
||||
#endif
|
||||
EOF
|
||||
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2028: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
|
||||
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2074: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
|
||||
ac_cv_prog_gcc=yes
|
||||
else
|
||||
ac_cv_prog_gcc=no
|
||||
@ -2043,7 +2089,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
|
||||
ac_save_CFLAGS="$CFLAGS"
|
||||
CFLAGS=
|
||||
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
|
||||
echo "configure:2047: checking whether ${CC-cc} accepts -g" >&5
|
||||
echo "configure:2093: checking whether ${CC-cc} accepts -g" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2079,7 +2125,7 @@ fi
|
||||
# Extract the first word of "${ac_tool_prefix}gnatbind", so it can be a program name with args.
|
||||
set dummy ${ac_tool_prefix}gnatbind; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:2083: checking for $ac_word" >&5
|
||||
echo "configure:2129: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_GNATBIND'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2111,7 +2157,7 @@ if test -n "$ac_tool_prefix"; then
|
||||
# Extract the first word of "gnatbind", so it can be a program name with args.
|
||||
set dummy gnatbind; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:2115: checking for $ac_word" >&5
|
||||
echo "configure:2161: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_GNATBIND'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2144,7 +2190,7 @@ fi
|
||||
fi
|
||||
|
||||
echo $ac_n "checking whether compiler driver understands Ada""... $ac_c" 1>&6
|
||||
echo "configure:2148: checking whether compiler driver understands Ada" >&5
|
||||
echo "configure:2194: checking whether compiler driver understands Ada" >&5
|
||||
if eval "test \"`echo '$''{'acx_cv_cc_gcc_supports_ada'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2177,7 +2223,7 @@ else
|
||||
fi
|
||||
|
||||
echo $ac_n "checking how to compare bootstrapped objects""... $ac_c" 1>&6
|
||||
echo "configure:2181: checking how to compare bootstrapped objects" >&5
|
||||
echo "configure:2227: checking how to compare bootstrapped objects" >&5
|
||||
if eval "test \"`echo '$''{'gcc_cv_prog_cmp_skip'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2207,6 +2253,104 @@ do_compare="$gcc_cv_prog_cmp_skip"
|
||||
|
||||
|
||||
|
||||
# Check for GMP
|
||||
gmplibs=
|
||||
gmpinc=
|
||||
have_gmp=yes
|
||||
# Specify a location for gmp
|
||||
# Check whether --with-gmp-dir or --without-gmp-dir was given.
|
||||
if test "${with_gmp_dir+set}" = set; then
|
||||
withval="$with_gmp_dir"
|
||||
:
|
||||
fi
|
||||
|
||||
|
||||
if test "x$with_gmp_dir" != x && test -f "$with_gmp_dir/gmp.h"; then
|
||||
gmpinc="-I$with_gmp_dir"
|
||||
if test -f "$with_gmp_dir/.libs/libgmp.a"; then
|
||||
gmplibs="$with_gmp_dir/.libs/libgmp.a"
|
||||
elif test -f "$with_gmp_dir/_libs/libgmp.a"; then
|
||||
gmplibs="$with_gmp_dir/_libs/libgmp.a"
|
||||
fi
|
||||
# One of the later tests will catch the error if neither library is present.
|
||||
fi
|
||||
|
||||
# Check whether --with-gmp or --without-gmp was given.
|
||||
if test "${with_gmp+set}" = set; then
|
||||
withval="$with_gmp"
|
||||
:
|
||||
fi
|
||||
|
||||
|
||||
if test "x$with_gmp" != x && test -d "$with_gmp"; then
|
||||
gmplibs="-L$with_gmp/lib -lgmp"
|
||||
gmpinc="-I$with_gmp/include"
|
||||
fi
|
||||
|
||||
# Use system gmp if nothing else specified
|
||||
if test "x$gmplibs" = x; then
|
||||
gmplibs="-lgmp"
|
||||
fi
|
||||
|
||||
saved_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS $gmpinc"
|
||||
# Check GMP actually works
|
||||
echo $ac_n "checking for correct version of gmp.h""... $ac_c" 1>&6
|
||||
echo "configure:2300: checking for correct version of gmp.h" >&5
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 2302 "configure"
|
||||
#include "confdefs.h"
|
||||
#include "gmp.h"
|
||||
int main() {
|
||||
|
||||
#if __GNU_MP_VERSION < 3
|
||||
choke me
|
||||
#endif
|
||||
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:2313: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
rm -rf conftest*
|
||||
echo "$ac_t""yes" 1>&6
|
||||
else
|
||||
echo "configure: failed program was:" >&5
|
||||
cat conftest.$ac_ext >&5
|
||||
rm -rf conftest*
|
||||
echo "$ac_t""no" 1>&6; have_gmp=no
|
||||
fi
|
||||
rm -f conftest*
|
||||
|
||||
if test x"$have_gmp" = xyes; then
|
||||
echo $ac_n "checking for mpf_init in -lgmp""... $ac_c" 1>&6
|
||||
echo "configure:2326: checking for mpf_init in -lgmp" >&5
|
||||
|
||||
saved_LIBS="$LIBS"
|
||||
LIBS="$LIBS $gmplibs"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 2331 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <gmp.h>
|
||||
int main() {
|
||||
mpf_t n; mpf_init(n);
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:2338: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
||||
rm -rf conftest*
|
||||
echo "$ac_t""yes" 1>&6
|
||||
else
|
||||
echo "configure: failed program was:" >&5
|
||||
cat conftest.$ac_ext >&5
|
||||
rm -rf conftest*
|
||||
echo "$ac_t""no" 1>&6; have_gmp=no
|
||||
fi
|
||||
rm -f conftest*
|
||||
LIBS="$saved_LIBS"
|
||||
CFLAGS="$saved_CFLAGS"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
# By default, C is the only stage 1 language.
|
||||
stage1_languages=c
|
||||
|
||||
@ -2279,6 +2423,7 @@ if test -d ${srcdir}/gcc; then
|
||||
lang_dirs=
|
||||
boot_language=
|
||||
build_by_default=
|
||||
need_gmp=
|
||||
. ${lang_frag}
|
||||
# This is quite sensitive to the ordering of the case statement arms.
|
||||
case ,${enable_languages},:${language}:${have_gnat}:${build_by_default} in
|
||||
@ -2307,7 +2452,13 @@ if test -d ${srcdir}/gcc; then
|
||||
add_this_lang=no
|
||||
;;
|
||||
esac
|
||||
case $add_this_lang in
|
||||
|
||||
# Disable language that need GMP if it isn't available.
|
||||
if test x"$need_gmp" = xyes && test x"$have_gmp" = xno; then
|
||||
add_this_lang=no
|
||||
fi
|
||||
|
||||
case $add_this_lang in
|
||||
no)
|
||||
# Remove language-dependent dirs.
|
||||
eval noconfigdirs='"$noconfigdirs "'\"$target_libs $lang_dirs\"
|
||||
@ -2608,6 +2759,9 @@ if test x${with_newlib} != xno && echo " ${target_configdirs} " | grep " target-
|
||||
extra_host_args="$extra_host_args --with-newlib"
|
||||
fi
|
||||
|
||||
if test x${with_libbanshee} = xyes && echo " ${configdirs} " | grep " libbanshee " >/dev/null 2>&1; then
|
||||
extra_host_args="$extra_host_args --with-libbanshee"
|
||||
fi
|
||||
|
||||
# Default to using --with-stabs for certain targets.
|
||||
if test x${with_stabs} = x ; then
|
||||
@ -2642,7 +2796,7 @@ do
|
||||
# Extract the first word of "$ac_prog", so it can be a program name with args.
|
||||
set dummy $ac_prog; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:2646: checking for $ac_word" >&5
|
||||
echo "configure:2800: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_DEFAULT_YACC'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2677,7 +2831,7 @@ do
|
||||
# Extract the first word of "$ac_prog", so it can be a program name with args.
|
||||
set dummy $ac_prog; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:2681: checking for $ac_word" >&5
|
||||
echo "configure:2835: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_DEFAULT_M4'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2712,7 +2866,7 @@ do
|
||||
# Extract the first word of "$ac_prog", so it can be a program name with args.
|
||||
set dummy $ac_prog; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:2716: checking for $ac_word" >&5
|
||||
echo "configure:2870: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_DEFAULT_LEX'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3175,6 +3329,20 @@ else
|
||||
fi
|
||||
GCJ_FOR_TARGET=$GCJ_FOR_TARGET' $(FLAGS_FOR_TARGET)'
|
||||
|
||||
if test "x${GFORTRAN_FOR_TARGET+set}" = xset; then
|
||||
:
|
||||
elif test -d ${srcdir}/gcc; then
|
||||
GFORTRAN_FOR_TARGET='$$r/gcc/gfortran -B$$r/gcc/'
|
||||
elif test "$host" = "$target"; then
|
||||
GFORTRAN_FOR_TARGET='gfortran'
|
||||
else
|
||||
GFORTRAN_FOR_TARGET=`echo gfortran | sed -e 's/x/x/' ${program_transform_name}`
|
||||
fi
|
||||
case $GFORTRAN_FOR_TARGET in
|
||||
*' $(FLAGS_FOR_TARGET)') ;;
|
||||
*) GFORTRAN_FOR_TARGET=$GFORTRAN_FOR_TARGET' $(FLAGS_FOR_TARGET)' ;;
|
||||
esac
|
||||
|
||||
# Don't use libstdc++-v3's flags to configure/build itself.
|
||||
libstdcxx_flags='`test ! -f $$r/$(TARGET_SUBDIR)/libstdc++-v3/scripts/testsuite_flags || $(SHELL) $$r/$(TARGET_SUBDIR)/libstdc++-v3/scripts/testsuite_flags --build-includes` -L$$r/$(TARGET_SUBDIR)/libstdc++-v3/src -L$$r/$(TARGET_SUBDIR)/libstdc++-v3/src/.libs'
|
||||
raw_libstdcxx_flags='-L$$r/$(TARGET_SUBDIR)/libstdc++-v3/src -L$$r/$(TARGET_SUBDIR)/libstdc++-v3/src/.libs'
|
||||
@ -3216,6 +3384,7 @@ qqRAW_CXX_FOR_TARGET=`echo "$qRAW_CXX_FOR_TARGET" | sed -e 's,[$][$],$$$$,g'`
|
||||
# Wrap CC_FOR_TARGET and friends, for certain types of builds.
|
||||
CC_FOR_TARGET="\$(STAGE_CC_WRAPPER) ${CC_FOR_TARGET}"
|
||||
GCJ_FOR_TARGET="\$(STAGE_CC_WRAPPER) ${GCJ_FOR_TARGET}"
|
||||
GFORTRAN_FOR_TARGET="\$(STAGE_CC_WRAPPER) ${GFORTRAN_FOR_TARGET}"
|
||||
CXX_FOR_TARGET="\$(STAGE_CC_WRAPPER) ${qCXX_FOR_TARGET}"
|
||||
RAW_CXX_FOR_TARGET="\$(STAGE_CC_WRAPPER) ${qRAW_CXX_FOR_TARGET}"
|
||||
CXX_FOR_TARGET_FOR_RECURSIVE_MAKE="\$(STAGE_CC_WRAPPER) ${qqCXX_FOR_TARGET}"
|
||||
@ -3275,7 +3444,7 @@ test -n "$target_alias" && ncn_target_tool_prefix=$target_alias-
|
||||
# Extract the first word of "${ncn_tool_prefix}ar", so it can be a program name with args.
|
||||
set dummy ${ncn_tool_prefix}ar; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3279: checking for $ac_word" >&5
|
||||
echo "configure:3448: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3308,7 +3477,7 @@ if test -z "$ac_cv_prog_AR" ; then
|
||||
# Extract the first word of "ar", so it can be a program name with args.
|
||||
set dummy ar; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3312: checking for $ac_word" >&5
|
||||
echo "configure:3481: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_AR'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3347,7 +3516,7 @@ fi
|
||||
# Extract the first word of "${ncn_tool_prefix}as", so it can be a program name with args.
|
||||
set dummy ${ncn_tool_prefix}as; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3351: checking for $ac_word" >&5
|
||||
echo "configure:3520: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3380,7 +3549,7 @@ if test -z "$ac_cv_prog_AS" ; then
|
||||
# Extract the first word of "as", so it can be a program name with args.
|
||||
set dummy as; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3384: checking for $ac_word" >&5
|
||||
echo "configure:3553: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_AS'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3419,7 +3588,7 @@ fi
|
||||
# Extract the first word of "${ncn_tool_prefix}dlltool", so it can be a program name with args.
|
||||
set dummy ${ncn_tool_prefix}dlltool; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3423: checking for $ac_word" >&5
|
||||
echo "configure:3592: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3452,7 +3621,7 @@ if test -z "$ac_cv_prog_DLLTOOL" ; then
|
||||
# Extract the first word of "dlltool", so it can be a program name with args.
|
||||
set dummy dlltool; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3456: checking for $ac_word" >&5
|
||||
echo "configure:3625: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_DLLTOOL'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3491,7 +3660,7 @@ fi
|
||||
# Extract the first word of "${ncn_tool_prefix}ld", so it can be a program name with args.
|
||||
set dummy ${ncn_tool_prefix}ld; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3495: checking for $ac_word" >&5
|
||||
echo "configure:3664: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3524,7 +3693,7 @@ if test -z "$ac_cv_prog_LD" ; then
|
||||
# Extract the first word of "ld", so it can be a program name with args.
|
||||
set dummy ld; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3528: checking for $ac_word" >&5
|
||||
echo "configure:3697: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_LD'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3563,7 +3732,7 @@ fi
|
||||
# Extract the first word of "${ncn_tool_prefix}nm", so it can be a program name with args.
|
||||
set dummy ${ncn_tool_prefix}nm; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3567: checking for $ac_word" >&5
|
||||
echo "configure:3736: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_NM'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3596,7 +3765,7 @@ if test -z "$ac_cv_prog_NM" ; then
|
||||
# Extract the first word of "nm", so it can be a program name with args.
|
||||
set dummy nm; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3600: checking for $ac_word" >&5
|
||||
echo "configure:3769: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_NM'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3635,7 +3804,7 @@ fi
|
||||
# Extract the first word of "${ncn_tool_prefix}ranlib", so it can be a program name with args.
|
||||
set dummy ${ncn_tool_prefix}ranlib; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3639: checking for $ac_word" >&5
|
||||
echo "configure:3808: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3668,7 +3837,7 @@ if test -z "$ac_cv_prog_RANLIB" ; then
|
||||
# Extract the first word of "ranlib", so it can be a program name with args.
|
||||
set dummy ranlib; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3672: checking for $ac_word" >&5
|
||||
echo "configure:3841: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_RANLIB'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3707,7 +3876,7 @@ fi
|
||||
# Extract the first word of "${ncn_tool_prefix}windres", so it can be a program name with args.
|
||||
set dummy ${ncn_tool_prefix}windres; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3711: checking for $ac_word" >&5
|
||||
echo "configure:3880: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3740,7 +3909,7 @@ if test -z "$ac_cv_prog_WINDRES" ; then
|
||||
# Extract the first word of "windres", so it can be a program name with args.
|
||||
set dummy windres; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3744: checking for $ac_word" >&5
|
||||
echo "configure:3913: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_WINDRES'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3779,7 +3948,7 @@ fi
|
||||
# Extract the first word of "${ncn_tool_prefix}objcopy", so it can be a program name with args.
|
||||
set dummy ${ncn_tool_prefix}objcopy; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3783: checking for $ac_word" >&5
|
||||
echo "configure:3952: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_OBJCOPY'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3812,7 +3981,7 @@ if test -z "$ac_cv_prog_OBJCOPY" ; then
|
||||
# Extract the first word of "objcopy", so it can be a program name with args.
|
||||
set dummy objcopy; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3816: checking for $ac_word" >&5
|
||||
echo "configure:3985: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_OBJCOPY'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3851,7 +4020,7 @@ fi
|
||||
# Extract the first word of "${ncn_tool_prefix}objdump", so it can be a program name with args.
|
||||
set dummy ${ncn_tool_prefix}objdump; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3855: checking for $ac_word" >&5
|
||||
echo "configure:4024: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_OBJDUMP'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3884,7 +4053,7 @@ if test -z "$ac_cv_prog_OBJDUMP" ; then
|
||||
# Extract the first word of "objdump", so it can be a program name with args.
|
||||
set dummy objdump; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3888: checking for $ac_word" >&5
|
||||
echo "configure:4057: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_OBJDUMP'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3933,7 +4102,7 @@ fi
|
||||
# Extract the first word of "${ncn_target_tool_prefix}ar", so it can be a program name with args.
|
||||
set dummy ${ncn_target_tool_prefix}ar; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3937: checking for $ac_word" >&5
|
||||
echo "configure:4106: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_AR_FOR_TARGET'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -3966,7 +4135,7 @@ if test -z "$ac_cv_prog_CONFIGURED_AR_FOR_TARGET" ; then
|
||||
# Extract the first word of "ar", so it can be a program name with args.
|
||||
set dummy ar; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:3970: checking for $ac_word" >&5
|
||||
echo "configure:4139: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_AR_FOR_TARGET'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -4005,7 +4174,7 @@ fi
|
||||
# Extract the first word of "${ncn_target_tool_prefix}as", so it can be a program name with args.
|
||||
set dummy ${ncn_target_tool_prefix}as; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:4009: checking for $ac_word" >&5
|
||||
echo "configure:4178: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_AS_FOR_TARGET'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -4038,7 +4207,7 @@ if test -z "$ac_cv_prog_CONFIGURED_AS_FOR_TARGET" ; then
|
||||
# Extract the first word of "as", so it can be a program name with args.
|
||||
set dummy as; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:4042: checking for $ac_word" >&5
|
||||
echo "configure:4211: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_AS_FOR_TARGET'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -4077,7 +4246,7 @@ fi
|
||||
# Extract the first word of "${ncn_target_tool_prefix}dlltool", so it can be a program name with args.
|
||||
set dummy ${ncn_target_tool_prefix}dlltool; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:4081: checking for $ac_word" >&5
|
||||
echo "configure:4250: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_DLLTOOL_FOR_TARGET'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -4110,7 +4279,7 @@ if test -z "$ac_cv_prog_CONFIGURED_DLLTOOL_FOR_TARGET" ; then
|
||||
# Extract the first word of "dlltool", so it can be a program name with args.
|
||||
set dummy dlltool; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:4114: checking for $ac_word" >&5
|
||||
echo "configure:4283: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_DLLTOOL_FOR_TARGET'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -4149,7 +4318,7 @@ fi
|
||||
# Extract the first word of "${ncn_target_tool_prefix}ld", so it can be a program name with args.
|
||||
set dummy ${ncn_target_tool_prefix}ld; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:4153: checking for $ac_word" >&5
|
||||
echo "configure:4322: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_LD_FOR_TARGET'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -4182,7 +4351,7 @@ if test -z "$ac_cv_prog_CONFIGURED_LD_FOR_TARGET" ; then
|
||||
# Extract the first word of "ld", so it can be a program name with args.
|
||||
set dummy ld; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:4186: checking for $ac_word" >&5
|
||||
echo "configure:4355: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_LD_FOR_TARGET'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -4221,7 +4390,7 @@ fi
|
||||
# Extract the first word of "${ncn_target_tool_prefix}nm", so it can be a program name with args.
|
||||
set dummy ${ncn_target_tool_prefix}nm; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:4225: checking for $ac_word" >&5
|
||||
echo "configure:4394: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_NM_FOR_TARGET'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -4254,7 +4423,7 @@ if test -z "$ac_cv_prog_CONFIGURED_NM_FOR_TARGET" ; then
|
||||
# Extract the first word of "nm", so it can be a program name with args.
|
||||
set dummy nm; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:4258: checking for $ac_word" >&5
|
||||
echo "configure:4427: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_NM_FOR_TARGET'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -4293,7 +4462,7 @@ fi
|
||||
# Extract the first word of "${ncn_target_tool_prefix}ranlib", so it can be a program name with args.
|
||||
set dummy ${ncn_target_tool_prefix}ranlib; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:4297: checking for $ac_word" >&5
|
||||
echo "configure:4466: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_RANLIB_FOR_TARGET'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -4326,7 +4495,7 @@ if test -z "$ac_cv_prog_CONFIGURED_RANLIB_FOR_TARGET" ; then
|
||||
# Extract the first word of "ranlib", so it can be a program name with args.
|
||||
set dummy ranlib; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:4330: checking for $ac_word" >&5
|
||||
echo "configure:4499: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_RANLIB_FOR_TARGET'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -4365,7 +4534,7 @@ fi
|
||||
# Extract the first word of "${ncn_target_tool_prefix}windres", so it can be a program name with args.
|
||||
set dummy ${ncn_target_tool_prefix}windres; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:4369: checking for $ac_word" >&5
|
||||
echo "configure:4538: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_WINDRES_FOR_TARGET'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -4398,7 +4567,7 @@ if test -z "$ac_cv_prog_CONFIGURED_WINDRES_FOR_TARGET" ; then
|
||||
# Extract the first word of "windres", so it can be a program name with args.
|
||||
set dummy windres; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:4402: checking for $ac_word" >&5
|
||||
echo "configure:4571: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_WINDRES_FOR_TARGET'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -4443,6 +4612,7 @@ fi
|
||||
|
||||
|
||||
|
||||
|
||||
# Fix up target tools.
|
||||
if test "x${build}" = "x${host}" ; then
|
||||
# In this case, the newly built tools can and should be used,
|
||||
@ -4482,7 +4652,7 @@ RANLIB_FOR_TARGET=${RANLIB_FOR_TARGET}${extra_ranlibflags_for_target}
|
||||
NM_FOR_TARGET=${NM_FOR_TARGET}${extra_nmflags_for_target}
|
||||
|
||||
echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
|
||||
echo "configure:4486: checking whether to enable maintainer-specific portions of Makefiles" >&5
|
||||
echo "configure:4656: checking whether to enable maintainer-specific portions of Makefiles" >&5
|
||||
# Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
|
||||
if test "${enable_maintainer_mode+set}" = set; then
|
||||
enableval="$enable_maintainer_mode"
|
||||
@ -4607,15 +4777,34 @@ trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
|
||||
# Transform confdefs.h into DEFS.
|
||||
# Protect against shell expansion while executing Makefile rules.
|
||||
# Protect against Makefile macro expansion.
|
||||
cat > conftest.defs <<\EOF
|
||||
s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
|
||||
s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
|
||||
s%\[%\\&%g
|
||||
s%\]%\\&%g
|
||||
s%\$%$$%g
|
||||
EOF
|
||||
DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
|
||||
rm -f conftest.defs
|
||||
#
|
||||
# If the first sed substitution is executed (which looks for macros that
|
||||
# take arguments), then we branch to the quote section. Otherwise,
|
||||
# look for a macro that doesn't take arguments.
|
||||
cat >confdef2opt.sed <<\_ACEOF
|
||||
t clear
|
||||
: clear
|
||||
s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g
|
||||
t quote
|
||||
s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g
|
||||
t quote
|
||||
d
|
||||
: quote
|
||||
s,[ `~#$^&*(){}\\|;'"<>?],\\&,g
|
||||
s,\[,\\&,g
|
||||
s,\],\\&,g
|
||||
s,\$,$$,g
|
||||
p
|
||||
_ACEOF
|
||||
# We use echo to avoid assuming a particular line-breaking character.
|
||||
# The extra dot is to prevent the shell from consuming trailing
|
||||
# line-breaks from the sub-command output. A line-break within
|
||||
# single-quotes doesn't work because, if this script is created in a
|
||||
# platform that uses two characters for line-breaks (e.g., DOS), tr
|
||||
# would break.
|
||||
ac_LF_and_DOT=`echo; echo .`
|
||||
DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'`
|
||||
rm -f confdef2opt.sed
|
||||
|
||||
|
||||
# Without the "./", some shells look in PATH for config.status.
|
||||
@ -4711,6 +4900,8 @@ s%@target_subdir@%$target_subdir%g
|
||||
s%@CC@%$CC%g
|
||||
s%@GNATBIND@%$GNATBIND%g
|
||||
s%@do_compare@%$do_compare%g
|
||||
s%@gmplibs@%$gmplibs%g
|
||||
s%@gmpinc@%$gmpinc%g
|
||||
s%@stage1_languages@%$stage1_languages%g
|
||||
s%@DEFAULT_YACC@%$DEFAULT_YACC%g
|
||||
s%@DEFAULT_M4@%$DEFAULT_M4%g
|
||||
@ -4789,6 +4980,7 @@ s%@GCC_FOR_TARGET@%$GCC_FOR_TARGET%g
|
||||
s%@FLAGS_FOR_TARGET@%$FLAGS_FOR_TARGET%g
|
||||
s%@CC_FOR_TARGET@%$CC_FOR_TARGET%g
|
||||
s%@GCJ_FOR_TARGET@%$GCJ_FOR_TARGET%g
|
||||
s%@GFORTRAN_FOR_TARGET@%$GFORTRAN_FOR_TARGET%g
|
||||
s%@CXX_FOR_TARGET@%$CXX_FOR_TARGET%g
|
||||
s%@RAW_CXX_FOR_TARGET@%$RAW_CXX_FOR_TARGET%g
|
||||
s%@CXX_FOR_TARGET_FOR_RECURSIVE_MAKE@%$CXX_FOR_TARGET_FOR_RECURSIVE_MAKE%g
|
||||
|
132
configure.in
132
configure.in
@ -126,7 +126,7 @@ fi
|
||||
|
||||
# these libraries are used by various programs built for the host environment
|
||||
#
|
||||
host_libs="intl mmalloc libiberty opcodes bfd readline tcl tk itcl tix libgui zlib"
|
||||
host_libs="intl mmalloc libiberty opcodes bfd readline tcl tk itcl tix libgui zlib libbanshee"
|
||||
|
||||
# these tools are built for the host environment
|
||||
# Note, the powerpc-eabi build depends on sim occurring before gdb in order to
|
||||
@ -149,7 +149,9 @@ target_libraries="target-libiberty \
|
||||
target-libgloss \
|
||||
target-newlib \
|
||||
target-libstdc++-v3 \
|
||||
target-libmudflap \
|
||||
target-libf2c \
|
||||
target-libgfortran \
|
||||
${libgcj} \
|
||||
target-libobjc \
|
||||
target-libada"
|
||||
@ -307,6 +309,18 @@ case "${host}" in
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_ARG_WITH(libbanshee,
|
||||
[ --without-libbanshee Don't build with libbanshee])
|
||||
case ${with_libbanshee} in
|
||||
no)
|
||||
noconfigdirs="$noconfigdirs libbanshee" ;;
|
||||
yes|"")
|
||||
with_libbanshee=yes
|
||||
;;
|
||||
*)
|
||||
AC_MSG_ERROR([--with-libbanshee can only be empty, "yes" or "no" (empty defaults to "yes".])
|
||||
esac
|
||||
|
||||
AC_ARG_ENABLE(libada,
|
||||
[ --enable-libada Builds libada directory],
|
||||
ENABLE_LIBADA=$enableval,
|
||||
@ -331,6 +345,18 @@ no)
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
# Allow --disable-libmudflap to exclude target-libmudflap
|
||||
case $enable_libmudflap in
|
||||
yes | "")
|
||||
# By default it's enabled
|
||||
;;
|
||||
no)
|
||||
noconfigdirs="$noconfigdirs target-libmudflap"
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
case "${target}" in
|
||||
*-*-chorusos)
|
||||
noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
|
||||
@ -346,6 +372,22 @@ case "${target}" in
|
||||
*-*-freebsd[[12]] | *-*-freebsd[[12]].* | *-*-freebsd*aout*)
|
||||
noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
|
||||
;;
|
||||
*-*-freebsd* | *-*-kfreebsd*-gnu)
|
||||
noconfigdirs="$noconfigdirs target-newlib target-libgloss"
|
||||
if test "x$with_gmp" = x && test "x$with_gmp_dir" = x \
|
||||
&& test -f /usr/local/include/gmp.h; then
|
||||
with_gmp=/usr/local
|
||||
fi
|
||||
|
||||
# Skip some stuff that's unsupported on some FreeBSD configurations.
|
||||
case "${target}" in
|
||||
i*86-*-*) ;;
|
||||
alpha*-*-*) ;;
|
||||
*)
|
||||
noconfigdirs="$noconfigdirs ${libgcj}"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*-*-kaos*)
|
||||
# Remove unsupported stuff on all kaOS configurations.
|
||||
skipdirs="target-libiberty ${libgcj} target-libstdc++-v3 target-libf2c target-librx"
|
||||
@ -397,9 +439,6 @@ case "${target}" in
|
||||
# newlib is not 64 bit ready
|
||||
noconfigdirs="$noconfigdirs target-newlib target-libgloss"
|
||||
;;
|
||||
alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu)
|
||||
noconfigdirs="$noconfigdirs target-newlib target-libgloss"
|
||||
;;
|
||||
alpha*-*-*)
|
||||
# newlib is not 64 bit ready
|
||||
noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
|
||||
@ -518,9 +557,6 @@ case "${target}" in
|
||||
i[[3456789]]86-*-coff | i[[3456789]]86-*-elf)
|
||||
noconfigdirs="$noconfigdirs ${libgcj}"
|
||||
;;
|
||||
i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu)
|
||||
noconfigdirs="$noconfigdirs target-newlib target-libgloss"
|
||||
;;
|
||||
i[[3456789]]86-*-linux*)
|
||||
# The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's
|
||||
# not build java stuff by default.
|
||||
@ -1070,6 +1106,60 @@ fi
|
||||
ACX_PROG_GNAT
|
||||
ACX_PROG_CMP_IGNORE_INITIAL
|
||||
|
||||
# Check for GMP
|
||||
gmplibs=
|
||||
gmpinc=
|
||||
have_gmp=yes
|
||||
# Specify a location for gmp
|
||||
AC_ARG_WITH(gmp-dir, [ --with-gmp-dir=PATH Specify source directory for GMP library])
|
||||
|
||||
if test "x$with_gmp_dir" != x && test -f "$with_gmp_dir/gmp.h"; then
|
||||
gmpinc="-I$with_gmp_dir"
|
||||
if test -f "$with_gmp_dir/.libs/libgmp.a"; then
|
||||
gmplibs="$with_gmp_dir/.libs/libgmp.a"
|
||||
elif test -f "$with_gmp_dir/_libs/libgmp.a"; then
|
||||
gmplibs="$with_gmp_dir/_libs/libgmp.a"
|
||||
fi
|
||||
# One of the later tests will catch the error if neither library is present.
|
||||
fi
|
||||
|
||||
AC_ARG_WITH(gmp, [ --with-gmp=PATH Specify directory for installed GMP library])
|
||||
|
||||
if test "x$with_gmp" != x && test -d "$with_gmp"; then
|
||||
gmplibs="-L$with_gmp/lib -lgmp"
|
||||
gmpinc="-I$with_gmp/include"
|
||||
fi
|
||||
|
||||
# Use system gmp if nothing else specified
|
||||
if test "x$gmplibs" = x; then
|
||||
gmplibs="-lgmp"
|
||||
fi
|
||||
|
||||
saved_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS $gmpinc"
|
||||
# Check GMP actually works
|
||||
AC_MSG_CHECKING([for correct version of gmp.h])
|
||||
AC_TRY_COMPILE([#include "gmp.h"],[
|
||||
#if __GNU_MP_VERSION < 3
|
||||
choke me
|
||||
#endif
|
||||
], [AC_MSG_RESULT([yes])],
|
||||
[AC_MSG_RESULT([no]); have_gmp=no])
|
||||
|
||||
if test x"$have_gmp" = xyes; then
|
||||
AC_MSG_CHECKING([for mpf_init in -lgmp])
|
||||
|
||||
saved_LIBS="$LIBS"
|
||||
LIBS="$LIBS $gmplibs"
|
||||
AC_TRY_LINK([#include <gmp.h>], [mpf_t n; mpf_init(n);],
|
||||
[AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]); have_gmp=no])
|
||||
LIBS="$saved_LIBS"
|
||||
CFLAGS="$saved_CFLAGS"
|
||||
fi
|
||||
|
||||
AC_SUBST(gmplibs)
|
||||
AC_SUBST(gmpinc)
|
||||
|
||||
# By default, C is the only stage 1 language.
|
||||
stage1_languages=c
|
||||
AC_SUBST(stage1_languages)
|
||||
@ -1142,6 +1232,7 @@ if test -d ${srcdir}/gcc; then
|
||||
lang_dirs=
|
||||
boot_language=
|
||||
build_by_default=
|
||||
need_gmp=
|
||||
. ${lang_frag}
|
||||
# This is quite sensitive to the ordering of the case statement arms.
|
||||
case ,${enable_languages},:${language}:${have_gnat}:${build_by_default} in
|
||||
@ -1170,7 +1261,13 @@ if test -d ${srcdir}/gcc; then
|
||||
add_this_lang=no
|
||||
;;
|
||||
esac
|
||||
case $add_this_lang in
|
||||
|
||||
# Disable language that need GMP if it isn't available.
|
||||
if test x"$need_gmp" = xyes && test x"$have_gmp" = xno; then
|
||||
add_this_lang=no
|
||||
fi
|
||||
|
||||
case $add_this_lang in
|
||||
no)
|
||||
# Remove language-dependent dirs.
|
||||
eval noconfigdirs='"$noconfigdirs "'\"$target_libs $lang_dirs\"
|
||||
@ -1471,6 +1568,9 @@ if test x${with_newlib} != xno && echo " ${target_configdirs} " | grep " target-
|
||||
extra_host_args="$extra_host_args --with-newlib"
|
||||
fi
|
||||
|
||||
if test x${with_libbanshee} = xyes && echo " ${configdirs} " | grep " libbanshee " >/dev/null 2>&1; then
|
||||
extra_host_args="$extra_host_args --with-libbanshee"
|
||||
fi
|
||||
|
||||
# Default to using --with-stabs for certain targets.
|
||||
if test x${with_stabs} = x ; then
|
||||
@ -1935,6 +2035,20 @@ else
|
||||
fi
|
||||
GCJ_FOR_TARGET=$GCJ_FOR_TARGET' $(FLAGS_FOR_TARGET)'
|
||||
|
||||
if test "x${GFORTRAN_FOR_TARGET+set}" = xset; then
|
||||
:
|
||||
elif test -d ${srcdir}/gcc; then
|
||||
GFORTRAN_FOR_TARGET='$$r/gcc/gfortran -B$$r/gcc/'
|
||||
elif test "$host" = "$target"; then
|
||||
GFORTRAN_FOR_TARGET='gfortran'
|
||||
else
|
||||
GFORTRAN_FOR_TARGET=`echo gfortran | sed -e 's/x/x/' ${program_transform_name}`
|
||||
fi
|
||||
case $GFORTRAN_FOR_TARGET in
|
||||
*' $(FLAGS_FOR_TARGET)') ;;
|
||||
*) GFORTRAN_FOR_TARGET=$GFORTRAN_FOR_TARGET' $(FLAGS_FOR_TARGET)' ;;
|
||||
esac
|
||||
|
||||
# Don't use libstdc++-v3's flags to configure/build itself.
|
||||
libstdcxx_flags='`test ! -f $$r/$(TARGET_SUBDIR)/libstdc++-v3/scripts/testsuite_flags || $(SHELL) $$r/$(TARGET_SUBDIR)/libstdc++-v3/scripts/testsuite_flags --build-includes` -L$$r/$(TARGET_SUBDIR)/libstdc++-v3/src -L$$r/$(TARGET_SUBDIR)/libstdc++-v3/src/.libs'
|
||||
raw_libstdcxx_flags='-L$$r/$(TARGET_SUBDIR)/libstdc++-v3/src -L$$r/$(TARGET_SUBDIR)/libstdc++-v3/src/.libs'
|
||||
@ -1976,6 +2090,7 @@ qqRAW_CXX_FOR_TARGET=`echo "$qRAW_CXX_FOR_TARGET" | sed -e 's,[[$]][[$]],$$$$,g'
|
||||
# Wrap CC_FOR_TARGET and friends, for certain types of builds.
|
||||
CC_FOR_TARGET="\$(STAGE_CC_WRAPPER) ${CC_FOR_TARGET}"
|
||||
GCJ_FOR_TARGET="\$(STAGE_CC_WRAPPER) ${GCJ_FOR_TARGET}"
|
||||
GFORTRAN_FOR_TARGET="\$(STAGE_CC_WRAPPER) ${GFORTRAN_FOR_TARGET}"
|
||||
CXX_FOR_TARGET="\$(STAGE_CC_WRAPPER) ${qCXX_FOR_TARGET}"
|
||||
RAW_CXX_FOR_TARGET="\$(STAGE_CC_WRAPPER) ${qRAW_CXX_FOR_TARGET}"
|
||||
CXX_FOR_TARGET_FOR_RECURSIVE_MAKE="\$(STAGE_CC_WRAPPER) ${qqCXX_FOR_TARGET}"
|
||||
@ -2057,6 +2172,7 @@ AC_SUBST(GCC_FOR_TARGET)
|
||||
AC_SUBST(FLAGS_FOR_TARGET)
|
||||
AC_SUBST(CC_FOR_TARGET)
|
||||
AC_SUBST(GCJ_FOR_TARGET)
|
||||
AC_SUBST(GFORTRAN_FOR_TARGET)
|
||||
AC_SUBST(CXX_FOR_TARGET)
|
||||
AC_SUBST(RAW_CXX_FOR_TARGET)
|
||||
AC_SUBST(CXX_FOR_TARGET_FOR_RECURSIVE_MAKE)
|
||||
|
@ -1,3 +1,14 @@
|
||||
2004-05-13 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
Merge from tree-ssa-20020619-branch.
|
||||
|
||||
* filter_gcc_for_doxygen: New file.
|
||||
* filter_knr2ansi.pl: New file.
|
||||
* filter_params.pl: New file.
|
||||
* tree-ssa.doxy: New file.
|
||||
* contrib/gcc_update (files_and_dependencies): Handle
|
||||
libbanshee and libmudflap.
|
||||
|
||||
2004-04-12 Kelley Cook <kcook@gcc.gnu.org>
|
||||
Andreas Jaeger <aj@suse.de>
|
||||
|
||||
|
46
contrib/ChangeLog.tree-ssa
Normal file
46
contrib/ChangeLog.tree-ssa
Normal file
@ -0,0 +1,46 @@
|
||||
2004-03-25 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* gcc_update (files_and_dependencies): Add libbanshee and
|
||||
libmudflap dependencies.
|
||||
|
||||
2003-11-27 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* tree-ssa.doxy (FILE_PATTERNS): Update.
|
||||
|
||||
2003-11-21 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* tree-ssa.doxy: Do not generate latex output.
|
||||
|
||||
2003-07-21 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* tree-ssa.doxy: Include tree* files
|
||||
|
||||
2003-07-15 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* tree-ssa.doxy: Add tree-must-alias.c.
|
||||
|
||||
2003-01-28 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* filter_params.pl: Surround comments in @verbatim/@endverbatim.
|
||||
|
||||
2003-01-19 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* tree-ssa.doxy (OUTPUT_DIRECTORY, INPUT_FILTER): Replace
|
||||
hardwired values for with replaceable strings.
|
||||
|
||||
2003-01-18 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* filter_params.pl: Change most comments to start with /**.
|
||||
|
||||
2002-12-23 Steven Bosscher <Steven.Bosscher@usafa.af.mil>
|
||||
|
||||
* filter_params.pl: Filter ATTRIBUTE_UNUSED.
|
||||
|
||||
2002-12-12 Daniel Berlin <dberlin@dberlin.org>
|
||||
Steven Bosscher <Steven.Bosscher@usafa.af.mil>
|
||||
Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* filter_gcc_for_doxygen: New file.
|
||||
* filter_knr2ansi.pl: New file.
|
||||
* filter_params.pl: New file.
|
||||
* tree-ssa.doxy: New file.
|
12
contrib/filter_gcc_for_doxygen
Executable file
12
contrib/filter_gcc_for_doxygen
Executable file
@ -0,0 +1,12 @@
|
||||
#!/bin/sh
|
||||
|
||||
# This filters GCC source before Doxygen can get confused by it;
|
||||
# this script is listed in the doxyfile. The output is not very
|
||||
# pretty, but at least we get output that Doxygen can understand.
|
||||
#
|
||||
# $1 is a source file of some kind. The source we wish doxygen to
|
||||
# process is put on stdout.
|
||||
|
||||
dir=`dirname $0`
|
||||
perl $dir/filter_params.pl < $1 | perl $dir/filter_knr2ansi.pl
|
||||
exit 0
|
45
contrib/filter_knr2ansi.pl
Executable file
45
contrib/filter_knr2ansi.pl
Executable file
@ -0,0 +1,45 @@
|
||||
#!/usr/bin/perl
|
||||
#
|
||||
# Goes thourgh the input line by line to find K&R style function
|
||||
# declarations, and replaces them with ANSI style declarations.
|
||||
#
|
||||
@blah = <>;
|
||||
|
||||
for ($i = 0; $i < @blah; $i++)
|
||||
{
|
||||
if ($blah[$i] =~ /^([a-zA-Z_0-9]+)\s*\([^)]+\)\s*$/)
|
||||
{
|
||||
$name = $1;
|
||||
$funci = $i;
|
||||
$blah[$funci]="$name (";
|
||||
$i++;
|
||||
$lastline = $i;
|
||||
while ($lastline < @blah && $blah[$lastline] !~ /^{/)
|
||||
{
|
||||
$lastline++;
|
||||
}
|
||||
$lastline--;
|
||||
while ($i < @blah && $blah[$i] !~ /^{/)
|
||||
{
|
||||
$arg = $blah[$i];
|
||||
if ($i != $lastline)
|
||||
{
|
||||
$arg =~ s/;/,/g;
|
||||
}
|
||||
else
|
||||
{
|
||||
$arg =~ s/;//g;
|
||||
}
|
||||
$blah[$i] = "";
|
||||
$blah[$funci] = "$blah[$funci]" . "$arg";
|
||||
$i++;
|
||||
}
|
||||
$blah[$funci] = "$blah[$funci]" . ")\n";
|
||||
}
|
||||
}
|
||||
|
||||
for ($i = 0; $i < @blah; $i++)
|
||||
{
|
||||
print $blah[$i];
|
||||
}
|
||||
|
14
contrib/filter_params.pl
Executable file
14
contrib/filter_params.pl
Executable file
@ -0,0 +1,14 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# Filters out some of the #defines used thourghout the GCC sources:
|
||||
# - GTY(()) marks declarations for gengtype.c
|
||||
# - PARAMS(()) is used for K&R compatibility. See ansidecl.h.
|
||||
|
||||
while (<>) {
|
||||
s/^\/\* /\/\*\* \@verbatim /;
|
||||
s/\*\// \@endverbatim \*\//;
|
||||
s/GTY[ \t]*\(\(.*\)\)//g;
|
||||
s/[ \t]ATTRIBUTE_UNUSED//g;
|
||||
s/PARAMS[ \t]*\(\((.*?)\)\)/\($1\)/sg;
|
||||
print;
|
||||
}
|
@ -80,6 +80,8 @@ libf2c/libI77/stamp-h.in: libf2c/libI77/configure.in
|
||||
libf2c/libI77/config.h.in: libf2c/libI77/configure.in libf2c/libI77/stamp-h.in
|
||||
libf2c/libU77/configure: libf2c/libU77/configure.in
|
||||
libf2c/libU77/stamp-h.in: libf2c/libU77/configure.in libf2c/libU77/acconfig.h
|
||||
libbanshee/configure: libbanshee/configure.in
|
||||
libmudflap/configure: libmudflap/configure.in
|
||||
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
|
||||
|
932
contrib/tree-ssa.doxy
Normal file
932
contrib/tree-ssa.doxy
Normal file
@ -0,0 +1,932 @@
|
||||
# Doxyfile 1.2.18
|
||||
|
||||
# This file describes the settings to be used by the documentation system
|
||||
# doxygen (www.doxygen.org) for a project
|
||||
#
|
||||
# All text after a hash (#) is considered a comment and will be ignored
|
||||
# The format is:
|
||||
# TAG = value [value, ...]
|
||||
# For lists items can also be appended using:
|
||||
# TAG += value [value, ...]
|
||||
# Values that contain spaces should be placed between quotes (" ")
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# NOTE: YOU MUST EDIT THE FOLLOWING HARDWIRED PATHS BEFORE USING THIS FILE.
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
||||
# base path where the generated documentation will be put.
|
||||
# If a relative path is entered, it will be relative to the location
|
||||
# where doxygen was started. If left blank the current directory will be used.
|
||||
|
||||
OUTPUT_DIRECTORY = @OUTPUT_DIRECTORY@
|
||||
|
||||
# The INPUT_FILTER tag can be used to specify a program that doxygen should
|
||||
# invoke to filter for each input file. Doxygen will invoke the filter program
|
||||
# by executing (via popen()) the command <filter> <input-file>, where <filter>
|
||||
# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
|
||||
# input file. Doxygen will then use the output that the filter program writes
|
||||
# to standard output.
|
||||
|
||||
INPUT_FILTER = @INPUT_FILTER@
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# General configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
|
||||
# by quotes) that should identify the project.
|
||||
|
||||
PROJECT_NAME = "Tree SSA"
|
||||
|
||||
# The PROJECT_NUMBER tag can be used to enter a project or revision number.
|
||||
# This could be handy for archiving the generated documentation or
|
||||
# if some version control system is used.
|
||||
|
||||
PROJECT_NUMBER =
|
||||
|
||||
|
||||
# The OUTPUT_LANGUAGE tag is used to specify the language in which all
|
||||
# documentation generated by doxygen is written. Doxygen will use this
|
||||
# information to generate all constant output in the proper language.
|
||||
# The default language is English, other supported languages are:
|
||||
# Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French,
|
||||
# German, Greek, Hungarian, Italian, Japanese, Korean, Norwegian, Polish,
|
||||
# Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish.
|
||||
|
||||
OUTPUT_LANGUAGE = English
|
||||
|
||||
# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
|
||||
# documentation are documented, even if no documentation was available.
|
||||
# Private class members and static file members will be hidden unless
|
||||
# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
|
||||
|
||||
EXTRACT_ALL = YES
|
||||
|
||||
# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
|
||||
# will be included in the documentation.
|
||||
|
||||
EXTRACT_PRIVATE = YES
|
||||
|
||||
# If the EXTRACT_STATIC tag is set to YES all static members of a file
|
||||
# will be included in the documentation.
|
||||
|
||||
EXTRACT_STATIC = YES
|
||||
|
||||
# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
|
||||
# defined locally in source files will be included in the documentation.
|
||||
# If set to NO only classes defined in header files are included.
|
||||
|
||||
EXTRACT_LOCAL_CLASSES = YES
|
||||
|
||||
# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
|
||||
# undocumented members of documented classes, files or namespaces.
|
||||
# If set to NO (the default) these members will be included in the
|
||||
# various overviews, but no documentation section is generated.
|
||||
# This option has no effect if EXTRACT_ALL is enabled.
|
||||
|
||||
HIDE_UNDOC_MEMBERS = NO
|
||||
|
||||
# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
|
||||
# undocumented classes that are normally visible in the class hierarchy.
|
||||
# If set to NO (the default) these class will be included in the various
|
||||
# overviews. This option has no effect if EXTRACT_ALL is enabled.
|
||||
|
||||
HIDE_UNDOC_CLASSES = NO
|
||||
|
||||
# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
|
||||
# include brief member descriptions after the members that are listed in
|
||||
# the file and class documentation (similar to JavaDoc).
|
||||
# Set to NO to disable this.
|
||||
|
||||
BRIEF_MEMBER_DESC = YES
|
||||
|
||||
# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
|
||||
# the brief description of a member or function before the detailed description.
|
||||
# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
|
||||
# brief descriptions will be completely suppressed.
|
||||
|
||||
REPEAT_BRIEF = YES
|
||||
|
||||
# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
|
||||
# Doxygen will generate a detailed section even if there is only a brief
|
||||
# description.
|
||||
|
||||
ALWAYS_DETAILED_SEC = YES
|
||||
|
||||
# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited
|
||||
# members of a class in the documentation of that class as if those members were
|
||||
# ordinary class members. Constructors, destructors and assignment operators of
|
||||
# the base classes will not be shown.
|
||||
|
||||
INLINE_INHERITED_MEMB = YES
|
||||
|
||||
# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
|
||||
# path before files name in the file list and in the header files. If set
|
||||
# to NO the shortest path that makes the file name unique will be used.
|
||||
|
||||
FULL_PATH_NAMES = NO
|
||||
|
||||
# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
|
||||
# can be used to strip a user defined part of the path. Stripping is
|
||||
# only done if one of the specified strings matches the left-hand part of
|
||||
# the path. It is allowed to use relative paths in the argument list.
|
||||
|
||||
STRIP_FROM_PATH =
|
||||
|
||||
# The INTERNAL_DOCS tag determines if documentation
|
||||
# that is typed after a \internal command is included. If the tag is set
|
||||
# to NO (the default) then the documentation will be excluded.
|
||||
# Set it to YES to include the internal documentation.
|
||||
|
||||
INTERNAL_DOCS = NO
|
||||
|
||||
# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
|
||||
# doxygen to hide any special comment blocks from generated source code
|
||||
# fragments. Normal C and C++ comments will always remain visible.
|
||||
|
||||
STRIP_CODE_COMMENTS = YES
|
||||
|
||||
# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
|
||||
# file names in lower case letters. If set to YES upper case letters are also
|
||||
# allowed. This is useful if you have classes or files whose names only differ
|
||||
# in case and if your file system supports case sensitive file names. Windows
|
||||
# users are adviced to set this option to NO.
|
||||
|
||||
CASE_SENSE_NAMES = YES
|
||||
|
||||
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
|
||||
# (but less readable) file names. This can be useful is your file systems
|
||||
# doesn't support long names like on DOS, Mac, or CD-ROM.
|
||||
|
||||
SHORT_NAMES = NO
|
||||
|
||||
# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
|
||||
# will show members with their full class and namespace scopes in the
|
||||
# documentation. If set to YES the scope will be hidden.
|
||||
|
||||
HIDE_SCOPE_NAMES = NO
|
||||
|
||||
# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
|
||||
# will generate a verbatim copy of the header file for each class for
|
||||
# which an include is specified. Set to NO to disable this.
|
||||
|
||||
VERBATIM_HEADERS = YES
|
||||
|
||||
# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
|
||||
# will put list of the files that are included by a file in the documentation
|
||||
# of that file.
|
||||
|
||||
SHOW_INCLUDE_FILES = YES
|
||||
|
||||
# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
|
||||
# will interpret the first line (until the first dot) of a JavaDoc-style
|
||||
# comment as the brief description. If set to NO, the JavaDoc
|
||||
# comments will behave just like the Qt-style comments (thus requiring an
|
||||
# explict @brief command for a brief description.
|
||||
|
||||
JAVADOC_AUTOBRIEF = NO
|
||||
|
||||
# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
|
||||
# member inherits the documentation from any documented member that it
|
||||
# reimplements.
|
||||
|
||||
INHERIT_DOCS = YES
|
||||
|
||||
# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
|
||||
# is inserted in the documentation for inline members.
|
||||
|
||||
INLINE_INFO = YES
|
||||
|
||||
# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
|
||||
# will sort the (detailed) documentation of file and class members
|
||||
# alphabetically by member name. If set to NO the members will appear in
|
||||
# declaration order.
|
||||
|
||||
SORT_MEMBER_DOCS = YES
|
||||
|
||||
# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
|
||||
# tag is set to YES, then doxygen will reuse the documentation of the first
|
||||
# member in the group (if any) for the other members of the group. By default
|
||||
# all members of a group must be documented explicitly.
|
||||
|
||||
DISTRIBUTE_GROUP_DOC = NO
|
||||
|
||||
# The TAB_SIZE tag can be used to set the number of spaces in a tab.
|
||||
# Doxygen uses this value to replace tabs by spaces in code fragments.
|
||||
|
||||
TAB_SIZE = 8
|
||||
|
||||
# The GENERATE_TODOLIST tag can be used to enable (YES) or
|
||||
# disable (NO) the todo list. This list is created by putting \todo
|
||||
# commands in the documentation.
|
||||
|
||||
GENERATE_TODOLIST = YES
|
||||
|
||||
# The GENERATE_TESTLIST tag can be used to enable (YES) or
|
||||
# disable (NO) the test list. This list is created by putting \test
|
||||
# commands in the documentation.
|
||||
|
||||
GENERATE_TESTLIST = YES
|
||||
|
||||
# The GENERATE_BUGLIST tag can be used to enable (YES) or
|
||||
# disable (NO) the bug list. This list is created by putting \bug
|
||||
# commands in the documentation.
|
||||
|
||||
GENERATE_BUGLIST = YES
|
||||
|
||||
# This tag can be used to specify a number of aliases that acts
|
||||
# as commands in the documentation. An alias has the form "name=value".
|
||||
# For example adding "sideeffect=\par Side Effects:\n" will allow you to
|
||||
# put the command \sideeffect (or @sideeffect) in the documentation, which
|
||||
# will result in a user defined paragraph with heading "Side Effects:".
|
||||
# You can put \n's in the value part of an alias to insert newlines.
|
||||
|
||||
ALIASES =
|
||||
|
||||
# The ENABLED_SECTIONS tag can be used to enable conditional
|
||||
# documentation sections, marked by \if sectionname ... \endif.
|
||||
|
||||
ENABLED_SECTIONS =
|
||||
|
||||
# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
|
||||
# the initial value of a variable or define consist of for it to appear in
|
||||
# the documentation. If the initializer consists of more lines than specified
|
||||
# here it will be hidden. Use a value of 0 to hide initializers completely.
|
||||
# The appearance of the initializer of individual variables and defines in the
|
||||
# documentation can be controlled using \showinitializer or \hideinitializer
|
||||
# command in the documentation regardless of this setting.
|
||||
|
||||
MAX_INITIALIZER_LINES = 30
|
||||
|
||||
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
|
||||
# only. Doxygen will then generate output that is more tailored for C.
|
||||
# For instance some of the names that are used will be different. The list
|
||||
# of all members will be omitted, etc.
|
||||
|
||||
OPTIMIZE_OUTPUT_FOR_C = YES
|
||||
|
||||
# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
|
||||
# at the bottom of the documentation of classes and structs. If set to YES the
|
||||
# list will mention the files that were used to generate the documentation.
|
||||
|
||||
SHOW_USED_FILES = YES
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to warning and progress messages
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# The QUIET tag can be used to turn on/off the messages that are generated
|
||||
# by doxygen. Possible values are YES and NO. If left blank NO is used.
|
||||
|
||||
QUIET = NO
|
||||
|
||||
# The WARNINGS tag can be used to turn on/off the warning messages that are
|
||||
# generated by doxygen. Possible values are YES and NO. If left blank
|
||||
# NO is used.
|
||||
|
||||
WARNINGS = YES
|
||||
|
||||
# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
|
||||
# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
|
||||
# automatically be disabled.
|
||||
|
||||
WARN_IF_UNDOCUMENTED = YES
|
||||
|
||||
# The WARN_FORMAT tag determines the format of the warning messages that
|
||||
# doxygen can produce. The string should contain the $file, $line, and $text
|
||||
# tags, which will be replaced by the file and line number from which the
|
||||
# warning originated and the warning text.
|
||||
|
||||
WARN_FORMAT = "$file:$line: $text"
|
||||
|
||||
# The WARN_LOGFILE tag can be used to specify a file to which warning
|
||||
# and error messages should be written. If left blank the output is written
|
||||
# to stderr.
|
||||
|
||||
WARN_LOGFILE =
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the input files
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# The INPUT tag can be used to specify the files and/or directories that contain
|
||||
# documented source files. You may enter file names like "myfile.cpp" or
|
||||
# directories like "/usr/src/myproject". Separate the files or directories
|
||||
# with spaces.
|
||||
|
||||
INPUT = .
|
||||
|
||||
# If the value of the INPUT tag contains directories, you can use the
|
||||
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
|
||||
# and *.h) to filter out the source-files in the directories. If left
|
||||
# blank the following patterns are tested:
|
||||
# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
|
||||
# *.h++ *.idl *.odl
|
||||
|
||||
FILE_PATTERNS = tree* *mudflap* c-simplify.c gimpl* domwalk*
|
||||
|
||||
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
|
||||
# should be searched for input files as well. Possible values are YES and NO.
|
||||
# If left blank NO is used.
|
||||
|
||||
RECURSIVE = NO
|
||||
|
||||
# The EXCLUDE tag can be used to specify files and/or directories that should
|
||||
# excluded from the INPUT source files. This way you can easily exclude a
|
||||
# subdirectory from a directory tree whose root is specified with the INPUT tag.
|
||||
|
||||
EXCLUDE =
|
||||
|
||||
# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories
|
||||
# that are symbolic links (a Unix filesystem feature) are excluded from the input.
|
||||
|
||||
EXCLUDE_SYMLINKS = NO
|
||||
|
||||
# If the value of the INPUT tag contains directories, you can use the
|
||||
# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
|
||||
# certain files from those directories.
|
||||
|
||||
EXCLUDE_PATTERNS =
|
||||
|
||||
# The EXAMPLE_PATH tag can be used to specify one or more files or
|
||||
# directories that contain example code fragments that are included (see
|
||||
# the \include command).
|
||||
|
||||
EXAMPLE_PATH =
|
||||
|
||||
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
|
||||
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
|
||||
# and *.h) to filter out the source-files in the directories. If left
|
||||
# blank all files are included.
|
||||
|
||||
EXAMPLE_PATTERNS =
|
||||
|
||||
# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
|
||||
# searched for input files to be used with the \include or \dontinclude
|
||||
# commands irrespective of the value of the RECURSIVE tag.
|
||||
# Possible values are YES and NO. If left blank NO is used.
|
||||
|
||||
EXAMPLE_RECURSIVE = NO
|
||||
|
||||
# The IMAGE_PATH tag can be used to specify one or more files or
|
||||
# directories that contain image that are included in the documentation (see
|
||||
# the \image command).
|
||||
|
||||
IMAGE_PATH =
|
||||
|
||||
# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
|
||||
# INPUT_FILTER) will be used to filter the input files when producing source
|
||||
# files to browse.
|
||||
|
||||
FILTER_SOURCE_FILES = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to source browsing
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the SOURCE_BROWSER tag is set to YES then a list of source files will
|
||||
# be generated. Documented entities will be cross-referenced with these sources.
|
||||
|
||||
SOURCE_BROWSER = YES
|
||||
|
||||
# Setting the INLINE_SOURCES tag to YES will include the body
|
||||
# of functions and classes directly in the documentation.
|
||||
|
||||
INLINE_SOURCES = YES
|
||||
|
||||
# If the REFERENCED_BY_RELATION tag is set to YES (the default)
|
||||
# then for each documented function all documented
|
||||
# functions referencing it will be listed.
|
||||
|
||||
REFERENCED_BY_RELATION = YES
|
||||
|
||||
# If the REFERENCES_RELATION tag is set to YES (the default)
|
||||
# then for each documented function all documented entities
|
||||
# called/used by that function will be listed.
|
||||
|
||||
REFERENCES_RELATION = YES
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the alphabetical class index
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
|
||||
# of all compounds will be generated. Enable this if the project
|
||||
# contains a lot of classes, structs, unions or interfaces.
|
||||
|
||||
ALPHABETICAL_INDEX = YES
|
||||
|
||||
# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
|
||||
# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
|
||||
# in which this list will be split (can be a number in the range [1..20])
|
||||
|
||||
COLS_IN_ALPHA_INDEX = 5
|
||||
|
||||
# In case all classes in a project start with a common prefix, all
|
||||
# classes will be put under the same header in the alphabetical index.
|
||||
# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
|
||||
# should be ignored while generating the index headers.
|
||||
|
||||
IGNORE_PREFIX =
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the HTML output
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
|
||||
# generate HTML output.
|
||||
|
||||
GENERATE_HTML = YES
|
||||
|
||||
# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
|
||||
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
|
||||
# put in front of it. If left blank `html' will be used as the default path.
|
||||
|
||||
HTML_OUTPUT = html
|
||||
|
||||
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
|
||||
# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
|
||||
# doxygen will generate files with .html extension.
|
||||
|
||||
HTML_FILE_EXTENSION = .html
|
||||
|
||||
# The HTML_HEADER tag can be used to specify a personal HTML header for
|
||||
# each generated HTML page. If it is left blank doxygen will generate a
|
||||
# standard header.
|
||||
|
||||
HTML_HEADER =
|
||||
|
||||
# The HTML_FOOTER tag can be used to specify a personal HTML footer for
|
||||
# each generated HTML page. If it is left blank doxygen will generate a
|
||||
# standard footer.
|
||||
|
||||
HTML_FOOTER =
|
||||
|
||||
# The HTML_STYLESHEET tag can be used to specify a user defined cascading
|
||||
# style sheet that is used by each HTML page. It can be used to
|
||||
# fine-tune the look of the HTML output. If the tag is left blank doxygen
|
||||
# will generate a default style sheet
|
||||
|
||||
HTML_STYLESHEET =
|
||||
|
||||
# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
|
||||
# files or namespaces will be aligned in HTML using tables. If set to
|
||||
# NO a bullet list will be used.
|
||||
|
||||
HTML_ALIGN_MEMBERS = YES
|
||||
|
||||
# If the GENERATE_HTMLHELP tag is set to YES, additional index files
|
||||
# will be generated that can be used as input for tools like the
|
||||
# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
|
||||
# of the generated HTML documentation.
|
||||
|
||||
GENERATE_HTMLHELP = NO
|
||||
|
||||
# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
|
||||
# controls if a separate .chi index file is generated (YES) or that
|
||||
# it should be included in the master .chm file (NO).
|
||||
|
||||
GENERATE_CHI = NO
|
||||
|
||||
# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
|
||||
# controls whether a binary table of contents is generated (YES) or a
|
||||
# normal table of contents (NO) in the .chm file.
|
||||
|
||||
BINARY_TOC = NO
|
||||
|
||||
# The TOC_EXPAND flag can be set to YES to add extra items for group members
|
||||
# to the contents of the Html help documentation and to the tree view.
|
||||
|
||||
TOC_EXPAND = NO
|
||||
|
||||
# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
|
||||
# top of each HTML page. The value NO (the default) enables the index and
|
||||
# the value YES disables it.
|
||||
|
||||
DISABLE_INDEX = NO
|
||||
|
||||
# This tag can be used to set the number of enum values (range [1..20])
|
||||
# that doxygen will group on one line in the generated HTML documentation.
|
||||
|
||||
ENUM_VALUES_PER_LINE = 4
|
||||
|
||||
# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
|
||||
# generated containing a tree-like index structure (just like the one that
|
||||
# is generated for HTML Help). For this to work a browser that supports
|
||||
# JavaScript and frames is required (for instance Mozilla, Netscape 4.0+,
|
||||
# or Internet explorer 4.0+). Note that for large projects the tree generation
|
||||
# can take a very long time. In such cases it is better to disable this feature.
|
||||
# Windows users are probably better off using the HTML help feature.
|
||||
|
||||
GENERATE_TREEVIEW = NO
|
||||
|
||||
# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
|
||||
# used to set the initial width (in pixels) of the frame in which the tree
|
||||
# is shown.
|
||||
|
||||
TREEVIEW_WIDTH = 250
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the LaTeX output
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
|
||||
# generate Latex output.
|
||||
|
||||
GENERATE_LATEX = NO
|
||||
|
||||
# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
|
||||
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
|
||||
# put in front of it. If left blank `latex' will be used as the default path.
|
||||
|
||||
LATEX_OUTPUT = latex
|
||||
|
||||
# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
|
||||
# LaTeX documents. This may be useful for small projects and may help to
|
||||
# save some trees in general.
|
||||
|
||||
COMPACT_LATEX = NO
|
||||
|
||||
# The PAPER_TYPE tag can be used to set the paper type that is used
|
||||
# by the printer. Possible values are: a4, a4wide, letter, legal and
|
||||
# executive. If left blank a4wide will be used.
|
||||
|
||||
PAPER_TYPE = letter
|
||||
|
||||
# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
|
||||
# packages that should be included in the LaTeX output.
|
||||
|
||||
EXTRA_PACKAGES =
|
||||
|
||||
# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
|
||||
# the generated latex document. The header should contain everything until
|
||||
# the first chapter. If it is left blank doxygen will generate a
|
||||
# standard header. Notice: only use this tag if you know what you are doing!
|
||||
|
||||
LATEX_HEADER =
|
||||
|
||||
# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
|
||||
# is prepared for conversion to pdf (using ps2pdf). The pdf file will
|
||||
# contain links (just like the HTML output) instead of page references
|
||||
# This makes the output suitable for online browsing using a pdf viewer.
|
||||
|
||||
PDF_HYPERLINKS = YES
|
||||
|
||||
# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
|
||||
# plain latex in the generated Makefile. Set this option to YES to get a
|
||||
# higher quality PDF documentation.
|
||||
|
||||
USE_PDFLATEX = YES
|
||||
|
||||
# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
|
||||
# command to the generated LaTeX files. This will instruct LaTeX to keep
|
||||
# running if errors occur, instead of asking the user for help.
|
||||
# This option is also used when generating formulas in HTML.
|
||||
|
||||
LATEX_BATCHMODE = YES
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the RTF output
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
|
||||
# The RTF output is optimised for Word 97 and may not look very pretty with
|
||||
# other RTF readers or editors.
|
||||
|
||||
GENERATE_RTF = NO
|
||||
|
||||
# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
|
||||
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
|
||||
# put in front of it. If left blank `rtf' will be used as the default path.
|
||||
|
||||
RTF_OUTPUT = rtf
|
||||
|
||||
# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
|
||||
# RTF documents. This may be useful for small projects and may help to
|
||||
# save some trees in general.
|
||||
|
||||
COMPACT_RTF = NO
|
||||
|
||||
# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
|
||||
# will contain hyperlink fields. The RTF file will
|
||||
# contain links (just like the HTML output) instead of page references.
|
||||
# This makes the output suitable for online browsing using WORD or other
|
||||
# programs which support those fields.
|
||||
# Note: wordpad (write) and others do not support links.
|
||||
|
||||
RTF_HYPERLINKS = NO
|
||||
|
||||
# Load stylesheet definitions from file. Syntax is similar to doxygen's
|
||||
# config file, i.e. a series of assigments. You only have to provide
|
||||
# replacements, missing definitions are set to their default value.
|
||||
|
||||
RTF_STYLESHEET_FILE =
|
||||
|
||||
# Set optional variables used in the generation of an rtf document.
|
||||
# Syntax is similar to doxygen's config file.
|
||||
|
||||
RTF_EXTENSIONS_FILE =
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the man page output
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
|
||||
# generate man pages
|
||||
|
||||
GENERATE_MAN = NO
|
||||
|
||||
# The MAN_OUTPUT tag is used to specify where the man pages will be put.
|
||||
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
|
||||
# put in front of it. If left blank `man' will be used as the default path.
|
||||
|
||||
MAN_OUTPUT = man
|
||||
|
||||
# The MAN_EXTENSION tag determines the extension that is added to
|
||||
# the generated man pages (default is the subroutine's section .3)
|
||||
|
||||
MAN_EXTENSION = .3
|
||||
|
||||
# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
|
||||
# then it will generate one additional man file for each entity
|
||||
# documented in the real man page(s). These additional files
|
||||
# only source the real man page, but without them the man command
|
||||
# would be unable to find the correct page. The default is NO.
|
||||
|
||||
MAN_LINKS = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the XML output
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the GENERATE_XML tag is set to YES Doxygen will
|
||||
# generate an XML file that captures the structure of
|
||||
# the code including all documentation. Note that this
|
||||
# feature is still experimental and incomplete at the
|
||||
# moment.
|
||||
|
||||
GENERATE_XML = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options for the AutoGen Definitions output
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
|
||||
# generate an AutoGen Definitions (see autogen.sf.net) file
|
||||
# that captures the structure of the code including all
|
||||
# documentation. Note that this feature is still experimental
|
||||
# and incomplete at the moment.
|
||||
|
||||
GENERATE_AUTOGEN_DEF = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the preprocessor
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
|
||||
# evaluate all C-preprocessor directives found in the sources and include
|
||||
# files.
|
||||
|
||||
ENABLE_PREPROCESSING = YES
|
||||
|
||||
# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
|
||||
# names in the source code. If set to NO (the default) only conditional
|
||||
# compilation will be performed. Macro expansion can be done in a controlled
|
||||
# way by setting EXPAND_ONLY_PREDEF to YES.
|
||||
|
||||
MACRO_EXPANSION = NO
|
||||
|
||||
# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
|
||||
# then the macro expansion is limited to the macros specified with the
|
||||
# PREDEFINED and EXPAND_AS_PREDEFINED tags.
|
||||
|
||||
EXPAND_ONLY_PREDEF = NO
|
||||
|
||||
# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
|
||||
# in the INCLUDE_PATH (see below) will be search if a #include is found.
|
||||
|
||||
SEARCH_INCLUDES = YES
|
||||
|
||||
# The INCLUDE_PATH tag can be used to specify one or more directories that
|
||||
# contain include files that are not input files but should be processed by
|
||||
# the preprocessor.
|
||||
|
||||
INCLUDE_PATH =
|
||||
|
||||
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
|
||||
# patterns (like *.h and *.hpp) to filter out the header-files in the
|
||||
# directories. If left blank, the patterns specified with FILE_PATTERNS will
|
||||
# be used.
|
||||
|
||||
INCLUDE_FILE_PATTERNS =
|
||||
|
||||
# The PREDEFINED tag can be used to specify one or more macro names that
|
||||
# are defined before the preprocessor is started (similar to the -D option of
|
||||
# gcc). The argument of the tag is a list of macros of the form: name
|
||||
# or name=definition (no spaces). If the definition and the = are
|
||||
# omitted =1 is assumed.
|
||||
|
||||
PREDEFINED =
|
||||
|
||||
# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then
|
||||
# this tag can be used to specify a list of macro names that should be expanded.
|
||||
# The macro definition that is found in the sources will be used.
|
||||
# Use the PREDEFINED tag if you want to use a different macro definition.
|
||||
|
||||
EXPAND_AS_DEFINED =
|
||||
|
||||
# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
|
||||
# doxygen's preprocessor will remove all function-like macros that are alone
|
||||
# on a line and do not end with a semicolon. Such function macros are typically
|
||||
# used for boiler-plate code, and will confuse the parser if not removed.
|
||||
|
||||
SKIP_FUNCTION_MACROS = YES
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration::addtions related to external references
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# The TAGFILES tag can be used to specify one or more tagfiles.
|
||||
|
||||
TAGFILES =
|
||||
|
||||
# When a file name is specified after GENERATE_TAGFILE, doxygen will create
|
||||
# a tag file that is based on the input files it reads.
|
||||
|
||||
GENERATE_TAGFILE =
|
||||
|
||||
# If the ALLEXTERNALS tag is set to YES all external classes will be listed
|
||||
# in the class index. If set to NO only the inherited external classes
|
||||
# will be listed.
|
||||
|
||||
ALLEXTERNALS = NO
|
||||
|
||||
# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
|
||||
# in the modules index. If set to NO, only the current project's groups will
|
||||
# be listed.
|
||||
|
||||
EXTERNAL_GROUPS = YES
|
||||
|
||||
# The PERL_PATH should be the absolute path and name of the perl script
|
||||
# interpreter (i.e. the result of `which perl').
|
||||
|
||||
PERL_PATH = /usr/bin/perl
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the dot tool
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
|
||||
# generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or
|
||||
# super classes. Setting the tag to NO turns the diagrams off. Note that this
|
||||
# option is superceded by the HAVE_DOT option below. This is only a fallback. It is
|
||||
# recommended to install and use dot, since it yield more powerful graphs.
|
||||
|
||||
CLASS_DIAGRAMS = YES
|
||||
|
||||
# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
|
||||
# available from the path. This tool is part of Graphviz, a graph visualization
|
||||
# toolkit from AT&T and Lucent Bell Labs. The other options in this section
|
||||
# have no effect if this option is set to NO (the default)
|
||||
|
||||
HAVE_DOT = YES
|
||||
|
||||
# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
|
||||
# will generate a graph for each documented class showing the direct and
|
||||
# indirect inheritance relations. Setting this tag to YES will force the
|
||||
# the CLASS_DIAGRAMS tag to NO.
|
||||
|
||||
CLASS_GRAPH = YES
|
||||
|
||||
# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
|
||||
# will generate a graph for each documented class showing the direct and
|
||||
# indirect implementation dependencies (inheritance, containment, and
|
||||
# class references variables) of the class with other documented classes.
|
||||
|
||||
COLLABORATION_GRAPH = YES
|
||||
|
||||
# If set to YES, the inheritance and collaboration graphs will show the
|
||||
# relations between templates and their instances.
|
||||
|
||||
TEMPLATE_RELATIONS = YES
|
||||
|
||||
# If set to YES, the inheritance and collaboration graphs will hide
|
||||
# inheritance and usage relations if the target is undocumented
|
||||
# or is not a class.
|
||||
|
||||
HIDE_UNDOC_RELATIONS = YES
|
||||
|
||||
# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
|
||||
# tags are set to YES then doxygen will generate a graph for each documented
|
||||
# file showing the direct and indirect include dependencies of the file with
|
||||
# other documented files.
|
||||
|
||||
INCLUDE_GRAPH = YES
|
||||
|
||||
# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
|
||||
# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
|
||||
# documented header file showing the documented files that directly or
|
||||
# indirectly include this file.
|
||||
|
||||
INCLUDED_BY_GRAPH = YES
|
||||
|
||||
# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
|
||||
# will graphical hierarchy of all classes instead of a textual one.
|
||||
|
||||
GRAPHICAL_HIERARCHY = YES
|
||||
|
||||
# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
|
||||
# generated by dot. Possible values are gif, jpg, and png
|
||||
# If left blank gif will be used.
|
||||
|
||||
DOT_IMAGE_FORMAT = png
|
||||
|
||||
# The tag DOT_PATH can be used to specify the path where the dot tool can be
|
||||
# found. If left blank, it is assumed the dot tool can be found on the path.
|
||||
|
||||
DOT_PATH =
|
||||
|
||||
# The DOTFILE_DIRS tag can be used to specify one or more directories that
|
||||
# contain dot files that are included in the documentation (see the
|
||||
# \dotfile command).
|
||||
|
||||
DOTFILE_DIRS =
|
||||
|
||||
# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
|
||||
# (in pixels) of the graphs generated by dot. If a graph becomes larger than
|
||||
# this value, doxygen will try to truncate the graph, so that it fits within
|
||||
# the specified constraint. Beware that most browsers cannot cope with very
|
||||
# large images.
|
||||
|
||||
MAX_DOT_GRAPH_WIDTH = 1024
|
||||
|
||||
# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
|
||||
# (in pixels) of the graphs generated by dot. If a graph becomes larger than
|
||||
# this value, doxygen will try to truncate the graph, so that it fits within
|
||||
# the specified constraint. Beware that most browsers cannot cope with very
|
||||
# large images.
|
||||
|
||||
MAX_DOT_GRAPH_HEIGHT = 1024
|
||||
|
||||
# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
|
||||
# generate a legend page explaining the meaning of the various boxes and
|
||||
# arrows in the dot generated graphs.
|
||||
|
||||
GENERATE_LEGEND = YES
|
||||
|
||||
# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
|
||||
# remove the intermedate dot files that are used to generate
|
||||
# the various graphs.
|
||||
|
||||
DOT_CLEANUP = YES
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration::addtions related to the search engine
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# The SEARCHENGINE tag specifies whether or not a search engine should be
|
||||
# used. If set to NO the values of all tags below this one will be ignored.
|
||||
|
||||
SEARCHENGINE = NO
|
||||
|
||||
# The CGI_NAME tag should be the name of the CGI script that
|
||||
# starts the search engine (doxysearch) with the correct parameters.
|
||||
# A script with this name will be generated by doxygen.
|
||||
|
||||
CGI_NAME = search.cgi
|
||||
|
||||
# The CGI_URL tag should be the absolute URL to the directory where the
|
||||
# cgi binaries are located. See the documentation of your http daemon for
|
||||
# details.
|
||||
|
||||
CGI_URL =
|
||||
|
||||
# The DOC_URL tag should be the absolute URL to the directory where the
|
||||
# documentation is located. If left blank the absolute path to the
|
||||
# documentation, with file:// prepended to it, will be used.
|
||||
|
||||
DOC_URL =
|
||||
|
||||
# The DOC_ABSPATH tag should be the absolute path to the directory where the
|
||||
# documentation is located. If left blank the directory on the local machine
|
||||
# will be used.
|
||||
|
||||
DOC_ABSPATH =
|
||||
|
||||
# The BIN_ABSPATH tag must point to the directory where the doxysearch binary
|
||||
# is installed.
|
||||
|
||||
BIN_ABSPATH = /usr/local/bin/
|
||||
|
||||
# The EXT_DOC_PATHS tag can be used to specify one or more paths to
|
||||
# documentation generated for other projects. This allows doxysearch to search
|
||||
# the documentation for these projects as well.
|
||||
|
||||
EXT_DOC_PATHS =
|
472
depcomp
Executable file
472
depcomp
Executable file
@ -0,0 +1,472 @@
|
||||
#! /bin/sh
|
||||
|
||||
# depcomp - compile a program generating dependencies as side-effects
|
||||
# Copyright 1999, 2000 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2, or (at your option)
|
||||
# any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
# 02111-1307, USA.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
||||
|
||||
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
||||
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
# `libtool' can also be set to `yes' or `no'.
|
||||
|
||||
if test -z "$depfile"; then
|
||||
base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'`
|
||||
dir=`echo "$object" | sed 's,/.*$,/,'`
|
||||
if test "$dir" = "$object"; then
|
||||
dir=
|
||||
fi
|
||||
# FIXME: should be _deps on DOS.
|
||||
depfile="$dir.deps/$base"
|
||||
fi
|
||||
|
||||
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
||||
|
||||
rm -f "$tmpdepfile"
|
||||
|
||||
# Some modes work just like other modes, but use different flags. We
|
||||
# parameterize here, but still list the modes in the big case below,
|
||||
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
||||
# here, because this file can only contain one case statement.
|
||||
if test "$depmode" = hp; then
|
||||
# HP compiler uses -M and no extra arg.
|
||||
gccflag=-M
|
||||
depmode=gcc
|
||||
fi
|
||||
|
||||
if test "$depmode" = dashXmstdout; then
|
||||
# This is just like dashmstdout with a different argument.
|
||||
dashmflag=-xM
|
||||
depmode=dashmstdout
|
||||
fi
|
||||
|
||||
case "$depmode" in
|
||||
gcc3)
|
||||
## gcc 3 implements dependency tracking that does exactly what
|
||||
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
||||
## it if -MD -MP comes after the -MF stuff. Hmm.
|
||||
"$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
|
||||
stat=$?
|
||||
if test $stat -eq 0; then :
|
||||
else
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
mv "$tmpdepfile" "$depfile"
|
||||
;;
|
||||
|
||||
gcc)
|
||||
## There are various ways to get dependency output from gcc. Here's
|
||||
## why we pick this rather obscure method:
|
||||
## - Don't want to use -MD because we'd like the dependencies to end
|
||||
## up in a subdir. Having to rename by hand is ugly.
|
||||
## (We might end up doing this anyway to support other compilers.)
|
||||
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
||||
## -MM, not -M (despite what the docs say).
|
||||
## - Using -M directly means running the compiler twice (even worse
|
||||
## than renaming).
|
||||
if test -z "$gccflag"; then
|
||||
gccflag=-MD,
|
||||
fi
|
||||
"$@" -Wp,"$gccflag$tmpdepfile"
|
||||
stat=$?
|
||||
if test $stat -eq 0; then :
|
||||
else
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
|
||||
## The second -e expression handles DOS-style file names with drive letters.
|
||||
sed -e 's/^[^:]*: / /' \
|
||||
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
||||
## This next piece of magic avoids the `deleted header file' problem.
|
||||
## The problem is that when a header file which appears in a .P file
|
||||
## is deleted, the dependency causes make to die (because there is
|
||||
## typically no way to rebuild the header). We avoid this by adding
|
||||
## dummy dependencies for each header file. Too bad gcc doesn't do
|
||||
## this for us directly.
|
||||
tr ' ' '
|
||||
' < "$tmpdepfile" |
|
||||
## Some versions of gcc put a space before the `:'. On the theory
|
||||
## that the space means something, we add a space to the output as
|
||||
## well.
|
||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||
## correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
hp)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
sgi)
|
||||
if test "$libtool" = yes; then
|
||||
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
||||
else
|
||||
"$@" -MDupdate "$tmpdepfile"
|
||||
fi
|
||||
stat=$?
|
||||
if test $stat -eq 0; then :
|
||||
else
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
|
||||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
||||
echo "$object : \\" > "$depfile"
|
||||
|
||||
# Clip off the initial element (the dependent). Don't try to be
|
||||
# clever and replace this with sed code, as IRIX sed won't handle
|
||||
# lines with more than a fixed number of characters (4096 in
|
||||
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
||||
# the IRIX cc adds comments like `#:fec' to the end of the
|
||||
# dependency line.
|
||||
tr ' ' '
|
||||
' < "$tmpdepfile" \
|
||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
|
||||
tr '
|
||||
' ' ' >> $depfile
|
||||
echo >> $depfile
|
||||
|
||||
# The second pass generates a dummy entry for each header file.
|
||||
tr ' ' '
|
||||
' < "$tmpdepfile" \
|
||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
||||
>> $depfile
|
||||
else
|
||||
# The sourcefile does not contain any dependencies, so just
|
||||
# store a dummy comment line, to avoid errors with the Makefile
|
||||
# "include basename.Plo" scheme.
|
||||
echo "#dummy" > "$depfile"
|
||||
fi
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
aix)
|
||||
# The C for AIX Compiler uses -M and outputs the dependencies
|
||||
# in a .u file. This file always lives in the current directory.
|
||||
# Also, the AIX compiler puts `$object:' at the start of each line;
|
||||
# $object doesn't have directory information.
|
||||
stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'`
|
||||
tmpdepfile="$stripped.u"
|
||||
outname="$stripped.o"
|
||||
if test "$libtool" = yes; then
|
||||
"$@" -Wc,-M
|
||||
else
|
||||
"$@" -M
|
||||
fi
|
||||
|
||||
stat=$?
|
||||
if test $stat -eq 0; then :
|
||||
else
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
if test -f "$tmpdepfile"; then
|
||||
# Each line is of the form `foo.o: dependent.h'.
|
||||
# Do two passes, one to just change these to
|
||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
||||
sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
|
||||
sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
|
||||
else
|
||||
# The sourcefile does not contain any dependencies, so just
|
||||
# store a dummy comment line, to avoid errors with the Makefile
|
||||
# "include basename.Plo" scheme.
|
||||
echo "#dummy" > "$depfile"
|
||||
fi
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
icc)
|
||||
# Intel's C compiler understands `-MD -MF file'. However on
|
||||
# icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
|
||||
# ICC 7.0 will fill foo.d with something like
|
||||
# foo.o: sub/foo.c
|
||||
# foo.o: sub/foo.h
|
||||
# which is wrong. We want:
|
||||
# sub/foo.o: sub/foo.c
|
||||
# sub/foo.o: sub/foo.h
|
||||
# sub/foo.c:
|
||||
# sub/foo.h:
|
||||
# ICC 7.1 will output
|
||||
# foo.o: sub/foo.c sub/foo.h
|
||||
# and will wrap long lines using \ :
|
||||
# foo.o: sub/foo.c ... \
|
||||
# sub/foo.h ... \
|
||||
# ...
|
||||
|
||||
"$@" -MD -MF "$tmpdepfile"
|
||||
stat=$?
|
||||
if test $stat -eq 0; then :
|
||||
else
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
# Each line is of the form `foo.o: dependent.h',
|
||||
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
||||
# Do two passes, one to just change these to
|
||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
||||
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
||||
# Some versions of the HPUX 10.20 sed can't process this invocation
|
||||
# correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
|
||||
sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
tru64)
|
||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
||||
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
|
||||
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
||||
# dependencies in `foo.d' instead, so we check for that too.
|
||||
# Subdirectories are respected.
|
||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||
test "x$dir" = "x$object" && dir=
|
||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||
|
||||
if test "$libtool" = yes; then
|
||||
tmpdepfile1="$dir.libs/$base.lo.d"
|
||||
tmpdepfile2="$dir.libs/$base.d"
|
||||
"$@" -Wc,-MD
|
||||
else
|
||||
tmpdepfile1="$dir$base.o.d"
|
||||
tmpdepfile2="$dir$base.d"
|
||||
"$@" -MD
|
||||
fi
|
||||
|
||||
stat=$?
|
||||
if test $stat -eq 0; then :
|
||||
else
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
if test -f "$tmpdepfile1"; then
|
||||
tmpdepfile="$tmpdepfile1"
|
||||
else
|
||||
tmpdepfile="$tmpdepfile2"
|
||||
fi
|
||||
if test -f "$tmpdepfile"; then
|
||||
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
||||
# That's a space and a tab in the [].
|
||||
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
||||
else
|
||||
echo "#dummy" > "$depfile"
|
||||
fi
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
#nosideeffect)
|
||||
# This comment above is used by automake to tell side-effect
|
||||
# dependency tracking mechanisms from slower ones.
|
||||
|
||||
dashmstdout)
|
||||
# Important note: in order to support this mode, a compiler *must*
|
||||
# always write the proprocessed file to stdout, regardless of -o.
|
||||
"$@" || exit $?
|
||||
|
||||
# Remove the call to Libtool.
|
||||
if test "$libtool" = yes; then
|
||||
while test $1 != '--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
|
||||
# Remove `-o $object'.
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
case $arg in
|
||||
-o)
|
||||
shift
|
||||
;;
|
||||
$object)
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"
|
||||
shift # fnord
|
||||
shift # $arg
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
test -z "$dashmflag" && dashmflag=-M
|
||||
# Require at least two characters before searching for `:'
|
||||
# in the target name. This is to cope with DOS-style filenames:
|
||||
# a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
|
||||
"$@" $dashmflag |
|
||||
sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
cat < "$tmpdepfile" > "$depfile"
|
||||
tr ' ' '
|
||||
' < "$tmpdepfile" | \
|
||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||
## correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
dashXmstdout)
|
||||
# This case only exists to satisfy depend.m4. It is never actually
|
||||
# run, as this mode is specially recognized in the preamble.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
makedepend)
|
||||
"$@" || exit $?
|
||||
# Remove any Libtool call
|
||||
if test "$libtool" = yes; then
|
||||
while test $1 != '--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
# X makedepend
|
||||
shift
|
||||
cleared=no
|
||||
for arg in "$@"; do
|
||||
case $cleared in
|
||||
no)
|
||||
set ""; shift
|
||||
cleared=yes ;;
|
||||
esac
|
||||
case "$arg" in
|
||||
-D*|-I*)
|
||||
set fnord "$@" "$arg"; shift ;;
|
||||
# Strip any option that makedepend may not understand. Remove
|
||||
# the object too, otherwise makedepend will parse it as a source file.
|
||||
-*|$object)
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"; shift ;;
|
||||
esac
|
||||
done
|
||||
obj_suffix="`echo $object | sed 's/^.*\././'`"
|
||||
touch "$tmpdepfile"
|
||||
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
||||
rm -f "$depfile"
|
||||
cat < "$tmpdepfile" > "$depfile"
|
||||
sed '1,2d' "$tmpdepfile" | tr ' ' '
|
||||
' | \
|
||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||
## correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
||||
;;
|
||||
|
||||
cpp)
|
||||
# Important note: in order to support this mode, a compiler *must*
|
||||
# always write the proprocessed file to stdout.
|
||||
"$@" || exit $?
|
||||
|
||||
# Remove the call to Libtool.
|
||||
if test "$libtool" = yes; then
|
||||
while test $1 != '--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
|
||||
# Remove `-o $object'.
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
case $arg in
|
||||
-o)
|
||||
shift
|
||||
;;
|
||||
$object)
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"
|
||||
shift # fnord
|
||||
shift # $arg
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
"$@" -E |
|
||||
sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
|
||||
sed '$ s: \\$::' > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
cat < "$tmpdepfile" >> "$depfile"
|
||||
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
msvisualcpp)
|
||||
# Important note: in order to support this mode, a compiler *must*
|
||||
# always write the proprocessed file to stdout, regardless of -o,
|
||||
# because we must use -o when running libtool.
|
||||
"$@" || exit $?
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
case "$arg" in
|
||||
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
||||
set fnord "$@"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
"$@" -E |
|
||||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
|
||||
echo " " >> "$depfile"
|
||||
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
none)
|
||||
exec "$@"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Unknown depmode $depmode" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
1123
gcc/ChangeLog
1123
gcc/ChangeLog
File diff suppressed because it is too large
Load Diff
19338
gcc/ChangeLog.tree-ssa
Normal file
19338
gcc/ChangeLog.tree-ssa
Normal file
File diff suppressed because it is too large
Load Diff
256
gcc/Makefile.in
256
gcc/Makefile.in
@ -140,7 +140,7 @@ XCFLAGS =
|
||||
TCFLAGS =
|
||||
CFLAGS = -g
|
||||
STAGE1_CFLAGS = -g @stage1_cflags@
|
||||
BOOT_CFLAGS = -g -O2
|
||||
BOOT_CFLAGS = -g -O2
|
||||
|
||||
# Flags to determine code coverage. When coverage is disabled, this will
|
||||
# contain the optimization flags, as you normally want code coverage
|
||||
@ -192,6 +192,14 @@ c-parse.o-warn = -Wno-error
|
||||
gengtype-lex.o-warn = -Wno-error
|
||||
# SYSCALLS.c misses prototypes
|
||||
SYSCALLS.c.X-warn = -Wno-strict-prototypes -Wno-error
|
||||
# These files need -Wno-error because the gimplifier triggers hard to fix
|
||||
# warnings when converting to GIMPLE form. The warnings are triggered because
|
||||
# moving the condition into the loop prevents the loop optimizer from
|
||||
# recognizing that the loop will always be executed at least once. We need
|
||||
# a new loop optimizer.
|
||||
reload1.o-warn = -Wno-error
|
||||
# These warnings are due to libbanshee.
|
||||
tree-alias-ander.o-warn = -Wno-error
|
||||
|
||||
# All warnings have to be shut off in stage1 if the compiler used then
|
||||
# isn't gcc; configure determines that. WARN_CFLAGS will be either
|
||||
@ -270,6 +278,12 @@ OUTPUT_OPTION = @OUTPUT_OPTION@
|
||||
ZLIB = @zlibdir@ -lz
|
||||
ZLIBINC = @zlibinc@
|
||||
|
||||
# How to find GMP
|
||||
GMPLIBS = @GMPLIBS@
|
||||
GMPINC = @GMPINC@
|
||||
|
||||
BANSHEELIB = @BANSHEELIB@
|
||||
BANSHEEINC = @BANSHEEINC@
|
||||
# Substitution type for target's getgroups 2nd arg.
|
||||
TARGET_GETGROUPS_T = @TARGET_GETGROUPS_T@
|
||||
|
||||
@ -687,6 +701,11 @@ C_TREE_H = c-tree.h $(C_COMMON_H)
|
||||
SYSTEM_H = system.h hwint.h $(srcdir)/../include/libiberty.h
|
||||
PREDICT_H = predict.h predict.def
|
||||
CPPLIB_H = cpplib.h line-map.h
|
||||
TREE_DUMP_H = tree-dump.h $(SPLAY_TREE_H)
|
||||
TREE_SIMPLE_H = tree-simple.h tree-iterator.h
|
||||
TREE_FLOW_H = tree-flow.h tree-flow-inline.h tree-ssa-operands.h \
|
||||
bitmap.h $(BASIC_BLOCK_H) hard-reg-set.h $(TREE_SIMPLE_H) \
|
||||
$(HASHTAB_H)
|
||||
PRETTY_PRINT_H = pretty-print.h input.h $(OBSTACK_H)
|
||||
DIAGNOSTIC_H = diagnostic.h diagnostic.def $(PRETTY_PRINT_H)
|
||||
C_PRETTY_PRINT_H = $(PRETTY_PRINT_H) $(C_COMMON_H) $(TREE_H)
|
||||
@ -713,7 +732,7 @@ LIBIBERTY = ../libiberty/libiberty.a
|
||||
BUILD_LIBIBERTY = @FORBUILD@/libiberty/libiberty.a
|
||||
|
||||
# Dependencies on the intl and portability libraries.
|
||||
LIBDEPS= $(LIBIBERTY) $(LIBINTL_DEP) $(LIBICONV_DEP) libcpp.a
|
||||
LIBDEPS= $(LIBIBERTY) $(LIBINTL_DEP) $(LIBICONV_DEP) libcpp.a $(BANSHEELIB)
|
||||
|
||||
# Likewise, for use in the tools that must run on this machine
|
||||
# even if we are cross-building GCC.
|
||||
@ -721,7 +740,7 @@ BUILD_LIBDEPS= $(BUILD_LIBIBERTY)
|
||||
|
||||
# How to link with both our special library facilities
|
||||
# and the system's installed libraries.
|
||||
LIBS = @LIBS@ libcpp.a $(LIBIBERTY) $(LIBINTL) $(LIBICONV)
|
||||
LIBS = @LIBS@ libcpp.a $(LIBIBERTY) $(LIBINTL) $(LIBICONV) $(BANSHEELIB)
|
||||
|
||||
# Any system libraries needed just for GNAT.
|
||||
SYSLIBS = @GNAT_LIBEXC@
|
||||
@ -750,7 +769,8 @@ BUILD_VARRAY = $(BUILD_PREFIX)varray.o
|
||||
# currently being compiled, in both source trees, to be examined as well.
|
||||
# libintl.h will be found in ../intl if we are using the included libintl.
|
||||
INCLUDES = -I. -I$(@D) -I$(srcdir) -I$(srcdir)/$(@D) \
|
||||
-I$(srcdir)/../include @INCINTL@
|
||||
-I$(srcdir)/../include @INCINTL@ \
|
||||
$(BANSHEEINC) $(GMPINC)
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< $(OUTPUT_OPTION)
|
||||
@ -838,14 +858,23 @@ CXX_TARGET_OBJS=@cxx_target_objs@
|
||||
C_AND_OBJC_OBJS = attribs.o c-errors.o c-lex.o c-pragma.o c-decl.o c-typeck.o \
|
||||
c-convert.o c-aux-info.o c-common.o c-opts.o c-format.o c-semantics.o \
|
||||
c-incpath.o cppdefault.o c-ppoutput.o c-cppbuiltin.o prefix.o \
|
||||
c-objc-common.o c-dump.o c-pch.o $(C_TARGET_OBJS)
|
||||
c-objc-common.o c-dump.o c-pch.o $(C_TARGET_OBJS) \
|
||||
c-simplify.o tree-mudflap.o c-mudflap.o c-pretty-print.o
|
||||
|
||||
# Language-specific object files for C.
|
||||
C_OBJS = c-parse.o c-lang.o c-pretty-print.o stub-objc.o $(C_AND_OBJC_OBJS)
|
||||
C_OBJS = c-parse.o c-lang.o stub-objc.o $(C_AND_OBJC_OBJS)
|
||||
|
||||
# Language-independent object files.
|
||||
|
||||
OBJS-common = \
|
||||
tree-cfg.o tree-dfa.o tree-eh.o tree-ssa.o tree-optimize.o tree-simple.o \
|
||||
tree-alias-type.o gimplify.o tree-pretty-print.o tree-into-ssa.o \
|
||||
tree-outof-ssa.o tree-alias-common.o tree-ssa-ccp.o \
|
||||
@ANDER@ tree-ssa-dce.o tree-ssa-copy.o tree-nrv.o tree-ssa-copyrename.o \
|
||||
tree-ssa-pre.o tree-ssa-live.o tree-ssa-operands.o tree-ssa-alias.o \
|
||||
tree-ssa-phiopt.o tree-ssa-forwprop.o tree-nested.o tree-ssa-dse.o \
|
||||
tree-ssa-dom.o domwalk.o tree-tailcall.o gimple-low.o tree-iterator.o \
|
||||
tree-phinodes.o tree-ssanames.o tree-sra.o tree-complex.o tree-ssa-loop.o \
|
||||
alias.o bb-reorder.o bitmap.o builtins.o caller-save.o calls.o \
|
||||
cfg.o cfganal.o cfgbuild.o cfgcleanup.o cfglayout.o cfgloop.o \
|
||||
cfgloopanal.o cfgloopmanip.o loop-init.o loop-unswitch.o loop-unroll.o \
|
||||
@ -863,14 +892,15 @@ OBJS-common = \
|
||||
real.o recog.o reg-stack.o regclass.o regmove.o regrename.o \
|
||||
reload.o reload1.o reorg.o resource.o rtl.o rtlanal.o rtl-error.o \
|
||||
sbitmap.o sched-deps.o sched-ebb.o sched-rgn.o sched-vis.o sdbout.o \
|
||||
sibcall.o simplify-rtx.o sreal.o stmt.o stor-layout.o stringpool.o \
|
||||
simplify-rtx.o sreal.o stmt.o stor-layout.o stringpool.o \
|
||||
targhooks.o timevar.o toplev.o tracer.o tree.o tree-dump.o unroll.o \
|
||||
varasm.o varray.o version.o vmsdbgout.o xcoffout.o alloc-pool.o \
|
||||
et-forest.o cfghooks.o bt-load.o pretty-print.o $(GGC) web.o passes.o
|
||||
et-forest.o cfghooks.o bt-load.o pretty-print.o $(GGC) web.o passes.o \
|
||||
rtl-profile.o tree-profile.o
|
||||
|
||||
OBJS-md = $(out_object_file)
|
||||
OBJS-archive = $(EXTRA_OBJS) $(host_hook_obj) hashtable.o tree-inline.o \
|
||||
tree-optimize.o cgraph.o cgraphunit.o
|
||||
cgraph.o cgraphunit.o tree-nomudflap.o
|
||||
|
||||
OBJS = $(OBJS-common) $(out_object_file) $(OBJS-archive)
|
||||
|
||||
@ -1125,9 +1155,9 @@ $(SPECS): xgcc$(exeext)
|
||||
gcc-cross: xgcc$(exeext)
|
||||
cp xgcc$(exeext) gcc-cross$(exeext)
|
||||
|
||||
cc1$(exeext): $(C_OBJS) $(BACKEND) $(LIBDEPS)
|
||||
cc1$(exeext): $(C_OBJS) $(BACKEND) $(LIBDEPS) @TREEBROWSER@
|
||||
$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o cc1$(exeext) \
|
||||
$(C_OBJS) $(BACKEND) $(LIBS)
|
||||
$(C_OBJS) @TREEBROWSER@ $(BACKEND) $(LIBS)
|
||||
|
||||
# Build the version of limits.h that we will install.
|
||||
xlimits.h: glimits.h limitx.h limity.h
|
||||
@ -1308,7 +1338,7 @@ c-decl.o : c-decl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
|
||||
$(RTL_H) $(C_TREE_H) $(GGC_H) $(TARGET_H) flags.h function.h output.h \
|
||||
$(EXPR_H) debug.h toplev.h intl.h $(TM_P_H) tree-inline.h $(TIMEVAR_H) \
|
||||
opts.h c-pragma.h gt-c-decl.h cgraph.h $(HASHTAB_H) libfuncs.h except.h \
|
||||
$(LANGHOOKS_DEF_H)
|
||||
$(LANGHOOKS_DEF_H) $(TREE_DUMP_H)
|
||||
c-typeck.o : c-typeck.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(C_TREE_H) \
|
||||
$(TARGET_H) flags.h intl.h output.h $(EXPR_H) $(RTL_H) toplev.h $(TM_P_H) \
|
||||
langhooks.h
|
||||
@ -1361,9 +1391,10 @@ c-common.o : c-common.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
|
||||
$(OBSTACK_H) $(C_COMMON_H) flags.h toplev.h output.h c-pragma.h intl.h \
|
||||
$(GGC_H) $(EXPR_H) $(TM_P_H) builtin-types.def builtin-attrs.def \
|
||||
$(DIAGNOSTIC_H) gt-c-common.h langhooks.h varray.h $(RTL_H) \
|
||||
$(TARGET_H) $(C_TREE_H) langhooks.h
|
||||
$(TARGET_H) $(C_TREE_H) tree-iterator.h langhooks.h
|
||||
c-pretty-print.o : c-pretty-print.c $(C_PRETTY_PRINT_H) \
|
||||
$(C_COMMON_H) $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) real.h
|
||||
$(C_COMMON_H) $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) real.h \
|
||||
$(DIAGNOSTIC_H)
|
||||
|
||||
c-opts.o : c-opts.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
|
||||
$(TREE_H) c-pragma.h flags.h toplev.h langhooks.h \
|
||||
@ -1390,7 +1421,7 @@ c-semantics.o : c-semantics.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE
|
||||
$(EXPR_H) $(PREDICT_H) tree-inline.h
|
||||
|
||||
c-dump.o : c-dump.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
|
||||
$(C_TREE_H) tree-dump.h
|
||||
$(C_TREE_H) $(TREE_DUMP_H)
|
||||
|
||||
c-pch.o : c-pch.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(CPPLIB_H) $(TREE_H) \
|
||||
$(C_COMMON_H) output.h toplev.h c-pragma.h $(GGC_H) debug.h \
|
||||
@ -1476,7 +1507,7 @@ version.o: version.c version.h
|
||||
gtype-desc.o: gtype-desc.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) varray.h \
|
||||
$(HASHTAB_H) $(TREE_H) $(RTL_H) function.h insn-config.h $(EXPR_H) $(OPTABS_H) \
|
||||
libfuncs.h debug.h $(GGC_H) bitmap.h $(BASIC_BLOCK_H) hard-reg-set.h \
|
||||
cselib.h insn-addr.h
|
||||
cselib.h insn-addr.h $(TREE_FLOW_H)
|
||||
|
||||
ggc-common.o: ggc-common.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(GGC_H) \
|
||||
$(HASHTAB_H) toplev.h $(PARAMS_H) hosthooks.h
|
||||
@ -1506,22 +1537,149 @@ langhooks.o : langhooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H)
|
||||
$(LANGHOOKS_DEF_H) flags.h $(GGC_H) gt-langhooks.h diagnostic.h
|
||||
tree.o : tree.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) flags.h function.h \
|
||||
toplev.h $(GGC_H) $(HASHTAB_H) $(TARGET_H) output.h $(TM_P_H) langhooks.h \
|
||||
real.h gt-tree.h
|
||||
real.h gt-tree.h tree-iterator.h $(BASIC_BLOCK_H) $(TREE_FLOW_H)
|
||||
tree-dump.o: tree-dump.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
|
||||
$(C_TREE_H) flags.h langhooks.h toplev.h output.h c-pragma.h $(RTL_H) $(GGC_H) \
|
||||
$(EXPR_H) $(SPLAY_TREE_H) tree-dump.h
|
||||
$(EXPR_H) $(SPLAY_TREE_H) $(TREE_DUMP_H)
|
||||
tree-inline.o : tree-inline.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
|
||||
$(TREE_H) $(RTL_H) $(EXPR_H) flags.h $(PARAMS_H) input.h insn-config.h \
|
||||
$(INTEGRATE_H) $(VARRAY_H) $(HASHTAB_H) $(SPLAY_TREE_H) toplev.h \
|
||||
langhooks.h $(C_COMMON_H) tree-inline.h cgraph.h intl.h function.h
|
||||
tree-optimize.o : tree-optimize.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
|
||||
$(TREE_H) toplev.h langhooks.h cgraph.h $(TIMEVAR_H) function.h $(GGC_H)
|
||||
|
||||
langhooks.h $(C_COMMON_H) tree-inline.h cgraph.h intl.h function.h \
|
||||
$(TREE_SIMPLE_H)
|
||||
print-tree.o : print-tree.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
|
||||
$(GGC_H) langhooks.h real.h
|
||||
stor-layout.o : stor-layout.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
|
||||
flags.h function.h $(EXPR_H) $(RTL_H) toplev.h $(GGC_H) $(TM_P_H) $(TARGET_H) \
|
||||
langhooks.h
|
||||
tree-alias-type.o: tree-alias-type.c tree-alias-type.h $(SYSTEM_H) $(CONFIG_H) \
|
||||
$(GGC_H) $(TM_H) coretypes.h $(VARRAY_H)
|
||||
tree-alias-ander.o: tree-alias-ander.c tree-alias-ander.h $(SYSTEM_H) \
|
||||
$(CONFIG_H) $(GGC_H) $(TREE_H) $(TREE_FLOW_H) tree-alias-common.h \
|
||||
$(TM_H) coretypes.h cgraph.h tree-pass.h
|
||||
tree-alias-common.o: tree-alias-common.c tree-alias-common.h $(SYSTEM_H) \
|
||||
$(CONFIG_H) $(GGC_H) $(TREE_H) gt-tree-alias-common.h $(TREE_FLOW_H) \
|
||||
$(TM_H) coretypes.h cgraph.h tree-pass.h $(TIMEVAR_H)
|
||||
tree-ssa.o : tree-ssa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
|
||||
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) output.h diagnostic.h \
|
||||
errors.h toplev.h function.h $(TIMEVAR_H) tree-alias-common.h \
|
||||
$(TM_H) coretypes.h $(TREE_DUMP_H) langhooks.h cfgloop.h \
|
||||
tree-pass.h
|
||||
tree-into-ssa.o : tree-into-ssa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
|
||||
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) output.h diagnostic.h \
|
||||
errors.h toplev.h function.h $(TIMEVAR_H) tree-alias-common.h \
|
||||
$(TM_H) coretypes.h $(TREE_DUMP_H) langhooks.h domwalk.h tree-pass.h
|
||||
tree-outof-ssa.o : tree-outof-ssa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
|
||||
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) output.h diagnostic.h \
|
||||
errors.h toplev.h function.h $(TIMEVAR_H) tree-alias-common.h \
|
||||
$(TM_H) coretypes.h $(TREE_DUMP_H) langhooks.h domwalk.h \
|
||||
tree-pass.h tree-ssa-live.h
|
||||
tree-ssa-dse.o : tree-ssa-dse.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
|
||||
$(TM_H) errors.h $(GGC_H) $(TREE_H) $(RTL_H) $(TM_P_H) $(BASIC_BLOCK_H) \
|
||||
$(TREE_FLOW_H) tree-pass.h $(TREE_DUMP_H) domwalk.h flags.h
|
||||
tree-ssa-forwprop.o : tree-ssa-forwprop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
|
||||
$(TM_H) errors.h $(GGC_H) $(TREE_H) $(RTL_H) $(TM_P_H) $(BASIC_BLOCK_H) \
|
||||
$(TREE_FLOW_H) tree-pass.h $(TREE_DUMP_H)
|
||||
tree-ssa-phiopt.o : tree-ssa-phiopt.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
|
||||
$(TM_H) errors.h $(GGC_H) $(TREE_H) $(RTL_H) $(TM_P_H) $(BASIC_BLOCK_H) \
|
||||
$(TREE_FLOW_H) tree-pass.h $(TREE_DUMP_H) langhooks.h
|
||||
tree-nrv.o : tree-nrv.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
|
||||
$(TM_H) $(TREE_H) $(RTL_H) function.h $(BASIC_BLOCK_H) $(EXPR_H) \
|
||||
diagnostic.h $(TREE_FLOW_H) $(TIMEVAR_H) $(TREE_DUMP_H) tree-pass.h \
|
||||
langhooks.h
|
||||
tree-ssa-copy.o : tree-ssa-copy.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
|
||||
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h diagnostic.h \
|
||||
errors.h function.h $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
|
||||
$(BASIC_BLOCK_H) tree-pass.h langhooks.h
|
||||
tree-ssa-dom.o : tree-ssa-dom.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
|
||||
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h diagnostic.h \
|
||||
errors.h function.h $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
|
||||
$(BASIC_BLOCK_H) domwalk.h real.h tree-pass.h flags.h langhooks.h
|
||||
tree-ssanames.o : tree-ssanames.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
|
||||
$(TM_H) $(TREE_H) varray.h $(GGC_H) gt-tree-ssanames.h
|
||||
tree-phinodes.o : tree-phinodes.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
|
||||
$(TM_H) $(TREE_H) varray.h $(GGC_H) $(BASIC_BLOCK_H) $(TREE_FLOW_H) \
|
||||
gt-tree-phinodes.h $(RTL_H)
|
||||
domwalk.o : domwalk.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
|
||||
$(TREE_H) $(BASIC_BLOCK_H) $(TREE_FLOW_H) domwalk.h $(GGC_H)
|
||||
tree-ssa-live.o : tree-ssa-live.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
|
||||
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h diagnostic.h \
|
||||
errors.h toplev.h function.h $(TIMEVAR_H) tree-alias-common.h \
|
||||
$(TM_H) coretypes.h $(TREE_DUMP_H) tree-ssa-live.h
|
||||
tree-ssa-copyrename.o : tree-ssa-copyrename.c $(TREE_FLOW_H) $(CONFIG_H) \
|
||||
$(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h \
|
||||
diagnostic.h errors.h toplev.h function.h $(TIMEVAR_H) tree-pass.h \
|
||||
tree-alias-common.h $(TM_H) coretypes.h $(TREE_DUMP_H) tree-ssa-live.h
|
||||
tree-ssa-pre.o : tree-ssa-pre.c $(TREE_FLOW_H) $(CONFIG_H) \
|
||||
$(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) \
|
||||
$(GGC_H) output.h diagnostic.h errors.h toplev.h $(TIMEVAR_H) \
|
||||
$(TM_H) coretypes.h $(TREE_DUMP_H) tree-pass.h flags.h
|
||||
tree-cfg.o : tree-cfg.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
|
||||
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) flags.h output.h \
|
||||
diagnostic.h errors.h function.h $(TIMEVAR_H) $(TM_H) coretypes.h \
|
||||
$(TREE_DUMP_H) except.h langhooks.h cfgloop.h gt-tree-cfg.h tree-pass.h
|
||||
tree-tailcall.o : tree-tailcall.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
|
||||
$(RTL_H) $(TREE_H) $(TM_P_H) function.h $(TM_H) coretypes.h \
|
||||
$(TREE_DUMP_H) diagnostic.h except.h tree-pass.h flags.h langhooks.h
|
||||
tree-nested.o: tree-nested.c $(CONFIG_H) $(SYSTEM_H) $(TM_H) $(TREE_H) \
|
||||
$(RTL_H) $(TM_P_H) function.h tree-dump.h tree-inline.h tree-iterator.h \
|
||||
tree-simple.h cgraph.h $(EXPR_H) langhooks.h $(GGC_H) gt-tree-nested.h
|
||||
tree-iterator.o : tree-iterator.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \
|
||||
coretypes.h $(GGC_H) tree-iterator.h tree-simple.h gt-tree-iterator.h
|
||||
tree-dfa.o : tree-dfa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
|
||||
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h diagnostic.h \
|
||||
errors.h tree-inline.h $(HASHTAB_H) flags.h function.h $(TIMEVAR_H) \
|
||||
tree-alias-common.h convert.h $(TM_H) coretypes.h langhooks.h \
|
||||
$(TREE_DUMP_H) tree-pass.h params.h
|
||||
tree-ssa-operands.o : tree-ssa-operands.c $(TREE_FLOW_H) $(CONFIG_H) \
|
||||
$(SYSTEM_H) $(TREE_H) $(TM_P_H) $(GGC_H) diagnostic.h \
|
||||
tree-inline.h flags.h function.h $(TM_H) $(TIMEVAR_H) tree-pass.h
|
||||
tree-eh.o : tree-eh.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
|
||||
$(RTL_H) $(TREE_H) $(TM_H) flags.h function.h except.h langhooks.h \
|
||||
$(GGC_H) tree-pass.h gt-tree-eh.h
|
||||
tree-ssa-loop.o : tree-ssa-loop.c $(TREE_FLOW_H) $(CONFIG_H) \
|
||||
$(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) cfgloop.h \
|
||||
output.h diagnostic.h $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
|
||||
tree-pass.h flags.h tree-inline.h
|
||||
tree-ssa-alias.o : tree-ssa-alias.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
|
||||
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) tree-inline.h flags.h \
|
||||
function.h $(TIMEVAR_H) tree-alias-common.h convert.h $(TM_H) coretypes.h \
|
||||
langhooks.h $(TREE_DUMP_H) tree-pass.h params.h
|
||||
tree-optimize.o : tree-optimize.c $(TREE_FLOW_H) $(CONFIG_H) \
|
||||
$(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) \
|
||||
$(GGC_H) output.h diagnostic.h errors.h flags.h tree-alias-common.h \
|
||||
$(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) toplev.h function.h \
|
||||
langhooks.h flags.h cgraph.h tree-inline.h tree-mudflap.h $(GGC_H) \
|
||||
cgraph.h tree-pass.h
|
||||
c-simplify.o : c-simplify.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) errors.h \
|
||||
$(C_TREE_H) $(C_COMMON_H) diagnostic.h $(TREE_SIMPLE_H) varray.h flags.h \
|
||||
langhooks.h toplev.h rtl.h $(TREE_FLOW_H) langhooks-def.h \
|
||||
$(TM_H) coretypes.h $(C_PRETTY_PRINT_H) cgraph.h
|
||||
gimplify.o : gimplify.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) errors.h \
|
||||
diagnostic.h $(TREE_SIMPLE_H) tree-inline.h varray.h langhooks.h \
|
||||
langhooks-def.h $(TREE_FLOW_H) $(TIMEVAR_H) $(TM_H) coretypes.h except.h \
|
||||
flags.h $(RTL_H) function.h $(EXPR_H) output.h $(GGC_H) gt-gimplify.h
|
||||
gimple-low.o : gimple-low.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) errors.h \
|
||||
diagnostic.h $(TREE_SIMPLE_H) tree-inline.h varray.h langhooks.h \
|
||||
langhooks-def.h $(TREE_FLOW_H) $(TIMEVAR_H) $(TM_H) coretypes.h except.h \
|
||||
flags.h $(RTL_H) function.h tree-pass.h
|
||||
tree-browser.o : tree-browser.c tree-browser.def $(CONFIG_H) $(SYSTEM_H) \
|
||||
$(TREE_H) errors.h tree-inline.h diagnostic.h $(HASHTAB_H) \
|
||||
$(TM_H) coretypes.h
|
||||
tree-simple.o : tree-simple.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(EXPR_H) \
|
||||
$(RTL_H) $(TREE_SIMPLE_H) $(TM_H) coretypes.h bitmap.h $(GGC_H)
|
||||
tree-mudflap.o : $(CONFIG_H) errors.h $(SYSTEM_H) $(TREE_H) tree-inline.h \
|
||||
$(C_TREE_H) $(C_COMMON_H) $(TREE_SIMPLE_H) diagnostic.h $(HASHTAB_H) \
|
||||
output.h varray.h langhooks.h tree-mudflap.h $(TM_H) coretypes.h \
|
||||
$(TREE_DUMP_H) tree-pass.h
|
||||
c-mudflap.o : $(CONFIG_H) errors.h $(SYSTEM_H) $(TREE_H) tree-inline.h \
|
||||
$(C_TREE_H) $(C_COMMON_H) $(TREE_SIMPLE_H) diagnostic.h $(HASHTAB_H) \
|
||||
output.h varray.h langhooks.h tree-mudflap.h $(TM_H) coretypes.h
|
||||
tree-nomudflap.o : $(CONFIG_H) errors.h $(SYSTEM_H) $(TREE_H) tree-inline.h \
|
||||
$(C_TREE_H) $(C_COMMON_H) $(TREE_SIMPLE_H) diagnostic.h $(HASHTAB_H) \
|
||||
output.h varray.h langhooks.h tree-mudflap.h $(TM_H) coretypes.h
|
||||
tree-pretty-print.o : tree-pretty-print.c $(CONFIG_H) $(SYSTEM_H) \
|
||||
errors.h $(TREE_H) diagnostic.h real.h $(HASHTAB_H) $(TREE_FLOW_H) \
|
||||
$(TM_H) coretypes.h tree-iterator.h
|
||||
fold-const.o : fold-const.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
|
||||
$(TREE_H) flags.h real.h toplev.h $(HASHTAB_H) $(EXPR_H) $(RTL_H) $(GGC_H) \
|
||||
$(TM_P_H) langhooks.h $(MD5_H)
|
||||
@ -1584,7 +1742,7 @@ varasm.o : varasm.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(RTL_
|
||||
function.o : function.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) \
|
||||
flags.h function.h $(EXPR_H) $(OPTABS_H) libfuncs.h $(REGS_H) hard-reg-set.h \
|
||||
insn-config.h $(RECOG_H) output.h toplev.h except.h $(HASHTAB_H) $(GGC_H) \
|
||||
$(TM_P_H) langhooks.h gt-function.h $(TARGET_H)
|
||||
$(TM_P_H) langhooks.h gt-function.h $(TARGET_H) basic-block.h
|
||||
stmt.o : stmt.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) flags.h \
|
||||
function.h insn-config.h hard-reg-set.h $(EXPR_H) libfuncs.h except.h \
|
||||
$(LOOP_H) $(RECOG_H) toplev.h output.h varray.h $(GGC_H) $(TM_P_H) \
|
||||
@ -1597,7 +1755,8 @@ except.o : except.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
|
||||
expr.o : expr.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) flags.h \
|
||||
function.h $(REGS_H) $(EXPR_H) $(OPTABS_H) libfuncs.h $(INSN_ATTR_H) insn-config.h \
|
||||
$(RECOG_H) output.h typeclass.h hard-reg-set.h toplev.h hard-reg-set.h \
|
||||
except.h reload.h $(GGC_H) langhooks.h intl.h $(TM_P_H) real.h $(TARGET_H)
|
||||
except.h reload.h $(GGC_H) langhooks.h intl.h $(TM_P_H) real.h $(TARGET_H) \
|
||||
tree-iterator.h
|
||||
dojump.o : dojump.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) \
|
||||
flags.h function.h $(EXPR_H) $(OPTABS_H) $(INSN_ATTR_H) insn-config.h \
|
||||
langhooks.h $(GGC_H) gt-dojump.h
|
||||
@ -1680,14 +1839,26 @@ gcse.o : gcse.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(REGS_H) \
|
||||
hard-reg-set.h flags.h real.h insn-config.h $(GGC_H) $(RECOG_H) $(EXPR_H) \
|
||||
$(BASIC_BLOCK_H) function.h output.h toplev.h $(TM_P_H) $(PARAMS_H) \
|
||||
except.h gt-gcse.h $(TREE_H) cselib.h
|
||||
sibcall.o : sibcall.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(REGS_H) \
|
||||
function.h hard-reg-set.h flags.h insn-config.h $(RECOG_H) $(BASIC_BLOCK_H)
|
||||
resource.o : resource.c $(CONFIG_H) $(RTL_H) hard-reg-set.h $(SYSTEM_H) coretypes.h \
|
||||
$(TM_H) $(BASIC_BLOCK_H) $(REGS_H) flags.h output.h resource.h function.h toplev.h \
|
||||
$(INSN_ATTR_H) except.h $(PARAMS_H) $(TM_P_H)
|
||||
lcm.o : lcm.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(REGS_H) \
|
||||
hard-reg-set.h flags.h real.h insn-config.h $(INSN_ATTR_H) $(RECOG_H) $(EXPR_H) \
|
||||
$(BASIC_BLOCK_H) $(TM_P_H) df.h function.h
|
||||
tree-ssa-dce.o : tree-ssa-dce.c $(CONFIG_H) system.h errors.h $(TREE_H) \
|
||||
$(RTL_H) $(TM_P_H) $(TREE_FLOW_H) diagnostic.h $(TIMEVAR_H) $(TM_H) \
|
||||
coretypes.h $(TREE_DUMP_H) tree-pass.h flags.h
|
||||
tree-ssa-ccp.o : tree-ssa-ccp.c $(CONFIG_H) system.h errors.h $(TREE_H) \
|
||||
$(RTL_H) $(TM_P_H) $(TREE_FLOW_H) diagnostic.h tree-inline.h \
|
||||
$(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) $(TREE_SIMPLE_H) \
|
||||
$(EXPR_H) tree-pass.h flags.h langhooks.h
|
||||
tree-sra.o : tree-sra.c $(CONFIG_H) system.h errors.h $(TREE_H) $(RTL_H) \
|
||||
$(TM_P_H) $(TREE_FLOW_H) diagnostic.h tree-inline.h \
|
||||
$(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) $(TREE_SIMPLE_H) \
|
||||
langhooks.h tree-pass.h flags.h
|
||||
tree-complex.o : tree-complex.c $(CONFIG_H) system.h $(TREE_H) \
|
||||
$(TM_H) $(TREE_FLOW_H) $(TREE_SIMPLE_H) tree-iterator.h tree-pass.h \
|
||||
flags.h
|
||||
df.o : df.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
|
||||
insn-config.h $(RECOG_H) function.h $(REGS_H) alloc-pool.h hard-reg-set.h \
|
||||
$(BASIC_BLOCK_H) df.h $(FIBHEAP_H)
|
||||
@ -1698,7 +1869,14 @@ conflict.o : conflict.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(OBSTACK_H)
|
||||
$(HASHTAB_H) $(RTL_H) hard-reg-set.h $(BASIC_BLOCK_H)
|
||||
profile.o : profile.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
|
||||
$(TREE_H) flags.h output.h $(REGS_H) $(EXPR_H) function.h \
|
||||
toplev.h $(BASIC_BLOCK_H) $(COVERAGE_H) $(TREE_H) value-prof.h
|
||||
toplev.h $(BASIC_BLOCK_H) $(COVERAGE_H) $(TREE_FLOW_H) value-prof.h
|
||||
tree-profile.o : tree-profile.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
|
||||
$(TM_H) $(RTL_H) $(TREE_H) flags.h output.h $(REGS_H) $(EXPR_H) function.h \
|
||||
toplev.h $(BASIC_BLOCK_H) $(COVERAGE_H) $(TREE_H) value-prof.h \
|
||||
tree-pass.h $(TREE_FLOW_H) $(TIMEVAR_H)
|
||||
rtl-profile.o : tree-profile.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
|
||||
$(TM_H) $(RTL_H) $(TREE_H) flags.h output.h $(REGS_H) $(EXPR_H) function.h \
|
||||
toplev.h $(BASIC_BLOCK_H) $(COVERAGE_H) $(TREE_FLOW_H) value-prof.h
|
||||
value-prof.o : value-prof.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
|
||||
$(BASIC_BLOCK_H) hard-reg-set.h value-prof.h $(EXPR_H) output.h flags.h \
|
||||
$(RECOG_H) insn-config.h $(OPTABS_H) $(REGS_H)
|
||||
@ -1719,9 +1897,9 @@ flow.o : flow.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) \
|
||||
$(RECOG_H) function.h except.h $(EXPR_H) $(GGC_H) $(TM_P_H)
|
||||
cfg.o : cfg.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) flags.h insn-config.h \
|
||||
$(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h output.h toplev.h $(RECOG_H) \
|
||||
function.h except.h $(GGC_H) $(TM_P_H) alloc-pool.h
|
||||
function.h except.h $(GGC_H) $(TM_P_H) alloc-pool.h $(TIMEVAR_H)
|
||||
cfghooks.o: cfghooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) \
|
||||
$(BASIC_BLOCK_H) cfglayout.h $(TIMEVAR_H) toplev.h
|
||||
$(BASIC_BLOCK_H) cfglayout.h $(TREE_FLOW_H) $(TIMEVAR_H) toplev.h
|
||||
cfgrtl.o : cfgrtl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) flags.h \
|
||||
insn-config.h $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h output.h toplev.h $(RECOG_H) \
|
||||
function.h except.h $(GGC_H) $(TM_P_H) insn-config.h $(EXPR_H)
|
||||
@ -1837,7 +2015,7 @@ recog.o : recog.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) function.
|
||||
$(INSN_ATTR_H) real.h toplev.h output.h reload.h $(TM_P_H)
|
||||
reg-stack.o : reg-stack.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) \
|
||||
$(RECOG_H) $(REGS_H) hard-reg-set.h flags.h insn-config.h toplev.h reload.h \
|
||||
varray.h function.h $(TM_P_H) $(GGC_H) gt-reg-stack.h
|
||||
varray.h function.h $(TM_P_H) $(GGC_H) gt-reg-stack.h basic-block.h
|
||||
sreal.o: sreal.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) sreal.h
|
||||
predict.o: predict.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) \
|
||||
flags.h insn-config.h $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h output.h toplev.h \
|
||||
@ -2085,7 +2263,7 @@ GTFILES = $(srcdir)/input.h $(srcdir)/coretypes.h $(srcdir)/cpplib.h \
|
||||
$(host_xm_file_list) $(tm_file_list) $(HASHTAB_H) $(SPLAY_TREE_H) \
|
||||
$(srcdir)/bitmap.h $(srcdir)/coverage.c $(srcdir)/function.h $(srcdir)/rtl.h \
|
||||
$(srcdir)/optabs.h $(srcdir)/tree.h $(srcdir)/libfuncs.h $(srcdir)/hashtable.h \
|
||||
$(srcdir)/real.h $(srcdir)/varray.h $(srcdir)/insn-addr.h \
|
||||
$(srcdir)/real.h $(srcdir)/varray.h $(srcdir)/insn-addr.h $(srcdir)/hwint.h \
|
||||
$(srcdir)/cselib.h $(srcdir)/basic-block.h $(srcdir)/cgraph.h \
|
||||
$(srcdir)/c-common.h $(srcdir)/c-tree.h \
|
||||
$(srcdir)/alias.c $(srcdir)/bitmap.c $(srcdir)/cselib.c $(srcdir)/cgraph.c \
|
||||
@ -2098,6 +2276,16 @@ GTFILES = $(srcdir)/input.h $(srcdir)/coretypes.h $(srcdir)/cpplib.h \
|
||||
$(srcdir)/reg-stack.c $(srcdir)/cfglayout.c $(srcdir)/langhooks.c \
|
||||
$(srcdir)/sdbout.c $(srcdir)/stmt.c $(srcdir)/stor-layout.c \
|
||||
$(srcdir)/stringpool.c $(srcdir)/tree.c $(srcdir)/varasm.c \
|
||||
$(srcdir)/tree-mudflap.c $(srcdir)/tree-flow.h \
|
||||
$(srcdir)/c-objc-common.c $(srcdir)/c-common.c $(srcdir)/c-parse.in \
|
||||
$(srcdir)/tree-ssanames.c $(srcdir)/tree-eh.c \
|
||||
$(srcdir)/tree-phinodes.c $(srcdir)/tree-cfg.c \
|
||||
$(srcdir)/tree-dfa.c $(srcdir)/tree-ssa-ccp.c \
|
||||
$(srcdir)/tree-iterator.c $(srcdir)/gimplify.c \
|
||||
$(srcdir)/tree-alias-type.h $(srcdir)/tree-alias-common.h \
|
||||
$(srcdir)/tree-alias-type.c $(srcdir)/tree-alias-common.c \
|
||||
$(srcdir)/tree-ssa-operands.h $(srcdir)/tree-ssa-operands.c \
|
||||
$(srcdir)/tree-profile.c $(srcdir)/rtl-profile.c $(srcdir)/tree-nested.c \
|
||||
$(out_file) \
|
||||
@all_gtfiles@
|
||||
|
||||
@ -2114,6 +2302,10 @@ gt-expr.h gt-sdbout.h gt-optabs.h gt-bitmap.h gt-dojump.h \
|
||||
gt-dwarf2out.h gt-ra-build.h gt-reg-stack.h gt-dwarf2asm.h \
|
||||
gt-dbxout.h gt-c-common.h gt-c-decl.h gt-c-parse.h \
|
||||
gt-c-pragma.h gtype-c.h gt-input.h gt-cfglayout.h \
|
||||
gt-tree-alias-common.h gt-tree-mudflap.h \
|
||||
gt-tree-ssa-ccp.h gt-tree-eh.h \
|
||||
gt-tree-ssanames.h gt-tree-iterator.h gt-gimplify.h \
|
||||
gt-tree-phinodes.h gt-tree-cfg.h gt-tree-nested.h \
|
||||
gt-stringpool.h gt-langhooks.h : s-gtype ; @true
|
||||
|
||||
gtyp-gen.h: s-gtyp-gen ; @true
|
||||
@ -2670,7 +2862,7 @@ TEXI_GCCINT_FILES = gccint.texi gcc-common.texi contribute.texi makefile.texi \
|
||||
c-tree.texi rtl.texi md.texi tm.texi hostconfig.texi fragments.texi \
|
||||
configfiles.texi collect2.texi headerdirs.texi funding.texi gnu.texi \
|
||||
gpl.texi fdl.texi contrib.texi languages.texi sourcebuild.texi \
|
||||
gty.texi libgcc.texi
|
||||
gty.texi libgcc.texi cfg.texi tree-ssa.texi
|
||||
|
||||
TEXI_GCCINSTALL_FILES = install.texi install-old.texi fdl.texi
|
||||
|
||||
|
@ -1,3 +1,12 @@
|
||||
2004-05-13 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
Merge from tree-ssa-20020619-branch.
|
||||
|
||||
* config-lang.in (boot_language, build_by_default): Set
|
||||
to no.
|
||||
* utils.c (unchecked_convert): Use OEP_ONLY_CONST.
|
||||
(max_size): Add static chain op for call_expr.
|
||||
|
||||
2004-05-12 Richard Sandiford <rsandifo@redhat.com>
|
||||
|
||||
PR target/15331
|
||||
|
29
gcc/ada/ChangeLog.tree-ssa
Normal file
29
gcc/ada/ChangeLog.tree-ssa
Normal file
@ -0,0 +1,29 @@
|
||||
2004-05-05 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* utils.c (unchecked_convert): Use OEP_ONLY_CONST.
|
||||
|
||||
2004-03-25 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* config-lang.in: Disable Ada by default.
|
||||
|
||||
2004-02-16 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* utils.c (max_size): Add static chain op for call_expr.
|
||||
|
||||
2003-09-25 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* trans.c, utils.c: Revert 2003-01-15 change.
|
||||
|
||||
2003-01-15 Jeff Law <law@redhat.com>
|
||||
|
||||
* trans.c (tree_transform): Use annotate_with_file_line to add
|
||||
file/line information to nodes.
|
||||
(build_unit_elab): Use TREE_FILENAME and TREE_LINENO to
|
||||
retrieve file/line information from a node.
|
||||
* utils.c (create_label_decl): Use annotate_with_file_line to
|
||||
add file/line information to nodes.
|
||||
|
||||
Local Variables:
|
||||
mode: change-log
|
||||
change-log-default-name: "ChangeLog.tree-ssa"
|
||||
End:
|
@ -27,7 +27,7 @@
|
||||
# stagestuff - files to add to $(STAGESTUFF)
|
||||
|
||||
language="ada"
|
||||
boot_language=yes
|
||||
boot_language=no
|
||||
boot_language_boot_flags='ADAFLAGS="$(BOOT_ADAFLAGS)"'
|
||||
|
||||
compilers="gnat1\$(exeext)"
|
||||
@ -39,3 +39,6 @@ gtfiles="\$(srcdir)/ada/ada-tree.h \$(srcdir)/ada/gigi.h \$(srcdir)/ada/decl.c \
|
||||
outputs=ada/Makefile
|
||||
|
||||
target_libs="target-libada"
|
||||
|
||||
# Ada will not work until the front end starts emitting GIMPLE trees.
|
||||
build_by_default=no
|
||||
|
@ -2220,7 +2220,7 @@ max_size (tree exp, int max_p)
|
||||
max_size (TREE_OPERAND (exp, 2), max_p)));
|
||||
else if (code == CALL_EXPR && TREE_OPERAND (exp, 1) != 0)
|
||||
return build (CALL_EXPR, type, TREE_OPERAND (exp, 0),
|
||||
max_size (TREE_OPERAND (exp, 1), max_p));
|
||||
max_size (TREE_OPERAND (exp, 1), max_p), NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3432,7 +3432,8 @@ unchecked_convert (tree type, tree expr, int notrunc_p)
|
||||
/* If the sizes of the types differ and this is an VIEW_CONVERT_EXPR,
|
||||
show no longer constant. */
|
||||
if (TREE_CODE (expr) == VIEW_CONVERT_EXPR
|
||||
&& ! operand_equal_p (TYPE_SIZE_UNIT (type), TYPE_SIZE_UNIT (etype), 1))
|
||||
&& ! operand_equal_p (TYPE_SIZE_UNIT (type), TYPE_SIZE_UNIT (etype),
|
||||
OEP_ONLY_CONST))
|
||||
TREE_CONSTANT (expr) = 0;
|
||||
|
||||
return expr;
|
||||
|
@ -27,9 +27,11 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
#include "varray.h"
|
||||
#include "partition.h"
|
||||
#include "hard-reg-set.h"
|
||||
#include "predict.h"
|
||||
|
||||
/* Head of register set linked list. */
|
||||
typedef bitmap_head regset_head;
|
||||
|
||||
/* A pointer to a regset_head. */
|
||||
typedef bitmap regset;
|
||||
|
||||
@ -121,18 +123,24 @@ do { \
|
||||
typedef HOST_WIDEST_INT gcov_type;
|
||||
|
||||
/* Control flow edge information. */
|
||||
typedef struct edge_def {
|
||||
struct edge_def GTY((chain_next ("%h.pred_next")))
|
||||
{
|
||||
/* Links through the predecessor and successor lists. */
|
||||
struct edge_def *pred_next, *succ_next;
|
||||
struct edge_def *pred_next;
|
||||
struct edge_def *succ_next;
|
||||
|
||||
/* The two blocks at the ends of the edge. */
|
||||
struct basic_block_def *src, *dest;
|
||||
struct basic_block_def *src;
|
||||
struct basic_block_def *dest;
|
||||
|
||||
/* Instructions queued on the edge. */
|
||||
rtx insns;
|
||||
union edge_def_insns {
|
||||
rtx GTY ((tag ("0"))) r;
|
||||
tree GTY ((tag ("1"))) t;
|
||||
} GTY ((desc ("ir_type ()"))) insns;
|
||||
|
||||
/* Auxiliary info specific to a pass. */
|
||||
void *aux;
|
||||
PTR GTY ((skip (""))) aux;
|
||||
|
||||
int flags; /* see EDGE_* below */
|
||||
int probability; /* biased by REG_BR_PROB_BASE */
|
||||
@ -140,7 +148,9 @@ typedef struct edge_def {
|
||||
in profile.c */
|
||||
bool crossing_edge; /* Crosses between hot and cold sections, when
|
||||
we do partitioning. */
|
||||
} *edge;
|
||||
};
|
||||
|
||||
typedef struct edge_def *edge;
|
||||
|
||||
#define EDGE_FALLTHRU 1 /* 'Straight line' flow */
|
||||
#define EDGE_ABNORMAL 2 /* Strange flow, like computed
|
||||
@ -155,7 +165,13 @@ typedef struct edge_def {
|
||||
#define EDGE_IRREDUCIBLE_LOOP 128 /* Part of irreducible loop. */
|
||||
#define EDGE_SIBCALL 256 /* Edge from sibcall to exit. */
|
||||
#define EDGE_LOOP_EXIT 512 /* Exit of a loop. */
|
||||
#define EDGE_ALL_FLAGS 1023
|
||||
#define EDGE_TRUE_VALUE 1024 /* Edge taken when controlling
|
||||
predicate is non zero. */
|
||||
#define EDGE_FALSE_VALUE 2048 /* Edge taken when controlling
|
||||
predicate is zero. */
|
||||
#define EDGE_EXECUTABLE 4096 /* Edge is executable. Only
|
||||
valid during SSA-CCP. */
|
||||
#define EDGE_ALL_FLAGS 8191
|
||||
|
||||
#define EDGE_COMPLEX (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL | EDGE_EH)
|
||||
|
||||
@ -167,6 +183,9 @@ extern const struct gcov_ctr_summary *profile_info;
|
||||
struct loop;
|
||||
struct loops;
|
||||
|
||||
/* Declared in tree-flow.h. */
|
||||
struct bb_ann_d;
|
||||
|
||||
/* A basic block is a sequence of instructions with only entry and
|
||||
only one exit. If any one of the instructions are executed, they
|
||||
will all be executed, and in sequence from first to last.
|
||||
@ -193,51 +212,54 @@ struct loops;
|
||||
basic blocks. */
|
||||
|
||||
/* Basic block information indexed by block number. */
|
||||
typedef struct basic_block_def {
|
||||
struct basic_block_def GTY((chain_next ("%h.next_bb"), chain_prev ("%h.prev_bb")))
|
||||
{
|
||||
/* The first and last insns of the block. */
|
||||
rtx head_, end_;
|
||||
rtx head_;
|
||||
rtx end_;
|
||||
|
||||
/* The first and last trees of the block. */
|
||||
tree head_tree;
|
||||
tree end_tree;
|
||||
/* Pointers to the first and last trees of the block. */
|
||||
tree stmt_list;
|
||||
|
||||
/* The edges into and out of the block. */
|
||||
edge pred, succ;
|
||||
edge pred;
|
||||
edge succ;
|
||||
|
||||
/* Liveness info. */
|
||||
|
||||
/* The registers that are modified within this in block. */
|
||||
regset local_set;
|
||||
bitmap GTY ((skip (""))) local_set;
|
||||
/* The registers that are conditionally modified within this block.
|
||||
In other words, registers that are set only as part of a
|
||||
COND_EXEC. */
|
||||
regset cond_local_set;
|
||||
bitmap GTY ((skip (""))) cond_local_set;
|
||||
/* The registers that are live on entry to this block.
|
||||
|
||||
Note that in SSA form, global_live_at_start does not reflect the
|
||||
use of regs in phi functions, since the liveness of these regs
|
||||
may depend on which edge was taken into the block. */
|
||||
regset global_live_at_start;
|
||||
bitmap GTY ((skip (""))) global_live_at_start;
|
||||
/* The registers that are live on exit from this block. */
|
||||
regset global_live_at_end;
|
||||
bitmap GTY ((skip (""))) global_live_at_end;
|
||||
|
||||
/* Auxiliary info specific to a pass. */
|
||||
void *aux;
|
||||
PTR GTY ((skip (""))) aux;
|
||||
|
||||
/* The index of this block. */
|
||||
int index;
|
||||
|
||||
/* Previous and next blocks in the chain. */
|
||||
struct basic_block_def *prev_bb, *next_bb;
|
||||
struct basic_block_def *prev_bb;
|
||||
struct basic_block_def *next_bb;
|
||||
|
||||
/* The loop depth of this block. */
|
||||
int loop_depth;
|
||||
|
||||
/* Outermost loop containing the block. */
|
||||
struct loop *loop_father;
|
||||
/* Innermost loop containing the block. */
|
||||
struct loop * GTY ((skip (""))) loop_father;
|
||||
|
||||
/* The dominance and postdominance information node. */
|
||||
struct et_node *dom[2];
|
||||
struct et_node * GTY ((skip (""))) dom[2];
|
||||
|
||||
/* Expected number of executions: calculated in profile.c. */
|
||||
gcov_type count;
|
||||
@ -251,9 +273,31 @@ typedef struct basic_block_def {
|
||||
/* Which section block belongs in, when partitioning basic blocks. */
|
||||
int partition;
|
||||
|
||||
/* Additional data maintained by cfg_layout routines. */
|
||||
struct reorder_block_def *rbi;
|
||||
} *basic_block;
|
||||
/* The data used by basic block copying and reordering functions. */
|
||||
struct reorder_block_def * GTY ((skip (""))) rbi;
|
||||
|
||||
/* Annotations used at the tree level. */
|
||||
struct bb_ann_d *tree_annotations;
|
||||
};
|
||||
|
||||
typedef struct basic_block_def *basic_block;
|
||||
|
||||
/* Structure to hold information about the blocks during reordering and
|
||||
copying. */
|
||||
|
||||
typedef struct reorder_block_def
|
||||
{
|
||||
rtx header;
|
||||
rtx footer;
|
||||
basic_block next;
|
||||
basic_block original;
|
||||
/* Used by loop copying. */
|
||||
basic_block copy;
|
||||
int duplicated;
|
||||
|
||||
/* These fields are used by bb-reorder pass. */
|
||||
int visited;
|
||||
} *reorder_block_def;
|
||||
|
||||
#define BB_FREQ_MAX 10000
|
||||
|
||||
@ -285,7 +329,7 @@ extern int n_edges;
|
||||
|
||||
/* Index by basic block number, get basic block struct info. */
|
||||
|
||||
extern varray_type basic_block_info;
|
||||
extern GTY(()) varray_type basic_block_info;
|
||||
|
||||
#define BASIC_BLOCK(N) (VARRAY_BB (basic_block_info, (N)))
|
||||
|
||||
@ -352,9 +396,8 @@ extern struct obstack flow_obstack;
|
||||
#define INVALID_BLOCK (-3)
|
||||
|
||||
/* Similarly, block pointers for the edge list. */
|
||||
extern struct basic_block_def entry_exit_blocks[2];
|
||||
#define ENTRY_BLOCK_PTR (&entry_exit_blocks[0])
|
||||
#define EXIT_BLOCK_PTR (&entry_exit_blocks[1])
|
||||
extern GTY(()) basic_block ENTRY_BLOCK_PTR;
|
||||
extern GTY(()) basic_block EXIT_BLOCK_PTR;
|
||||
|
||||
#define BLOCK_NUM(INSN) (BLOCK_FOR_INSN (INSN)->index + 0)
|
||||
#define set_block_for_insn(INSN, BB) (BLOCK_FOR_INSN (INSN) = BB)
|
||||
@ -374,7 +417,6 @@ extern void commit_edge_insertions_watch_calls (void);
|
||||
extern void remove_fake_edges (void);
|
||||
extern void add_noreturn_fake_exit_edges (void);
|
||||
extern void connect_infinite_loops_to_exit (void);
|
||||
extern int flow_call_edges_add (sbitmap);
|
||||
extern edge unchecked_make_edge (basic_block, basic_block, int);
|
||||
extern edge cached_make_edge (sbitmap *, basic_block, basic_block, int);
|
||||
extern edge make_edge (basic_block, basic_block, int);
|
||||
@ -392,6 +434,7 @@ extern int dfs_enumerate_from (basic_block, int,
|
||||
bool (*)(basic_block, void *),
|
||||
basic_block *, int, void *);
|
||||
extern void dump_edge_info (FILE *, edge, int);
|
||||
extern void brief_dump_cfg (FILE *);
|
||||
extern void clear_edges (void);
|
||||
extern void mark_critical_edges (void);
|
||||
extern rtx first_insn_after_basic_block_note (basic_block);
|
||||
@ -472,6 +515,7 @@ void free_edge_list (struct edge_list *);
|
||||
void print_edge_list (FILE *, struct edge_list *);
|
||||
void verify_edge_list (FILE *, struct edge_list *);
|
||||
int find_edge_index (struct edge_list *, basic_block, basic_block);
|
||||
edge find_edge (basic_block, basic_block);
|
||||
|
||||
|
||||
enum update_life_extent
|
||||
@ -554,6 +598,11 @@ extern void expected_value_to_br_prob (void);
|
||||
extern bool maybe_hot_bb_p (basic_block);
|
||||
extern bool probably_cold_bb_p (basic_block);
|
||||
extern bool probably_never_executed_bb_p (basic_block);
|
||||
extern bool tree_predicted_by_p (basic_block, enum br_predictor);
|
||||
extern bool rtl_predicted_by_p (basic_block, enum br_predictor);
|
||||
extern void tree_predict_edge (edge, enum br_predictor, int);
|
||||
extern void rtl_predict_edge (edge, enum br_predictor, int);
|
||||
extern void predict_edge_def (edge, enum br_predictor, enum prediction);
|
||||
|
||||
/* In flow.c */
|
||||
extern void init_flow (void);
|
||||
@ -577,7 +626,7 @@ extern bool purge_all_dead_edges (int);
|
||||
extern bool purge_dead_edges (basic_block);
|
||||
extern void find_sub_basic_blocks (basic_block);
|
||||
extern void find_many_sub_basic_blocks (sbitmap);
|
||||
extern void make_eh_edge (sbitmap *, basic_block, rtx);
|
||||
extern void rtl_make_eh_edge (sbitmap *, basic_block, rtx);
|
||||
extern bool can_fallthru (basic_block, basic_block);
|
||||
extern void flow_nodes_print (const char *, const sbitmap, FILE *);
|
||||
extern void flow_edge_list_print (const char *, const edge *, int, FILE *);
|
||||
@ -589,6 +638,10 @@ extern void alloc_aux_for_edge (edge, int);
|
||||
extern void alloc_aux_for_edges (int);
|
||||
extern void clear_aux_for_edges (void);
|
||||
extern void free_aux_for_edges (void);
|
||||
extern void find_basic_blocks (rtx, int, FILE *);
|
||||
extern bool cleanup_cfg (int);
|
||||
extern bool delete_unreachable_blocks (void);
|
||||
extern bool merge_seq_blocks (void);
|
||||
|
||||
typedef struct conflict_graph_def *conflict_graph;
|
||||
|
||||
@ -624,6 +677,11 @@ extern bool control_flow_insn_p (rtx);
|
||||
extern void reorder_basic_blocks (void);
|
||||
extern void partition_hot_cold_basic_blocks (void);
|
||||
|
||||
/* In cfg.c */
|
||||
extern void alloc_rbi_pool (void);
|
||||
extern void initialize_bb_rbi (basic_block bb);
|
||||
extern void free_rbi_pool (void);
|
||||
|
||||
/* In dominance.c */
|
||||
|
||||
enum cdi_direction
|
||||
@ -661,7 +719,7 @@ extern void iterate_fix_dominators (enum cdi_direction, basic_block *, int);
|
||||
extern void verify_dominators (enum cdi_direction);
|
||||
extern basic_block first_dom_son (enum cdi_direction, basic_block);
|
||||
extern basic_block next_dom_son (enum cdi_direction, basic_block);
|
||||
extern bool try_redirect_by_replacing_jump (edge, basic_block, bool);
|
||||
extern edge try_redirect_by_replacing_jump (edge, basic_block, bool);
|
||||
extern void break_superblocks (void);
|
||||
|
||||
#include "cfghooks.h"
|
||||
|
@ -749,7 +749,7 @@ copy_bb (basic_block old_bb, edge e, basic_block bb, int trace)
|
||||
{
|
||||
basic_block new_bb;
|
||||
|
||||
new_bb = cfg_layout_duplicate_bb (old_bb, e);
|
||||
new_bb = duplicate_block (old_bb, e);
|
||||
if (e->dest != new_bb)
|
||||
abort ();
|
||||
if (e->dest->rbi->visited)
|
||||
@ -1177,7 +1177,7 @@ copy_bb_p (basic_block bb, int code_may_grow)
|
||||
return false;
|
||||
if (!bb->pred || !bb->pred->pred_next)
|
||||
return false;
|
||||
if (!cfg_layout_can_duplicate_bb_p (bb))
|
||||
if (!can_duplicate_block_p (bb))
|
||||
return false;
|
||||
|
||||
/* Avoid duplicating blocks which have many successors (PR/13430). */
|
||||
|
@ -414,7 +414,9 @@ bitmap_first_set_bit (bitmap a)
|
||||
#else
|
||||
for (word_num = 0; word_num < BITMAP_ELEMENT_WORDS; ++word_num)
|
||||
if ((word = ptr->bits[word_num]) != 0)
|
||||
break;
|
||||
goto word_found;
|
||||
abort ();
|
||||
word_found:
|
||||
#endif
|
||||
|
||||
/* Binary search for the first set bit. */
|
||||
@ -469,7 +471,9 @@ bitmap_last_set_bit (bitmap a)
|
||||
#else
|
||||
for (word_num = BITMAP_ELEMENT_WORDS; word_num-- > 0; )
|
||||
if ((word = ptr->bits[word_num]) != 0)
|
||||
break;
|
||||
goto word_found;
|
||||
abort ();
|
||||
word_found:
|
||||
#endif
|
||||
|
||||
/* Binary search for the last set bit. */
|
||||
|
@ -227,6 +227,7 @@ DEF_FUNCTION_TYPE_2 (BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE_COMPLEX_DOUBLE,
|
||||
BT_COMPLEX_DOUBLE, BT_COMPLEX_DOUBLE, BT_COMPLEX_DOUBLE)
|
||||
DEF_FUNCTION_TYPE_2 (BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE,
|
||||
BT_COMPLEX_LONGDOUBLE, BT_COMPLEX_LONGDOUBLE, BT_COMPLEX_LONGDOUBLE)
|
||||
DEF_FUNCTION_TYPE_2 (BT_FN_VOID_PTR_PTR, BT_VOID, BT_PTR, BT_PTR)
|
||||
DEF_FUNCTION_TYPE_2 (BT_FN_INT_CONST_STRING_PTR_CONST_STRING,
|
||||
BT_INT, BT_CONST_STRING, BT_PTR_CONST_STRING)
|
||||
|
||||
@ -270,6 +271,7 @@ DEF_FUNCTION_TYPE_3 (BT_FN_VOID_DOUBLE_DOUBLEPTR_DOUBLEPTR,
|
||||
BT_VOID, BT_DOUBLE, BT_DOUBLE_PTR, BT_DOUBLE_PTR)
|
||||
DEF_FUNCTION_TYPE_3 (BT_FN_VOID_LONGDOUBLE_LONGDOUBLEPTR_LONGDOUBLEPTR,
|
||||
BT_VOID, BT_LONGDOUBLE, BT_LONGDOUBLE_PTR, BT_LONGDOUBLE_PTR)
|
||||
DEF_FUNCTION_TYPE_3 (BT_FN_VOID_PTR_PTR_PTR, BT_VOID, BT_PTR, BT_PTR, BT_PTR)
|
||||
DEF_FUNCTION_TYPE_3 (BT_FN_INT_CONST_STRING_PTR_CONST_STRING_PTR_CONST_STRING,
|
||||
BT_INT, BT_CONST_STRING, BT_PTR_CONST_STRING, BT_PTR_CONST_STRING)
|
||||
|
||||
|
1521
gcc/builtins.c
1521
gcc/builtins.c
File diff suppressed because it is too large
Load Diff
@ -593,6 +593,9 @@ DEF_GCC_BUILTIN (BUILT_IN_RETURN, "return", BT_FN_VOID_PTR, ATTR_NORETURN
|
||||
DEF_GCC_BUILTIN (BUILT_IN_RETURN_ADDRESS, "return_address", BT_FN_PTR_UNSIGNED, ATTR_NULL)
|
||||
DEF_GCC_BUILTIN (BUILT_IN_SAVEREGS, "saveregs", BT_FN_PTR_VAR, ATTR_NULL)
|
||||
DEF_GCC_BUILTIN (BUILT_IN_SETJMP, "setjmp", BT_FN_INT_PTR, ATTR_NULL)
|
||||
DEF_GCC_BUILTIN (BUILT_IN_STACK_ALLOC, "stack_alloc", BT_FN_VOID_PTR_SIZE, ATTR_NULL)
|
||||
DEF_GCC_BUILTIN (BUILT_IN_STACK_SAVE, "stack_save", BT_FN_PTR, ATTR_NULL)
|
||||
DEF_GCC_BUILTIN (BUILT_IN_STACK_RESTORE, "stack_restore", BT_FN_VOID_PTR, ATTR_NULL)
|
||||
DEF_GCC_BUILTIN (BUILT_IN_STDARG_START, "stdarg_start", BT_FN_VOID_VALIST_REF_VAR, ATTR_NULL)
|
||||
DEF_EXT_LIB_BUILTIN (BUILT_IN_STRFMON, "strfmon", BT_FN_SSIZE_STRING_SIZE_CONST_STRING_VAR, ATTR_FORMAT_STRFMON_3_4)
|
||||
DEF_LIB_BUILTIN (BUILT_IN_STRFTIME, "strftime", BT_FN_SIZE_STRING_SIZE_CONST_STRING_CONST_PTR, ATTR_FORMAT_STRFTIME_3_0)
|
||||
@ -604,3 +607,12 @@ DEF_GCC_BUILTIN (BUILT_IN_VA_END, "va_end", BT_FN_VOID_VALIST_REF, ATTR_N
|
||||
DEF_GCC_BUILTIN (BUILT_IN_VA_START, "va_start", BT_FN_VOID_VALIST_REF_VAR, ATTR_NULL)
|
||||
DEF_EXT_LIB_BUILTIN (BUILT_IN__EXIT, "_exit", BT_FN_VOID_INT, ATTR_NORETURN_NOTHROW_LIST)
|
||||
DEF_C99_BUILTIN (BUILT_IN__EXIT2, "_Exit", BT_FN_VOID_INT, ATTR_NORETURN_NOTHROW_LIST)
|
||||
DEF_GCC_BUILTIN (BUILT_IN_INIT_TRAMPOLINE, "init_trampoline", BT_FN_VOID_PTR_PTR_PTR, ATTR_NOTHROW_LIST)
|
||||
DEF_GCC_BUILTIN (BUILT_IN_ADJUST_TRAMPOLINE, "adjust_trampoline", BT_FN_PTR_PTR, ATTR_CONST_NOTHROW_LIST)
|
||||
DEF_GCC_BUILTIN (BUILT_IN_NONLOCAL_GOTO, "nonlocal_goto", BT_FN_PTR_PTR, ATTR_NORETURN_NOTHROW_LIST)
|
||||
|
||||
/* Profiling hooks. */
|
||||
DEF_GCC_BUILTIN (BUILT_IN_PROFILE_FUNC_ENTER, "profile_func_enter",
|
||||
BT_FN_VOID, ATTR_NULL)
|
||||
DEF_GCC_BUILTIN (BUILT_IN_PROFILE_FUNC_EXIT, "profile_func_exit",
|
||||
BT_FN_VOID, ATTR_NULL)
|
||||
|
619
gcc/c-common.c
619
gcc/c-common.c
@ -42,6 +42,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
#include "tree-inline.h"
|
||||
#include "c-tree.h"
|
||||
#include "toplev.h"
|
||||
#include "tree-iterator.h"
|
||||
#include "hashtab.h"
|
||||
|
||||
cpp_reader *parse_in; /* Declared in c-pragma.h. */
|
||||
|
||||
@ -681,6 +683,15 @@ tree *ridpointers;
|
||||
|
||||
tree (*make_fname_decl) (tree, int);
|
||||
|
||||
/* If non-NULL, the address of a language-specific function that
|
||||
returns 1 for language-specific statement codes. */
|
||||
int (*lang_statement_code_p) (enum tree_code);
|
||||
|
||||
/* If non-NULL, the address of a language-specific function that does any
|
||||
language-specific gimplification for _STMT nodes and returns 1 iff
|
||||
handled. */
|
||||
int (*lang_gimplify_stmt) (tree *, tree *);
|
||||
|
||||
/* If non-NULL, the address of a language-specific function that takes
|
||||
any action required right before expand_function_end is called. */
|
||||
void (*lang_expand_function_end) (void);
|
||||
@ -918,7 +929,7 @@ c_expand_end_cond (void)
|
||||
if_stack_pointer--;
|
||||
if (if_stack[if_stack_pointer].needs_warning)
|
||||
warning ("%Hsuggest explicit braces to avoid ambiguous `else'",
|
||||
&if_stack[if_stack_pointer].locus);
|
||||
&if_stack[if_stack_pointer].locus);
|
||||
last_expr_type = NULL_TREE;
|
||||
}
|
||||
|
||||
@ -1183,6 +1194,7 @@ fix_string_type (tree value)
|
||||
build_index_type (build_int_2 (nchars - 1, 0)));
|
||||
|
||||
TREE_CONSTANT (value) = 1;
|
||||
TREE_INVARIANT (value) = 1;
|
||||
TREE_READONLY (value) = 1;
|
||||
TREE_STATIC (value) = 1;
|
||||
return value;
|
||||
@ -1315,7 +1327,7 @@ convert_and_check (tree type, tree expr)
|
||||
|| TYPE_UNSIGNED (type)
|
||||
|| ! constant_fits_type_p (expr,
|
||||
c_common_unsigned_type (type)))
|
||||
&& skip_evaluation == 0)
|
||||
&& skip_evaluation == 0)
|
||||
warning ("overflow in implicit constant conversion");
|
||||
}
|
||||
else
|
||||
@ -1851,7 +1863,7 @@ c_common_type_for_mode (enum machine_mode mode, int unsignedp)
|
||||
|
||||
if (mode == TYPE_MODE (widest_integer_literal_type_node))
|
||||
return unsignedp ? widest_unsigned_literal_type_node
|
||||
: widest_integer_literal_type_node;
|
||||
: widest_integer_literal_type_node;
|
||||
|
||||
if (mode == QImode)
|
||||
return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
|
||||
@ -2473,9 +2485,6 @@ pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop)
|
||||
{
|
||||
tree size_exp;
|
||||
|
||||
tree result;
|
||||
tree folded;
|
||||
|
||||
/* The result is a pointer of the same type that is being added. */
|
||||
|
||||
tree result_type = TREE_TYPE (ptrop);
|
||||
@ -2549,13 +2558,7 @@ pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop)
|
||||
convert (TREE_TYPE (intop), size_exp), 1));
|
||||
|
||||
/* Create the sum or difference. */
|
||||
|
||||
result = build (resultcode, result_type, ptrop, intop);
|
||||
|
||||
folded = fold (result);
|
||||
if (folded == result)
|
||||
TREE_CONSTANT (folded) = TREE_CONSTANT (ptrop) & TREE_CONSTANT (intop);
|
||||
return folded;
|
||||
return fold (build (resultcode, result_type, ptrop, intop));
|
||||
}
|
||||
|
||||
/* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
|
||||
@ -2796,6 +2799,49 @@ c_apply_type_quals_to_decl (int type_quals, tree decl)
|
||||
}
|
||||
}
|
||||
|
||||
/* Hash function for the problem of multiple type definitions in
|
||||
different files. This must hash all types that will compare
|
||||
equal via comptypes to the same value. In practice it hashes
|
||||
on some of the simple stuff and leaves the details to comptypes. */
|
||||
|
||||
static hashval_t
|
||||
c_type_hash (const void *p)
|
||||
{
|
||||
int i = 0;
|
||||
int shift, size;
|
||||
tree t = (tree)p;
|
||||
tree t2;
|
||||
switch (TREE_CODE (t))
|
||||
{
|
||||
/* For pointers, hash on pointee type plus some swizzling. */
|
||||
case POINTER_TYPE:
|
||||
return c_type_hash (TREE_TYPE (t)) ^ 0x3003003;
|
||||
/* Hash on number of elements and total size. */
|
||||
case ENUMERAL_TYPE:
|
||||
shift = 3;
|
||||
t2 = TYPE_VALUES (t);
|
||||
break;
|
||||
case RECORD_TYPE:
|
||||
shift = 0;
|
||||
t2 = TYPE_FIELDS (t);
|
||||
break;
|
||||
case QUAL_UNION_TYPE:
|
||||
shift = 1;
|
||||
t2 = TYPE_FIELDS (t);
|
||||
break;
|
||||
case UNION_TYPE:
|
||||
shift = 2;
|
||||
t2 = TYPE_FIELDS (t);
|
||||
break;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
for (; t2; t2 = TREE_CHAIN (t2))
|
||||
i++;
|
||||
size = TREE_INT_CST_LOW (TYPE_SIZE (t));
|
||||
return ((size << 24) | (i << shift));
|
||||
}
|
||||
|
||||
/* Return the typed-based alias set for T, which may be an expression
|
||||
or a type. Return -1 if we don't do anything special. */
|
||||
|
||||
@ -2803,6 +2849,8 @@ HOST_WIDE_INT
|
||||
c_common_get_alias_set (tree t)
|
||||
{
|
||||
tree u;
|
||||
PTR *slot;
|
||||
static htab_t type_hash_table;
|
||||
|
||||
/* Permit type-punning when accessing a union, provided the access
|
||||
is directly through the union. For example, this code does not
|
||||
@ -2859,14 +2907,14 @@ c_common_get_alias_set (tree t)
|
||||
technically, an `int **' and `const int **' cannot point at
|
||||
the same thing.
|
||||
|
||||
But, the standard is wrong. In particular, this code is
|
||||
But, the standard is wrong. In particular, this code is
|
||||
legal C++:
|
||||
|
||||
int *ip;
|
||||
int **ipp = &ip;
|
||||
const int* const* cipp = ipp;
|
||||
|
||||
And, it doesn't make sense for that to be legal unless you
|
||||
And, it doesn't make sense for that to be legal unless you
|
||||
can dereference IPP and CIPP. So, we ignore cv-qualifiers on
|
||||
the pointed-to types. This issue has been reported to the
|
||||
C++ committee. */
|
||||
@ -2875,6 +2923,63 @@ c_common_get_alias_set (tree t)
|
||||
return get_alias_set (t1);
|
||||
}
|
||||
|
||||
/* Handle the case of multiple type nodes referring to "the same" type,
|
||||
which occurs with IMA. These share an alias set. FIXME: Currently only
|
||||
C90 is handled. (In C99 type compatibility is not transitive, which
|
||||
complicates things mightily. The alias set splay trees can theoretically
|
||||
represent this, but insertion is tricky when you consider all the
|
||||
different orders things might arrive in.) */
|
||||
|
||||
if (c_language != clk_c || flag_isoc99)
|
||||
return -1;
|
||||
|
||||
/* Save time if there's only one input file. */
|
||||
if (!current_file_decl || TREE_CHAIN (current_file_decl) == NULL_TREE)
|
||||
return -1;
|
||||
|
||||
/* Pointers need special handling if they point to any type that
|
||||
needs special handling (below). */
|
||||
if (TREE_CODE (t) == POINTER_TYPE)
|
||||
{
|
||||
tree t2;
|
||||
/* Find bottom type under any nested POINTERs. */
|
||||
for (t2 = TREE_TYPE (t);
|
||||
TREE_CODE (t2) == POINTER_TYPE;
|
||||
t2 = TREE_TYPE (t2))
|
||||
;
|
||||
if (TREE_CODE (t2) != RECORD_TYPE
|
||||
&& TREE_CODE (t2) != ENUMERAL_TYPE
|
||||
&& TREE_CODE (t2) != QUAL_UNION_TYPE
|
||||
&& TREE_CODE (t2) != UNION_TYPE)
|
||||
return -1;
|
||||
if (TYPE_SIZE (t2) == 0)
|
||||
return -1;
|
||||
}
|
||||
/* These are the only cases that need special handling. */
|
||||
if (TREE_CODE (t) != RECORD_TYPE
|
||||
&& TREE_CODE (t) != ENUMERAL_TYPE
|
||||
&& TREE_CODE (t) != QUAL_UNION_TYPE
|
||||
&& TREE_CODE (t) != UNION_TYPE
|
||||
&& TREE_CODE (t) != POINTER_TYPE)
|
||||
return -1;
|
||||
/* Undefined? */
|
||||
if (TYPE_SIZE (t) == 0)
|
||||
return -1;
|
||||
|
||||
/* Look up t in hash table. Only one of the compatible types within each
|
||||
alias set is recorded in the table. */
|
||||
if (!type_hash_table)
|
||||
type_hash_table = htab_create (1021, c_type_hash,
|
||||
(htab_eq) lang_hooks.types_compatible_p,
|
||||
NULL);
|
||||
slot = htab_find_slot (type_hash_table, t, INSERT);
|
||||
if (*slot != NULL)
|
||||
return TYPE_ALIAS_SET ((tree)*slot);
|
||||
else
|
||||
/* Our caller will assign and record (in t) a new alias set; all we need
|
||||
to do is remember t in the hash table. */
|
||||
*slot = t;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -3413,7 +3518,7 @@ c_common_nodes_and_builtins (void)
|
||||
\
|
||||
built_in_decls[(int) ENUM] = decl; \
|
||||
if (IMPLICIT) \
|
||||
implicit_built_in_decls[(int) ENUM] = decl; \
|
||||
implicit_built_in_decls[(int) ENUM] = decl; \
|
||||
}
|
||||
#include "builtins.def"
|
||||
#undef DEF_BUILTIN
|
||||
@ -3843,19 +3948,12 @@ c_add_case_label (splay_tree cases, tree cond, tree low_value,
|
||||
splay_tree_node node;
|
||||
|
||||
/* Create the LABEL_DECL itself. */
|
||||
label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
|
||||
DECL_CONTEXT (label) = current_function_decl;
|
||||
label = create_artificial_label ();
|
||||
|
||||
/* If there was an error processing the switch condition, bail now
|
||||
before we get more confused. */
|
||||
if (!cond || cond == error_mark_node)
|
||||
{
|
||||
/* Add a label anyhow so that the back-end doesn't think that
|
||||
the beginning of the switch is unreachable. */
|
||||
if (!cases->root)
|
||||
add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
|
||||
return error_mark_node;
|
||||
}
|
||||
goto error_out;
|
||||
|
||||
if ((low_value && TREE_TYPE (low_value)
|
||||
&& POINTER_TYPE_P (TREE_TYPE (low_value)))
|
||||
@ -3881,11 +3979,7 @@ c_add_case_label (splay_tree cases, tree cond, tree low_value,
|
||||
|
||||
/* If an error has occurred, bail out now. */
|
||||
if (low_value == error_mark_node || high_value == error_mark_node)
|
||||
{
|
||||
if (!cases->root)
|
||||
add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
|
||||
return error_mark_node;
|
||||
}
|
||||
goto error_out;
|
||||
|
||||
/* If the LOW_VALUE and HIGH_VALUE are the same, then this isn't
|
||||
really a case range, even though it was written that way. Remove
|
||||
@ -3958,8 +4052,7 @@ c_add_case_label (splay_tree cases, tree cond, tree low_value,
|
||||
error ("multiple default labels in one switch");
|
||||
error ("%Jthis is the first default label", duplicate);
|
||||
}
|
||||
if (!cases->root)
|
||||
add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
/* Add a CASE_LABEL to the statement-tree. */
|
||||
@ -3970,6 +4063,160 @@ c_add_case_label (splay_tree cases, tree cond, tree low_value,
|
||||
(splay_tree_value) case_label);
|
||||
|
||||
return case_label;
|
||||
|
||||
error_out:
|
||||
/* Add a label so that the back-end doesn't think that the beginning o
|
||||
the switch is unreachable. Note that we do not add a case label, as
|
||||
that just leads to duplicates and thence to aborts later on. */
|
||||
if (!cases->root)
|
||||
{
|
||||
tree t = create_artificial_label ();
|
||||
add_stmt (build_stmt (LABEL_STMT, t));
|
||||
}
|
||||
return error_mark_node;
|
||||
}
|
||||
|
||||
/* Subroutines of c_do_switch_warnings, called via splay_tree_foreach.
|
||||
Used to verify that case values match up with enumerator values. */
|
||||
|
||||
static void
|
||||
match_case_to_enum_1 (tree key, tree type, tree label)
|
||||
{
|
||||
char buf[2 + 2*HOST_BITS_PER_WIDE_INT/4 + 1];
|
||||
|
||||
/* ??? Not working too hard to print the double-word value.
|
||||
Should perhaps be done with %lwd in the diagnostic routines? */
|
||||
if (TREE_INT_CST_HIGH (key) == 0)
|
||||
snprintf (buf, sizeof (buf), HOST_WIDE_INT_PRINT_UNSIGNED,
|
||||
TREE_INT_CST_LOW (key));
|
||||
else if (!TYPE_UNSIGNED (type)
|
||||
&& TREE_INT_CST_HIGH (key) == -1
|
||||
&& TREE_INT_CST_LOW (key) != 0)
|
||||
snprintf (buf, sizeof (buf), "-" HOST_WIDE_INT_PRINT_UNSIGNED,
|
||||
-TREE_INT_CST_LOW (key));
|
||||
else
|
||||
snprintf (buf, sizeof (buf), HOST_WIDE_INT_PRINT_DOUBLE_HEX,
|
||||
TREE_INT_CST_HIGH (key), TREE_INT_CST_LOW (key));
|
||||
|
||||
if (TYPE_NAME (type) == 0)
|
||||
warning ("%Jcase value `%s' not in enumerated type",
|
||||
CASE_LABEL_DECL (label), buf);
|
||||
else
|
||||
warning ("%Jcase value `%s' not in enumerated type `%T'",
|
||||
CASE_LABEL_DECL (label), buf, type);
|
||||
}
|
||||
|
||||
static int
|
||||
match_case_to_enum (splay_tree_node node, void *data)
|
||||
{
|
||||
tree label = (tree) node->value;
|
||||
tree type = data;
|
||||
|
||||
/* Skip default case. */
|
||||
if (!CASE_LOW (label))
|
||||
return 0;
|
||||
|
||||
/* If TREE_ADDRESSABLE is not set, that means CASE_LOW did not appear
|
||||
when we did our enum->case scan. Reset our scratch bit after. */
|
||||
if (!TREE_ADDRESSABLE (label))
|
||||
match_case_to_enum_1 (CASE_LOW (label), type, label);
|
||||
else
|
||||
TREE_ADDRESSABLE (label) = 0;
|
||||
|
||||
/* If CASE_HIGH is non-null, we have a range. Here we must search.
|
||||
Note that the old code in stmt.c did not check for the values in
|
||||
the range either, just the endpoints. */
|
||||
if (CASE_HIGH (label))
|
||||
{
|
||||
tree chain, key = CASE_HIGH (label);
|
||||
|
||||
for (chain = TYPE_VALUES (type);
|
||||
chain && !tree_int_cst_equal (key, TREE_VALUE (chain));
|
||||
chain = TREE_CHAIN (chain))
|
||||
continue;
|
||||
if (!chain)
|
||||
match_case_to_enum_1 (key, type, label);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Handle -Wswitch*. Called from the front end after parsing the switch
|
||||
construct. */
|
||||
/* ??? Should probably be somewhere generic, since other languages besides
|
||||
C and C++ would want this. We'd want to agree on the datastructure,
|
||||
however, which is a problem. Alternately, we operate on gimplified
|
||||
switch_exprs, which I don't especially like. At the moment, however,
|
||||
C/C++ are the only tree-ssa languages that support enumerations at all,
|
||||
so the point is moot. */
|
||||
|
||||
void
|
||||
c_do_switch_warnings (splay_tree cases, tree switch_stmt)
|
||||
{
|
||||
splay_tree_node default_node;
|
||||
location_t *switch_locus;
|
||||
tree type;
|
||||
|
||||
if (!warn_switch && !warn_switch_enum && !warn_switch_default)
|
||||
return;
|
||||
|
||||
switch_locus = EXPR_LOCUS (switch_stmt);
|
||||
if (!switch_locus)
|
||||
switch_locus = &input_location;
|
||||
type = SWITCH_TYPE (switch_stmt);
|
||||
|
||||
default_node = splay_tree_lookup (cases, (splay_tree_key) NULL);
|
||||
if (warn_switch_default && !default_node)
|
||||
warning ("%Hswitch missing default case", switch_locus);
|
||||
|
||||
/* If the switch expression was an enumerated type, check that
|
||||
exactly all enumeration literals are covered by the cases.
|
||||
The check is made when -Wswitch was specified and there is no
|
||||
default case, or when -Wswitch-enum was specified. */
|
||||
if (((warn_switch && !default_node) || warn_switch_enum)
|
||||
&& type && TREE_CODE (type) == ENUMERAL_TYPE
|
||||
&& TREE_CODE (SWITCH_COND (switch_stmt)) != INTEGER_CST)
|
||||
{
|
||||
tree chain;
|
||||
|
||||
/* The time complexity here is O(N*lg(N)) worst case, but for the
|
||||
common case of monotonically increasing enumerators, it is
|
||||
O(N), since the nature of the splay tree will keep the next
|
||||
element adjacent to the root at all times. */
|
||||
|
||||
for (chain = TYPE_VALUES (type); chain; chain = TREE_CHAIN (chain))
|
||||
{
|
||||
splay_tree_node node
|
||||
= splay_tree_lookup (cases, (splay_tree_key) TREE_VALUE (chain));
|
||||
|
||||
if (node)
|
||||
{
|
||||
/* Mark the CASE_LOW part of the case entry as seen, so
|
||||
that we save time later. Choose TREE_ADDRESSABLE
|
||||
randomly as a bit that won't have been set to-date. */
|
||||
tree label = (tree) node->value;
|
||||
TREE_ADDRESSABLE (label) = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Warn if there are enumerators that don't correspond to
|
||||
case expressions. */
|
||||
warning ("%Henumeration value `%E' not handled in switch",
|
||||
switch_locus, TREE_PURPOSE (chain));
|
||||
}
|
||||
}
|
||||
|
||||
/* Warn if there are case expressions that don't correspond to
|
||||
enumerators. This can occur since C and C++ don't enforce
|
||||
type-checking of assignments to enumeration variables.
|
||||
|
||||
The time complexity here is O(N**2) worst case, since we've
|
||||
not sorted the enumeration values. However, in the absence
|
||||
of case ranges this is O(N), since all single cases that
|
||||
corresponded to enumerations have been marked above. */
|
||||
|
||||
splay_tree_foreach (cases, match_case_to_enum, type);
|
||||
}
|
||||
}
|
||||
|
||||
/* Finish an expression taking the address of LABEL (an
|
||||
@ -3993,7 +4240,6 @@ finish_label_address_expr (tree label)
|
||||
{
|
||||
TREE_USED (label) = 1;
|
||||
result = build1 (ADDR_EXPR, ptr_type_node, label);
|
||||
TREE_CONSTANT (result) = 1;
|
||||
/* The current function in not necessarily uninlinable.
|
||||
Computed gotos are incompatible with inlining, but the value
|
||||
here could be used only in a diagnostic, for example. */
|
||||
@ -4003,6 +4249,9 @@ finish_label_address_expr (tree label)
|
||||
}
|
||||
|
||||
/* Hook used by expand_expr to expand language-specific tree codes. */
|
||||
/* The only things that should go here are bits needed to expand
|
||||
constant initalizers. Everything else should be handled by the
|
||||
gimplification routines. */
|
||||
|
||||
rtx
|
||||
c_expand_expr (tree exp, rtx target, enum machine_mode tmode,
|
||||
@ -4011,88 +4260,6 @@ c_expand_expr (tree exp, rtx target, enum machine_mode tmode,
|
||||
{
|
||||
switch (TREE_CODE (exp))
|
||||
{
|
||||
case STMT_EXPR:
|
||||
{
|
||||
tree rtl_expr;
|
||||
rtx result;
|
||||
bool preserve_result = false;
|
||||
|
||||
if (STMT_EXPR_WARN_UNUSED_RESULT (exp) && target == const0_rtx)
|
||||
{
|
||||
tree stmt = STMT_EXPR_STMT (exp);
|
||||
tree scope;
|
||||
|
||||
for (scope = COMPOUND_BODY (stmt);
|
||||
scope && TREE_CODE (scope) != SCOPE_STMT;
|
||||
scope = TREE_CHAIN (scope));
|
||||
|
||||
if (scope && SCOPE_STMT_BLOCK (scope))
|
||||
warning ("%Hignoring return value of `%D', "
|
||||
"declared with attribute warn_unused_result",
|
||||
&expr_wfl_stack->location,
|
||||
BLOCK_ABSTRACT_ORIGIN (SCOPE_STMT_BLOCK (scope)));
|
||||
else
|
||||
warning ("%Hignoring return value of function "
|
||||
"declared with attribute warn_unused_result",
|
||||
&expr_wfl_stack->location);
|
||||
}
|
||||
|
||||
/* Since expand_expr_stmt calls free_temp_slots after every
|
||||
expression statement, we must call push_temp_slots here.
|
||||
Otherwise, any temporaries in use now would be considered
|
||||
out-of-scope after the first EXPR_STMT from within the
|
||||
STMT_EXPR. */
|
||||
push_temp_slots ();
|
||||
rtl_expr = expand_start_stmt_expr (!STMT_EXPR_NO_SCOPE (exp));
|
||||
|
||||
/* If we want the result of this expression, find the last
|
||||
EXPR_STMT in the COMPOUND_STMT and mark it as addressable. */
|
||||
if (target != const0_rtx
|
||||
&& TREE_CODE (STMT_EXPR_STMT (exp)) == COMPOUND_STMT
|
||||
&& TREE_CODE (COMPOUND_BODY (STMT_EXPR_STMT (exp))) == SCOPE_STMT)
|
||||
{
|
||||
tree expr = COMPOUND_BODY (STMT_EXPR_STMT (exp));
|
||||
tree last = TREE_CHAIN (expr);
|
||||
|
||||
while (TREE_CHAIN (last))
|
||||
{
|
||||
expr = last;
|
||||
last = TREE_CHAIN (last);
|
||||
}
|
||||
|
||||
if (TREE_CODE (last) == SCOPE_STMT
|
||||
&& TREE_CODE (expr) == EXPR_STMT)
|
||||
{
|
||||
/* Otherwise, note that we want the value from the last
|
||||
expression. */
|
||||
TREE_ADDRESSABLE (expr) = 1;
|
||||
preserve_result = true;
|
||||
}
|
||||
}
|
||||
|
||||
expand_stmt (STMT_EXPR_STMT (exp));
|
||||
expand_end_stmt_expr (rtl_expr);
|
||||
|
||||
result = expand_expr_real (rtl_expr, target, tmode, modifier, alt_rtl);
|
||||
if (preserve_result && GET_CODE (result) == MEM)
|
||||
{
|
||||
if (GET_MODE (result) != BLKmode)
|
||||
result = copy_to_reg (result);
|
||||
else
|
||||
preserve_temp_slots (result);
|
||||
}
|
||||
|
||||
/* If the statment-expression does not have a scope, then the
|
||||
new temporaries we created within it must live beyond the
|
||||
statement-expression. */
|
||||
if (STMT_EXPR_NO_SCOPE (exp))
|
||||
preserve_temp_slots (NULL_RTX);
|
||||
|
||||
pop_temp_slots ();
|
||||
return result;
|
||||
}
|
||||
break;
|
||||
|
||||
case COMPOUND_LITERAL_EXPR:
|
||||
{
|
||||
/* Initialize the anonymous variable declared in the compound
|
||||
@ -4105,9 +4272,6 @@ c_expand_expr (tree exp, rtx target, enum machine_mode tmode,
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
|
||||
abort ();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Hook used by safe_from_p to handle language-specific tree codes. */
|
||||
@ -4684,7 +4848,7 @@ handle_section_attribute (tree *node, tree name ATTRIBUTE_UNUSED, tree args,
|
||||
&& ! TREE_STATIC (decl))
|
||||
{
|
||||
error ("%Jsection attribute cannot be specified for "
|
||||
"local variables", decl);
|
||||
"local variables", decl);
|
||||
*no_add_attrs = true;
|
||||
}
|
||||
|
||||
@ -4695,7 +4859,7 @@ handle_section_attribute (tree *node, tree name ATTRIBUTE_UNUSED, tree args,
|
||||
TREE_STRING_POINTER (TREE_VALUE (args))) != 0)
|
||||
{
|
||||
error ("%Jsection of '%D' conflicts with previous declaration",
|
||||
*node, *node);
|
||||
*node, *node);
|
||||
*no_add_attrs = true;
|
||||
}
|
||||
else
|
||||
@ -4848,7 +5012,10 @@ handle_alias_attribute (tree *node, tree name, tree args,
|
||||
if (TREE_CODE (decl) == FUNCTION_DECL)
|
||||
DECL_INITIAL (decl) = error_mark_node;
|
||||
else
|
||||
DECL_EXTERNAL (decl) = 0;
|
||||
{
|
||||
DECL_EXTERNAL (decl) = 0;
|
||||
TREE_STATIC (decl) = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -5191,7 +5358,7 @@ handle_nonnull_attribute (tree *node, tree name ATTRIBUTE_UNUSED,
|
||||
if (! TYPE_ARG_TYPES (type))
|
||||
{
|
||||
error ("nonnull attribute without arguments on a non-prototype");
|
||||
*no_add_attrs = true;
|
||||
*no_add_attrs = true;
|
||||
}
|
||||
return NULL_TREE;
|
||||
}
|
||||
@ -5201,7 +5368,7 @@ handle_nonnull_attribute (tree *node, tree name ATTRIBUTE_UNUSED,
|
||||
for (attr_arg_num = 1; args; args = TREE_CHAIN (args))
|
||||
{
|
||||
tree argument;
|
||||
unsigned HOST_WIDE_INT arg_num, ck_num;
|
||||
unsigned HOST_WIDE_INT arg_num = 0, ck_num;
|
||||
|
||||
if (! get_nonnull_operand (TREE_VALUE (args), &arg_num))
|
||||
{
|
||||
@ -5221,7 +5388,7 @@ handle_nonnull_attribute (tree *node, tree name ATTRIBUTE_UNUSED,
|
||||
argument = TREE_CHAIN (argument);
|
||||
}
|
||||
|
||||
if (! argument
|
||||
if (! argument
|
||||
|| TREE_CODE (TREE_VALUE (argument)) == VOID_TYPE)
|
||||
{
|
||||
error ("nonnull argument with out-of-range operand number (arg %lu, operand %lu)",
|
||||
@ -5230,7 +5397,7 @@ handle_nonnull_attribute (tree *node, tree name ATTRIBUTE_UNUSED,
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
if (TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE)
|
||||
if (TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE)
|
||||
{
|
||||
error ("nonnull argument references non-pointer operand (arg %lu, operand %lu)",
|
||||
(unsigned long) attr_arg_num, (unsigned long) arg_num);
|
||||
@ -5256,22 +5423,22 @@ check_function_nonnull (tree attrs, tree params)
|
||||
{
|
||||
if (is_attribute_p ("nonnull", TREE_PURPOSE (a)))
|
||||
{
|
||||
args = TREE_VALUE (a);
|
||||
args = TREE_VALUE (a);
|
||||
|
||||
/* Walk the argument list. If we encounter an argument number we
|
||||
should check for non-null, do it. If the attribute has no args,
|
||||
then every pointer argument is checked (in which case the check
|
||||
/* Walk the argument list. If we encounter an argument number we
|
||||
should check for non-null, do it. If the attribute has no args,
|
||||
then every pointer argument is checked (in which case the check
|
||||
for pointer type is done in check_nonnull_arg). */
|
||||
for (param = params, param_num = 1; ;
|
||||
param_num++, param = TREE_CHAIN (param))
|
||||
{
|
||||
if (! param)
|
||||
for (param = params, param_num = 1; ;
|
||||
param_num++, param = TREE_CHAIN (param))
|
||||
{
|
||||
if (! param)
|
||||
break;
|
||||
if (! args || nonnull_check_p (args, param_num))
|
||||
if (! args || nonnull_check_p (args, param_num))
|
||||
check_function_arguments_recurse (check_nonnull_arg, NULL,
|
||||
TREE_VALUE (param),
|
||||
param_num);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -5283,12 +5450,12 @@ check_function_nonnull (tree attrs, tree params)
|
||||
static bool
|
||||
nonnull_check_p (tree args, unsigned HOST_WIDE_INT param_num)
|
||||
{
|
||||
unsigned HOST_WIDE_INT arg_num;
|
||||
unsigned HOST_WIDE_INT arg_num = 0;
|
||||
|
||||
for (; args; args = TREE_CHAIN (args))
|
||||
{
|
||||
if (! get_nonnull_operand (TREE_VALUE (args), &arg_num))
|
||||
abort ();
|
||||
abort ();
|
||||
|
||||
if (arg_num == param_num)
|
||||
return true;
|
||||
@ -5313,7 +5480,7 @@ check_nonnull_arg (void *ctx ATTRIBUTE_UNUSED, tree param,
|
||||
|
||||
if (integer_zerop (param))
|
||||
warning ("null argument where non-null required (arg %lu)",
|
||||
(unsigned long) param_num);
|
||||
(unsigned long) param_num);
|
||||
}
|
||||
|
||||
/* Helper for nonnull attribute handling; fetch the operand number
|
||||
@ -5447,7 +5614,7 @@ check_function_arguments_recurse (void (*callback)
|
||||
{
|
||||
/* Strip coercion. */
|
||||
check_function_arguments_recurse (callback, ctx,
|
||||
TREE_OPERAND (param, 0), param_num);
|
||||
TREE_OPERAND (param, 0), param_num);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -5509,15 +5676,74 @@ check_function_arguments_recurse (void (*callback)
|
||||
{
|
||||
/* Check both halves of the conditional expression. */
|
||||
check_function_arguments_recurse (callback, ctx,
|
||||
TREE_OPERAND (param, 1), param_num);
|
||||
TREE_OPERAND (param, 1), param_num);
|
||||
check_function_arguments_recurse (callback, ctx,
|
||||
TREE_OPERAND (param, 2), param_num);
|
||||
TREE_OPERAND (param, 2), param_num);
|
||||
return;
|
||||
}
|
||||
|
||||
(*callback) (ctx, param, param_num);
|
||||
}
|
||||
|
||||
/* C implementation of lang_hooks.tree_inlining.walk_subtrees. Tracks the
|
||||
locus from EXPR_LOCUS and handles DECL_STMT specially. */
|
||||
|
||||
tree
|
||||
c_walk_subtrees (tree *tp, int *walk_subtrees_p ATTRIBUTE_UNUSED,
|
||||
walk_tree_fn func, void *data, void *htab)
|
||||
{
|
||||
enum tree_code code = TREE_CODE (*tp);
|
||||
location_t save_locus;
|
||||
tree result;
|
||||
|
||||
#define WALK_SUBTREE(NODE) \
|
||||
do \
|
||||
{ \
|
||||
result = walk_tree (&(NODE), func, data, htab); \
|
||||
if (result) goto out; \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
if (code != DECL_STMT)
|
||||
return NULL_TREE;
|
||||
|
||||
/* Set input_location here so we get the right instantiation context
|
||||
if we call instantiate_decl from inlinable_function_p. */
|
||||
save_locus = input_location;
|
||||
if (EXPR_LOCUS (*tp))
|
||||
input_location = *EXPR_LOCUS (*tp);
|
||||
|
||||
/* Walk the DECL_INITIAL and DECL_SIZE. We don't want to walk
|
||||
into declarations that are just mentioned, rather than
|
||||
declared; they don't really belong to this part of the tree.
|
||||
And, we can see cycles: the initializer for a declaration can
|
||||
refer to the declaration itself. */
|
||||
WALK_SUBTREE (DECL_INITIAL (DECL_STMT_DECL (*tp)));
|
||||
WALK_SUBTREE (DECL_SIZE (DECL_STMT_DECL (*tp)));
|
||||
WALK_SUBTREE (DECL_SIZE_UNIT (DECL_STMT_DECL (*tp)));
|
||||
WALK_SUBTREE (TREE_CHAIN (*tp));
|
||||
*walk_subtrees_p = 0;
|
||||
|
||||
/* We didn't find what we were looking for. */
|
||||
out:
|
||||
input_location = save_locus;
|
||||
return result;
|
||||
|
||||
#undef WALK_SUBTREE
|
||||
}
|
||||
|
||||
/* C implementation of lang_hooks.tree_inlining.tree_chain_matters_p.
|
||||
Apart from TREE_LISTs, the only trees whose TREE_CHAIN we care about are
|
||||
_STMT nodes. */
|
||||
|
||||
int
|
||||
c_tree_chain_matters_p (tree t)
|
||||
{
|
||||
/* For statements, we also walk the chain so that we cover the
|
||||
entire statement tree. */
|
||||
return STATEMENT_CODE_P (TREE_CODE (t));
|
||||
}
|
||||
|
||||
/* Function to help qsort sort FIELD_DECLs by name order. */
|
||||
|
||||
int
|
||||
@ -5573,15 +5799,15 @@ resort_field_decl_cmp (const void *x_p, const void *y_p)
|
||||
|
||||
void
|
||||
resort_sorted_fields (void *obj,
|
||||
void *orig_obj ATTRIBUTE_UNUSED ,
|
||||
gt_pointer_operator new_value,
|
||||
void *cookie)
|
||||
void *orig_obj ATTRIBUTE_UNUSED ,
|
||||
gt_pointer_operator new_value,
|
||||
void *cookie)
|
||||
{
|
||||
struct sorted_fields_type *sf = obj;
|
||||
resort_data.new_value = new_value;
|
||||
resort_data.cookie = cookie;
|
||||
qsort (&sf->elts[0], sf->len, sizeof (tree),
|
||||
resort_field_decl_cmp);
|
||||
resort_field_decl_cmp);
|
||||
}
|
||||
|
||||
/* Used by estimate_num_insns. Estimate number of instructions seen
|
||||
@ -5675,14 +5901,12 @@ c_estimate_num_insns_1 (tree *tp, int *walk_subtrees, void *data)
|
||||
case EXIT_EXPR:
|
||||
case LABELED_BLOCK_EXPR:
|
||||
case EXIT_BLOCK_EXPR:
|
||||
case EXPR_WITH_FILE_LOCATION:
|
||||
|
||||
case EXPR_STMT:
|
||||
case COMPOUND_STMT:
|
||||
case RETURN_STMT:
|
||||
case LABEL_STMT:
|
||||
case SCOPE_STMT:
|
||||
case FILE_STMT:
|
||||
case CASE_LABEL:
|
||||
case STMT_EXPR:
|
||||
case CLEANUP_STMT:
|
||||
@ -5711,37 +5935,6 @@ c_estimate_num_insns (tree decl)
|
||||
return num;
|
||||
}
|
||||
|
||||
/* Used by c_decl_uninit to find where expressions like x = x + 1; */
|
||||
|
||||
static tree
|
||||
c_decl_uninit_1 (tree *t, int *walk_sub_trees, void *x)
|
||||
{
|
||||
/* If x = EXP(&x)EXP, then do not warn about the use of x. */
|
||||
if (TREE_CODE (*t) == ADDR_EXPR && TREE_OPERAND (*t, 0) == x)
|
||||
{
|
||||
*walk_sub_trees = 0;
|
||||
return NULL_TREE;
|
||||
}
|
||||
if (*t == x)
|
||||
return *t;
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
/* Find out if a variable is uninitialized based on DECL_INITIAL. */
|
||||
|
||||
bool
|
||||
c_decl_uninit (tree t)
|
||||
{
|
||||
/* int x = x; is GCC extension to turn off this warning, only if warn_init_self is zero. */
|
||||
if (DECL_INITIAL (t) == t)
|
||||
return warn_init_self ? true : false;
|
||||
|
||||
/* Walk the trees looking for the variable itself. */
|
||||
if (walk_tree_without_duplicates (&DECL_INITIAL (t), c_decl_uninit_1, t))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Issue the error given by MSGID, indicating that it occurred before
|
||||
TOKEN, which had the associated VALUE. */
|
||||
|
||||
@ -5774,4 +5967,74 @@ c_parse_error (const char *msgid, enum cpp_ttype token, tree value)
|
||||
error ("%s", string);
|
||||
}
|
||||
|
||||
/* Walk a gimplified function and warn for functions whose return value is
|
||||
ignored and attribute((warn_unused_result)) is set. This is done before
|
||||
inlining, so we don't have to worry about that. */
|
||||
|
||||
void
|
||||
c_warn_unused_result (tree *top_p)
|
||||
{
|
||||
tree t = *top_p;
|
||||
tree_stmt_iterator i;
|
||||
tree fdecl, ftype;
|
||||
|
||||
switch (TREE_CODE (t))
|
||||
{
|
||||
case STATEMENT_LIST:
|
||||
for (i = tsi_start (*top_p); !tsi_end_p (i); tsi_next (&i))
|
||||
c_warn_unused_result (tsi_stmt_ptr (i));
|
||||
break;
|
||||
|
||||
case COND_EXPR:
|
||||
c_warn_unused_result (&COND_EXPR_THEN (t));
|
||||
c_warn_unused_result (&COND_EXPR_ELSE (t));
|
||||
break;
|
||||
case BIND_EXPR:
|
||||
c_warn_unused_result (&BIND_EXPR_BODY (t));
|
||||
break;
|
||||
case TRY_FINALLY_EXPR:
|
||||
case TRY_CATCH_EXPR:
|
||||
c_warn_unused_result (&TREE_OPERAND (t, 0));
|
||||
c_warn_unused_result (&TREE_OPERAND (t, 1));
|
||||
break;
|
||||
case CATCH_EXPR:
|
||||
c_warn_unused_result (&CATCH_BODY (t));
|
||||
break;
|
||||
case EH_FILTER_EXPR:
|
||||
c_warn_unused_result (&EH_FILTER_FAILURE (t));
|
||||
break;
|
||||
|
||||
case CALL_EXPR:
|
||||
/* This is a naked call, as opposed to a CALL_EXPR nested inside
|
||||
a MODIFY_EXPR. All calls whose value is ignored should be
|
||||
represented like this. Look for the attribute. */
|
||||
fdecl = get_callee_fndecl (t);
|
||||
if (fdecl)
|
||||
ftype = TREE_TYPE (fdecl);
|
||||
else
|
||||
{
|
||||
ftype = TREE_TYPE (TREE_OPERAND (t, 0));
|
||||
/* Look past pointer-to-function to the function type itself. */
|
||||
ftype = TREE_TYPE (ftype);
|
||||
}
|
||||
|
||||
if (lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (ftype)))
|
||||
{
|
||||
if (fdecl)
|
||||
warning ("%Hignoring return value of `%D', "
|
||||
"declared with attribute warn_unused_result",
|
||||
EXPR_LOCUS (t), fdecl);
|
||||
else
|
||||
warning ("%Hignoring return value of function "
|
||||
"declared with attribute warn_unused_result",
|
||||
EXPR_LOCUS (t));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Not a container, not a call, or a call whose value is used. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#include "gt-c-common.h"
|
||||
|
@ -79,7 +79,7 @@ DEFTREECODE (GOTO_STMT, "goto_stmt", 'e', 1)
|
||||
DEFTREECODE (LABEL_STMT, "label_stmt", 'e', 1)
|
||||
|
||||
/* Used to represent an inline assembly statement. */
|
||||
DEFTREECODE (ASM_STMT, "asm_stmt", 'e', 5)
|
||||
DEFTREECODE (ASM_STMT, "asm_stmt", 'e', 4)
|
||||
|
||||
/* A SCOPE_STMT marks the beginning or end of a scope. If
|
||||
SCOPE_BEGIN_P holds, then this is the start of a scope. If
|
||||
@ -89,10 +89,6 @@ DEFTREECODE (ASM_STMT, "asm_stmt", 'e', 5)
|
||||
variables declared in this scope. */
|
||||
DEFTREECODE (SCOPE_STMT, "scope_stmt", 'e', 1)
|
||||
|
||||
/* A FILE_STMT marks the spot where a function changes files. It has no
|
||||
other semantics. FILE_STMT_FILENAME gives the name. */
|
||||
DEFTREECODE (FILE_STMT, "file_stmt", 'e', 1)
|
||||
|
||||
/* Used to represent a CASE_LABEL. The operands are CASE_LOW and
|
||||
CASE_HIGH, respectively. If CASE_LOW is NULL_TREE, the label is a
|
||||
'default' label. If CASE_HIGH is NULL_TREE, the label is a normal case
|
||||
|
@ -37,10 +37,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
STMT_EXPR_NO_SCOPE (in STMT_EXPR)
|
||||
1: C_DECLARED_LABEL_FLAG (in LABEL_DECL)
|
||||
STMT_IS_FULL_EXPR_P (in _STMT)
|
||||
2: STMT_LINENO_FOR_FN_P (in _STMT)
|
||||
2: unused
|
||||
3: SCOPE_NO_CLEANUPS_P (in SCOPE_STMT)
|
||||
COMPOUND_STMT_BODY_BLOCK (in COMPOUND_STMT)
|
||||
STMT_EXPR_WARN_UNUSED_RESULT (in STMT_EXPR)
|
||||
4: SCOPE_PARTIAL_P (in SCOPE_STMT)
|
||||
*/
|
||||
|
||||
@ -321,8 +320,7 @@ struct c_language_function GTY(()) {
|
||||
|
||||
/* Language-specific hooks. */
|
||||
|
||||
extern void (*lang_expand_stmt) (tree);
|
||||
extern void (*lang_expand_decl_stmt) (tree);
|
||||
extern int (*lang_gimplify_stmt) (tree *, tree *);
|
||||
extern void (*lang_expand_function_end) (void);
|
||||
|
||||
/* Callback that determines if it's ok for a function to have no
|
||||
@ -342,7 +340,6 @@ extern void finish_stmt_tree (tree *);
|
||||
|
||||
extern tree walk_stmt_tree (tree *, walk_tree_fn, void *);
|
||||
extern void prep_stmt (tree);
|
||||
extern void expand_stmt (tree);
|
||||
extern tree c_begin_if_stmt (void);
|
||||
extern tree c_begin_while_stmt (void);
|
||||
extern void c_finish_while_stmt_cond (tree, tree);
|
||||
@ -999,22 +996,9 @@ extern void finish_file (void);
|
||||
#define FOR_EXPR(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 2)
|
||||
#define FOR_BODY(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 3)
|
||||
|
||||
/* SWITCH_STMT accessors. These give access to the condition, body and
|
||||
original condition type (before any compiler conversions)
|
||||
of the switch statement, respectively. */
|
||||
#define SWITCH_COND(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 0)
|
||||
#define SWITCH_BODY(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 1)
|
||||
#define SWITCH_TYPE(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 2)
|
||||
|
||||
/* CASE_LABEL accessors. These give access to the high and low values
|
||||
of a case label, respectively. */
|
||||
#define CASE_LOW(NODE) TREE_OPERAND (CASE_LABEL_CHECK (NODE), 0)
|
||||
#define CASE_HIGH(NODE) TREE_OPERAND (CASE_LABEL_CHECK (NODE), 1)
|
||||
#define CASE_LABEL_DECL(NODE) TREE_OPERAND (CASE_LABEL_CHECK (NODE), 2)
|
||||
|
||||
/* GOTO_STMT accessor. This gives access to the label associated with
|
||||
a goto statement. */
|
||||
#define GOTO_DESTINATION(NODE) TREE_OPERAND (GOTO_STMT_CHECK (NODE), 0)
|
||||
/* True for goto created artificially by the compiler. */
|
||||
#define GOTO_FAKE_P(NODE) (TREE_LANG_FLAG_0 (GOTO_STMT_CHECK (NODE)))
|
||||
|
||||
@ -1024,16 +1008,6 @@ extern void finish_file (void);
|
||||
calling TREE_CHAIN on a node in the list. */
|
||||
#define COMPOUND_BODY(NODE) TREE_OPERAND (COMPOUND_STMT_CHECK (NODE), 0)
|
||||
|
||||
/* ASM_STMT accessors. ASM_STRING returns a STRING_CST for the
|
||||
instruction (e.g., "mov x, y"). ASM_OUTPUTS, ASM_INPUTS, and
|
||||
ASM_CLOBBERS represent the outputs, inputs, and clobbers for the
|
||||
statement. */
|
||||
#define ASM_CV_QUAL(NODE) TREE_OPERAND (ASM_STMT_CHECK (NODE), 0)
|
||||
#define ASM_STRING(NODE) TREE_OPERAND (ASM_STMT_CHECK (NODE), 1)
|
||||
#define ASM_OUTPUTS(NODE) TREE_OPERAND (ASM_STMT_CHECK (NODE), 2)
|
||||
#define ASM_INPUTS(NODE) TREE_OPERAND (ASM_STMT_CHECK (NODE), 3)
|
||||
#define ASM_CLOBBERS(NODE) TREE_OPERAND (ASM_STMT_CHECK (NODE), 4)
|
||||
|
||||
/* DECL_STMT accessor. This gives access to the DECL associated with
|
||||
the given declaration statement. */
|
||||
#define DECL_STMT_DECL(NODE) TREE_OPERAND (DECL_STMT_CHECK (NODE), 0)
|
||||
@ -1045,11 +1019,6 @@ extern void finish_file (void);
|
||||
#define STMT_EXPR_NO_SCOPE(NODE) \
|
||||
TREE_LANG_FLAG_0 (STMT_EXPR_CHECK (NODE))
|
||||
|
||||
/* Nonzero if this statement-expression should cause warning if its result
|
||||
is not used. */
|
||||
#define STMT_EXPR_WARN_UNUSED_RESULT(NODE) \
|
||||
TREE_LANG_FLAG_3 (STMT_EXPR_CHECK (NODE))
|
||||
|
||||
/* LABEL_STMT accessor. This gives access to the label associated with
|
||||
the given label statement. */
|
||||
#define LABEL_STMT_LABEL(NODE) TREE_OPERAND (LABEL_STMT_CHECK (NODE), 0)
|
||||
@ -1097,10 +1066,6 @@ extern void finish_file (void);
|
||||
#define SCOPE_PARTIAL_P(NODE) \
|
||||
(TREE_LANG_FLAG_4 (SCOPE_STMT_CHECK (NODE)))
|
||||
|
||||
/* Nonzero for an ASM_STMT if the assembly statement is volatile. */
|
||||
#define ASM_VOLATILE_P(NODE) \
|
||||
(ASM_CV_QUAL (ASM_STMT_CHECK (NODE)) != NULL_TREE)
|
||||
|
||||
/* The VAR_DECL to clean up in a CLEANUP_STMT. */
|
||||
#define CLEANUP_DECL(NODE) \
|
||||
TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 0)
|
||||
@ -1108,31 +1073,10 @@ extern void finish_file (void);
|
||||
#define CLEANUP_EXPR(NODE) \
|
||||
TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 1)
|
||||
|
||||
/* The filename we are changing to as of this FILE_STMT. */
|
||||
#define FILE_STMT_FILENAME_NODE(NODE) \
|
||||
(TREE_OPERAND (FILE_STMT_CHECK (NODE), 0))
|
||||
#define FILE_STMT_FILENAME(NODE) \
|
||||
(IDENTIFIER_POINTER (FILE_STMT_FILENAME_NODE (NODE)))
|
||||
|
||||
/* The line-number at which a statement began. But if
|
||||
STMT_LINENO_FOR_FN_P does holds, then this macro gives the
|
||||
line number for the end of the current function instead. */
|
||||
#define STMT_LINENO(NODE) \
|
||||
(TREE_COMPLEXITY ((NODE)))
|
||||
|
||||
/* If nonzero, the STMT_LINENO for NODE is the line at which the
|
||||
function ended. */
|
||||
#define STMT_LINENO_FOR_FN_P(NODE) \
|
||||
(TREE_LANG_FLAG_2 ((NODE)))
|
||||
|
||||
/* Nonzero if we want the new ISO rules for pushing a new scope for `for'
|
||||
initialization variables. */
|
||||
#define NEW_FOR_SCOPE_P(NODE) (TREE_LANG_FLAG_0 (NODE))
|
||||
|
||||
/* Nonzero if we want to create an ASM_INPUT instead of an
|
||||
ASM_OPERAND with no operands. */
|
||||
#define ASM_INPUT_P(NODE) (TREE_LANG_FLAG_0 (NODE))
|
||||
|
||||
#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) SYM,
|
||||
|
||||
enum c_tree_code {
|
||||
@ -1149,7 +1093,7 @@ enum c_tree_code {
|
||||
WHILE_STMT, DO_STMT, RETURN_STMT, \
|
||||
BREAK_STMT, CONTINUE_STMT, SCOPE_STMT, \
|
||||
SWITCH_STMT, GOTO_STMT, LABEL_STMT, \
|
||||
ASM_STMT, FILE_STMT, CASE_LABEL
|
||||
ASM_STMT, CASE_LABEL
|
||||
|
||||
/* TRUE if a code represents a statement. The front end init
|
||||
langhook should take care of initialization of this array. */
|
||||
@ -1165,24 +1109,6 @@ extern bool statement_code_p[MAX_TREE_CODES];
|
||||
statement_code_p[STMT_CODES[i]] = true; \
|
||||
} while (0)
|
||||
|
||||
extern void genrtl_do_pushlevel (void);
|
||||
extern void genrtl_goto_stmt (tree);
|
||||
extern void genrtl_expr_stmt (tree);
|
||||
extern void genrtl_expr_stmt_value (tree, int, int);
|
||||
extern void genrtl_decl_stmt (tree);
|
||||
extern void genrtl_if_stmt (tree);
|
||||
extern void genrtl_while_stmt (tree);
|
||||
extern void genrtl_do_stmt (tree);
|
||||
extern void genrtl_return_stmt (tree);
|
||||
extern void genrtl_for_stmt (tree);
|
||||
extern void genrtl_break_stmt (void);
|
||||
extern void genrtl_continue_stmt (void);
|
||||
extern void genrtl_scope_stmt (tree);
|
||||
extern void genrtl_switch_stmt (tree);
|
||||
extern void genrtl_case_label (tree);
|
||||
extern void genrtl_compound_stmt (tree);
|
||||
extern void genrtl_asm_stmt (tree, tree, tree, tree, tree, int);
|
||||
extern void genrtl_cleanup_stmt (tree);
|
||||
extern int stmts_are_full_exprs_p (void);
|
||||
extern int anon_aggr_type_p (tree);
|
||||
|
||||
@ -1198,13 +1124,8 @@ extern int anon_aggr_type_p (tree);
|
||||
#define CLEAR_DECL_C_BIT_FIELD(NODE) \
|
||||
(DECL_LANG_FLAG_4 (FIELD_DECL_CHECK (NODE)) = 0)
|
||||
|
||||
/* In a VAR_DECL, nonzero if the decl is a register variable with
|
||||
an explicit asm specification. */
|
||||
#define DECL_C_HARD_REGISTER(DECL) DECL_LANG_FLAG_4 (VAR_DECL_CHECK (DECL))
|
||||
|
||||
extern void emit_local_var (tree);
|
||||
extern void make_rtl_for_local_static (tree);
|
||||
extern tree expand_cond (tree);
|
||||
extern tree c_expand_return (tree);
|
||||
extern tree do_case (tree, tree);
|
||||
extern tree build_stmt (enum tree_code, ...);
|
||||
@ -1249,6 +1170,8 @@ extern int case_compare (splay_tree_key, splay_tree_key);
|
||||
|
||||
extern tree c_add_case_label (splay_tree, tree, tree, tree);
|
||||
|
||||
extern void c_do_switch_warnings (splay_tree, tree);
|
||||
|
||||
extern tree build_function_call (tree, tree);
|
||||
|
||||
extern tree finish_label_address_expr (tree);
|
||||
@ -1289,6 +1212,17 @@ extern void dump_time_statistics (void);
|
||||
|
||||
extern bool c_dump_tree (void *, tree);
|
||||
|
||||
extern int c_gimplify_expr (tree *, tree *, tree *);
|
||||
extern tree c_walk_subtrees (tree*, int*, walk_tree_fn, void*, void*);
|
||||
extern int c_tree_chain_matters_p (tree);
|
||||
|
||||
extern void c_warn_unused_result (tree *);
|
||||
|
||||
/* In c-simplify.c */
|
||||
extern void c_genericize (tree);
|
||||
extern int c_gimplify_stmt (tree *);
|
||||
extern tree stmt_expr_last_stmt (tree);
|
||||
|
||||
extern void pch_init (void);
|
||||
extern int c_common_valid_pch (cpp_reader *pfile, const char *name, int fd);
|
||||
extern void c_common_read_pch (cpp_reader *pfile, const char *name, int fd,
|
||||
@ -1299,7 +1233,6 @@ extern void builtin_define_with_value (const char *, const char *, int);
|
||||
extern void c_stddef_cpp_builtins (void);
|
||||
extern void fe_file_change (const struct line_map *);
|
||||
extern int c_estimate_num_insns (tree decl);
|
||||
extern bool c_decl_uninit (tree t);
|
||||
extern void c_parse_error (const char *, enum cpp_ttype, tree);
|
||||
|
||||
/* The following have been moved here from c-tree.h, since they're needed
|
||||
|
@ -114,6 +114,9 @@ convert (tree type, tree expr)
|
||||
return fold (convert_to_complex (type, e));
|
||||
if (code == VECTOR_TYPE)
|
||||
return fold (convert_to_vector (type, e));
|
||||
if ((code == RECORD_TYPE || code == UNION_TYPE)
|
||||
&& lang_hooks.types_compatible_p (type, TREE_TYPE (expr)))
|
||||
return e;
|
||||
|
||||
error ("conversion to non-scalar type requested");
|
||||
return error_mark_node;
|
||||
|
229
gcc/c-decl.c
229
gcc/c-decl.c
@ -49,6 +49,11 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
#include "timevar.h"
|
||||
#include "c-common.h"
|
||||
#include "c-pragma.h"
|
||||
#include "langhooks.h"
|
||||
#include "tree-mudflap.h"
|
||||
#include "tree-simple.h"
|
||||
#include "diagnostic.h"
|
||||
#include "tree-dump.h"
|
||||
#include "cgraph.h"
|
||||
#include "hashtab.h"
|
||||
#include "libfuncs.h"
|
||||
@ -1664,7 +1669,7 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype)
|
||||
static bool
|
||||
duplicate_decls (tree newdecl, tree olddecl)
|
||||
{
|
||||
tree newtype, oldtype;
|
||||
tree newtype = NULL, oldtype = NULL;
|
||||
|
||||
if (!diagnose_mismatched_decls (newdecl, olddecl, &newtype, &oldtype))
|
||||
return false;
|
||||
@ -2113,10 +2118,6 @@ lookup_label (tree name)
|
||||
any that may be inherited from containing functions or containing
|
||||
scopes. This is called for __label__ declarations. */
|
||||
|
||||
/* Note that valid use, if the label being shadowed comes from another
|
||||
scope in the same function, requires calling declare_nonlocal_label
|
||||
right away. (Is this still true? -zw 2003-07-17) */
|
||||
|
||||
tree
|
||||
declare_label (tree name)
|
||||
{
|
||||
@ -2936,7 +2937,7 @@ finish_decl (tree decl, tree init, tree asmspec_tree)
|
||||
in a particular register. */
|
||||
if (C_DECL_REGISTER (decl))
|
||||
{
|
||||
DECL_C_HARD_REGISTER (decl) = 1;
|
||||
DECL_HARD_REGISTER (decl) = 1;
|
||||
/* This cannot be done for a structure with volatile
|
||||
fields, on which DECL_REGISTER will have been
|
||||
reset. */
|
||||
@ -3304,11 +3305,14 @@ check_bitfield_type_and_width (tree *type, tree *width, const char *orig_name)
|
||||
else
|
||||
w = tree_low_cst (*width, 1);
|
||||
|
||||
if (TREE_CODE (*type) == ENUMERAL_TYPE
|
||||
&& (w < min_precision (TYPE_MIN_VALUE (*type), TYPE_UNSIGNED (*type))
|
||||
|| w < min_precision (TYPE_MAX_VALUE (*type),
|
||||
TYPE_UNSIGNED (*type))))
|
||||
warning ("`%s' is narrower than values of its type", name);
|
||||
if (TREE_CODE (*type) == ENUMERAL_TYPE)
|
||||
{
|
||||
struct lang_type *lt = TYPE_LANG_SPECIFIC (*type);
|
||||
if (!lt
|
||||
|| w < min_precision (lt->enum_min, TYPE_UNSIGNED (*type))
|
||||
|| w < min_precision (lt->enum_max, TYPE_UNSIGNED (*type)))
|
||||
warning ("`%s' is narrower than values of its type", name);
|
||||
}
|
||||
}
|
||||
|
||||
/* Given declspecs and a declarator,
|
||||
@ -4059,6 +4063,11 @@ grokdeclarator (tree declarator, tree declspecs,
|
||||
TYPE_SIZE (type) = bitsize_zero_node;
|
||||
TYPE_SIZE_UNIT (type) = size_zero_node;
|
||||
}
|
||||
else if (declarator && TREE_CODE (declarator) == INDIRECT_REF)
|
||||
/* We can never complete an array type which is the target of a
|
||||
pointer, so go ahead and lay it out. */
|
||||
layout_type (type);
|
||||
|
||||
if (decl_context != PARM
|
||||
&& (array_ptr_quals != NULL_TREE || array_parm_static))
|
||||
{
|
||||
@ -5251,7 +5260,7 @@ finish_struct (tree t, tree fieldlist, tree attributes)
|
||||
ensure that this lives as long as the rest of the struct decl.
|
||||
All decls in an inline function need to be saved. */
|
||||
|
||||
space = ggc_alloc (sizeof (struct lang_type));
|
||||
space = ggc_alloc_cleared (sizeof (struct lang_type));
|
||||
space2 = ggc_alloc (sizeof (struct sorted_fields_type) + len * sizeof (tree));
|
||||
|
||||
len = 0;
|
||||
@ -5386,9 +5395,10 @@ tree
|
||||
finish_enum (tree enumtype, tree values, tree attributes)
|
||||
{
|
||||
tree pair, tem;
|
||||
tree minnode = 0, maxnode = 0, enum_value_type;
|
||||
tree minnode = 0, maxnode = 0;
|
||||
int precision, unsign;
|
||||
bool toplevel = (file_scope == current_scope);
|
||||
struct lang_type *lt;
|
||||
|
||||
decl_attributes (&enumtype, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE);
|
||||
|
||||
@ -5418,27 +5428,20 @@ finish_enum (tree enumtype, tree values, tree attributes)
|
||||
min_precision (maxnode, unsign));
|
||||
if (TYPE_PACKED (enumtype) || precision > TYPE_PRECISION (integer_type_node))
|
||||
{
|
||||
tree narrowest = c_common_type_for_size (precision, unsign);
|
||||
if (narrowest == 0)
|
||||
tem = c_common_type_for_size (precision, unsign);
|
||||
if (tem == NULL)
|
||||
{
|
||||
warning ("enumeration values exceed range of largest integer");
|
||||
narrowest = long_long_integer_type_node;
|
||||
tem = long_long_integer_type_node;
|
||||
}
|
||||
|
||||
precision = TYPE_PRECISION (narrowest);
|
||||
}
|
||||
else
|
||||
precision = TYPE_PRECISION (integer_type_node);
|
||||
tem = unsign ? unsigned_type_node : integer_type_node;
|
||||
|
||||
if (precision == TYPE_PRECISION (integer_type_node))
|
||||
enum_value_type = c_common_type_for_size (precision, 0);
|
||||
else
|
||||
enum_value_type = enumtype;
|
||||
|
||||
TYPE_MIN_VALUE (enumtype) = minnode;
|
||||
TYPE_MAX_VALUE (enumtype) = maxnode;
|
||||
TYPE_PRECISION (enumtype) = precision;
|
||||
TYPE_UNSIGNED (enumtype) = unsign;
|
||||
TYPE_MIN_VALUE (enumtype) = TYPE_MIN_VALUE (tem);
|
||||
TYPE_MAX_VALUE (enumtype) = TYPE_MAX_VALUE (tem);
|
||||
TYPE_PRECISION (enumtype) = TYPE_PRECISION (tem);
|
||||
TYPE_UNSIGNED (enumtype) = TYPE_UNSIGNED (tem);
|
||||
TYPE_SIZE (enumtype) = 0;
|
||||
layout_type (enumtype);
|
||||
|
||||
@ -5454,6 +5457,7 @@ finish_enum (tree enumtype, tree values, tree attributes)
|
||||
for (pair = values; pair; pair = TREE_CHAIN (pair))
|
||||
{
|
||||
tree enu = TREE_PURPOSE (pair);
|
||||
tree ini = DECL_INITIAL (enu);
|
||||
|
||||
TREE_TYPE (enu) = enumtype;
|
||||
|
||||
@ -5464,18 +5468,27 @@ finish_enum (tree enumtype, tree values, tree attributes)
|
||||
when comparing integers with enumerators that fit in the
|
||||
int range. When -pedantic is given, build_enumerator()
|
||||
would have already taken care of those that don't fit. */
|
||||
if (int_fits_type_p (DECL_INITIAL (enu), enum_value_type))
|
||||
DECL_INITIAL (enu) = convert (enum_value_type, DECL_INITIAL (enu));
|
||||
if (int_fits_type_p (ini, integer_type_node))
|
||||
tem = integer_type_node;
|
||||
else
|
||||
DECL_INITIAL (enu) = convert (enumtype, DECL_INITIAL (enu));
|
||||
tem = enumtype;
|
||||
ini = convert (tem, ini);
|
||||
|
||||
DECL_INITIAL (enu) = ini;
|
||||
TREE_PURPOSE (pair) = DECL_NAME (enu);
|
||||
TREE_VALUE (pair) = DECL_INITIAL (enu);
|
||||
TREE_VALUE (pair) = ini;
|
||||
}
|
||||
|
||||
TYPE_VALUES (enumtype) = values;
|
||||
}
|
||||
|
||||
/* Record the min/max values so that we can warn about bit-field
|
||||
enumerations that are too small for the values. */
|
||||
lt = ggc_alloc_cleared (sizeof (struct lang_type));
|
||||
lt->enum_min = minnode;
|
||||
lt->enum_max = maxnode;
|
||||
TYPE_LANG_SPECIFIC (enumtype) = lt;
|
||||
|
||||
/* Fix up all variant types of this enum type. */
|
||||
for (tem = TYPE_MAIN_VARIANT (enumtype); tem; tem = TYPE_NEXT_VARIANT (tem))
|
||||
{
|
||||
@ -5491,6 +5504,7 @@ finish_enum (tree enumtype, tree values, tree attributes)
|
||||
TYPE_ALIGN (tem) = TYPE_ALIGN (enumtype);
|
||||
TYPE_USER_ALIGN (tem) = TYPE_USER_ALIGN (enumtype);
|
||||
TYPE_UNSIGNED (tem) = TYPE_UNSIGNED (enumtype);
|
||||
TYPE_LANG_SPECIFIC (tem) = TYPE_LANG_SPECIFIC (enumtype);
|
||||
}
|
||||
|
||||
/* Finish debugging output for this type. */
|
||||
@ -6085,6 +6099,25 @@ store_parm_decls_oldstyle (tree fndecl, tree arg_info)
|
||||
}
|
||||
}
|
||||
|
||||
/* A subroutine of store_parm_decls called via walk_tree. Mark all
|
||||
decls non-local. */
|
||||
|
||||
static tree
|
||||
set_decl_nonlocal (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
|
||||
{
|
||||
tree t = *tp;
|
||||
|
||||
if (DECL_P (t))
|
||||
{
|
||||
DECL_NONLOCAL (t) = 1;
|
||||
*walk_subtrees = 0;
|
||||
}
|
||||
else if (TYPE_P (t))
|
||||
*walk_subtrees = 0;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Store the parameter declarations into the current function declaration.
|
||||
This is called after parsing the parameter declarations, before
|
||||
digesting the body of the function.
|
||||
@ -6142,7 +6175,14 @@ store_parm_decls (void)
|
||||
for (t = DECL_LANG_SPECIFIC (fndecl)->pending_sizes;
|
||||
t;
|
||||
t = TREE_CHAIN (t))
|
||||
SAVE_EXPR_CONTEXT (TREE_VALUE (t)) = context;
|
||||
{
|
||||
/* We will have a nonlocal use of whatever variables are
|
||||
buried inside here. */
|
||||
walk_tree (&TREE_OPERAND (TREE_VALUE (t), 0),
|
||||
set_decl_nonlocal, NULL, NULL);
|
||||
|
||||
SAVE_EXPR_CONTEXT (TREE_VALUE (t)) = context;
|
||||
}
|
||||
}
|
||||
|
||||
/* This function is being processed in whole-function mode. */
|
||||
@ -6156,6 +6196,32 @@ store_parm_decls (void)
|
||||
cfun->x_dont_save_pending_sizes_p = 1;
|
||||
}
|
||||
|
||||
/* Give FNDECL and all its nested functions to cgraph for compilation. */
|
||||
|
||||
static void
|
||||
c_finalize (tree fndecl)
|
||||
{
|
||||
struct cgraph_node *cgn;
|
||||
|
||||
/* Handle attribute((warn_unused_result)). Relies on gimple input. */
|
||||
c_warn_unused_result (&DECL_SAVED_TREE (fndecl));
|
||||
|
||||
/* ??? Objc emits functions after finalizing the compilation unit.
|
||||
This should be cleaned up later and this conditional removed. */
|
||||
if (cgraph_global_info_ready)
|
||||
{
|
||||
c_expand_body (fndecl);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Finalize all nested functions now. */
|
||||
cgn = cgraph_node (fndecl);
|
||||
for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested)
|
||||
c_finalize (cgn->decl);
|
||||
|
||||
cgraph_finalize_function (fndecl, false);
|
||||
}
|
||||
|
||||
/* Finish up a function declaration and compile that function
|
||||
all the way to assembler language output. The free the storage
|
||||
for the function definition.
|
||||
@ -6253,17 +6319,44 @@ finish_function (void)
|
||||
&& current_function_returns_null)
|
||||
warning ("this function may return with or without a value");
|
||||
|
||||
/* Store the end of the function, so that we get good line number
|
||||
info for the epilogue. */
|
||||
cfun->function_end_locus = input_location;
|
||||
|
||||
/* If we don't have ctors/dtors sections, and this is a static
|
||||
constructor or destructor, it must be recorded now. */
|
||||
if (DECL_STATIC_CONSTRUCTOR (fndecl)
|
||||
&& !targetm.have_ctors_dtors)
|
||||
static_ctors = tree_cons (NULL_TREE, fndecl, static_ctors);
|
||||
if (DECL_STATIC_DESTRUCTOR (fndecl)
|
||||
&& !targetm.have_ctors_dtors)
|
||||
static_dtors = tree_cons (NULL_TREE, fndecl, static_dtors);
|
||||
|
||||
/* Genericize before inlining. Delay genericizing nested functions
|
||||
until their parent function is genericized. Since finalizing
|
||||
requires GENERIC, delay that as well. */
|
||||
|
||||
if (DECL_INITIAL (fndecl) && DECL_INITIAL (fndecl) != error_mark_node)
|
||||
{
|
||||
if (!decl_function_context (fndecl))
|
||||
{
|
||||
c_genericize (fndecl);
|
||||
lower_nested_functions (fndecl);
|
||||
c_finalize (fndecl);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Register this function with cgraph just far enough to get it
|
||||
added to our parent's nested function list. Handy, since the
|
||||
C front end doesn't have such a list. */
|
||||
(void) cgraph_node (fndecl);
|
||||
}
|
||||
}
|
||||
|
||||
/* We're leaving the context of this function, so zap cfun.
|
||||
It's still in DECL_STRUCT_FUNCTION , and we'll restore it in
|
||||
It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
|
||||
tree_rest_of_compilation. */
|
||||
cfun = NULL;
|
||||
|
||||
/* ??? Objc emits functions after finalizing the compilation unit.
|
||||
This should be cleaned up later and this conditional removed. */
|
||||
if (!cgraph_global_info_ready)
|
||||
cgraph_finalize_function (fndecl, false);
|
||||
else
|
||||
c_expand_body (fndecl);
|
||||
current_function_decl = NULL;
|
||||
}
|
||||
|
||||
@ -6290,23 +6383,14 @@ c_expand_body_1 (tree fndecl, int nested_p)
|
||||
/* Return to the enclosing function. */
|
||||
pop_function_context ();
|
||||
|
||||
if (DECL_STATIC_CONSTRUCTOR (fndecl))
|
||||
{
|
||||
if (targetm.have_ctors_dtors)
|
||||
targetm.asm_out.constructor (XEXP (DECL_RTL (fndecl), 0),
|
||||
DEFAULT_INIT_PRIORITY);
|
||||
else
|
||||
static_ctors = tree_cons (NULL_TREE, fndecl, static_ctors);
|
||||
}
|
||||
|
||||
if (DECL_STATIC_DESTRUCTOR (fndecl))
|
||||
{
|
||||
if (targetm.have_ctors_dtors)
|
||||
targetm.asm_out.destructor (XEXP (DECL_RTL (fndecl), 0),
|
||||
DEFAULT_INIT_PRIORITY);
|
||||
else
|
||||
static_dtors = tree_cons (NULL_TREE, fndecl, static_dtors);
|
||||
}
|
||||
if (DECL_STATIC_CONSTRUCTOR (fndecl)
|
||||
&& targetm.have_ctors_dtors)
|
||||
targetm.asm_out.constructor (XEXP (DECL_RTL (fndecl), 0),
|
||||
DEFAULT_INIT_PRIORITY);
|
||||
if (DECL_STATIC_DESTRUCTOR (fndecl)
|
||||
&& targetm.have_ctors_dtors)
|
||||
targetm.asm_out.destructor (XEXP (DECL_RTL (fndecl), 0),
|
||||
DEFAULT_INIT_PRIORITY);
|
||||
}
|
||||
|
||||
/* Like c_expand_body_1 but only for unnested functions. */
|
||||
@ -6512,19 +6596,32 @@ c_begin_compound_stmt (void)
|
||||
return stmt;
|
||||
}
|
||||
|
||||
/* Expand T (a DECL_STMT) if it declares an entity not handled by the
|
||||
/* Expand DECL if it declares an entity not handled by the
|
||||
common code. */
|
||||
|
||||
void
|
||||
c_expand_decl_stmt (tree t)
|
||||
int
|
||||
c_expand_decl (tree decl)
|
||||
{
|
||||
tree decl = DECL_STMT_DECL (t);
|
||||
|
||||
if (TREE_CODE (decl) == VAR_DECL && !TREE_STATIC (decl))
|
||||
{
|
||||
/* Let the back-end know about this variable. */
|
||||
if (!anon_aggr_type_p (TREE_TYPE (decl)))
|
||||
emit_local_var (decl);
|
||||
else
|
||||
expand_anon_union_decl (decl, NULL_TREE,
|
||||
DECL_ANON_UNION_ELEMS (decl));
|
||||
}
|
||||
else if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
|
||||
make_rtl_for_local_static (decl);
|
||||
/* Expand nested functions. */
|
||||
if (TREE_CODE (decl) == FUNCTION_DECL
|
||||
&& DECL_CONTEXT (decl) == current_function_decl
|
||||
&& DECL_SAVED_TREE (decl))
|
||||
else if (TREE_CODE (decl) == FUNCTION_DECL
|
||||
&& DECL_CONTEXT (decl) == current_function_decl
|
||||
&& DECL_SAVED_TREE (decl))
|
||||
c_expand_body_1 (decl, 1);
|
||||
else
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Return the global value of T as a symbol. */
|
||||
|
@ -32,7 +32,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
void
|
||||
dump_stmt (dump_info_p di, tree t)
|
||||
{
|
||||
dump_int (di, "line", STMT_LINENO (t));
|
||||
location_t *locus = EXPR_LOCUS (t);
|
||||
if (locus)
|
||||
dump_int (di, "line", locus->line);
|
||||
}
|
||||
|
||||
/* Dump the next statement after STMT. */
|
||||
|
@ -86,7 +86,7 @@ handle_format_arg_attribute (tree *node, tree name ATTRIBUTE_UNUSED,
|
||||
{
|
||||
tree type = *node;
|
||||
tree format_num_expr = TREE_VALUE (args);
|
||||
unsigned HOST_WIDE_INT format_num;
|
||||
unsigned HOST_WIDE_INT format_num = 0;
|
||||
tree argument;
|
||||
|
||||
if (!get_constant (format_num_expr, &format_num, 0))
|
||||
|
30
gcc/c-lang.c
30
gcc/c-lang.c
@ -30,6 +30,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
#include "ggc.h"
|
||||
#include "langhooks.h"
|
||||
#include "langhooks-def.h"
|
||||
#include "tree-inline.h"
|
||||
#include "diagnostic.h"
|
||||
#include "c-pretty-print.h"
|
||||
|
||||
@ -63,6 +64,8 @@ enum c_language_kind c_language = clk_c;
|
||||
#define LANG_HOOKS_SAFE_FROM_P c_safe_from_p
|
||||
#undef LANG_HOOKS_EXPAND_EXPR
|
||||
#define LANG_HOOKS_EXPAND_EXPR c_expand_expr
|
||||
#undef LANG_HOOKS_EXPAND_DECL
|
||||
#define LANG_HOOKS_EXPAND_DECL c_expand_decl
|
||||
#undef LANG_HOOKS_MARK_ADDRESSABLE
|
||||
#define LANG_HOOKS_MARK_ADDRESSABLE c_mark_addressable
|
||||
#undef LANG_HOOKS_PARSE_FILE
|
||||
@ -89,13 +92,10 @@ enum c_language_kind c_language = clk_c;
|
||||
#define LANG_HOOKS_FUNCTION_ENTER_NESTED c_push_function_context
|
||||
#undef LANG_HOOKS_FUNCTION_LEAVE_NESTED
|
||||
#define LANG_HOOKS_FUNCTION_LEAVE_NESTED c_pop_function_context
|
||||
#undef LANG_HOOKS_FUNCTION_MISSING_NORETURN_OK_P
|
||||
#define LANG_HOOKS_FUNCTION_MISSING_NORETURN_OK_P c_missing_noreturn_ok_p
|
||||
#undef LANG_HOOKS_DUP_LANG_SPECIFIC_DECL
|
||||
#define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL c_dup_lang_specific_decl
|
||||
#undef LANG_HOOKS_DECL_UNINIT
|
||||
#define LANG_HOOKS_DECL_UNINIT c_decl_uninit
|
||||
|
||||
#undef LANG_HOOKS_RTL_EXPAND_STMT
|
||||
#define LANG_HOOKS_RTL_EXPAND_STMT expand_stmt
|
||||
|
||||
/* Attribute hooks. */
|
||||
#undef LANG_HOOKS_COMMON_ATTRIBUTE_TABLE
|
||||
@ -103,20 +103,24 @@ enum c_language_kind c_language = clk_c;
|
||||
#undef LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE
|
||||
#define LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE c_common_format_attribute_table
|
||||
|
||||
#undef LANG_HOOKS_TREE_INLINING_WALK_SUBTREES
|
||||
#define LANG_HOOKS_TREE_INLINING_WALK_SUBTREES \
|
||||
c_walk_subtrees
|
||||
#undef LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN
|
||||
#define LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN \
|
||||
c_cannot_inline_tree_fn
|
||||
#undef LANG_HOOKS_TREE_INLINING_DISREGARD_INLINE_LIMITS
|
||||
#define LANG_HOOKS_TREE_INLINING_DISREGARD_INLINE_LIMITS \
|
||||
c_disregard_inline_limits
|
||||
#undef LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P
|
||||
#define LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P \
|
||||
c_tree_chain_matters_p
|
||||
#undef LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P
|
||||
#define LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P \
|
||||
anon_aggr_type_p
|
||||
#undef LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING
|
||||
#define LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING \
|
||||
c_convert_parm_for_inlining
|
||||
#undef LANG_HOOKS_TREE_INLINING_ESTIMATE_NUM_INSNS
|
||||
#define LANG_HOOKS_TREE_INLINING_ESTIMATE_NUM_INSNS c_estimate_num_insns
|
||||
#undef LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN
|
||||
#define LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN c_dump_tree
|
||||
|
||||
@ -156,6 +160,13 @@ enum c_language_kind c_language = clk_c;
|
||||
#undef LANG_HOOKS_WRITE_GLOBALS
|
||||
#define LANG_HOOKS_WRITE_GLOBALS c_write_global_declarations
|
||||
|
||||
/* Hooks for tree gimplification. */
|
||||
#undef LANG_HOOKS_GIMPLIFY_EXPR
|
||||
#define LANG_HOOKS_GIMPLIFY_EXPR c_gimplify_expr
|
||||
|
||||
#undef LANG_HOOKS_TYPES_COMPATIBLE_P
|
||||
#define LANG_HOOKS_TYPES_COMPATIBLE_P c_types_compatible_p
|
||||
|
||||
/* ### When changing hooks, consider if ObjC needs changing too!! ### */
|
||||
|
||||
/* Each front end provides its own. */
|
||||
@ -202,6 +213,11 @@ finish_file (void)
|
||||
c_objc_common_finish_file ();
|
||||
}
|
||||
|
||||
int
|
||||
c_types_compatible_p (tree x, tree y)
|
||||
{
|
||||
return comptypes (TYPE_MAIN_VARIANT (x), TYPE_MAIN_VARIANT (y), 0);
|
||||
}
|
||||
static void
|
||||
c_initialize_diagnostics (diagnostic_context *context)
|
||||
{
|
||||
|
100
gcc/c-mudflap.c
Normal file
100
gcc/c-mudflap.c
Normal file
@ -0,0 +1,100 @@
|
||||
/* Mudflap: narrow-pointer bounds-checking by tree rewriting:
|
||||
C front-end interface.
|
||||
|
||||
Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
Contributed by Frank Ch. Eigler <fche@redhat.com>
|
||||
and Graydon Hoare <graydon@redhat.com>
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 2, or (at your option) any later
|
||||
version.
|
||||
|
||||
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GCC; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA. */
|
||||
|
||||
|
||||
#include "config.h"
|
||||
#include "errors.h"
|
||||
#include "system.h"
|
||||
#include "coretypes.h"
|
||||
#include "tm.h"
|
||||
#include "tree.h"
|
||||
#include "tree-inline.h"
|
||||
#include "c-tree.h"
|
||||
#include "c-common.h"
|
||||
#include "diagnostic.h"
|
||||
#include "output.h"
|
||||
#include "varray.h"
|
||||
#include "tree-mudflap.h"
|
||||
#include "target.h"
|
||||
#include "flags.h"
|
||||
#include "rtl.h"
|
||||
#include "toplev.h"
|
||||
#include "function.h"
|
||||
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
|
||||
/* Initialize the global tree nodes that correspond to mf-runtime.h
|
||||
declarations. */
|
||||
tree
|
||||
mflang_lookup_decl (const char* name)
|
||||
{
|
||||
tree decl = lookup_name (get_identifier (name));
|
||||
if (decl == NULL_TREE)
|
||||
internal_error ("mudflap: cannot find declaration of `%s' from mf-runtime.h",
|
||||
name);
|
||||
|
||||
return decl;
|
||||
}
|
||||
|
||||
|
||||
/* Emit a synthetic CTOR function for the current file. Populate it from
|
||||
the enqueued __mf_register calls. Compile the function. */
|
||||
|
||||
void
|
||||
mflang_flush_calls (tree enqueued_call_stmt_chain)
|
||||
{
|
||||
tree fnname, t1, t2, body, block, scope;
|
||||
|
||||
/* Short-circuit! */
|
||||
if (enqueued_call_stmt_chain == NULL_TREE)
|
||||
return;
|
||||
|
||||
fnname = get_identifier ("__mudflap_static_initializer");
|
||||
t1 = build_tree_list (NULL_TREE, void_type_node);
|
||||
t2 = tree_cons (NULL, NULL, t1);
|
||||
start_function (t1, build_nt (CALL_EXPR, fnname, t2, NULL), NULL);
|
||||
store_parm_decls ();
|
||||
|
||||
DECL_STATIC_CONSTRUCTOR (current_function_decl) = 1;
|
||||
TREE_PUBLIC (current_function_decl) = 0;
|
||||
TREE_USED (current_function_decl) = 1;
|
||||
mf_mark (current_function_decl);
|
||||
|
||||
body = c_begin_compound_stmt ();
|
||||
push_scope ();
|
||||
clear_last_expr ();
|
||||
add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0);
|
||||
|
||||
c_expand_expr_stmt (enqueued_call_stmt_chain);
|
||||
|
||||
scope = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
|
||||
block = pop_scope ();
|
||||
SCOPE_STMT_BLOCK (TREE_PURPOSE (scope)) = block;
|
||||
SCOPE_STMT_BLOCK (TREE_VALUE (scope)) = block;
|
||||
RECHAIN_STMTS (body, COMPOUND_BODY (body));
|
||||
finish_function ();
|
||||
}
|
@ -36,14 +36,13 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
#include "varray.h"
|
||||
#include "ggc.h"
|
||||
#include "langhooks.h"
|
||||
#include "tree-mudflap.h"
|
||||
#include "target.h"
|
||||
#include "cgraph.h"
|
||||
|
||||
static bool c_tree_printer (pretty_printer *, text_info *);
|
||||
static tree start_cdtor (int);
|
||||
static void finish_cdtor (tree);
|
||||
|
||||
int
|
||||
bool
|
||||
c_missing_noreturn_ok_p (tree decl)
|
||||
{
|
||||
/* A missing noreturn is not ok for freestanding implementations and
|
||||
@ -166,13 +165,10 @@ c_objc_common_init (void)
|
||||
if (c_common_init () == false)
|
||||
return false;
|
||||
|
||||
lang_expand_decl_stmt = c_expand_decl_stmt;
|
||||
|
||||
/* These were not defined in the Objective-C front end, but I'm
|
||||
putting them here anyway. The diagnostic format decoder might
|
||||
want an enhanced ObjC implementation. */
|
||||
diagnostic_format_decoder (global_dc) = &c_tree_printer;
|
||||
lang_missing_noreturn_ok_p = &c_missing_noreturn_ok_p;
|
||||
|
||||
/* If still unspecified, make it match -std=c99
|
||||
(allowing for -pedantic-errors). */
|
||||
@ -187,40 +183,33 @@ c_objc_common_init (void)
|
||||
return true;
|
||||
}
|
||||
|
||||
static tree
|
||||
start_cdtor (int method_type)
|
||||
/* Synthesize a function which calls all the global ctors or global dtors
|
||||
in this file. */
|
||||
static void
|
||||
build_cdtor (int method_type, tree cdtors)
|
||||
{
|
||||
tree fnname = get_file_function_name (method_type);
|
||||
tree void_list_node_1 = build_tree_list (NULL_TREE, void_type_node);
|
||||
tree body;
|
||||
tree scope;
|
||||
tree block;
|
||||
|
||||
start_function (void_list_node_1,
|
||||
start_function (void_list_node,
|
||||
build_nt (CALL_EXPR, fnname,
|
||||
tree_cons (NULL_TREE, NULL_TREE, void_list_node_1),
|
||||
tree_cons (NULL_TREE, NULL_TREE, void_list_node),
|
||||
NULL_TREE),
|
||||
NULL_TREE);
|
||||
store_parm_decls ();
|
||||
|
||||
current_function_cannot_inline
|
||||
= "static constructors and destructors cannot be inlined";
|
||||
|
||||
body = c_begin_compound_stmt ();
|
||||
|
||||
push_scope ();
|
||||
clear_last_expr ();
|
||||
add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0);
|
||||
|
||||
return body;
|
||||
}
|
||||
|
||||
static void
|
||||
finish_cdtor (tree body)
|
||||
{
|
||||
tree scope;
|
||||
tree block;
|
||||
for (; cdtors; cdtors = TREE_CHAIN (cdtors))
|
||||
add_stmt (build_stmt (EXPR_STMT,
|
||||
build_function_call (TREE_VALUE (cdtors), 0)));
|
||||
|
||||
scope = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
|
||||
block = pop_scope ();
|
||||
|
||||
block = make_node (BLOCK);
|
||||
SCOPE_STMT_BLOCK (TREE_PURPOSE (scope)) = block;
|
||||
SCOPE_STMT_BLOCK (TREE_VALUE (scope)) = block;
|
||||
|
||||
@ -237,30 +226,22 @@ c_objc_common_finish_file (void)
|
||||
if (pch_file)
|
||||
c_common_write_pch ();
|
||||
|
||||
if (static_ctors)
|
||||
{
|
||||
build_cdtor ('I', static_ctors);
|
||||
static_ctors = 0;
|
||||
}
|
||||
if (static_dtors)
|
||||
{
|
||||
build_cdtor ('D', static_dtors);
|
||||
static_dtors = 0;
|
||||
}
|
||||
|
||||
cgraph_finalize_compilation_unit ();
|
||||
cgraph_optimize ();
|
||||
|
||||
if (static_ctors)
|
||||
{
|
||||
tree body = start_cdtor ('I');
|
||||
|
||||
for (; static_ctors; static_ctors = TREE_CHAIN (static_ctors))
|
||||
c_expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors),
|
||||
NULL_TREE));
|
||||
|
||||
finish_cdtor (body);
|
||||
}
|
||||
|
||||
if (static_dtors)
|
||||
{
|
||||
tree body = start_cdtor ('D');
|
||||
|
||||
for (; static_dtors; static_dtors = TREE_CHAIN (static_dtors))
|
||||
c_expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors),
|
||||
NULL_TREE));
|
||||
|
||||
finish_cdtor (body);
|
||||
}
|
||||
if (flag_mudflap)
|
||||
mudflap_finish_file ();
|
||||
}
|
||||
|
||||
/* Called during diagnostic message formatting process to print a
|
||||
|
21
gcc/c-opts.c
21
gcc/c-opts.c
@ -733,11 +733,6 @@ c_common_handle_option (size_t scode, const char *arg, int value)
|
||||
cpp_opts->dollars_in_ident = value;
|
||||
break;
|
||||
|
||||
case OPT_fdump_:
|
||||
if (!dump_switch_p (arg))
|
||||
result = 0;
|
||||
break;
|
||||
|
||||
case OPT_ffreestanding:
|
||||
value = !value;
|
||||
/* Fall through.... */
|
||||
@ -1100,17 +1095,13 @@ c_common_post_options (const char **pfilename)
|
||||
|
||||
flag_inline_trees = 1;
|
||||
|
||||
/* Use tree inlining if possible. Function instrumentation is only
|
||||
done in the RTL level, so we disable tree inlining. */
|
||||
if (! flag_instrument_function_entry_exit)
|
||||
/* Use tree inlining. */
|
||||
if (!flag_no_inline)
|
||||
flag_no_inline = 1;
|
||||
if (flag_inline_functions)
|
||||
{
|
||||
if (!flag_no_inline)
|
||||
flag_no_inline = 1;
|
||||
if (flag_inline_functions)
|
||||
{
|
||||
flag_inline_trees = 2;
|
||||
flag_inline_functions = 0;
|
||||
}
|
||||
flag_inline_trees = 2;
|
||||
flag_inline_functions = 0;
|
||||
}
|
||||
|
||||
/* -Wextra implies -Wsign-compare, but not if explicitly
|
||||
|
@ -661,6 +661,7 @@ primary:
|
||||
last_expr_type = void_type_node;
|
||||
$$ = build1 (STMT_EXPR, last_expr_type, $1);
|
||||
TREE_SIDE_EFFECTS ($$) = 1;
|
||||
annotate_with_locus ($$, input_location);
|
||||
}
|
||||
| compstmt_primary_start error ')'
|
||||
{
|
||||
@ -2130,7 +2131,7 @@ simple_if:
|
||||
|
||||
if_prefix:
|
||||
/* We must build the IF_STMT node before parsing its
|
||||
condition so that STMT_LINENO refers to the line
|
||||
condition so that EXPR_LOCUS refers to the line
|
||||
containing the "if", and not the line containing
|
||||
the close-parenthesis.
|
||||
|
||||
@ -2194,12 +2195,8 @@ lineno_stmt:
|
||||
save_location stmt
|
||||
{ if ($2)
|
||||
{
|
||||
STMT_LINENO ($2) = $1.line;
|
||||
/* ??? We currently have no way of recording
|
||||
the filename for a statement. This probably
|
||||
matters little in practice at the moment,
|
||||
but I suspect that problems will occur when
|
||||
doing inlining at the tree level. */
|
||||
SET_EXPR_LOCUS ($2, NULL);
|
||||
annotate_with_locus ($2, $1);
|
||||
}
|
||||
}
|
||||
;
|
||||
@ -2208,7 +2205,8 @@ lineno_label:
|
||||
save_location label
|
||||
{ if ($2)
|
||||
{
|
||||
STMT_LINENO ($2) = $1.line;
|
||||
SET_EXPR_LOCUS ($2, NULL);
|
||||
annotate_with_locus ($2, $1);
|
||||
}
|
||||
}
|
||||
;
|
||||
@ -2237,7 +2235,7 @@ select_or_iter_stmt:
|
||||
| simple_if ELSE error
|
||||
{ c_expand_end_cond (); }
|
||||
/* We must build the WHILE_STMT node before parsing its
|
||||
condition so that STMT_LINENO refers to the line
|
||||
condition so that EXPR_LOCUS refers to the line
|
||||
containing the "while", and not the line containing
|
||||
the close-parenthesis.
|
||||
|
||||
|
@ -352,7 +352,6 @@ maybe_apply_pragma_weak (tree decl ATTRIBUTE_UNUSED)
|
||||
|
||||
static GTY(()) tree pending_redefine_extname;
|
||||
|
||||
#ifdef HANDLE_PRAGMA_REDEFINE_EXTNAME
|
||||
static void handle_pragma_redefine_extname (cpp_reader *);
|
||||
|
||||
/* #pragma redefined_extname oldname newname */
|
||||
@ -388,7 +387,6 @@ handle_pragma_redefine_extname (cpp_reader *dummy ATTRIBUTE_UNUSED)
|
||||
else
|
||||
add_to_renaming_pragma_list(oldname, newname);
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
add_to_renaming_pragma_list (tree oldname, tree newname)
|
||||
@ -502,6 +500,9 @@ init_pragma (void)
|
||||
#endif
|
||||
#ifdef HANDLE_PRAGMA_REDEFINE_EXTNAME
|
||||
c_register_pragma (0, "redefine_extname", handle_pragma_redefine_extname);
|
||||
#else
|
||||
if (flag_mudflap)
|
||||
c_register_pragma (0, "redefine_extname", handle_pragma_redefine_extname);
|
||||
#endif
|
||||
#ifdef HANDLE_PRAGMA_EXTERN_PREFIX
|
||||
c_register_pragma (0, "extern_prefix", handle_pragma_extern_prefix);
|
||||
|
@ -26,6 +26,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
#include "real.h"
|
||||
#include "c-pretty-print.h"
|
||||
#include "c-tree.h"
|
||||
#include "diagnostic.h"
|
||||
|
||||
/* The pretty-printer code is primarily designed to closely follow
|
||||
(GNU) C and C++ grammars. That is to be contrasted with spaghetti
|
||||
@ -280,7 +281,7 @@ pp_c_type_specifier (c_pretty_printer *pp, tree t)
|
||||
break;
|
||||
|
||||
case IDENTIFIER_NODE:
|
||||
pp_c_tree_identifier (pp, t);
|
||||
pp_c_tree_decl_identifier (pp, t);
|
||||
break;
|
||||
|
||||
case VOID_TYPE:
|
||||
@ -561,11 +562,10 @@ pp_c_direct_declarator (c_pretty_printer *pp, tree t)
|
||||
case TYPE_DECL:
|
||||
case FIELD_DECL:
|
||||
case LABEL_DECL:
|
||||
if (DECL_NAME (t))
|
||||
{
|
||||
pp_c_space_for_pointer_operator (pp, TREE_TYPE (t));
|
||||
pp_c_tree_identifier (pp, DECL_NAME (t));
|
||||
}
|
||||
pp_c_space_for_pointer_operator (pp, TREE_TYPE (t));
|
||||
pp_c_tree_decl_identifier (pp, t);
|
||||
break;
|
||||
|
||||
case ARRAY_TYPE:
|
||||
case POINTER_TYPE:
|
||||
pp_abstract_declarator (pp, TREE_TYPE (t));
|
||||
@ -578,7 +578,7 @@ pp_c_direct_declarator (c_pretty_printer *pp, tree t)
|
||||
|
||||
case FUNCTION_DECL:
|
||||
pp_c_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
|
||||
pp_c_tree_identifier (pp, DECL_NAME (t));
|
||||
pp_c_tree_decl_identifier (pp, t);
|
||||
if (pp_c_base (pp)->flags & pp_c_flag_abstract)
|
||||
pp_abstract_declarator (pp, TREE_TYPE (t));
|
||||
else
|
||||
@ -960,8 +960,9 @@ pp_c_primary_expression (c_pretty_printer *pp, tree e)
|
||||
case CONST_DECL:
|
||||
case FUNCTION_DECL:
|
||||
case LABEL_DECL:
|
||||
e = DECL_NAME (e);
|
||||
/* Fall through. */
|
||||
pp_c_tree_decl_identifier (pp, e);
|
||||
break;
|
||||
|
||||
case IDENTIFIER_NODE:
|
||||
pp_c_tree_identifier (pp, e);
|
||||
break;
|
||||
@ -980,6 +981,22 @@ pp_c_primary_expression (c_pretty_printer *pp, tree e)
|
||||
pp_c_constant (pp, e);
|
||||
break;
|
||||
|
||||
case TARGET_EXPR:
|
||||
pp_c_identifier (pp, "__builtin_memcpy");
|
||||
pp_c_left_paren (pp);
|
||||
pp_ampersand (pp);
|
||||
pp_primary_expression (pp, TREE_OPERAND (e, 0));
|
||||
pp_separate_with (pp, ',');
|
||||
pp_ampersand (pp);
|
||||
pp_initializer (pp, TREE_OPERAND (e, 1));
|
||||
if (TREE_OPERAND (e, 2))
|
||||
{
|
||||
pp_separate_with (pp, ',');
|
||||
pp_c_expression (pp, TREE_OPERAND (e, 2));
|
||||
}
|
||||
pp_c_right_paren (pp);
|
||||
break;
|
||||
|
||||
case STMT_EXPR:
|
||||
pp_c_left_paren (pp);
|
||||
pp_statement (pp, STMT_EXPR_STMT (e));
|
||||
@ -1005,13 +1022,7 @@ static void
|
||||
pp_c_initializer (c_pretty_printer *pp, tree e)
|
||||
{
|
||||
if (TREE_CODE (e) == CONSTRUCTOR)
|
||||
{
|
||||
enum tree_code code = TREE_CODE (TREE_TYPE (e));
|
||||
if (code == RECORD_TYPE || code == UNION_TYPE || code == ARRAY_TYPE)
|
||||
pp_c_brace_enclosed_initializer_list (pp, e);
|
||||
else
|
||||
pp_unsupported_tree (pp, TREE_OPERAND (e, 1));
|
||||
}
|
||||
pp_c_brace_enclosed_initializer_list (pp, e);
|
||||
else
|
||||
pp_expression (pp, e);
|
||||
}
|
||||
@ -1099,25 +1110,36 @@ pp_c_initializer_list (c_pretty_printer *pp, tree e)
|
||||
pp_separate_with (pp, ',');
|
||||
}
|
||||
}
|
||||
break;
|
||||
return;
|
||||
|
||||
case VECTOR_TYPE:
|
||||
pp_c_expression_list (pp, TREE_VECTOR_CST_ELTS (e));
|
||||
break;
|
||||
if (TREE_CODE (e) == VECTOR_CST)
|
||||
pp_c_expression_list (pp, TREE_VECTOR_CST_ELTS (e));
|
||||
else if (TREE_CODE (e) == CONSTRUCTOR)
|
||||
pp_c_expression_list (pp, CONSTRUCTOR_ELTS (e));
|
||||
else
|
||||
break;
|
||||
return;
|
||||
|
||||
case COMPLEX_TYPE:
|
||||
{
|
||||
const bool cst = TREE_CODE (e) == COMPLEX_CST;
|
||||
pp_expression (pp, cst ? TREE_REALPART (e) : TREE_OPERAND (e, 0));
|
||||
pp_separate_with (pp, ',');
|
||||
pp_expression (pp, cst ? TREE_IMAGPART (e) : TREE_OPERAND (e, 1));
|
||||
}
|
||||
break;
|
||||
if (TREE_CODE (e) == CONSTRUCTOR)
|
||||
pp_c_expression_list (pp, CONSTRUCTOR_ELTS (e));
|
||||
else if (TREE_CODE (e) == COMPLEX_CST || TREE_CODE (e) == COMPLEX_EXPR)
|
||||
{
|
||||
const bool cst = TREE_CODE (e) == COMPLEX_CST;
|
||||
pp_expression (pp, cst ? TREE_REALPART (e) : TREE_OPERAND (e, 0));
|
||||
pp_separate_with (pp, ',');
|
||||
pp_expression (pp, cst ? TREE_IMAGPART (e) : TREE_OPERAND (e, 1));
|
||||
}
|
||||
else
|
||||
break;
|
||||
return;
|
||||
|
||||
default:
|
||||
pp_unsupported_tree (pp, type);
|
||||
break;
|
||||
}
|
||||
|
||||
pp_unsupported_tree (pp, type);
|
||||
}
|
||||
|
||||
/* Pretty-print a brace-enclosed initializer-list. */
|
||||
@ -1149,7 +1171,9 @@ pp_c_id_expression (c_pretty_printer *pp, tree t)
|
||||
case FUNCTION_DECL:
|
||||
case FIELD_DECL:
|
||||
case LABEL_DECL:
|
||||
t = DECL_NAME (t);
|
||||
pp_c_tree_decl_identifier (pp, t);
|
||||
break;
|
||||
|
||||
case IDENTIFIER_NODE:
|
||||
pp_c_tree_identifier (pp, t);
|
||||
break;
|
||||
@ -1862,7 +1886,7 @@ pp_c_statement (c_pretty_printer *pp, tree stmt)
|
||||
else
|
||||
pp_indentation (pp) -= 3;
|
||||
if (code == LABEL_STMT)
|
||||
pp_tree_identifier (pp, DECL_NAME (LABEL_STMT_LABEL (stmt)));
|
||||
pp_c_tree_decl_identifier (pp, LABEL_STMT_LABEL (stmt));
|
||||
else if (code == CASE_LABEL)
|
||||
{
|
||||
if (CASE_LOW (stmt) == NULL_TREE)
|
||||
@ -2121,16 +2145,6 @@ pp_c_statement (c_pretty_printer *pp, tree stmt)
|
||||
}
|
||||
break;
|
||||
|
||||
case FILE_STMT:
|
||||
pp_c_identifier (pp, "__FILE__");
|
||||
pp_space (pp);
|
||||
pp_equal (pp);
|
||||
pp_c_whitespace (pp);
|
||||
pp_c_identifier (pp, FILE_STMT_FILENAME (stmt));
|
||||
pp_c_semicolon (pp);
|
||||
pp_needs_newline (pp) = true;
|
||||
break;
|
||||
|
||||
default:
|
||||
pp_unsupported_tree (pp, stmt);
|
||||
}
|
||||
@ -2170,3 +2184,60 @@ pp_c_pretty_printer_init (c_pretty_printer *pp)
|
||||
pp->assignment_expression = pp_c_assignment_expression;
|
||||
pp->expression = pp_c_expression;
|
||||
}
|
||||
|
||||
|
||||
/* Print the tree T in full, on file FILE. */
|
||||
|
||||
void
|
||||
print_c_tree (FILE *file, tree t)
|
||||
{
|
||||
static c_pretty_printer pp_rec;
|
||||
static bool initialized = 0;
|
||||
c_pretty_printer *pp = &pp_rec;
|
||||
|
||||
if (!initialized)
|
||||
{
|
||||
initialized = 1;
|
||||
pp_construct (pp_base (pp), NULL, 0);
|
||||
pp_c_pretty_printer_init (pp);
|
||||
pp_needs_newline (pp) = true;
|
||||
}
|
||||
pp_base (pp)->buffer->stream = file;
|
||||
|
||||
pp_statement (pp, t);
|
||||
|
||||
pp_newline (pp);
|
||||
pp_flush (pp);
|
||||
}
|
||||
|
||||
/* Print the tree T in full, on stderr. */
|
||||
|
||||
void
|
||||
debug_c_tree (tree t)
|
||||
{
|
||||
print_c_tree (stderr, t);
|
||||
fputc ('\n', stderr);
|
||||
}
|
||||
|
||||
/* Output the DECL_NAME of T. If T has no DECL_NAME, output a string made
|
||||
up of T's memory address. */
|
||||
|
||||
void
|
||||
pp_c_tree_decl_identifier (c_pretty_printer *pp, tree t)
|
||||
{
|
||||
const char *name;
|
||||
|
||||
if (!DECL_P (t))
|
||||
abort ();
|
||||
|
||||
if (DECL_NAME (t))
|
||||
name = IDENTIFIER_POINTER (DECL_NAME (t));
|
||||
else
|
||||
{
|
||||
static char xname[8];
|
||||
sprintf (xname, "<U%4x>", ((unsigned)((unsigned long)(t) & 0xffff)));
|
||||
name = xname;
|
||||
}
|
||||
|
||||
pp_c_identifier (pp, name);
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ struct c_pretty_print_info
|
||||
#undef pp_base
|
||||
#define pp_base(PP) (&pp_c_base (PP)->base)
|
||||
|
||||
|
||||
|
||||
#define pp_c_tree_identifier(PPI, ID) \
|
||||
pp_c_identifier (PPI, IDENTIFIER_POINTER (ID))
|
||||
|
||||
@ -166,6 +166,7 @@ void pp_c_semicolon (c_pretty_printer *);
|
||||
void pp_c_space_for_pointer_operator (c_pretty_printer *, tree);
|
||||
|
||||
/* Declarations. */
|
||||
void pp_c_tree_decl_identifier (c_pretty_printer *, tree);
|
||||
void pp_c_function_definition (c_pretty_printer *, tree);
|
||||
void pp_c_attributes (c_pretty_printer *, tree);
|
||||
void pp_c_type_qualifier_list (c_pretty_printer *, tree);
|
||||
@ -197,4 +198,6 @@ void pp_c_id_expression (c_pretty_printer *, tree);
|
||||
void pp_c_identifier (c_pretty_printer *, const char *);
|
||||
void pp_c_string_literal (c_pretty_printer *, tree);
|
||||
|
||||
void print_c_tree (FILE *file, tree t);
|
||||
|
||||
#endif /* GCC_C_PRETTY_PRINTER */
|
||||
|
@ -44,23 +44,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
#include "timevar.h"
|
||||
#include "predict.h"
|
||||
#include "tree-inline.h"
|
||||
|
||||
/* If non-NULL, the address of a language-specific function for
|
||||
expanding statements. */
|
||||
void (*lang_expand_stmt) (tree);
|
||||
|
||||
/* If non-NULL, the address of a language-specific function for
|
||||
expanding a DECL_STMT. After the language-independent cases are
|
||||
handled, this function will be called. If this function is not
|
||||
defined, it is assumed that declarations other than those for
|
||||
variables and labels do not require any RTL generation. */
|
||||
void (*lang_expand_decl_stmt) (tree);
|
||||
|
||||
static tree find_reachable_label_1 (tree *, int *, void *);
|
||||
static tree find_reachable_label (tree);
|
||||
static bool expand_unreachable_if_stmt (tree);
|
||||
static tree expand_unreachable_stmt (tree, int);
|
||||
static void genrtl_do_stmt_1 (tree, tree);
|
||||
#include "langhooks.h"
|
||||
|
||||
/* Create an empty statement tree rooted at T. */
|
||||
|
||||
@ -81,18 +65,8 @@ begin_stmt_tree (tree *t)
|
||||
tree
|
||||
add_stmt (tree t)
|
||||
{
|
||||
if (input_filename != last_expr_filename)
|
||||
{
|
||||
/* If the filename has changed, also add in a FILE_STMT. Do a string
|
||||
compare first, though, as it might be an equivalent string. */
|
||||
int add = (strcmp (input_filename, last_expr_filename) != 0);
|
||||
last_expr_filename = input_filename;
|
||||
if (add)
|
||||
{
|
||||
tree pos = build_nt (FILE_STMT, get_identifier (input_filename));
|
||||
add_stmt (pos);
|
||||
}
|
||||
}
|
||||
if (!EXPR_LOCUS (t))
|
||||
annotate_with_locus (t, input_location);
|
||||
|
||||
/* Add T to the statement-tree. */
|
||||
TREE_CHAIN (last_tree) = t;
|
||||
@ -171,58 +145,53 @@ finish_stmt_tree (tree *t)
|
||||
stmt = TREE_CHAIN (*t);
|
||||
*t = stmt;
|
||||
last_tree = NULL_TREE;
|
||||
|
||||
if (cfun && stmt)
|
||||
{
|
||||
/* The line-number recorded in the outermost statement in a function
|
||||
is the line number of the end of the function. */
|
||||
STMT_LINENO (stmt) = input_line;
|
||||
STMT_LINENO_FOR_FN_P (stmt) = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Build a generic statement based on the given type of node and
|
||||
arguments. Similar to `build_nt', except that we set
|
||||
STMT_LINENO to be the current line number. */
|
||||
EXPR_LOCUS to be the current source location. */
|
||||
/* ??? This should be obsolete with the lineno_stmt productions
|
||||
in the grammar. */
|
||||
|
||||
tree
|
||||
build_stmt (enum tree_code code, ...)
|
||||
{
|
||||
tree t;
|
||||
int length;
|
||||
int i;
|
||||
tree ret;
|
||||
int length, i;
|
||||
va_list p;
|
||||
bool side_effects;
|
||||
|
||||
va_start (p, code);
|
||||
|
||||
t = make_node (code);
|
||||
ret = make_node (code);
|
||||
length = TREE_CODE_LENGTH (code);
|
||||
STMT_LINENO (t) = input_line;
|
||||
annotate_with_locus (ret, input_location);
|
||||
|
||||
/* Most statements have implicit side effects all on their own,
|
||||
such as control transfer. For those that do, we'll compute
|
||||
the real value of TREE_SIDE_EFFECTS from its arguments. */
|
||||
switch (code)
|
||||
{
|
||||
case EXPR_STMT:
|
||||
side_effects = false;
|
||||
break;
|
||||
default:
|
||||
side_effects = true;
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = 0; i < length; i++)
|
||||
TREE_OPERAND (t, i) = va_arg (p, tree);
|
||||
{
|
||||
tree t = va_arg (p, tree);
|
||||
if (t && IS_NON_TYPE_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (t))))
|
||||
side_effects |= TREE_SIDE_EFFECTS (t);
|
||||
TREE_OPERAND (ret, i) = t;
|
||||
}
|
||||
|
||||
TREE_SIDE_EFFECTS (ret) = side_effects;
|
||||
|
||||
va_end (p);
|
||||
return t;
|
||||
}
|
||||
|
||||
/* Some statements, like for-statements or if-statements, require a
|
||||
condition. This condition can be a declaration. If T is such a
|
||||
declaration it is processed, and an expression appropriate to use
|
||||
as the condition is returned. Otherwise, T itself is returned. */
|
||||
|
||||
tree
|
||||
expand_cond (tree t)
|
||||
{
|
||||
if (t && TREE_CODE (t) == TREE_LIST)
|
||||
{
|
||||
expand_stmt (TREE_PURPOSE (t));
|
||||
return TREE_VALUE (t);
|
||||
}
|
||||
else
|
||||
return t;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Create RTL for the local static variable DECL. */
|
||||
@ -268,7 +237,7 @@ emit_local_var (tree decl)
|
||||
/* Create RTL for this variable. */
|
||||
if (!DECL_RTL_SET_P (decl))
|
||||
{
|
||||
if (DECL_C_HARD_REGISTER (decl))
|
||||
if (DECL_HARD_REGISTER (decl))
|
||||
/* The user specified an assembler name for this variable.
|
||||
Set that up now. */
|
||||
rest_of_decl_compilation
|
||||
@ -291,214 +260,6 @@ emit_local_var (tree decl)
|
||||
}
|
||||
}
|
||||
|
||||
/* Helper for generating the RTL at the beginning of a scope. */
|
||||
|
||||
void
|
||||
genrtl_do_pushlevel (void)
|
||||
{
|
||||
emit_line_note (input_location);
|
||||
clear_last_expr ();
|
||||
}
|
||||
|
||||
/* Generate the RTL for DESTINATION, which is a GOTO_STMT. */
|
||||
|
||||
void
|
||||
genrtl_goto_stmt (tree destination)
|
||||
{
|
||||
if (TREE_CODE (destination) == IDENTIFIER_NODE)
|
||||
abort ();
|
||||
|
||||
/* We warn about unused labels with -Wunused. That means we have to
|
||||
mark the used labels as used. */
|
||||
if (TREE_CODE (destination) == LABEL_DECL)
|
||||
TREE_USED (destination) = 1;
|
||||
|
||||
emit_line_note (input_location);
|
||||
|
||||
if (TREE_CODE (destination) == LABEL_DECL)
|
||||
{
|
||||
label_rtx (destination);
|
||||
expand_goto (destination);
|
||||
}
|
||||
else
|
||||
expand_computed_goto (destination);
|
||||
}
|
||||
|
||||
/* Generate the RTL for EXPR, which is an EXPR_STMT. Provided just
|
||||
for backward compatibility. genrtl_expr_stmt_value() should be
|
||||
used for new code. */
|
||||
|
||||
void
|
||||
genrtl_expr_stmt (tree expr)
|
||||
{
|
||||
genrtl_expr_stmt_value (expr, -1, 1);
|
||||
}
|
||||
|
||||
/* Generate the RTL for EXPR, which is an EXPR_STMT. WANT_VALUE tells
|
||||
whether to (1) save the value of the expression, (0) discard it or
|
||||
(-1) use expr_stmts_for_value to tell. The use of -1 is
|
||||
deprecated, and retained only for backward compatibility.
|
||||
MAYBE_LAST is nonzero if this EXPR_STMT might be the last statement
|
||||
in expression statement. */
|
||||
|
||||
void
|
||||
genrtl_expr_stmt_value (tree expr, int want_value, int maybe_last)
|
||||
{
|
||||
if (expr != NULL_TREE)
|
||||
{
|
||||
emit_line_note (input_location);
|
||||
|
||||
if (stmts_are_full_exprs_p ())
|
||||
expand_start_target_temps ();
|
||||
|
||||
if (expr != error_mark_node)
|
||||
expand_expr_stmt_value (expr, want_value, maybe_last);
|
||||
|
||||
if (stmts_are_full_exprs_p ())
|
||||
expand_end_target_temps ();
|
||||
}
|
||||
}
|
||||
|
||||
/* Generate the RTL for T, which is a DECL_STMT. */
|
||||
|
||||
void
|
||||
genrtl_decl_stmt (tree t)
|
||||
{
|
||||
tree decl;
|
||||
emit_line_note (input_location);
|
||||
decl = DECL_STMT_DECL (t);
|
||||
/* If this is a declaration for an automatic local
|
||||
variable, initialize it. Note that we might also see a
|
||||
declaration for a namespace-scope object (declared with
|
||||
`extern'). We don't have to handle the initialization
|
||||
of those objects here; they can only be declarations,
|
||||
rather than definitions. */
|
||||
if (TREE_CODE (decl) == VAR_DECL
|
||||
&& !TREE_STATIC (decl)
|
||||
&& !DECL_EXTERNAL (decl))
|
||||
{
|
||||
/* Let the back-end know about this variable. */
|
||||
if (!anon_aggr_type_p (TREE_TYPE (decl)))
|
||||
emit_local_var (decl);
|
||||
else
|
||||
expand_anon_union_decl (decl, NULL_TREE,
|
||||
DECL_ANON_UNION_ELEMS (decl));
|
||||
}
|
||||
else if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
|
||||
make_rtl_for_local_static (decl);
|
||||
else if (TREE_CODE (decl) == LABEL_DECL
|
||||
&& C_DECLARED_LABEL_FLAG (decl))
|
||||
declare_nonlocal_label (decl);
|
||||
else if (TREE_CODE (decl) == TYPE_DECL)
|
||||
force_type_save_exprs (TREE_TYPE (decl));
|
||||
else if (lang_expand_decl_stmt)
|
||||
(*lang_expand_decl_stmt) (t);
|
||||
}
|
||||
|
||||
/* Generate the RTL for T, which is an IF_STMT. */
|
||||
|
||||
void
|
||||
genrtl_if_stmt (tree t)
|
||||
{
|
||||
tree cond;
|
||||
genrtl_do_pushlevel ();
|
||||
cond = expand_cond (IF_COND (t));
|
||||
emit_line_note (input_location);
|
||||
expand_start_cond (cond, 0);
|
||||
if (THEN_CLAUSE (t))
|
||||
{
|
||||
tree nextt = THEN_CLAUSE (t);
|
||||
|
||||
if (cond && integer_zerop (cond))
|
||||
nextt = expand_unreachable_stmt (nextt, warn_notreached);
|
||||
expand_stmt (nextt);
|
||||
}
|
||||
|
||||
if (ELSE_CLAUSE (t))
|
||||
{
|
||||
tree nextt = ELSE_CLAUSE (t);
|
||||
expand_start_else ();
|
||||
if (cond && integer_nonzerop (cond))
|
||||
nextt = expand_unreachable_stmt (nextt, warn_notreached);
|
||||
expand_stmt (nextt);
|
||||
}
|
||||
expand_end_cond ();
|
||||
}
|
||||
|
||||
/* Generate the RTL for T, which is a WHILE_STMT. */
|
||||
|
||||
void
|
||||
genrtl_while_stmt (tree t)
|
||||
{
|
||||
tree cond = WHILE_COND (t);
|
||||
|
||||
emit_line_note (input_location);
|
||||
expand_start_loop (1);
|
||||
genrtl_do_pushlevel ();
|
||||
|
||||
if (cond && !integer_nonzerop (cond))
|
||||
{
|
||||
cond = expand_cond (cond);
|
||||
emit_line_note (input_location);
|
||||
expand_exit_loop_top_cond (0, cond);
|
||||
genrtl_do_pushlevel ();
|
||||
}
|
||||
|
||||
expand_stmt (WHILE_BODY (t));
|
||||
|
||||
expand_end_loop ();
|
||||
}
|
||||
|
||||
/* Generate the RTL for a DO_STMT with condition COND and loop BODY
|
||||
body. This is reused for expanding unreachable WHILE_STMTS. */
|
||||
|
||||
static void
|
||||
genrtl_do_stmt_1 (tree cond, tree body)
|
||||
{
|
||||
/* Recognize the common special-case of do { ... } while (0) and do
|
||||
not emit the loop widgetry in this case. In particular this
|
||||
avoids cluttering the rtl with dummy loop notes, which can affect
|
||||
alignment of adjacent labels. COND can be NULL due to parse
|
||||
errors. */
|
||||
if (!cond || integer_zerop (cond))
|
||||
{
|
||||
expand_start_null_loop ();
|
||||
expand_stmt (body);
|
||||
expand_end_null_loop ();
|
||||
}
|
||||
else if (integer_nonzerop (cond))
|
||||
{
|
||||
emit_line_note (input_location);
|
||||
expand_start_loop (1);
|
||||
|
||||
expand_stmt (body);
|
||||
|
||||
emit_line_note (input_location);
|
||||
expand_end_loop ();
|
||||
}
|
||||
else
|
||||
{
|
||||
emit_line_note (input_location);
|
||||
expand_start_loop_continue_elsewhere (1);
|
||||
|
||||
expand_stmt (body);
|
||||
|
||||
expand_loop_continue_here ();
|
||||
cond = expand_cond (cond);
|
||||
emit_line_note (input_location);
|
||||
expand_exit_loop_if_false (0, cond);
|
||||
expand_end_loop ();
|
||||
}
|
||||
}
|
||||
|
||||
/* Generate the RTL for T, which is a DO_STMT. */
|
||||
|
||||
void
|
||||
genrtl_do_stmt (tree t)
|
||||
{
|
||||
genrtl_do_stmt_1 (DO_COND (t), DO_BODY (t));
|
||||
}
|
||||
|
||||
/* Build the node for a return statement and return it. */
|
||||
|
||||
tree
|
||||
@ -507,74 +268,6 @@ build_return_stmt (tree expr)
|
||||
return (build_stmt (RETURN_STMT, expr));
|
||||
}
|
||||
|
||||
/* Generate the RTL for STMT, which is a RETURN_STMT. */
|
||||
|
||||
void
|
||||
genrtl_return_stmt (tree stmt)
|
||||
{
|
||||
tree expr;
|
||||
|
||||
expr = RETURN_STMT_EXPR (stmt);
|
||||
|
||||
emit_line_note (input_location);
|
||||
if (!expr)
|
||||
expand_null_return ();
|
||||
else
|
||||
{
|
||||
expand_start_target_temps ();
|
||||
expand_return (expr);
|
||||
expand_end_target_temps ();
|
||||
}
|
||||
}
|
||||
|
||||
/* Generate the RTL for T, which is a FOR_STMT. */
|
||||
|
||||
void
|
||||
genrtl_for_stmt (tree t)
|
||||
{
|
||||
tree cond = FOR_COND (t);
|
||||
location_t saved_loc;
|
||||
|
||||
if (NEW_FOR_SCOPE_P (t))
|
||||
genrtl_do_pushlevel ();
|
||||
|
||||
expand_stmt (FOR_INIT_STMT (t));
|
||||
|
||||
/* Expand the initialization. */
|
||||
emit_line_note (input_location);
|
||||
if (FOR_EXPR (t))
|
||||
expand_start_loop_continue_elsewhere (1);
|
||||
else
|
||||
expand_start_loop (1);
|
||||
genrtl_do_pushlevel ();
|
||||
|
||||
/* Save the filename and line number so that we expand the FOR_EXPR
|
||||
we can reset them back to the saved values. */
|
||||
saved_loc = input_location;
|
||||
|
||||
/* Expand the condition. */
|
||||
if (cond && !integer_nonzerop (cond))
|
||||
{
|
||||
cond = expand_cond (cond);
|
||||
emit_line_note (input_location);
|
||||
expand_exit_loop_top_cond (0, cond);
|
||||
genrtl_do_pushlevel ();
|
||||
}
|
||||
|
||||
/* Expand the body. */
|
||||
expand_stmt (FOR_BODY (t));
|
||||
|
||||
/* Expand the increment expression. */
|
||||
input_location = saved_loc;
|
||||
emit_line_note (input_location);
|
||||
if (FOR_EXPR (t))
|
||||
{
|
||||
expand_loop_continue_here ();
|
||||
genrtl_expr_stmt (FOR_EXPR (t));
|
||||
}
|
||||
expand_end_loop ();
|
||||
}
|
||||
|
||||
/* Build a break statement node and return it. */
|
||||
|
||||
tree
|
||||
@ -583,16 +276,6 @@ build_break_stmt (void)
|
||||
return (build_stmt (BREAK_STMT));
|
||||
}
|
||||
|
||||
/* Generate the RTL for a BREAK_STMT. */
|
||||
|
||||
void
|
||||
genrtl_break_stmt (void)
|
||||
{
|
||||
emit_line_note (input_location);
|
||||
if ( ! expand_exit_something ())
|
||||
abort ();
|
||||
}
|
||||
|
||||
/* Build a continue statement node and return it. */
|
||||
|
||||
tree
|
||||
@ -601,80 +284,6 @@ build_continue_stmt (void)
|
||||
return (build_stmt (CONTINUE_STMT));
|
||||
}
|
||||
|
||||
/* Generate the RTL for a CONTINUE_STMT. */
|
||||
|
||||
void
|
||||
genrtl_continue_stmt (void)
|
||||
{
|
||||
emit_line_note (input_location);
|
||||
if (! expand_continue_loop (0))
|
||||
abort ();
|
||||
}
|
||||
|
||||
/* Generate the RTL for T, which is a SCOPE_STMT. */
|
||||
|
||||
void
|
||||
genrtl_scope_stmt (tree t)
|
||||
{
|
||||
tree block = SCOPE_STMT_BLOCK (t);
|
||||
|
||||
if (!SCOPE_NO_CLEANUPS_P (t))
|
||||
{
|
||||
if (SCOPE_BEGIN_P (t))
|
||||
expand_start_bindings_and_block (2 * SCOPE_NULLIFIED_P (t), block);
|
||||
else if (SCOPE_END_P (t))
|
||||
expand_end_bindings (NULL_TREE, !SCOPE_NULLIFIED_P (t), 0);
|
||||
}
|
||||
else if (!SCOPE_NULLIFIED_P (t))
|
||||
{
|
||||
rtx note = emit_note (SCOPE_BEGIN_P (t)
|
||||
? NOTE_INSN_BLOCK_BEG : NOTE_INSN_BLOCK_END);
|
||||
NOTE_BLOCK (note) = block;
|
||||
}
|
||||
|
||||
/* If we're at the end of a scope that contains inlined nested
|
||||
functions, we have to decide whether or not to write them out. */
|
||||
if (block && SCOPE_END_P (t))
|
||||
{
|
||||
tree fn;
|
||||
|
||||
for (fn = BLOCK_VARS (block); fn; fn = TREE_CHAIN (fn))
|
||||
{
|
||||
if (TREE_CODE (fn) == FUNCTION_DECL
|
||||
&& DECL_CONTEXT (fn) == current_function_decl
|
||||
&& DECL_STRUCT_FUNCTION (fn)
|
||||
&& DECL_STRUCT_FUNCTION (fn)->saved_for_inline
|
||||
&& !TREE_ASM_WRITTEN (fn)
|
||||
&& TREE_ADDRESSABLE (fn))
|
||||
{
|
||||
push_function_context ();
|
||||
output_inline_function (fn);
|
||||
pop_function_context ();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Generate the RTL for T, which is a SWITCH_STMT. */
|
||||
|
||||
void
|
||||
genrtl_switch_stmt (tree t)
|
||||
{
|
||||
tree cond;
|
||||
genrtl_do_pushlevel ();
|
||||
|
||||
cond = expand_cond (SWITCH_COND (t));
|
||||
if (cond == error_mark_node)
|
||||
/* The code is in error, but we don't want expand_end_case to
|
||||
crash. */
|
||||
cond = truthvalue_false_node;
|
||||
|
||||
emit_line_note (input_location);
|
||||
expand_start_case (1, cond, TREE_TYPE (cond), "switch statement");
|
||||
expand_stmt (expand_unreachable_stmt (SWITCH_BODY (t), warn_notreached));
|
||||
expand_end_case_type (cond, SWITCH_TYPE (t));
|
||||
}
|
||||
|
||||
/* Create a CASE_LABEL tree node and return it. */
|
||||
|
||||
tree
|
||||
@ -683,378 +292,13 @@ build_case_label (tree low_value, tree high_value, tree label_decl)
|
||||
return build_stmt (CASE_LABEL, low_value, high_value, label_decl);
|
||||
}
|
||||
|
||||
|
||||
/* Generate the RTL for a CASE_LABEL. */
|
||||
|
||||
void
|
||||
genrtl_case_label (tree case_label)
|
||||
{
|
||||
tree duplicate;
|
||||
tree cleanup;
|
||||
|
||||
cleanup = last_cleanup_this_contour ();
|
||||
if (cleanup)
|
||||
{
|
||||
static int explained = 0;
|
||||
warning ("destructor needed for `%D'", (TREE_PURPOSE (cleanup)));
|
||||
warning ("where case label appears here");
|
||||
if (!explained)
|
||||
{
|
||||
warning ("(enclose actions of previous case statements requiring destructors in their own scope.)");
|
||||
explained = 1;
|
||||
}
|
||||
}
|
||||
|
||||
add_case_node (CASE_LOW (case_label), CASE_HIGH (case_label),
|
||||
CASE_LABEL_DECL (case_label), &duplicate);
|
||||
}
|
||||
|
||||
/* Generate the RTL for T, which is a COMPOUND_STMT. */
|
||||
|
||||
void
|
||||
genrtl_compound_stmt (tree t)
|
||||
{
|
||||
#ifdef ENABLE_CHECKING
|
||||
struct nesting *n = current_nesting_level ();
|
||||
#endif
|
||||
|
||||
expand_stmt (COMPOUND_BODY (t));
|
||||
|
||||
#ifdef ENABLE_CHECKING
|
||||
/* Make sure that we've pushed and popped the same number of levels. */
|
||||
if (!COMPOUND_STMT_NO_SCOPE (t) && n != current_nesting_level ())
|
||||
abort ();
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Generate the RTL for an ASM_STMT. */
|
||||
|
||||
void
|
||||
genrtl_asm_stmt (tree cv_qualifier, tree string, tree output_operands,
|
||||
tree input_operands, tree clobbers, int asm_input_p)
|
||||
{
|
||||
if (cv_qualifier != NULL_TREE
|
||||
&& cv_qualifier != ridpointers[(int) RID_VOLATILE])
|
||||
{
|
||||
warning ("%s qualifier ignored on asm",
|
||||
IDENTIFIER_POINTER (cv_qualifier));
|
||||
cv_qualifier = NULL_TREE;
|
||||
}
|
||||
|
||||
emit_line_note (input_location);
|
||||
if (asm_input_p)
|
||||
expand_asm (string, cv_qualifier != NULL_TREE);
|
||||
else
|
||||
c_expand_asm_operands (string, output_operands, input_operands,
|
||||
clobbers, cv_qualifier != NULL_TREE,
|
||||
input_location);
|
||||
}
|
||||
|
||||
/* Generate the RTL for a CLEANUP_STMT. */
|
||||
|
||||
void
|
||||
genrtl_cleanup_stmt (tree t)
|
||||
{
|
||||
tree decl = CLEANUP_DECL (t);
|
||||
if (!decl || !DECL_P (decl)
|
||||
|| (DECL_SIZE (decl) && TREE_TYPE (decl) != error_mark_node))
|
||||
expand_decl_cleanup_eh (decl, CLEANUP_EXPR (t), CLEANUP_EH_ONLY (t));
|
||||
}
|
||||
|
||||
/* We're about to expand T, a statement. Set up appropriate context
|
||||
for the substitution. */
|
||||
|
||||
void
|
||||
prep_stmt (tree t)
|
||||
{
|
||||
if (!STMT_LINENO_FOR_FN_P (t))
|
||||
input_line = STMT_LINENO (t);
|
||||
if (EXPR_LOCUS (t))
|
||||
input_location = *EXPR_LOCUS (t);
|
||||
current_stmt_tree ()->stmts_are_full_exprs_p = STMT_IS_FULL_EXPR_P (t);
|
||||
}
|
||||
|
||||
/* Generate the RTL for the statement T, its substatements, and any
|
||||
other statements at its nesting level. */
|
||||
|
||||
void
|
||||
expand_stmt (tree t)
|
||||
{
|
||||
while (t && t != error_mark_node)
|
||||
{
|
||||
int saved_stmts_are_full_exprs_p;
|
||||
|
||||
/* Set up context appropriately for handling this statement. */
|
||||
saved_stmts_are_full_exprs_p = stmts_are_full_exprs_p ();
|
||||
prep_stmt (t);
|
||||
|
||||
switch (TREE_CODE (t))
|
||||
{
|
||||
case FILE_STMT:
|
||||
input_filename = FILE_STMT_FILENAME (t);
|
||||
break;
|
||||
|
||||
case RETURN_STMT:
|
||||
genrtl_return_stmt (t);
|
||||
t = expand_unreachable_stmt (TREE_CHAIN (t), warn_notreached);
|
||||
goto process_t;
|
||||
|
||||
case EXPR_STMT:
|
||||
genrtl_expr_stmt_value (EXPR_STMT_EXPR (t), TREE_ADDRESSABLE (t),
|
||||
TREE_CHAIN (t) == NULL
|
||||
|| (TREE_CODE (TREE_CHAIN (t)) == SCOPE_STMT
|
||||
&& TREE_CHAIN (TREE_CHAIN (t)) == NULL));
|
||||
break;
|
||||
|
||||
case DECL_STMT:
|
||||
genrtl_decl_stmt (t);
|
||||
break;
|
||||
|
||||
case FOR_STMT:
|
||||
genrtl_for_stmt (t);
|
||||
break;
|
||||
|
||||
case WHILE_STMT:
|
||||
genrtl_while_stmt (t);
|
||||
break;
|
||||
|
||||
case DO_STMT:
|
||||
genrtl_do_stmt (t);
|
||||
break;
|
||||
|
||||
case IF_STMT:
|
||||
genrtl_if_stmt (t);
|
||||
break;
|
||||
|
||||
case COMPOUND_STMT:
|
||||
genrtl_compound_stmt (t);
|
||||
break;
|
||||
|
||||
case BREAK_STMT:
|
||||
genrtl_break_stmt ();
|
||||
t = expand_unreachable_stmt (TREE_CHAIN (t), warn_notreached);
|
||||
goto process_t;
|
||||
|
||||
case CONTINUE_STMT:
|
||||
genrtl_continue_stmt ();
|
||||
t = expand_unreachable_stmt (TREE_CHAIN (t), warn_notreached);
|
||||
goto process_t;
|
||||
|
||||
case SWITCH_STMT:
|
||||
genrtl_switch_stmt (t);
|
||||
break;
|
||||
|
||||
case CASE_LABEL:
|
||||
genrtl_case_label (t);
|
||||
break;
|
||||
|
||||
case LABEL_STMT:
|
||||
expand_label (LABEL_STMT_LABEL (t));
|
||||
break;
|
||||
|
||||
case GOTO_STMT:
|
||||
/* Emit information for branch prediction. */
|
||||
if (!GOTO_FAKE_P (t)
|
||||
&& TREE_CODE (GOTO_DESTINATION (t)) == LABEL_DECL
|
||||
&& flag_guess_branch_prob)
|
||||
{
|
||||
rtx note = emit_note (NOTE_INSN_PREDICTION);
|
||||
|
||||
NOTE_PREDICTION (note) = NOTE_PREDICT (PRED_GOTO, NOT_TAKEN);
|
||||
}
|
||||
genrtl_goto_stmt (GOTO_DESTINATION (t));
|
||||
t = expand_unreachable_stmt (TREE_CHAIN (t), warn_notreached);
|
||||
goto process_t;
|
||||
|
||||
case ASM_STMT:
|
||||
genrtl_asm_stmt (ASM_CV_QUAL (t), ASM_STRING (t),
|
||||
ASM_OUTPUTS (t), ASM_INPUTS (t),
|
||||
ASM_CLOBBERS (t), ASM_INPUT_P (t));
|
||||
break;
|
||||
|
||||
case SCOPE_STMT:
|
||||
genrtl_scope_stmt (t);
|
||||
break;
|
||||
|
||||
case CLEANUP_STMT:
|
||||
genrtl_cleanup_stmt (t);
|
||||
break;
|
||||
|
||||
default:
|
||||
if (lang_expand_stmt)
|
||||
(*lang_expand_stmt) (t);
|
||||
else
|
||||
abort ();
|
||||
break;
|
||||
}
|
||||
|
||||
/* Go on to the next statement in this scope. */
|
||||
t = TREE_CHAIN (t);
|
||||
|
||||
process_t:
|
||||
/* Restore saved state. */
|
||||
current_stmt_tree ()->stmts_are_full_exprs_p
|
||||
= saved_stmts_are_full_exprs_p;
|
||||
}
|
||||
}
|
||||
|
||||
/* If *TP is a potentially reachable label, return nonzero. */
|
||||
|
||||
static tree
|
||||
find_reachable_label_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
|
||||
void *data ATTRIBUTE_UNUSED)
|
||||
{
|
||||
switch (TREE_CODE (*tp))
|
||||
{
|
||||
case LABEL_STMT:
|
||||
case CASE_LABEL:
|
||||
return *tp;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
/* Determine whether expression EXP contains a potentially
|
||||
reachable label. */
|
||||
static tree
|
||||
find_reachable_label (tree exp)
|
||||
{
|
||||
location_t saved_loc = input_location;
|
||||
tree ret = walk_tree_without_duplicates
|
||||
(&exp, find_reachable_label_1, NULL);
|
||||
input_location = saved_loc;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Expand an unreachable if statement, T. This function returns
|
||||
true if the IF_STMT contains a potentially reachable code_label. */
|
||||
static bool
|
||||
expand_unreachable_if_stmt (tree t)
|
||||
{
|
||||
tree n;
|
||||
|
||||
if (find_reachable_label (IF_COND (t)) != NULL_TREE)
|
||||
{
|
||||
genrtl_if_stmt (t);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (THEN_CLAUSE (t) && ELSE_CLAUSE (t))
|
||||
{
|
||||
n = expand_unreachable_stmt (THEN_CLAUSE (t), 0);
|
||||
|
||||
if (n != NULL_TREE)
|
||||
{
|
||||
rtx label;
|
||||
expand_stmt (n);
|
||||
label = gen_label_rtx ();
|
||||
emit_jump (label);
|
||||
expand_stmt (expand_unreachable_stmt (ELSE_CLAUSE (t), 0));
|
||||
emit_label (label);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
n = expand_unreachable_stmt (ELSE_CLAUSE (t), 0);
|
||||
}
|
||||
else if (THEN_CLAUSE (t))
|
||||
n = expand_unreachable_stmt (THEN_CLAUSE (t), 0);
|
||||
else if (ELSE_CLAUSE (t))
|
||||
n = expand_unreachable_stmt (ELSE_CLAUSE (t), 0);
|
||||
else
|
||||
n = NULL_TREE;
|
||||
|
||||
expand_stmt (n);
|
||||
|
||||
return n != NULL_TREE;
|
||||
}
|
||||
|
||||
/* Expand an unreachable statement list. This function skips all
|
||||
statements preceding the first potentially reachable label and
|
||||
then returns the label (or, in same cases, the statement after
|
||||
one containing the label). */
|
||||
static tree
|
||||
expand_unreachable_stmt (tree t, int warn)
|
||||
{
|
||||
int saved;
|
||||
|
||||
while (t && t != error_mark_node)
|
||||
{
|
||||
if (warn)
|
||||
switch (TREE_CODE (t))
|
||||
{
|
||||
case BREAK_STMT:
|
||||
case CONTINUE_STMT:
|
||||
case EXPR_STMT:
|
||||
case GOTO_STMT:
|
||||
case IF_STMT:
|
||||
case RETURN_STMT:
|
||||
if (!STMT_LINENO_FOR_FN_P (t))
|
||||
input_line = STMT_LINENO (t);
|
||||
warning("will never be executed");
|
||||
warn = false;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (TREE_CODE (t))
|
||||
{
|
||||
case GOTO_STMT:
|
||||
case CONTINUE_STMT:
|
||||
case BREAK_STMT:
|
||||
break;
|
||||
|
||||
case FILE_STMT:
|
||||
input_filename = FILE_STMT_FILENAME (t);
|
||||
break;
|
||||
|
||||
case RETURN_STMT:
|
||||
if (find_reachable_label (RETURN_STMT_EXPR (t)) != NULL_TREE)
|
||||
return t;
|
||||
break;
|
||||
|
||||
case EXPR_STMT:
|
||||
if (find_reachable_label (EXPR_STMT_EXPR (t)) != NULL_TREE)
|
||||
return t;
|
||||
break;
|
||||
|
||||
case IF_STMT:
|
||||
if (expand_unreachable_if_stmt (t))
|
||||
return TREE_CHAIN (t);
|
||||
break;
|
||||
|
||||
case WHILE_STMT:
|
||||
/* If the start of a while statement is unreachable, there is
|
||||
no need to rotate the loop, instead the WHILE_STMT can be
|
||||
expanded like a DO_STMT. */
|
||||
genrtl_do_stmt_1 (WHILE_COND (t), WHILE_BODY (t));
|
||||
return TREE_CHAIN (t);
|
||||
|
||||
case COMPOUND_STMT:
|
||||
{
|
||||
tree n;
|
||||
n = expand_unreachable_stmt (COMPOUND_BODY (t), warn);
|
||||
if (n != NULL_TREE)
|
||||
{
|
||||
expand_stmt (n);
|
||||
return TREE_CHAIN (t);
|
||||
}
|
||||
warn = false;
|
||||
break;
|
||||
}
|
||||
|
||||
case SCOPE_STMT:
|
||||
saved = stmts_are_full_exprs_p ();
|
||||
prep_stmt (t);
|
||||
genrtl_scope_stmt (t);
|
||||
current_stmt_tree ()->stmts_are_full_exprs_p = saved;
|
||||
break;
|
||||
|
||||
default:
|
||||
return t;
|
||||
}
|
||||
t = TREE_CHAIN (t);
|
||||
}
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
1102
gcc/c-simplify.c
Normal file
1102
gcc/c-simplify.c
Normal file
File diff suppressed because it is too large
Load Diff
17
gcc/c-tree.h
17
gcc/c-tree.h
@ -29,6 +29,13 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
#define C_SIZEOF_STRUCT_LANG_IDENTIFIER \
|
||||
(sizeof (struct c_common_identifier) + 3 * sizeof (void *))
|
||||
|
||||
/* For gc purposes, return the most likely link for the longest chain. */
|
||||
#define C_LANG_TREE_NODE_CHAIN_NEXT(T) \
|
||||
((union lang_tree_node *) \
|
||||
(TREE_CODE (T) == INTEGER_TYPE ? TYPE_NEXT_VARIANT (T) \
|
||||
: TREE_CODE (T) == COMPOUND_EXPR ? TREE_OPERAND (T, 1) \
|
||||
: TREE_CHAIN (T)))
|
||||
|
||||
/* Language-specific declaration information. */
|
||||
|
||||
struct lang_decl GTY(())
|
||||
@ -58,10 +65,13 @@ struct lang_decl GTY(())
|
||||
and C_RID_YYCODE is the token number wanted by Yacc. */
|
||||
#define C_IS_RESERVED_WORD(ID) TREE_LANG_FLAG_0 (ID)
|
||||
|
||||
/* In a RECORD_TYPE, a sorted array of the fields of the type. */
|
||||
struct lang_type GTY(())
|
||||
{
|
||||
/* In a RECORD_TYPE, a sorted array of the fields of the type. */
|
||||
struct sorted_fields_type * GTY ((reorder ("resort_sorted_fields"))) s;
|
||||
/* In an ENUMERAL_TYPE, the min and max values. */
|
||||
tree enum_min;
|
||||
tree enum_max;
|
||||
};
|
||||
|
||||
/* Record whether a type or decl was written with nonconstant size.
|
||||
@ -182,7 +192,7 @@ extern tree start_struct (enum tree_code, tree);
|
||||
extern void store_parm_decls (void);
|
||||
extern tree xref_tag (enum tree_code, tree);
|
||||
extern tree c_begin_compound_stmt (void);
|
||||
extern void c_expand_decl_stmt (tree);
|
||||
extern int c_expand_decl (tree);
|
||||
extern void c_static_assembler_name (tree);
|
||||
extern tree make_pointer_declarator (tree, tree);
|
||||
|
||||
@ -190,8 +200,8 @@ extern tree make_pointer_declarator (tree, tree);
|
||||
extern int c_disregard_inline_limits (tree);
|
||||
extern int c_cannot_inline_tree_fn (tree *);
|
||||
extern bool c_objc_common_init (void);
|
||||
extern bool c_missing_noreturn_ok_p (tree);
|
||||
extern tree c_objc_common_truthvalue_conversion (tree expr);
|
||||
extern int c_missing_noreturn_ok_p (tree);
|
||||
extern void c_objc_common_finish_file (void);
|
||||
extern int defer_fn (tree);
|
||||
extern bool c_warn_unused_global_decl (tree);
|
||||
@ -248,6 +258,7 @@ extern void c_finish_case (void);
|
||||
extern tree build_asm_expr (tree, tree, tree, tree, bool);
|
||||
extern tree build_asm_stmt (tree, tree);
|
||||
extern tree c_convert_parm_for_inlining (tree, tree, tree, int);
|
||||
extern int c_types_compatible_p (tree, tree);
|
||||
|
||||
/* Set to 0 at beginning of a function definition, set to 1 if
|
||||
a return statement that specifies a return value is seen. */
|
||||
|
104
gcc/c-typeck.c
104
gcc/c-typeck.c
@ -687,7 +687,9 @@ tagged_types_tu_compatible_p (tree t1, tree t2, int flags)
|
||||
/* We have to verify that the tags of the types are the same. This
|
||||
is harder than it looks because this may be a typedef, so we have
|
||||
to go look at the original type. It may even be a typedef of a
|
||||
typedef... */
|
||||
typedef...
|
||||
In the case of compiler-created builtin structs the TYPE_DECL
|
||||
may be a dummy, with no DECL_ORIGINAL_TYPE. Don't fault. */
|
||||
while (TYPE_NAME (t1)
|
||||
&& TREE_CODE (TYPE_NAME (t1)) == TYPE_DECL
|
||||
&& DECL_ORIGINAL_TYPE (TYPE_NAME (t1)))
|
||||
@ -1143,7 +1145,6 @@ default_function_array_conversion (tree exp)
|
||||
adr = build1 (ADDR_EXPR, ptrtype, exp);
|
||||
if (!c_mark_addressable (exp))
|
||||
return error_mark_node;
|
||||
TREE_CONSTANT (adr) = staticp (exp);
|
||||
TREE_SIDE_EFFECTS (adr) = 0; /* Default would be, same as EXP. */
|
||||
return adr;
|
||||
}
|
||||
@ -1489,8 +1490,7 @@ build_array_ref (tree array, tree index)
|
||||
|| TREE_TYPE (index) == error_mark_node)
|
||||
return error_mark_node;
|
||||
|
||||
if (TREE_CODE (TREE_TYPE (array)) == ARRAY_TYPE
|
||||
&& TREE_CODE (array) != INDIRECT_REF)
|
||||
if (TREE_CODE (TREE_TYPE (array)) == ARRAY_TYPE)
|
||||
{
|
||||
tree rval, type;
|
||||
|
||||
@ -1660,6 +1660,7 @@ build_external_ref (tree id, int fun)
|
||||
{
|
||||
ref = DECL_INITIAL (ref);
|
||||
TREE_CONSTANT (ref) = 1;
|
||||
TREE_INVARIANT (ref) = 1;
|
||||
}
|
||||
else if (current_function_decl != 0
|
||||
&& !DECL_FILE_SCOPE_P (current_function_decl)
|
||||
@ -2088,14 +2089,12 @@ parser_build_binary_op (enum tree_code code, tree arg1, tree arg2)
|
||||
C_SET_EXP_ORIGINAL_CODE (result, code);
|
||||
else
|
||||
{
|
||||
int flag = TREE_CONSTANT (result);
|
||||
/* We used to use NOP_EXPR rather than NON_LVALUE_EXPR
|
||||
so that convert_for_assignment wouldn't strip it.
|
||||
That way, we got warnings for things like p = (1 - 1).
|
||||
But it turns out we should not get those warnings. */
|
||||
result = build1 (NON_LVALUE_EXPR, TREE_TYPE (result), result);
|
||||
C_SET_EXP_ORIGINAL_CODE (result, code);
|
||||
TREE_CONSTANT (result) = flag;
|
||||
}
|
||||
|
||||
return result;
|
||||
@ -2127,7 +2126,6 @@ c_tree_expr_nonnegative_p (tree t)
|
||||
static tree
|
||||
pointer_diff (tree op0, tree op1)
|
||||
{
|
||||
tree result, folded;
|
||||
tree restype = ptrdiff_type_node;
|
||||
|
||||
tree target_type = TREE_TYPE (TREE_TYPE (op0));
|
||||
@ -2191,13 +2189,7 @@ pointer_diff (tree op0, tree op1)
|
||||
op1 = c_size_in_bytes (target_type);
|
||||
|
||||
/* Divide by the size, in easiest possible way. */
|
||||
|
||||
result = build (EXACT_DIV_EXPR, restype, op0, convert (restype, op1));
|
||||
|
||||
folded = fold (result);
|
||||
if (folded == result)
|
||||
TREE_CONSTANT (folded) = TREE_CONSTANT (op0) & TREE_CONSTANT (op1);
|
||||
return folded;
|
||||
return fold (build (EXACT_DIV_EXPR, restype, op0, convert (restype, op1)));
|
||||
}
|
||||
|
||||
/* Construct and perhaps optimize a tree representation
|
||||
@ -2420,7 +2412,7 @@ build_unary_op (enum tree_code code, tree xarg, int flag)
|
||||
TREE_SIDE_EFFECTS (val) = 1;
|
||||
val = convert (result_type, val);
|
||||
if (TREE_CODE (val) != code)
|
||||
TREE_NO_UNUSED_WARNING (val) = 1;
|
||||
TREE_NO_WARNING (val) = 1;
|
||||
return val;
|
||||
}
|
||||
|
||||
@ -2492,12 +2484,6 @@ build_unary_op (enum tree_code code, tree xarg, int flag)
|
||||
else
|
||||
addr = build1 (code, argtype, arg);
|
||||
|
||||
/* Address of a static or external variable or
|
||||
file-scope function counts as a constant. */
|
||||
if (staticp (arg)
|
||||
&& ! (TREE_CODE (arg) == FUNCTION_DECL
|
||||
&& !DECL_FILE_SCOPE_P (arg)))
|
||||
TREE_CONSTANT (addr) = 1;
|
||||
return addr;
|
||||
}
|
||||
|
||||
@ -2933,6 +2919,7 @@ build_c_cast (tree type, tree expr)
|
||||
build_tree_list (field, value)),
|
||||
0);
|
||||
TREE_CONSTANT (t) = TREE_CONSTANT (value);
|
||||
TREE_INVARIANT (t) = TREE_INVARIANT (value);
|
||||
return t;
|
||||
}
|
||||
error ("cast to union type from type not present in union");
|
||||
@ -4758,7 +4745,7 @@ pop_init_level (int implicit)
|
||||
constructor = build_constructor (constructor_type,
|
||||
nreverse (constructor_elements));
|
||||
if (constructor_constant)
|
||||
TREE_CONSTANT (constructor) = 1;
|
||||
TREE_CONSTANT (constructor) = TREE_INVARIANT (constructor) = 1;
|
||||
if (constructor_constant && constructor_simple)
|
||||
TREE_STATIC (constructor) = 1;
|
||||
}
|
||||
@ -6052,8 +6039,8 @@ process_init_element (tree value)
|
||||
tree
|
||||
build_asm_stmt (tree cv_qualifier, tree args)
|
||||
{
|
||||
if (!TREE_OPERAND (args, 0))
|
||||
TREE_OPERAND (args, 0) = cv_qualifier;
|
||||
if (!ASM_VOLATILE_P (args) && cv_qualifier)
|
||||
ASM_VOLATILE_P (args) = 1;
|
||||
return add_stmt (args);
|
||||
}
|
||||
|
||||
@ -6068,36 +6055,42 @@ build_asm_expr (tree string, tree outputs, tree inputs, tree clobbers,
|
||||
{
|
||||
tree tail;
|
||||
tree args;
|
||||
int i;
|
||||
const char *constraint;
|
||||
bool allows_mem, allows_reg, is_inout;
|
||||
int ninputs;
|
||||
int noutputs;
|
||||
|
||||
/* We can remove output conversions that change the type,
|
||||
but not the mode. */
|
||||
for (tail = outputs; tail; tail = TREE_CHAIN (tail))
|
||||
{
|
||||
tree output = TREE_VALUE (tail);
|
||||
|
||||
STRIP_NOPS (output);
|
||||
TREE_VALUE (tail) = output;
|
||||
|
||||
/* Allow conversions as LHS here. build_modify_expr as called below
|
||||
will do the right thing with them. */
|
||||
while (TREE_CODE (output) == NOP_EXPR
|
||||
|| TREE_CODE (output) == CONVERT_EXPR
|
||||
|| TREE_CODE (output) == FLOAT_EXPR
|
||||
|| TREE_CODE (output) == FIX_TRUNC_EXPR
|
||||
|| TREE_CODE (output) == FIX_FLOOR_EXPR
|
||||
|| TREE_CODE (output) == FIX_ROUND_EXPR
|
||||
|| TREE_CODE (output) == FIX_CEIL_EXPR)
|
||||
output = TREE_OPERAND (output, 0);
|
||||
|
||||
lvalue_or_else (TREE_VALUE (tail), "invalid lvalue in asm statement");
|
||||
}
|
||||
ninputs = list_length (inputs);
|
||||
noutputs = list_length (outputs);
|
||||
|
||||
/* Remove output conversions that change the type but not the mode. */
|
||||
for (tail = outputs; tail; tail = TREE_CHAIN (tail))
|
||||
for (i = 0, tail = outputs; tail; ++i, tail = TREE_CHAIN (tail))
|
||||
{
|
||||
tree output = TREE_VALUE (tail);
|
||||
STRIP_NOPS (output);
|
||||
TREE_VALUE (tail) = output;
|
||||
lvalue_or_else (output, "invalid lvalue in asm statement");
|
||||
|
||||
constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tail)));
|
||||
|
||||
if (!parse_output_constraint (&constraint, i, ninputs, noutputs,
|
||||
&allows_mem, &allows_reg, &is_inout))
|
||||
{
|
||||
/* By marking this operand as erroneous, we will not try
|
||||
to process this operand again in expand_asm_operands. */
|
||||
TREE_VALUE (tail) = error_mark_node;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* If the operand is a DECL that is going to end up in
|
||||
memory, assume it is addressable. This is a bit more
|
||||
conservative than it would ideally be; the exact test is
|
||||
buried deep in expand_asm_operands and depends on the
|
||||
DECL_RTL for the OPERAND -- which we don't have at this
|
||||
point. */
|
||||
if (!allows_reg && DECL_P (output))
|
||||
c_mark_addressable (output);
|
||||
}
|
||||
|
||||
/* Perform default conversions on array and function inputs.
|
||||
@ -6106,12 +6099,12 @@ build_asm_expr (tree string, tree outputs, tree inputs, tree clobbers,
|
||||
for (tail = inputs; tail; tail = TREE_CHAIN (tail))
|
||||
TREE_VALUE (tail) = default_function_array_conversion (TREE_VALUE (tail));
|
||||
|
||||
args = build_stmt (ASM_STMT, 0, string, outputs, inputs, clobbers);
|
||||
args = build_stmt (ASM_STMT, string, outputs, inputs, clobbers);
|
||||
|
||||
/* Simple asm statements are treated as volatile. */
|
||||
if (simple)
|
||||
{
|
||||
TREE_OPERAND (args, 0) = ridpointers[RID_VOLATILE];
|
||||
ASM_VOLATILE_P (args) = 1;
|
||||
ASM_INPUT_P (args) = 1;
|
||||
}
|
||||
return args;
|
||||
@ -6375,6 +6368,9 @@ c_finish_case (void)
|
||||
{
|
||||
struct c_switch *cs = switch_stack;
|
||||
|
||||
/* Emit warnings as needed. */
|
||||
c_do_switch_warnings (cs->cases, cs->switch_stmt);
|
||||
|
||||
/* Rechain the next statements to the SWITCH_STMT. */
|
||||
last_tree = cs->switch_stmt;
|
||||
|
||||
@ -7103,16 +7099,14 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
|
||||
|
||||
{
|
||||
tree result = build (resultcode, build_type, op0, op1);
|
||||
tree folded;
|
||||
|
||||
/* Treat expressions in initializers specially as they can't trap. */
|
||||
folded = initializer_stack ? fold_initializer (result)
|
||||
result = initializer_stack ? fold_initializer (result)
|
||||
: fold (result);
|
||||
if (folded == result)
|
||||
TREE_CONSTANT (folded) = TREE_CONSTANT (op0) & TREE_CONSTANT (op1);
|
||||
|
||||
if (final_type != 0)
|
||||
return convert (final_type, folded);
|
||||
return folded;
|
||||
result = convert (final_type, result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -469,10 +469,6 @@ fdollars-in-identifiers
|
||||
C ObjC C++ ObjC++
|
||||
Permit '$' as an identifier character
|
||||
|
||||
fdump-
|
||||
C ObjC C++ ObjC++ Joined RejectNegative
|
||||
-fdump-<type> Dump various compiler internals to a file
|
||||
|
||||
felide-constructors
|
||||
C++ ObjC++
|
||||
|
||||
|
475
gcc/calls.c
475
gcc/calls.c
@ -120,7 +120,7 @@ int stack_arg_under_construction;
|
||||
static int calls_function (tree, int);
|
||||
static int calls_function_1 (tree, int);
|
||||
|
||||
static void emit_call_1 (rtx, tree, tree, HOST_WIDE_INT, HOST_WIDE_INT,
|
||||
static void emit_call_1 (rtx, tree, tree, tree, HOST_WIDE_INT, HOST_WIDE_INT,
|
||||
HOST_WIDE_INT, rtx, rtx, int, rtx, int,
|
||||
CUMULATIVE_ARGS *);
|
||||
static void precompute_register_parameters (int, struct arg_data *, int *);
|
||||
@ -134,7 +134,7 @@ static void initialize_argument_information (int, struct arg_data *,
|
||||
struct args_size *, int, tree,
|
||||
tree, CUMULATIVE_ARGS *, int,
|
||||
rtx *, int *, int *, int *,
|
||||
bool);
|
||||
bool *, bool);
|
||||
static void compute_argument_addresses (struct arg_data *, rtx, int);
|
||||
static rtx rtx_for_function_call (tree, tree);
|
||||
static void load_register_parameters (struct arg_data *, int, rtx *, int,
|
||||
@ -142,7 +142,6 @@ static void load_register_parameters (struct arg_data *, int, rtx *, int,
|
||||
static rtx emit_library_call_value_1 (int, rtx, rtx, enum libcall_type,
|
||||
enum machine_mode, int, va_list);
|
||||
static int special_function_p (tree, int);
|
||||
static rtx try_to_integrate (tree, tree, rtx, int, tree, rtx);
|
||||
static int check_sibcall_argument_overlap_1 (rtx);
|
||||
static int check_sibcall_argument_overlap (rtx, struct arg_data *, int);
|
||||
|
||||
@ -280,17 +279,11 @@ calls_function_1 (tree exp, int which)
|
||||
CALL_INSN_FUNCTION_USAGE information. */
|
||||
|
||||
rtx
|
||||
prepare_call_address (rtx funexp, tree fndecl, rtx *call_fusage,
|
||||
int reg_parm_seen, int sibcallp)
|
||||
prepare_call_address (rtx funexp, rtx static_chain_value,
|
||||
rtx *call_fusage, int reg_parm_seen, int sibcallp)
|
||||
{
|
||||
rtx static_chain_value = 0;
|
||||
|
||||
funexp = protect_from_queue (funexp, 0);
|
||||
|
||||
if (fndecl != 0)
|
||||
/* Get possible static chain value for nested function in C. */
|
||||
static_chain_value = lookup_static_chain (fndecl);
|
||||
|
||||
/* Make a valid memory address and copy constants through pseudo-regs,
|
||||
but not for a constant address if -fno-function-cse. */
|
||||
if (GET_CODE (funexp) != SYMBOL_REF)
|
||||
@ -362,7 +355,8 @@ prepare_call_address (rtx funexp, tree fndecl, rtx *call_fusage,
|
||||
denote registers used by the called function. */
|
||||
|
||||
static void
|
||||
emit_call_1 (rtx funexp, tree fndecl ATTRIBUTE_UNUSED, tree funtype ATTRIBUTE_UNUSED,
|
||||
emit_call_1 (rtx funexp, tree fntree, tree fndecl ATTRIBUTE_UNUSED,
|
||||
tree funtype ATTRIBUTE_UNUSED,
|
||||
HOST_WIDE_INT stack_size ATTRIBUTE_UNUSED,
|
||||
HOST_WIDE_INT rounded_stack_size,
|
||||
HOST_WIDE_INT struct_value_size ATTRIBUTE_UNUSED,
|
||||
@ -506,7 +500,16 @@ emit_call_1 (rtx funexp, tree fndecl ATTRIBUTE_UNUSED, tree funtype ATTRIBUTE_UN
|
||||
REG_NOTES (call_insn) = gen_rtx_EXPR_LIST (REG_EH_REGION, const0_rtx,
|
||||
REG_NOTES (call_insn));
|
||||
else
|
||||
note_eh_region_may_contain_throw ();
|
||||
{
|
||||
int rn = lookup_stmt_eh_region (fntree);
|
||||
|
||||
/* If rn < 0, then either (1) tree-ssa not used or (2) doesn't
|
||||
throw, which we already took care of. */
|
||||
if (rn > 0)
|
||||
REG_NOTES (call_insn) = gen_rtx_EXPR_LIST (REG_EH_REGION, GEN_INT (rn),
|
||||
REG_NOTES (call_insn));
|
||||
note_current_region_may_contain_throw ();
|
||||
}
|
||||
|
||||
if (ecf_flags & ECF_NORETURN)
|
||||
REG_NOTES (call_insn) = gen_rtx_EXPR_LIST (REG_NORETURN, const0_rtx,
|
||||
@ -590,8 +593,7 @@ emit_call_1 (rtx funexp, tree fndecl ATTRIBUTE_UNUSED, tree funtype ATTRIBUTE_UN
|
||||
static int
|
||||
special_function_p (tree fndecl, int flags)
|
||||
{
|
||||
if (! (flags & ECF_MALLOC)
|
||||
&& fndecl && DECL_NAME (fndecl)
|
||||
if (fndecl && DECL_NAME (fndecl)
|
||||
&& IDENTIFIER_LENGTH (DECL_NAME (fndecl)) <= 17
|
||||
/* Exclude functions not at the file scope, or not `extern',
|
||||
since they are not the magic functions we would otherwise
|
||||
@ -714,6 +716,8 @@ flags_from_decl_or_type (tree exp)
|
||||
|
||||
if (TREE_READONLY (exp) && ! TREE_THIS_VOLATILE (exp))
|
||||
flags |= ECF_LIBCALL_BLOCK | ECF_CONST;
|
||||
|
||||
flags = special_function_p (exp, flags);
|
||||
}
|
||||
else if (TYPE_P (exp) && TYPE_READONLY (exp) && ! TREE_THIS_VOLATILE (exp))
|
||||
flags |= ECF_CONST;
|
||||
@ -1012,6 +1016,9 @@ store_unaligned_arguments_into_pseudos (struct arg_data *args, int num_actuals)
|
||||
OLD_PENDING_ADJ, MUST_PREALLOCATE and FLAGS are pointers to integer
|
||||
flags which may may be modified by this routine.
|
||||
|
||||
MAY_TAILCALL is cleared if we encounter an invisible pass-by-reference
|
||||
that requires allocation of stack space.
|
||||
|
||||
CALL_FROM_THUNK_P is true if this call is the jump from a thunk to
|
||||
the thunked-to function. */
|
||||
|
||||
@ -1025,7 +1032,7 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
|
||||
int reg_parm_stack_space,
|
||||
rtx *old_stack_level, int *old_pending_adj,
|
||||
int *must_preallocate, int *ecf_flags,
|
||||
bool call_from_thunk_p)
|
||||
bool *may_tailcall, bool call_from_thunk_p)
|
||||
{
|
||||
/* 1 if scanning parms front to back, -1 if scanning back to front. */
|
||||
int inc;
|
||||
@ -1138,6 +1145,7 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
|
||||
build_pointer_type (type),
|
||||
args[i].tree_value);
|
||||
type = build_pointer_type (type);
|
||||
*may_tailcall = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1177,6 +1185,7 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
|
||||
build_pointer_type (type),
|
||||
make_tree (type, copy));
|
||||
type = build_pointer_type (type);
|
||||
*may_tailcall = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1705,120 +1714,6 @@ load_register_parameters (struct arg_data *args, int num_actuals,
|
||||
}
|
||||
}
|
||||
|
||||
/* Try to integrate function. See expand_inline_function for documentation
|
||||
about the parameters. */
|
||||
|
||||
static rtx
|
||||
try_to_integrate (tree fndecl, tree actparms, rtx target, int ignore,
|
||||
tree type, rtx structure_value_addr)
|
||||
{
|
||||
rtx temp;
|
||||
rtx before_call;
|
||||
int i;
|
||||
rtx old_stack_level = 0;
|
||||
int reg_parm_stack_space = 0;
|
||||
|
||||
#ifdef REG_PARM_STACK_SPACE
|
||||
reg_parm_stack_space = REG_PARM_STACK_SPACE (fndecl);
|
||||
#endif
|
||||
|
||||
before_call = get_last_insn ();
|
||||
|
||||
timevar_push (TV_INTEGRATION);
|
||||
|
||||
temp = expand_inline_function (fndecl, actparms, target,
|
||||
ignore, type,
|
||||
structure_value_addr);
|
||||
|
||||
timevar_pop (TV_INTEGRATION);
|
||||
|
||||
/* If inlining succeeded, return. */
|
||||
if (temp != (rtx) (size_t) - 1)
|
||||
{
|
||||
if (ACCUMULATE_OUTGOING_ARGS)
|
||||
{
|
||||
/* If the outgoing argument list must be preserved, push
|
||||
the stack before executing the inlined function if it
|
||||
makes any calls. */
|
||||
|
||||
i = reg_parm_stack_space;
|
||||
if (i > highest_outgoing_arg_in_use)
|
||||
i = highest_outgoing_arg_in_use;
|
||||
while (--i >= 0 && stack_usage_map[i] == 0)
|
||||
;
|
||||
|
||||
if (stack_arg_under_construction || i >= 0)
|
||||
{
|
||||
rtx first_insn
|
||||
= before_call ? NEXT_INSN (before_call) : get_insns ();
|
||||
rtx insn = NULL_RTX, seq;
|
||||
|
||||
/* Look for a call in the inline function code.
|
||||
If DECL_STRUCT_FUNCTION (fndecl)->outgoing_args_size is
|
||||
nonzero then there is a call and it is not necessary
|
||||
to scan the insns. */
|
||||
|
||||
if (DECL_STRUCT_FUNCTION (fndecl)->outgoing_args_size == 0)
|
||||
for (insn = first_insn; insn; insn = NEXT_INSN (insn))
|
||||
if (GET_CODE (insn) == CALL_INSN)
|
||||
break;
|
||||
|
||||
if (insn)
|
||||
{
|
||||
/* Reserve enough stack space so that the largest
|
||||
argument list of any function call in the inline
|
||||
function does not overlap the argument list being
|
||||
evaluated. This is usually an overestimate because
|
||||
allocate_dynamic_stack_space reserves space for an
|
||||
outgoing argument list in addition to the requested
|
||||
space, but there is no way to ask for stack space such
|
||||
that an argument list of a certain length can be
|
||||
safely constructed.
|
||||
|
||||
Add the stack space reserved for register arguments, if
|
||||
any, in the inline function. What is really needed is the
|
||||
largest value of reg_parm_stack_space in the inline
|
||||
function, but that is not available. Using the current
|
||||
value of reg_parm_stack_space is wrong, but gives
|
||||
correct results on all supported machines. */
|
||||
|
||||
int adjust =
|
||||
(DECL_STRUCT_FUNCTION (fndecl)->outgoing_args_size
|
||||
+ reg_parm_stack_space);
|
||||
|
||||
start_sequence ();
|
||||
emit_stack_save (SAVE_BLOCK, &old_stack_level, NULL_RTX);
|
||||
allocate_dynamic_stack_space (GEN_INT (adjust),
|
||||
NULL_RTX, BITS_PER_UNIT);
|
||||
seq = get_insns ();
|
||||
end_sequence ();
|
||||
emit_insn_before (seq, first_insn);
|
||||
emit_stack_restore (SAVE_BLOCK, old_stack_level, NULL_RTX);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* If the result is equivalent to TARGET, return TARGET to simplify
|
||||
checks in store_expr. They can be equivalent but not equal in the
|
||||
case of a function that returns BLKmode. */
|
||||
if (temp != target && rtx_equal_p (temp, target))
|
||||
return target;
|
||||
return temp;
|
||||
}
|
||||
|
||||
/* If inlining failed, mark FNDECL as needing to be compiled
|
||||
separately after all. If function was declared inline,
|
||||
give a warning. */
|
||||
if (DECL_INLINE (fndecl) && warn_inline && !flag_no_inline
|
||||
&& optimize > 0 && !TREE_ADDRESSABLE (fndecl))
|
||||
{
|
||||
warning ("%Jinlining failed in call to '%F'", fndecl, fndecl);
|
||||
warning ("called from here");
|
||||
}
|
||||
lang_hooks.mark_addressable (fndecl);
|
||||
return (rtx) (size_t) - 1;
|
||||
}
|
||||
|
||||
/* We need to pop PENDING_STACK_ADJUST bytes. But, if the arguments
|
||||
wouldn't fill up an even multiple of PREFERRED_UNIT_STACK_BOUNDARY
|
||||
bytes, then we would need to push some additional bytes to pad the
|
||||
@ -2029,6 +1924,69 @@ shift_returned_value (tree type, rtx *value)
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Remove all REG_EQUIV notes found in the insn chain. */
|
||||
|
||||
static void
|
||||
purge_reg_equiv_notes (void)
|
||||
{
|
||||
rtx insn;
|
||||
|
||||
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
rtx note = find_reg_note (insn, REG_EQUIV, 0);
|
||||
if (note)
|
||||
{
|
||||
/* Remove the note and keep looking at the notes for
|
||||
this insn. */
|
||||
remove_note (insn, note);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Clear RTX_UNCHANGING_P flag of incoming argument MEMs. */
|
||||
|
||||
static void
|
||||
purge_mem_unchanging_flag (rtx x)
|
||||
{
|
||||
RTX_CODE code;
|
||||
int i, j;
|
||||
const char *fmt;
|
||||
|
||||
if (x == NULL_RTX)
|
||||
return;
|
||||
|
||||
code = GET_CODE (x);
|
||||
|
||||
if (code == MEM)
|
||||
{
|
||||
if (RTX_UNCHANGING_P (x)
|
||||
&& (XEXP (x, 0) == current_function_internal_arg_pointer
|
||||
|| (GET_CODE (XEXP (x, 0)) == PLUS
|
||||
&& XEXP (XEXP (x, 0), 0) ==
|
||||
current_function_internal_arg_pointer
|
||||
&& GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)))
|
||||
RTX_UNCHANGING_P (x) = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Scan all subexpressions. */
|
||||
fmt = GET_RTX_FORMAT (code);
|
||||
for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
|
||||
{
|
||||
if (*fmt == 'e')
|
||||
purge_mem_unchanging_flag (XEXP (x, i));
|
||||
else if (*fmt == 'E')
|
||||
for (j = 0; j < XVECLEN (x, i); j++)
|
||||
purge_mem_unchanging_flag (XVECEXP (x, i, j));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Generate all the code for a function call
|
||||
and return an rtx for its value.
|
||||
Store the value in TARGET (specified as an rtx) if convenient.
|
||||
@ -2045,11 +2003,9 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
tree actparms = TREE_OPERAND (exp, 1);
|
||||
/* RTX for the function to be called. */
|
||||
rtx funexp;
|
||||
/* Sequence of insns to perform a tail recursive "call". */
|
||||
rtx tail_recursion_insns = NULL_RTX;
|
||||
/* Sequence of insns to perform a normal "call". */
|
||||
rtx normal_call_insns = NULL_RTX;
|
||||
/* Sequence of insns to perform a tail recursive "call". */
|
||||
/* Sequence of insns to perform a tail "call". */
|
||||
rtx tail_call_insns = NULL_RTX;
|
||||
/* Data type of the function. */
|
||||
tree funtype;
|
||||
@ -2059,9 +2015,7 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
tree fndecl = 0;
|
||||
/* The type of the function being called. */
|
||||
tree fntype;
|
||||
rtx insn;
|
||||
int try_tail_call = 1;
|
||||
int try_tail_recursion = 1;
|
||||
bool try_tail_call = CALL_EXPR_TAILCALL (exp);
|
||||
int pass;
|
||||
|
||||
/* Register in which non-BLKmode value will be returned,
|
||||
@ -2122,8 +2076,6 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
|
||||
/* Mask of ECF_ flags. */
|
||||
int flags = 0;
|
||||
/* Nonzero if this is a call to an inline function. */
|
||||
int is_integrable = 0;
|
||||
#ifdef REG_PARM_STACK_SPACE
|
||||
/* Define the boundary of the register parm stack space that needs to be
|
||||
saved, if any. */
|
||||
@ -2132,7 +2084,6 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
#endif
|
||||
|
||||
int initial_highest_arg_in_use = highest_outgoing_arg_in_use;
|
||||
rtx temp_target = 0;
|
||||
char *initial_stack_usage_map = stack_usage_map;
|
||||
|
||||
int old_stack_allocated;
|
||||
@ -2156,58 +2107,23 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
HOST_WIDE_INT preferred_stack_boundary;
|
||||
/* The alignment of the stack, in bytes. */
|
||||
HOST_WIDE_INT preferred_unit_stack_boundary;
|
||||
|
||||
/* The static chain value to use for this call. */
|
||||
rtx static_chain_value;
|
||||
/* See if this is "nothrow" function call. */
|
||||
if (TREE_NOTHROW (exp))
|
||||
flags |= ECF_NOTHROW;
|
||||
|
||||
/* See if we can find a DECL-node for the actual function.
|
||||
As a result, decide whether this is a call to an integrable function. */
|
||||
|
||||
/* See if we can find a DECL-node for the actual function, and get the
|
||||
function attributes (flags) from the function decl or type node. */
|
||||
fndecl = get_callee_fndecl (exp);
|
||||
if (fndecl)
|
||||
{
|
||||
fntype = TREE_TYPE (fndecl);
|
||||
if (!flag_no_inline
|
||||
&& fndecl != current_function_decl
|
||||
&& DECL_INLINE (fndecl)
|
||||
&& DECL_STRUCT_FUNCTION (fndecl)
|
||||
&& DECL_STRUCT_FUNCTION (fndecl)->inlinable)
|
||||
is_integrable = 1;
|
||||
else if (! TREE_ADDRESSABLE (fndecl))
|
||||
{
|
||||
/* In case this function later becomes inlinable,
|
||||
record that there was already a non-inline call to it.
|
||||
|
||||
Use abstraction instead of setting TREE_ADDRESSABLE
|
||||
directly. */
|
||||
if (DECL_INLINE (fndecl) && warn_inline && !flag_no_inline
|
||||
&& optimize > 0)
|
||||
{
|
||||
warning ("%Jcan't inline call to '%F'", fndecl, fndecl);
|
||||
warning ("called from here");
|
||||
}
|
||||
lang_hooks.mark_addressable (fndecl);
|
||||
}
|
||||
|
||||
if (ignore
|
||||
&& lookup_attribute ("warn_unused_result",
|
||||
TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
|
||||
warning ("ignoring return value of `%D', "
|
||||
"declared with attribute warn_unused_result", fndecl);
|
||||
|
||||
flags |= flags_from_decl_or_type (fndecl);
|
||||
}
|
||||
|
||||
/* If we don't have specific function to call, see if we have a
|
||||
attributes set in the type. */
|
||||
else
|
||||
{
|
||||
fntype = TREE_TYPE (TREE_TYPE (p));
|
||||
if (ignore
|
||||
&& lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (fntype)))
|
||||
warning ("ignoring return value of function "
|
||||
"declared with attribute warn_unused_result");
|
||||
flags |= flags_from_decl_or_type (fntype);
|
||||
}
|
||||
|
||||
@ -2264,15 +2180,6 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
#ifdef PCC_STATIC_STRUCT_RETURN
|
||||
{
|
||||
pcc_struct_value = 1;
|
||||
/* Easier than making that case work right. */
|
||||
if (is_integrable)
|
||||
{
|
||||
/* In case this is a static function, note that it has been
|
||||
used. */
|
||||
if (! TREE_ADDRESSABLE (fndecl))
|
||||
lang_hooks.mark_addressable (fndecl);
|
||||
is_integrable = 0;
|
||||
}
|
||||
}
|
||||
#else /* not PCC_STATIC_STRUCT_RETURN */
|
||||
{
|
||||
@ -2305,17 +2212,6 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
#endif /* not PCC_STATIC_STRUCT_RETURN */
|
||||
}
|
||||
|
||||
/* If called function is inline, try to integrate it. */
|
||||
|
||||
if (is_integrable)
|
||||
{
|
||||
rtx temp = try_to_integrate (fndecl, actparms, target,
|
||||
ignore, TREE_TYPE (exp),
|
||||
structure_value_addr);
|
||||
if (temp != (rtx) (size_t) - 1)
|
||||
return temp;
|
||||
}
|
||||
|
||||
/* Figure out the amount to which the stack should be aligned. */
|
||||
preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
|
||||
if (fndecl)
|
||||
@ -2341,10 +2237,6 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
else
|
||||
type_arg_types = TYPE_ARG_TYPES (funtype);
|
||||
|
||||
/* See if this is a call to a function that can return more than once
|
||||
or a call to longjmp or malloc. */
|
||||
flags |= special_function_p (fndecl, flags);
|
||||
|
||||
if (flags & ECF_MAY_BE_ALLOCA)
|
||||
current_function_calls_alloca = 1;
|
||||
|
||||
@ -2427,7 +2319,7 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
&args_so_far, reg_parm_stack_space,
|
||||
&old_stack_level, &old_pending_adj,
|
||||
&must_preallocate, &flags,
|
||||
CALL_FROM_THUNK_P (exp));
|
||||
&try_tail_call, CALL_FROM_THUNK_P (exp));
|
||||
|
||||
if (args_size.var)
|
||||
{
|
||||
@ -2476,14 +2368,9 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
|| !rtx_equal_function_value_matters
|
||||
|| current_nesting_level () == 0
|
||||
|| any_pending_cleanups ()
|
||||
|| args_size.var)
|
||||
try_tail_call = try_tail_recursion = 0;
|
||||
|
||||
/* Tail recursion fails, when we are not dealing with recursive calls. */
|
||||
if (!try_tail_recursion
|
||||
|| TREE_CODE (addr) != ADDR_EXPR
|
||||
|| TREE_OPERAND (addr, 0) != current_function_decl)
|
||||
try_tail_recursion = 0;
|
||||
|| args_size.var
|
||||
|| lookup_stmt_eh_region (exp) >= 0)
|
||||
try_tail_call = 0;
|
||||
|
||||
/* Rest of purposes for tail call optimizations to fail. */
|
||||
if (
|
||||
@ -2521,7 +2408,7 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
|| !lang_hooks.decls.ok_for_sibcall (fndecl))
|
||||
try_tail_call = 0;
|
||||
|
||||
if (try_tail_call || try_tail_recursion)
|
||||
if (try_tail_call)
|
||||
{
|
||||
int end, inc;
|
||||
actparms = NULL_TREE;
|
||||
@ -2556,11 +2443,6 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
for (; i != end; i += inc)
|
||||
{
|
||||
args[i].tree_value = fix_unsafe_tree (args[i].tree_value);
|
||||
/* We need to build actparms for optimize_tail_recursion. We can
|
||||
safely trash away TREE_PURPOSE, since it is unused by this
|
||||
function. */
|
||||
if (try_tail_recursion)
|
||||
actparms = tree_cons (NULL_TREE, args[i].tree_value, actparms);
|
||||
}
|
||||
/* Do the same for the function address if it is an expression. */
|
||||
if (!fndecl)
|
||||
@ -2568,50 +2450,9 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
/* Expanding one of those dangerous arguments could have added
|
||||
cleanups, but otherwise give it a whirl. */
|
||||
if (any_pending_cleanups ())
|
||||
try_tail_call = try_tail_recursion = 0;
|
||||
try_tail_call = 0;
|
||||
}
|
||||
|
||||
/* Generate a tail recursion sequence when calling ourselves. */
|
||||
|
||||
if (try_tail_recursion)
|
||||
{
|
||||
/* We want to emit any pending stack adjustments before the tail
|
||||
recursion "call". That way we know any adjustment after the tail
|
||||
recursion call can be ignored if we indeed use the tail recursion
|
||||
call expansion. */
|
||||
int save_pending_stack_adjust = pending_stack_adjust;
|
||||
int save_stack_pointer_delta = stack_pointer_delta;
|
||||
|
||||
/* Emit any queued insns now; otherwise they would end up in
|
||||
only one of the alternates. */
|
||||
emit_queue ();
|
||||
|
||||
/* Use a new sequence to hold any RTL we generate. We do not even
|
||||
know if we will use this RTL yet. The final decision can not be
|
||||
made until after RTL generation for the entire function is
|
||||
complete. */
|
||||
start_sequence ();
|
||||
/* If expanding any of the arguments creates cleanups, we can't
|
||||
do a tailcall. So, we'll need to pop the pending cleanups
|
||||
list. If, however, all goes well, and there are no cleanups
|
||||
then the call to expand_start_target_temps will have no
|
||||
effect. */
|
||||
expand_start_target_temps ();
|
||||
if (optimize_tail_recursion (actparms, get_last_insn ()))
|
||||
{
|
||||
if (any_pending_cleanups ())
|
||||
try_tail_call = try_tail_recursion = 0;
|
||||
else
|
||||
tail_recursion_insns = get_insns ();
|
||||
}
|
||||
expand_end_target_temps ();
|
||||
end_sequence ();
|
||||
|
||||
/* Restore the original pending stack adjustment for the sibling and
|
||||
normal call cases below. */
|
||||
pending_stack_adjust = save_pending_stack_adjust;
|
||||
stack_pointer_delta = save_stack_pointer_delta;
|
||||
}
|
||||
|
||||
/* Ensure current function's preferred stack boundary is at least
|
||||
what we need. We don't have to increase alignment for recursive
|
||||
@ -2634,7 +2475,7 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
int sibcall_failure = 0;
|
||||
/* We want to emit any pending stack adjustments before the tail
|
||||
recursion "call". That way we know any adjustment after the tail
|
||||
recursion call can be ignored if we indeed use the tail recursion
|
||||
recursion call can be ignored if we indeed use the tail
|
||||
call expansion. */
|
||||
int save_pending_stack_adjust = 0;
|
||||
int save_stack_pointer_delta = 0;
|
||||
@ -2966,6 +2807,12 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
once we have started filling any specific hard regs. */
|
||||
precompute_register_parameters (num_actuals, args, ®_parm_seen);
|
||||
|
||||
if (TREE_OPERAND (exp, 2))
|
||||
static_chain_value = expand_expr (TREE_OPERAND (exp, 2),
|
||||
NULL_RTX, VOIDmode, 0);
|
||||
else
|
||||
static_chain_value = 0;
|
||||
|
||||
#ifdef REG_PARM_STACK_SPACE
|
||||
/* Save the fixed argument area if it's part of the caller's frame and
|
||||
is clobbered by argument setup for this call. */
|
||||
@ -3056,8 +2903,8 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
use_reg (&call_fusage, struct_value);
|
||||
}
|
||||
|
||||
funexp = prepare_call_address (funexp, fndecl, &call_fusage,
|
||||
reg_parm_seen, pass == 0);
|
||||
funexp = prepare_call_address (funexp, static_chain_value,
|
||||
&call_fusage, reg_parm_seen, pass == 0);
|
||||
|
||||
load_register_parameters (args, num_actuals, &call_fusage, flags,
|
||||
pass == 0, &sibcall_failure);
|
||||
@ -3088,7 +2935,7 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
abort ();
|
||||
|
||||
/* Generate the actual call instruction. */
|
||||
emit_call_1 (funexp, fndecl, funtype, unadjusted_args_size,
|
||||
emit_call_1 (funexp, exp, fndecl, funtype, unadjusted_args_size,
|
||||
adjusted_args_size.constant, struct_value_size,
|
||||
next_arg_reg, valreg, old_inhibit_defer_pop, call_fusage,
|
||||
flags, & args_so_far);
|
||||
@ -3255,11 +3102,7 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
The Irix 6 ABI has examples of this. */
|
||||
else if (GET_CODE (valreg) == PARALLEL)
|
||||
{
|
||||
/* Second condition is added because "target" is freed at the
|
||||
the end of "pass0" for -O2 when call is made to
|
||||
expand_end_target_temps (). Its "in_use" flag has been set
|
||||
to false, so allocate a new temp. */
|
||||
if (target == 0 || (pass == 1 && target == temp_target))
|
||||
if (target == 0)
|
||||
{
|
||||
/* This will only be assigned once, so it can be readonly. */
|
||||
tree nt = build_qualified_type (TREE_TYPE (exp),
|
||||
@ -3267,7 +3110,6 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
| TYPE_QUAL_CONST));
|
||||
|
||||
target = assign_temp (nt, 0, 1, 1);
|
||||
temp_target = target;
|
||||
preserve_temp_slots (target);
|
||||
}
|
||||
|
||||
@ -3392,8 +3234,8 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
Check for the handler slots since we might not have a save area
|
||||
for non-local gotos. */
|
||||
|
||||
if ((flags & ECF_MAY_BE_ALLOCA) && nonlocal_goto_handler_slots != 0)
|
||||
emit_stack_save (SAVE_NONLOCAL, &nonlocal_goto_stack_level, NULL_RTX);
|
||||
if ((flags & ECF_MAY_BE_ALLOCA) && cfun->nonlocal_goto_save_area != 0)
|
||||
update_nonlocal_goto_save_area ();
|
||||
|
||||
/* Free up storage we no longer need. */
|
||||
for (i = 0; i < num_actuals; ++i)
|
||||
@ -3462,48 +3304,16 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
zero out the sequence. */
|
||||
if (sibcall_failure)
|
||||
tail_call_insns = NULL_RTX;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
/* The function optimize_sibling_and_tail_recursive_calls doesn't
|
||||
handle CALL_PLACEHOLDERs inside other CALL_PLACEHOLDERs. This
|
||||
can happen if the arguments to this function call an inline
|
||||
function who's expansion contains another CALL_PLACEHOLDER.
|
||||
|
||||
If there are any C_Ps in any of these sequences, replace them
|
||||
with their normal call. */
|
||||
|
||||
for (insn = normal_call_insns; insn; insn = NEXT_INSN (insn))
|
||||
if (GET_CODE (insn) == CALL_INSN
|
||||
&& GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER)
|
||||
replace_call_placeholder (insn, sibcall_use_normal);
|
||||
|
||||
for (insn = tail_call_insns; insn; insn = NEXT_INSN (insn))
|
||||
if (GET_CODE (insn) == CALL_INSN
|
||||
&& GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER)
|
||||
replace_call_placeholder (insn, sibcall_use_normal);
|
||||
|
||||
for (insn = tail_recursion_insns; insn; insn = NEXT_INSN (insn))
|
||||
if (GET_CODE (insn) == CALL_INSN
|
||||
&& GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER)
|
||||
replace_call_placeholder (insn, sibcall_use_normal);
|
||||
|
||||
/* If this was a potential tail recursion site, then emit a
|
||||
CALL_PLACEHOLDER with the normal and the tail recursion streams.
|
||||
One of them will be selected later. */
|
||||
if (tail_recursion_insns || tail_call_insns)
|
||||
/* If tail call production suceeded, we need to remove REG_EQUIV notes on
|
||||
arguments too, as argument area is now clobbered by the call. */
|
||||
if (tail_call_insns)
|
||||
{
|
||||
/* The tail recursion label must be kept around. We could expose
|
||||
its use in the CALL_PLACEHOLDER, but that creates unwanted edges
|
||||
and makes determining true tail recursion sites difficult.
|
||||
|
||||
So we set LABEL_PRESERVE_P here, then clear it when we select
|
||||
one of the call sequences after rtl generation is complete. */
|
||||
if (tail_recursion_insns)
|
||||
LABEL_PRESERVE_P (tail_recursion_label) = 1;
|
||||
emit_call_insn (gen_rtx_CALL_PLACEHOLDER (VOIDmode, normal_call_insns,
|
||||
tail_call_insns,
|
||||
tail_recursion_insns,
|
||||
tail_recursion_label));
|
||||
emit_insn (tail_call_insns);
|
||||
cfun->tail_call_emit = true;
|
||||
}
|
||||
else
|
||||
emit_insn (normal_call_insns);
|
||||
@ -3524,6 +3334,47 @@ expand_call (tree exp, rtx target, int ignore)
|
||||
return target;
|
||||
}
|
||||
|
||||
/* A sibling call sequence invalidates any REG_EQUIV notes made for
|
||||
this function's incoming arguments.
|
||||
|
||||
At the start of RTL generation we know the only REG_EQUIV notes
|
||||
in the rtl chain are those for incoming arguments, so we can safely
|
||||
flush any REG_EQUIV note.
|
||||
|
||||
This is (slight) overkill. We could keep track of the highest
|
||||
argument we clobber and be more selective in removing notes, but it
|
||||
does not seem to be worth the effort. */
|
||||
void
|
||||
fixup_tail_calls (void)
|
||||
{
|
||||
rtx insn;
|
||||
tree arg;
|
||||
|
||||
purge_reg_equiv_notes ();
|
||||
|
||||
/* A sibling call sequence also may invalidate RTX_UNCHANGING_P
|
||||
flag of some incoming arguments MEM RTLs, because it can write into
|
||||
those slots. We clear all those bits now.
|
||||
|
||||
This is (slight) overkill, we could keep track of which arguments
|
||||
we actually write into. */
|
||||
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
|
||||
{
|
||||
if (INSN_P (insn))
|
||||
purge_mem_unchanging_flag (PATTERN (insn));
|
||||
}
|
||||
|
||||
/* Similarly, invalidate RTX_UNCHANGING_P for any incoming
|
||||
arguments passed in registers. */
|
||||
for (arg = DECL_ARGUMENTS (current_function_decl);
|
||||
arg;
|
||||
arg = TREE_CHAIN (arg))
|
||||
{
|
||||
if (REG_P (DECL_RTL (arg)))
|
||||
RTX_UNCHANGING_P (DECL_RTL (arg)) = false;
|
||||
}
|
||||
}
|
||||
|
||||
/* Traverse an argument list in VALUES and expand all complex
|
||||
arguments into their components. */
|
||||
tree
|
||||
@ -4135,7 +3986,7 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
|
||||
else
|
||||
argnum = 0;
|
||||
|
||||
fun = prepare_call_address (fun, NULL_TREE, &call_fusage, 0, 0);
|
||||
fun = prepare_call_address (fun, NULL, &call_fusage, 0, 0);
|
||||
|
||||
/* Now load any reg parms into their regs. */
|
||||
|
||||
@ -4197,7 +4048,7 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
|
||||
always signed. We also assume that the list of arguments passed has
|
||||
no impact, so we pretend it is unknown. */
|
||||
|
||||
emit_call_1 (fun,
|
||||
emit_call_1 (fun, NULL,
|
||||
get_identifier (XSTR (orgfun, 0)),
|
||||
build_function_type (tfom, NULL_TREE),
|
||||
original_args_size.constant, args_size.constant,
|
||||
|
264
gcc/cfg.c
264
gcc/cfg.c
@ -62,20 +62,14 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
#include "tm_p.h"
|
||||
#include "obstack.h"
|
||||
#include "alloc-pool.h"
|
||||
#include "timevar.h"
|
||||
#include "ggc.h"
|
||||
|
||||
/* The obstack on which the flow graph components are allocated. */
|
||||
|
||||
struct obstack flow_obstack;
|
||||
static char *flow_firstobj;
|
||||
|
||||
/* Basic block object pool. */
|
||||
|
||||
static alloc_pool bb_pool;
|
||||
|
||||
/* Edge object pool. */
|
||||
|
||||
static alloc_pool edge_pool;
|
||||
|
||||
/* Number of basic blocks in the current function. */
|
||||
|
||||
int n_basic_blocks;
|
||||
@ -93,56 +87,10 @@ int n_edges;
|
||||
varray_type basic_block_info;
|
||||
|
||||
/* The special entry and exit blocks. */
|
||||
basic_block ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR;
|
||||
|
||||
struct basic_block_def entry_exit_blocks[2]
|
||||
= {{NULL, /* head */
|
||||
NULL, /* end */
|
||||
NULL, /* head_tree */
|
||||
NULL, /* end_tree */
|
||||
NULL, /* pred */
|
||||
NULL, /* succ */
|
||||
NULL, /* local_set */
|
||||
NULL, /* cond_local_set */
|
||||
NULL, /* global_live_at_start */
|
||||
NULL, /* global_live_at_end */
|
||||
NULL, /* aux */
|
||||
ENTRY_BLOCK, /* index */
|
||||
NULL, /* prev_bb */
|
||||
EXIT_BLOCK_PTR, /* next_bb */
|
||||
0, /* loop_depth */
|
||||
NULL, /* loop_father */
|
||||
{ NULL, NULL }, /* dom */
|
||||
0, /* count */
|
||||
0, /* frequency */
|
||||
0, /* flags */
|
||||
0, /* partition */
|
||||
NULL /* rbi */
|
||||
},
|
||||
{
|
||||
NULL, /* head */
|
||||
NULL, /* end */
|
||||
NULL, /* head_tree */
|
||||
NULL, /* end_tree */
|
||||
NULL, /* pred */
|
||||
NULL, /* succ */
|
||||
NULL, /* local_set */
|
||||
NULL, /* cond_local_set */
|
||||
NULL, /* global_live_at_start */
|
||||
NULL, /* global_live_at_end */
|
||||
NULL, /* aux */
|
||||
EXIT_BLOCK, /* index */
|
||||
ENTRY_BLOCK_PTR, /* prev_bb */
|
||||
NULL, /* next_bb */
|
||||
0, /* loop_depth */
|
||||
NULL, /* loop_father */
|
||||
{ NULL, NULL }, /* dom */
|
||||
0, /* count */
|
||||
0, /* frequency */
|
||||
0, /* flags */
|
||||
0, /* partition */
|
||||
NULL /* rbi */
|
||||
}
|
||||
};
|
||||
/* Memory alloc pool for bb member rbi. */
|
||||
alloc_pool rbi_pool;
|
||||
|
||||
void debug_flow_info (void);
|
||||
static void free_edge (edge);
|
||||
@ -164,25 +112,26 @@ init_flow (void)
|
||||
}
|
||||
else
|
||||
{
|
||||
free_alloc_pool (bb_pool);
|
||||
free_alloc_pool (edge_pool);
|
||||
obstack_free (&flow_obstack, flow_firstobj);
|
||||
flow_firstobj = obstack_alloc (&flow_obstack, 0);
|
||||
}
|
||||
bb_pool = create_alloc_pool ("Basic block pool",
|
||||
sizeof (struct basic_block_def), 100);
|
||||
edge_pool = create_alloc_pool ("Edge pool",
|
||||
sizeof (struct edge_def), 100);
|
||||
|
||||
ENTRY_BLOCK_PTR = ggc_alloc_cleared (sizeof (*ENTRY_BLOCK_PTR));
|
||||
ENTRY_BLOCK_PTR->index = ENTRY_BLOCK;
|
||||
EXIT_BLOCK_PTR = ggc_alloc_cleared (sizeof (*EXIT_BLOCK_PTR));
|
||||
EXIT_BLOCK_PTR->index = EXIT_BLOCK;
|
||||
ENTRY_BLOCK_PTR->next_bb = EXIT_BLOCK_PTR;
|
||||
EXIT_BLOCK_PTR->prev_bb = ENTRY_BLOCK_PTR;
|
||||
}
|
||||
|
||||
/* Helper function for remove_edge and clear_edges. Frees edge structure
|
||||
without actually unlinking it from the pred/succ lists. */
|
||||
|
||||
static void
|
||||
free_edge (edge e)
|
||||
free_edge (edge e ATTRIBUTE_UNUSED)
|
||||
{
|
||||
n_edges--;
|
||||
pool_free (edge_pool, e);
|
||||
/* ggc_free (e); */
|
||||
}
|
||||
|
||||
/* Free the memory associated with the edge structures. */
|
||||
@ -231,11 +180,40 @@ basic_block
|
||||
alloc_block (void)
|
||||
{
|
||||
basic_block bb;
|
||||
bb = pool_alloc (bb_pool);
|
||||
memset (bb, 0, sizeof (*bb));
|
||||
bb = ggc_alloc_cleared (sizeof (*bb));
|
||||
return bb;
|
||||
}
|
||||
|
||||
/* Create memory pool for rbi_pool. */
|
||||
|
||||
void
|
||||
alloc_rbi_pool (void)
|
||||
{
|
||||
rbi_pool = create_alloc_pool ("rbi pool",
|
||||
sizeof (struct reorder_block_def),
|
||||
n_basic_blocks + 2);
|
||||
}
|
||||
|
||||
/* Free rbi_pool. */
|
||||
|
||||
void
|
||||
free_rbi_pool (void)
|
||||
{
|
||||
free_alloc_pool (rbi_pool);
|
||||
}
|
||||
|
||||
/* Initialize rbi (the structure containing data used by basic block
|
||||
duplication and reordering) for the given basic block. */
|
||||
|
||||
void
|
||||
initialize_bb_rbi (basic_block bb)
|
||||
{
|
||||
if (bb->rbi)
|
||||
abort ();
|
||||
bb->rbi = pool_alloc (rbi_pool);
|
||||
memset (bb->rbi, 0, sizeof (struct reorder_block_def));
|
||||
}
|
||||
|
||||
/* Link block B to chain after AFTER. */
|
||||
void
|
||||
link_block (basic_block b, basic_block after)
|
||||
@ -252,6 +230,8 @@ unlink_block (basic_block b)
|
||||
{
|
||||
b->next_bb->prev_bb = b->prev_bb;
|
||||
b->prev_bb->next_bb = b->next_bb;
|
||||
b->prev_bb = NULL;
|
||||
b->next_bb = NULL;
|
||||
}
|
||||
|
||||
/* Sequentially order blocks and compact the arrays. */
|
||||
@ -272,6 +252,9 @@ compact_blocks (void)
|
||||
if (i != n_basic_blocks)
|
||||
abort ();
|
||||
|
||||
for (; i < last_basic_block; i++)
|
||||
BASIC_BLOCK (i) = NULL;
|
||||
|
||||
last_basic_block = n_basic_blocks;
|
||||
}
|
||||
|
||||
@ -283,7 +266,7 @@ expunge_block (basic_block b)
|
||||
unlink_block (b);
|
||||
BASIC_BLOCK (b->index) = NULL;
|
||||
n_basic_blocks--;
|
||||
pool_free (bb_pool, b);
|
||||
/* ggc_free (b); */
|
||||
}
|
||||
|
||||
/* Create an edge connecting SRC and DEST with flags FLAGS. Return newly
|
||||
@ -294,8 +277,7 @@ edge
|
||||
unchecked_make_edge (basic_block src, basic_block dst, int flags)
|
||||
{
|
||||
edge e;
|
||||
e = pool_alloc (edge_pool);
|
||||
memset (e, 0, sizeof (*e));
|
||||
e = ggc_alloc_cleared (sizeof (*e));
|
||||
n_edges++;
|
||||
|
||||
e->succ_next = src->succ;
|
||||
@ -490,54 +472,56 @@ void
|
||||
dump_flow_info (FILE *file)
|
||||
{
|
||||
int i;
|
||||
int max_regno = max_reg_num ();
|
||||
basic_block bb;
|
||||
static const char * const reg_class_names[] = REG_CLASS_NAMES;
|
||||
|
||||
fprintf (file, "%d registers.\n", max_regno);
|
||||
if (reg_n_info)
|
||||
for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
|
||||
if (REG_N_REFS (i))
|
||||
{
|
||||
enum reg_class class, altclass;
|
||||
{
|
||||
int max_regno = max_reg_num ();
|
||||
fprintf (file, "%d registers.\n", max_regno);
|
||||
for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
|
||||
if (REG_N_REFS (i))
|
||||
{
|
||||
enum reg_class class, altclass;
|
||||
|
||||
fprintf (file, "\nRegister %d used %d times across %d insns",
|
||||
i, REG_N_REFS (i), REG_LIVE_LENGTH (i));
|
||||
if (REG_BASIC_BLOCK (i) >= 0)
|
||||
fprintf (file, " in block %d", REG_BASIC_BLOCK (i));
|
||||
if (REG_N_SETS (i))
|
||||
fprintf (file, "; set %d time%s", REG_N_SETS (i),
|
||||
(REG_N_SETS (i) == 1) ? "" : "s");
|
||||
if (regno_reg_rtx[i] != NULL && REG_USERVAR_P (regno_reg_rtx[i]))
|
||||
fprintf (file, "; user var");
|
||||
if (REG_N_DEATHS (i) != 1)
|
||||
fprintf (file, "; dies in %d places", REG_N_DEATHS (i));
|
||||
if (REG_N_CALLS_CROSSED (i) == 1)
|
||||
fprintf (file, "; crosses 1 call");
|
||||
else if (REG_N_CALLS_CROSSED (i))
|
||||
fprintf (file, "; crosses %d calls", REG_N_CALLS_CROSSED (i));
|
||||
if (regno_reg_rtx[i] != NULL
|
||||
&& PSEUDO_REGNO_BYTES (i) != UNITS_PER_WORD)
|
||||
fprintf (file, "; %d bytes", PSEUDO_REGNO_BYTES (i));
|
||||
fprintf (file, "\nRegister %d used %d times across %d insns",
|
||||
i, REG_N_REFS (i), REG_LIVE_LENGTH (i));
|
||||
if (REG_BASIC_BLOCK (i) >= 0)
|
||||
fprintf (file, " in block %d", REG_BASIC_BLOCK (i));
|
||||
if (REG_N_SETS (i))
|
||||
fprintf (file, "; set %d time%s", REG_N_SETS (i),
|
||||
(REG_N_SETS (i) == 1) ? "" : "s");
|
||||
if (regno_reg_rtx[i] != NULL && REG_USERVAR_P (regno_reg_rtx[i]))
|
||||
fprintf (file, "; user var");
|
||||
if (REG_N_DEATHS (i) != 1)
|
||||
fprintf (file, "; dies in %d places", REG_N_DEATHS (i));
|
||||
if (REG_N_CALLS_CROSSED (i) == 1)
|
||||
fprintf (file, "; crosses 1 call");
|
||||
else if (REG_N_CALLS_CROSSED (i))
|
||||
fprintf (file, "; crosses %d calls", REG_N_CALLS_CROSSED (i));
|
||||
if (regno_reg_rtx[i] != NULL
|
||||
&& PSEUDO_REGNO_BYTES (i) != UNITS_PER_WORD)
|
||||
fprintf (file, "; %d bytes", PSEUDO_REGNO_BYTES (i));
|
||||
|
||||
class = reg_preferred_class (i);
|
||||
altclass = reg_alternate_class (i);
|
||||
if (class != GENERAL_REGS || altclass != ALL_REGS)
|
||||
{
|
||||
if (altclass == ALL_REGS || class == ALL_REGS)
|
||||
fprintf (file, "; pref %s", reg_class_names[(int) class]);
|
||||
else if (altclass == NO_REGS)
|
||||
fprintf (file, "; %s or none", reg_class_names[(int) class]);
|
||||
else
|
||||
fprintf (file, "; pref %s, else %s",
|
||||
reg_class_names[(int) class],
|
||||
reg_class_names[(int) altclass]);
|
||||
}
|
||||
class = reg_preferred_class (i);
|
||||
altclass = reg_alternate_class (i);
|
||||
if (class != GENERAL_REGS || altclass != ALL_REGS)
|
||||
{
|
||||
if (altclass == ALL_REGS || class == ALL_REGS)
|
||||
fprintf (file, "; pref %s", reg_class_names[(int) class]);
|
||||
else if (altclass == NO_REGS)
|
||||
fprintf (file, "; %s or none", reg_class_names[(int) class]);
|
||||
else
|
||||
fprintf (file, "; pref %s, else %s",
|
||||
reg_class_names[(int) class],
|
||||
reg_class_names[(int) altclass]);
|
||||
}
|
||||
|
||||
if (regno_reg_rtx[i] != NULL && REG_POINTER (regno_reg_rtx[i]))
|
||||
fprintf (file, "; pointer");
|
||||
fprintf (file, ".\n");
|
||||
}
|
||||
if (regno_reg_rtx[i] != NULL && REG_POINTER (regno_reg_rtx[i]))
|
||||
fprintf (file, "; pointer");
|
||||
fprintf (file, ".\n");
|
||||
}
|
||||
}
|
||||
|
||||
fprintf (file, "\n%d basic blocks, %d edges.\n", n_basic_blocks, n_edges);
|
||||
FOR_EACH_BB (bb)
|
||||
@ -546,8 +530,7 @@ dump_flow_info (FILE *file)
|
||||
int sum;
|
||||
gcov_type lsum;
|
||||
|
||||
fprintf (file, "\nBasic block %d: first insn %d, last %d, ",
|
||||
bb->index, INSN_UID (BB_HEAD (bb)), INSN_UID (BB_END (bb)));
|
||||
fprintf (file, "\nBasic block %d ", bb->index);
|
||||
fprintf (file, "prev %d, next %d, ",
|
||||
bb->prev_bb->index, bb->next_bb->index);
|
||||
fprintf (file, "loop_depth %d, count ", bb->loop_depth);
|
||||
@ -641,7 +624,8 @@ dump_edge_info (FILE *file, edge e, int do_succ)
|
||||
{
|
||||
static const char * const bitnames[] = {
|
||||
"fallthru", "ab", "abcall", "eh", "fake", "dfs_back",
|
||||
"can_fallthru", "irreducible", "sibcall", "loop_exit"
|
||||
"can_fallthru", "irreducible", "sibcall", "loop_exit",
|
||||
"true", "false", "exec"
|
||||
};
|
||||
int comma = 0;
|
||||
int i, flags = e->flags;
|
||||
@ -825,3 +809,55 @@ debug_bb_n (int n)
|
||||
dump_bb (bb, stderr, 0);
|
||||
return bb;
|
||||
}
|
||||
|
||||
/* Dumps cfg related information about basic block BB to FILE. */
|
||||
|
||||
static void
|
||||
dump_cfg_bb_info (FILE *file, basic_block bb)
|
||||
{
|
||||
unsigned i;
|
||||
bool first = true;
|
||||
static const char * const bb_bitnames[] =
|
||||
{
|
||||
"dirty", "new", "reachable", "visited", "irreducible_loop", "superblock"
|
||||
};
|
||||
const unsigned n_bitnames = sizeof (bb_bitnames) / sizeof (char *);
|
||||
edge e;
|
||||
|
||||
fprintf (file, "Basic block %d", bb->index);
|
||||
for (i = 0; i < n_bitnames; i++)
|
||||
if (bb->flags & (1 << i))
|
||||
{
|
||||
if (first)
|
||||
fprintf (file, " (");
|
||||
else
|
||||
fprintf (file, ", ");
|
||||
first = false;
|
||||
fprintf (file, bb_bitnames[i]);
|
||||
}
|
||||
if (!first)
|
||||
fprintf (file, ")");
|
||||
fprintf (file, "\n");
|
||||
|
||||
fprintf (file, "Predecessors: ");
|
||||
for (e = bb->pred; e; e = e->pred_next)
|
||||
dump_edge_info (file, e, 0);
|
||||
|
||||
fprintf (file, "\nSuccessors: ");
|
||||
for (e = bb->succ; e; e = e->succ_next)
|
||||
dump_edge_info (file, e, 1);
|
||||
fprintf (file, "\n\n");
|
||||
}
|
||||
|
||||
/* Dumps a brief description of cfg to FILE. */
|
||||
|
||||
void
|
||||
brief_dump_cfg (FILE *file)
|
||||
{
|
||||
basic_block bb;
|
||||
|
||||
FOR_EACH_BB (bb)
|
||||
{
|
||||
dump_cfg_bb_info (file, bb);
|
||||
}
|
||||
}
|
||||
|
179
gcc/cfganal.c
179
gcc/cfganal.c
@ -52,7 +52,6 @@ static void flow_dfs_compute_reverse_add_bb (depth_first_search_ds,
|
||||
static basic_block flow_dfs_compute_reverse_execute (depth_first_search_ds);
|
||||
static void flow_dfs_compute_reverse_finish (depth_first_search_ds);
|
||||
static void remove_fake_successors (basic_block);
|
||||
static bool need_fake_edge_p (rtx);
|
||||
static bool flow_active_insn_p (rtx);
|
||||
|
||||
/* Like active_insn_p, except keep the return value clobber around
|
||||
@ -242,169 +241,6 @@ set_edge_can_fallthru_flag (void)
|
||||
}
|
||||
}
|
||||
|
||||
/* Return true if we need to add fake edge to exit.
|
||||
Helper function for the flow_call_edges_add. */
|
||||
|
||||
static bool
|
||||
need_fake_edge_p (rtx insn)
|
||||
{
|
||||
if (!INSN_P (insn))
|
||||
return false;
|
||||
|
||||
if ((GET_CODE (insn) == CALL_INSN
|
||||
&& !SIBLING_CALL_P (insn)
|
||||
&& !find_reg_note (insn, REG_NORETURN, NULL)
|
||||
&& !find_reg_note (insn, REG_ALWAYS_RETURN, NULL)
|
||||
&& !CONST_OR_PURE_CALL_P (insn)))
|
||||
return true;
|
||||
|
||||
return ((GET_CODE (PATTERN (insn)) == ASM_OPERANDS
|
||||
&& MEM_VOLATILE_P (PATTERN (insn)))
|
||||
|| (GET_CODE (PATTERN (insn)) == PARALLEL
|
||||
&& asm_noperands (insn) != -1
|
||||
&& MEM_VOLATILE_P (XVECEXP (PATTERN (insn), 0, 0)))
|
||||
|| GET_CODE (PATTERN (insn)) == ASM_INPUT);
|
||||
}
|
||||
|
||||
/* Add fake edges to the function exit for any non constant and non noreturn
|
||||
calls, volatile inline assembly in the bitmap of blocks specified by
|
||||
BLOCKS or to the whole CFG if BLOCKS is zero. Return the number of blocks
|
||||
that were split.
|
||||
|
||||
The goal is to expose cases in which entering a basic block does not imply
|
||||
that all subsequent instructions must be executed. */
|
||||
|
||||
int
|
||||
flow_call_edges_add (sbitmap blocks)
|
||||
{
|
||||
int i;
|
||||
int blocks_split = 0;
|
||||
int last_bb = last_basic_block;
|
||||
bool check_last_block = false;
|
||||
|
||||
if (n_basic_blocks == 0)
|
||||
return 0;
|
||||
|
||||
if (! blocks)
|
||||
check_last_block = true;
|
||||
else
|
||||
check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
|
||||
|
||||
/* In the last basic block, before epilogue generation, there will be
|
||||
a fallthru edge to EXIT. Special care is required if the last insn
|
||||
of the last basic block is a call because make_edge folds duplicate
|
||||
edges, which would result in the fallthru edge also being marked
|
||||
fake, which would result in the fallthru edge being removed by
|
||||
remove_fake_edges, which would result in an invalid CFG.
|
||||
|
||||
Moreover, we can't elide the outgoing fake edge, since the block
|
||||
profiler needs to take this into account in order to solve the minimal
|
||||
spanning tree in the case that the call doesn't return.
|
||||
|
||||
Handle this by adding a dummy instruction in a new last basic block. */
|
||||
if (check_last_block)
|
||||
{
|
||||
basic_block bb = EXIT_BLOCK_PTR->prev_bb;
|
||||
rtx insn = BB_END (bb);
|
||||
|
||||
/* Back up past insns that must be kept in the same block as a call. */
|
||||
while (insn != BB_HEAD (bb)
|
||||
&& keep_with_call_p (insn))
|
||||
insn = PREV_INSN (insn);
|
||||
|
||||
if (need_fake_edge_p (insn))
|
||||
{
|
||||
edge e;
|
||||
|
||||
for (e = bb->succ; e; e = e->succ_next)
|
||||
if (e->dest == EXIT_BLOCK_PTR)
|
||||
{
|
||||
insert_insn_on_edge (gen_rtx_USE (VOIDmode, const0_rtx), e);
|
||||
commit_edge_insertions ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Now add fake edges to the function exit for any non constant
|
||||
calls since there is no way that we can determine if they will
|
||||
return or not... */
|
||||
|
||||
for (i = 0; i < last_bb; i++)
|
||||
{
|
||||
basic_block bb = BASIC_BLOCK (i);
|
||||
rtx libcall_end = NULL_RTX;
|
||||
rtx insn;
|
||||
rtx prev_insn;
|
||||
|
||||
if (!bb)
|
||||
continue;
|
||||
|
||||
if (blocks && !TEST_BIT (blocks, i))
|
||||
continue;
|
||||
|
||||
for (insn = BB_END (bb); ; insn = prev_insn)
|
||||
{
|
||||
prev_insn = PREV_INSN (insn);
|
||||
if (need_fake_edge_p (insn))
|
||||
{
|
||||
edge e;
|
||||
rtx split_at_insn = insn;
|
||||
|
||||
/* Don't split libcalls. */
|
||||
if (libcall_end)
|
||||
split_at_insn = libcall_end;
|
||||
|
||||
/* Don't split the block between a call and an insn that should
|
||||
remain in the same block as the call. */
|
||||
else if (GET_CODE (insn) == CALL_INSN)
|
||||
while (split_at_insn != BB_END (bb)
|
||||
&& keep_with_call_p (NEXT_INSN (split_at_insn)))
|
||||
split_at_insn = NEXT_INSN (split_at_insn);
|
||||
|
||||
/* The handling above of the final block before the epilogue
|
||||
should be enough to verify that there is no edge to the exit
|
||||
block in CFG already. Calling make_edge in such case would
|
||||
cause us to mark that edge as fake and remove it later. */
|
||||
|
||||
#ifdef ENABLE_CHECKING
|
||||
if (split_at_insn == BB_END (bb))
|
||||
for (e = bb->succ; e; e = e->succ_next)
|
||||
if (e->dest == EXIT_BLOCK_PTR)
|
||||
abort ();
|
||||
#endif
|
||||
|
||||
/* Note that the following may create a new basic block
|
||||
and renumber the existing basic blocks. */
|
||||
if (split_at_insn != BB_END (bb))
|
||||
{
|
||||
e = split_block (bb, split_at_insn);
|
||||
if (e)
|
||||
blocks_split++;
|
||||
}
|
||||
|
||||
make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
|
||||
}
|
||||
|
||||
/* Watch out for REG_LIBCALL/REG_RETVAL notes so that we know
|
||||
whether we are currently in a libcall or not. Remember that
|
||||
we are scanning backwards! */
|
||||
if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
|
||||
libcall_end = insn;
|
||||
if (find_reg_note (insn, REG_LIBCALL, NULL_RTX))
|
||||
libcall_end = NULL_RTX;
|
||||
|
||||
if (insn == BB_HEAD (bb))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (blocks_split)
|
||||
verify_flow_info ();
|
||||
|
||||
return blocks_split;
|
||||
}
|
||||
|
||||
/* Find unreachable blocks. An unreachable block will have 0 in
|
||||
the reachable bit in block->flags. A nonzero value indicates the
|
||||
block is reachable. */
|
||||
@ -603,6 +439,21 @@ verify_edge_list (FILE *f, struct edge_list *elist)
|
||||
}
|
||||
}
|
||||
|
||||
/* Given PRED and SUCC blocks, return the edge which connects the blocks.
|
||||
If no such edge exists, return NULL. */
|
||||
|
||||
edge
|
||||
find_edge (basic_block pred, basic_block succ)
|
||||
{
|
||||
edge e;
|
||||
|
||||
for (e = pred->succ; e; e = e->succ_next)
|
||||
if (e->dest == succ)
|
||||
return e;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* This routine will determine what, if any, edge there is between
|
||||
a specified predecessor and successor. */
|
||||
|
||||
|
@ -240,7 +240,7 @@ make_label_edge (sbitmap *edge_cache, basic_block src, rtx label, int flags)
|
||||
/* Create the edges generated by INSN in REGION. */
|
||||
|
||||
void
|
||||
make_eh_edge (sbitmap *edge_cache, basic_block src, rtx insn)
|
||||
rtl_make_eh_edge (sbitmap *edge_cache, basic_block src, rtx insn)
|
||||
{
|
||||
int is_call = GET_CODE (insn) == CALL_INSN ? EDGE_ABNORMAL_CALL : 0;
|
||||
rtx handlers, i;
|
||||
@ -325,7 +325,7 @@ make_edges (rtx label_value_list, basic_block min, basic_block max, int update_p
|
||||
|
||||
/* Recognize exception handling placeholders. */
|
||||
if (GET_CODE (PATTERN (insn)) == RESX)
|
||||
make_eh_edge (edge_cache, bb, insn);
|
||||
rtl_make_eh_edge (edge_cache, bb, insn);
|
||||
|
||||
/* Recognize a non-local goto as a branch outside the
|
||||
current function. */
|
||||
@ -405,7 +405,7 @@ make_edges (rtx label_value_list, basic_block min, basic_block max, int update_p
|
||||
else if (code == CALL_INSN || flag_non_call_exceptions)
|
||||
{
|
||||
/* Add any appropriate EH edges. */
|
||||
make_eh_edge (edge_cache, bb, insn);
|
||||
rtl_make_eh_edge (edge_cache, bb, insn);
|
||||
|
||||
if (code == CALL_INSN && nonlocal_goto_handler_labels)
|
||||
{
|
||||
@ -610,7 +610,7 @@ find_basic_blocks (rtx f, int nregs ATTRIBUTE_UNUSED,
|
||||
FOR_EACH_BB (bb)
|
||||
bb->aux = NULL;
|
||||
|
||||
VARRAY_FREE (basic_block_info);
|
||||
basic_block_info = NULL;
|
||||
}
|
||||
|
||||
n_basic_blocks = count_basic_blocks (f);
|
||||
|
@ -1368,7 +1368,7 @@ outgoing_edges_match (int mode, basic_block bb1, basic_block bb2)
|
||||
/* The labels should never be the same rtx. If they really are same
|
||||
the jump tables are same too. So disable crossjumping of blocks BB1
|
||||
and BB2 because when deleting the common insns in the end of BB1
|
||||
by delete_block () the jump table would be deleted too. */
|
||||
by delete_basic_block () the jump table would be deleted too. */
|
||||
/* If LABEL2 is referenced in BB1->END do not do anything
|
||||
because we would loose information when replacing
|
||||
LABEL1 by LABEL2 and then LABEL2 by LABEL1 in BB1->END. */
|
||||
@ -1501,6 +1501,8 @@ try_crossjump_to_edge (int mode, edge e1, edge e2)
|
||||
rtx newpos1, newpos2;
|
||||
edge s;
|
||||
|
||||
newpos1 = newpos2 = NULL_RTX;
|
||||
|
||||
/* If we have partitioned hot/cold basic blocks, it is a bad idea
|
||||
to try this optimization. */
|
||||
|
||||
@ -2033,6 +2035,32 @@ delete_unreachable_blocks (void)
|
||||
tidy_fallthru_edges ();
|
||||
return changed;
|
||||
}
|
||||
|
||||
/* Merges sequential blocks if possible. */
|
||||
|
||||
bool
|
||||
merge_seq_blocks (void)
|
||||
{
|
||||
basic_block bb;
|
||||
bool changed = false;
|
||||
|
||||
for (bb = ENTRY_BLOCK_PTR->next_bb; bb != EXIT_BLOCK_PTR; )
|
||||
{
|
||||
if (bb->succ
|
||||
&& !bb->succ->succ_next
|
||||
&& can_merge_blocks_p (bb, bb->succ->dest))
|
||||
{
|
||||
/* Merge the blocks and retry. */
|
||||
merge_blocks (bb, bb->succ->dest);
|
||||
changed = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
bb = bb->next_bb;
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
/* Tidy the CFG by deleting unreachable code and whatnot. */
|
||||
|
||||
|
183
gcc/cfghooks.c
183
gcc/cfghooks.c
@ -26,6 +26,7 @@ Boston, MA 02111-1307, USA. */
|
||||
#include "tree.h"
|
||||
#include "rtl.h"
|
||||
#include "basic-block.h"
|
||||
#include "tree-flow.h"
|
||||
#include "timevar.h"
|
||||
#include "toplev.h"
|
||||
|
||||
@ -46,6 +47,22 @@ cfg_layout_rtl_register_cfg_hooks (void)
|
||||
cfg_hooks = &cfg_layout_rtl_cfg_hooks;
|
||||
}
|
||||
|
||||
/* Initialization of functions specific to the tree IR. */
|
||||
|
||||
void
|
||||
tree_register_cfg_hooks (void)
|
||||
{
|
||||
cfg_hooks = &tree_cfg_hooks;
|
||||
}
|
||||
|
||||
/* Returns current ir type (rtl = 0, trees = 1). */
|
||||
|
||||
int
|
||||
ir_type (void)
|
||||
{
|
||||
return cfg_hooks == &tree_cfg_hooks ? 1 : 0;
|
||||
}
|
||||
|
||||
/* Verify the CFG consistency.
|
||||
|
||||
Currently it does following: checks edge and basic block list correctness
|
||||
@ -246,10 +263,10 @@ dump_bb (basic_block bb, FILE *outf, int indent)
|
||||
be equivalent to E in the case of duplicate edges being removed) or NULL
|
||||
if edge is not easily redirectable for whatever reason. */
|
||||
|
||||
bool
|
||||
edge
|
||||
redirect_edge_and_branch (edge e, basic_block dest)
|
||||
{
|
||||
bool ret;
|
||||
edge ret;
|
||||
|
||||
if (!cfg_hooks->redirect_edge_and_branch)
|
||||
internal_error ("%s does not support redirect_edge_and_branch.",
|
||||
@ -286,7 +303,6 @@ edge
|
||||
split_block (basic_block bb, void *i)
|
||||
{
|
||||
basic_block new_bb;
|
||||
edge e;
|
||||
|
||||
if (!cfg_hooks->split_block)
|
||||
internal_error ("%s does not support split_block.", cfg_hooks->name);
|
||||
@ -305,11 +321,7 @@ split_block (basic_block bb, void *i)
|
||||
set_immediate_dominator (CDI_DOMINATORS, new_bb, bb);
|
||||
}
|
||||
|
||||
e = make_edge (bb, new_bb, EDGE_FALLTHRU);
|
||||
e->probability = REG_BR_PROB_BASE;
|
||||
e->count = bb->count;
|
||||
|
||||
return e;
|
||||
return make_edge (bb, new_bb, EDGE_FALLTHRU);
|
||||
}
|
||||
|
||||
/* Splits block BB just after labels. The newly created edge is returned. */
|
||||
@ -464,6 +476,24 @@ can_merge_blocks_p (basic_block bb1, basic_block bb2)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
predict_edge (edge e, enum br_predictor predictor, int probability)
|
||||
{
|
||||
if (!cfg_hooks->predict_edge)
|
||||
internal_error ("%s does not support predict_edge.", cfg_hooks->name);
|
||||
|
||||
cfg_hooks->predict_edge (e, predictor, probability);
|
||||
}
|
||||
|
||||
bool
|
||||
predicted_by_p (basic_block bb, enum br_predictor predictor)
|
||||
{
|
||||
if (!cfg_hooks->predict_edge)
|
||||
internal_error ("%s does not support predicted_by_p.", cfg_hooks->name);
|
||||
|
||||
return cfg_hooks->predicted_by_p (bb, predictor);
|
||||
}
|
||||
|
||||
/* Merges basic block B into basic block A. */
|
||||
|
||||
void
|
||||
@ -605,3 +635,140 @@ tidy_fallthru_edges (void)
|
||||
tidy_fallthru_edge (s);
|
||||
}
|
||||
}
|
||||
|
||||
/* Returns true if we can duplicate basic block BB. */
|
||||
|
||||
bool
|
||||
can_duplicate_block_p (basic_block bb)
|
||||
{
|
||||
edge e;
|
||||
|
||||
if (!cfg_hooks->can_duplicate_block_p)
|
||||
internal_error ("%s does not support can_duplicate_block_p.",
|
||||
cfg_hooks->name);
|
||||
|
||||
if (bb == EXIT_BLOCK_PTR || bb == ENTRY_BLOCK_PTR)
|
||||
return false;
|
||||
|
||||
/* Duplicating fallthru block to exit would require adding a jump
|
||||
and splitting the real last BB. */
|
||||
for (e = bb->succ; e; e = e->succ_next)
|
||||
if (e->dest == EXIT_BLOCK_PTR && e->flags & EDGE_FALLTHRU)
|
||||
return false;
|
||||
|
||||
return cfg_hooks->can_duplicate_block_p (bb);
|
||||
}
|
||||
|
||||
/* Duplicates basic block BB and redirects edge E to it. Returns the
|
||||
new basic block. */
|
||||
|
||||
basic_block
|
||||
duplicate_block (basic_block bb, edge e)
|
||||
{
|
||||
edge s, n;
|
||||
basic_block new_bb;
|
||||
gcov_type new_count = e ? e->count : 0;
|
||||
|
||||
if (!cfg_hooks->duplicate_block)
|
||||
internal_error ("%s does not support duplicate_block.",
|
||||
cfg_hooks->name);
|
||||
|
||||
if (bb->count < new_count)
|
||||
new_count = bb->count;
|
||||
if (!bb->pred)
|
||||
abort ();
|
||||
#ifdef ENABLE_CHECKING
|
||||
if (!can_duplicate_block_p (bb))
|
||||
abort ();
|
||||
#endif
|
||||
|
||||
new_bb = cfg_hooks->duplicate_block (bb);
|
||||
|
||||
new_bb->loop_depth = bb->loop_depth;
|
||||
new_bb->flags = bb->flags;
|
||||
for (s = bb->succ; s; s = s->succ_next)
|
||||
{
|
||||
/* Since we are creating edges from a new block to successors
|
||||
of another block (which therefore are known to be disjoint), there
|
||||
is no need to actually check for duplicated edges. */
|
||||
n = unchecked_make_edge (new_bb, s->dest, s->flags);
|
||||
n->probability = s->probability;
|
||||
if (e && bb->count)
|
||||
{
|
||||
/* Take care for overflows! */
|
||||
n->count = s->count * (new_count * 10000 / bb->count) / 10000;
|
||||
s->count -= n->count;
|
||||
}
|
||||
else
|
||||
n->count = s->count;
|
||||
n->aux = s->aux;
|
||||
}
|
||||
|
||||
if (e)
|
||||
{
|
||||
new_bb->count = new_count;
|
||||
bb->count -= new_count;
|
||||
|
||||
new_bb->frequency = EDGE_FREQUENCY (e);
|
||||
bb->frequency -= EDGE_FREQUENCY (e);
|
||||
|
||||
redirect_edge_and_branch_force (e, new_bb);
|
||||
|
||||
if (bb->count < 0)
|
||||
bb->count = 0;
|
||||
if (bb->frequency < 0)
|
||||
bb->frequency = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_bb->count = bb->count;
|
||||
new_bb->frequency = bb->frequency;
|
||||
}
|
||||
|
||||
new_bb->rbi->original = bb;
|
||||
bb->rbi->copy = new_bb;
|
||||
|
||||
return new_bb;
|
||||
}
|
||||
|
||||
/* Return 1 if BB ends with a call, possibly followed by some
|
||||
instructions that must stay with the call, 0 otherwise. */
|
||||
|
||||
bool
|
||||
block_ends_with_call_p (basic_block bb)
|
||||
{
|
||||
if (!cfg_hooks->block_ends_with_call_p)
|
||||
internal_error ("%s does not support block_ends_with_call_p", cfg_hooks->name);
|
||||
|
||||
return (cfg_hooks->block_ends_with_call_p) (bb);
|
||||
}
|
||||
|
||||
/* Return 1 if BB ends with a conditional branch, 0 otherwise. */
|
||||
|
||||
bool
|
||||
block_ends_with_condjump_p (basic_block bb)
|
||||
{
|
||||
if (!cfg_hooks->block_ends_with_condjump_p)
|
||||
internal_error ("%s does not support block_ends_with_condjump_p",
|
||||
cfg_hooks->name);
|
||||
|
||||
return (cfg_hooks->block_ends_with_condjump_p) (bb);
|
||||
}
|
||||
|
||||
/* Add fake edges to the function exit for any non constant and non noreturn
|
||||
calls, volatile inline assembly in the bitmap of blocks specified by
|
||||
BLOCKS or to the whole CFG if BLOCKS is zero. Return the number of blocks
|
||||
that were split.
|
||||
|
||||
The goal is to expose cases in which entering a basic block does not imply
|
||||
that all subsequent instructions must be executed. */
|
||||
|
||||
int
|
||||
flow_call_edges_add (sbitmap blocks)
|
||||
{
|
||||
if (!cfg_hooks->flow_call_edges_add)
|
||||
internal_error ("%s does not support flow_call_edges_add",
|
||||
cfg_hooks->name);
|
||||
|
||||
return (cfg_hooks->flow_call_edges_add) (blocks);
|
||||
}
|
||||
|
@ -37,9 +37,10 @@ struct cfg_hooks
|
||||
basic_block (*create_basic_block) (void *head, void *end, basic_block after);
|
||||
|
||||
/* Redirect edge E to the given basic block B and update underlying program
|
||||
representation. Returns false when edge is not easily redirectable for
|
||||
whatever reason. */
|
||||
bool (*redirect_edge_and_branch) (edge e, basic_block b);
|
||||
representation. Returns edge representing redirected branch (that may not
|
||||
be equivalent to E in the case of duplicate edges being removed) or NULL
|
||||
if edge is not easily redirectable for whatever reason. */
|
||||
edge (*redirect_edge_and_branch) (edge e, basic_block b);
|
||||
|
||||
/* Same as the above but allows redirecting of fallthru edges. In that case
|
||||
newly created forwarder basic block is returned. It aborts when called
|
||||
@ -62,6 +63,19 @@ struct cfg_hooks
|
||||
/* Merge blocks A and B. */
|
||||
void (*merge_blocks) (basic_block a, basic_block b);
|
||||
|
||||
/* Predict edge E using PREDICTOR to given PROBABILITY. */
|
||||
void (*predict_edge) (edge e, enum br_predictor predictor, int probability);
|
||||
|
||||
/* Return true if the one of outgoing edges is already predicted by
|
||||
PREDICTOR. */
|
||||
bool (*predicted_by_p) (basic_block bb, enum br_predictor predictor);
|
||||
|
||||
/* Return true when block A can be duplicated. */
|
||||
bool (*can_duplicate_block_p) (basic_block a);
|
||||
|
||||
/* Duplicate block A. */
|
||||
basic_block (*duplicate_block) (basic_block a);
|
||||
|
||||
/* Higher level functions representable by primitive operations above if
|
||||
we didn't have some oddities in RTL and Tree representations. */
|
||||
basic_block (*split_edge) (edge);
|
||||
@ -69,11 +83,28 @@ struct cfg_hooks
|
||||
|
||||
/* Tries to make the edge fallthru. */
|
||||
void (*tidy_fallthru_edge) (edge);
|
||||
|
||||
/* Say whether a block ends with a call, possibly followed by some
|
||||
other code that must stay with the call. */
|
||||
bool (*block_ends_with_call_p) (basic_block);
|
||||
|
||||
/* Say whether a block ends with a conditional branch. Switches
|
||||
and unconditional branches do not qualify. */
|
||||
bool (*block_ends_with_condjump_p) (basic_block);
|
||||
|
||||
/* Add fake edges to the function exit for any non constant and non noreturn
|
||||
calls, volatile inline assembly in the bitmap of blocks specified by
|
||||
BLOCKS or to the whole CFG if BLOCKS is zero. Return the number of blocks
|
||||
that were split.
|
||||
|
||||
The goal is to expose cases in which entering a basic block does not imply
|
||||
that all subsequent instructions must be executed. */
|
||||
int (*flow_call_edges_add) (sbitmap);
|
||||
};
|
||||
|
||||
extern void verify_flow_info (void);
|
||||
extern void dump_bb (basic_block, FILE *, int);
|
||||
extern bool redirect_edge_and_branch (edge, basic_block);
|
||||
extern edge redirect_edge_and_branch (edge, basic_block);
|
||||
extern basic_block redirect_edge_and_branch_force (edge, basic_block);
|
||||
extern edge split_block (basic_block, void *);
|
||||
extern edge split_block_after_labels (basic_block);
|
||||
@ -88,13 +119,23 @@ extern edge make_forwarder_block (basic_block, bool (*)(edge),
|
||||
void (*) (basic_block));
|
||||
extern void tidy_fallthru_edge (edge);
|
||||
extern void tidy_fallthru_edges (void);
|
||||
extern void predict_edge (edge e, enum br_predictor predictor, int probability);
|
||||
extern bool predicted_by_p (basic_block bb, enum br_predictor predictor);
|
||||
extern bool can_duplicate_block_p (basic_block);
|
||||
extern basic_block duplicate_block (basic_block, edge);
|
||||
extern bool block_ends_with_call_p (basic_block bb);
|
||||
extern bool block_ends_with_condjump_p (basic_block bb);
|
||||
extern int flow_call_edges_add (sbitmap);
|
||||
|
||||
/* Hooks containers. */
|
||||
extern struct cfg_hooks tree_cfg_hooks;
|
||||
extern struct cfg_hooks rtl_cfg_hooks;
|
||||
extern struct cfg_hooks cfg_layout_rtl_cfg_hooks;
|
||||
|
||||
/* Declarations. */
|
||||
extern int ir_type (void);
|
||||
extern void rtl_register_cfg_hooks (void);
|
||||
extern void cfg_layout_rtl_register_cfg_hooks (void);
|
||||
extern void tree_register_cfg_hooks (void);
|
||||
|
||||
#endif /* GCC_CFGHOOKS_H */
|
||||
|
122
gcc/cfglayout.c
122
gcc/cfglayout.c
@ -41,8 +41,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
in this obstack, and all are freed at the end of the function. */
|
||||
extern struct obstack flow_obstack;
|
||||
|
||||
alloc_pool cfg_layout_pool;
|
||||
|
||||
/* Holds the interesting trailing notes for the function. */
|
||||
rtx cfg_layout_function_footer, cfg_layout_function_header;
|
||||
|
||||
@ -311,10 +309,14 @@ insn_locators_initialize (void)
|
||||
switch (NOTE_LINE_NUMBER (insn))
|
||||
{
|
||||
case NOTE_INSN_BLOCK_BEG:
|
||||
if (cfun->dont_emit_block_notes)
|
||||
abort ();
|
||||
block = NOTE_BLOCK (insn);
|
||||
delete_insn (insn);
|
||||
break;
|
||||
case NOTE_INSN_BLOCK_END:
|
||||
if (cfun->dont_emit_block_notes)
|
||||
abort ();
|
||||
block = BLOCK_SUPERCONTEXT (block);
|
||||
if (block && TREE_CODE (block) == FUNCTION_DECL)
|
||||
block = 0;
|
||||
@ -329,11 +331,17 @@ insn_locators_initialize (void)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (cfun->dont_emit_block_notes)
|
||||
check_block_change (insn, &block);
|
||||
}
|
||||
|
||||
/* Tag the blocks with a depth number so that change_scope can find
|
||||
the common parent easily. */
|
||||
set_block_levels (DECL_INITIAL (cfun->decl), 0);
|
||||
|
||||
if (cfun->dont_emit_block_notes)
|
||||
free_block_changes ();
|
||||
}
|
||||
|
||||
/* For each lexical block, set BLOCK_NUMBER to the depth at which it is
|
||||
@ -771,7 +779,7 @@ fixup_reorder_chain (void)
|
||||
nb = force_nonfallthru (e_fall);
|
||||
if (nb)
|
||||
{
|
||||
cfg_layout_initialize_rbi (nb);
|
||||
initialize_bb_rbi (nb);
|
||||
nb->rbi->visited = 1;
|
||||
nb->rbi->next = bb->rbi->next;
|
||||
bb->rbi->next = nb;
|
||||
@ -933,20 +941,15 @@ fixup_fallthru_exit_predecessor (void)
|
||||
|
||||
/* Return true in case it is possible to duplicate the basic block BB. */
|
||||
|
||||
/* We do not want to declare the function in a header file, since it should
|
||||
only be used through the cfghooks interface, and we do not want to move
|
||||
it to cfgrtl.c since it would require also moving quite a lot of related
|
||||
code. */
|
||||
extern bool cfg_layout_can_duplicate_bb_p (basic_block);
|
||||
|
||||
bool
|
||||
cfg_layout_can_duplicate_bb_p (basic_block bb)
|
||||
{
|
||||
edge s;
|
||||
|
||||
if (bb == EXIT_BLOCK_PTR || bb == ENTRY_BLOCK_PTR)
|
||||
return false;
|
||||
|
||||
/* Duplicating fallthru block to exit would require adding a jump
|
||||
and splitting the real last BB. */
|
||||
for (s = bb->succ; s; s = s->succ_next)
|
||||
if (s->dest == EXIT_BLOCK_PTR && s->flags & EDGE_FALLTHRU)
|
||||
return false;
|
||||
|
||||
/* Do not attempt to duplicate tablejumps, as we need to unshare
|
||||
the dispatch table. This is difficult to do, as the instructions
|
||||
computing jump destination may be hoisted outside the basic block. */
|
||||
@ -1062,26 +1065,19 @@ duplicate_insn_chain (rtx from, rtx to)
|
||||
delete_insn (last);
|
||||
return insn;
|
||||
}
|
||||
/* Create a duplicate of the basic block BB and redirect edge E into it.
|
||||
If E is not specified, BB is just copied, but updating the frequencies
|
||||
etc. is left to the caller. */
|
||||
/* Create a duplicate of the basic block BB. */
|
||||
|
||||
/* We do not want to declare the function in a header file, since it should
|
||||
only be used through the cfghooks interface, and we do not want to move
|
||||
it to cfgrtl.c since it would require also moving quite a lot of related
|
||||
code. */
|
||||
extern basic_block cfg_layout_duplicate_bb (basic_block);
|
||||
|
||||
basic_block
|
||||
cfg_layout_duplicate_bb (basic_block bb, edge e)
|
||||
cfg_layout_duplicate_bb (basic_block bb)
|
||||
{
|
||||
rtx insn;
|
||||
edge s, n;
|
||||
basic_block new_bb;
|
||||
gcov_type new_count = e ? e->count : 0;
|
||||
|
||||
if (bb->count < new_count)
|
||||
new_count = bb->count;
|
||||
if (!bb->pred)
|
||||
abort ();
|
||||
#ifdef ENABLE_CHECKING
|
||||
if (!cfg_layout_can_duplicate_bb_p (bb))
|
||||
abort ();
|
||||
#endif
|
||||
|
||||
insn = duplicate_insn_chain (BB_HEAD (bb), BB_END (bb));
|
||||
new_bb = create_basic_block (insn,
|
||||
@ -1116,62 +1112,9 @@ cfg_layout_duplicate_bb (basic_block bb, edge e)
|
||||
COPY_REG_SET (new_bb->global_live_at_end, bb->global_live_at_end);
|
||||
}
|
||||
|
||||
new_bb->loop_depth = bb->loop_depth;
|
||||
new_bb->flags = bb->flags;
|
||||
for (s = bb->succ; s; s = s->succ_next)
|
||||
{
|
||||
/* Since we are creating edges from a new block to successors
|
||||
of another block (which therefore are known to be disjoint), there
|
||||
is no need to actually check for duplicated edges. */
|
||||
n = unchecked_make_edge (new_bb, s->dest, s->flags);
|
||||
n->probability = s->probability;
|
||||
if (e && bb->count)
|
||||
{
|
||||
/* Take care for overflows! */
|
||||
n->count = s->count * (new_count * 10000 / bb->count) / 10000;
|
||||
s->count -= n->count;
|
||||
}
|
||||
else
|
||||
n->count = s->count;
|
||||
n->aux = s->aux;
|
||||
}
|
||||
|
||||
if (e)
|
||||
{
|
||||
new_bb->count = new_count;
|
||||
bb->count -= new_count;
|
||||
|
||||
new_bb->frequency = EDGE_FREQUENCY (e);
|
||||
bb->frequency -= EDGE_FREQUENCY (e);
|
||||
|
||||
redirect_edge_and_branch_force (e, new_bb);
|
||||
|
||||
if (bb->count < 0)
|
||||
bb->count = 0;
|
||||
if (bb->frequency < 0)
|
||||
bb->frequency = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_bb->count = bb->count;
|
||||
new_bb->frequency = bb->frequency;
|
||||
}
|
||||
|
||||
new_bb->rbi->original = bb;
|
||||
bb->rbi->copy = new_bb;
|
||||
|
||||
return new_bb;
|
||||
}
|
||||
|
||||
void
|
||||
cfg_layout_initialize_rbi (basic_block bb)
|
||||
{
|
||||
if (bb->rbi)
|
||||
abort ();
|
||||
bb->rbi = pool_alloc (cfg_layout_pool);
|
||||
memset (bb->rbi, 0, sizeof (struct reorder_block_def));
|
||||
}
|
||||
|
||||
/* Main entry point to this module - initialize the data structures for
|
||||
CFG layout changes. It keeps LOOPS up-to-date if not null. */
|
||||
|
||||
@ -1180,13 +1123,12 @@ cfg_layout_initialize (void)
|
||||
{
|
||||
basic_block bb;
|
||||
|
||||
/* Our algorithm depends on fact that there are now dead jumptables
|
||||
/* Our algorithm depends on fact that there are no dead jumptables
|
||||
around the code. */
|
||||
cfg_layout_pool =
|
||||
create_alloc_pool ("cfg layout pool", sizeof (struct reorder_block_def),
|
||||
n_basic_blocks + 2);
|
||||
alloc_rbi_pool ();
|
||||
|
||||
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
|
||||
cfg_layout_initialize_rbi (bb);
|
||||
initialize_bb_rbi (bb);
|
||||
|
||||
cfg_layout_rtl_register_cfg_hooks ();
|
||||
|
||||
@ -1242,7 +1184,7 @@ cfg_layout_finalize (void)
|
||||
verify_insn_chain ();
|
||||
#endif
|
||||
|
||||
free_alloc_pool (cfg_layout_pool);
|
||||
free_rbi_pool ();
|
||||
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
|
||||
bb->rbi = NULL;
|
||||
|
||||
@ -1275,7 +1217,7 @@ can_copy_bbs_p (basic_block *bbs, unsigned n)
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!cfg_layout_can_duplicate_bb_p (bbs[i]))
|
||||
if (!can_duplicate_block_p (bbs[i]))
|
||||
{
|
||||
ret = false;
|
||||
break;
|
||||
@ -1318,7 +1260,7 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
|
||||
{
|
||||
/* Duplicate. */
|
||||
bb = bbs[i];
|
||||
new_bb = new_bbs[i] = cfg_layout_duplicate_bb (bb, NULL);
|
||||
new_bb = new_bbs[i] = duplicate_block (bb, NULL);
|
||||
bb->rbi->duplicated = 1;
|
||||
/* Add to loop. */
|
||||
add_bb_to_loop (new_bb, bb->loop_father->copy);
|
||||
|
@ -18,31 +18,13 @@
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA. */
|
||||
|
||||
/* Structure to hold information about the blocks during reordering. */
|
||||
typedef struct reorder_block_def
|
||||
{
|
||||
rtx header;
|
||||
rtx footer;
|
||||
basic_block next;
|
||||
basic_block original;
|
||||
/* Used by loop copying. */
|
||||
basic_block copy;
|
||||
int duplicated;
|
||||
|
||||
/* These fields are used by bb-reorder pass. */
|
||||
int visited;
|
||||
} *reorder_block_def;
|
||||
|
||||
extern rtx cfg_layout_function_footer;
|
||||
|
||||
extern void cfg_layout_initialize (void);
|
||||
extern void cfg_layout_finalize (void);
|
||||
extern bool cfg_layout_can_duplicate_bb_p (basic_block);
|
||||
extern basic_block cfg_layout_duplicate_bb (basic_block, edge);
|
||||
extern void insn_locators_initialize (void);
|
||||
extern void reemit_insn_block_notes (void);
|
||||
extern bool can_copy_bbs_p (basic_block *, unsigned);
|
||||
extern void copy_bbs (basic_block *, unsigned, basic_block *,
|
||||
edge *, unsigned, edge *, struct loop *);
|
||||
extern void cfg_layout_initialize_rbi (basic_block);
|
||||
extern bool scan_ahead_for_unlikely_executed_note (rtx);
|
||||
|
@ -28,6 +28,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
#include "toplev.h"
|
||||
#include "cfgloop.h"
|
||||
#include "flags.h"
|
||||
#include "tree.h"
|
||||
#include "tree-flow.h"
|
||||
|
||||
/* Ratio of frequencies of edges so that one of more latch edges is
|
||||
considered to belong to inner loop with same header. */
|
||||
|
@ -237,6 +237,7 @@ extern void flow_loop_dump (const struct loop *, FILE *,
|
||||
extern int flow_loop_scan (struct loop *, int);
|
||||
extern void flow_loop_free (struct loop *);
|
||||
void mark_irreducible_loops (struct loops *);
|
||||
extern void create_loop_notes (void);
|
||||
|
||||
/* Loop data structure manipulation/querying. */
|
||||
extern void flow_loop_tree_node_add (struct loop *, struct loop *);
|
||||
|
@ -1242,3 +1242,99 @@ loop_split_edge_with (edge e, rtx insns)
|
||||
|
||||
return new_bb;
|
||||
}
|
||||
|
||||
/* Uses the natural loop discovery to recreate loop notes. */
|
||||
void
|
||||
create_loop_notes (void)
|
||||
{
|
||||
rtx insn, head, end;
|
||||
struct loops loops;
|
||||
struct loop *loop;
|
||||
basic_block *first, *last, bb, pbb;
|
||||
struct loop **stack, **top;
|
||||
|
||||
#ifdef ENABLE_CHECKING
|
||||
/* Verify that there really are no loop notes. */
|
||||
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
|
||||
if (GET_CODE (insn) == NOTE
|
||||
&& NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
|
||||
abort ();
|
||||
#endif
|
||||
|
||||
flow_loops_find (&loops, LOOP_TREE);
|
||||
free_dominance_info (CDI_DOMINATORS);
|
||||
if (loops.num > 1)
|
||||
{
|
||||
last = xcalloc (loops.num, sizeof (basic_block));
|
||||
|
||||
FOR_EACH_BB (bb)
|
||||
{
|
||||
for (loop = bb->loop_father; loop->outer; loop = loop->outer)
|
||||
last[loop->num] = bb;
|
||||
}
|
||||
|
||||
first = xcalloc (loops.num, sizeof (basic_block));
|
||||
stack = xcalloc (loops.num, sizeof (struct loop *));
|
||||
top = stack;
|
||||
|
||||
FOR_EACH_BB (bb)
|
||||
{
|
||||
for (loop = bb->loop_father; loop->outer; loop = loop->outer)
|
||||
{
|
||||
if (!first[loop->num])
|
||||
{
|
||||
*top++ = loop;
|
||||
first[loop->num] = bb;
|
||||
}
|
||||
|
||||
if (bb == last[loop->num])
|
||||
{
|
||||
/* Prevent loops from overlapping. */
|
||||
while (*--top != loop)
|
||||
last[(*top)->num] = EXIT_BLOCK_PTR;
|
||||
|
||||
/* If loop starts with jump into it, place the note in
|
||||
front of the jump. */
|
||||
insn = PREV_INSN (BB_HEAD (first[loop->num]));
|
||||
if (insn
|
||||
&& GET_CODE (insn) == BARRIER)
|
||||
insn = PREV_INSN (insn);
|
||||
|
||||
if (insn
|
||||
&& GET_CODE (insn) == JUMP_INSN
|
||||
&& any_uncondjump_p (insn)
|
||||
&& onlyjump_p (insn))
|
||||
{
|
||||
pbb = BLOCK_FOR_INSN (insn);
|
||||
if (!pbb || !pbb->succ || pbb->succ->succ_next)
|
||||
abort ();
|
||||
|
||||
if (!flow_bb_inside_loop_p (loop, pbb->succ->dest))
|
||||
insn = BB_HEAD (first[loop->num]);
|
||||
}
|
||||
else
|
||||
insn = BB_HEAD (first[loop->num]);
|
||||
|
||||
head = BB_HEAD (first[loop->num]);
|
||||
emit_note_before (NOTE_INSN_LOOP_BEG, insn);
|
||||
BB_HEAD (first[loop->num]) = head;
|
||||
|
||||
/* Position the note correctly wrto barrier. */
|
||||
insn = BB_END (last[loop->num]);
|
||||
if (NEXT_INSN (insn)
|
||||
&& GET_CODE (NEXT_INSN (insn)) == BARRIER)
|
||||
insn = NEXT_INSN (insn);
|
||||
|
||||
end = BB_END (last[loop->num]);
|
||||
emit_note_after (NOTE_INSN_LOOP_END, insn);
|
||||
BB_END (last[loop->num]) = end;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free (first);
|
||||
free (last);
|
||||
free (stack);
|
||||
}
|
||||
flow_loops_free (&loops);
|
||||
}
|
||||
|
308
gcc/cfgrtl.c
308
gcc/cfgrtl.c
@ -74,12 +74,12 @@ static basic_block rtl_split_edge (edge);
|
||||
static bool rtl_move_block_after (basic_block, basic_block);
|
||||
static int rtl_verify_flow_info (void);
|
||||
static basic_block cfg_layout_split_block (basic_block, void *);
|
||||
static bool cfg_layout_redirect_edge_and_branch (edge, basic_block);
|
||||
static edge cfg_layout_redirect_edge_and_branch (edge, basic_block);
|
||||
static basic_block cfg_layout_redirect_edge_and_branch_force (edge, basic_block);
|
||||
static void cfg_layout_delete_block (basic_block);
|
||||
static void rtl_delete_block (basic_block);
|
||||
static basic_block rtl_redirect_edge_and_branch_force (edge, basic_block);
|
||||
static bool rtl_redirect_edge_and_branch (edge, basic_block);
|
||||
static edge rtl_redirect_edge_and_branch (edge, basic_block);
|
||||
static basic_block rtl_split_block (basic_block, void *);
|
||||
static void rtl_dump_bb (basic_block, FILE *, int);
|
||||
static int rtl_verify_flow_info_1 (void);
|
||||
@ -259,7 +259,6 @@ create_basic_block_structure (rtx head, rtx end, rtx bb_note, basic_block after)
|
||||
basic_block bb;
|
||||
|
||||
if (bb_note
|
||||
&& ! RTX_INTEGRATED_P (bb_note)
|
||||
&& (bb = NOTE_BASIC_BLOCK (bb_note)) != NULL
|
||||
&& bb->aux == NULL)
|
||||
{
|
||||
@ -354,7 +353,7 @@ cfg_layout_create_basic_block (void *head, void *end, basic_block after)
|
||||
{
|
||||
basic_block newbb = rtl_create_basic_block (head, end, after);
|
||||
|
||||
cfg_layout_initialize_rbi (newbb);
|
||||
initialize_bb_rbi (newbb);
|
||||
return newbb;
|
||||
}
|
||||
|
||||
@ -392,8 +391,6 @@ rtl_delete_block (basic_block b)
|
||||
|
||||
insn = BB_HEAD (b);
|
||||
|
||||
never_reached_warning (insn, BB_END (b));
|
||||
|
||||
if (GET_CODE (insn) == CODE_LABEL)
|
||||
maybe_remove_eh_handler (insn);
|
||||
|
||||
@ -666,7 +663,7 @@ block_label (basic_block block)
|
||||
apply only if all edges now point to the same block. The parameters and
|
||||
return values are equivalent to redirect_edge_and_branch. */
|
||||
|
||||
bool
|
||||
edge
|
||||
try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
|
||||
{
|
||||
basic_block src = e->src;
|
||||
@ -690,14 +687,14 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
|
||||
break;
|
||||
|
||||
if (tmp || !onlyjump_p (insn))
|
||||
return false;
|
||||
return NULL;
|
||||
if ((!optimize || reload_completed) && tablejump_p (insn, NULL, NULL))
|
||||
return false;
|
||||
return NULL;
|
||||
|
||||
/* Avoid removing branch with side effects. */
|
||||
set = single_set (insn);
|
||||
if (!set || side_effects_p (set))
|
||||
return false;
|
||||
return NULL;
|
||||
|
||||
/* In case we zap a conditional jump, we'll need to kill
|
||||
the cc0 setter too. */
|
||||
@ -746,21 +743,21 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
|
||||
else if (simplejump_p (insn))
|
||||
{
|
||||
if (e->dest == target)
|
||||
return false;
|
||||
return NULL;
|
||||
if (dump_file)
|
||||
fprintf (dump_file, "Redirecting jump %i from %i to %i.\n",
|
||||
INSN_UID (insn), e->dest->index, target->index);
|
||||
if (!redirect_jump (insn, block_label (target), 0))
|
||||
{
|
||||
if (target == EXIT_BLOCK_PTR)
|
||||
return false;
|
||||
return NULL;
|
||||
abort ();
|
||||
}
|
||||
}
|
||||
|
||||
/* Cannot do anything for target exit block. */
|
||||
else if (target == EXIT_BLOCK_PTR)
|
||||
return false;
|
||||
return NULL;
|
||||
|
||||
/* Or replace possibly complicated jump insn by simple jump insn. */
|
||||
else
|
||||
@ -834,7 +831,7 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
|
||||
if (e->dest != target)
|
||||
redirect_edge_succ (e, target);
|
||||
|
||||
return true;
|
||||
return e;
|
||||
}
|
||||
|
||||
/* Return last loop_beg note appearing after INSN, before start of next
|
||||
@ -859,8 +856,9 @@ last_loop_beg_note (rtx insn)
|
||||
return last;
|
||||
}
|
||||
|
||||
/* Redirect edge representing branch of (un)conditional jump or tablejump. */
|
||||
static bool
|
||||
/* Redirect edge representing branch of (un)conditional jump or tablejump,
|
||||
NULL on failure */
|
||||
static edge
|
||||
redirect_branch_edge (edge e, basic_block target)
|
||||
{
|
||||
rtx tmp;
|
||||
@ -870,9 +868,9 @@ redirect_branch_edge (edge e, basic_block target)
|
||||
|
||||
/* We can only redirect non-fallthru edges of jump insn. */
|
||||
if (e->flags & EDGE_FALLTHRU)
|
||||
return false;
|
||||
return NULL;
|
||||
else if (GET_CODE (insn) != JUMP_INSN)
|
||||
return false;
|
||||
return NULL;
|
||||
|
||||
/* Recognize a tablejump and adjust all matching cases. */
|
||||
if (tablejump_p (insn, NULL, &tmp))
|
||||
@ -882,7 +880,7 @@ redirect_branch_edge (edge e, basic_block target)
|
||||
rtx new_label = block_label (target);
|
||||
|
||||
if (target == EXIT_BLOCK_PTR)
|
||||
return false;
|
||||
return NULL;
|
||||
if (GET_CODE (PATTERN (tmp)) == ADDR_VEC)
|
||||
vec = XVEC (PATTERN (tmp), 0);
|
||||
else
|
||||
@ -917,7 +915,7 @@ redirect_branch_edge (edge e, basic_block target)
|
||||
if (computed_jump_p (insn)
|
||||
/* A return instruction can't be redirected. */
|
||||
|| returnjump_p (insn))
|
||||
return false;
|
||||
return NULL;
|
||||
|
||||
/* If the insn doesn't go where we think, we're confused. */
|
||||
if (JUMP_LABEL (insn) != old_label)
|
||||
@ -929,7 +927,7 @@ redirect_branch_edge (edge e, basic_block target)
|
||||
if (!redirect_jump (insn, block_label (target), 0))
|
||||
{
|
||||
if (target == EXIT_BLOCK_PTR)
|
||||
return false;
|
||||
return NULL;
|
||||
abort ();
|
||||
}
|
||||
}
|
||||
@ -939,8 +937,8 @@ redirect_branch_edge (edge e, basic_block target)
|
||||
e->src->index, e->dest->index, target->index);
|
||||
|
||||
if (e->dest != target)
|
||||
redirect_edge_succ_nodup (e, target);
|
||||
return true;
|
||||
e = redirect_edge_succ_nodup (e, target);
|
||||
return e;
|
||||
}
|
||||
|
||||
/* Attempt to change code to redirect edge E to TARGET. Don't do that on
|
||||
@ -949,32 +947,35 @@ redirect_branch_edge (edge e, basic_block target)
|
||||
Function can be also called with edge destination equivalent to the TARGET.
|
||||
Then it should try the simplifications and do nothing if none is possible.
|
||||
|
||||
Return true if transformation succeeded. We still return false in case E
|
||||
already destinated TARGET and we didn't managed to simplify instruction
|
||||
stream. */
|
||||
Return edge representing the branch if transformation succeeded. Return NULL
|
||||
on failure.
|
||||
We still return NULL in case E already destinated TARGET and we didn't
|
||||
managed to simplify instruction stream. */
|
||||
|
||||
static bool
|
||||
static edge
|
||||
rtl_redirect_edge_and_branch (edge e, basic_block target)
|
||||
{
|
||||
edge ret;
|
||||
basic_block src = e->src;
|
||||
|
||||
if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
|
||||
return false;
|
||||
return NULL;
|
||||
|
||||
if (e->dest == target)
|
||||
return true;
|
||||
return e;
|
||||
|
||||
if (try_redirect_by_replacing_jump (e, target, false))
|
||||
if ((ret = try_redirect_by_replacing_jump (e, target, false)) != NULL)
|
||||
{
|
||||
src->flags |= BB_DIRTY;
|
||||
return true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!redirect_branch_edge (e, target))
|
||||
return false;
|
||||
ret = redirect_branch_edge (e, target);
|
||||
if (!ret)
|
||||
return NULL;
|
||||
|
||||
src->flags |= BB_DIRTY;
|
||||
return true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Like force_nonfallthru below, but additionally performs redirection
|
||||
@ -1376,14 +1377,14 @@ insert_insn_on_edge (rtx pattern, edge e)
|
||||
if ((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e))
|
||||
abort ();
|
||||
|
||||
if (e->insns == NULL_RTX)
|
||||
if (e->insns.r == NULL_RTX)
|
||||
start_sequence ();
|
||||
else
|
||||
push_to_sequence (e->insns);
|
||||
push_to_sequence (e->insns.r);
|
||||
|
||||
emit_insn (pattern);
|
||||
|
||||
e->insns = get_insns ();
|
||||
e->insns.r = get_insns ();
|
||||
end_sequence ();
|
||||
}
|
||||
|
||||
@ -1491,8 +1492,8 @@ commit_one_edge_insertion (edge e, int watch_calls)
|
||||
basic_block bb = NULL;
|
||||
|
||||
/* Pull the insns off the edge now since the edge might go away. */
|
||||
insns = e->insns;
|
||||
e->insns = NULL_RTX;
|
||||
insns = e->insns.r;
|
||||
e->insns.r = NULL_RTX;
|
||||
|
||||
/* Special case -- avoid inserting code between call and storing
|
||||
its return value. */
|
||||
@ -1663,10 +1664,10 @@ commit_edge_insertions (void)
|
||||
for (e = bb->succ; e; e = next)
|
||||
{
|
||||
next = e->succ_next;
|
||||
if (e->insns)
|
||||
if (e->insns.r)
|
||||
{
|
||||
changed = true;
|
||||
commit_one_edge_insertion (e, false);
|
||||
changed = true;
|
||||
commit_one_edge_insertion (e, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1711,7 +1712,7 @@ commit_edge_insertions_watch_calls (void)
|
||||
for (e = bb->succ; e; e = next)
|
||||
{
|
||||
next = e->succ_next;
|
||||
if (e->insns)
|
||||
if (e->insns.r)
|
||||
{
|
||||
changed = true;
|
||||
commit_one_edge_insertion (e, true);
|
||||
@ -2467,23 +2468,23 @@ cfg_layout_split_block (basic_block bb, void *insnp)
|
||||
|
||||
|
||||
/* Redirect Edge to DEST. */
|
||||
static bool
|
||||
static edge
|
||||
cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
|
||||
{
|
||||
basic_block src = e->src;
|
||||
bool ret;
|
||||
edge ret;
|
||||
|
||||
if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
|
||||
return false;
|
||||
return NULL;
|
||||
|
||||
if (e->dest == dest)
|
||||
return true;
|
||||
return e;
|
||||
|
||||
if (e->src != ENTRY_BLOCK_PTR
|
||||
&& try_redirect_by_replacing_jump (e, dest, true))
|
||||
&& (ret = try_redirect_by_replacing_jump (e, dest, true)))
|
||||
{
|
||||
src->flags |= BB_DIRTY;
|
||||
return true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (e->src == ENTRY_BLOCK_PTR
|
||||
@ -2495,7 +2496,7 @@ cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
|
||||
|
||||
e->src->flags |= BB_DIRTY;
|
||||
redirect_edge_succ (e, dest);
|
||||
return true;
|
||||
return e;
|
||||
}
|
||||
|
||||
/* Redirect_edge_and_branch may decide to turn branch into fallthru edge
|
||||
@ -2518,7 +2519,7 @@ cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
|
||||
abort ();
|
||||
e->flags |= EDGE_FALLTHRU;
|
||||
e->src->flags |= BB_DIRTY;
|
||||
return true;
|
||||
return e;
|
||||
}
|
||||
/* In case we are redirecting fallthru edge to the branch edge
|
||||
of conditional jump, remove it. */
|
||||
@ -2531,13 +2532,10 @@ cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
|
||||
&& onlyjump_p (BB_END (src)))
|
||||
delete_insn (BB_END (src));
|
||||
}
|
||||
|
||||
ret = redirect_edge_succ_nodup (e, dest);
|
||||
if (dump_file)
|
||||
fprintf (dump_file, "Fallthru edge %i->%i redirected to %i\n",
|
||||
e->src->index, e->dest->index, dest->index);
|
||||
redirect_edge_succ_nodup (e, dest);
|
||||
|
||||
ret = true;
|
||||
}
|
||||
else
|
||||
ret = redirect_branch_edge (e, dest);
|
||||
@ -2781,6 +2779,179 @@ rtl_make_forwarder_block (edge fallthru ATTRIBUTE_UNUSED)
|
||||
{
|
||||
}
|
||||
|
||||
/* Return 1 if BB ends with a call, possibly followed by some
|
||||
instructions that must stay with the call, 0 otherwise. */
|
||||
|
||||
static bool
|
||||
rtl_block_ends_with_call_p (basic_block bb)
|
||||
{
|
||||
rtx insn = BB_END (bb);
|
||||
|
||||
while (GET_CODE (insn) != CALL_INSN
|
||||
&& insn != BB_HEAD (bb)
|
||||
&& keep_with_call_p (insn))
|
||||
insn = PREV_INSN (insn);
|
||||
return (GET_CODE (insn) == CALL_INSN);
|
||||
}
|
||||
|
||||
/* Return 1 if BB ends with a conditional branch, 0 otherwise. */
|
||||
|
||||
static bool
|
||||
rtl_block_ends_with_condjump_p (basic_block bb)
|
||||
{
|
||||
return any_condjump_p (BB_END (bb));
|
||||
}
|
||||
|
||||
/* Return true if we need to add fake edge to exit.
|
||||
Helper function for rtl_flow_call_edges_add. */
|
||||
|
||||
static bool
|
||||
need_fake_edge_p (rtx insn)
|
||||
{
|
||||
if (!INSN_P (insn))
|
||||
return false;
|
||||
|
||||
if ((GET_CODE (insn) == CALL_INSN
|
||||
&& !SIBLING_CALL_P (insn)
|
||||
&& !find_reg_note (insn, REG_NORETURN, NULL)
|
||||
&& !find_reg_note (insn, REG_ALWAYS_RETURN, NULL)
|
||||
&& !CONST_OR_PURE_CALL_P (insn)))
|
||||
return true;
|
||||
|
||||
return ((GET_CODE (PATTERN (insn)) == ASM_OPERANDS
|
||||
&& MEM_VOLATILE_P (PATTERN (insn)))
|
||||
|| (GET_CODE (PATTERN (insn)) == PARALLEL
|
||||
&& asm_noperands (insn) != -1
|
||||
&& MEM_VOLATILE_P (XVECEXP (PATTERN (insn), 0, 0)))
|
||||
|| GET_CODE (PATTERN (insn)) == ASM_INPUT);
|
||||
}
|
||||
|
||||
/* Add fake edges to the function exit for any non constant and non noreturn
|
||||
calls, volatile inline assembly in the bitmap of blocks specified by
|
||||
BLOCKS or to the whole CFG if BLOCKS is zero. Return the number of blocks
|
||||
that were split.
|
||||
|
||||
The goal is to expose cases in which entering a basic block does not imply
|
||||
that all subsequent instructions must be executed. */
|
||||
|
||||
static int
|
||||
rtl_flow_call_edges_add (sbitmap blocks)
|
||||
{
|
||||
int i;
|
||||
int blocks_split = 0;
|
||||
int last_bb = last_basic_block;
|
||||
bool check_last_block = false;
|
||||
|
||||
if (n_basic_blocks == 0)
|
||||
return 0;
|
||||
|
||||
if (! blocks)
|
||||
check_last_block = true;
|
||||
else
|
||||
check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
|
||||
|
||||
/* In the last basic block, before epilogue generation, there will be
|
||||
a fallthru edge to EXIT. Special care is required if the last insn
|
||||
of the last basic block is a call because make_edge folds duplicate
|
||||
edges, which would result in the fallthru edge also being marked
|
||||
fake, which would result in the fallthru edge being removed by
|
||||
remove_fake_edges, which would result in an invalid CFG.
|
||||
|
||||
Moreover, we can't elide the outgoing fake edge, since the block
|
||||
profiler needs to take this into account in order to solve the minimal
|
||||
spanning tree in the case that the call doesn't return.
|
||||
|
||||
Handle this by adding a dummy instruction in a new last basic block. */
|
||||
if (check_last_block)
|
||||
{
|
||||
basic_block bb = EXIT_BLOCK_PTR->prev_bb;
|
||||
rtx insn = BB_END (bb);
|
||||
|
||||
/* Back up past insns that must be kept in the same block as a call. */
|
||||
while (insn != BB_HEAD (bb)
|
||||
&& keep_with_call_p (insn))
|
||||
insn = PREV_INSN (insn);
|
||||
|
||||
if (need_fake_edge_p (insn))
|
||||
{
|
||||
edge e;
|
||||
|
||||
for (e = bb->succ; e; e = e->succ_next)
|
||||
if (e->dest == EXIT_BLOCK_PTR)
|
||||
{
|
||||
insert_insn_on_edge (gen_rtx_USE (VOIDmode, const0_rtx), e);
|
||||
commit_edge_insertions ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Now add fake edges to the function exit for any non constant
|
||||
calls since there is no way that we can determine if they will
|
||||
return or not... */
|
||||
|
||||
for (i = 0; i < last_bb; i++)
|
||||
{
|
||||
basic_block bb = BASIC_BLOCK (i);
|
||||
rtx insn;
|
||||
rtx prev_insn;
|
||||
|
||||
if (!bb)
|
||||
continue;
|
||||
|
||||
if (blocks && !TEST_BIT (blocks, i))
|
||||
continue;
|
||||
|
||||
for (insn = BB_END (bb); ; insn = prev_insn)
|
||||
{
|
||||
prev_insn = PREV_INSN (insn);
|
||||
if (need_fake_edge_p (insn))
|
||||
{
|
||||
edge e;
|
||||
rtx split_at_insn = insn;
|
||||
|
||||
/* Don't split the block between a call and an insn that should
|
||||
remain in the same block as the call. */
|
||||
if (GET_CODE (insn) == CALL_INSN)
|
||||
while (split_at_insn != BB_END (bb)
|
||||
&& keep_with_call_p (NEXT_INSN (split_at_insn)))
|
||||
split_at_insn = NEXT_INSN (split_at_insn);
|
||||
|
||||
/* The handling above of the final block before the epilogue
|
||||
should be enough to verify that there is no edge to the exit
|
||||
block in CFG already. Calling make_edge in such case would
|
||||
cause us to mark that edge as fake and remove it later. */
|
||||
|
||||
#ifdef ENABLE_CHECKING
|
||||
if (split_at_insn == BB_END (bb))
|
||||
for (e = bb->succ; e; e = e->succ_next)
|
||||
if (e->dest == EXIT_BLOCK_PTR)
|
||||
abort ();
|
||||
#endif
|
||||
|
||||
/* Note that the following may create a new basic block
|
||||
and renumber the existing basic blocks. */
|
||||
if (split_at_insn != BB_END (bb))
|
||||
{
|
||||
e = split_block (bb, split_at_insn);
|
||||
if (e)
|
||||
blocks_split++;
|
||||
}
|
||||
|
||||
make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
|
||||
}
|
||||
|
||||
if (insn == BB_HEAD (bb))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (blocks_split)
|
||||
verify_flow_info ();
|
||||
|
||||
return blocks_split;
|
||||
}
|
||||
|
||||
/* Implementation of CFG manipulation for linearized RTL. */
|
||||
struct cfg_hooks rtl_cfg_hooks = {
|
||||
"rtl",
|
||||
@ -2794,15 +2965,30 @@ struct cfg_hooks rtl_cfg_hooks = {
|
||||
rtl_move_block_after,
|
||||
rtl_can_merge_blocks, /* can_merge_blocks_p */
|
||||
rtl_merge_blocks,
|
||||
rtl_predict_edge,
|
||||
rtl_predicted_by_p,
|
||||
NULL, /* can_duplicate_block_p */
|
||||
NULL, /* duplicate_block */
|
||||
rtl_split_edge,
|
||||
rtl_make_forwarder_block,
|
||||
rtl_tidy_fallthru_edge
|
||||
rtl_tidy_fallthru_edge,
|
||||
rtl_block_ends_with_call_p,
|
||||
rtl_block_ends_with_condjump_p,
|
||||
rtl_flow_call_edges_add
|
||||
};
|
||||
|
||||
/* Implementation of CFG manipulation for cfg layout RTL, where
|
||||
basic block connected via fallthru edges does not have to be adjacent.
|
||||
This representation will hopefully become the default one in future
|
||||
version of the compiler. */
|
||||
|
||||
/* We do not want to declare these functions in a header file, since they
|
||||
should only be used through the cfghooks interface, and we do not want to
|
||||
move them here since it would require also moving quite a lot of related
|
||||
code. */
|
||||
extern bool cfg_layout_can_duplicate_bb_p (basic_block);
|
||||
extern basic_block cfg_layout_duplicate_bb (basic_block);
|
||||
|
||||
struct cfg_hooks cfg_layout_rtl_cfg_hooks = {
|
||||
"cfglayout mode",
|
||||
rtl_verify_flow_info_1,
|
||||
@ -2815,7 +3001,15 @@ struct cfg_hooks cfg_layout_rtl_cfg_hooks = {
|
||||
rtl_move_block_after,
|
||||
cfg_layout_can_merge_blocks_p,
|
||||
cfg_layout_merge_blocks,
|
||||
rtl_predict_edge,
|
||||
rtl_predicted_by_p,
|
||||
cfg_layout_can_duplicate_bb_p,
|
||||
cfg_layout_duplicate_bb,
|
||||
cfg_layout_split_edge,
|
||||
rtl_make_forwarder_block,
|
||||
NULL
|
||||
NULL,
|
||||
rtl_block_ends_with_call_p,
|
||||
rtl_block_ends_with_condjump_p,
|
||||
rtl_flow_call_edges_add
|
||||
};
|
||||
|
||||
|
10
gcc/cgraph.c
10
gcc/cgraph.c
@ -407,16 +407,6 @@ cgraph_mark_reachable_node (struct cgraph_node *node)
|
||||
|
||||
node->next_needed = cgraph_nodes_queue;
|
||||
cgraph_nodes_queue = node;
|
||||
|
||||
/* At the moment frontend automatically emits all nested functions. */
|
||||
if (node->nested)
|
||||
{
|
||||
struct cgraph_node *node2;
|
||||
|
||||
for (node2 = node->nested; node2; node2 = node2->next_nested)
|
||||
if (!node2->reachable)
|
||||
cgraph_mark_reachable_node (node2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,6 @@ struct cgraph_local_info GTY(())
|
||||
{
|
||||
/* Size of the function before inlining. */
|
||||
int self_insns;
|
||||
|
||||
/* Set when function function is visible in current compilation unit only
|
||||
and it's address is never taken. */
|
||||
bool local;
|
||||
@ -66,9 +65,9 @@ struct cgraph_global_info GTY(())
|
||||
|
||||
struct cgraph_rtl_info GTY(())
|
||||
{
|
||||
int preferred_incoming_stack_boundary;
|
||||
bool const_function;
|
||||
bool pure_function;
|
||||
int preferred_incoming_stack_boundary;
|
||||
};
|
||||
|
||||
|
||||
|
228
gcc/cgraphunit.c
228
gcc/cgraphunit.c
@ -216,6 +216,8 @@ static htab_t visited_nodes;
|
||||
static bool
|
||||
decide_is_function_needed (struct cgraph_node *node, tree decl)
|
||||
{
|
||||
struct cgraph_node *origin;
|
||||
|
||||
/* If we decided it was needed before, but at the time we didn't have
|
||||
the body of the function available, then it's still needed. We have
|
||||
to go back and re-check its dependencies now. */
|
||||
@ -252,6 +254,11 @@ decide_is_function_needed (struct cgraph_node *node, tree decl)
|
||||
/* "extern inline" functions are never output locally. */
|
||||
if (DECL_EXTERNAL (decl))
|
||||
return false;
|
||||
/* Nested functions of extern inline function shall not be emit unless
|
||||
we inlined the origin. */
|
||||
for (origin = node->origin; origin; origin = origin->origin)
|
||||
if (DECL_EXTERNAL (origin->decl))
|
||||
return false;
|
||||
/* We want to emit COMDAT functions only when absolutely necessary. */
|
||||
if (DECL_COMDAT (decl))
|
||||
return false;
|
||||
@ -283,7 +290,7 @@ cgraph_assemble_pending_functions (void)
|
||||
|
||||
cgraph_nodes_queue = cgraph_nodes_queue->next_needed;
|
||||
n->next_needed = NULL;
|
||||
if (!n->origin && !n->global.inlined_to && !DECL_EXTERNAL (n->decl))
|
||||
if (!n->global.inlined_to && !DECL_EXTERNAL (n->decl))
|
||||
{
|
||||
cgraph_expand_function (n);
|
||||
output = true;
|
||||
@ -374,11 +381,6 @@ cgraph_finalize_function (tree decl, bool nested)
|
||||
if (!TREE_ASM_WRITTEN (decl))
|
||||
(*debug_hooks->deferred_inline_function) (decl);
|
||||
|
||||
/* We will never really output the function body, clear the STRUCT_FUNCTION array
|
||||
early then. */
|
||||
if (DECL_EXTERNAL (decl))
|
||||
DECL_STRUCT_FUNCTION (decl) = NULL;
|
||||
|
||||
/* Possibly warn about unused parameters. */
|
||||
if (warn_unused_parameter)
|
||||
do_warn_unused_parameter (decl);
|
||||
@ -618,9 +620,7 @@ cgraph_analyze_function (struct cgraph_node *node)
|
||||
cgraph_create_edges (node, DECL_SAVED_TREE (decl));
|
||||
|
||||
node->local.inlinable = tree_inlinable_function_p (decl);
|
||||
if (!node->local.self_insns)
|
||||
node->local.self_insns
|
||||
= lang_hooks.tree_inlining.estimate_num_insns (decl);
|
||||
node->local.self_insns = estimate_num_insns (DECL_SAVED_TREE (decl));
|
||||
if (node->local.inlinable)
|
||||
node->local.disregard_inline_limits
|
||||
= lang_hooks.tree_inlining.disregard_inline_limits (decl);
|
||||
@ -737,7 +737,6 @@ cgraph_finalize_compilation_unit (void)
|
||||
ggc_collect ();
|
||||
timevar_pop (TV_CGRAPH);
|
||||
}
|
||||
|
||||
/* Figure out what functions we want to assemble. */
|
||||
|
||||
static void
|
||||
@ -749,7 +748,6 @@ cgraph_mark_functions_to_output (void)
|
||||
{
|
||||
tree decl = node->decl;
|
||||
struct cgraph_edge *e;
|
||||
|
||||
if (node->output)
|
||||
abort ();
|
||||
|
||||
@ -764,12 +762,12 @@ cgraph_mark_functions_to_output (void)
|
||||
&& !node->global.inlined_to
|
||||
&& (node->needed
|
||||
|| (e && node->reachable))
|
||||
&& !TREE_ASM_WRITTEN (decl) && !node->origin
|
||||
&& !TREE_ASM_WRITTEN (decl)
|
||||
&& !DECL_EXTERNAL (decl))
|
||||
node->output = 1;
|
||||
/* We should've reclaimed all functions that are not needed. */
|
||||
else if (!node->global.inlined_to && DECL_SAVED_TREE (decl)
|
||||
&& !node->origin && !DECL_EXTERNAL (decl))
|
||||
&& !DECL_EXTERNAL (decl))
|
||||
{
|
||||
dump_cgraph_node (stderr, node);
|
||||
abort ();
|
||||
@ -794,15 +792,21 @@ cgraph_expand_function (struct cgraph_node *node)
|
||||
/* Generate RTL for the body of DECL. Nested functions are expanded
|
||||
via lang_expand_decl_stmt. */
|
||||
lang_hooks.callgraph.expand_function (decl);
|
||||
if (DECL_DEFER_OUTPUT (decl))
|
||||
abort ();
|
||||
|
||||
/* Make sure that BE didn't gave up on compiling. */
|
||||
if (!TREE_ASM_WRITTEN (node->decl)
|
||||
&& !(sorrycount || errorcount))
|
||||
/* Make sure that BE didn't give up on compiling. */
|
||||
/* ??? Can happen with nested function of extern inline. */
|
||||
if (!TREE_ASM_WRITTEN (node->decl))
|
||||
abort ();
|
||||
|
||||
current_function_decl = NULL;
|
||||
if (DECL_SAVED_TREE (node->decl)
|
||||
&& !cgraph_preserve_function_body_p (node->decl))
|
||||
{
|
||||
DECL_SAVED_TREE (node->decl) = NULL;
|
||||
DECL_STRUCT_FUNCTION (node->decl) = NULL;
|
||||
DECL_ARGUMENTS (node->decl) = NULL;
|
||||
DECL_INITIAL (node->decl) = error_mark_node;
|
||||
}
|
||||
}
|
||||
|
||||
/* Fill array order with all nodes with output flag set in the reverse
|
||||
@ -822,7 +826,7 @@ cgraph_postorder (struct cgraph_node **order)
|
||||
/* We have to deal with cycles nicely, so use a depth first traversal
|
||||
output algorithm. Ignore the fact that some functions won't need
|
||||
to be output and put them into order as well, so we get dependencies
|
||||
right throughout inline functions. */
|
||||
right through intline functions. */
|
||||
for (node = cgraph_nodes; node; node = node->next)
|
||||
node->aux = NULL;
|
||||
for (node = cgraph_nodes; node; node = node->next)
|
||||
@ -921,7 +925,7 @@ cgraph_remove_unreachable_nodes (void)
|
||||
/* Remove unreachable nodes. Extern inline functions need special care;
|
||||
Unreachable extern inline functions shall be removed.
|
||||
Reachable extern inline functions we never inlined shall get their bodies
|
||||
eliminated
|
||||
eliminated.
|
||||
Reachable extern inline functions we sometimes inlined will be turned into
|
||||
unanalyzed nodes so they look like for true extern functions to the rest
|
||||
of code. Body of such functions is released via remove_node once the
|
||||
@ -1008,7 +1012,7 @@ cgraph_estimate_growth (struct cgraph_node *node)
|
||||
/* ??? Wrong for self recursive functions or cases where we decide to not
|
||||
inline for different reasons, but it is not big deal as in that case
|
||||
we will keep the body around, but we will also avoid some inlining. */
|
||||
if (!node->needed && !node->origin && !DECL_EXTERNAL (node->decl))
|
||||
if (!node->needed && !DECL_EXTERNAL (node->decl))
|
||||
growth -= node->global.insns;
|
||||
|
||||
return growth;
|
||||
@ -1028,7 +1032,6 @@ cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate)
|
||||
case just go ahead and re-use it. */
|
||||
if (!e->callee->callers->next_caller
|
||||
&& (!e->callee->needed || DECL_EXTERNAL (e->callee->decl))
|
||||
&& !e->callee->origin
|
||||
&& duplicate
|
||||
&& flag_unit_at_a_time)
|
||||
{
|
||||
@ -1191,28 +1194,17 @@ cgraph_recursive_inlining_p (struct cgraph_node *to,
|
||||
struct cgraph_node *what,
|
||||
const char **reason)
|
||||
{
|
||||
struct cgraph_node *node;
|
||||
|
||||
/* Walk TO and all functions TO is inlined in. */
|
||||
while (1)
|
||||
{
|
||||
/* We create recursive inlining either by inlining WHAT into something
|
||||
already inlined in possibly different clone of WHAT. */
|
||||
if (what->decl == to->decl)
|
||||
goto recursive;
|
||||
/* Or by inlining WHAT into something that is already inlined in WHAT. */
|
||||
for (node = cgraph_node (to->decl); node; node = node->next_clone)
|
||||
if (node->global.inlined_to == what)
|
||||
goto recursive;
|
||||
if (!to->callers || to->callers->inline_failed)
|
||||
return false;
|
||||
to = to->callers->caller;
|
||||
}
|
||||
recursive:
|
||||
if (reason)
|
||||
bool recursive;
|
||||
if (to->global.inlined_to)
|
||||
recursive = what->decl == to->global.inlined_to->decl;
|
||||
else
|
||||
recursive = what->decl == to->decl;
|
||||
/* Marking recursive function inlinine has sane semantic and thus we should
|
||||
not warn on it. */
|
||||
if (recursive && reason)
|
||||
*reason = (what->local.disregard_inline_limits
|
||||
? N_("recursive inlining") : "");
|
||||
return true;
|
||||
return recursive;
|
||||
}
|
||||
|
||||
/* Recompute heap nodes for each of callees. */
|
||||
@ -1230,6 +1222,110 @@ update_callee_keys (fibheap_t heap, struct fibnode **heap_node,
|
||||
update_callee_keys (heap, heap_node, e->callee);
|
||||
}
|
||||
|
||||
/* Enqueue all recursive calls from NODE into queue linked via aux pointers
|
||||
in between FIRST and LAST. WHERE is used for bookkeeping while looking
|
||||
int calls inlined within NODE. */
|
||||
static void
|
||||
lookup_recursive_calls (struct cgraph_node *node, struct cgraph_node *where,
|
||||
struct cgraph_edge **first, struct cgraph_edge **last)
|
||||
{
|
||||
struct cgraph_edge *e;
|
||||
for (e = where->callees; e; e = e->next_callee)
|
||||
if (e->callee == node)
|
||||
{
|
||||
if (!*first)
|
||||
*first = e;
|
||||
else
|
||||
(*last)->aux = e;
|
||||
*last = e;
|
||||
}
|
||||
for (e = where->callees; e; e = e->next_callee)
|
||||
if (!e->inline_failed)
|
||||
lookup_recursive_calls (node, e->callee, first, last);
|
||||
}
|
||||
|
||||
/* Decide on recursive inlining: in the case function has recursive calls,
|
||||
inline until body size reaches given argument. */
|
||||
static void
|
||||
cgraph_decide_recursive_inlining (struct cgraph_node *node)
|
||||
{
|
||||
int limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE_AUTO);
|
||||
int max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH_AUTO);
|
||||
struct cgraph_edge *first_call = NULL, *last_call = NULL;
|
||||
struct cgraph_edge *last_in_current_depth;
|
||||
struct cgraph_edge *e;
|
||||
struct cgraph_node *master_clone;
|
||||
int depth = 0;
|
||||
int n = 0;
|
||||
|
||||
if (DECL_DECLARED_INLINE_P (node->decl))
|
||||
{
|
||||
limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE);
|
||||
max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH);
|
||||
}
|
||||
|
||||
/* Make sure that function is small enought to be considered for inlining. */
|
||||
if (!max_depth
|
||||
|| cgraph_estimate_size_after_inlining (1, node, node) >= limit)
|
||||
return;
|
||||
lookup_recursive_calls (node, node, &first_call, &last_call);
|
||||
if (!first_call)
|
||||
return;
|
||||
|
||||
if (cgraph_dump_file)
|
||||
fprintf (cgraph_dump_file,
|
||||
"\nPerforming recursive inlining on %s\n",
|
||||
cgraph_node_name (node));
|
||||
|
||||
/* We need original clone to copy around. */
|
||||
master_clone = cgraph_clone_node (node);
|
||||
master_clone->needed = true;
|
||||
for (e = master_clone->callees; e; e = e->next_callee)
|
||||
if (!e->inline_failed)
|
||||
cgraph_clone_inlined_nodes (e, true);
|
||||
|
||||
/* Do the inlining and update list of recursive call during process. */
|
||||
last_in_current_depth = last_call;
|
||||
while (first_call
|
||||
&& cgraph_estimate_size_after_inlining (1, node, master_clone) <= limit)
|
||||
{
|
||||
struct cgraph_edge *curr = first_call;
|
||||
|
||||
first_call = first_call->aux;
|
||||
curr->aux = NULL;
|
||||
|
||||
cgraph_redirect_edge_callee (curr, master_clone);
|
||||
cgraph_mark_inline_edge (curr);
|
||||
lookup_recursive_calls (node, curr->callee, &first_call, &last_call);
|
||||
|
||||
if (last_in_current_depth
|
||||
&& ++depth >= max_depth)
|
||||
break;
|
||||
n++;
|
||||
}
|
||||
|
||||
/* Cleanup queue pointers. */
|
||||
while (first_call)
|
||||
{
|
||||
struct cgraph_edge *next = first_call->aux;
|
||||
first_call->aux = NULL;
|
||||
first_call = next;
|
||||
}
|
||||
if (cgraph_dump_file)
|
||||
fprintf (cgraph_dump_file,
|
||||
"\n Inlined %i times, body grown from %i to %i insns\n", n,
|
||||
master_clone->global.insns, node->global.insns);
|
||||
|
||||
/* Remove master clone we used for inlining. We rely that clones inlined
|
||||
into master clone gets queued just before master clone so we don't
|
||||
need recursion. */
|
||||
for (node = cgraph_nodes; node != master_clone;
|
||||
node = node->next)
|
||||
if (node->global.inlined_to == master_clone)
|
||||
cgraph_remove_node (node);
|
||||
cgraph_remove_node (master_clone);
|
||||
}
|
||||
|
||||
/* Set inline_failed for all callers of given function to REASON. */
|
||||
|
||||
static void
|
||||
@ -1333,6 +1429,8 @@ cgraph_decide_inlining_of_small_functions (void)
|
||||
}
|
||||
}
|
||||
|
||||
cgraph_decide_recursive_inlining (node);
|
||||
|
||||
/* Similarly all functions called by the function we just inlined
|
||||
are now called more times; update keys. */
|
||||
update_callee_keys (heap, heap_node, node);
|
||||
@ -1383,38 +1481,36 @@ cgraph_decide_inlining (void)
|
||||
so none of our later choices will make this impossible. */
|
||||
for (i = nnodes - 1; i >= 0; i--)
|
||||
{
|
||||
struct cgraph_edge *e;
|
||||
struct cgraph_edge *e, *next;
|
||||
|
||||
node = order[i];
|
||||
|
||||
for (e = node->callees; e; e = e->next_callee)
|
||||
if (e->callee->local.disregard_inline_limits)
|
||||
break;
|
||||
if (!e)
|
||||
if (!node->local.disregard_inline_limits)
|
||||
continue;
|
||||
if (cgraph_dump_file)
|
||||
fprintf (cgraph_dump_file,
|
||||
"\nConsidering %s %i insns (always inline)\n",
|
||||
cgraph_node_name (e->callee), e->callee->global.insns);
|
||||
for (; e; e = e->next_callee)
|
||||
old_insns = overall_insns;
|
||||
for (e = node->callers; e; e = next)
|
||||
{
|
||||
old_insns = overall_insns;
|
||||
if (!e->inline_failed || !e->callee->local.disregard_inline_limits)
|
||||
next = e->next_caller;
|
||||
if (!e->inline_failed)
|
||||
continue;
|
||||
if (cgraph_recursive_inlining_p (order[i], e->callee,
|
||||
if (cgraph_recursive_inlining_p (e->caller, e->callee,
|
||||
&e->inline_failed))
|
||||
continue;
|
||||
cgraph_mark_inline (e);
|
||||
cgraph_mark_inline_edge (e);
|
||||
if (cgraph_dump_file)
|
||||
fprintf (cgraph_dump_file,
|
||||
" Inlined into %s which now has %i insns.\n",
|
||||
cgraph_node_name (node->callees->caller),
|
||||
node->callees->caller->global.insns);
|
||||
}
|
||||
if (cgraph_dump_file)
|
||||
fprintf (cgraph_dump_file,
|
||||
" Inlined for a net change of %+i insns.\n",
|
||||
overall_insns - old_insns);
|
||||
if (cgraph_dump_file)
|
||||
fprintf (cgraph_dump_file,
|
||||
" Inlined for a net change of %+i insns.\n",
|
||||
overall_insns - old_insns);
|
||||
}
|
||||
|
||||
if (!flag_really_no_inline)
|
||||
@ -1675,5 +1771,25 @@ cgraph_optimize (void)
|
||||
}
|
||||
#ifdef ENABLE_CHECKING
|
||||
verify_cgraph ();
|
||||
/* Double check that all inline clones are gone and that all
|
||||
function bodies have been released from memory. */
|
||||
if (flag_unit_at_a_time
|
||||
&& !dump_enabled_p (TDI_all)
|
||||
&& !(sorrycount || errorcount))
|
||||
{
|
||||
struct cgraph_node *node;
|
||||
bool error_found = false;
|
||||
|
||||
for (node = cgraph_nodes; node; node = node->next)
|
||||
if (node->analyzed
|
||||
&& (node->global.inlined_to
|
||||
|| DECL_SAVED_TREE (node->decl)))
|
||||
{
|
||||
error_found = true;
|
||||
dump_cgraph_node (stderr, node);
|
||||
}
|
||||
if (error_found)
|
||||
internal_error ("Nodes with no released memory found.");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -6661,17 +6661,15 @@ get_pos_from_mask (unsigned HOST_WIDE_INT m, unsigned HOST_WIDE_INT *plen)
|
||||
{
|
||||
/* Get the bit number of the first 1 bit from the right, -1 if none. */
|
||||
int pos = exact_log2 (m & -m);
|
||||
int len;
|
||||
int len = 0;
|
||||
|
||||
if (pos < 0)
|
||||
return -1;
|
||||
|
||||
/* Now shift off the low-order zero bits and see if we have a power of
|
||||
two minus 1. */
|
||||
len = exact_log2 ((m >> pos) + 1);
|
||||
if (pos >= 0)
|
||||
/* Now shift off the low-order zero bits and see if we have a
|
||||
power of two minus 1. */
|
||||
len = exact_log2 ((m >> pos) + 1);
|
||||
|
||||
if (len <= 0)
|
||||
return -1;
|
||||
pos = -1;
|
||||
|
||||
*plen = len;
|
||||
return pos;
|
||||
|
@ -310,6 +310,10 @@ fdiagnostics-show-location=
|
||||
Common Joined RejectNegative
|
||||
-fdiagnostics-show-location=[once|every-line] How often to emit source location at the beginning of line-wrapped diagnostics
|
||||
|
||||
fdump-
|
||||
Common Joined RejectNegative
|
||||
-fdump-<type> Dump various compiler internals to a file
|
||||
|
||||
fdump-unnumbered
|
||||
Common
|
||||
Suppress output of instruction numbers and line number notes in debugging dumps
|
||||
@ -466,6 +470,18 @@ fmove-all-movables
|
||||
Common
|
||||
Force all loop invariant computations out of loops
|
||||
|
||||
fmudflap
|
||||
Common RejectNegative
|
||||
Add mudflap bounds-checking instrumentation for single-threaded program.
|
||||
|
||||
fmudflapth
|
||||
Common RejectNegative
|
||||
Add mudflap bounds-checking instrumentation for multi-threaded program.
|
||||
|
||||
fmudflapir
|
||||
Common RejectNegative
|
||||
Ignore read operations when inserting mudflap instrumentation.
|
||||
|
||||
fnew-ra
|
||||
Common
|
||||
Use graph-coloring register allocation
|
||||
@ -712,6 +728,61 @@ ftrapv
|
||||
Common
|
||||
Trap for signed overflow in addition, subtraction and multiplication
|
||||
|
||||
ftree-based-profiling
|
||||
Common
|
||||
Use tree-ssa based implementation of profiling
|
||||
|
||||
ftree-ccp
|
||||
Common
|
||||
Enable SSA-CCP optimization on trees
|
||||
|
||||
ftree-ch
|
||||
Common
|
||||
Enable loop header copying on trees
|
||||
|
||||
ftree-combine-temps
|
||||
Common
|
||||
Coalesce memory temporaries in the SSA->normal pass
|
||||
|
||||
ftree-copyrename
|
||||
Common
|
||||
Replace SSA temporaries with better names in copies.
|
||||
|
||||
ftree-dce
|
||||
Common
|
||||
Enable SSA dead code elimination optimization on trees
|
||||
|
||||
ftree-dominator-opts
|
||||
Common
|
||||
Enable dominator optimizations
|
||||
|
||||
ftree-dse
|
||||
Common
|
||||
Enable dead store elimination
|
||||
|
||||
ftree-loop-optimize
|
||||
Common
|
||||
Enable loop optimizations on trees
|
||||
|
||||
ftree-points-to=
|
||||
Common Joined RejectNegative
|
||||
|
||||
ftree-pre
|
||||
Common
|
||||
Enable SSA-PRE optimization on trees
|
||||
|
||||
ftree-sra
|
||||
Common
|
||||
Perform scalar replacement of aggregates
|
||||
|
||||
ftree-ter
|
||||
Common
|
||||
Replace temporary expressions in the SSA->normal pass
|
||||
|
||||
ftree-lrs
|
||||
Common
|
||||
Perform live range splitting during the SSA->normal pass.
|
||||
|
||||
funit-at-a-time
|
||||
Common
|
||||
Compile whole compilation unit at a time
|
||||
|
@ -568,6 +568,15 @@
|
||||
/* Define to `int' if <sys/types.h> does not define. */
|
||||
#undef ssize_t
|
||||
|
||||
/* Define if your linker supports -pie option. */
|
||||
#undef HAVE_LD_PIE
|
||||
|
||||
/* Define if BANSHEE is available */
|
||||
#undef HAVE_BANSHEE
|
||||
|
||||
/* Define to PREFIX/include if cpp should also search that directory. */
|
||||
#undef PREFIX_INCLUDE_DIR
|
||||
|
||||
/* Define to `int' if <sys/types.h> doesn't define. */
|
||||
#undef uid_t
|
||||
|
||||
|
@ -801,9 +801,6 @@ input_operand (rtx op, enum machine_mode mode)
|
||||
case CONST_INT:
|
||||
return mode == QImode || mode == HImode || add_operand (op, mode);
|
||||
|
||||
case CONSTANT_P_RTX:
|
||||
return 1;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1116,7 +1116,7 @@ arm_compute_func_type (void)
|
||||
&& TREE_THIS_VOLATILE (current_function_decl))
|
||||
type |= ARM_FT_VOLATILE;
|
||||
|
||||
if (current_function_needs_context)
|
||||
if (cfun->static_chain_decl != NULL)
|
||||
type |= ARM_FT_NESTED;
|
||||
|
||||
attr = DECL_ATTRIBUTES (current_function_decl);
|
||||
@ -10227,10 +10227,10 @@ arm_compute_initial_elimination_offset (unsigned int from, unsigned int to)
|
||||
frame pointer and the arg pointer coincide. */
|
||||
if (offsets->frame == offsets->saved_regs)
|
||||
return 0;
|
||||
/* FIXME: Not sure about this. Maybe we should always return 0 ? */
|
||||
return (frame_pointer_needed
|
||||
&& current_function_needs_context
|
||||
&& ! cfun->machine->uses_anonymous_args) ? 4 : 0;
|
||||
/* FIXME: Not sure about this. Maybe we should always return 0 ? */
|
||||
return (frame_pointer_needed
|
||||
&& cfun->static_chain_decl != NULL
|
||||
&& ! cfun->machine->uses_anonymous_args) ? 4 : 0;
|
||||
|
||||
case STACK_POINTER_REGNUM:
|
||||
/* If nothing has been pushed on the stack at all
|
||||
|
@ -2046,7 +2046,6 @@ typedef struct
|
||||
#define THUMB_LEGITIMATE_CONSTANT_P(X) \
|
||||
( GET_CODE (X) == CONST_INT \
|
||||
|| GET_CODE (X) == CONST_DOUBLE \
|
||||
|| GET_CODE (X) == CONSTANT_P_RTX \
|
||||
|| CONSTANT_ADDRESS_P (X) \
|
||||
|| flag_pic)
|
||||
|
||||
|
@ -765,9 +765,6 @@ extern int avr_case_values_threshold;
|
||||
|
||||
#define FUNCTION_MODE HImode
|
||||
|
||||
/* 1 3 */
|
||||
#define INTEGRATE_THRESHOLD(DECL) (1 + (3 * list_length (DECL_ARGUMENTS (DECL)) / 2))
|
||||
|
||||
#define DOLLARS_IN_IDENTIFIERS 0
|
||||
|
||||
#define NO_DOLLAR_IN_LABEL 1
|
||||
|
@ -2940,9 +2940,6 @@ const_operand (register rtx op, register enum machine_mode mode)
|
||||
case Pmode:
|
||||
#endif
|
||||
case QImode:
|
||||
if (GET_CODE (op) == CONSTANT_P_RTX)
|
||||
return 1;
|
||||
|
||||
if (GET_CODE (op) != CONST_INT
|
||||
|| (GET_MODE (op) != VOIDmode && GET_MODE (op) != mode)
|
||||
|| GET_MODE_CLASS (mode) != MODE_INT)
|
||||
|
@ -2488,7 +2488,6 @@ cris_symbol (rtx x)
|
||||
|
||||
case CONST_INT:
|
||||
case CONST_DOUBLE:
|
||||
case CONSTANT_P_RTX:
|
||||
return 0;
|
||||
|
||||
default:
|
||||
@ -2550,7 +2549,6 @@ cris_gotless_symbol (rtx x)
|
||||
|
||||
case CONST_INT:
|
||||
case CONST_DOUBLE:
|
||||
case CONSTANT_P_RTX:
|
||||
return 0;
|
||||
|
||||
default:
|
||||
@ -2595,7 +2593,6 @@ cris_got_symbol (rtx x)
|
||||
|
||||
case CONST_INT:
|
||||
case CONST_DOUBLE:
|
||||
case CONSTANT_P_RTX:
|
||||
return 0;
|
||||
|
||||
default:
|
||||
|
@ -2639,8 +2639,7 @@ fixup_section (void) \
|
||||
( GET_CODE (X) == CONST_INT \
|
||||
|| GET_CODE (X) == CONST_DOUBLE \
|
||||
|| (GET_CODE (X) == HIGH && GET_CODE (XEXP (X, 0)) == CONST_INT) \
|
||||
|| got12_operand (X, VOIDmode) \
|
||||
|| GET_CODE (X) == CONSTANT_P_RTX)
|
||||
|| got12_operand (X, VOIDmode)) \
|
||||
|
||||
|
||||
/* The Overall Framework of an Assembler File. */
|
||||
|
@ -384,7 +384,7 @@ h8300_emit_stack_adjustment (int sign, unsigned int size)
|
||||
if (TARGET_H8300
|
||||
&& size > 4
|
||||
&& !h8300_current_function_interrupt_function_p ()
|
||||
&& !(current_function_needs_context && sign < 0))
|
||||
&& !(cfun->static_chain_decl != NULL && sign < 0))
|
||||
{
|
||||
rtx r3 = gen_rtx_REG (Pmode, 3);
|
||||
emit_insn (gen_movhi (r3, GEN_INT (sign * size)));
|
||||
|
@ -715,7 +715,6 @@ int
|
||||
gr_reg_or_5bit_operand (rtx op, enum machine_mode mode)
|
||||
{
|
||||
return ((GET_CODE (op) == CONST_INT && INTVAL (op) >= 0 && INTVAL (op) < 32)
|
||||
|| GET_CODE (op) == CONSTANT_P_RTX
|
||||
|| gr_register_operand (op, mode));
|
||||
}
|
||||
|
||||
@ -725,7 +724,6 @@ int
|
||||
gr_reg_or_6bit_operand (rtx op, enum machine_mode mode)
|
||||
{
|
||||
return ((GET_CODE (op) == CONST_INT && CONST_OK_FOR_M (INTVAL (op)))
|
||||
|| GET_CODE (op) == CONSTANT_P_RTX
|
||||
|| gr_register_operand (op, mode));
|
||||
}
|
||||
|
||||
@ -735,7 +733,6 @@ int
|
||||
gr_reg_or_8bit_operand (rtx op, enum machine_mode mode)
|
||||
{
|
||||
return ((GET_CODE (op) == CONST_INT && CONST_OK_FOR_K (INTVAL (op)))
|
||||
|| GET_CODE (op) == CONSTANT_P_RTX
|
||||
|| gr_register_operand (op, mode));
|
||||
}
|
||||
|
||||
@ -745,7 +742,6 @@ int
|
||||
grfr_reg_or_8bit_operand (rtx op, enum machine_mode mode)
|
||||
{
|
||||
return ((GET_CODE (op) == CONST_INT && CONST_OK_FOR_K (INTVAL (op)))
|
||||
|| GET_CODE (op) == CONSTANT_P_RTX
|
||||
|| grfr_register_operand (op, mode));
|
||||
}
|
||||
|
||||
@ -756,7 +752,6 @@ int
|
||||
gr_reg_or_8bit_adjusted_operand (rtx op, enum machine_mode mode)
|
||||
{
|
||||
return ((GET_CODE (op) == CONST_INT && CONST_OK_FOR_L (INTVAL (op)))
|
||||
|| GET_CODE (op) == CONSTANT_P_RTX
|
||||
|| gr_register_operand (op, mode));
|
||||
}
|
||||
|
||||
@ -770,7 +765,6 @@ gr_reg_or_8bit_and_adjusted_operand (rtx op, enum machine_mode mode)
|
||||
{
|
||||
return ((GET_CODE (op) == CONST_INT && CONST_OK_FOR_K (INTVAL (op))
|
||||
&& CONST_OK_FOR_L (INTVAL (op)))
|
||||
|| GET_CODE (op) == CONSTANT_P_RTX
|
||||
|| gr_register_operand (op, mode));
|
||||
}
|
||||
|
||||
@ -780,7 +774,6 @@ int
|
||||
gr_reg_or_14bit_operand (rtx op, enum machine_mode mode)
|
||||
{
|
||||
return ((GET_CODE (op) == CONST_INT && CONST_OK_FOR_I (INTVAL (op)))
|
||||
|| GET_CODE (op) == CONSTANT_P_RTX
|
||||
|| gr_register_operand (op, mode));
|
||||
}
|
||||
|
||||
@ -790,7 +783,6 @@ int
|
||||
gr_reg_or_22bit_operand (rtx op, enum machine_mode mode)
|
||||
{
|
||||
return ((GET_CODE (op) == CONST_INT && CONST_OK_FOR_J (INTVAL (op)))
|
||||
|| GET_CODE (op) == CONSTANT_P_RTX
|
||||
|| gr_register_operand (op, mode));
|
||||
}
|
||||
|
||||
@ -799,8 +791,7 @@ gr_reg_or_22bit_operand (rtx op, enum machine_mode mode)
|
||||
int
|
||||
shift_count_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
|
||||
{
|
||||
return ((GET_CODE (op) == CONST_INT && CONST_OK_FOR_M (INTVAL (op)))
|
||||
|| GET_CODE (op) == CONSTANT_P_RTX);
|
||||
return (GET_CODE (op) == CONST_INT && CONST_OK_FOR_M (INTVAL (op)));
|
||||
}
|
||||
|
||||
/* Return 1 if OP is a 5 bit immediate operand. */
|
||||
@ -808,9 +799,8 @@ shift_count_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
|
||||
int
|
||||
shift_32bit_count_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
|
||||
{
|
||||
return ((GET_CODE (op) == CONST_INT
|
||||
&& (INTVAL (op) >= 0 && INTVAL (op) < 32))
|
||||
|| GET_CODE (op) == CONSTANT_P_RTX);
|
||||
return (GET_CODE (op) == CONST_INT
|
||||
&& (INTVAL (op) >= 0 && INTVAL (op) < 32));
|
||||
}
|
||||
|
||||
/* Return 1 if OP is a 2, 4, 8, or 16 immediate operand. */
|
||||
|
@ -2178,7 +2178,7 @@ do { \
|
||||
{ "destination_operand", {SUBREG, REG, MEM}}, \
|
||||
{ "not_postinc_memory_operand", {MEM}}, \
|
||||
{ "move_operand", {SUBREG, REG, MEM, CONST_INT, CONST_DOUBLE, \
|
||||
CONSTANT_P_RTX, SYMBOL_REF, CONST, LABEL_REF}}, \
|
||||
SYMBOL_REF, CONST, LABEL_REF}}, \
|
||||
{ "gr_register_operand", {SUBREG, REG}}, \
|
||||
{ "fr_register_operand", {SUBREG, REG}}, \
|
||||
{ "grfr_register_operand", {SUBREG, REG}}, \
|
||||
@ -2186,19 +2186,16 @@ do { \
|
||||
{ "fr_nonimmediate_operand", {SUBREG, REG, MEM}}, \
|
||||
{ "grfr_nonimmediate_operand", {SUBREG, REG, MEM}}, \
|
||||
{ "gr_reg_or_0_operand", {SUBREG, REG, CONST_INT}}, \
|
||||
{ "gr_reg_or_5bit_operand", {SUBREG, REG, CONST_INT, CONSTANT_P_RTX}}, \
|
||||
{ "gr_reg_or_6bit_operand", {SUBREG, REG, CONST_INT, CONSTANT_P_RTX}}, \
|
||||
{ "gr_reg_or_8bit_operand", {SUBREG, REG, CONST_INT, CONSTANT_P_RTX}}, \
|
||||
{ "grfr_reg_or_8bit_operand", {SUBREG, REG, CONST_INT, CONSTANT_P_RTX}}, \
|
||||
{ "gr_reg_or_8bit_adjusted_operand", {SUBREG, REG, CONST_INT, \
|
||||
CONSTANT_P_RTX}}, \
|
||||
{ "gr_reg_or_8bit_and_adjusted_operand", {SUBREG, REG, CONST_INT, \
|
||||
CONSTANT_P_RTX}}, \
|
||||
{ "gr_reg_or_14bit_operand", {SUBREG, REG, CONST_INT, CONSTANT_P_RTX}}, \
|
||||
{ "gr_reg_or_22bit_operand", {SUBREG, REG, CONST_INT, CONSTANT_P_RTX}}, \
|
||||
{ "shift_count_operand", {SUBREG, REG, CONST_INT, CONSTANT_P_RTX}}, \
|
||||
{ "shift_32bit_count_operand", {SUBREG, REG, CONST_INT, \
|
||||
CONSTANT_P_RTX}}, \
|
||||
{ "gr_reg_or_5bit_operand", {SUBREG, REG, CONST_INT}}, \
|
||||
{ "gr_reg_or_6bit_operand", {SUBREG, REG, CONST_INT}}, \
|
||||
{ "gr_reg_or_8bit_operand", {SUBREG, REG, CONST_INT}}, \
|
||||
{ "grfr_reg_or_8bit_operand", {SUBREG, REG, CONST_INT}}, \
|
||||
{ "gr_reg_or_8bit_adjusted_operand", {SUBREG, REG, CONST_INT}}, \
|
||||
{ "gr_reg_or_8bit_and_adjusted_operand", {SUBREG, REG, CONST_INT}}, \
|
||||
{ "gr_reg_or_14bit_operand", {SUBREG, REG, CONST_INT}}, \
|
||||
{ "gr_reg_or_22bit_operand", {SUBREG, REG, CONST_INT}}, \
|
||||
{ "shift_count_operand", {SUBREG, REG, CONST_INT}}, \
|
||||
{ "shift_32bit_count_operand", {SUBREG, REG, CONST_INT}}, \
|
||||
{ "shladd_operand", {CONST_INT}}, \
|
||||
{ "fetchadd_operand", {CONST_INT}}, \
|
||||
{ "fr_reg_or_fp01_operand", {SUBREG, REG, CONST_DOUBLE}}, \
|
||||
|
@ -767,9 +767,6 @@ do { \
|
||||
|
||||
#define FUNCTION_MODE HImode
|
||||
|
||||
#define INTEGRATE_THRESHOLD(DECL) \
|
||||
(1 + (3 * list_length (DECL_ARGUMENTS (DECL)) / 2))
|
||||
|
||||
#define DOLLARS_IN_IDENTIFIERS 0
|
||||
|
||||
extern int ip2k_reorg_in_progress;
|
||||
|
@ -771,8 +771,6 @@ move_src_operand (rtx op, enum machine_mode mode)
|
||||
}
|
||||
else
|
||||
return 1;
|
||||
case CONSTANT_P_RTX:
|
||||
return 1;
|
||||
case CONST_DOUBLE :
|
||||
if (mode == SFmode)
|
||||
return 1;
|
||||
|
@ -1277,9 +1277,6 @@ mips_const_insns (rtx x)
|
||||
|
||||
switch (GET_CODE (x))
|
||||
{
|
||||
case CONSTANT_P_RTX:
|
||||
return 1;
|
||||
|
||||
case HIGH:
|
||||
if (TARGET_MIPS16
|
||||
|| !mips_symbolic_constant_p (XEXP (x, 0), &symbol_type)
|
||||
|
@ -1008,7 +1008,6 @@ mmix_constant_address_p (rtx x)
|
||||
case SYMBOL_REF:
|
||||
return 1;
|
||||
|
||||
case CONSTANT_P_RTX:
|
||||
case HIGH:
|
||||
/* FIXME: Don't know how to dissect these. Avoid them for now,
|
||||
except we know they're constants. */
|
||||
|
@ -592,9 +592,6 @@ move_src_operand (rtx op, enum machine_mode mode)
|
||||
if (register_operand (op, mode))
|
||||
return 1;
|
||||
|
||||
if (GET_CODE (op) == CONSTANT_P_RTX)
|
||||
return 1;
|
||||
|
||||
if (GET_CODE (op) == CONST_INT)
|
||||
return cint_ok_for_move (INTVAL (op));
|
||||
|
||||
|
@ -1987,7 +1987,7 @@ do { \
|
||||
#define PREDICATE_CODES \
|
||||
{"reg_or_0_operand", {SUBREG, REG, CONST_INT, CONST_DOUBLE}}, \
|
||||
{"call_operand_address", {LABEL_REF, SYMBOL_REF, CONST_INT, \
|
||||
CONST_DOUBLE, CONST, HIGH, CONSTANT_P_RTX}}, \
|
||||
CONST_DOUBLE, CONST, HIGH}}, \
|
||||
{"indexed_memory_operand", {SUBREG, MEM}}, \
|
||||
{"symbolic_operand", {SYMBOL_REF, LABEL_REF, CONST}}, \
|
||||
{"symbolic_memory_operand", {SUBREG, MEM}}, \
|
||||
@ -1995,7 +1995,7 @@ do { \
|
||||
{"reg_or_0_or_nonsymb_mem_operand", {SUBREG, REG, MEM, CONST_INT, \
|
||||
CONST_DOUBLE}}, \
|
||||
{"move_dest_operand", {SUBREG, REG, MEM}}, \
|
||||
{"move_src_operand", {SUBREG, REG, CONSTANT_P_RTX, CONST_INT, MEM}}, \
|
||||
{"move_src_operand", {SUBREG, REG, CONST_INT, MEM}}, \
|
||||
{"reg_or_cint_move_operand", {SUBREG, REG, CONST_INT}}, \
|
||||
{"pic_label_operand", {LABEL_REF, CONST}}, \
|
||||
{"fp_reg_operand", {REG}}, \
|
||||
|
@ -51,12 +51,37 @@
|
||||
#define REAL_NM_FILE_NAME "/usr/ucb/nm"
|
||||
|
||||
#define USER_LABEL_PREFIX ""
|
||||
|
||||
/* Don't turn -B into -L if the argument specifies a relative file name. */
|
||||
#define RELATIVE_PREFIX_NOT_LINKDIR
|
||||
|
||||
/* Because of the above, we must have gcc search itself to find libgcc.a. */
|
||||
#define LINK_LIBGCC_SPECIAL_1
|
||||
|
||||
#define MFWRAP_SPEC " %{static: %{fmudflap|fmudflapth: \
|
||||
-brename:malloc,__wrap_malloc -brename:__real_malloc,malloc \
|
||||
-brename:free,__wrap_free -brename:__real_free,free \
|
||||
-brename:calloc,__wrap_calloc -brename:__real_calloc,calloc \
|
||||
-brename:realloc,__wrap_realloc -brename:__real_realloc,realloc \
|
||||
-brename:mmap,__wrap_mmap -brename:__real_mmap,mmap \
|
||||
-brename:munmap,__wrap_munmap -brename:__real_munmap,munmap \
|
||||
-brename:alloca,__wrap_alloca -brename:__real_alloca,alloca \
|
||||
} %{fmudflapth: \
|
||||
-brename:pthread_create,__wrap_pthread_create \
|
||||
-brename:__real_pthread_create,pthread_create \
|
||||
-brename:pthread_join,__wrap_pthread_join \
|
||||
-brename:__real_pthread_join,pthread_join \
|
||||
-brename:pthread_exit,__wrap_pthread_exit \
|
||||
-brename:__real_pthread_exit,pthread_exit \
|
||||
}} %{fmudflap|fmudflapth: \
|
||||
-brename:main,__wrap_main -brename:__real_main,main \
|
||||
}"
|
||||
|
||||
#define MFLIB_SPEC " %{fmudflap: -lmudflap \
|
||||
%{static:%(link_gcc_c_sequence) -lmudflap}} \
|
||||
%{fmudflapth: -lmudflapth -lpthread \
|
||||
%{static:%(link_gcc_c_sequence) -lmudflapth}} "
|
||||
|
||||
/* Names to predefine in the preprocessor for this target machine. */
|
||||
#define TARGET_OS_AIX_CPP_BUILTINS() \
|
||||
do \
|
||||
|
@ -2419,10 +2419,6 @@ input_operand (rtx op, enum machine_mode mode)
|
||||
if (memory_operand (op, mode))
|
||||
return 1;
|
||||
|
||||
/* Only a tiny bit of handling for CONSTANT_P_RTX is necessary. */
|
||||
if (GET_CODE (op) == CONSTANT_P_RTX)
|
||||
return 1;
|
||||
|
||||
/* For floating-point, easy constants are valid. */
|
||||
if (GET_MODE_CLASS (mode) == MODE_FLOAT
|
||||
&& CONSTANT_P (op)
|
||||
@ -3753,10 +3749,6 @@ rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
|
||||
|| ! nonimmediate_operand (operands[0], mode)))
|
||||
goto emit_set;
|
||||
|
||||
/* Handle the case of CONSTANT_P_RTX. */
|
||||
if (GET_CODE (operands[1]) == CONSTANT_P_RTX)
|
||||
goto emit_set;
|
||||
|
||||
/* 128-bit constant floating-point values on Darwin should really be
|
||||
loaded as two parts. */
|
||||
if ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
|
||||
@ -13125,7 +13117,8 @@ rs6000_output_function_epilogue (FILE *file,
|
||||
Java is 13. Objective-C is 14. */
|
||||
if (! strcmp (language_string, "GNU C"))
|
||||
i = 0;
|
||||
else if (! strcmp (language_string, "GNU F77"))
|
||||
else if (! strcmp (language_string, "GNU F77")
|
||||
|| ! strcmp (language_string, "GNU F95"))
|
||||
i = 1;
|
||||
else if (! strcmp (language_string, "GNU Pascal"))
|
||||
i = 2;
|
||||
@ -14120,7 +14113,7 @@ output_function_profiler (FILE *file, int labelno)
|
||||
asm_fprintf (file, "\tmflr %s\n", reg_names[0]);
|
||||
asm_fprintf (file, "\tstd %s,16(%s)\n", reg_names[0], reg_names[1]);
|
||||
|
||||
if (current_function_needs_context)
|
||||
if (cfun->static_chain_decl != NULL)
|
||||
{
|
||||
asm_fprintf (file, "\tstd %s,24(%s)\n",
|
||||
reg_names[STATIC_CHAIN_REGNUM], reg_names[1]);
|
||||
|
@ -18,3 +18,23 @@ rs6000-c.o: $(srcdir)/config/rs6000/rs6000-c.c \
|
||||
|
||||
# The rs6000 backend doesn't cause warnings in these files.
|
||||
insn-conditions.o-warn =
|
||||
# The files below trigger warnings in tree-ssa because of the gimplifier
|
||||
# emitting code that confuse the compiler into thinking that some variables
|
||||
# are used uninitialized.
|
||||
jump.o-warn = -Wno-error
|
||||
regmove.o-warn = -Wno-error
|
||||
c-typeck.o-warn = -Wno-error
|
||||
cfgrtl.o-warn = -Wno-error
|
||||
combine.o-warn = -Wno-error
|
||||
fold-const.o-warn = -Wno-error
|
||||
ifcvt.o-warn = -Wno-error
|
||||
reload1.o-warn = -Wno-error
|
||||
rtlanal.o-warn = -Wno-error
|
||||
cp/decl2.o-warn = -Wno-error
|
||||
cp/pt.o-warn = -Wno-error
|
||||
f/where.o-warn = -Wno-error
|
||||
java/expr.o-warn = -Wno-error
|
||||
objc/objc-act.o-warn = -Wno-error
|
||||
rs6000.o-warn = -Wno-error
|
||||
insn-emit.o-warn = -Wno-error
|
||||
simplify-rtx.o-warn = -Wno-error
|
||||
|
@ -2956,18 +2956,14 @@ s390_expand_movstr (rtx dst, rtx src, rtx len)
|
||||
else
|
||||
{
|
||||
rtx dst_addr, src_addr, count, blocks, temp;
|
||||
rtx loop_end_label = gen_label_rtx ();
|
||||
rtx end_label = gen_label_rtx ();
|
||||
enum machine_mode mode;
|
||||
tree type;
|
||||
|
||||
mode = GET_MODE (len);
|
||||
if (mode == VOIDmode)
|
||||
mode = Pmode;
|
||||
|
||||
type = lang_hooks.types.type_for_mode (mode, 1);
|
||||
if (!type)
|
||||
abort ();
|
||||
|
||||
dst_addr = gen_reg_rtx (Pmode);
|
||||
src_addr = gen_reg_rtx (Pmode);
|
||||
count = gen_reg_rtx (mode);
|
||||
@ -2990,10 +2986,9 @@ s390_expand_movstr (rtx dst, rtx src, rtx len)
|
||||
if (temp != blocks)
|
||||
emit_move_insn (blocks, temp);
|
||||
|
||||
emit_cmp_and_jump_insns (blocks, const0_rtx,
|
||||
EQ, NULL_RTX, mode, 1, loop_end_label);
|
||||
expand_start_loop (1);
|
||||
expand_exit_loop_top_cond (0, build (NE_EXPR, type,
|
||||
make_tree (type, blocks),
|
||||
make_tree (type, const0_rtx)));
|
||||
|
||||
emit_insn (gen_movstr_short (dst, src, GEN_INT (255)));
|
||||
s390_load_address (dst_addr,
|
||||
@ -3005,7 +3000,10 @@ s390_expand_movstr (rtx dst, rtx src, rtx len)
|
||||
if (temp != blocks)
|
||||
emit_move_insn (blocks, temp);
|
||||
|
||||
emit_cmp_and_jump_insns (blocks, const0_rtx,
|
||||
EQ, NULL_RTX, mode, 1, loop_end_label);
|
||||
expand_end_loop ();
|
||||
emit_label (loop_end_label);
|
||||
|
||||
emit_insn (gen_movstr_short (dst, src,
|
||||
convert_to_mode (Pmode, count, 1)));
|
||||
@ -3032,18 +3030,14 @@ s390_expand_clrstr (rtx dst, rtx len)
|
||||
else
|
||||
{
|
||||
rtx dst_addr, src_addr, count, blocks, temp;
|
||||
rtx loop_end_label = gen_label_rtx ();
|
||||
rtx end_label = gen_label_rtx ();
|
||||
enum machine_mode mode;
|
||||
tree type;
|
||||
|
||||
mode = GET_MODE (len);
|
||||
if (mode == VOIDmode)
|
||||
mode = Pmode;
|
||||
|
||||
type = lang_hooks.types.type_for_mode (mode, 1);
|
||||
if (!type)
|
||||
abort ();
|
||||
|
||||
dst_addr = gen_reg_rtx (Pmode);
|
||||
src_addr = gen_reg_rtx (Pmode);
|
||||
count = gen_reg_rtx (mode);
|
||||
@ -3064,10 +3058,9 @@ s390_expand_clrstr (rtx dst, rtx len)
|
||||
if (temp != blocks)
|
||||
emit_move_insn (blocks, temp);
|
||||
|
||||
emit_cmp_and_jump_insns (blocks, const0_rtx,
|
||||
EQ, NULL_RTX, mode, 1, loop_end_label);
|
||||
expand_start_loop (1);
|
||||
expand_exit_loop_top_cond (0, build (NE_EXPR, type,
|
||||
make_tree (type, blocks),
|
||||
make_tree (type, const0_rtx)));
|
||||
|
||||
emit_insn (gen_clrstr_short (dst, GEN_INT (255)));
|
||||
s390_load_address (dst_addr,
|
||||
@ -3077,7 +3070,10 @@ s390_expand_clrstr (rtx dst, rtx len)
|
||||
if (temp != blocks)
|
||||
emit_move_insn (blocks, temp);
|
||||
|
||||
emit_cmp_and_jump_insns (blocks, const0_rtx,
|
||||
EQ, NULL_RTX, mode, 1, loop_end_label);
|
||||
expand_end_loop ();
|
||||
emit_label (loop_end_label);
|
||||
|
||||
emit_insn (gen_clrstr_short (dst, convert_to_mode (Pmode, count, 1)));
|
||||
emit_label (end_label);
|
||||
@ -3120,18 +3116,14 @@ s390_expand_cmpmem (rtx target, rtx op0, rtx op1, rtx len)
|
||||
else
|
||||
{
|
||||
rtx addr0, addr1, count, blocks, temp;
|
||||
rtx loop_end_label = gen_label_rtx ();
|
||||
rtx end_label = gen_label_rtx ();
|
||||
enum machine_mode mode;
|
||||
tree type;
|
||||
|
||||
mode = GET_MODE (len);
|
||||
if (mode == VOIDmode)
|
||||
mode = Pmode;
|
||||
|
||||
type = lang_hooks.types.type_for_mode (mode, 1);
|
||||
if (!type)
|
||||
abort ();
|
||||
|
||||
addr0 = gen_reg_rtx (Pmode);
|
||||
addr1 = gen_reg_rtx (Pmode);
|
||||
count = gen_reg_rtx (mode);
|
||||
@ -3154,10 +3146,9 @@ s390_expand_cmpmem (rtx target, rtx op0, rtx op1, rtx len)
|
||||
if (temp != blocks)
|
||||
emit_move_insn (blocks, temp);
|
||||
|
||||
emit_cmp_and_jump_insns (blocks, const0_rtx,
|
||||
EQ, NULL_RTX, mode, 1, loop_end_label);
|
||||
expand_start_loop (1);
|
||||
expand_exit_loop_top_cond (0, build (NE_EXPR, type,
|
||||
make_tree (type, blocks),
|
||||
make_tree (type, const0_rtx)));
|
||||
|
||||
emit_insn (gen_cmpmem_short (op0, op1, GEN_INT (255)));
|
||||
temp = gen_rtx_NE (VOIDmode, gen_rtx_REG (CCSmode, 33), const0_rtx);
|
||||
@ -3175,7 +3166,10 @@ s390_expand_cmpmem (rtx target, rtx op0, rtx op1, rtx len)
|
||||
if (temp != blocks)
|
||||
emit_move_insn (blocks, temp);
|
||||
|
||||
emit_cmp_and_jump_insns (blocks, const0_rtx,
|
||||
EQ, NULL_RTX, mode, 1, loop_end_label);
|
||||
expand_end_loop ();
|
||||
emit_label (loop_end_label);
|
||||
|
||||
emit_insn (gen_cmpmem_short (op0, op1,
|
||||
convert_to_mode (Pmode, count, 1)));
|
||||
|
@ -4704,7 +4704,7 @@ output_stack_adjust (int size, rtx reg, int epilogue_p,
|
||||
for (i = FIRST_PARM_REG;
|
||||
i < FIRST_PARM_REG + NPARM_REGS (SImode); i++)
|
||||
CLEAR_HARD_REG_BIT (temps, i);
|
||||
if (current_function_needs_context)
|
||||
if (cfun->static_chain_decl != NULL)
|
||||
CLEAR_HARD_REG_BIT (temps, STATIC_CHAIN_REGNUM);
|
||||
}
|
||||
temp = scavenge_reg (&temps);
|
||||
@ -5161,7 +5161,7 @@ sh5_schedule_saves (HARD_REG_SET *live_regs_mask, save_schedule *schedule,
|
||||
if (call_used_regs[i] && ! fixed_regs[i] && i != PR_MEDIA_REG
|
||||
&& ! FUNCTION_ARG_REGNO_P (i)
|
||||
&& i != FIRST_RET_REG
|
||||
&& ! (current_function_needs_context && i == STATIC_CHAIN_REGNUM)
|
||||
&& ! (cfun->static_chain_decl != NULL && i == STATIC_CHAIN_REGNUM)
|
||||
&& ! (current_function_calls_eh_return
|
||||
&& (i == EH_RETURN_STACKADJ_REGNO
|
||||
|| ((unsigned) i <= EH_RETURN_DATA_REGNO (0)
|
||||
|
@ -1280,10 +1280,6 @@ input_operand (rtx op, enum machine_mode mode)
|
||||
if (mode != VOIDmode && GET_MODE (op) != VOIDmode && mode != GET_MODE (op))
|
||||
return 0;
|
||||
|
||||
/* Accept CONSTANT_P_RTX, since it will be gone by CSE1 and result in 0/1. */
|
||||
if (GET_CODE (op) == CONSTANT_P_RTX)
|
||||
return 1;
|
||||
|
||||
/* Allow any one instruction integer constant, and all CONST_INT
|
||||
variants when we are working in DImode and !arch64. */
|
||||
if (GET_MODE_CLASS (mode) == MODE_INT
|
||||
|
@ -1136,7 +1136,6 @@ movsi_source_operand (rtx op, enum machine_mode mode)
|
||||
must be done with HIGH & LO_SUM patterns. */
|
||||
if (CONSTANT_P (op)
|
||||
&& GET_CODE (op) != HIGH
|
||||
&& GET_CODE (op) != CONSTANT_P_RTX
|
||||
&& !(GET_CODE (op) == CONST_INT
|
||||
&& (CONST_OK_FOR_J (INTVAL (op))
|
||||
|| CONST_OK_FOR_K (INTVAL (op))
|
||||
|
@ -627,11 +627,6 @@ move_operand (rtx op, enum machine_mode mode)
|
||||
|
||||
case HImode:
|
||||
case QImode:
|
||||
/* Accept CONSTANT_P_RTX, since it will be gone by CSE1 and
|
||||
result in 0/1. */
|
||||
if (GET_CODE (op) == CONSTANT_P_RTX)
|
||||
return TRUE;
|
||||
|
||||
if (GET_CODE (op) == CONST_INT && xtensa_simm12b (INTVAL (op)))
|
||||
return TRUE;
|
||||
break;
|
||||
@ -1252,7 +1247,6 @@ int
|
||||
xtensa_emit_move_sequence (rtx *operands, enum machine_mode mode)
|
||||
{
|
||||
if (CONSTANT_P (operands[1])
|
||||
&& GET_CODE (operands[1]) != CONSTANT_P_RTX
|
||||
&& (GET_CODE (operands[1]) != CONST_INT
|
||||
|| !xtensa_simm12b (INTVAL (operands[1]))))
|
||||
{
|
||||
@ -2229,7 +2223,7 @@ long
|
||||
compute_frame_size (int size)
|
||||
{
|
||||
/* Add space for the incoming static chain value. */
|
||||
if (current_function_needs_context)
|
||||
if (cfun->static_chain_decl != NULL)
|
||||
size += (1 * UNITS_PER_WORD);
|
||||
|
||||
xtensa_current_frame_size =
|
||||
|
69
gcc/configure
vendored
69
gcc/configure
vendored
@ -309,7 +309,7 @@ ac_includes_default="\
|
||||
# include <unistd.h>
|
||||
#endif"
|
||||
|
||||
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os build_subdir host_subdir target_subdir GENINSRC CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT NO_MINUS_C_MINUS_O OUTPUT_OPTION CPP strict1_warn warn_cflags WERROR nocommon_flag EGREP valgrind_path valgrind_path_defines valgrind_command coverage_flags enable_multilib enable_shared TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE CROSS_SYSTEM_HEADER_DIR onestep SET_MAKE AWK LN LN_S RANLIB ac_ct_RANLIB INSTALL INSTALL_PROGRAM INSTALL_DATA make_compare_target have_mktemp_command MAKEINFO BUILD_INFO GENERATED_MANPAGES FLEX BISON stage1_cflags COLLECT2_LIBS GNAT_LIBEXC LDEXP_LIB TARGET_GETGROUPS_T LIBICONV LIBICONV_DEP manext objext gthread_flags extra_modes_file FORBUILD PACKAGE VERSION USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS CROSS ALL SYSTEM_HEADER_DIR inhibit_libc BUILD_PREFIX BUILD_PREFIX_1 CC_FOR_BUILD BUILD_CFLAGS STMP_FIXINC STMP_FIXPROTO collect2 libgcc_visibility GGC zlibdir zlibinc MAINT gcc_tooldir dollar slibdir objdir subdirs srcdir all_boot_languages all_compilers all_gtfiles all_gtfiles_files_langs all_gtfiles_files_files all_lang_makefrags all_lang_makefiles all_languages all_stagestuff build_exeext build_install_headers_dir build_xm_file_list build_xm_include_list build_xm_defines check_languages cc_set_by_configure quoted_cc_set_by_configure cpp_install_dir xmake_file tmake_file extra_gcc_objs extra_headers_list extra_objs extra_parts extra_passes extra_programs float_h_file gcc_config_arguments gcc_gxx_include_dir libstdcxx_incdir gcc_version gcc_version_full gcc_version_trigger host_exeext host_xm_file_list host_xm_include_list host_xm_defines out_host_hook_obj install lang_opt_files lang_specs_files lang_tree_files local_prefix md_file objc_boehm_gc out_file out_object_file stage_prefix_set_by_configure quoted_stage_prefix_set_by_configure symbolic_link thread_file tm_file_list tm_include_list tm_defines tm_p_file_list tm_p_include_list xm_file_list xm_include_list xm_defines target_noncanonical c_target_objs cxx_target_objs target_cpu_default LIBOBJS LTLIBOBJS'
|
||||
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os build_subdir host_subdir target_subdir GENINSRC CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT NO_MINUS_C_MINUS_O OUTPUT_OPTION CPP strict1_warn warn_cflags WERROR nocommon_flag EGREP valgrind_path valgrind_path_defines valgrind_command coverage_flags TREEBROWSER enable_multilib enable_shared TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE CROSS_SYSTEM_HEADER_DIR onestep SET_MAKE AWK LN LN_S RANLIB ac_ct_RANLIB INSTALL INSTALL_PROGRAM INSTALL_DATA make_compare_target have_mktemp_command MAKEINFO BUILD_INFO GENERATED_MANPAGES FLEX BISON stage1_cflags COLLECT2_LIBS GNAT_LIBEXC LDEXP_LIB TARGET_GETGROUPS_T LIBICONV LIBICONV_DEP manext objext gthread_flags extra_modes_file FORBUILD PACKAGE VERSION USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS CROSS ALL SYSTEM_HEADER_DIR inhibit_libc BUILD_PREFIX BUILD_PREFIX_1 CC_FOR_BUILD BUILD_CFLAGS STMP_FIXINC STMP_FIXPROTO collect2 libgcc_visibility GGC zlibdir zlibinc MAINT ANDER BANSHEEINC BANSHEELIB gcc_tooldir dollar slibdir objdir subdirs srcdir all_boot_languages all_compilers all_gtfiles all_gtfiles_files_langs all_gtfiles_files_files all_lang_makefrags all_lang_makefiles all_languages all_stagestuff build_exeext build_install_headers_dir build_xm_file_list build_xm_include_list build_xm_defines check_languages cc_set_by_configure quoted_cc_set_by_configure cpp_install_dir xmake_file tmake_file extra_gcc_objs extra_headers_list extra_objs extra_parts extra_passes extra_programs float_h_file gcc_config_arguments gcc_gxx_include_dir libstdcxx_incdir gcc_version gcc_version_full gcc_version_trigger host_exeext host_xm_file_list host_xm_include_list host_xm_defines out_host_hook_obj install lang_opt_files lang_specs_files lang_tree_files local_prefix md_file objc_boehm_gc out_file out_object_file stage_prefix_set_by_configure quoted_stage_prefix_set_by_configure symbolic_link thread_file tm_file_list tm_include_list tm_defines tm_p_file_list tm_p_include_list xm_file_list xm_include_list xm_defines target_noncanonical c_target_objs cxx_target_objs target_cpu_default GMPLIBS GMPINC LIBOBJS LTLIBOBJS'
|
||||
ac_subst_files='language_hooks'
|
||||
|
||||
# Initialize some variables set by options.
|
||||
@ -770,6 +770,14 @@ ac_env_CPP_set=${CPP+set}
|
||||
ac_env_CPP_value=$CPP
|
||||
ac_cv_env_CPP_set=${CPP+set}
|
||||
ac_cv_env_CPP_value=$CPP
|
||||
ac_env_GMPLIBS_set=${GMPLIBS+set}
|
||||
ac_env_GMPLIBS_value=$GMPLIBS
|
||||
ac_cv_env_GMPLIBS_set=${GMPLIBS+set}
|
||||
ac_cv_env_GMPLIBS_value=$GMPLIBS
|
||||
ac_env_GMPINC_set=${GMPINC+set}
|
||||
ac_env_GMPINC_value=$GMPINC
|
||||
ac_cv_env_GMPINC_set=${GMPINC+set}
|
||||
ac_cv_env_GMPINC_value=$GMPINC
|
||||
|
||||
#
|
||||
# Report the --help message.
|
||||
@ -868,6 +876,7 @@ Optional Features:
|
||||
optimization. Values are opt, noopt,
|
||||
default is noopt
|
||||
--enable-gather-detailed-mem-stats enable detailed memory allocation stats gathering
|
||||
--enable-tree-browser enable the tree browsing routines for debugging
|
||||
--enable-multilib enable library support for multiple ABIs
|
||||
--enable-__cxa_atexit enable __cxa_atexit for C++
|
||||
--enable-threads enable thread usage for target GCC
|
||||
@ -915,6 +924,7 @@ Optional Packages:
|
||||
--with-gc={page,zone} choose the garbage collection mechanism to use
|
||||
with the compiler
|
||||
--with-system-zlib use installed libz
|
||||
--with-libbanshee enable libbanshee
|
||||
--with-slibdir=DIR shared libraries in DIR LIBDIR
|
||||
|
||||
Some influential environment variables:
|
||||
@ -925,6 +935,8 @@ Some influential environment variables:
|
||||
CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
|
||||
headers in a nonstandard directory <include dir>
|
||||
CPP C preprocessor
|
||||
GMPLIBS How to link GMP
|
||||
GMPINC How to find GMP include files
|
||||
|
||||
Use these variables to override the choices made by `configure' or to help
|
||||
it to find libraries and programs with nonstandard names/locations.
|
||||
@ -4673,6 +4685,18 @@ _ACEOF
|
||||
|
||||
fi
|
||||
|
||||
# Check whether --enable-tree-browser or --disable-tree-browser was given.
|
||||
if test "${enable_tree_browser+set}" = set; then
|
||||
enableval="$enable_tree_browser"
|
||||
|
||||
else
|
||||
enable_tree_browser=no
|
||||
fi;
|
||||
if test x$enable_tree_browser = xyes ; then
|
||||
TREEBROWSER=tree-browser.o
|
||||
fi
|
||||
|
||||
|
||||
# -------------------------------
|
||||
# Miscenalleous configure options
|
||||
# -------------------------------
|
||||
@ -5283,7 +5307,7 @@ if test "${gcc_cv_prog_makeinfo_modern+set}" = set; then
|
||||
else
|
||||
ac_prog_version=`$MAKEINFO --version 2>&1 |
|
||||
sed -n 's/^.*GNU texinfo.* \([0-9][0-9.]*\).*$/\1/p'`
|
||||
echo "configure:5286: version of makeinfo is $ac_prog_version" >&5
|
||||
echo "configure:5310: version of makeinfo is $ac_prog_version" >&5
|
||||
case $ac_prog_version in
|
||||
'') gcc_cv_prog_makeinfo_modern=no;;
|
||||
4.[2-9]*)
|
||||
@ -12131,6 +12155,38 @@ else
|
||||
MAINT='#'
|
||||
fi
|
||||
|
||||
echo "$as_me:$LINENO: checking whether to use libbanshee for points-to alias analysis" >&5
|
||||
echo $ECHO_N "checking whether to use libbanshee for points-to alias analysis... $ECHO_C" >&6
|
||||
|
||||
# Check whether --with-libbanshee or --without-libbanshee was given.
|
||||
if test "${with_libbanshee+set}" = set; then
|
||||
withval="$with_libbanshee"
|
||||
libbanshee="$with_libbanshee"
|
||||
else
|
||||
libbanshee=no
|
||||
fi;
|
||||
|
||||
if test x"$libbanshee" = xyes; then
|
||||
BANSHEELIB="../libbanshee/points-to/libandersen.a ../libbanshee/engine/libbansheeengine.a ../libbanshee/libcompat/libbansheecompat.a "
|
||||
BANSHEEINC="-I\$(srcdir)/../libbanshee/libcompat -I\$(srcdir)/../libbanshee -I\$(srcdir)/../libbanshee/points-to"
|
||||
ANDER="tree-alias-ander.o"
|
||||
|
||||
cat >>confdefs.h <<\_ACEOF
|
||||
#define HAVE_BANSHEE 1
|
||||
_ACEOF
|
||||
|
||||
else
|
||||
BANSHEELIB=""
|
||||
BANSHEEINC=""
|
||||
ANDER=""
|
||||
fi
|
||||
echo "$as_me:$LINENO: result: $with_libbanshee" >&5
|
||||
echo "${ECHO_T}$with_libbanshee" >&6
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# --------------
|
||||
# Language hooks
|
||||
# --------------
|
||||
@ -12430,6 +12486,9 @@ else
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
# Configure the subdirectories
|
||||
# AC_CONFIG_SUBDIRS($subdirs)
|
||||
|
||||
@ -13099,6 +13158,7 @@ s,@valgrind_path@,$valgrind_path,;t t
|
||||
s,@valgrind_path_defines@,$valgrind_path_defines,;t t
|
||||
s,@valgrind_command@,$valgrind_command,;t t
|
||||
s,@coverage_flags@,$coverage_flags,;t t
|
||||
s,@TREEBROWSER@,$TREEBROWSER,;t t
|
||||
s,@enable_multilib@,$enable_multilib,;t t
|
||||
s,@enable_shared@,$enable_shared,;t t
|
||||
s,@TARGET_SYSTEM_ROOT@,$TARGET_SYSTEM_ROOT,;t t
|
||||
@ -13159,6 +13219,9 @@ s,@GGC@,$GGC,;t t
|
||||
s,@zlibdir@,$zlibdir,;t t
|
||||
s,@zlibinc@,$zlibinc,;t t
|
||||
s,@MAINT@,$MAINT,;t t
|
||||
s,@ANDER@,$ANDER,;t t
|
||||
s,@BANSHEEINC@,$BANSHEEINC,;t t
|
||||
s,@BANSHEELIB@,$BANSHEELIB,;t t
|
||||
s,@gcc_tooldir@,$gcc_tooldir,;t t
|
||||
s,@dollar@,$dollar,;t t
|
||||
s,@slibdir@,$slibdir,;t t
|
||||
@ -13228,6 +13291,8 @@ s,@target_noncanonical@,$target_noncanonical,;t t
|
||||
s,@c_target_objs@,$c_target_objs,;t t
|
||||
s,@cxx_target_objs@,$cxx_target_objs,;t t
|
||||
s,@target_cpu_default@,$target_cpu_default,;t t
|
||||
s,@GMPLIBS@,$GMPLIBS,;t t
|
||||
s,@GMPINC@,$GMPINC,;t t
|
||||
s,@LIBOBJS@,$LIBOBJS,;t t
|
||||
s,@LTLIBOBJS@,$LTLIBOBJS,;t t
|
||||
/@language_hooks@/r $language_hooks
|
||||
|
@ -544,6 +544,14 @@ if test x$enable_gather_detailed_mem_stats = xyes ; then
|
||||
[Define to enable detailed memory allocation stats gathering.])
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(tree-browser,
|
||||
[ --enable-tree-browser enable the tree browsing routines for debugging], [],
|
||||
[enable_tree_browser=no])
|
||||
if test x$enable_tree_browser = xyes ; then
|
||||
TREEBROWSER=tree-browser.o
|
||||
fi
|
||||
AC_SUBST(TREEBROWSER)
|
||||
|
||||
# -------------------------------
|
||||
# Miscenalleous configure options
|
||||
# -------------------------------
|
||||
@ -2847,6 +2855,28 @@ else
|
||||
fi
|
||||
AC_SUBST(MAINT)dnl
|
||||
|
||||
AC_MSG_CHECKING([whether to use libbanshee for points-to alias analysis])
|
||||
AC_ARG_WITH(libbanshee,
|
||||
[ --with-libbanshee enable libbanshee],
|
||||
libbanshee="$with_libbanshee",
|
||||
libbanshee=no)
|
||||
|
||||
if test x"$libbanshee" = xyes; then
|
||||
BANSHEELIB="../libbanshee/points-to/libandersen.a ../libbanshee/engine/libbansheeengine.a ../libbanshee/libcompat/libbansheecompat.a "
|
||||
BANSHEEINC="-I\$(srcdir)/../libbanshee/libcompat -I\$(srcdir)/../libbanshee -I\$(srcdir)/../libbanshee/points-to"
|
||||
ANDER="tree-alias-ander.o"
|
||||
AC_DEFINE(HAVE_BANSHEE, 1, [Define if BANSHEE is available])
|
||||
else
|
||||
BANSHEELIB=""
|
||||
BANSHEEINC=""
|
||||
ANDER=""
|
||||
fi
|
||||
AC_MSG_RESULT($with_libbanshee)
|
||||
|
||||
AC_SUBST(ANDER)
|
||||
AC_SUBST(BANSHEEINC)
|
||||
AC_SUBST(BANSHEELIB)
|
||||
|
||||
# --------------
|
||||
# Language hooks
|
||||
# --------------
|
||||
@ -3143,6 +3173,9 @@ else
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_ARG_VAR(GMPLIBS,[How to link GMP])
|
||||
AC_ARG_VAR(GMPINC,[How to find GMP include files])
|
||||
|
||||
# Configure the subdirectories
|
||||
# AC_CONFIG_SUBDIRS($subdirs)
|
||||
|
||||
|
@ -96,7 +96,11 @@ static char *da_file_name;
|
||||
/* Hash table of count data. */
|
||||
static htab_t counts_hash = NULL;
|
||||
|
||||
/* The names of the counter tables. */
|
||||
/* Trees representing the counter table arrays. */
|
||||
static GTY(()) tree tree_ctr_tables[GCOV_COUNTERS];
|
||||
|
||||
/* The names of the counter tables. Not used if we're
|
||||
generating counters at tree level. */
|
||||
static GTY(()) rtx ctr_labels[GCOV_COUNTERS];
|
||||
|
||||
/* The names of merge functions for counters. */
|
||||
@ -369,14 +373,22 @@ coverage_counter_alloc (unsigned counter, unsigned num)
|
||||
if (!num)
|
||||
return 1;
|
||||
|
||||
if (!ctr_labels[counter])
|
||||
if (!tree_ctr_tables[counter])
|
||||
{
|
||||
/* Generate and save a copy of this so it can be shared. */
|
||||
/* We don't know the size yet; make it big enough that nobody
|
||||
will make any clever transformation on it. */
|
||||
char buf[20];
|
||||
|
||||
tree domain_tree
|
||||
= build_index_type (build_int_2 (1000, 0)); /* replaced later */
|
||||
tree gcov_type_array_type
|
||||
= build_array_type (GCOV_TYPE_NODE, domain_tree);
|
||||
tree_ctr_tables[counter]
|
||||
= build_decl (VAR_DECL, NULL_TREE, gcov_type_array_type);
|
||||
TREE_STATIC (tree_ctr_tables[counter]) = 1;
|
||||
ASM_GENERATE_INTERNAL_LABEL (buf, "LPBX", counter + 1);
|
||||
ctr_labels[counter] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
|
||||
SYMBOL_REF_FLAGS (ctr_labels[counter]) = SYMBOL_FLAG_LOCAL;
|
||||
DECL_NAME (tree_ctr_tables[counter]) = get_identifier (buf);
|
||||
DECL_ALIGN (tree_ctr_tables[counter]) = TYPE_ALIGN (GCOV_TYPE_NODE);
|
||||
}
|
||||
fn_b_ctrs[counter] = fn_n_ctrs[counter];
|
||||
fn_n_ctrs[counter] += num;
|
||||
@ -387,7 +399,7 @@ coverage_counter_alloc (unsigned counter, unsigned num)
|
||||
/* Generate a MEM rtl to access COUNTER NO. */
|
||||
|
||||
rtx
|
||||
coverage_counter_ref (unsigned counter, unsigned no)
|
||||
rtl_coverage_counter_ref (unsigned counter, unsigned no)
|
||||
{
|
||||
unsigned gcov_size = tree_low_cst (TYPE_SIZE (GCOV_TYPE_NODE), 1);
|
||||
enum machine_mode mode = mode_for_size (gcov_size, MODE_INT, 0);
|
||||
@ -396,6 +408,13 @@ coverage_counter_ref (unsigned counter, unsigned no)
|
||||
if (no >= fn_n_ctrs[counter] - fn_b_ctrs[counter])
|
||||
abort ();
|
||||
no += prg_n_ctrs[counter] + fn_b_ctrs[counter];
|
||||
if (!ctr_labels[counter])
|
||||
{
|
||||
ctr_labels[counter] = gen_rtx_SYMBOL_REF (Pmode,
|
||||
ggc_strdup (IDENTIFIER_POINTER (DECL_NAME
|
||||
(tree_ctr_tables[counter]))));
|
||||
SYMBOL_REF_FLAGS (ctr_labels[counter]) = SYMBOL_FLAG_LOCAL;
|
||||
}
|
||||
ref = plus_constant (ctr_labels[counter], gcov_size / BITS_PER_UNIT * no);
|
||||
ref = gen_rtx_MEM (mode, ref);
|
||||
set_mem_alias_set (ref, new_alias_set ());
|
||||
@ -403,6 +422,23 @@ coverage_counter_ref (unsigned counter, unsigned no)
|
||||
|
||||
return ref;
|
||||
}
|
||||
|
||||
/* Generate a tree to access COUNTER NO. */
|
||||
|
||||
tree
|
||||
tree_coverage_counter_ref (unsigned counter, unsigned no)
|
||||
{
|
||||
tree t;
|
||||
|
||||
if (no >= fn_n_ctrs[counter] - fn_b_ctrs[counter])
|
||||
abort ();
|
||||
no += prg_n_ctrs[counter] + fn_b_ctrs[counter];
|
||||
|
||||
/* "no" here is an array index, scaled to bytes later. */
|
||||
t = build (ARRAY_REF, GCOV_TYPE_NODE, tree_ctr_tables[counter],
|
||||
build_int_2 (no, 0));
|
||||
return t;
|
||||
}
|
||||
|
||||
/* Generate a checksum for a string. CHKSUM is the current
|
||||
checksum. */
|
||||
@ -684,19 +720,20 @@ build_ctr_info_value (unsigned int counter, tree type)
|
||||
|
||||
if (prg_n_ctrs[counter])
|
||||
{
|
||||
tree array_type, array;
|
||||
tree array_type;
|
||||
|
||||
array_type = build_index_type (build_int_2 (prg_n_ctrs[counter] - 1, 0));
|
||||
array_type = build_array_type (TREE_TYPE (TREE_TYPE (fields)),
|
||||
array_type);
|
||||
|
||||
array = build_decl (VAR_DECL, NULL_TREE, array_type);
|
||||
TREE_STATIC (array) = 1;
|
||||
DECL_NAME (array) = get_identifier (XSTR (ctr_labels[counter], 0));
|
||||
assemble_variable (array, 0, 0, 0);
|
||||
TREE_TYPE (tree_ctr_tables[counter]) = array_type;
|
||||
DECL_SIZE (tree_ctr_tables[counter]) = TYPE_SIZE (array_type);
|
||||
DECL_SIZE_UNIT (tree_ctr_tables[counter]) = TYPE_SIZE_UNIT (array_type);
|
||||
assemble_variable (tree_ctr_tables[counter], 0, 0, 0);
|
||||
|
||||
value = tree_cons (fields,
|
||||
build1 (ADDR_EXPR, TREE_TYPE (fields), array),
|
||||
build1 (ADDR_EXPR, TREE_TYPE (fields),
|
||||
tree_ctr_tables[counter]),
|
||||
value);
|
||||
}
|
||||
else
|
||||
|
@ -38,7 +38,9 @@ extern int coverage_begin_output (void);
|
||||
/* Allocate some counters. Repeatable per function. */
|
||||
extern int coverage_counter_alloc (unsigned /*counter*/, unsigned/*num*/);
|
||||
/* Use a counter from the most recent allocation. */
|
||||
extern rtx coverage_counter_ref (unsigned /*counter*/, unsigned/*num*/);
|
||||
extern rtx rtl_coverage_counter_ref (unsigned /*counter*/, unsigned/*num*/);
|
||||
/* Use a counter from the most recent allocation. */
|
||||
extern tree tree_coverage_counter_ref (unsigned /*counter*/, unsigned/*num*/);
|
||||
|
||||
/* Get all the counters for the current function. */
|
||||
extern gcov_type *get_coverage_counts (unsigned /*counter*/,
|
||||
|
@ -1,3 +1,16 @@
|
||||
2004-05-13 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
Merge from tree-ssa-20020619-branch. See
|
||||
ChangeLog.tree-ssa for details.
|
||||
|
||||
* Make-lang.in, call.c, class.c, cp-lang.c, cp-tree.def,
|
||||
cp-tree.h, cvt.c, decl.c, decl2.c, error.c, except.c,
|
||||
expr.c, init.c, name-lookup.h, optimize.c, parser.c,
|
||||
pt.c, rtti.c, semantics.c, tree.c, typeck.c, typeck2.c:
|
||||
Merged.
|
||||
* cp-mudflap.c: New file.
|
||||
* cp-simplify.c:: New file.
|
||||
|
||||
2004-05-03 Giovanni Bajo <giovannibajo@gcc.gnu.org>
|
||||
|
||||
PR c++/14389
|
||||
|
566
gcc/cp/ChangeLog.tree-ssa
Normal file
566
gcc/cp/ChangeLog.tree-ssa
Normal file
@ -0,0 +1,566 @@
|
||||
2004-04-19 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* except.c (check_handlers_1): Use locus stored in master for warning.
|
||||
* tree.c (cp_walk_subtrees): Save and restore input_location.
|
||||
|
||||
2004-04-12 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* cp-lang.c (LANG_HOOKS_RTL_EXPAND_START): Remove.
|
||||
(LANG_HOOKS_RTL_EXPAND_STMT): Remove.
|
||||
* semantics.c (cxx_expand_function_start): Remove.
|
||||
|
||||
2004-04-12 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* except.c (check_handlers_1): Use EXPR_LOCUS instead of STMT_LINENO.
|
||||
* semantics.c (finalize_nrv_r): Likewise.
|
||||
* tree.c (cp_walk_subtrees): Likewise.
|
||||
* parser.c (cp_parser_statement): Save and restore entire locus;
|
||||
set EXPR_LOCUS.
|
||||
* pt.c (tsubst_expr): Don't special-case LABEL_STMT.
|
||||
|
||||
2004-04-01 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* name-lookup.c (innermost_nonclass_level): Check for
|
||||
error_mark_node.
|
||||
|
||||
2004-03-25 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* parser.c (cp_parser_class_specifier): Initialize
|
||||
variable 'attributes'.
|
||||
|
||||
2004-03-17 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* cp-lang.c (cxx_types_compatible_p): Use
|
||||
same_type_ignoring_top_level_qualifiers_p.
|
||||
|
||||
2004-03-16 Dale Johannesen <dalej@apple.com>
|
||||
|
||||
* cp-lang.c (cxx_types_compatible_p): New.
|
||||
LANG_HOOKS_TYPES_COMPATIBLE_P: New.
|
||||
|
||||
2004-03-10 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/14452
|
||||
* tree.c (stabilize_init): Return whether or not it worked.
|
||||
* init.c (build_new_1): If not, use a sentry.
|
||||
* cp-tree.h: Adjust prototype.
|
||||
|
||||
2004-03-01 Jeff Law <law@redhat.com>
|
||||
|
||||
* init.c (build_vec_delete_1): Convert 2nd argument to NE_EXPR to
|
||||
the proper type.
|
||||
|
||||
2004-02-24 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/13944
|
||||
* except.c (do_free_exception): Remove #if 0 wrapper.
|
||||
(build_throw): Use it if we elide a copy into the exception object.
|
||||
|
||||
* tree.c (stabilize_call): Fix thinko.
|
||||
|
||||
2004-02-19 Steven Bosscher <stevenb@suse.de>
|
||||
|
||||
* decl.c (poplevel): Don't output nested inline functions.
|
||||
|
||||
2004-02-16 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* call.c (build_call, build_over_call, build_new_method_call): Add
|
||||
static chain operand to call_expr.
|
||||
* decl.c (build_offset_ref_call_from_tree): Likewise.
|
||||
* parser.c (cp_parser_postfix_expression): Likewise.
|
||||
* semantics.c (finish_call_expr): Likewise.
|
||||
* cp-lang.c (cp_expand_decl): Don't declare_nonlocal_label.
|
||||
|
||||
2004-02-09 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* cp-lang.c (LANG_HOOKS_FUNCTION_MISSING_NORETURN_OK_P): New.
|
||||
* cp-tree.h (cp_missing_noreturn_ok_p): Declare.
|
||||
* decl.c (cp_missing_noreturn_ok_p): Export.
|
||||
(cxx_init_decl_processing): Don't set lang_missing_noreturn_ok_p.
|
||||
|
||||
2004-02-06 Andrew Pinski <pinskia@physics.uc.edu>
|
||||
|
||||
PR c/13863
|
||||
* cp-lang.c (LANG_HOOKS_DECL_UNINIT): Remove.
|
||||
|
||||
2004-02-03 Richard Henderson <rth@redhat.com>
|
||||
|
||||
PR middle-end/13325
|
||||
* call.c, cvt.c, init.c, typeck.c: Use TREE_NO_WARNING instead
|
||||
of TREE_NO_UNUSED_WARNING.
|
||||
* cvt.c (convert_to_void): Also use it for "has no effect" warning.
|
||||
|
||||
2004-01-30 Frank Ch. Eigler <fche@redhat.com>
|
||||
|
||||
* cp-mudflap.c (mflang_flush_calls): Mark static ctor as TREE_USED.
|
||||
|
||||
2004-01-12 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* cp-lang.c (ok_to_generate_alias_set_for_type): Remove.
|
||||
(cxx_get_alias_set): Allow all types.
|
||||
|
||||
2004-01-08 Frank Ch. Eigler <fche@redhat.com>
|
||||
|
||||
* cp-mudflap.c (mflang_flush_calls): mf_mark synthetic function.
|
||||
|
||||
2004-01-04 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* call.c (build_over_call): Don't create a save_expr of an
|
||||
aggregate, but rather its address.
|
||||
|
||||
2004-01-01 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* expr.c (cxx_expand_expr): Don't handle THROW_EXPR, or
|
||||
MUST_NOT_THROW_EXPR.
|
||||
* semantics.c (genrtl_try_block, genrtl_eh_spec_block,
|
||||
genrtl_handler, cp_expand_stmt): Remove.
|
||||
(init_cp_semantics): Don't set lang_expand_stmt.
|
||||
|
||||
2003-12-31 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* cp-mudflap.c (mflang_register_call): Remove.
|
||||
|
||||
2003-12-18 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/12453
|
||||
* cp-simplify.c (cp_gimplify_init_expr): Look inside STMT_EXPRs
|
||||
and COMPOUND_EXPRs to find an AGGR_INIT_EXPR.
|
||||
|
||||
2003-12-16 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR middle-end/12920
|
||||
* decl.c (grokdeclarator): Immediately layout an
|
||||
ARRAY_TYPE used in a pointer-to-array declarator.
|
||||
|
||||
2003-12-16 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
Revert until initializers are made language independent:
|
||||
* cp-lang.c (LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR): Kill.
|
||||
* cp-tree.h (cxx_callgraph_analyze_expr): Kill.
|
||||
* decl2.c (cxx_callgraph_analyze_expr): Kill.
|
||||
|
||||
2003-12-14 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* cp-lang.c (LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR): Kill.
|
||||
* cp-tree.h (cxx_callgraph_analyze_expr): Kill.
|
||||
* decl2.c (cxx_callgraph_analyze_expr): Kill.
|
||||
|
||||
2003-11-24 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* Make-lang.in (tree.o, typeck.o): Remove -Wno-error.
|
||||
|
||||
2003-11-20 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* call.c (build_java_interface_fn_ref): Use build_address+convert.
|
||||
* except.c (build_eh_type_type): Likewise.
|
||||
* class.c (build_base_path): Use convert+build_indirect_ref.
|
||||
* init.c (expand_virtual_init): Likewise.
|
||||
* rtti.c (get_tinfo_decl_dynamic): Use convert.
|
||||
|
||||
2003-11-20 Frank Ch. Eigler <fche@redhat.com>
|
||||
|
||||
* cp-mudflap.c (mflang_flush_calls): Adapt to direct expansion of
|
||||
synthetic function, bypassing callgraph code.
|
||||
* cp-decl2.c (finish_file): Call mudflap after callgraph-based
|
||||
expansion.
|
||||
|
||||
2003-11-17 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* init.c (build_new_1): Preevaluate initializer. Simplify EH code.
|
||||
(build_init): Call a constructor rather than call build_aggr_init
|
||||
for classes.
|
||||
* except.c (stabilize_throw_expr): Remove.
|
||||
(build_throw): Use stabilize_init instead of stabilize_throw_expr.
|
||||
* tree.c (stabilize_call, stabilize_init): New fns.
|
||||
* call.c (build_over_call): A constructor no longer returns the
|
||||
address of the object.
|
||||
|
||||
2003-11-16 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* typeck.c (pointer_diff): Remove unused variable.
|
||||
|
||||
2003-11-16 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR optimization/11269
|
||||
* semantics.c (finalize_nrv_r): Rename from nullify_returns_r.
|
||||
Also replace uses of the nrv with our RESULT_DECL.
|
||||
(cxx_expand_function_start): Don't mess with the nrv.
|
||||
(finalize_nrv): New fn.
|
||||
* cp-tree.h: Declare it.
|
||||
* decl.c (finish_function): Call it.
|
||||
* tree.c (cp_copy_res_decl_for_inlining): Don't mess with the nrv.
|
||||
|
||||
2003-11-10 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* cp-simplify.c (gimplify_must_not_throw_expr): Replace add_tree
|
||||
with append_to_statement_list.
|
||||
|
||||
2003-10-30 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* decl.c (pop_switch): Call c_do_switch_warnings.
|
||||
|
||||
2003-10-23 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* cp-simplify.c (cp_gimplify_expr): Return gimplify_status.
|
||||
|
||||
2003-10-16 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* decl.c (finish_function): Don't check flag_disable_gimple.
|
||||
|
||||
2003-10-14 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* decl.c (finish_function): Always gimplify; call c_warn_unused_result.
|
||||
|
||||
2003-10-13 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* pt.c (push_tinst_level): Use annotate_with_locus.
|
||||
|
||||
2003-10-12 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* call.c (call_builtin_trap): Use implicit_built_in_decls.
|
||||
* class.c (build_base_path): Set TREE_INVARIANT.
|
||||
(build_vtbl_ref_1, build_vtbl_initializer): Likewise.
|
||||
* decl.c (build_enumerator): Likewise.
|
||||
* init.c (build_zero_init): Likewise.
|
||||
* pt.c (push_inline_template_parms_recursive): Likewise.
|
||||
(build_template_parm_index, reduce_template_parm_level): Likewise.
|
||||
(process_template_parm): Likewise.
|
||||
* rtti.c (tinfo_base_init, generic_initializer): Likewise.
|
||||
(ptr_initializer, ptm_initializer, class_initializer): Likewise.
|
||||
* typeck.c (build_ptrmemfunc1): Likewise.
|
||||
* typeck2.c (process_init_constructor): Likewise.
|
||||
|
||||
* calls.c (dfs_accumulate_vtbl_inits): Rely on build to set
|
||||
TREE_CONSTANT.
|
||||
(build_vtbl_initializer): Likewise.
|
||||
* init.c (build_vtbl_address): Likewise.
|
||||
* rtti.c (tinfo_base_init): Likewise.
|
||||
* tree.c (make_ptrmem_cst): Likewise.
|
||||
* typeck.c (decay_conversion): Likewise.
|
||||
(get_member_function_from_ptrfunc, build_binary_op): Likewise.
|
||||
(pointer_diff, build_address, build_nop, build_unary_op): Likewise.
|
||||
|
||||
2003-09-30 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* decl.c (finish_function): Set cfun->function_end_locus.
|
||||
|
||||
2003-09-24 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* class.c, decl.c, decl2.c, error.c, init.c, lex.c, method.c,
|
||||
pt.c, semantics.c, tree.c: Revert from TREE_LOCUS to
|
||||
DECL_SOURCE_LOCATION.
|
||||
|
||||
2003-09-17 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* decl.c (cxx_init_decl_processing): Don't using_eh_for_cleanups
|
||||
if exceptions are disabled.
|
||||
|
||||
2003-09-03 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* cp-lang.c (LANG_HOOKS_RTL_EXPAND_STMT): Use expand_stmt_toplev.
|
||||
|
||||
2003-09-03 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* decl.c (finish_function): Fix misapplied patch. Don't
|
||||
free_after_parsing or free_after_compilation. For real this time.
|
||||
|
||||
2003-08-22 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* cp-simplify.c (cp_gimplify_init_expr): Update use of predicates.
|
||||
|
||||
2003-08-21 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* cp-simplify.c (cp_gimplify_expr): Use simplify_aggr_init_expr.
|
||||
(cp_gimplify_init_expr): Don't call it here.
|
||||
(gimplify_aggr_init_expr): Remove.
|
||||
|
||||
2003-08-19 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* typeck.c (build_array_ref): Also build ARRAY_REFs from
|
||||
INDIRECT_REFs of ARRAY_TYPE.
|
||||
|
||||
* semantics.c (finish_id_expression): Unshare aliases.
|
||||
|
||||
2003-08-12 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* optimize.c (optimize_function): Do not call dump_function.
|
||||
|
||||
2003-08-08 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* optimize.c (optimize_function): Restore support for
|
||||
!keep_function_tree_in_gimple_form.
|
||||
|
||||
2003-07-27 Andreas Jaeger <aj@suse.de>
|
||||
|
||||
* cp-lang.c: Convert K&R prototypes to ISO C90.
|
||||
* cp-simplify.c: Likewise.
|
||||
* cp-mudflap.c: Likewise.
|
||||
|
||||
2003-06-13 Frank Ch. Eigler <fche@redhat.com>
|
||||
|
||||
* semantics.c (expand_body): Call mudflap_c_function just before
|
||||
rtl expansion of function body; don't interfere with inlining.
|
||||
* optimize.c (optimize_function): Remove mudflap call.
|
||||
|
||||
2003-06-13 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* cp-lang.c, cp-simplify.c, cp-tree.h, decl.c, optimize.c,
|
||||
semantics.c, tree.c: Rename SIMPLE to GIMPLE everywhere.
|
||||
|
||||
2003-06-05 Frank Ch. Eigler <fche@redhat.com>
|
||||
|
||||
* cp-mudflap.c (mflang_register_call): Give the synthetic decl
|
||||
undefined (not zero) size.
|
||||
|
||||
2003-06-05 Frank Ch. Eigler <fche@redhat.com>
|
||||
|
||||
* cp-mudflap.c (mx_flag): Remove. Update callers to use mf_mark.
|
||||
|
||||
2003-05-24 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* Make-lang.in (optimize.o): Add dependency on tree-simple.h
|
||||
* decl.c (grokdeclarator): Don't abort when the declarator is
|
||||
ERROR_MARK_NODE.
|
||||
* optimize.c (optimize_function): Unshare all trees after
|
||||
optimizing inline calls.
|
||||
|
||||
2003-05-12 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* class.c (dump_array): Call CONSTRUCTOR_ELTS to access
|
||||
the operand of a CONSTRUCTOR node.
|
||||
|
||||
2003-05-07 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* decl.c (grokdeclarator): Fix thinko in handling
|
||||
ERROR_MARK declarators.
|
||||
|
||||
2003-05-07 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* decl.c (grokdeclarator): Handle ERROR_MARK declarators.
|
||||
|
||||
2003-05-07 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* semantics.c (expand_body): Call expand_stmt when
|
||||
-fdisable-simple is given.
|
||||
|
||||
2003-04-21 Jeff Law <law@redhat.com>
|
||||
|
||||
* optimize.c (optimize_function_tree): Do run the tree-ssa
|
||||
optimizers.
|
||||
|
||||
2003-04-16 Jeff Law <law@redhat.com>
|
||||
|
||||
* optimize.c (optimize_function): No longer check
|
||||
flag_disable_simple.
|
||||
|
||||
2003-04-15 Jeff Law <law@redhat.com>
|
||||
|
||||
* pt.c (instantiate_decl): If CFUN is null, then we will
|
||||
need to push to the toplevel.
|
||||
|
||||
* Makefile.in (decl.o): Depends on tree-flow.h.
|
||||
* decl.c (finish_function): Call set_has_hidden_use when
|
||||
nullifying returns for named value return optimization.
|
||||
|
||||
2003-04-02 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* cp-simplify.c (cp_simplify_expr) <case EMPTY_CLASS_EXPR>:
|
||||
Change type of constant to RECORD_TYPE.
|
||||
|
||||
2003-03-10 Jeff Law <law@redhat.com>
|
||||
|
||||
* optimize.c (optimize_function): Avoid unnecessary
|
||||
simplification of the function tree.
|
||||
|
||||
2003-03-02 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* decl.c: Replace DECL_SOURCE_LOCATION with TREE_LOCUS
|
||||
everywhere.
|
||||
|
||||
2003-02-28 Frank Ch. Eigler <fche@redhat.com>
|
||||
|
||||
* decl2.c (finish_file): Adjust timing of mudflap_finish_file call
|
||||
to account for unit-at-a-time compilation.
|
||||
|
||||
2003-02-07 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* cp-simplify.c (cp_simplify_expr): Handle BASELINK.
|
||||
|
||||
* parser.c (cp_parser_primary_expression): Unshare a COMPONENT_REF
|
||||
from an ALIAS_DECL.
|
||||
|
||||
2003-02-05 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* cp-simplify.c (genericize_try_block): Do genericize catch blocks.
|
||||
|
||||
2003-02-03 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* parser.c (cp_parser_asm_definition): Call finish_asm_stmt with
|
||||
'volatile_p' directly.
|
||||
* typeck.c (build_binary_op): Initialize variable 'type'.
|
||||
* Make-lang.in (cp/tree.o-warn): Add -Wno-error.
|
||||
|
||||
2003-01-29 Frank Ch. Eigler <fche@redhat.com>
|
||||
|
||||
* cp-mudflap.c (mflang_register_call): Adapt to mf-runtime.h API
|
||||
change.
|
||||
|
||||
2003-01-15 Jeff Law <law@redhat.com>
|
||||
|
||||
* class.c: Use TREE_FILENAME and TREE_LINENO to extract
|
||||
file/line information from tree nodes. Remove EXPR_WITH_FILE_LOCATION
|
||||
nodes. Use annotate_with_file_line to attach file/line information
|
||||
to tree nodes. Use TREE_LOCUS to copy file/line information
|
||||
from one node to another.
|
||||
* decl2.c, error.c, init.c, lex.c, method.c: Likewise.
|
||||
* optimize.c: Likewise.
|
||||
* cp-tree.def (TINST_LEVEL): New tree node.
|
||||
* cp-tree.h (TINST_DECL): Update now that we no longer use
|
||||
EXPR_WITH_FILE_LOCATION to represent the TINST_DECL information.
|
||||
(TINST_FILE, TINST_LINE): Kill.
|
||||
* decl.c: Use TREE_FILENAME and TREE_LINENO to extract
|
||||
file/line information from tree nodes. Use annotate_witH_file_line
|
||||
to add file/line information to tree nodes. Use TREE_LOCUS
|
||||
to copy file/line information from one node to another.
|
||||
(duplicate_decls): Make sure to copy TREE_LOCUS information
|
||||
from the old decl to the new decl.
|
||||
(finish_function): Save and restore file/line information
|
||||
around genericizing the function tree.
|
||||
* pt.c (lookup_template_class): Use TREE_LOCUS to copy file/line
|
||||
information from one node to another.
|
||||
(push_tinst_level): Generate a TINST_LEVEL node rather than
|
||||
using EXPR_WITH_FILE_LOCATION nodes. Use annotate_with_file_line
|
||||
to annotate the new node with file/line information.
|
||||
(pop_tinst_level): Use TREE_LINENO and TREE_FILENAME to extract
|
||||
file/line information from nodes.
|
||||
(tsubst_friend_function, instantiate_class_template): Likewise.
|
||||
(tsubst_decl, instantiate_decl, tsubst_enum): Likewise.
|
||||
* semantics.c: Use annotate_with_file_line to annotate tree
|
||||
nodes with file/line information. Use TREE_FILENAME and TREE_LINENO
|
||||
to extract file/line information from tree nodes.
|
||||
(expand_body): Restore file/line information slightly earlier.
|
||||
tree.c (cp_walk_subtrees): Set lineno appropriately.
|
||||
(cp_copy_res_decl_for_inlining): Use TREE_LOCUS to copy file/line
|
||||
information from one node to another.
|
||||
|
||||
2003-01-13 Frank Ch. Eigler <fche@redhat.com>
|
||||
|
||||
Prototype C++ mudflap support.
|
||||
* Make-lang.in (CXX_OBJS): Add cp/cp-mudflap.o and dependencies.
|
||||
* cp-mudflap.c: New file with C++ front-end mflang_* routines.
|
||||
* decl2.c (finish_file): Divert to mudflap if appropriate.
|
||||
* optimize.c (optimize_function): Ditto.
|
||||
|
||||
2003-01-02 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* Make-lang.in (CXX_C_OBJS): Replace old-tree-inline.o with
|
||||
tree-inline.o.
|
||||
|
||||
* optimize.c (dump_function): Move to ../tree-dump.c.
|
||||
|
||||
* cp-simplify.c (cp_simplify_expr): Handle PTRMEM_CST, INIT_EXPR,
|
||||
MODIFY_EXPR and EMPTY_CLASS_EXPR.
|
||||
(cp_simplify_stmt): Handle USING_STMT.
|
||||
(cp_simplify_init_expr): New fn.
|
||||
* cvt.c (build_up_reference): Don't push the decl.
|
||||
* class.c (build_vtable_entry_ref, build_vtbl_ref_1): Unshare the
|
||||
vtable address.
|
||||
* init.c (build_vtbl_address): Likewise.
|
||||
* cp-lang.c (LANG_HOOKS_UNSAVE_EXPR_NOW): Remove.
|
||||
* decl.c (lookup_name_real): Unshare the expansion of an ALIAS_DECL.
|
||||
(finish_function): Don't genericize templates.
|
||||
* parse.y (parse_asm_stmt): Fix prototype.
|
||||
* semantics.c (expand_body): Don't expand if we saw errors.
|
||||
Drop support for expanding non-GENERIC code.
|
||||
|
||||
* cp-simplify.c (cp_simplify_stmt): Handle HANDLER and EH_SPEC_BLOCK.
|
||||
(genericize_try_block): Always build a TRY_CATCH_EXPR.
|
||||
(genericize_catch_block): New fn.
|
||||
(genericize_eh_spec_block): New fn.
|
||||
(cp_simplify_expr): Handle THROW_EXPR and MUST_NOT_THROW_EXPR.
|
||||
(simplify_must_not_throw_expr): New fn.
|
||||
* except.c (wrap_cleanups_r): Make the MUST_NOT_THROW_EXPR void.
|
||||
(build_throw): Likewise.
|
||||
|
||||
2002-12-14 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* optimize.c (dump_function): Use pretty dumpers.
|
||||
(optimize_function): Don't do .original dump here.
|
||||
|
||||
2002-12-03 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* cp-simplify.c: Include coretypes.h and tm.h.
|
||||
|
||||
2002-11-24 Jason Merrill <jason@redhat.com>
|
||||
|
||||
Gimplify C++ cleanups.
|
||||
* decl.c (finish_function): Call c_genericize.
|
||||
* cp-simplify.c (cp_simplify_stmt): New fn.
|
||||
(genericize_try_block): New fn.
|
||||
(cp_simplify_expr): Move INIT_EXPR/TARGET_EXPR code
|
||||
to ../gimplify.c. Handle AGGR_INIT_EXPR.
|
||||
(simplify_target_expr): Move to ../gimplify.c.
|
||||
(maybe_fixup_loop_cond): Remove.
|
||||
(simplify_aggr_init_expr): Split out from...
|
||||
* semantics.c (simplify_aggr_init_exprs_r): ...here.
|
||||
(expand_body): Don't simplify AGGR_INIT_EXPRs here
|
||||
if we're gimplifying. Handle expanding generic trees.
|
||||
* tree.c (init_tree): Set lang_simplify_stmt.
|
||||
* cp-tree.h: Declare the new fns.
|
||||
|
||||
* optimize.c (optimize_function): Do pretty dumps.
|
||||
|
||||
2002-10-04 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* Make-lang.in (CXX_C_OBJS): Add gimplify.o.
|
||||
|
||||
2002-09-24 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* parse.y (parse_asm_stmt): New fn.
|
||||
(simple_stmt): Use it.
|
||||
* semantics.c (finish_asm_stmt): Change cv_qualifier parm to
|
||||
volatile_p.
|
||||
* cp-tree.h: Adjust prototype.
|
||||
* pt.c (tsubst_expr): Adjust call.
|
||||
|
||||
2002-08-23 Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
* Make-lang.in (CXX_C_OBJS): Add tree-dchain.o
|
||||
|
||||
2002-08-11 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* cp-simplify.c (maybe_fixup_loop_cond): Move here.
|
||||
(cp_simplify_expr): Call it.
|
||||
(simplify_target_expr): Remove pre_p parm.
|
||||
|
||||
2002-08-09 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* cp-simplify.c (cp_simplify_expr): New fn.
|
||||
(simplify_target_expr): New fn.
|
||||
(cp_simplify_function_tree): Remove.
|
||||
* cp-lang.c (LANG_HOOKS_SIMPLIFY_FUNCTION_TREE): Don't define.
|
||||
(LANG_HOOKS_SIMPLIFY_EXPR): Define.
|
||||
* optimize.c (optimize_function): De-hook simplify_function_tree.
|
||||
* cp-tree.h: Declare cp_simplify_expr.
|
||||
|
||||
2002-07-17 Daniel Berlin <dberlin@dberlin.org>
|
||||
|
||||
* Make-lang.in (CXX_C_OBJS): Add tree-alias-ecr.c,
|
||||
tree-alias-type.o, tree-alias-steen.o, disjoint-set.o.
|
||||
|
||||
2002-06-21 Andreas Jaeger <aj@suse.de>
|
||||
|
||||
* Make-lang.in (cp-simplify.o): New.
|
||||
|
||||
2002-06-18 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* cp-simplify.c: New file.
|
||||
* Make-lang.in: Add it.
|
||||
* cp-tree.h: Declare cp_simplify_function_tree.
|
||||
* cp-lang.c (LANG_HOOKS_SIMPLIFY_FUNCTION_TREE): Define.
|
||||
* optimize.c (optimize_function): Call tree optimizers (but not yet).
|
||||
|
||||
Local Variables:
|
||||
mode: change-log
|
||||
change-log-default-name: "ChangeLog.tree-ssa"
|
||||
End:
|
@ -73,14 +73,16 @@ g++-cross$(exeext): g++$(exeext)
|
||||
# Shared with C front end:
|
||||
CXX_C_OBJS = attribs.o c-common.o c-format.o c-pragma.o c-semantics.o c-lex.o \
|
||||
c-dump.o $(CXX_TARGET_OBJS) c-pretty-print.o c-opts.o c-pch.o \
|
||||
c-incpath.o cppdefault.o c-ppoutput.o c-cppbuiltin.o prefix.o
|
||||
c-incpath.o cppdefault.o c-ppoutput.o c-cppbuiltin.o prefix.o \
|
||||
c-simplify.o tree-inline.o
|
||||
|
||||
# Language-specific object files.
|
||||
CXX_OBJS = cp/call.o cp/decl.o cp/expr.o cp/pt.o cp/typeck2.o \
|
||||
cp/class.o cp/decl2.o cp/error.o cp/lex.o cp/parser.o cp/ptree.o cp/rtti.o \
|
||||
cp/typeck.o cp/cvt.o cp/except.o cp/friend.o cp/init.o cp/method.o \
|
||||
cp/search.o cp/semantics.o cp/tree.o cp/repo.o cp/dump.o cp/optimize.o \
|
||||
cp/mangle.o cp/cp-lang.o cp/name-lookup.o cp/cxx-pretty-print.o
|
||||
cp/mangle.o cp/cp-lang.o cp/name-lookup.o cp/cxx-pretty-print.o \
|
||||
cp/cp-simplify.o tree-mudflap.o cp/cp-mudflap.o
|
||||
|
||||
# Use strict warnings for this front end.
|
||||
cp-warn = $(STRICT_WARN) $(WERROR)
|
||||
@ -221,7 +223,7 @@ cp/cp-lang.o: cp/cp-lang.c $(CXX_TREE_H) $(TM_H) toplev.h langhooks.h \
|
||||
cp/decl.o: cp/decl.c $(CXX_TREE_H) $(TM_H) flags.h cp/lex.h cp/decl.h stack.h \
|
||||
output.h $(EXPR_H) except.h toplev.h $(HASHTAB_H) $(RTL_H) \
|
||||
cp/operators.def $(TM_P_H) tree-inline.h diagnostic.h c-pragma.h \
|
||||
debug.h gt-cp-decl.h gtype-cp.h timevar.h
|
||||
debug.h gt-cp-decl.h gtype-cp.h timevar.h $(TREE_FLOW_H)
|
||||
cp/decl2.o: cp/decl2.c $(CXX_TREE_H) $(TM_H) flags.h cp/lex.h cp/decl.h $(EXPR_H) \
|
||||
output.h except.h toplev.h $(RTL_H) c-common.h gt-cp-decl2.h cgraph.h
|
||||
cp/typeck2.o: cp/typeck2.c $(CXX_TREE_H) $(TM_H) flags.h toplev.h output.h $(TM_P_H) \
|
||||
@ -257,12 +259,16 @@ cp/semantics.o: cp/semantics.c $(CXX_TREE_H) $(TM_H) cp/lex.h except.h toplev.h
|
||||
tree-inline.h cgraph.h
|
||||
cp/dump.o: cp/dump.c $(CXX_TREE_H) $(TM_H) tree-dump.h
|
||||
cp/optimize.o: cp/optimize.c $(CXX_TREE_H) $(TM_H) rtl.h integrate.h insn-config.h \
|
||||
input.h $(PARAMS_H) debug.h tree-inline.h
|
||||
input.h $(PARAMS_H) debug.h tree-inline.h tree-simple.h
|
||||
cp/mangle.o: cp/mangle.c $(CXX_TREE_H) $(TM_H) toplev.h real.h gt-cp-mangle.h \
|
||||
$(TARGET_H) $(TM_P_H)
|
||||
|
||||
cp/parser.o: cp/parser.c $(CXX_TREE_H) $(TM_H) diagnostic.h gt-cp-parser.h \
|
||||
output.h
|
||||
cp/cp-simplify.o: cp/cp-simplify.c $(CXX_TREE_H) toplev.h c-common.h \
|
||||
$(TM_H) coretypes.h
|
||||
cp/cp-mudflap.o: cp/cp-mudflap.c $(CXX_TREE_H) toplev.h c-common.h \
|
||||
$(TM_H) coretypes.h
|
||||
|
||||
cp/name-lookup.o: cp/name-lookup.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
|
||||
$(TM_H) $(CXX_TREE_H) timevar.h gt-cp-name-lookup.h toplev.h \
|
||||
|
@ -346,7 +346,7 @@ build_call (tree function, tree parms)
|
||||
TREE_VALUE (tmp), t);
|
||||
}
|
||||
|
||||
function = build (CALL_EXPR, result_type, function, parms);
|
||||
function = build (CALL_EXPR, result_type, function, parms, NULL_TREE);
|
||||
TREE_HAS_CONSTRUCTOR (function) = is_constructor;
|
||||
TREE_NOTHROW (function) = nothrow;
|
||||
|
||||
@ -4331,7 +4331,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
|
||||
static tree
|
||||
call_builtin_trap (tree type)
|
||||
{
|
||||
tree fn = IDENTIFIER_GLOBAL_VALUE (get_identifier ("__builtin_trap"));
|
||||
tree fn = implicit_built_in_decls[BUILT_IN_TRAP];
|
||||
|
||||
my_friendly_assert (fn != NULL, 20030927);
|
||||
fn = build_call (fn, NULL_TREE);
|
||||
@ -4560,7 +4560,7 @@ build_over_call (struct z_candidate *cand, int flags)
|
||||
tree expr;
|
||||
tree return_type;
|
||||
return_type = TREE_TYPE (TREE_TYPE (fn));
|
||||
expr = build (CALL_EXPR, return_type, fn, args);
|
||||
expr = build (CALL_EXPR, return_type, fn, args, NULL_TREE);
|
||||
if (!VOID_TYPE_P (return_type))
|
||||
require_complete_type (return_type);
|
||||
return convert_from_reference (expr);
|
||||
@ -4768,16 +4768,11 @@ build_over_call (struct z_candidate *cand, int flags)
|
||||
else if (TREE_CODE (arg) == TARGET_EXPR
|
||||
|| TYPE_HAS_TRIVIAL_INIT_REF (DECL_CONTEXT (fn)))
|
||||
{
|
||||
tree address;
|
||||
tree to = stabilize_reference
|
||||
(build_indirect_ref (TREE_VALUE (args), 0));
|
||||
|
||||
val = build (INIT_EXPR, DECL_CONTEXT (fn), to, arg);
|
||||
address = build_unary_op (ADDR_EXPR, val, 0);
|
||||
/* Avoid a warning about this expression, if the address is
|
||||
never used. */
|
||||
TREE_USED (address) = 1;
|
||||
return address;
|
||||
return val;
|
||||
}
|
||||
}
|
||||
else if (DECL_OVERLOADED_OPERATOR_P (fn) == NOP_EXPR
|
||||
@ -4813,7 +4808,7 @@ build_over_call (struct z_candidate *cand, int flags)
|
||||
val = build (MODIFY_EXPR, as_base, to_as_base, arg_as_base);
|
||||
val = convert_to_void (val, NULL);
|
||||
val = build (COMPOUND_EXPR, type, val, save_to);
|
||||
TREE_NO_UNUSED_WARNING (val) = 1;
|
||||
TREE_NO_WARNING (val) = 1;
|
||||
}
|
||||
|
||||
return val;
|
||||
@ -4936,7 +4931,8 @@ build_java_interface_fn_ref (tree fn, tree instance)
|
||||
iface);
|
||||
return error_mark_node;
|
||||
}
|
||||
iface_ref = build1 (ADDR_EXPR, build_pointer_type (iface), iface_ref);
|
||||
iface_ref = build_address (iface_ref);
|
||||
iface_ref = convert (build_pointer_type (iface), iface_ref);
|
||||
|
||||
/* Determine the itable index of FN. */
|
||||
i = 1;
|
||||
@ -5360,7 +5356,7 @@ build_new_method_call (tree instance, tree fns, tree args,
|
||||
call = (build_min_non_dep
|
||||
(CALL_EXPR, call,
|
||||
build_min_nt (COMPONENT_REF, orig_instance, orig_fns),
|
||||
orig_args));
|
||||
orig_args, NULL_TREE));
|
||||
|
||||
/* Free all the conversions we allocated. */
|
||||
obstack_free (&conversion_obstack, p);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user